[med-svn] [bandage] 01/01: New upstream version 0.8.1
Cédric Lood
milt0n-guest at moszumanska.debian.org
Thu Aug 10 20:06:38 UTC 2017
This is an automated email from the git hooks/post-receive script.
milt0n-guest pushed a commit to branch master
in repository bandage.
commit 47aee7b0853af33f198f13d0b3b3f71611ac69f0
Author: sid <sid at sid-debian-vm>
Date: Wed Aug 9 18:20:08 2017 +0200
New upstream version 0.8.1
---
Bandage.pro | 276 +
BandageTests.pro | 276 +
COPYING | 674 +
README.md | 147 +
blast/blasthit.cpp | 138 +
blast/blasthit.h | 73 +
blast/blasthitpart.h | 36 +
blast/blastqueries.cpp | 249 +
blast/blastqueries.h | 74 +
blast/blastquery.cpp | 287 +
blast/blastquery.h | 83 +
blast/blastquerypath.cpp | 320 +
blast/blastquerypath.h | 61 +
blast/blastsearch.cpp | 374 +
blast/blastsearch.h | 63 +
blast/buildblastdatabaseworker.cpp | 102 +
blast/buildblastdatabaseworker.h | 48 +
blast/runblastsearchworker.cpp | 113 +
blast/runblastsearchworker.h | 53 +
build_scripts/bandage_build_linux.sh | 98 +
build_scripts/bandage_build_mac.sh | 36 +
build_scripts/bandage_build_windows.bat | 43 +
build_scripts/bandage_build_windows_32bit.bat | 43 +
build_scripts/installation.txt | 1 +
build_scripts/qt_static_build_centos.sh | 131 +
build_scripts/qt_static_build_ubuntu.sh | 129 +
build_scripts/sample_LastGraph | 266 +
command_line/commoncommandlinefunctions.cpp | 1307 ++
command_line/commoncommandlinefunctions.h | 108 +
command_line/image.cpp | 253 +
command_line/image.h | 32 +
command_line/info.cpp | 210 +
command_line/info.h | 31 +
command_line/load.cpp | 113 +
command_line/load.h | 31 +
command_line/querypaths.cpp | 319 +
command_line/querypaths.h | 34 +
command_line/reduce.cpp | 168 +
command_line/reduce.h | 33 +
graph/assemblygraph.cpp | 3771 ++++
graph/assemblygraph.h | 215 +
graph/debruijnedge.cpp | 445 +
graph/debruijnedge.h | 86 +
graph/debruijnnode.cpp | 840 +
graph/debruijnnode.h | 163 +
graph/graphicsitemedge.cpp | 196 +
graph/graphicsitemedge.h | 56 +
graph/graphicsitemnode.cpp | 1148 ++
graph/graphicsitemnode.h | 105 +
graph/graphlocation.cpp | 205 +
graph/graphlocation.h | 57 +
graph/ogdfnode.h | 42 +
graph/path.cpp | 929 +
graph/path.h | 97 +
graph/querydistance.h | 39 +
images/BLAST.png | Bin 0 -> 2087 bytes
images/application.icns | Bin 0 -> 486353 bytes
images/application.ico | Bin 0 -> 370070 bytes
images/bring-to-front.png | Bin 0 -> 1145 bytes
images/contiguity-contiguous.png | Bin 0 -> 6321 bytes
images/contiguity-maybe_contiguous.png | Bin 0 -> 5497 bytes
images/contiguity-not_contiguous.png | Bin 0 -> 3976 bytes
images/contiguity.png | Bin 0 -> 5943 bytes
images/copy.png | Bin 0 -> 2617 bytes
images/cross-128.png | Bin 0 -> 2124 bytes
images/exit-256.png | Bin 0 -> 30189 bytes
images/icon.png | Bin 0 -> 176976 bytes
images/images.qrc | 26 +
images/information-256-inactive.png | Bin 0 -> 15856 bytes
images/information-256.png | Bin 0 -> 35146 bytes
images/invert-selection.png | Bin 0 -> 2822 bytes
images/load-256.png | Bin 0 -> 13566 bytes
images/myapp.rc | 1 +
images/ncbi-256.png | Bin 0 -> 18310 bytes
images/save-256.png | Bin 0 -> 19531 bytes
images/select-all.png | Bin 0 -> 1601 bytes
images/select-none.png | Bin 0 -> 1050 bytes
images/settings-256.png | Bin 0 -> 32957 bytes
images/specify-path.png | Bin 0 -> 2927 bytes
images/tick-128.png | Bin 0 -> 1638 bytes
images/zoom.png | Bin 0 -> 5483 bytes
ogdf/LICENSE.txt | 50 +
ogdf/basic/AdjEntryArray.h | 225 +
ogdf/basic/Array.h | 589 +
ogdf/basic/Array2D.h | 327 +
ogdf/basic/BoundedStack.h | 211 +
ogdf/basic/CombinatorialEmbedding.cpp | 630 +
ogdf/basic/CombinatorialEmbedding.h | 486 +
ogdf/basic/Constraint.cpp | 83 +
ogdf/basic/Constraints.h | 212 +
ogdf/basic/CriticalSection.h | 164 +
ogdf/basic/EdgeArray.h | 259 +
ogdf/basic/FaceArray.h | 224 +
ogdf/basic/FaceSet.h | 274 +
ogdf/basic/Graph.cpp | 1481 ++
ogdf/basic/Graph.h | 75 +
ogdf/basic/GraphAttributes.cpp | 1256 ++
ogdf/basic/GraphAttributes.h | 863 +
ogdf/basic/GraphCopy.cpp | 678 +
ogdf/basic/GraphCopy.h | 645 +
ogdf/basic/GraphObserver.h | 147 +
ogdf/basic/Graph_d.h | 1560 ++
ogdf/basic/HashArray.h | 179 +
ogdf/basic/Hashing.cpp | 207 +
ogdf/basic/Hashing.h | 520 +
ogdf/basic/List.h | 1634 ++
ogdf/basic/Math.cpp | 112 +
ogdf/basic/Math.h | 150 +
ogdf/basic/NodeArray.h | 227 +
ogdf/basic/SList.h | 1047 +
ogdf/basic/Stack.h | 252 +
ogdf/basic/String.cpp | 219 +
ogdf/basic/String.h | 232 +
ogdf/basic/System.cpp | 444 +
ogdf/basic/System.h | 328 +
ogdf/basic/basic.cpp | 357 +
ogdf/basic/basic.h | 639 +
ogdf/basic/comparer.h | 287 +
ogdf/basic/exceptions.h | 307 +
ogdf/basic/geometry.cpp | 804 +
ogdf/basic/geometry.h | 794 +
ogdf/basic/memory.h | 126 +
ogdf/basic/simple_graph_alg.cpp | 1056 ++
ogdf/basic/simple_graph_alg.h | 803 +
ogdf/basic/tuples.h | 274 +
ogdf/cluster/ClusterArray.h | 245 +
ogdf/cluster/ClusterGraph.cpp | 1775 ++
ogdf/cluster/ClusterGraph.h | 825 +
ogdf/cluster/ClusterGraphAttributes.cpp | 740 +
ogdf/cluster/ClusterGraphAttributes.h | 439 +
ogdf/cluster/ClusterGraphObserver.h | 113 +
ogdf/energybased/Edge.h | 159 +
ogdf/energybased/FMMMLayout.cpp | 1749 ++
ogdf/energybased/FMMMLayout.h | 1382 ++
ogdf/energybased/MAARPacking.cpp | 473 +
ogdf/energybased/MAARPacking.h | 162 +
ogdf/energybased/Multilevel.cpp | 885 +
ogdf/energybased/Multilevel.h | 247 +
ogdf/energybased/Node.h | 99 +
ogdf/energybased/PQueue.h | 176 +
ogdf/energybased/PackingRowInfo.h | 105 +
ogdf/energybased/Rectangle.h | 240 +
ogdf/energybased/Set.cpp | 241 +
ogdf/energybased/Set.h | 131 +
ogdf/energybased/numexcept.cpp | 214 +
ogdf/energybased/numexcept.h | 104 +
ogdf/fileformats/DinoLineBuffer.cpp | 424 +
ogdf/fileformats/DinoLineBuffer.h | 247 +
ogdf/fileformats/DinoTools.cpp | 114 +
ogdf/fileformats/DinoTools.h | 87 +
ogdf/fileformats/DinoXmlParser.cpp | 913 +
ogdf/fileformats/DinoXmlParser.h | 464 +
ogdf/fileformats/DinoXmlScanner.cpp | 448 +
ogdf/fileformats/DinoXmlScanner.h | 166 +
ogdf/fileformats/GmlParser.cpp | 1315 ++
ogdf/fileformats/GmlParser.h | 233 +
ogdf/fileformats/Ogml.cpp | 303 +
ogdf/fileformats/Ogml.h | 368 +
ogdf/fileformats/OgmlParser.cpp | 3939 ++++
ogdf/fileformats/OgmlParser.h | 290 +
ogdf/fileformats/XmlObject.h | 132 +
ogdf/fileformats/XmlParser.cpp | 1204 ++
ogdf/fileformats/XmlParser.h | 175 +
ogdf/internal/basic/MallocMemoryAllocator.h | 118 +
ogdf/internal/basic/PoolMemoryAllocator.cpp | 448 +
ogdf/internal/basic/PoolMemoryAllocator.h | 191 +
ogdf/internal/basic/list_templates.h | 101 +
ogdf/internal/energybased/EdgeAttributes.cpp | 87 +
ogdf/internal/energybased/EdgeAttributes.h | 121 +
ogdf/internal/energybased/FruchtermanReingold.cpp | 269 +
ogdf/internal/energybased/FruchtermanReingold.h | 108 +
ogdf/internal/energybased/MultilevelGraph.cpp | 834 +
ogdf/internal/energybased/MultilevelGraph.h | 180 +
ogdf/internal/energybased/NMM.cpp | 2867 +++
ogdf/internal/energybased/NMM.h | 516 +
ogdf/internal/energybased/NodeAttributes.cpp | 143 +
ogdf/internal/energybased/NodeAttributes.h | 184 +
ogdf/internal/energybased/ParticleInfo.h | 155 +
ogdf/internal/energybased/QuadTreeNM.cpp | 288 +
ogdf/internal/energybased/QuadTreeNM.h | 162 +
ogdf/internal/energybased/QuadTreeNodeNM.cpp | 193 +
ogdf/internal/energybased/QuadTreeNodeNM.h | 191 +
ogdf/module/LayoutModule.h | 104 +
program/globals.cpp | 453 +
program/globals.h | 82 +
program/graphlayoutworker.cpp | 83 +
program/graphlayoutworker.h | 51 +
program/main.cpp | 198 +
program/memory.cpp | 60 +
program/memory.h | 61 +
program/scinot.cpp | 185 +
program/scinot.h | 65 +
program/settings.cpp | 144 +
program/settings.h | 207 +
tests/bandage_command_line_tests.sh | 212 +
tests/bandagetests.cpp | 1589 ++
tests/big_test.LastGraph | 19930 ++++++++++++++++++++
tests/test.LastGraph | 68 +
tests/test.Trinity.csv | 8 +
tests/test.Trinity.fasta | 2650 +++
tests/test.csv | 12 +
tests/test.fastg | 7282 +++++++
tests/test_plasmids.gfa | 21 +
tests/test_plasmids_separate_sequences.fasta | 18 +
tests/test_plasmids_separate_sequences.gfa | 21 +
tests/test_queries1.fasta | 8 +
tests/test_queries2.fasta | 267 +
tests/test_query_paths.fasta | 14 +
tests/test_query_paths.gfa | 15 +
ui/aboutdialog.cpp | 48 +
ui/aboutdialog.h | 42 +
ui/aboutdialog.ui | 215 +
ui/blasthitfiltersdialog.cpp | 151 +
ui/blasthitfiltersdialog.h | 32 +
ui/blasthitfiltersdialog.ui | 357 +
ui/blastsearchdialog.cpp | 1052 ++
ui/blastsearchdialog.h | 92 +
ui/blastsearchdialog.ui | 807 +
ui/changenodedepthdialog.cpp | 61 +
ui/changenodedepthdialog.h | 28 +
ui/changenodedepthdialog.ui | 151 +
ui/changenodenamedialog.cpp | 101 +
ui/changenodenamedialog.h | 28 +
ui/changenodenamedialog.ui | 134 +
ui/colourbutton.cpp | 47 +
ui/colourbutton.h | 45 +
ui/enteroneblastquerydialog.cpp | 57 +
ui/enteroneblastquerydialog.h | 47 +
ui/enteroneblastquerydialog.ui | 98 +
ui/graphicsviewzoom.cpp | 117 +
ui/graphicsviewzoom.h | 82 +
ui/graphinfodialog.cpp | 182 +
ui/graphinfodialog.h | 25 +
ui/graphinfodialog.ui | 1002 +
ui/infotextwidget.cpp | 76 +
ui/infotextwidget.h | 42 +
ui/mainwindow.cpp | 2502 +++
ui/mainwindow.h | 171 +
ui/mainwindow.ui | 2282 +++
ui/mygraphicsscene.cpp | 253 +
ui/mygraphicsscene.h | 47 +
ui/mygraphicsview.cpp | 325 +
ui/mygraphicsview.h | 76 +
ui/myprogressdialog.cpp | 73 +
ui/myprogressdialog.h | 58 +
ui/myprogressdialog.ui | 119 +
ui/mytablewidget.cpp | 128 +
ui/mytablewidget.h | 41 +
ui/nodewidthvisualaid.cpp | 82 +
ui/nodewidthvisualaid.h | 44 +
ui/pathspecifydialog.cpp | 178 +
ui/pathspecifydialog.h | 51 +
ui/pathspecifydialog.ui | 212 +
ui/querypathsdialog.cpp | 232 +
ui/querypathsdialog.h | 49 +
ui/querypathsdialog.ui | 162 +
ui/querypathsequencecopybutton.cpp | 18 +
ui/querypathsequencecopybutton.h | 39 +
ui/querypathspushbutton.cpp | 40 +
ui/querypathspushbutton.h | 46 +
ui/settingsdialog.cpp | 486 +
ui/settingsdialog.h | 62 +
ui/settingsdialog.ui | 4169 ++++
ui/tablewidgetitemdouble.cpp | 35 +
ui/tablewidgetitemdouble.h | 34 +
ui/tablewidgetitemint.cpp | 35 +
ui/tablewidgetitemint.h | 34 +
ui/tablewidgetitemname.cpp | 25 +
ui/tablewidgetitemname.h | 36 +
ui/tablewidgetitemshown.cpp | 35 +
ui/tablewidgetitemshown.h | 34 +
ui/verticallabel.cpp | 39 +
ui/verticallabel.h | 22 +
ui/verticalscrollarea.cpp | 26 +
ui/verticalscrollarea.h | 21 +
275 files changed, 116421 insertions(+)
diff --git a/Bandage.pro b/Bandage.pro
new file mode 100644
index 0000000..fbdecf2
--- /dev/null
+++ b/Bandage.pro
@@ -0,0 +1,276 @@
+# Copyright 2016 Ryan Wick
+
+# This file is part of Bandage
+
+# Bandage is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# Bandage is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+QT += core gui svg
+
+greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
+
+TARGET = Bandage
+TEMPLATE = app
+
+CONFIG += c++11
+
+target.path += /usr/local/bin
+INSTALLS += target
+
+INCLUDEPATH += ui
+
+SOURCES += \
+ program/main.cpp\
+ program/settings.cpp \
+ program/globals.cpp \
+ program/graphlayoutworker.cpp \
+ graph/debruijnnode.cpp \
+ graph/debruijnedge.cpp \
+ graph/graphicsitemnode.cpp \
+ graph/graphicsitemedge.cpp \
+ ui/mainwindow.cpp \
+ ui/graphicsviewzoom.cpp \
+ ui/settingsdialog.cpp \
+ ui/mygraphicsview.cpp \
+ ui/mygraphicsscene.cpp \
+ ui/aboutdialog.cpp \
+ ui/enteroneblastquerydialog.cpp \
+ blast/blasthit.cpp \
+ blast/blastqueries.cpp \
+ ui/blastsearchdialog.cpp \
+ ui/infotextwidget.cpp \
+ graph/assemblygraph.cpp \
+ ui/verticalscrollarea.cpp \
+ ui/myprogressdialog.cpp \
+ ui/nodewidthvisualaid.cpp \
+ ui/verticallabel.cpp \
+ command_line/load.cpp \
+ command_line/image.cpp \
+ command_line/commoncommandlinefunctions.cpp \
+ ui/mytablewidget.cpp \
+ blast/buildblastdatabaseworker.cpp \
+ ui/colourbutton.cpp \
+ blast/blastquery.cpp \
+ blast/runblastsearchworker.cpp \
+ blast/blastsearch.cpp \
+ graph/path.cpp \
+ ui/pathspecifydialog.cpp \
+ graph/graphlocation.cpp \
+ ui/tablewidgetitemint.cpp \
+ ui/tablewidgetitemdouble.cpp \
+ ui/tablewidgetitemshown.cpp \
+ program/memory.cpp \
+ ui/querypathspushbutton.cpp \
+ ui/querypathsdialog.cpp \
+ blast/blastquerypath.cpp \
+ ui/blasthitfiltersdialog.cpp \
+ program/scinot.cpp \
+ ui/changenodenamedialog.cpp \
+ ui/querypathsequencecopybutton.cpp \
+ command_line/querypaths.cpp \
+ command_line/info.cpp \
+ command_line/reduce.cpp \
+ ogdf/basic/Graph.cpp \
+ ogdf/basic/GraphAttributes.cpp \
+ ogdf/energybased/FMMMLayout.cpp \
+ ogdf/basic/geometry.cpp \
+ ogdf/cluster/ClusterGraphAttributes.cpp \
+ ogdf/internal/energybased/FruchtermanReingold.cpp \
+ ogdf/internal/energybased/NMM.cpp \
+ ogdf/fileformats/GmlParser.cpp \
+ ogdf/basic/simple_graph_alg.cpp \
+ ogdf/basic/basic.cpp \
+ ogdf/fileformats/XmlParser.cpp \
+ ogdf/basic/String.cpp \
+ ogdf/basic/Hashing.cpp \
+ ogdf/internal/basic/PoolMemoryAllocator.cpp \
+ ogdf/basic/GraphCopy.cpp \
+ ogdf/basic/CombinatorialEmbedding.cpp \
+ ogdf/fileformats/OgmlParser.cpp \
+ ogdf/cluster/ClusterGraph.cpp \
+ ogdf/basic/Math.cpp \
+ ogdf/internal/energybased/EdgeAttributes.cpp \
+ ogdf/internal/energybased/NodeAttributes.cpp \
+ ogdf/energybased/MAARPacking.cpp \
+ ogdf/energybased/Multilevel.cpp \
+ ogdf/energybased/numexcept.cpp \
+ ogdf/energybased/Set.cpp \
+ ogdf/fileformats/Ogml.cpp \
+ ogdf/fileformats/DinoXmlParser.cpp \
+ ogdf/fileformats/DinoXmlScanner.cpp \
+ ogdf/fileformats/DinoTools.cpp \
+ ogdf/fileformats/DinoLineBuffer.cpp \
+ ogdf/basic/System.cpp \
+ ogdf/internal/energybased/QuadTreeNM.cpp \
+ ogdf/internal/energybased/QuadTreeNodeNM.cpp \
+ ogdf/basic/Constraint.cpp \
+ ogdf/internal/energybased/MultilevelGraph.cpp \
+ ui/graphinfodialog.cpp \
+ ui/tablewidgetitemname.cpp \
+ ui/changenodedepthdialog.cpp
+
+HEADERS += \
+ program/settings.h \
+ program/globals.h \
+ program/graphlayoutworker.h \
+ graph/debruijnnode.h \
+ graph/debruijnedge.h \
+ graph/graphicsitemnode.h \
+ graph/graphicsitemedge.h \
+ graph/ogdfnode.h \
+ ui/mainwindow.h \
+ ui/graphicsviewzoom.h \
+ ui/settingsdialog.h \
+ ui/mygraphicsview.h \
+ ui/mygraphicsscene.h \
+ ui/aboutdialog.h \
+ ui/enteroneblastquerydialog.h \
+ blast/blasthitpart.h \
+ blast/blasthit.h \
+ blast/blastquery.h \
+ blast/blastqueries.h \
+ blast/blastsearch.h \
+ ui/blastsearchdialog.h \
+ ui/infotextwidget.h \
+ graph/assemblygraph.h \
+ ui/verticalscrollarea.h \
+ ui/myprogressdialog.h \
+ ui/nodewidthvisualaid.h \
+ ui/verticallabel.h \
+ command_line/load.h \
+ command_line/image.h \
+ command_line/commoncommandlinefunctions.h \
+ ui/mytablewidget.h \
+ blast/buildblastdatabaseworker.h \
+ ui/colourbutton.h \
+ blast/runblastsearchworker.h \
+ graph/path.h \
+ ui/pathspecifydialog.h \
+ graph/graphlocation.h \
+ ui/tablewidgetitemint.h \
+ ui/tablewidgetitemdouble.h \
+ ui/tablewidgetitemshown.h \
+ program/memory.h \
+ graph/querydistance.h \
+ ui/querypathspushbutton.h \
+ ui/querypathsdialog.h \
+ blast/blastquerypath.h \
+ ui/blasthitfiltersdialog.h \
+ program/scinot.h \
+ ui/changenodenamedialog.h \
+ ui/querypathsequencecopybutton.h \
+ command_line/querypaths.h \
+ command_line/info.h \
+ command_line/reduce.h \
+ ogdf/basic/Graph.h \
+ ogdf/basic/GraphAttributes.h \
+ ogdf/energybased/FMMMLayout.h \
+ ogdf/basic/geometry.h \
+ ogdf/cluster/ClusterGraphAttributes.h \
+ ogdf/module/LayoutModule.h \
+ ogdf/internal/energybased/FruchtermanReingold.h \
+ ogdf/internal/energybased/NMM.h \
+ ogdf/basic/AdjEntryArray.h \
+ ogdf/basic/Array.h \
+ ogdf/fileformats/GmlParser.h \
+ ogdf/basic/GraphObserver.h \
+ ogdf/basic/simple_graph_alg.h \
+ ogdf/basic/basic.h \
+ ogdf/basic/EdgeArray.h \
+ ogdf/basic/List.h \
+ ogdf/basic/NodeArray.h \
+ ogdf/basic/Graph_d.h \
+ ogdf/fileformats/XmlParser.h \
+ ogdf/basic/String.h \
+ ogdf/internal/basic/list_templates.h \
+ ogdf/basic/Hashing.h \
+ ogdf/basic/comparer.h \
+ ogdf/basic/exceptions.h \
+ ogdf/basic/memory.h \
+ ogdf/internal/basic/MallocMemoryAllocator.h \
+ ogdf/internal/basic/PoolMemoryAllocator.h \
+ ogdf/basic/BoundedStack.h \
+ ogdf/basic/GraphCopy.h \
+ ogdf/basic/SList.h \
+ ogdf/basic/Stack.h \
+ ogdf/basic/tuples.h \
+ ogdf/basic/FaceSet.h \
+ ogdf/basic/FaceArray.h \
+ ogdf/basic/CombinatorialEmbedding.h \
+ ogdf/cluster/ClusterArray.h \
+ ogdf/fileformats/OgmlParser.h \
+ ogdf/cluster/ClusterGraph.h \
+ ogdf/cluster/ClusterGraphObserver.h \
+ ogdf/basic/HashArray.h \
+ ogdf/basic/Math.h \
+ ogdf/internal/energybased/EdgeAttributes.h \
+ ogdf/internal/energybased/NodeAttributes.h \
+ ogdf/energybased/Edge.h \
+ ogdf/energybased/MAARPacking.h \
+ ogdf/energybased/Multilevel.h \
+ ogdf/energybased/numexcept.h \
+ ogdf/energybased/Rectangle.h \
+ ogdf/energybased/PackingRowInfo.h \
+ ogdf/energybased/PQueue.h \
+ ogdf/energybased/Set.h \
+ ogdf/energybased/Node.h \
+ ogdf/fileformats/Ogml.h \
+ ogdf/fileformats/DinoXmlParser.h \
+ ogdf/fileformats/DinoXmlScanner.h \
+ ogdf/fileformats/DinoTools.h \
+ ogdf/fileformats/DinoLineBuffer.h \
+ ogdf/fileformats/XmlObject.h \
+ ogdf/basic/CriticalSection.h \
+ ogdf/basic/System.h \
+ ogdf/basic/Array2D.h \
+ ogdf/internal/energybased/ParticleInfo.h \
+ ogdf/internal/energybased/QuadTreeNM.h \
+ ogdf/internal/energybased/QuadTreeNodeNM.h \
+ ogdf/basic/Constraints.h \
+ ogdf/internal/energybased/MultilevelGraph.h \
+ ui/graphinfodialog.h \
+ ui/tablewidgetitemname.h \
+ ui/changenodedepthdialog.h
+
+FORMS += \
+ ui/mainwindow.ui \
+ ui/settingsdialog.ui \
+ ui/aboutdialog.ui \
+ ui/enteroneblastquerydialog.ui \
+ ui/blastsearchdialog.ui \
+ ui/myprogressdialog.ui \
+ ui/pathspecifydialog.ui \
+ ui/querypathsdialog.ui \
+ ui/blasthitfiltersdialog.ui \
+ ui/changenodenamedialog.ui \
+ ui/graphinfodialog.ui \
+ ui/changenodedepthdialog.ui
+
+RESOURCES += \
+ images/images.qrc
+
+
+unix:INCLUDEPATH += /usr/include/
+unix:LIBS += -L/usr/lib
+
+# The following settings are compatible with OGDF being built in 64 bit release mode using Visual Studio 2013
+win32:LIBS += -lpsapi
+win32:RC_FILE = images/myapp.rc
+
+macx:ICON = images/application.icns
+macx:QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.7
+
+# Each target platform needs the native platform as well as Qt's minimal platform.
+win32: QTPLUGIN.platforms += qwindows qminimal
+unix:!macx: QTPLUGIN.platforms += qxcb qminimal
+macx: QTPLUGIN.platforms += qcocoa qminimal
diff --git a/BandageTests.pro b/BandageTests.pro
new file mode 100644
index 0000000..dcfb5d9
--- /dev/null
+++ b/BandageTests.pro
@@ -0,0 +1,276 @@
+# Copyright 2015 Ryan Wick
+
+# This file is part of Bandage
+
+# Bandage is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+
+# Bandage is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+QT += core gui svg testlib
+
+greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
+
+TARGET = BandageTests
+TEMPLATE = app
+
+CONFIG += c++11
+
+target.path += /usr/local/bin
+INSTALLS += target
+
+INCLUDEPATH += ui
+
+SOURCES += \
+ program/settings.cpp \
+ program/globals.cpp \
+ program/graphlayoutworker.cpp \
+ graph/debruijnnode.cpp \
+ graph/debruijnedge.cpp \
+ graph/graphicsitemnode.cpp \
+ graph/graphicsitemedge.cpp \
+ ui/mainwindow.cpp \
+ ui/graphicsviewzoom.cpp \
+ ui/settingsdialog.cpp \
+ ui/mygraphicsview.cpp \
+ ui/mygraphicsscene.cpp \
+ ui/aboutdialog.cpp \
+ ui/enteroneblastquerydialog.cpp \
+ blast/blasthit.cpp \
+ blast/blastqueries.cpp \
+ ui/blastsearchdialog.cpp \
+ ui/infotextwidget.cpp \
+ graph/assemblygraph.cpp \
+ ui/verticalscrollarea.cpp \
+ ui/myprogressdialog.cpp \
+ ui/nodewidthvisualaid.cpp \
+ ui/verticallabel.cpp \
+ command_line/load.cpp \
+ command_line/image.cpp \
+ command_line/commoncommandlinefunctions.cpp \
+ ui/mytablewidget.cpp \
+ blast/buildblastdatabaseworker.cpp \
+ ui/colourbutton.cpp \
+ blast/blastquery.cpp \
+ blast/runblastsearchworker.cpp \
+ blast/blastsearch.cpp \
+ graph/path.cpp \
+ ui/pathspecifydialog.cpp \
+ graph/graphlocation.cpp \
+ ui/tablewidgetitemint.cpp \
+ ui/tablewidgetitemdouble.cpp \
+ ui/tablewidgetitemshown.cpp \
+ program/memory.cpp \
+ ui/querypathspushbutton.cpp \
+ ui/querypathsdialog.cpp \
+ blast/blastquerypath.cpp \
+ tests/bandagetests.cpp \
+ ui/blasthitfiltersdialog.cpp \
+ program/scinot.cpp \
+ ui/changenodenamedialog.cpp \
+ ui/changenodedepthdialog.cpp \
+ ui/querypathsequencecopybutton.cpp \
+ command_line/querypaths.cpp \
+ command_line/info.cpp \
+ command_line/reduce.cpp \
+ ogdf/basic/Graph.cpp \
+ ogdf/basic/GraphAttributes.cpp \
+ ogdf/energybased/FMMMLayout.cpp \
+ ogdf/basic/geometry.cpp \
+ ogdf/cluster/ClusterGraphAttributes.cpp \
+ ogdf/internal/energybased/FruchtermanReingold.cpp \
+ ogdf/internal/energybased/NMM.cpp \
+ ogdf/fileformats/GmlParser.cpp \
+ ogdf/basic/simple_graph_alg.cpp \
+ ogdf/basic/basic.cpp \
+ ogdf/fileformats/XmlParser.cpp \
+ ogdf/basic/String.cpp \
+ ogdf/basic/Hashing.cpp \
+ ogdf/internal/basic/PoolMemoryAllocator.cpp \
+ ogdf/basic/GraphCopy.cpp \
+ ogdf/basic/CombinatorialEmbedding.cpp \
+ ogdf/fileformats/OgmlParser.cpp \
+ ogdf/cluster/ClusterGraph.cpp \
+ ogdf/basic/Math.cpp \
+ ogdf/internal/energybased/EdgeAttributes.cpp \
+ ogdf/internal/energybased/NodeAttributes.cpp \
+ ogdf/energybased/MAARPacking.cpp \
+ ogdf/energybased/Multilevel.cpp \
+ ogdf/energybased/numexcept.cpp \
+ ogdf/energybased/Set.cpp \
+ ogdf/fileformats/Ogml.cpp \
+ ogdf/fileformats/DinoXmlParser.cpp \
+ ogdf/fileformats/DinoXmlScanner.cpp \
+ ogdf/fileformats/DinoTools.cpp \
+ ogdf/fileformats/DinoLineBuffer.cpp \
+ ogdf/basic/System.cpp \
+ ogdf/internal/energybased/QuadTreeNM.cpp \
+ ogdf/internal/energybased/QuadTreeNodeNM.cpp \
+ ogdf/basic/Constraint.cpp \
+ ogdf/internal/energybased/MultilevelGraph.cpp \
+ ui/graphinfodialog.cpp \
+ ui/tablewidgetitemname.cpp
+
+HEADERS += \
+ program/settings.h \
+ program/globals.h \
+ program/graphlayoutworker.h \
+ graph/debruijnnode.h \
+ graph/debruijnedge.h \
+ graph/graphicsitemnode.h \
+ graph/graphicsitemedge.h \
+ graph/ogdfnode.h \
+ ui/mainwindow.h \
+ ui/graphicsviewzoom.h \
+ ui/settingsdialog.h \
+ ui/mygraphicsview.h \
+ ui/mygraphicsscene.h \
+ ui/aboutdialog.h \
+ ui/enteroneblastquerydialog.h \
+ blast/blasthitpart.h \
+ blast/blasthit.h \
+ blast/blastquery.h \
+ blast/blastqueries.h \
+ blast/blastsearch.h \
+ ui/blastsearchdialog.h \
+ ui/infotextwidget.h \
+ graph/assemblygraph.h \
+ ui/verticalscrollarea.h \
+ ui/myprogressdialog.h \
+ ui/nodewidthvisualaid.h \
+ ui/verticallabel.h \
+ command_line/load.h \
+ command_line/image.h \
+ command_line/commoncommandlinefunctions.h \
+ ui/mytablewidget.h \
+ blast/buildblastdatabaseworker.h \
+ ui/colourbutton.h \
+ blast/runblastsearchworker.h \
+ graph/path.h \
+ ui/pathspecifydialog.h \
+ graph/graphlocation.h \
+ ui/tablewidgetitemint.h \
+ ui/tablewidgetitemdouble.h \
+ ui/tablewidgetitemshown.h \
+ program/memory.h \
+ graph/querydistance.h \
+ ui/querypathspushbutton.h \
+ ui/querypathsdialog.h \
+ blast/blastquerypath.h \
+ ui/blasthitfiltersdialog.h \
+ program/scinot.h \
+ ui/changenodenamedialog.h \
+ ui/changenodedepthdialog.h \
+ ui/querypathsequencecopybutton.h \
+ command_line/querypaths.h \
+ command_line/info.h \
+ command_line/reduce.h \
+ ogdf/basic/Graph.h \
+ ogdf/basic/GraphAttributes.h \
+ ogdf/energybased/FMMMLayout.h \
+ ogdf/basic/geometry.h \
+ ogdf/cluster/ClusterGraphAttributes.h \
+ ogdf/module/LayoutModule.h \
+ ogdf/internal/energybased/FruchtermanReingold.h \
+ ogdf/internal/energybased/NMM.h \
+ ogdf/basic/AdjEntryArray.h \
+ ogdf/basic/Array.h \
+ ogdf/fileformats/GmlParser.h \
+ ogdf/basic/GraphObserver.h \
+ ogdf/basic/simple_graph_alg.h \
+ ogdf/basic/basic.h \
+ ogdf/basic/EdgeArray.h \
+ ogdf/basic/List.h \
+ ogdf/basic/NodeArray.h \
+ ogdf/basic/Graph_d.h \
+ ogdf/fileformats/XmlParser.h \
+ ogdf/basic/String.h \
+ ogdf/internal/basic/list_templates.h \
+ ogdf/basic/Hashing.h \
+ ogdf/basic/comparer.h \
+ ogdf/basic/exceptions.h \
+ ogdf/basic/memory.h \
+ ogdf/internal/basic/MallocMemoryAllocator.h \
+ ogdf/internal/basic/PoolMemoryAllocator.h \
+ ogdf/basic/BoundedStack.h \
+ ogdf/basic/GraphCopy.h \
+ ogdf/basic/SList.h \
+ ogdf/basic/Stack.h \
+ ogdf/basic/tuples.h \
+ ogdf/basic/FaceSet.h \
+ ogdf/basic/FaceArray.h \
+ ogdf/basic/CombinatorialEmbedding.h \
+ ogdf/cluster/ClusterArray.h \
+ ogdf/fileformats/OgmlParser.h \
+ ogdf/cluster/ClusterGraph.h \
+ ogdf/cluster/ClusterGraphObserver.h \
+ ogdf/basic/HashArray.h \
+ ogdf/basic/Math.h \
+ ogdf/internal/energybased/EdgeAttributes.h \
+ ogdf/internal/energybased/NodeAttributes.h \
+ ogdf/energybased/Edge.h \
+ ogdf/energybased/MAARPacking.h \
+ ogdf/energybased/Multilevel.h \
+ ogdf/energybased/numexcept.h \
+ ogdf/energybased/Rectangle.h \
+ ogdf/energybased/PackingRowInfo.h \
+ ogdf/energybased/PQueue.h \
+ ogdf/energybased/Set.h \
+ ogdf/energybased/Node.h \
+ ogdf/fileformats/Ogml.h \
+ ogdf/fileformats/DinoXmlParser.h \
+ ogdf/fileformats/DinoXmlScanner.h \
+ ogdf/fileformats/DinoTools.h \
+ ogdf/fileformats/DinoLineBuffer.h \
+ ogdf/fileformats/XmlObject.h \
+ ogdf/basic/CriticalSection.h \
+ ogdf/basic/System.h \
+ ogdf/basic/Array2D.h \
+ ogdf/internal/energybased/ParticleInfo.h \
+ ogdf/internal/energybased/QuadTreeNM.h \
+ ogdf/internal/energybased/QuadTreeNodeNM.h \
+ ogdf/basic/Constraints.h \
+ ogdf/internal/energybased/MultilevelGraph.h \
+ ui/graphinfodialog.h \
+ ui/tablewidgetitemname.h
+
+FORMS += \
+ ui/mainwindow.ui \
+ ui/settingsdialog.ui \
+ ui/aboutdialog.ui \
+ ui/enteroneblastquerydialog.ui \
+ ui/blastsearchdialog.ui \
+ ui/myprogressdialog.ui \
+ ui/pathspecifydialog.ui \
+ ui/querypathsdialog.ui \
+ ui/blasthitfiltersdialog.ui \
+ ui/changenodenamedialog.ui \
+ ui/changenodedepthdialog.ui \
+ ui/graphinfodialog.ui
+
+RESOURCES += \
+ images/images.qrc
+
+
+unix:INCLUDEPATH += /usr/include/
+unix:LIBS += -L/usr/lib
+
+# The following settings are compatible with OGDF being built in 64 bit release mode using Visual Studio 2013
+win32:LIBS += -lpsapi
+win32:RC_FILE = images/myapp.rc
+
+macx:ICON = images/application.icns
+macx:QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.7
+
+# Each target platform needs the native platform as well as Qt's minimal platform.
+win32: QTPLUGIN.platforms += qwindows qminimal
+unix:!macx: QTPLUGIN.platforms += qxcb qminimal
+macx: QTPLUGIN.platforms += qcocoa qminimal
diff --git a/COPYING b/COPYING
new file mode 100644
index 0000000..94a9ed0
--- /dev/null
+++ b/COPYING
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..5037bb3
--- /dev/null
+++ b/README.md
@@ -0,0 +1,147 @@
+# <img src="http://rrwick.github.io/Bandage/images/logo.png" alt="Bandage" width="115" height="115" align="middle">Bandage
+
+## Table of Contents
+
+* [Intro](https://github.com/rrwick/Bandage#intro)
+* [Help](https://github.com/rrwick/Bandage#help)
+* [Pre-built binaries](https://github.com/rrwick/Bandage#pre-built-binaries)
+* [Building from source](https://github.com/rrwick/Bandage#building-from-source)
+* [History](https://github.com/rrwick/Bandage#history)
+* [Contributing](https://github.com/rrwick/Bandage#contributing)
+* [Citation](https://github.com/rrwick/Bandage#citation)
+* [Credits](https://github.com/rrwick/Bandage#credits)
+* [License](https://github.com/rrwick/Bandage#license)
+
+## Intro
+
+Bandage is a GUI program that allows users to interact with the assembly graphs made by *de novo* assemblers such as <a href="https://www.ebi.ac.uk/~zerbino/velvet/" target="_blank">Velvet</a>, <a href="http://bioinf.spbau.ru/spades" target="_blank">SPAdes</a>, <a href="https://github.com/voutcn/megahit" target="_blank">MEGAHIT</a> and others.
+
+*De novo* assembly graphs contain not only assembled contigs but also the connections between those contigs, which were previously not easily accessible. Bandage visualises assembly graphs, with connections, using graph layout algorithms. Nodes in the drawn graph, which represent contigs, can be automatically labelled with their ID, length or depth. Users can interact with the graph by moving, labelling and colouring nodes. Sequence information can also be extracted directly from the gra [...]
+
+More information and download links are on the Bandage website: <a href="http://rrwick.github.io/Bandage/" target="_blank">rrwick.github.io/Bandage</a>
+
+## Help
+
+Bandage documentation is available on the <a href="https://github.com/rrwick/Bandage/wiki" target="_blank">Bandage GitHub wiki</a>.
+
+Bandage help tips are also built into the program. Throughout the UI, you will find these icons next to controls and settings: <img src="http://rrwick.github.io/Bandage/images/helptext.png" alt="help text icon" width="16" height="16">. Click them to see a description of that element of Bandage.
+
+## Pre-built binaries
+
+Compiled 64-bit binaries for Ubuntu Linux, CentOS, OS X and Windows are available in the GitHub <a href="https://github.com/rrwick/Bandage/releases/" target="_blank">'Releases' section</a> and from the <a href="http://rrwick.github.io/Bandage/" target="_blank">Bandage website</a>.
+
+If you download and run the Mac binary, you may receive a warning stating that Bandage 'can't be opened because it is from an unidentified developer.' Right click on the file and select 'Open' to override this warning.
+
+The Linux binaries comes in two varieties: dynamically-linked and statically-linked. The dynamically-linked binary is preferable, but it has more dependencies (like Qt 5). If you experience problems with the dynamically-linked binary, please try the statically-linked version instead.
+
+## Building from source
+
+If the compiled binaries do not work for you, the instructions below should help you build Bandage on most common OSs. If you are having difficulties building Bandage for your OS, feel free to contact me (Ryan) at rrwick at gmail.com and I'll do my best to help you out!
+
+### <img src="http://rrwick.github.io/Bandage/images/OS/ubuntu.png" alt="" width="34" height="40" align="middle"> Ubuntu
+
+The following instructions successfully build Bandage on a fresh installation of Ubuntu 14.04:
+
+1. Ensure the package lists are up-to-date: `sudo apt-get update`
+2. Install prerequisite packages: `sudo apt-get install build-essential git qtbase5-dev`
+3. Download the Bandage code from GitHub: `git clone https://github.com/rrwick/Bandage.git`
+4. Open a terminal in the Bandage directory.
+5. Set the environment variable to specify that you will be using Qt 5, not Qt 4: `export QT_SELECT=5`
+6. Run qmake to generate a Makefile: `qmake`
+7. Build the program: `make`
+8. `Bandage` should now be an executable file.
+9. Optionally, copy the program into /usr/local/bin: `sudo make install`. The Bandage build directory can then be deleted.
+
+### <img src="http://rrwick.github.io/Bandage/images/OS/linux.png" alt="" width="34" height="40" align="middle"> Other Linux distributions
+
+If your Linux distribution is sufficiently similar to Ubuntu (e.g. Linux Mint), I recommend trying the Ubuntu build instructions above. Otherwise, try the 'Using Qt Creator' instructions below.
+
+### <img src="http://rrwick.github.io/Bandage/images/OS/apple.png" alt="" width="34" height="40" align="middle"> Mac
+
+The following instructions successfully build Bandage on OS X 10.8 and later:
+
+1. Install Xcode, along with the Xcode Command Line Tools. If you can run the `clang` command from the terminal, you should be good to continue.
+2. Install Qt 5. This is most easily done using Homebrew: <a href="http://brew.sh/" target="_blank">brew.sh</a>. Install the Qt 5 package with this command: `brew install qt5`.
+3. Download the Bandage code from GitHub: `git clone https://github.com/rrwick/Bandage.git`
+4. Open a terminal in the Bandage directory.
+5. Run qmake to generate a Makefile. The location of the `qmake` command may vary, depending on how Qt was installed. If you used Homebrew, it should be here: `/usr/local/opt/qt5/bin/qmake`.
+6. Build the program: `make`
+7. `Bandage` should now be an application bundle.
+8. Optionally, copy the Bandage application bundle into the 'Applications' folder and delete the Bandage build directory.
+
+### <img src="http://rrwick.github.io/Bandage/images/OS/qt.png" alt="" width="34" height="40" align="middle"> Using Qt Creator
+
+For Windows and some Linux distributions, the easiest way to build Bandage from source is by using Qt Creator, the Qt IDE. I successfully used this procedure has been used on Windows and on CentOS 6.7. It should also work for Ubuntu Linux and OS X.
+
+1. Set up a compiler.
+ * For Windows, you can use the Microsoft Visual C++ compiler by installing <a href=" https://www.visualstudio.com/" target="_blank">Visual Studio</a>. Alternatively, you can skip this step and the Qt installation will provide the MinGW compiler.
+ * For CentOS, this can be done quickly using the yum package manager: `yum install gcc-c++`
+ * <a href="http://doc.qt.io/qt-5/supported-platforms.html" target="_blank">Look here</a> for more information on Qt supported compilers.
+2. Install the Qt SDK: <a href="http://www.qt.io/download-open-source/" target="_blank">www.qt.io/download-open-source</a>. The disk space required can be reduced by unticking the iOS and Android options in the Qt installer.
+3. Download the Bandage code from GitHub:
+ * Either clone using: `git clone https://github.com/rrwick/Bandage.git`
+ * or download from here: <a href="https://github.com/rrwick/Bandage/archive/master.zip" target="_blank">https://github.com/rrwick/Bandage/archive/master.zip</a>
+4. Open the Qt Creator program and load the `Bandage.pro` file which is in the Bandage directory. Since this is the first time the project has been loaded, it will ask you to configure the project. The defaults should be okay, so click 'Configure Project'.
+5. Change to the release build configuration by clicking where it says 'Debug' in the bottom left area of Qt Creator and select 'Release'.
+6. Build and run Bandage by clicking the green arrow in the bottom left area of Qt Creator. Bandage should open when the build has finished.
+7. You will find the executable file in a new folder that begins with 'build-Bandage-Desktop'.
+
+## History
+
+v0.8.0 - 30 April 2016
+
+v0.7.1 - 6 December 2015
+
+v0.7.0 - 16 October 2015
+
+v0.6.4 - 17 September 2015
+
+v0.6.3 - 31 August 2015
+
+v0.6.2 - 29 July 2015
+
+v0.6.1 - 15 July 2015
+
+v0.6.0 - 8 July 2015
+
+v0.5.6 - 26 May 2015
+
+v0.5.5 - 14 May 2015
+
+v0.5.4 - 5 May 2015
+
+v0.5.3 - 30 April 2015
+
+v0.5.2 - 25 April 2015
+
+v0.5.1 - 20 April 2015
+
+v0.5.0 - 9 April 2015
+
+v0.4.2 - 20 March 2015
+
+v0.4.1 - 12 March 2015
+
+v0.4.0 - 10 March 2015
+
+v0.3.0 – 19 February 2015
+
+## Contributing
+
+New contributors are welcome! If you're interested or have ideas, please contact me (Ryan) at rrwick at gmail.com.
+
+## Citation
+
+If you use Bandage in your research, please cite the following publication:
+
+[Wick R.R., Schultz M.B., Zobel J. & Holt K.E. (2015). Bandage: interactive visualisation of de novo genome assemblies. Bioinformatics, 31(20), 3350-3352.](http://bioinformatics.oxfordjournals.org/content/31/20/3350)
+
+## Credits
+
+Bandage makes use of the <a href="http://www.ogdf.net/" target="_blank">OGDF</a> library for performing graph layout algorithms. My thanks goes out to the OGDF developers for their excellent work!
+
+I also thank <a href="https://github.com/rchikhi" target="_blank">Rayan Chikhi</a> and <a href="https://github.com/epruesse" target="_blank">Elmar Pruesse</a> for their contributions to the code.
+
+## License
+
+GNU General Public License, version 3
diff --git a/blast/blasthit.cpp b/blast/blasthit.cpp
new file mode 100644
index 0000000..3c0aea7
--- /dev/null
+++ b/blast/blasthit.cpp
@@ -0,0 +1,138 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "blasthit.h"
+
+#include "../graph/debruijnnode.h"
+#include "blastquery.h"
+#include "../program/settings.h"
+#include "../program/globals.h"
+#include <math.h>
+
+BlastHit::BlastHit(BlastQuery * query, DeBruijnNode * node,
+ double percentIdentity, int alignmentLength,
+ int numberMismatches, int numberGapOpens,
+ int queryStart, int queryEnd,
+ int nodeStart, int nodeEnd,
+ SciNot eValue, double bitScore) :
+ m_query(query), m_node(node),
+ m_percentIdentity(percentIdentity), m_alignmentLength(alignmentLength),
+ m_numberMismatches(numberMismatches), m_numberGapOpens(numberGapOpens),
+ m_queryStart(queryStart), m_queryEnd(queryEnd),
+ m_nodeStart(nodeStart), m_nodeEnd(nodeEnd),
+ m_eValue(eValue), m_bitScore(bitScore)
+{
+ int nodeLength = m_node->getLength();
+ int queryLength = m_query->getLength();
+
+ m_nodeStartFraction = double(nodeStart - 1) / nodeLength;
+ m_nodeEndFraction = double(nodeEnd) / nodeLength;
+ m_queryStartFraction = double(queryStart - 1) / queryLength;
+ m_queryEndFraction = double(queryEnd) / queryLength;
+}
+
+std::vector<BlastHitPart> BlastHit::getBlastHitParts(bool reverse, double scaledNodeLength)
+{
+ std::vector<BlastHitPart> returnVector;
+
+ //If the colour scheme is Blast rainbow, then this function generates lots
+ //of BlastHitParts - each small and with a different colour of the rainbow.
+ if (g_settings->nodeColourScheme == BLAST_HITS_RAINBOW_COLOUR)
+ {
+ double scaledHitLength = (m_nodeEndFraction - m_nodeStartFraction) * scaledNodeLength;
+
+ int partCount = ceil(g_settings->blastRainbowPartsPerQuery * fabs(m_queryStartFraction - m_queryEndFraction));
+
+ //If there are way more parts than the scaled hit length, that means
+ //that a single part will be much less than a pixel in length. This
+ //isn't desirable, so reduce the partCount in these cases.
+ if (partCount > scaledHitLength * 2.0)
+ partCount = int(scaledHitLength * 2.0);
+
+ double nodeSpacing = (m_nodeEndFraction - m_nodeStartFraction) / partCount;
+ double querySpacing = (m_queryEndFraction - m_queryStartFraction) / partCount;
+
+ double nodeFraction = m_nodeStartFraction;
+ double queryFraction = m_queryStartFraction;
+
+ for (int i = 0; i < partCount; ++i)
+ {
+ QColor dotColour;
+ dotColour.setHsvF(queryFraction * 0.9, 1.0, 1.0); //times 0.9 to keep the colour from getting too close to red, as that could confuse the end with the start
+
+ double nextFraction = nodeFraction + nodeSpacing;
+
+ if (reverse)
+ returnVector.push_back(BlastHitPart(dotColour, 1.0 - nodeFraction, 1.0 - nextFraction));
+ else
+ returnVector.push_back(BlastHitPart(dotColour, nodeFraction, nextFraction));
+
+ nodeFraction = nextFraction;
+ queryFraction += querySpacing;
+ }
+ }
+
+ //If the colour scheme is Blast solid, then this function generates only one
+ //BlastHitPart with a colour dependent on the Blast query.
+ else
+ {
+ if (reverse)
+ returnVector.push_back(BlastHitPart(m_query->getColour(), 1.0 - m_nodeStartFraction, 1.0 - m_nodeEndFraction));
+ else
+ returnVector.push_back(BlastHitPart(m_query->getColour(), m_nodeStartFraction, m_nodeEndFraction));
+ }
+
+ return returnVector;
+}
+
+
+bool BlastHit::compareTwoBlastHitPointers(BlastHit * a, BlastHit * b)
+{
+ return a->m_queryStart < b->m_queryStart;
+}
+
+
+double BlastHit::getQueryCoverageFraction()
+{
+ int queryRegionSize = m_queryEnd - m_queryStart + 1;
+ int queryLength = m_query->getLength();
+
+ if (queryLength == 0)
+ return 0.0;
+ else
+ return double(queryRegionSize) / queryLength;
+}
+
+
+GraphLocation BlastHit::getHitStart() const
+{
+ return GraphLocation(m_node, m_nodeStart);
+}
+
+GraphLocation BlastHit::getHitEnd() const
+{
+ return GraphLocation(m_node, m_nodeEnd);
+}
+
+
+//This function returns the node sequence for this hit.
+QByteArray BlastHit::getNodeSequence() const
+{
+ int nodeSequenceLength = m_nodeEnd - m_nodeStart + 1;
+ return m_node->getSequence().mid(m_nodeStart-1, nodeSequenceLength);
+}
diff --git a/blast/blasthit.h b/blast/blasthit.h
new file mode 100644
index 0000000..fdd94a9
--- /dev/null
+++ b/blast/blasthit.h
@@ -0,0 +1,73 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef BLASTHIT_H
+#define BLASTHIT_H
+
+class DeBruijnNode;
+class BlastQuery;
+
+#include <QString>
+#include "blasthitpart.h"
+#include <vector>
+#include "../graph/path.h"
+#include "../graph/graphlocation.h"
+#include "../program/scinot.h"
+
+class BlastHit
+{
+public:
+ BlastHit(BlastQuery * query, DeBruijnNode * node,
+ double percentIdentity, int alignmentLength,
+ int numberMismatches, int numberGapOpens,
+ int queryStart, int queryEnd,
+ int nodeStart, int nodeEnd, SciNot eValue, double bitScore);
+ BlastHit();
+
+ BlastQuery * m_query;
+ DeBruijnNode * m_node;
+ double m_percentIdentity;
+ int m_alignmentLength;
+ int m_numberMismatches;
+ int m_numberGapOpens;
+ int m_queryStart;
+ int m_queryEnd;
+ int m_nodeStart;
+ int m_nodeEnd;
+ SciNot m_eValue;
+ double m_bitScore;
+
+ double m_nodeStartFraction;
+ double m_nodeEndFraction;
+ double m_queryStartFraction;
+ double m_queryEndFraction;
+
+ Path m_queryPath;
+
+ std::vector<BlastHitPart> getBlastHitParts(bool reverse, double scaledNodeLength);
+ bool onForwardStrand() {return m_queryStart < m_queryEnd;}
+ double getNodeCentreFraction() {return (m_nodeStartFraction + m_nodeEndFraction) / 2.0;}
+ static bool compareTwoBlastHitPointers(BlastHit * a, BlastHit * b);
+ double getQueryCoverageFraction();
+ GraphLocation getHitStart() const;
+ GraphLocation getHitEnd() const;
+ QByteArray getNodeSequence() const;
+ int getNodeLength() const {return m_nodeEnd - m_nodeStart + 1;}
+};
+
+#endif // BLASTHIT_H
diff --git a/blast/blasthitpart.h b/blast/blasthitpart.h
new file mode 100644
index 0000000..8fea329
--- /dev/null
+++ b/blast/blasthitpart.h
@@ -0,0 +1,36 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef BLASTHITPART_H
+#define BLASTHITPART_H
+
+#include <QColor>
+
+class BlastHitPart
+{
+public:
+ BlastHitPart() {}
+ BlastHitPart(QColor colour, double nodeFractionStart, double nodeFractionEnd) :
+ m_colour(colour), m_nodeFractionStart(nodeFractionStart), m_nodeFractionEnd(nodeFractionEnd) {}
+
+ QColor m_colour;
+ double m_nodeFractionStart;
+ double m_nodeFractionEnd;
+};
+
+#endif // BLASTHITPART_H
diff --git a/blast/blastqueries.cpp b/blast/blastqueries.cpp
new file mode 100644
index 0000000..f8c2342
--- /dev/null
+++ b/blast/blastqueries.cpp
@@ -0,0 +1,249 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "blastqueries.h"
+#include "../program/globals.h"
+#include "../program/settings.h"
+#include <QTextStream>
+#include "blastsearch.h"
+#include "../program/memory.h"
+
+BlastQueries::BlastQueries() :
+ m_tempNuclFile(0), m_tempProtFile(0)
+{
+ m_presetColours = getPresetColours();
+}
+
+
+BlastQueries::~BlastQueries()
+{
+ clearAllQueries();
+}
+
+
+void BlastQueries::createTempQueryFiles()
+{
+ m_tempNuclFile.reset(new QFile(g_blastSearch->m_tempDirectory + "nucl_queries.fasta"));
+ m_tempProtFile.reset(new QFile(g_blastSearch->m_tempDirectory + "prot_queries.fasta"));
+}
+
+BlastQuery * BlastQueries::getQueryFromName(QString queryName)
+{
+ for (size_t i = 0; i < m_queries.size(); ++i)
+ {
+ if (m_queries[i]->getName() == queryName)
+ return m_queries[i];
+ }
+ return 0;
+}
+
+
+void BlastQueries::addQuery(BlastQuery * newQuery)
+{
+ newQuery->setName(getUniqueName(newQuery->getName()));
+
+ //Give the new query a colour
+ int colourIndex = int(m_queries.size());
+ colourIndex %= m_presetColours.size();
+ newQuery->setColour(m_presetColours[colourIndex]);
+
+ m_queries.push_back(newQuery);
+ updateTempFiles();
+}
+
+
+//This function renames the query. It returns the name given, because that
+//might not be exactly the same as the name passed to the function if it
+//wasn't unique.
+QString BlastQueries::renameQuery(BlastQuery * newQuery, QString newName)
+{
+ newQuery->setName(getUniqueName(newName));
+ updateTempFiles();
+ return newQuery->getName();
+}
+
+
+//This function looks at the name, and if it is not unique, it adds a suffix
+//to make it unique. Also make sure it's not "all" or "none", as those will
+//conflict with viewing all queries at once or no queries.
+QString BlastQueries::getUniqueName(QString name)
+{
+ //If the query name ends in a semicolon, remove it. Ending semicolons
+ //mess with BLAST.
+ if (name.endsWith(';'))
+ name.chop(1);
+
+ //The name can't be empty.
+ if (name == "")
+ name = g_settings->unnamedQueryDefaultName;
+
+ int queryNumber = 2;
+ QString finalName = name;
+ while (getQueryFromName(finalName) != 0 ||
+ finalName == "all" || finalName == "none")
+ finalName = name + "_" + QString::number(queryNumber++);
+ return finalName;
+}
+
+void BlastQueries::clearAllQueries()
+{
+ for (size_t i = 0; i < m_queries.size(); ++i)
+ delete m_queries[i];
+ m_queries.clear();
+ deleteTempFiles();
+}
+
+void BlastQueries::clearSomeQueries(std::vector<BlastQuery *> queriesToRemove)
+{
+ for (size_t i = 0; i < queriesToRemove.size(); ++i)
+ {
+ m_queries.erase(std::remove(m_queries.begin(), m_queries.end(), queriesToRemove[i]), m_queries.end());
+ delete queriesToRemove[i];
+ }
+
+ updateTempFiles();
+}
+
+void BlastQueries::deleteTempFiles()
+{
+ if (tempNuclFileExists())
+ m_tempNuclFile->remove();
+ if (tempProtFileExists())
+ m_tempProtFile->remove();
+}
+
+void BlastQueries::updateTempFiles()
+{
+ deleteTempFiles();
+
+ if (getQueryCount(NUCLEOTIDE) > 0)
+ writeTempFile(m_tempNuclFile, NUCLEOTIDE);
+
+ if (getQueryCount(PROTEIN) > 0)
+ writeTempFile(m_tempProtFile, PROTEIN);
+}
+
+
+void BlastQueries::writeTempFile(QSharedPointer<QFile> file, SequenceType sequenceType)
+{
+ file->open(QIODevice::Append | QIODevice::Text);
+ QTextStream out(file.data());
+ for (size_t i = 0; i < m_queries.size(); ++i)
+ {
+ if (m_queries[i]->getSequenceType() == sequenceType)
+ {
+ out << ">" << m_queries[i]->getName() << "\n";
+ out << m_queries[i]->getSequence();
+ out << "\n";
+ }
+ }
+ file->close();
+}
+
+
+void BlastQueries::searchOccurred()
+{
+ for (size_t i = 0; i < m_queries.size(); ++i)
+ m_queries[i]->setAsSearchedFor();
+}
+
+
+void BlastQueries::clearSearchResults()
+{
+ for (size_t i = 0; i < m_queries.size(); ++i)
+ m_queries[i]->clearSearchResults();
+}
+
+
+int BlastQueries::getQueryCount()
+{
+ return int(m_queries.size());
+}
+
+int BlastQueries::getQueryCountWithAtLeastOnePath()
+{
+ int count = 0;
+
+ for (size_t i = 0; i < m_queries.size(); ++i)
+ {
+ if (m_queries[i]->getPathCount() > 0)
+ ++count;
+ }
+
+ return count;
+}
+
+int BlastQueries::getQueryPathCount()
+{
+ int count = 0;
+
+ for (size_t i = 0; i < m_queries.size(); ++i)
+ count += m_queries[i]->getPathCount();
+ return count;
+}
+
+int BlastQueries::getQueryCount(SequenceType sequenceType)
+{
+ int count = 0;
+ for (size_t i = 0; i < m_queries.size(); ++i)
+ {
+ if (m_queries[i]->getSequenceType() == sequenceType)
+ ++count;
+ }
+ return count;
+}
+
+
+bool BlastQueries::tempNuclFileExists()
+{
+ if (m_tempNuclFile.isNull())
+ return false;
+ return m_tempNuclFile->exists();
+}
+bool BlastQueries::tempProtFileExists()
+{
+ if (m_tempProtFile.isNull())
+ return false;
+ return m_tempProtFile->exists();
+}
+
+
+//This function looks to see if a query pointer is in the list
+//of queries. The query pointer given may or may not still
+//actually exist, so it can't be dereferenced.
+bool BlastQueries::isQueryPresent(BlastQuery * query)
+{
+ for (size_t i = 0; i < m_queries.size(); ++i)
+ {
+ if (query == m_queries[i])
+ return true;
+ }
+
+ return false;
+}
+
+
+//This function looks at each BLAST query and tries to find a path through
+//the graph which covers the maximal amount of the query.
+void BlastQueries::findQueryPaths()
+{
+ for (size_t i = 0; i < m_queries.size(); ++i)
+ m_queries[i]->findQueryPaths();
+}
+
+
diff --git a/blast/blastqueries.h b/blast/blastqueries.h
new file mode 100644
index 0000000..cf8e015
--- /dev/null
+++ b/blast/blastqueries.h
@@ -0,0 +1,74 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef BLASTQUERIES_H
+#define BLASTQUERIES_H
+
+#include <vector>
+#include "blastquery.h"
+#include <QFile>
+#include "../program/globals.h"
+#include <QSharedPointer>
+
+//This class manages all BLAST queries. It holds BlastQuery
+//objects itself, and it creates/modifies/deletes the temp
+//files which hold the queries for use in BLAST.
+//There are two separate temp files, one for nucleotide
+//queries (for blastn) and one for protein queries (for
+//tblasn).
+
+class BlastQueries
+{
+public:
+ BlastQueries();
+ ~BlastQueries();
+
+ std::vector<BlastQuery *> m_queries;
+
+ BlastQuery * getQueryFromName(QString queryName);
+
+ void createTempQueryFiles();
+ void addQuery(BlastQuery * newQuery);
+ QString renameQuery(BlastQuery * newQuery, QString newName);
+ void clearAllQueries();
+ void clearSomeQueries(std::vector<BlastQuery *> queriesToRemove);
+ void searchOccurred();
+ void clearSearchResults();
+ int getQueryCount();
+ int getQueryCountWithAtLeastOnePath();
+ int getQueryPathCount();
+ int getQueryCount(SequenceType sequenceType);
+ bool isQueryPresent(BlastQuery * query);
+ void findQueryPaths();
+
+ std::vector<QColor> m_presetColours;
+
+private:
+ QSharedPointer<QFile> m_tempNuclFile;
+ QSharedPointer<QFile> m_tempProtFile;
+
+ void deleteTempFiles();
+ void updateTempFiles();
+ bool tempNuclFileExists();
+ bool tempProtFileExists();
+ void writeTempFile(QSharedPointer<QFile> file, SequenceType sequenceType);
+ QString getUniqueName(QString name);
+
+};
+
+#endif // BLASTQUERIES_H
diff --git a/blast/blastquery.cpp b/blast/blastquery.cpp
new file mode 100644
index 0000000..d4c2962
--- /dev/null
+++ b/blast/blastquery.cpp
@@ -0,0 +1,287 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "blastquery.h"
+#include "../program/settings.h"
+#include "../graph/path.h"
+#include "../graph/debruijnnode.h"
+#include <limits>
+#include <vector>
+#include <utility>
+
+BlastQuery::BlastQuery(QString name, QString sequence) :
+ m_name(name), m_sequence(sequence), m_searchedFor(false), m_shown(true)
+{
+ autoSetSequenceType();
+}
+
+
+//This function looks at the query sequence to decide if it is
+//a nucleotide or protein sequence.
+void BlastQuery::autoSetSequenceType()
+{
+ //If the sequence contains a letter that's in the protein
+ //alphabet but not in the extended DNA alphabet, then it's
+ //a protein
+ if (m_sequence.contains('e') || m_sequence.contains('E') ||
+ m_sequence.contains('f') || m_sequence.contains('F') ||
+ m_sequence.contains('i') || m_sequence.contains('I') ||
+ m_sequence.contains('l') || m_sequence.contains('L') ||
+ m_sequence.contains('p') || m_sequence.contains('P') ||
+ m_sequence.contains('q') || m_sequence.contains('Q'))
+ {
+ m_sequenceType = PROTEIN;
+ return;
+ }
+
+ //If the code got here, then it's a bit trickier. It could
+ //possibly be an extended alphabet DNA sequence or a protein
+ //sequence without particular amino acids.
+
+ //Look to see if A, C, G, T and N make up 75% or more of
+ //the sequence. If so, it's DNA. If not, it's
+ //protein.
+ int length = m_sequence.length();
+ int nuclLetters = m_sequence.count('a') + m_sequence.count('A') +
+ m_sequence.count('c') + m_sequence.count('C') +
+ m_sequence.count('g') + m_sequence.count('G') +
+ m_sequence.count('t') + m_sequence.count('T') +
+ m_sequence.count('n') + m_sequence.count('N');
+
+ if (double(nuclLetters) / length >= 0.75)
+ m_sequenceType = NUCLEOTIDE;
+ else
+ m_sequenceType = PROTEIN;
+}
+
+
+QString BlastQuery::getTypeString() const
+{
+ if (m_sequenceType == NUCLEOTIDE)
+ return "nucl";
+ else
+ return "prot";
+}
+
+
+void BlastQuery::clearSearchResults()
+{
+ m_searchedFor = false;
+ m_hits.clear();
+}
+
+
+
+
+
+//This function tries to find the paths through the graph which cover the query.
+void BlastQuery::findQueryPaths()
+{
+ m_paths = QList<BlastQueryPath>();
+ if (m_hits.size() > g_settings->maxHitsForQueryPath)
+ return;
+
+ int queryLength = m_sequence.length();
+ if (m_sequenceType == PROTEIN)
+ queryLength *= 3;
+
+ //Find all possible path starts within an acceptable distance from the query
+ //start.
+ QList<BlastHit *> possibleStarts;
+ double acceptableStartFraction = 1.0 - g_settings->minQueryCoveredByPath;
+ for (int i = 0; i < m_hits.size(); ++i)
+ {
+ BlastHit * hit = m_hits[i].data();
+ if (hit->m_queryStartFraction <= acceptableStartFraction)
+ possibleStarts.push_back(hit);
+ }
+
+ //Find all possible path ends.
+ QList<BlastHit *> possibleEnds;
+ double acceptableEndFraction = g_settings->minQueryCoveredByPath;
+ for (int i = 0; i < m_hits.size(); ++i)
+ {
+ BlastHit * hit = m_hits[i].data();
+ if (hit->m_queryEndFraction >= acceptableEndFraction)
+ possibleEnds.push_back(hit);
+ }
+
+ //For each possible start, find paths to each possible end.
+ QList<Path> possiblePaths;
+ for (int i = 0; i < possibleStarts.size(); ++i)
+ {
+ BlastHit * start = possibleStarts[i];
+ GraphLocation startLocation = start->getHitStart();
+
+ for (int j = 0; j < possibleEnds.size(); ++j)
+ {
+ BlastHit * end = possibleEnds[j];
+ GraphLocation endLocation = end->getHitEnd();
+
+ //Assuming there is a path from the start hit to the end hit,
+ //determine the ideal length. This is the query length minus the
+ //parts of the query not covered by the start and end.
+ int partialQueryLength = queryLength;
+ int pathStart = start->m_queryStart - 1;
+ int pathEnd = end->m_queryEnd;
+ if (m_sequenceType == PROTEIN)
+ {
+ pathStart *= 3;
+ pathEnd *= 3;
+ }
+ partialQueryLength -= pathStart;
+ partialQueryLength -= queryLength - pathEnd;
+
+ //Determine the minimum and maximum lengths allowed for the path.
+ int minLength;
+ if (g_settings->minLengthPercentage.on && g_settings->minLengthBaseDiscrepancy.on) //both on
+ minLength = std::max(int(partialQueryLength * g_settings->minLengthPercentage + 0.5), partialQueryLength + g_settings->minLengthBaseDiscrepancy);
+ else if (g_settings->minLengthPercentage.on && !g_settings->minLengthBaseDiscrepancy.on) //just relative
+ minLength = int(partialQueryLength * g_settings->minLengthPercentage + 0.5);
+ else if (!g_settings->minLengthPercentage.on && g_settings->minLengthBaseDiscrepancy.on) //just absolute
+ minLength = partialQueryLength + g_settings->minLengthBaseDiscrepancy;
+ else //neither are on
+ minLength = 1;
+
+ int maxLength;
+ if (g_settings->maxLengthPercentage.on && g_settings->maxLengthBaseDiscrepancy.on) //both on
+ maxLength = std::min(int(partialQueryLength * g_settings->maxLengthPercentage + 0.5), partialQueryLength + g_settings->maxLengthBaseDiscrepancy);
+ else if (g_settings->maxLengthPercentage.on && !g_settings->maxLengthBaseDiscrepancy.on) //just relative
+ maxLength = int(partialQueryLength * g_settings->maxLengthPercentage + 0.5);
+ else if (!g_settings->maxLengthPercentage.on && g_settings->maxLengthBaseDiscrepancy.on) //just absolute
+ maxLength = partialQueryLength + g_settings->maxLengthBaseDiscrepancy;
+ else //neither are on
+ maxLength = std::numeric_limits<int>::max();
+
+ possiblePaths.append(Path::getAllPossiblePaths(startLocation,
+ endLocation,
+ g_settings->maxQueryPathNodes - 1,
+ minLength,
+ maxLength));
+ }
+ }
+
+
+ //Now we use the Path objects to make BlastQueryPath objects. These contain
+ //BLAST-specific information that the Path class doesn't.
+ QList<BlastQueryPath> blastQueryPaths;
+ for (int i = 0; i < possiblePaths.size(); ++i)
+ blastQueryPaths.push_back(BlastQueryPath(possiblePaths[i], this));
+
+ //We now want to throw out any paths for which the hits fail to meet the
+ //thresholds in settings.
+ QList<BlastQueryPath> sufficientCoveragePaths;
+ for (int i = 0; i < blastQueryPaths.size(); ++i)
+ {
+ if (blastQueryPaths[i].getPathQueryCoverage() < g_settings->minQueryCoveredByPath)
+ continue;
+ if (g_settings->minQueryCoveredByHits.on && blastQueryPaths[i].getHitsQueryCoverage() < g_settings->minQueryCoveredByHits)
+ continue;
+ if (g_settings->maxEValueProduct.on && blastQueryPaths[i].getEvalueProduct() > g_settings->maxEValueProduct)
+ continue;
+ if (g_settings->minMeanHitIdentity.on && blastQueryPaths[i].getMeanHitPercIdentity() < 100.0 * g_settings->minMeanHitIdentity)
+ continue;
+ if (g_settings->minLengthPercentage.on && blastQueryPaths[i].getRelativePathLength() < g_settings->minLengthPercentage)
+ continue;
+ if (g_settings->maxLengthPercentage.on && blastQueryPaths[i].getRelativePathLength() > g_settings->maxLengthPercentage)
+ continue;
+ if (g_settings->minLengthBaseDiscrepancy.on && blastQueryPaths[i].getAbsolutePathLengthDifference() < g_settings->minLengthBaseDiscrepancy)
+ continue;
+ if (g_settings->maxLengthBaseDiscrepancy.on && blastQueryPaths[i].getAbsolutePathLengthDifference() > g_settings->maxLengthBaseDiscrepancy)
+ continue;
+
+ sufficientCoveragePaths.push_back(blastQueryPaths[i]);
+ }
+
+ //We now want to throw out any paths which are sub-paths of other, larger
+ //paths.
+ for (int i = 0; i < sufficientCoveragePaths.size(); ++i)
+ {
+ bool throwOut = false;
+ for (int j = 0; j < sufficientCoveragePaths.size(); ++j)
+ {
+ //No need to compare a path with itself.
+ if (i == j)
+ continue;
+
+ if (sufficientCoveragePaths[i].getPath().hasNodeSubset(sufficientCoveragePaths[j].getPath()))
+ {
+ throwOut = true;
+ break;
+ }
+ }
+ if (!throwOut)
+ m_paths.push_back(sufficientCoveragePaths[i]);
+ }
+
+ //Now we sort the paths from best to worst.
+ std::sort(m_paths.begin(), m_paths.end());
+}
+
+
+
+//This function returns the fraction of the query that is covered by BLAST hits.
+//If a list of BLAST hits is passed to the function, it only looks in those
+//hits. If no such list is passed, it looks in all hits for this query.
+// http://stackoverflow.com/questions/5276686/merging-ranges-in-c
+double BlastQuery::fractionCoveredByHits(const QList<BlastHit *> * hitsToCheck) const
+{
+ int hitBases = 0;
+ int queryLength = getLength();
+ if (queryLength == 0)
+ return 0.0;
+
+ std::vector<std::pair<int, int> > ranges;
+ if (hitsToCheck == 0) {
+ for (int i = 0; i < m_hits.size(); ++i) {
+ BlastHit * hit = m_hits[i].data();
+ ranges.push_back(std::pair<int,int>(hit->m_queryStart - 1, hit->m_queryEnd));
+ }
+ }
+ else {
+ for (int i = 0; i < hitsToCheck->size(); ++i) {
+ BlastHit * hit = (*hitsToCheck)[i];
+ ranges.push_back(std::pair<int,int>(hit->m_queryStart - 1, hit->m_queryEnd));
+ }
+ }
+
+ if (ranges.size() == 0)
+ return 0.0;
+
+ std::sort(ranges.begin(), ranges.end());
+
+ std::vector<std::pair<int, int> > mergedRanges;
+ std::vector<std::pair<int, int> >::iterator it = ranges.begin();
+ std::pair<int,int> current = *(it)++;
+ while (it != ranges.end())
+ {
+ if (current.second >= it->first) {
+ current.second = std::max(current.second, it->second);
+ } else {
+ mergedRanges.push_back(current);
+ current = *(it);
+ }
+ it++;
+ }
+ mergedRanges.push_back(current);
+
+ for (size_t i = 0; i < mergedRanges.size(); ++i)
+ hitBases += mergedRanges[i].second - mergedRanges[i].first;
+
+ return double(hitBases) / queryLength;
+}
diff --git a/blast/blastquery.h b/blast/blastquery.h
new file mode 100644
index 0000000..3c6ad52
--- /dev/null
+++ b/blast/blastquery.h
@@ -0,0 +1,83 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef BLASTQUERY_H
+#define BLASTQUERY_H
+
+#include <QObject>
+#include <QString>
+#include <QColor>
+#include "../program/globals.h"
+#include "blasthit.h"
+#include <QList>
+#include <QSharedPointer>
+#include "blastquerypath.h"
+
+class BlastQuery : public QObject
+{
+ Q_OBJECT
+
+public:
+ //CREATORS
+ BlastQuery() {}
+ BlastQuery(QString name, QString sequence);
+
+ //ACCESSORS
+ QString getName() const {return m_name;}
+ QString getSequence() const {return m_sequence;}
+ int getLength() const {return m_sequence.length();}
+ bool hasHits() const {return m_hits.size() > 0;}
+ int hitCount() const {return m_hits.size();}
+ QList< QSharedPointer<BlastHit> > getHits() const {return m_hits;}
+ bool wasSearchedFor() const {return m_searchedFor;}
+ QColor getColour() const {return m_colour;}
+ SequenceType getSequenceType() const {return m_sequenceType;}
+ QList<BlastQueryPath> getPaths() const {return m_paths;}
+ int getPathCount() const {return m_paths.size();}
+ QString getTypeString() const;
+ double fractionCoveredByHits(const QList<BlastHit *> * hitsToCheck = 0) const;
+ bool isShown() const {return m_shown;}
+ bool isHidden() const {return !m_shown;}
+
+ //MODIFIERS
+ void setName(QString newName) {m_name = newName;}
+ void addHit(QSharedPointer<BlastHit> newHit) {m_hits.push_back(newHit);}
+ void clearSearchResults();
+ void setAsSearchedFor() {m_searchedFor = true;}
+ void findQueryPaths();
+
+public slots:
+ void setColour(QColor newColour) {m_colour = newColour;}
+ void setShown(bool newShown) {m_shown = newShown;}
+
+private:
+ QString m_name;
+ QString m_sequence;
+ QList< QSharedPointer<BlastHit> > m_hits;
+ bool m_searchedFor;
+ QColor m_colour;
+ SequenceType m_sequenceType;
+ QList<BlastQueryPath> m_paths;
+ bool m_shown;
+
+ void autoSetSequenceType();
+ bool positionInAnyHit(int position) const;
+ bool positionInHitList(int position, const QList<BlastHit *> * hitsToCheck) const;
+};
+
+#endif // BLASTQUERY_H
diff --git a/blast/blastquerypath.cpp b/blast/blastquerypath.cpp
new file mode 100644
index 0000000..4794903
--- /dev/null
+++ b/blast/blastquerypath.cpp
@@ -0,0 +1,320 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage.
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "blastquerypath.h"
+
+#include "blastquery.h"
+#include "../graph/debruijnnode.h"
+#include "../program/globals.h"
+#include "../graph/assemblygraph.h"
+#include "../graph/debruijnedge.h"
+#include <limits>
+
+BlastQueryPath::BlastQueryPath(Path path, BlastQuery * query) :
+ m_path(path), m_query(query)
+{
+
+ //This function follows the path, returning the BLAST hits it finds for the
+ //query. It requires that the hits occur in order, i.e. that each hit in
+ //the path begins later in the query than the previous hit.
+
+ BlastHit * previousHit = 0;
+ QList<DeBruijnNode *> pathNodes = m_path.getNodes();
+ for (int i = 0; i < pathNodes.size(); ++i)
+ {
+ DeBruijnNode * node = pathNodes[i];
+
+ QList<BlastHit *> hitsThisNode;
+ QList< QSharedPointer<BlastHit> > queryHits = query->getHits();
+ for (int j = 0; j < queryHits.size(); ++j)
+ {
+ BlastHit * hit = queryHits[j].data();
+ if (hit->m_node->getName() == node->getName())
+ hitsThisNode.push_back(hit);
+ }
+
+ std::sort(hitsThisNode.begin(), hitsThisNode.end(),
+ BlastHit::compareTwoBlastHitPointers);
+
+ for (int j = 0; j < hitsThisNode.size(); ++j)
+ {
+ BlastHit * hit = hitsThisNode[j];
+
+ //First check to make sure the hits are within the path. This means
+ //if we are in the first or last nodes of the path, we need to make
+ //sure that our hit is contained within the start/end positions.
+ if ( (i != 0 || hit->m_nodeStart >= m_path.getStartLocation().getPosition()) &&
+ (i != pathNodes.size()-1 || hit->m_nodeEnd <= m_path.getEndLocation().getPosition()))
+ {
+ //Now make sure that the hit follows the previous hit in the
+ //query.
+ if (previousHit == 0 ||
+ hit->m_queryStart > previousHit->m_queryStart)
+ {
+ m_hits.push_back(hit);
+ previousHit = hit;
+ }
+ }
+ }
+ }
+}
+
+
+
+
+
+double BlastQueryPath::getMeanHitPercIdentity() const
+{
+ int totalHitLength = 0;
+ double sum = 0.0;
+
+ for (int i = 0; i < m_hits.size(); ++i)
+ {
+ int hitLength = m_hits[i]->m_alignmentLength;
+ totalHitLength += hitLength;
+
+ double hitIdentity = m_hits[i]->m_percentIdentity;
+ sum += hitIdentity * hitLength;
+ }
+
+ if (totalHitLength == 0)
+ return 0.0;
+ else
+ return sum / totalHitLength;
+}
+
+
+
+
+//This function looks at all of the hits in the path for this query and
+//multiplies the e-values together. If the hits overlap each other, then
+//this function reduces the e-values accoringly (effectively to prevent
+//the overlapping region from being counted twice).
+SciNot BlastQueryPath::getEvalueProduct() const
+{
+ double coefficientProduct = 1.0;
+ int exponentSum = 0;
+
+ for (int i = 0; i < m_hits.size(); ++i)
+ {
+ BlastHit * thisHit = m_hits[i];
+ SciNot thisHitEValue = thisHit->m_eValue;
+ double eValueLenToRemove = 0.0;
+ if (i > 0) {
+ BlastHit * previousHit = m_hits[i-1];
+ int overlap = getHitOverlap(previousHit, thisHit);
+ if (overlap > 0)
+ eValueLenToRemove += overlap / 2.0;
+ }
+ if (i < m_hits.size() - 1) {
+ BlastHit * nextHit = m_hits[i+1];
+ int overlap = getHitOverlap(thisHit, nextHit);
+ if (overlap > 0)
+ eValueLenToRemove += overlap / 2.0;
+ }
+ if (eValueLenToRemove > 0.0) {
+ int thisHitLength = thisHit->getNodeLength();
+ double reduction = (thisHitLength - eValueLenToRemove) / thisHitLength;
+ thisHitEValue.power(reduction);
+ }
+
+ coefficientProduct *= thisHitEValue.getCoefficient();
+ exponentSum += thisHitEValue.getExponent();
+ }
+
+ return SciNot(coefficientProduct, exponentSum);
+}
+
+
+int BlastQueryPath::getHitOverlap(BlastHit * hit1, BlastHit * hit2) const
+{
+ int hit1Start, hit1End, hit2Start, hit2End;
+ QPair<DeBruijnNode *, DeBruijnNode *> possibleEdge(hit1->m_node, hit2->m_node);
+
+ // Overlap in the same node is simple.
+ if (hit1->m_node == hit2->m_node) {
+ hit1Start = hit1->m_nodeStart - 1;
+ hit1End = hit1->m_nodeEnd;
+ hit2Start = hit2->m_nodeStart - 1;
+ hit2End = hit2->m_nodeEnd;
+ }
+
+ // Overlap in connected nodes is a bit more complex - we need to express
+ // the second hit's coordinates in terms of the first hit's node.
+ else if (g_assemblyGraph->m_deBruijnGraphEdges.contains(possibleEdge)) {
+ DeBruijnEdge * edge = g_assemblyGraph->m_deBruijnGraphEdges[possibleEdge];
+ int overlap = edge->getOverlap();
+ hit1Start = hit1->m_nodeStart;
+ hit1End = hit1->m_nodeEnd;
+ int hit1NodeLen = hit1->m_node->getLength();
+ hit2Start = hit2->m_nodeStart + hit1NodeLen - overlap;
+ hit2End = hit2->m_nodeEnd + hit1NodeLen - overlap;
+ }
+ else
+ return 0;
+
+ int overlap = std::min(hit1End, hit2End) - std::max(hit1Start, hit2Start);
+ if (overlap > 0)
+ return overlap;
+ else
+ return 0;
+}
+
+
+//This function looks at the length of the given path and compares it to how
+//long the path should be for the hits it contains (i.e. if the path perfectly
+//matched up the query).
+double BlastQueryPath::getRelativeLengthDiscrepancy() const
+{
+ if (m_hits.empty())
+ return std::numeric_limits<double>::max();
+
+ int hitQueryLength = getHitQueryLength();
+
+ int discrepancy = m_path.getLength() - hitQueryLength;
+ return double(discrepancy) / hitQueryLength;
+}
+
+
+//This function gets the length of the path relative to the how long it should
+//be. A value of 1 means a perfect match; less than 1 means it is too short;
+//more than 1 means it is too long.
+double BlastQueryPath::getRelativePathLength() const
+{
+ return double(m_path.getLength()) / getHitQueryLength();
+}
+
+
+//This function gets the difference between how long the path is vs how long it
+//should be. A value of 0 means a perfect match; less than 0 means it is too
+//short; more than 0 means it is too long.
+int BlastQueryPath::getAbsolutePathLengthDifference() const
+{
+ return m_path.getLength() - getHitQueryLength();
+}
+
+
+QString BlastQueryPath::getAbsolutePathLengthDifferenceString(bool commas) const
+{
+ int lengthDisc = getAbsolutePathLengthDifference();
+ QString lengthDiscSign = "";
+ if (lengthDisc > 0)
+ lengthDiscSign = "+";
+ if (commas)
+ return lengthDiscSign + formatIntForDisplay(lengthDisc);
+ else
+ return lengthDiscSign + QString::number(lengthDisc);
+}
+
+
+//This function returns the fraction of the query that is covered by the entire
+//path.
+double BlastQueryPath::getPathQueryCoverage() const
+{
+ if (m_hits.empty())
+ return 0.0;
+
+ int queryStart = m_hits.front()->m_queryStart;
+ int queryEnd = m_hits.back()->m_queryEnd;
+ int queryLength = m_query->getLength();
+
+ int notIncluded = queryStart - 1;
+ notIncluded += queryLength - queryEnd;
+
+ return 1.0 - notIncluded / double(queryLength);
+}
+
+
+//This function returns the fraction of the query that is covered by hits in the
+//path.
+double BlastQueryPath::getHitsQueryCoverage() const
+{
+ return m_query->fractionCoveredByHits(&m_hits);
+}
+
+
+//This function returns the length of the query which is covered by the path.
+//It is returned in bp, whether or not the query is a protein or nucleotide
+//sequence.
+int BlastQueryPath::getHitQueryLength() const
+{
+ int queryStart = m_hits.front()->m_queryStart;
+ int queryEnd = m_hits.back()->m_queryEnd;
+ int hitQueryLength = queryEnd - queryStart + 1;
+
+ if (m_query->getSequenceType() == PROTEIN)
+ hitQueryLength *= 3;
+
+ return hitQueryLength;
+}
+
+
+
+int BlastQueryPath::getTotalHitMismatches() const
+{
+ int total = 0;
+ for (int i = 0; i < m_hits.size(); ++i)
+ total += m_hits[i]->m_numberMismatches;
+ return total;
+}
+
+int BlastQueryPath::getTotalHitGapOpens() const
+{
+ int total = 0;
+ for (int i = 0; i < m_hits.size(); ++i)
+ total += m_hits[i]->m_numberGapOpens;
+ return total;
+}
+
+
+//This function is used for sorting the paths for a query from best to worst.
+//it uses < to mean 'better than'.
+bool BlastQueryPath::operator<(BlastQueryPath const &other) const
+{
+ //First we compare using the E-value product. This seems to value stronger
+ //hits as well as paths with fewer, longer hits.
+ SciNot aEValueProduct = getEvalueProduct();
+ SciNot bEValueProduct = other.getEvalueProduct();
+ if (aEValueProduct != bEValueProduct)
+ return aEValueProduct < bEValueProduct;
+
+ //If the code got here, then the two paths have the same e-value product,
+ //possibly because they contain the same hits, or possibly because they both
+ //contain hits so strong as to have an e-value of zero.
+
+ //Now we compare using mean percent identity.
+ double aMeanPercIdentity = getMeanHitPercIdentity();
+ double bMeanPercIdentity = other.getMeanHitPercIdentity();
+ if (aMeanPercIdentity != bMeanPercIdentity)
+ return aMeanPercIdentity > bMeanPercIdentity;
+
+ //Now we use the absolute value of the length discrepancy.
+ double aLengthDiscrepancy = fabs(getRelativeLengthDiscrepancy());
+ double bLengthDiscrepancy = fabs(other.getRelativeLengthDiscrepancy());
+ if (aLengthDiscrepancy != bLengthDiscrepancy)
+ return aLengthDiscrepancy < bLengthDiscrepancy;
+
+ //Now we use fraction of query covered by hits.
+ double aHitsQueryCoverage = getHitsQueryCoverage();
+ double bHitsQueryCoverage = other.getHitsQueryCoverage();
+ if (aHitsQueryCoverage != bHitsQueryCoverage)
+ return aHitsQueryCoverage > bHitsQueryCoverage;
+
+ return false;
+}
+
diff --git a/blast/blastquerypath.h b/blast/blastquerypath.h
new file mode 100644
index 0000000..d2da38c
--- /dev/null
+++ b/blast/blastquerypath.h
@@ -0,0 +1,61 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage.
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef BLASTQUERYPATH_H
+#define BLASTQUERYPATH_H
+
+#include "../graph/path.h"
+#include <QList>
+#include "blasthit.h"
+#include "../program/scinot.h"
+
+class BlastQuery;
+
+class BlastQueryPath
+{
+public:
+
+ //CREATORS
+ BlastQueryPath(Path path, BlastQuery * query);
+
+ //ACCESSORS
+ Path getPath() const {return m_path;}
+ QList<BlastHit *> getHits() const {return m_hits;}
+ SciNot getEvalueProduct() const;
+ double getMeanHitPercIdentity() const;
+ double getRelativeLengthDiscrepancy() const;
+ double getRelativePathLength() const;
+ int getAbsolutePathLengthDifference() const;
+ QString getAbsolutePathLengthDifferenceString(bool commas) const;
+ double getPathQueryCoverage() const;
+ double getHitsQueryCoverage() const;
+ int getTotalHitMismatches() const;
+ int getTotalHitGapOpens() const;
+
+ bool operator<(BlastQueryPath const &other) const;
+
+private:
+ Path m_path;
+ BlastQuery * m_query;
+ QList<BlastHit *> m_hits;
+
+ int getHitQueryLength() const;
+ int getHitOverlap(BlastHit * hit1, BlastHit * hit2) const;
+};
+
+#endif // BLASTQUERYPATH_H
diff --git a/blast/blastsearch.cpp b/blast/blastsearch.cpp
new file mode 100644
index 0000000..0531cb0
--- /dev/null
+++ b/blast/blastsearch.cpp
@@ -0,0 +1,374 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "blastsearch.h"
+#include "../graph/assemblygraph.h"
+#include <QDir>
+#include <QRegularExpression>
+#include "buildblastdatabaseworker.h"
+#include "runblastsearchworker.h"
+#include "../program/settings.h"
+#include <QApplication>
+#include "../graph/debruijnnode.h"
+#include "../program/memory.h"
+#include <math.h>
+
+BlastSearch::BlastSearch() :
+ m_blastQueries(), m_tempDirectory("bandage_temp/")
+{
+}
+
+BlastSearch::~BlastSearch()
+{
+ cleanUp();
+}
+
+void BlastSearch::clearBlastHits()
+{
+ m_allHits.clear();
+ m_blastQueries.clearSearchResults();
+ m_blastOutput = "";
+}
+
+void BlastSearch::cleanUp()
+{
+ clearBlastHits();
+ m_blastQueries.clearAllQueries();
+ emptyTempDirectory();
+}
+
+//This function uses the contents of m_blastOutput (the raw output from the
+//BLAST search) to construct the BlastHit objects.
+//It looks at the filters to possibly exclude hits which fail to meet user-
+//defined thresholds.
+void BlastSearch::buildHitsFromBlastOutput()
+{
+ QStringList blastHitList = m_blastOutput.split("\n", QString::SkipEmptyParts);
+
+ for (int i = 0; i < blastHitList.size(); ++i)
+ {
+ QString hitString = blastHitList[i];
+ QStringList alignmentParts = hitString.split('\t');
+
+ if (alignmentParts.size() < 12)
+ continue;
+
+ QString queryName = alignmentParts[0];
+ QString nodeLabel = alignmentParts[1];
+ double percentIdentity = alignmentParts[2].toDouble();
+ int alignmentLength = alignmentParts[3].toInt();
+ int numberMismatches = alignmentParts[4].toInt();
+ int numberGapOpens = alignmentParts[5].toInt();
+ int queryStart = alignmentParts[6].toInt();
+ int queryEnd = alignmentParts[7].toInt();
+ int nodeStart = alignmentParts[8].toInt();
+ int nodeEnd = alignmentParts[9].toInt();
+ SciNot eValue(alignmentParts[10]);
+ double bitScore = alignmentParts[11].toDouble();
+
+ //Only save BLAST hits that are on forward strands.
+ if (nodeStart > nodeEnd)
+ continue;
+
+ QString nodeName = getNodeNameFromString(nodeLabel);
+ DeBruijnNode * node;
+ if (g_assemblyGraph->m_deBruijnGraphNodes.contains(nodeName))
+ node = g_assemblyGraph->m_deBruijnGraphNodes[nodeName];
+ else
+ continue;
+
+ BlastQuery * query = g_blastSearch->m_blastQueries.getQueryFromName(queryName);
+ if (query == 0)
+ continue;
+
+ QSharedPointer<BlastHit> hit(new BlastHit(query, node, percentIdentity, alignmentLength,
+ numberMismatches, numberGapOpens, queryStart, queryEnd,
+ nodeStart, nodeEnd, eValue, bitScore));
+
+ //Check the user-defined filters.
+ if (g_settings->blastAlignmentLengthFilter.on &&
+ alignmentLength < g_settings->blastAlignmentLengthFilter)
+ continue;
+ if (g_settings->blastQueryCoverageFilter.on)
+ {
+ double hitCoveragePercentage = 100.0 * hit->getQueryCoverageFraction();
+ if (hitCoveragePercentage < g_settings->blastQueryCoverageFilter)
+ continue;
+ }
+ if (g_settings->blastIdentityFilter.on &&
+ percentIdentity < g_settings->blastIdentityFilter)
+ continue;
+ if (g_settings->blastEValueFilter.on &&
+ eValue > g_settings->blastEValueFilter)
+ continue;
+ if (g_settings->blastBitScoreFilter.on &&
+ bitScore < g_settings->blastBitScoreFilter)
+ continue;
+
+ m_allHits.push_back(hit);
+ query->addHit(hit);
+ }
+}
+
+
+//This function looks at each BLAST query and tries to find a path through
+//the graph which covers the maximal amount of the query.
+void BlastSearch::findQueryPaths()
+{
+ m_blastQueries.findQueryPaths();
+}
+
+
+
+QString BlastSearch::getNodeNameFromString(QString nodeString)
+{
+ QStringList nodeStringParts = nodeString.split("_");
+
+ //The node string format should look like this:
+ //NODE_nodename_length_123_cov_1.23
+
+ if (nodeStringParts.size() < 6)
+ return "";
+
+ if (nodeStringParts.size() == 6)
+ return nodeStringParts[1];
+
+ //If the code got here, there are more than 6 parts. This means there are
+ //underscores in the node name (happens a lot with Trinity graphs). So we
+ //need to pull out the parts which consitute the name.
+ int underscoreCount = nodeStringParts.size() - 6;
+ QString nodeName = "";
+ for (int i = 0; i <= underscoreCount; ++i)
+ {
+ nodeName += nodeStringParts[1+i];
+ if (i < underscoreCount)
+ nodeName += "_";
+ }
+ return nodeName;
+}
+
+
+#ifdef Q_OS_WIN32
+//On Windows, we use the WHERE command to find a program.
+bool BlastSearch::findProgram(QString programName, QString * command)
+{
+ QString findCommand = "WHERE " + programName;
+ QProcess find;
+ find.start(findCommand);
+ find.waitForFinished();
+ *command = programName;
+ return (find.exitCode() == 0);
+}
+
+#else
+//On Mac/Linux we use the which command to find a program.
+bool BlastSearch::findProgram(QString programName, QString * command)
+{
+ QString findCommand = "which " + programName;
+ QProcess find;
+
+ //On Mac, it's necessary to adjust the PATH variable in order
+ //for which to work.
+#ifdef Q_OS_MAC
+ QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
+ QStringList envlist = env.toStringList();
+
+ //Add some paths to the process environment
+ envlist.replaceInStrings(QRegularExpression("^(?i)PATH=(.*)"), "PATH="
+ "/usr/bin:"
+ "/bin:"
+ "/usr/sbin:"
+ "/sbin:"
+ "/opt/local/bin:"
+ "/usr/local/bin:"
+ "$HOME/bin:"
+ "/usr/local/ncbi/blast/bin:"
+ "\\1");
+ find.setEnvironment(envlist);
+#endif
+
+ find.start(findCommand);
+ find.waitForFinished();
+
+ //On a Mac, we need to use the full path to the program.
+#ifdef Q_OS_MAC
+ *command = QString(find.readAll()).simplified();
+#else
+ *command = programName;
+#endif
+
+ return (find.exitCode() == 0);
+}
+#endif
+
+
+
+void BlastSearch::clearSomeQueries(std::vector<BlastQuery *> queriesToRemove)
+{
+ //Remove any hits that are for queries that will be deleted.
+ QList< QSharedPointer<BlastHit> >::iterator i = m_allHits.begin();
+ while (i != m_allHits.end())
+ {
+ BlastQuery * hitQuery = (*i)->m_query;
+ bool hitIsForDeletedQuery = (std::find(queriesToRemove.begin(), queriesToRemove.end(), hitQuery) != queriesToRemove.end());
+ if (hitIsForDeletedQuery)
+ i = m_allHits.erase(i);
+ else
+ ++i;
+ }
+
+ //Now actually delete the queries.
+ m_blastQueries.clearSomeQueries(queriesToRemove);
+}
+
+
+
+void BlastSearch::emptyTempDirectory()
+{
+ //Safety checks
+ if (g_blastSearch->m_tempDirectory == "")
+ return;
+ if (!g_blastSearch->m_tempDirectory.contains("bandage_temp"))
+ return;
+
+ QDir tempDirectory(m_tempDirectory);
+ tempDirectory.setNameFilters(QStringList() << "*.*");
+ tempDirectory.setFilter(QDir::Files);
+ foreach(QString dirFile, tempDirectory.entryList())
+ tempDirectory.remove(dirFile);
+}
+
+
+//This function carries out the entire BLAST search procedure automatically, without user input.
+//It returns an error string which is empty if all goes well.
+QString BlastSearch::doAutoBlastSearch()
+{
+ cleanUp();
+
+ QString makeblastdbCommand;
+ if (!findProgram("makeblastdb", &makeblastdbCommand))
+ return "Error: The program makeblastdb was not found. Please install NCBI BLAST to use this feature.";
+
+ BuildBlastDatabaseWorker buildBlastDatabaseWorker(makeblastdbCommand);
+ buildBlastDatabaseWorker.buildBlastDatabase();
+ if (buildBlastDatabaseWorker.m_error != "")
+ return buildBlastDatabaseWorker.m_error;
+
+ loadBlastQueriesFromFastaFile(g_settings->blastQueryFilename);
+
+ QString blastnCommand;
+ if (!findProgram("blastn", &blastnCommand))
+ return "Error: The program blastn was not found. Please install NCBI BLAST to use this feature.";
+ QString tblastnCommand;
+ if (!findProgram("tblastn", &tblastnCommand))
+ return "Error: The program tblastn was not found. Please install NCBI BLAST to use this feature.";
+
+ RunBlastSearchWorker runBlastSearchWorker(blastnCommand, tblastnCommand, g_settings->blastSearchParameters);
+ runBlastSearchWorker.runBlastSearch();
+ if (runBlastSearchWorker.m_error != "")
+ return runBlastSearchWorker.m_error;
+
+ blastQueryChanged("all");
+
+ return "";
+}
+
+
+//This function returns the number of queries loaded from the FASTA file.
+int BlastSearch::loadBlastQueriesFromFastaFile(QString fullFileName)
+{
+ int queriesBefore = int(g_blastSearch->m_blastQueries.m_queries.size());
+
+ std::vector<QString> queryNames;
+ std::vector<QByteArray> querySequences;
+ AssemblyGraph::readFastaFile(fullFileName, &queryNames, &querySequences);
+
+ for (size_t i = 0; i < queryNames.size(); ++i)
+ {
+ QApplication::processEvents();
+
+ //We only use the part of the query name up to the first space.
+ QStringList queryNameParts = queryNames[i].split(" ");
+ QString queryName;
+ if (queryNameParts.size() > 0)
+ queryName = cleanQueryName(queryNameParts[0]);
+
+ g_blastSearch->m_blastQueries.addQuery(new BlastQuery(queryName,
+ querySequences[i]));
+ }
+
+ int queriesAfter = int(g_blastSearch->m_blastQueries.m_queries.size());
+ return queriesAfter - queriesBefore;
+}
+
+
+QString BlastSearch::cleanQueryName(QString queryName)
+{
+ //Replace whitespace with underscores
+ queryName = queryName.replace(QRegExp("\\s"), "_");
+
+ //Remove any dots from the end of the query name. BLAST doesn't
+ //include them in its results, so if we don't remove them, then
+ //we won't be able to find a match between the query name and
+ //the BLAST hit.
+ while (queryName.length() > 0 && queryName[queryName.size() - 1] == '.')
+ queryName = queryName.left(queryName.size() - 1);
+
+ return queryName;
+}
+
+void BlastSearch::blastQueryChanged(QString queryName)
+{
+ g_assemblyGraph->clearAllBlastHitPointers();
+
+ std::vector<BlastQuery *> queries;
+
+ //If "all" is selected, then we'll display each of the BLAST queries
+ if (queryName == "all")
+ queries = g_blastSearch->m_blastQueries.m_queries;
+
+ //If only one query is selected, then just display that one.
+ else
+ {
+ BlastQuery * query = g_blastSearch->m_blastQueries.getQueryFromName(queryName);
+ if (query != 0)
+ queries.push_back(query);
+ }
+
+ //We now filter out any queries that have been hidden by the user.
+ std::vector<BlastQuery *> shownQueries;
+ for (size_t i = 0; i < queries.size(); ++i)
+ {
+ BlastQuery * query = queries[i];
+ if (query->isShown())
+ shownQueries.push_back(query);
+ }
+
+ //Add the blast hit pointers to nodes that have a hit for
+ //the selected target(s).
+ for (size_t i = 0; i < shownQueries.size(); ++i)
+ {
+ BlastQuery * query = shownQueries[i];
+ for (int j = 0; j < g_blastSearch->m_allHits.size(); ++j)
+ {
+ BlastHit * hit = g_blastSearch->m_allHits[j].data();
+ if (hit->m_query == query)
+ hit->m_node->addBlastHit(hit);
+ }
+ }
+}
diff --git a/blast/blastsearch.h b/blast/blastsearch.h
new file mode 100644
index 0000000..9137df9
--- /dev/null
+++ b/blast/blastsearch.h
@@ -0,0 +1,63 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef BLASTSEARCH_H
+#define BLASTSEARCH_H
+
+#include "blasthit.h"
+#include "blastqueries.h"
+#include <vector>
+#include <QString>
+#include <QList>
+#include <QSharedPointer>
+#include "../program/scinot.h"
+
+//This is a class to hold all BLAST search related stuff.
+//An instance of it is made available to the whole program
+//as a global.
+
+class BlastSearch
+{
+public:
+ BlastSearch();
+ ~BlastSearch();
+
+ BlastQueries m_blastQueries;
+ QString m_blastOutput;
+ bool m_cancelBuildBlastDatabase;
+ bool m_cancelRunBlastSearch;
+ QProcess * m_makeblastdb;
+ QProcess * m_blast;
+ QString m_tempDirectory;
+ QList< QSharedPointer<BlastHit> > m_allHits;
+
+ void clearBlastHits();
+ void cleanUp();
+ void buildHitsFromBlastOutput();
+ void findQueryPaths();
+ static QString getNodeNameFromString(QString nodeString);
+ bool findProgram(QString programName, QString * command);
+ void clearSomeQueries(std::vector<BlastQuery *> queriesToRemove);
+ void emptyTempDirectory();
+ QString doAutoBlastSearch();
+ int loadBlastQueriesFromFastaFile(QString fullFileName);
+ QString cleanQueryName(QString queryName);
+ void blastQueryChanged(QString queryName);
+};
+
+#endif // BLASTSEARCH_H
diff --git a/blast/buildblastdatabaseworker.cpp b/blast/buildblastdatabaseworker.cpp
new file mode 100644
index 0000000..d5fcf2d
--- /dev/null
+++ b/blast/buildblastdatabaseworker.cpp
@@ -0,0 +1,102 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "buildblastdatabaseworker.h"
+#include <QProcess>
+#include "../program/globals.h"
+#include "../program/settings.h"
+#include <QFile>
+#include <QTextStream>
+#include <QMapIterator>
+#include "../graph/debruijnnode.h"
+#include "../graph/assemblygraph.h"
+#include "blastsearch.h"
+
+BuildBlastDatabaseWorker::BuildBlastDatabaseWorker(QString makeblastdbCommand) :
+ m_makeblastdbCommand(makeblastdbCommand)
+{
+}
+
+void BuildBlastDatabaseWorker::buildBlastDatabase()
+{
+ g_blastSearch->m_cancelBuildBlastDatabase = false;
+
+ QFile file(g_blastSearch->m_tempDirectory + "all_nodes.fasta");
+ file.open(QIODevice::WriteOnly | QIODevice::Text);
+ QTextStream out(&file);
+
+ QMapIterator<QString, DeBruijnNode*> i(g_assemblyGraph->m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ if (g_blastSearch->m_cancelBuildBlastDatabase)
+ {
+ emit finishedBuild("Build cancelled.");
+ return;
+ }
+
+ i.next();
+ DeBruijnNode * node = i.value();
+ out << node->getFasta(true, false, false);
+ }
+ file.close();
+
+ // Make sure the graph has sequences to BLAST.
+ bool atLeastOneSequence = false;
+ QMapIterator<QString, DeBruijnNode*> j(g_assemblyGraph->m_deBruijnGraphNodes);
+ while (j.hasNext())
+ {
+ j.next();
+ DeBruijnNode * node = j.value();
+ if (!node->sequenceIsMissing())
+ {
+ atLeastOneSequence = true;
+ break;
+ }
+ }
+ if (!atLeastOneSequence)
+ {
+ m_error = "Cannot build the BLAST database as this graph contains no sequences";
+ emit finishedBuild(m_error);
+ return;
+ }
+
+ QString fullMakeblastdbCommand = m_makeblastdbCommand + " -in " + g_blastSearch->m_tempDirectory + "all_nodes.fasta " + "-dbtype nucl";
+ g_blastSearch->m_makeblastdb = new QProcess();
+ g_blastSearch->m_makeblastdb->start(fullMakeblastdbCommand);
+
+ bool finished = g_blastSearch->m_makeblastdb->waitForFinished(-1);
+
+ if (g_blastSearch->m_makeblastdb->exitCode() != 0 || !finished)
+ {
+ m_error = "There was a problem building the BLAST database";
+ QString stdErr = g_blastSearch->m_makeblastdb->readAllStandardError();
+ if (stdErr.length() > 0)
+ m_error += ":\n\n" + stdErr;
+ else
+ m_error += ".";
+ }
+ else if (g_blastSearch->m_cancelBuildBlastDatabase)
+ m_error = "Build cancelled.";
+ else
+ m_error = "";
+
+ emit finishedBuild(m_error);
+
+ g_blastSearch->m_makeblastdb->deleteLater();
+ g_blastSearch->m_makeblastdb = 0;
+}
diff --git a/blast/buildblastdatabaseworker.h b/blast/buildblastdatabaseworker.h
new file mode 100644
index 0000000..7971ed7
--- /dev/null
+++ b/blast/buildblastdatabaseworker.h
@@ -0,0 +1,48 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef BUILDBLASTDATABASEWORKER_H
+#define BUILDBLASTDATABASEWORKER_H
+
+#include <QObject>
+#include <QProcess>
+
+//This class carries out the task of running makeblastdb on
+//the graph's nodes.
+//It is a separate class because when run from the GUI, this
+//process takes place in a separate thread.
+
+class BuildBlastDatabaseWorker : public QObject
+{
+ Q_OBJECT
+
+public:
+ BuildBlastDatabaseWorker(QString makeblastdbCommand);
+ QString m_error;
+
+private:
+ QString m_makeblastdbCommand;
+
+public slots:
+ void buildBlastDatabase();
+
+signals:
+ void finishedBuild(QString error);
+};
+
+#endif // BUILDBLASTDATABASEWORKER_H
diff --git a/blast/runblastsearchworker.cpp b/blast/runblastsearchworker.cpp
new file mode 100644
index 0000000..851cd4e
--- /dev/null
+++ b/blast/runblastsearchworker.cpp
@@ -0,0 +1,113 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "runblastsearchworker.h"
+#include "../program/globals.h"
+#include "../program/settings.h"
+#include "blastsearch.h"
+#include "../program/memory.h"
+
+
+RunBlastSearchWorker::RunBlastSearchWorker(QString blastnCommand, QString tblastnCommand, QString parameters) :
+ m_blastnCommand(blastnCommand), m_tblastnCommand(tblastnCommand), m_parameters(parameters)
+{
+
+}
+
+
+void RunBlastSearchWorker::runBlastSearch()
+{
+ g_blastSearch->m_cancelRunBlastSearch = false;
+
+ bool success;
+
+ if (g_blastSearch->m_blastQueries.getQueryCount(NUCLEOTIDE) > 0)
+ {
+ g_blastSearch->m_blastOutput += runOneBlastSearch(NUCLEOTIDE, &success);
+ if (!success)
+ return;
+ }
+
+ if (g_blastSearch->m_blastQueries.getQueryCount(PROTEIN) > 0 && !g_blastSearch->m_cancelRunBlastSearch)
+ {
+ g_blastSearch->m_blastOutput += runOneBlastSearch(PROTEIN, &success);
+ if (!success)
+ return;
+ }
+
+ if (g_blastSearch->m_cancelRunBlastSearch)
+ {
+ m_error = "BLAST search cancelled.";
+ emit finishedSearch(m_error);
+ return;
+ }
+
+ //If the code got here, then the search completed successfully.
+ g_blastSearch->buildHitsFromBlastOutput();
+ g_blastSearch->findQueryPaths();
+ g_blastSearch->m_blastQueries.searchOccurred();
+ m_error = "";
+ emit finishedSearch(m_error);
+}
+
+
+QString RunBlastSearchWorker::runOneBlastSearch(SequenceType sequenceType, bool * success)
+{
+ QString fullBlastCommand;
+ if (sequenceType == NUCLEOTIDE)
+ fullBlastCommand = m_blastnCommand + " -query " +g_blastSearch-> m_tempDirectory + "nucl_queries.fasta ";
+ else
+ fullBlastCommand = m_tblastnCommand + " -query " + g_blastSearch->m_tempDirectory + "prot_queries.fasta ";
+ fullBlastCommand += "-db " + g_blastSearch->m_tempDirectory + "all_nodes.fasta -outfmt 6";
+
+ QString extraCommandLineOptions = m_parameters;
+ fullBlastCommand += " " + extraCommandLineOptions;
+
+ g_blastSearch->m_blast = new QProcess();
+ g_blastSearch->m_blast->start(fullBlastCommand);
+
+ bool finished = g_blastSearch->m_blast->waitForFinished(-1);
+
+ if (g_blastSearch->m_blast->exitCode() != 0 || !finished)
+ {
+ if (g_blastSearch->m_cancelRunBlastSearch)
+ {
+ m_error = "BLAST search cancelled.";
+ emit finishedSearch(m_error);
+ }
+ else
+ {
+ m_error = "There was a problem running the BLAST search";
+ QString stdErr = g_blastSearch->m_blast->readAllStandardError();
+ if (stdErr.length() > 0)
+ m_error += ":\n\n" + stdErr;
+ else
+ m_error += ".";
+ emit finishedSearch(m_error);
+ }
+ *success = false;
+ return "";
+ }
+
+ QString blastOutput = g_blastSearch->m_blast->readAllStandardOutput();
+ g_blastSearch->m_blast->deleteLater();
+ g_blastSearch->m_blast = 0;
+
+ *success = true;
+ return blastOutput;
+}
diff --git a/blast/runblastsearchworker.h b/blast/runblastsearchworker.h
new file mode 100644
index 0000000..d4a3e53
--- /dev/null
+++ b/blast/runblastsearchworker.h
@@ -0,0 +1,53 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef RUNBLASTSEARCHWORKER_H
+#define RUNBLASTSEARCHWORKER_H
+
+#include <QObject>
+#include <QProcess>
+#include <QString>
+#include "../program/globals.h"
+
+//This class carries out the task of running blastn and/or
+//tblastn.
+//It is a separate class because when run from the GUI, this
+//process takes place in a separate thread.
+
+class RunBlastSearchWorker : public QObject
+{
+ Q_OBJECT
+
+public:
+ RunBlastSearchWorker(QString blastnCommand, QString tblastnCommand, QString parameters);
+ QString m_error;
+
+private:
+ QString m_blastnCommand;
+ QString m_tblastnCommand;
+ QString m_parameters;
+ QString runOneBlastSearch(SequenceType sequenceType, bool * success);
+
+public slots:
+ void runBlastSearch();
+
+signals:
+ void finishedSearch(QString error);
+};
+
+#endif // RUNBLASTSEARCHWORKER_H
diff --git a/build_scripts/bandage_build_linux.sh b/build_scripts/bandage_build_linux.sh
new file mode 100755
index 0000000..a59470a
--- /dev/null
+++ b/build_scripts/bandage_build_linux.sh
@@ -0,0 +1,98 @@
+#!/bin/bash
+
+# This is the script I use on my Ubuntu and CentOS virtual machines to build the public release of
+# Bandage. It produces an app bundle ready for deployment. It requires that the 'sample_LastGraph'
+# and 'dependencies' files are in the current directory.
+
+# This script will by default build Bandage twice: once as a statically-linked executable and once
+# as a dynamically-linked executable. If the user passes -s or -d, then it will build only the
+# static or dynamic variety, respectively. The two different varieties use two separate versions of
+# Qt. The dynamic version uses an older Qt version, as this will be compatible with more Linux
+# systems. The static version uses a current version of Qt.
+
+DYNAMIC_QMAKE="$HOME/Qt/5.2.1/gcc_64/bin/qmake"
+STATIC_QMAKE="$HOME/Desktop/qt/build/5.6.0/qtbase/bin/qmake"
+
+# Parse the arguments. If there are none, build both static and dynamic.
+DYNAMIC_BUILD=false
+STATIC_BUILD=false
+while getopts "ds" opt; do
+ case $opt in
+ d)
+ DYNAMIC_BUILD=true
+ ;;
+ s)
+ STATIC_BUILD=true
+ ;;
+ esac
+done
+if ! $DYNAMIC_BUILD && ! $STATIC_BUILD; then
+ STATIC_BUILD=true
+ DYNAMIC_BUILD=true
+fi
+
+# If a 'Bandage' directory already exists, then this script will assume it is the Bandage source
+# code and use it. If not, it will clone the master branch from GitHub.
+if [ ! -d "Bandage" ]; then
+ git clone https://github.com/rrwick/Bandage
+fi
+
+# Get the Bandage version number from the main.cpp file and replace its dots with underscores.
+VERSION_LINE=$(grep "setApplicationVersion" Bandage/program/main.cpp)
+IFS='"' read -ra ADDR <<< "$VERSION_LINE"
+VERSION="${ADDR[1]}"
+VERSION=${VERSION//\./_}
+
+# Determine the Linux distro (just used for naming the final zip files)
+. /etc/lsb-release
+DISTRO=$DISTRIB_ID
+if [ -z "$DISTRO" ] && [ -f /etc/debian_version ]; then
+ DISTRO="Debian"
+elif [ -z "$DISTRO" ] && [ -f /etc/fedora-release ]; then
+ DISTRO="Fedora"
+elif [ -z "$DISTRO" ] && [ -f /etc/centos-release ]; then
+ DISTRO="CentOS"
+elif [ -z "$DISTRO" ] && [ -f /etc/gentoo-release ]; then
+ DISTRO="Gentoo"
+fi
+if [ -z "$DISTRO" ]; then
+ DISTRO="Linux"
+fi
+BASE_ZIP_NAME="Bandage_$DISTRO"
+
+if $STATIC_BUILD; then
+ # Build the statically-linked version of Bandage.
+ cp -r Bandage/ Bandage-static/
+ cd Bandage-static/
+ $STATIC_QMAKE Bandage.pro
+ make
+ chmod +x Bandage
+ cd ..
+
+ # Zip static Bandage
+ STATIC_ZIP=$BASE_ZIP_NAME
+ STATIC_ZIP+="_static_v$VERSION.zip"
+ zip -j $STATIC_ZIP Bandage-static/Bandage
+ zip $STATIC_ZIP sample_LastGraph
+ rm -rf Bandage-static/
+fi
+
+if $DYNAMIC_BUILD; then
+ # Build the dynamically-linked version of Bandage.
+ cp -r Bandage/ Bandage-dynamic/
+ cd Bandage-dynamic/
+ $DYNAMIC_QMAKE Bandage.pro
+ make
+ chmod +x Bandage
+ cd ..
+
+ # Zip dynamic Bandage
+ DYNAMIC_ZIP=$BASE_ZIP_NAME
+ DYNAMIC_ZIP+="_dynamic_v$VERSION.zip"
+ zip -j $DYNAMIC_ZIP Bandage-dynamic/Bandage
+ zip $DYNAMIC_ZIP sample_LastGraph
+ zip $DYNAMIC_ZIP dependencies
+ rm -rf Bandage-dynamic/
+fi
+
+rm -rf Bandage/
diff --git a/build_scripts/bandage_build_mac.sh b/build_scripts/bandage_build_mac.sh
new file mode 100755
index 0000000..7c3a6dd
--- /dev/null
+++ b/build_scripts/bandage_build_mac.sh
@@ -0,0 +1,36 @@
+#!/bin/bash
+
+# This is the script I use on my OS X 10.8 virtual machine to build the public release of Bandage.
+# It produces an app bundle ready for deployment. It requires that sample_LastGraph is in the
+# current directory.
+
+# Find the Qt path automatically. This assumes it is installed in ~/Qt/ and is a 5.* version.
+QT_PATH=$(find $HOME/Qt -maxdepth 1 -name "5*" | sort | tail -n 1)
+
+# If a 'Bandage' directory already exists, then this script will use assume it is the Bandage
+# source code and use it. If not, it will clone the master branch from GitHub.
+if [ ! -d "Bandage" ]; then
+ git clone https://github.com/rrwick/Bandage
+fi
+
+# Build Bandage.
+cd Bandage/
+$QT_PATH/clang_64/bin/qmake
+make
+
+# Add the necessary libraries so Bandage can be deployed.
+$QT_PATH/clang_64/bin/macdeployqt Bandage.app
+cp $QT_PATH/clang_64/plugins/platforms/libqminimal.dylib Bandage.app/Contents/PlugIns/platforms/libqminimal.dylib
+
+# Get the Bandage version number from the main.cpp file and replace its dots with underscores.
+cd ..
+VERSION_LINE=$(grep "setApplicationVersion" Bandage/program/main.cpp)
+IFS='"' read -ra ADDR <<< "$VERSION_LINE"
+VERSION="${ADDR[1]}"
+VERSION=${VERSION//\./_}
+
+# Zip Bandage, add the sample graph and clean up.
+ZIP="Bandage_Mac_v$VERSION.zip"
+ditto -c -k --sequesterRsrc --keepParent Bandage/Bandage.app $ZIP
+zip $ZIP sample_LastGraph
+rm -rf Bandage/
diff --git a/build_scripts/bandage_build_windows.bat b/build_scripts/bandage_build_windows.bat
new file mode 100644
index 0000000..631b2bc
--- /dev/null
+++ b/build_scripts/bandage_build_windows.bat
@@ -0,0 +1,43 @@
+echo off
+
+rem This is the script I use on my Windows 7 virtual machine to build the public release of Bandage.
+rem Bandage. It produces a directory ready for deployment. It requires that sample_LastGraph is in
+rem the current directory.
+
+rem These variables must be set to the correct paths and values for your system.
+set QT_PATH=C:\Qt\5.6
+set MSVC_PATH=C:\Program Files (x86)\Microsoft Visual Studio 14.0
+set MSVC_VERSION=msvc2015_64
+set MSVC_VERSION_NUM=140
+set GIT_PATH=C:\Program Files\Git\bin\git
+set ZIP_PATH=C:\Program Files\7-Zip\7z.exe
+
+rem Set up the MSVC compiler.
+call "%MSVC_PATH%\VC\vcvarsall.bat" x86_amd64
+
+rem If a 'Bandage' directory already exists, then this script will use assume it is the Bandage
+rem source code and use it. If not, it will clone the master branch from GitHub.
+if not exist Bandage\ call "%GIT_PATH%" clone https://github.com/rrwick/Bandage.git
+call cd Bandage\
+call "%QT_PATH%\%MSVC_VERSION%\bin\qmake.exe"
+call "%QT_PATH%\..\Tools\QtCreator\bin\jom.exe"
+call cd ..
+
+rem Get the Bandage version number from the main.cpp file and replace its dots with underscores.
+for /f %%i in ('findstr setApplicationVersion Bandage\program\main.cpp') do set VERSION_LINE=%%i
+set VERSION_LINE=%VERSION_LINE:.=_%
+set VERSION_LINE=%VERSION_LINE:"=;%
+for /f "tokens=2 delims=;" %%G IN ("%VERSION_LINE%") DO set VERSION=%%G
+
+rem Delete all of the source and build files
+call move Bandage\release\Bandage.exe Bandage.exe
+call rmdir Bandage\ /S /Q
+call mkdir Bandage\
+call move Bandage.exe Bandage\Bandage.exe
+
+rem Add the necessary libraries so Bandage can be deployed.
+call "%QT_PATH%\%MSVC_VERSION%\bin\windeployqt.exe" Bandage\Bandage.exe
+
+rem Zip Bandage with the sample graph and clean up.
+call "%ZIP_PATH%" a -tzip Bandage_Windows_v%VERSION%.zip Bandage\ sample_LastGraph installation.txt
+call rmdir Bandage\ /S /Q
diff --git a/build_scripts/bandage_build_windows_32bit.bat b/build_scripts/bandage_build_windows_32bit.bat
new file mode 100644
index 0000000..6939c8c
--- /dev/null
+++ b/build_scripts/bandage_build_windows_32bit.bat
@@ -0,0 +1,43 @@
+echo off
+
+rem This is the script I use on my Windows 7 virtual machine to build the public release of Bandage.
+rem Bandage. It produces a directory ready for deployment. It requires that sample_LastGraph is in
+rem the current directory.
+
+rem These variables must be set to the correct paths and values for your system.
+set QT_PATH=C:\Qt\5.6
+set MSVC_PATH=C:\Program Files\Microsoft Visual Studio 14.0
+set MSVC_VERSION=msvc2015
+set MSVC_VERSION_NUM=140
+set GIT_PATH=C:\Program Files\Git\bin\git
+set ZIP_PATH=C:\Program Files\7-Zip\7z.exe
+
+rem Set up the MSVC compiler.
+call "%MSVC_PATH%\VC\vcvarsall.bat" x86
+
+rem If a 'Bandage' directory already exists, then this script will use assume it is the Bandage
+rem source code and use it. If not, it will clone the master branch from GitHub.
+if not exist Bandage\ call "%GIT_PATH%" clone https://github.com/rrwick/Bandage.git
+call cd Bandage\
+call "%QT_PATH%\%MSVC_VERSION%\bin\qmake.exe"
+call "%QT_PATH%\..\Tools\QtCreator\bin\jom.exe"
+call cd ..
+
+rem Get the Bandage version number from the main.cpp file and replace its dots with underscores.
+for /f %%i in ('findstr setApplicationVersion Bandage\program\main.cpp') do set VERSION_LINE=%%i
+set VERSION_LINE=%VERSION_LINE:.=_%
+set VERSION_LINE=%VERSION_LINE:"=;%
+for /f "tokens=2 delims=;" %%G IN ("%VERSION_LINE%") DO set VERSION=%%G
+
+rem Delete all of the source and build files
+call move Bandage\release\Bandage.exe Bandage.exe
+call rmdir Bandage\ /S /Q
+call mkdir Bandage\
+call move Bandage.exe Bandage\Bandage.exe
+
+rem Add the necessary libraries so Bandage can be deployed.
+call "%QT_PATH%\%MSVC_VERSION%\bin\windeployqt.exe" Bandage\Bandage.exe
+
+rem Zip Bandage with the sample graph and clean up.
+call "%ZIP_PATH%" a -tzip Bandage_Windows_32bit_v%VERSION%.zip Bandage\ sample_LastGraph installation.txt
+call rmdir Bandage\ /S /Q
diff --git a/build_scripts/installation.txt b/build_scripts/installation.txt
new file mode 100755
index 0000000..eded3b4
--- /dev/null
+++ b/build_scripts/installation.txt
@@ -0,0 +1 @@
+Bandage requires the Visual C++ Redistributable for Visual Studio 2015. If you do not have this already installed, you will get an error message when attempting to run Bandage.exe. In this case, you must first run vcredist_x64.exe to install the required libraries.
\ No newline at end of file
diff --git a/build_scripts/qt_static_build_centos.sh b/build_scripts/qt_static_build_centos.sh
new file mode 100755
index 0000000..e17c9e2
--- /dev/null
+++ b/build_scripts/qt_static_build_centos.sh
@@ -0,0 +1,131 @@
+#!/bin/bash
+
+# Run this script as root (using su)
+
+# This script builds a static version of Qt. It was originally writen by Lennart Rolland and taken
+# from here: https://stackoverflow.com/questions/24275551/
+# I modified it to work with CentOS and Qt 5.6 and move around some QtSvg stuff for Bandage.
+
+# Change this to the desired version.
+VER="5.6.0"
+
+# Dependencies:
+yum install libxcb libxcb-devel libXrender libXrender-devel xcb-util-wm xcb-util-wm-devel xcb-util xcb-util-devel xcb-util-image xcb-util-image-devel xcb-util-keysyms xcb-util-keysyms-devel fontconfig-devel freetype-devel libX11-devel libXext-devel libXfixes-devel libXi-devel mesa-libGLw gtkglext-devel
+
+VER2="${VER%.*}"
+WSRC="http://download.qt.io/official_releases/qt/$VER2/$VER/single/qt-everywhere-opensource-src-$VER.tar.xz"
+B=$(pwd) # Current dir (allows this script to be called from another dir)
+Q="$B/qt" # Base folder for the whole operation
+SRC="$Q/src/$VER" # The uncompressed source
+O="$Q/build/$VER" # The actual shadow dir
+XZ="$Q/xz/qt-$VER.tar.xz" # The tar.xz archive
+J=$(grep -c ^processor /proc/cpuinfo) # Parallel make, number of cores
+LOG="$O/log.txt" # Build log file
+
+# My configuration options for qt change to your hearts content, but make sure to clean out your current build before using it.
+OPTS=""
+OPTS+=" -release"
+OPTS+=" -optimized-tools"
+OPTS+=" -opensource"
+OPTS+=" -confirm-license"
+OPTS+=" -c++std c++11"
+OPTS+=" -static"
+OPTS+=" -largefile"
+OPTS+=" -no-sql-db2"
+OPTS+=" -no-sql-ibase"
+OPTS+=" -no-sql-mysql"
+OPTS+=" -no-sql-oci"
+OPTS+=" -no-sql-odbc"
+OPTS+=" -no-sql-psql"
+OPTS+=" -no-sql-sqlite"
+OPTS+=" -no-sql-sqlite2"
+OPTS+=" -no-sql-tds"
+OPTS+=" -platform linux-g++"
+OPTS+=" -qt-zlib"
+OPTS+=" -no-gif"
+OPTS+=" -qt-libpng"
+OPTS+=" -qt-libjpeg"
+OPTS+=" -qt-freetype"
+OPTS+=" -qt-harfbuzz"
+OPTS+=" -qt-pcre"
+OPTS+=" -qt-xcb"
+OPTS+=" -qt-xkbcommon-x11"
+OPTS+=" -no-glib"
+OPTS+=" -no-gtkstyle"
+OPTS+=" -nomake examples"
+OPTS+=" -nomake tests"
+OPTS+=" -no-compile-examples"
+OPTS+=" -silent"
+OPTS+=" -no-nis"
+OPTS+=" -no-cups"
+OPTS+=" -no-iconv"
+OPTS+=" -no-icu"
+OPTS+=" -no-dbus"
+OPTS+=" -no-eglfs"
+OPTS+=" -no-kms"
+OPTS+=" -no-directfb"
+OPTS+=" -no-linuxfb"
+OPTS+=" -qpa xcb"
+OPTS+=" -opengl desktop"
+
+# The modules that are relevant for me. Please observe that THE ORDER MATTERS! I would add one module at the time and see how it complains when you try to build it.
+MODS="qtx11extras qtimageformats qtsvg qtmultimedia"
+
+# Just echo out the current state before starting the configuration and make
+echo "B: $B"
+echo "MODS: $MODS"
+echo "OPTS: $OPTS"
+echo "Q: $Q"
+echo "O: $O"
+echo "XZ: $XZ"
+echo "SRC: $SRC"
+echo "J: $J"
+echo "LOG: $LOG"
+
+# Create dirs
+mkdir -p "$Q"
+mkdir -p "$Q/xz"
+mkdir -p "$SRC"
+mkdir -p "$O"
+
+# Start log
+date > $LOG
+
+# Download source archive
+[ ! -f $XZ ] && wget "$WSRC" -c -O "$XZ"
+
+# Unpack source archive
+[ ! -x $SRC/configure ] && tar pxf "$XZ" --strip=1 -C "$SRC" "qt-everywhere-opensource-src-$VER"
+
+# Set some variables
+export QMAKESPEC=linux-g++
+export QTDIR=$O/qtbase
+export PATH=$O/qtbase/bin:$PATH
+
+# Configure qt build
+cd "$O"
+MAKEFLAGS=-j$J "$SRC/configure" $OPTS
+
+# Build qtbase with new config (results in the basic qt libs plus a new qmake that you can use for building the rest of the modules and your own projects).
+# TIP: Don't put make all here
+make -j$J >> $LOG
+
+#build your modules with the new qmake, keeping the resulting static libs in each module's shadow build folder where they will be located by qmke during compilation of your projects
+for M in $MODS
+do
+ echo "----------------------------------------- MODULE: $M"
+ echo "----------------------------------------- MODULE: $M" >> $LOG
+ # Make module dir
+ D=$O/$M
+ mkdir -p $D
+ cd $D
+ # Use new qmake to create module makefile
+ $O/qtbase/bin/qmake $SRC/$M/
+ # Build module
+ make -j$J >> $LOG
+done
+
+# Copy qtsvg stuff into qtbase folder. This is specifically for building Bandage.
+cp -r -n $O/qtsvg/* $O/qtbase/
+
+echo "DONE"
diff --git a/build_scripts/qt_static_build_ubuntu.sh b/build_scripts/qt_static_build_ubuntu.sh
new file mode 100755
index 0000000..4cc0b97
--- /dev/null
+++ b/build_scripts/qt_static_build_ubuntu.sh
@@ -0,0 +1,129 @@
+#!/bin/bash
+
+# This script builds a static version of Qt. It was originally writen by Lennart Rolland and taken
+# from here: https://stackoverflow.com/questions/24275551/
+# I modified it to work with Qt 5.6 and move around some QtSvg stuff for Bandage.
+
+# Change this to the desired version.
+VER="5.6.0"
+
+# Dependencies:
+sudo apt-get install build-essential perl python git "^libxcb.*" libx11-xcb-dev libglu1-mesa-dev libxrender-dev libasound2-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libfontconfig1-dev
+
+VER2="${VER%.*}"
+WSRC="http://download.qt.io/official_releases/qt/$VER2/$VER/single/qt-everywhere-opensource-src-$VER.tar.xz"
+B=$(pwd) # Current dir (allows this script to be called from another dir)
+Q="$B/qt" # Base folder for the whole operation
+SRC="$Q/src/$VER" # The uncompressed source
+O="$Q/build/$VER" # The actual shadow dir
+XZ="$Q/xz/qt-$VER.tar.xz" # The tar.xz archive
+J=$(grep -c ^processor /proc/cpuinfo) # Parallel make, number of cores
+LOG="$O/log.txt" # Build log file
+
+# My configuration options for qt change to your hearts content, but make sure to clean out your current build before using it.
+OPTS=""
+OPTS+=" -release"
+OPTS+=" -optimized-tools"
+OPTS+=" -opensource"
+OPTS+=" -confirm-license"
+OPTS+=" -c++std c++11"
+OPTS+=" -static"
+OPTS+=" -largefile"
+OPTS+=" -no-sql-db2"
+OPTS+=" -no-sql-ibase"
+OPTS+=" -no-sql-mysql"
+OPTS+=" -no-sql-oci"
+OPTS+=" -no-sql-odbc"
+OPTS+=" -no-sql-psql"
+OPTS+=" -no-sql-sqlite"
+OPTS+=" -no-sql-sqlite2"
+OPTS+=" -no-sql-tds"
+OPTS+=" -platform linux-g++"
+OPTS+=" -qt-zlib"
+OPTS+=" -no-gif"
+OPTS+=" -qt-libpng"
+OPTS+=" -qt-libjpeg"
+OPTS+=" -qt-freetype"
+OPTS+=" -qt-harfbuzz"
+OPTS+=" -qt-pcre"
+OPTS+=" -qt-xcb"
+OPTS+=" -qt-xkbcommon-x11"
+OPTS+=" -no-glib"
+OPTS+=" -no-gtkstyle"
+OPTS+=" -nomake examples"
+OPTS+=" -nomake tests"
+OPTS+=" -no-compile-examples"
+OPTS+=" -silent"
+OPTS+=" -no-nis"
+OPTS+=" -no-cups"
+OPTS+=" -no-iconv"
+OPTS+=" -no-icu"
+OPTS+=" -no-dbus"
+OPTS+=" -no-eglfs"
+OPTS+=" -no-kms"
+OPTS+=" -no-directfb"
+OPTS+=" -no-linuxfb"
+OPTS+=" -qpa xcb"
+OPTS+=" -opengl desktop"
+
+# The modules that are relevant for me. Please observe that THE ORDER MATTERS! I would add one module at the time and see how it complains when you try to build it.
+MODS="qtx11extras qtimageformats qtsvg qtmultimedia"
+
+# Just echo out the current state before starting the configuration and make
+echo "B: $B"
+echo "MODS: $MODS"
+echo "OPTS: $OPTS"
+echo "Q: $Q"
+echo "O: $O"
+echo "XZ: $XZ"
+echo "SRC: $SRC"
+echo "J: $J"
+echo "LOG: $LOG"
+
+# Create dirs
+mkdir -p "$Q"
+mkdir -p "$Q/xz"
+mkdir -p "$SRC"
+mkdir -p "$O"
+
+# Start log
+date > $LOG
+
+# Download source archive
+[ ! -f $XZ ] && wget "$WSRC" -c -O "$XZ"
+
+# Unpack source archive
+[ ! -x $SRC/configure ] && tar pxf "$XZ" --strip=1 -C "$SRC" "qt-everywhere-opensource-src-$VER"
+
+# Set some variables
+export QMAKESPEC=linux-g++
+export QTDIR=$O/qtbase
+export PATH=$O/qtbase/bin:$PATH
+
+# Configure qt build
+cd "$O"
+MAKEFLAGS=-j$J "$SRC/configure" $OPTS
+
+# Build qtbase with new config (results in the basic qt libs plus a new qmake that you can use for building the rest of the modules and your own projects).
+# TIP: Don't put make all here
+make -j$J >> $LOG
+
+#build your modules with the new qmake, keeping the resulting static libs in each module's shadow build folder where they will be located by qmke during compilation of your projects
+for M in $MODS
+do
+ echo "----------------------------------------- MODULE: $M"
+ echo "----------------------------------------- MODULE: $M" >> $LOG
+ # Make module dir
+ D=$O/$M
+ mkdir -p $D
+ cd $D
+ # Use new qmake to create module makefile
+ $O/qtbase/bin/qmake $SRC/$M/
+ # Build module
+ make -j$J >> $LOG
+done
+
+# Copy qtsvg stuff into qtbase folder. This is specifically for building Bandage.
+cp -r -n $O/qtsvg/* $O/qtbase/
+
+echo "DONE"
diff --git a/build_scripts/sample_LastGraph b/build_scripts/sample_LastGraph
new file mode 100644
index 0000000..4d0d18a
--- /dev/null
+++ b/build_scripts/sample_LastGraph
@@ -0,0 +1,266 @@
+61 400000 61 1
+NODE 1 52098 3811014 3811014 0 0
+GAAAATAAAATAGAGAGAGTTTTCAATCCGCATGACTTTAAAAAAGACAATTTTTAGAAATAAGCCGGATAAAAAAATAGCTTTATCCGGCACTCATATTACAACCAGTTCTTCCGCTTAAAGTACAGATACGGTGCCAGGCCCGCGAGGATCATAAAGATAATCGCGGCAGGGTAGCCGAACCTCCACTTCAGTTCTGGCATAAACTCAAAGTTCATGCCATAGCTGGAAGCAACGAGCGTCGGCGGCAGGAATACCACGGATACCACCGAGAAGATTTTGATGATGCGGTTCTGCTCGATGTTGATAAAACCCATTGCCGCCTGCATCAGGAAGTTCACCTTCTGGAACAGGGATTCGTTATGCGGCAGCAGGGATTCGATATCTCGCAGGATTTCACGCGCCTGCTCCAGTTGCCCACCCGGTAAACGCGCTTTACGCACCAGGAAGTTGAGCGCGCGCTGGGTATCCATCAGACACAGGCGAACTTTC [...]
+CCCTCCATGGTCTGGCGATTAAGGGGGCTCAATGCCACGGTACCCTACCAACTTTCTACCATGGTCAGTCGATTCAAGTGGTTAAATTTCGTTATTGAATAAGCTTAAAATGGTTTCTTATTCCAACCAGAAAGTTAGATGGTTAAGTTATTATGGAGATAAGACCTGATCTTACTTGTTTTTTGGTTGTTTTAACAAACCATTCACCTTAATAATATCTACGCATCGCATAACAGTTGCATTCTCAAATCTAATTAACGTATAGTTTATACAACCATCATCTAGATATTAGATCCAATTATTTCAAGGACTTAAAAGAAAAAACGACAAATTCATCTATATAATGGTTATTTATTATAACCGTAAAAATGATGTTTGTATCTGCCATACAAAAACCACACCCCCTTGGTTGGTTCTTGTACCCAAAACATAATACCTGCTCTGATTAACTTCACAGCAAAAGCCTGGTAGGGAGAATAATTCTGGAGTAAA [...]
+NODE 2 2531 185323 185323 0 0
+TGCAGAGGCCGTAGCGGCCTGAACTTCCCCGCGCCGATCTTGGCGCTGCTGCGCCATAGGTAATCACCGGTCAGGTTGATGTGCTCCCAGCCGAGTGGCGACAGGTACTGCAATAGCGAGTCATCGACGGCATGACCATTGCCGCGCAACGCATGCGCCGCACGCTCCAGGTAGACCGTGTTCCACAGCACGATGGCCGCCGTCACCAGGTTGAGGCCGCTGGCCCGGTAGCGCTGCTGCTCGAAACTGCGGTCACGGATTTCACCAAGGCGGTTGAAGAACACGGCACGGGCCAGCGCATTGCGCGCCTCGCCCTTGTTCAGCCCGGCATGCACGCGGCGGCGTAGCTCGACGCTTTGCAGCCAGTCGAGGATGAACAGCGTGCGCTCGATGCGGCCCAACTCGCGCAGCGCGACGGCCAAGCCGTTCTGGCGCGGGTAGCTGCCGAGTTTCCTGAGCATCAGCGAGGCCGTCACCGTGCCCTGCTTGATC [...]
+GAGCGGGCGAGTGCCGAGGCGATCACCCGTGCTAACCGGCGCATCTACGACGCCTTGGCCGAACCACTGGCGGACGCGCATCGCCGCCGCCTCGACGATCTGCTCAAGCGCCGGGACAACGGCAAGACGACCTGGTTGGCTTGGTTGCGCCAGTCTCCGGCCAAGCCAAATTCGCGGCATATGCTGGAACACATCGAACGCCTCAAGGCATGGCAGGCACTCGATCTGCCTACCGGCATCGAGCGGCTGGTTCACCAGAACCGCCTGCTCAAGATTGCCCGCGAGGGCGGCCAGATGACACCCGCCGACCTGGCCAAATTCGAGCCGCAACGGCGCTACGCCACTCTCGTGGCGCTGGCCACCGAGGGCATGGCCACCGTCACCGACGAAATCATCGACCTGCACGACCGCATCCTGGGTAAGCTGTTTAACGCTGCCAAGAATAAGCATCAGCAGCAGTTCCAGGCGTCAGGCAAGGCCATCAACGCCAAG [...]
+NODE 3 35534 2594035 2594035 0 0
+CACTGAACTGGCATTTAGATATGTCATCTGAAGAGGATCTTGTTCGTGTAACAAATGCTTCTATTGTATCTTCTGATTGTTTAGATAGTTTATCACCTGGTTGTTTGTGAAGAATCATTAGTAATGTTTCAGTAGCTTTCTTTCTCATCTCCACTGGATCAGTTAAACCACCAGCATCTATGCACATGTTTGAAGTAACTGCGTCGTACCCTAAATAAGGTATTGGGTCCCTTTTTATATTCTGCTTATCGCTGGCATGAACAGAAAATACCAATGAAATTATTCCTGCCAATACAATGTTTTTAATTTTCATATGTTTCTCCATTACTATCATCAAGTTCAAAACATAATTTTTATATCACAAATCTTTCTAAGCAATAAACAGCTAATTCCTGTTGTGAAGCATCATTTTTCATCCCGGCGTACAAATGACACCGGGAACAAAATCCGTCAGGAATTTTCAAGGCATAGATAAATTGTTATCACACCAAT [...]
+AAATTTAATTCCGCCGCCAGCCATGTTCGGCAAGCTTAAAATAAATTCATTCTATTTTCCGGGTGCCATTTTTAGTTATTAGAGTAATTTCCAAAATATTTCGAGTCGGGTTGTTTGGGGCAAAGTCCGTATTGATATAATAAGCTCACATACCTGGAAGGAGTTTTTTATGAATAAGCCTCTGGTTAGCTTCGCGGAGTTATCCGGCAATGCTATTAATGTTGCGCGTCAGTCTGTTATCGATATGGAAATGGACGCAACCCGGGAAAAGATTGGAAAGGCTCGTTCGTTATTCCACTCAGGTATTCATCGTGCCGTGAATGGCTATCCGCTGATTCAGTCTGCGGCTAACCAGCTGGCTGTCATTAAGCGACTCCTTGGCGACACGAAGTACCTCGATGCCTGTATTACCGAGAATCTTTGTATGTTCTCGCCAGAGGGTTATCTGTACCTGTTTATGCAACGCCGCTTCATTAATGAACCCGTGGCCTG [...]
+NODE 4 1883 134056 134056 0 0
+GGGGCAAATGGTGGTCACCATCCTGTCGGCTGTGGCACAGGCTGAACGCCGGAGGATCCTAGAACGCACGAATGAGGGCCGACAGGAAGCAAAGCTGAAAGGAATCAAATTTGGCCGCAGGCGTACCGTGGACAGGAACGTCGTGCTGACGCTTCATCAGAAGGGCACTGGTGCAACGGAAATTGCTCATCAGCTCAGTATTGCCCGCTCCACGGTTTATAAAATTCTTGAAGACGAAAGGGCCTCGTGATACGCCTATTTTTATAGGTTAATGTCATGATAATAATGGTTTCTTAGACGTCAGGTGGCACTTTTCGGGGAAATGTGCGCGGAACCCCTATTTGTTTATTTTTCTAAATACATTCAAATATGTATCCGCTCATGAGACAATAACCCTGGTAAATGCTTCAATAATATTGAAAAAGGAAGAGTATGAGTATTCAACATTTTCGTGTCGCCCTTATTCCCTTTTTTGCGGCATTTTGCCTTCCT [...]
+CAAGCGACTTCTCCTATCCCCTGGGAACACATCAATCTCACCGGAGAATATCGCTGGCCAAAGCCTTAGCGTAGGATTCCGCCCCTTCCCGCAAACGACCCCAAACAGGAAACGCAGCTGAAACGGGAAGCTCAACACCCACTGACGCATGGGTTGTTCAGGCAGTACTTCATCAACCAGCAAGGCGGCACTTTCGGCCATCCGCCGCGCCCCACAGCTCGGGCAGAAACCGCGACGCTTACAGCTGAAAGCGACCAGGTGCTCGGCGTGGCAAGACTCGCAGCGAACCCGTAGAAAGCCATGCTCCAGCCGCCCGCATTGGAGAAATTCTTCAAATTCCCGTTGCACATAGCCCGGCAATTCCTTTCCCTGCTCTGCCATAAGGGGTCTGACGCTCAGTGGAACGAAAACTCACGTTAAGGGATTTTGGTCATGAGATTATCAAAAAGGATCTTCACCTAGATCCTTTTAAATTAAAAATGAAGTTTTAAA [...]
+NODE 5 5976 449249 449249 0 0
+ATCGTGCCACCGGCTCCAGGTCTTATCGAACAGCTCAGACACATGGTCCAAATGCTGGTCGATCCGTTCGGCCAGTTTTTCGATGGCCTCTTGCTTGAGCTTGTCACTTTCCCTGAACTCGATGTTCAAGGCCCTGGCCACCTGGTTGAGGTTCCGGCCGATAGCTCCAAGCTGCCGGCACGATTCCCGTACGGTGTTCACTTCTTCATCAGTGAGGACCGGCATCCGGTTCAACGACCGCAGTCATTTCTGTACCTAAACAGTCCTGCGAATATGTGAGTTTTGACCTAATGAGCCACAAAAACTCATTTTCGCCCACGATAATTTTTCTACTTCCTTTCTTTGGAATGCTCATTTCAATATTCACATAACGTCGCTATCAATCGCGGAAAAGGCGTAGTGCGCGAAGCGAACGAAGCTTTTTGCCGTCGATTGCATAGCTTTGTTAACCCTTTTTCCAAATTTGATAGCAATAGTTAATGTTTGAAGTAA [...]
+GGCAGCGGTCGCAATGGCCTAAACTTCCCCGCACCGACCTTGGCGCTGCTGCGCCATAGGTAATCGCCGGTCAGGTTGATGTGCTCCCACCCCAGCGGCGACAGATATTGCAACAATGTGTCGTCCAGCGCCGTGCCGTTGCCACGCAAAGCACTGGTGGCACGCTCCAGATATACCGTGTTCCACAACACGATGGCCGCCGTCACCAGATTGAGGCCGCTGGCCCGGTAGCGCTGCTGCTCAAAACTGCGGTCGCGGATTTCACCCAATCGGTAGAAGAAGACCGCCCTGGCCAGCGCGTTGCGCGCCTCGCCCTTATTCAGCCCCGCATGGACGCGGCGGCGCAGCTCCACGCTTTGCAGCCAATCCAAAATGAACAGCGTGCGCTCGATGCGCCCCAGCTCGCGCAACGCCACGGCCAAGCCGTTCTGGCGCGGGTAGCTGCCGAGTTTGCGCAGCATCAGCGAAGCCGTTACCGTGCCTTGCTTGATG [...]
+NODE 6 9698 703603 703603 0 0
+TTACGTCGGTGCTAAATCACGCCAGCTCTGGTTGTTTTACGCGTATGACAGGATACGGAGGACGGTTGTGGCGCACGTATTCGGTGAACGCACGTTGGCCACGCTGGAGCGTCTTCCGGGCCTGCTGTCGGCCTTTGAGGTCGTGGTATGGATGACGGATGACTGGCCGCTTTATGAATCACGCCTGAAGGGAAAGCTGCACGTTATCAGCAAGCGTTACACTCAGCGCATTGAGCGGCATAACCTGAATCTGAGACAGCATCTGGCAAGGCTGGGCAGGAAGTCACTGTCGTTCTCAAAATCGGTGGAGCTGCATGACAAAGTCATCGGGCATTATCTGACCATAAAACACTATCAGTAAGTTGGAGTCATTACCCAGTAATGCGACAAATGCAATGAAAGAAGTAGCGAAAGTCCTTTTTTCAGCCCGAAGTGACCCGGAGCTCATGAAATTTATAATGGATTATATTAATAACCACAAACTGCATTGAA [...]
+CATGGCATCTGACATCAAGTTAGGGTATGCCTCAATCTGACGGCTGCGAACCGCCAGGGACAGGCGCAATGTCAGATTCTGTCGCGGCCTTGGCGCGTGCCTGGAAGCGTTCATAGCAATCCAGCCCGCAGAAATGTTCGACGTATTCCGCGCCTTCCGGGGTGAAGGCGGCATCGAGCGGAATTTCTTTGCAGCATACGCAGCAGGTGGTGCAACTGGCAGTGTTCGGGGCGTTTGCGTTCATGGTGGTACTCCTCCAGATTGGTAGCGAAGCTCAAAGCTGCCCACTCTCGGCTGGCTGGGAAGCGGTCATGATCTTCCCTTGAAGGCCCGCAGCAGCCGCGTCACAGACAGGACAAACAAGCCGGTCAGCGTGAGGGCTGCAATACCCCAGTGCTCCCCGATGAACGCGCCGGCCGTCGTGCCGGCTAGCACAATGGCGAGAATCGGCAAATAGCAGGGACAGGTGAGCACGGCCAGCGCGCCCCACAA [...]
+NODE 7 50227 3694305 3694305 0 0
+TCCTTTAATCGCCAGGCTATGGGGAAGCTGGTCTCGTAGCGTGGCATTTAACCCCCTTAATCGCCAGACTATGGGGAAGCAGGTCGCGTAGTGTGGCATTTAACCCCCTTAATCGCCAGGCCATGGAGAAGCAGGTCGCGTAGCGTGGCATTTAACCTCCTTAATCGCCAGGCCATGGAGGAATGCTGGTCTCGTACCATGGCATTTAACCCCCTTAATCGCCAGGCTATGGGGTAATGCTGGTCGGGTACCGTGGGATTTACCCCCCTTATTGCCACATCTATGGAGTGATCCTGCTATGTCGGAAGATTGGTATTGTTGATACTTAAGAGGCTTTTGGAAGACTTCAATGAACTGCCAATTGAAATTCAATAATGCAGATATTCCAAAATCTAAGAAAAGAATACAGAACGTTAGCGTAATAATAGAATTAAGGTTACTATTAAACGCATAACGCTAAAGTATACGCATTATGCGTAAAGTTTACGTATA [...]
+ATTTCGTCCAAGCTCGCCGCGTTTAAATAAAAGGAAATGAAGGGAACAGGTAAAAATATTAGATGTTTAATTCTCATACGAGTTACCACCATGGAGCGGAAACAGGATTTTGAATGACGTGATGACTTTACTAATTAAGCTTATTTAGAGGTATTAATAGAATATTAAAAAATTTTAATTTTACTGCTGACGTTTTCATAAATCTCCTTTCCTGAAAAGTCGGCGATAAATTGGTTACCAATATCTTCATATTACTGACGGACCAGTGTCCATACGCTTGCGGGTACTTTATCGTAGAGTTTCTTCATTGTCAGTTCAGCTTTTCGATGGTCATATGCCCCGGAAATTTCCAGTGATGCTATACCTGCATTTTTTTCACAGAGTCGTTCGAATACTTTTTCCAGTGTGTCGAAAGAAGAGCACTTACGAAATTTCATTAAATACGCCTGCTTAGTTTCGGACATGGTCAACCTTAATTTATTTCCCGCGAAA [...]
+NODE 8 15844 1169426 1169426 0 0
+TATTGGCAGTACCGTCAGTTCGGATATCTCCCGCGACAACCCAGAAAAAACCGGCAGACTCATCGCTCACGCGTTACTGACGGGGGCCTCGATTGAGGATGCCTGTCGCTTTGCCTCAGAGGCTCAGCAGTTCGATACCGCTCTATCGGGACTGGCTTACCAGGTAGCCGTGGCCATGAAATTTGTTGCCGGTGATTCTGCGGCCGTAAGGAATGAAGGCCATCCGGTCATTACACTTTCCGACTCCTTCCGTCTTATGAGAAAAGCAAATATTAACACCCTGACGGCCACACAGAACAACCGGAAATGATGAGCACAAATCGATATGGATGCCGATATTAAGAACGATGATTATGTTGACTGTCTCATTGAGCAGGTAACCGTATAGCGGACTGGAACACGAATGCTGATGCTCTACACCAGGCCTGCGGCGCCTTCGTAGATGCACCGCATTCAAAACAAACGACAGGTGATAATTTATGAAGTTGACAA [...]
+TGTTCTGCTTCAGTTTCAAAATGCTATGAAAGAAAAAACATTAGATTCAGTGAGTTTGCTAATAAGCAAAATAAGGAGGCTTGATTGGCAAAGGTTAAAAGAGTTTTTTGGTCCTTTGGCATTTAACCACCCAGATTGCATTGATGCCATCATGACTGATGGAATTAGCACTGATGCCTCATTTACTATTTTAAATGCATTAATTTCTCGCACGGAAATGATGTCCTCTGGAGAGTATGCAATTGAGCATGATCGTTCTAAAAATCTGCTAACTTACAATGAACGCCTTAACTTTTTGATCAATTGTGATAAGGAAGGAGAGTTTAAACATTCCGAGATAGCAACTATCTCATTCCCTCTAAACCTTAAAAAAGTCTATCAAATTGATTCGAAAGAAAGCCCAAGCGTGCAATTGTGTGATGTTCTTATAGGTGCATGTATTGAATCAGTTTATCAATTAATGGACTCTAAGGTGCTCAATCAAAATTCCGT [...]
+NODE 9 1269 189170 189170 0 0
+TCATATGATCAAATGGTTTCGCCAAAAATCAATAATCAGACAACAAAATGTGCGAACTCGATATTTTACACGACTCTCTTTACCAATTCTGCCCCGAATTACACTTAAAACGACTCAACAGCTTAACGTTGGCTTGCCACGCCTTACTTGACTGTAAAACTCTCACTCTTACCGAACTTGGCCGTAACCTGCCAACCAAAGCGAGAACAAAACATAACATCAAACGAATCGACCGATTGTTAGGTAATCGTCACCTCCACAAAGAGCGACTCGCTGTATACCGTTGGCATGCTAGCTTTATCTGTTCGGGCAATACGATGCCCATTGTACTTGTTGACTGGTCTGATATCCGTGAGCAAAAACGGCTTATGGTATTGCGAGCTTCAGTCGCACTACACGGTCGTTCTGTTACTCTTTATGAGAAAGCGTTCCCGCTTTCAGAGCAATGTTCAAAGAAAGCTCATGACCAATTTCTAGCCGACCTTGCGAGCA [...]
+GCAGGGTTGCAGCCACGAGTGAGTCTTCCCTTGTTATTGTGTAGCCAGAATGCCGCAAAACTTCCATGCCTAAGCGAACTGTTGAGAGTACGTTTCGATTTCTGACTGTGTTAGCCTGGAAGTGCTTGTCCCAACCTTGTTTCTGAGCATGAACGCCCGCAAGCCAACATGTTAGTTGAAGCATCAGGGCGATTAGCAGCATGATATCAAAACGCTCTGAGCTGCTCGTTCGGCTATGGCGTAGGCCTAGTCCGTAGGCAGGACTTTTCAAGTCTCGGAAGGTTTCTTCAATCTGCATTCGCTTCGAATAGATATTAACAAGTTGTTTGGGTGTTCGAATTTCAACAGGTAAGTTAGTTGCTAGAATCCATGGCTCCTTTGCCGACGCTGAGTAGATTTTAGGTGACGGGTGGTGACAATGAGTCCGTGTCGAGCGCTGATTTTTTCGGCCTTTAGAGCGAGATTTATACAATAGAATTTGGCATGAGATTG [...]
+NODE 10 9288 687372 687372 0 0
+AGTTCAGTGTTTATGAAAGATACTGGGAAATAGTTCAGCCAAATAAATAACATAGATTTGCGTGAGATTTATAATACAAAACGCTCATTAGGTCTATGTCTTTAAAGGCGCGTGGCTTAATGGGCAATTAAATCCATACTCCTGCAATACATGCTTCAATCCTCAACTCGTTTGATAATGGCTGTATTTAATTTGCTGGATTCCACCATTTAAAATGGACAGGCTCTGTTTTAAATGAATCACCTGTTTCCGCATGCCAGGTTATTTGGGTGAACAGCCAATATGGTATGATGTTTATAACAAACAAATTCGGAAGGTATAGTTTATGGGGGACCTGGTCAGTAAAAATAATATCGATCGCCTTGAACGATTTCATTCTCTGCTGGCAGGGCAGTATTGGTCTGCGCTCGTCGATATTCCGGCTGAGGCGATTGTGGCCGGGGACACTCTCCTCATTAACTCGTTGCGGTACGTGGATAACAATCTGCATAC [...]
+ATTTTTTTTACTACTCTCAAATTATTTTAATTCGAGGGAGAGCATAATCCATTGTTTTGACGGTTCCATTTTCTTTAATTATATAGTGATGCCAACTATCTGATTTTGCGATTGCATCATCATATATACTTTGTGTAATTGCTAAAAAATCTATGTTCATCCATGAAAATATCCCTTCATCAACAAATTCTTTTGATATTAATTCATAGTGACTATTTTTTTTCACTCCAACATATAACTTATATTTTTTCTCTATATTTTCAGCCAAACTATCAAATGAAATTATTGAGAAGTCACTTCGCTGTTGCCCTCTGATTAGTGCAGTTTTCTGTGTATTATTTTCATATTCTGATCTACGACCATGAACAAGGACATACTTGAAATTAAATGGATTTCTCCCCATATGTGCCGGTTCTATAAATCCCTGCAATATATTGTTTTTAAAGTGATTTCTGTTTGATTCATCATCAAACCAAGCCCTCCATGTGTTCA [...]
+NODE 11 1380 97401 97401 0 0
+TCAATACGTTGTAGCTTTTTCCTGAGCTCACGGATTTCAATTTGTTCCGGGGTAATGGGGGAGGCTTTTGGTGTTTTTCCCTGCCGCTCATCACGTAATTAATAGGCTGTATGTCTAACTTCTGGCCACAGATATAATCGAGCCAGCAGTGCTCGCCGCAGCCGAGCGACAGGGCGAAGCCCCGAGTGAGCGAGGAAGCACCATGGAACAGTACTCATAAATTCTGCATACGCTCAATGCCTGCAAAATCACCTCCCCTAGGGGTTATCCACTTATCCACGGGGATATTTTTATAAGATCTTTTTAAATAGTTGTTAGATCTTTATTTTTAGAATGCCCACAGGCCTTTATCCATGCGGGTTCCAGAGAGGGATCTGTGACAAAACGCCCTTTCAGTGTGACAAATCACCCTCAAATAGCCGCCCTTTCTGTGACAAGTTGCCCTTAACCCTGTGACAAATTGCCCTCAGGAAGCGTTGCTTTTCACAAAGT [...]
+TATTCAATCGTCATGGAGGTTATATCACGGAAGGAAAATACGATATGCGTCGTCTGGCGGCCTTTCTTTTTCTCGATGTAAGAAAGGCGCATTGGTGTCCGGCTGTTGATCTCGTCAACACTTGCCTTCAGGAAACGGCGGCGAAAGTCCGGCATACGCTGGTAACTTTGAGGTAGCTGGTAGCGTTCCATGATCCAGTCGATTTTCAGGGACACGACACCTGAGCCATCAGGTTTACGGTACTGGCACAGAGATTCGTATAAACGCATGGCGTACGGATTGGTAATCTCTTTTGTTTCACTGAGCCGGAACTGCGTAAACCGGTTCTGTAACCCGATGAAGAAGGGAATCAGATATGGGTTGATATGTACGCTGTAAAGCCCTCTTGATGGGCTGTGCGCACGTTTAATAAACCAGGGAAAGGATTCATACCCTTTTTCATCGCCGGCATCCTCTTCAGGGCGATAGAAAACCACTTCCTTACCCGCAAAA [...]
+NODE 12 52 3736 3736 0 0
+AATCACCCTCAACCTTCCAGATCAAATGTGACGAACCACCCTTAAATCTGTG
+ATTTAAGGGTGGTTCGTCACATTTGATCTGGAAGGTTGAGGGTGATTTGTCA
+NODE 13 3 414 414 0 0
+ACA
+CAG
+NODE 14 9 630 630 0 0
+GATAACCCT
+GATTTGTCA
+NODE 15 760 220234 212478 0 0
+CAAAAACTCTGCTTACCAGGCGCATTTCGCCCAGGGGATCACCATAATAAAATGCTGAGGCCTGGCCTTTGCGTAGTGCACGCATCACCTCAATACCTTTGATGGTGGCGTAAGCCGTCTTCATGGATTTAAATCCCAGCGTGGCGCCGATTATCCGTTTCAGTTTGCCATGATCGCATTCAATCACGTTGTTCCGGTACTTAATCTGTCGGTGTTCAACGTCAGACGGGCACCGGCCTTCGCGTTTGAGCAGAGCAAGCGCGCGACCATAGGCGGGCGCTTTATCCGTGTTGATGAATCGCGGGATCTGCCACTTCTTCACGTTGTTGAGGATTTTACCCAGAAACCGGTATGCAGCTTTGCTGTTACGACGGGAGGAGAGATAAAAATCGACAGTGCGGCCCCGGCTGTCAACGGCCCGGTACAGATACGCCCAGCGGCCATTGACCTTCACGTAGGTTTCATCCATGTGCCACGGGCAAAGATCGGAAG [...]
+CACATGAACCCATTCAAAGGCCGGCATTTTCAGCGTGACATCATTCTGTGGGCCGTACGCTGGTACTGCAAATACGGCATCAGTTACCGTGAGCTGCAGGAGATGCTGGCTGAACGCGGAGTGAATGTCGATCACTCCACGATTTACCGCTGGGTTCAGCGTTATGCGCCTGAAATGGAAAAACGGCTGCGCTGGTACTGGCGTAACCCTTCCGATCTTTGCCCGTGGCACATGGATGAAACCTACGTGAAGGTCAATGGCCGCTGGGCGTATCTGTACCGGGCCGTTGACAGCCGGGGCCGCACTGTCGATTTTTATCTCTCCTCCCGTCGTAACAGCAAAGCTGCATACCGGTTTCTGGGTAAAATCCTCAACAACGTGAAGAAGTGGCAGATCCCGCGATTCATCAACACGGATAAAGCGCCCGCCTATGGTCGCGCGCTTGCTCTGCTCAAACGCGAAGGCCGGTGCCCGTCTGACGTTGAACACCGA [...]
+NODE 16 5407 403478 403478 0 0
+TCCATGCCCAGCCCGTGCGCGAGCTGGATCACCGCCCGCACGATAGTTTGGTCACGGGCATCATCCGGGAGCCTGGCGACAAAGGATTGGTCGATTTTCAATGTGGTGATGGGGCAGCATTTCAGATGTTGCAGGCAGGAATAGCCGGTGCCGAAGTCGTCGGCGGCGAAGCGCACGCCGATGGCGCGCAAGGCGTCGAAACTGGCGAACAGGGCTGGATTGCCGAATGCGACCGATTCGGTCAGTTCGATCTCCAGAAGCTCGGCGGGCAGGGCCATATCGGCCAGCACCCGCTTTACCTCGTCGTCGAACGTTGGCCCAACCTGGCTGGCGGACACATTGATGGCAAGACGGAACGGTTGCCATGCCGGTCCTTGCCACTTGTGCATCTGGCGACAGGCCTCGCCCAGCACCCACGCGCCTATTTCCGGCATCAGGCCGAACGACTCGGCCAGCGGCAGGAACTGGCCGGGCGGCAACAGGCCAAGCCTC [...]
+GGCAGTCAGCGTTCCAACGCAGGGAATACTCAGCAAGCGCTGTCCAACCTCATCTTCGTCCAACTTTCGTTTCAACTGAGATTCCAGATCTTTAATCTGCTCAACAAGATAGTGATAATGCTGTTGTAATTTCAGCAGTAACTGGCTGAGATAAAGAGGCAAACTACTGTCCTCAAGAAGGGTACTCAGTCGACTAATAACGGCAGCACCTCGCGGAACGCTGATACCAAATTCCAGCAGAAAAGCATGCATCTGATTAGTTGTTTTCACCTTATCCTGAACCAGGGATTCACGGACACGATGCAGAGCTCGCATTGCCTGCTGAGATTCGGTTCTGGGCTGCACGAAACGCATAGATGGACGTGATGCTGCTTCACAGATAGCTTCAGCATCAACGAAGTCATTTTTGTTGCTTTTAACGAATGGGCGGACAAATTGCGGTGATATCAGCTTTGGAAAATGCCCTAACTCTGCCAGCTTGCGTGCCATAAA [...]
+NODE 17 70 15448 10880 0 0
+CCCGACGTATCCCCACTGTTCGTCCATTTCCGCGCAGACGATGACGTCACTGCCCGGCTGTATGCGCGAG
+ATACGTCGGGGCTAAATCGCGCCAGCGCTGGCTGTTTTACGCGTATGACAGGCTCCGGAAGACGGTTGTT
+NODE 18 5765 421450 421450 0 0
+TGCTCAGCATGTTTGAGTGCTTTACTCGCCGCGGGTTGAGAAATATGTAAAACTTCAGCCGCACGCGTTAAGGAACCACAAGTCATTACAGCATAAAAGATATCGAGATGTCTTAATTTCATTCCATGTAGCCTACTGATTATTTATTTCTACGGACTATTCTAACGAATAAAGTATAAATAATCAGATATACTCGTCATAATTCAAATTTTGGTTTAGTTGTCACGAGAATTAATTCGTAAACGTGCAAGCTAAATAGATTGACTAGGGGAATATACGGGGTAAGAAAGCGGCTCGGCATACTGCCCTATAATAAATTGTTAGGAGAAGTACGCCGAGTAGTGTGTAGCTATTAGGTAAAGTATGTACCAATTTCAATAAATATTTTAATTAAGATACTGTTTGAAATATCAACAATAAAGGCACCGACCATAGGAACGACAAGGAAAGCTTTATGTGATGGTCCAAATGCTTTTGTGACTGTTTGCATAT [...]
+ATTATCTTGATTATATTATTGATAATAATAAAAACCTTATCCCTATCCAAGAAGTGATGCCTATCATTGGTTGGAATGAACTTGAAAAAATTAGCCTTGAATACATTACTGGTAAGGTAAACGCCATTGTCAGCAAATTGATCCAAGAGAACCAACTTAAAGCTTATGATGATGATGTGCTTAAAAACTTACTCAATGGCTGGTTTATGCATATCGCAATACATGCGAAAAACCTAAAAGAGCTTGCCGATAAAAAAGGCCAATTTATTGCTATTTACCGCGGCTTTTTATTGAGCTTGAAAGATAAATAAAATAGATAGGTTTTATTTGAAGCTAAATCTTCTTTATCGTAAAAAATGCCCTCTTGGGTTATCAAGAGGGTCATTATATTTCGCGGAATAACATCATTTGGTGACGAAATAACTAAGCACTTGTCTCCTGTTTACTCCCCTGAGCTTGAGGGGTTAACATGAAGGTCATCGATAGCAGGAT [...]
+NODE 19 1026 75036 75036 0 0
+TCGTGTCCCGTGGTATTTAACCCCCTTAATCGCCAGACCATGGGGGGAAGCTGGTCGGGTACTGTGGCATTTAACCCCTTAATCGGCAGACCATGGAGGGATTATTGCCGGGTACCAGGCCATTTAACCACTTACTCGTCTGTACACGATGGGATGCTGGTTGCGTAGCGCGGAATTGCTCCCCTATTCACCAGTTCTTTGCTAAAGGAAAGCCAGTCTAAAAGGTTTTCCGGCCAAAACTTTTTTTGTTTCACTACAGTTATTCGCCCTTCCGTTCAGCGTGATAAAATATACAAAAACGTAGAGGTAACCCATAAAAGTAAAAGAGCTTATAGACCAGCTTAAAAGGCTCGACCCGGATGCGTATGTAGTAGTTGCTGGATTTGAAAACCAGTGTACTGGACACGTGGCTGAAGCAGATACCATTAAAGAATGCATGACAATTCCTGTACGAGCGGACAGCATGTCAGGTGACCGTACGCTTGCAAAAGA [...]
+TACCCGACCAGCTTGCCTCCATGGTCTGGCGATTATGGGGGTTAAATCCCACGGTACCCGACCAGCAGGCACCGTGGTCATTGGCTAAAGGGGAAATTGCCTCGGCTTGCAGACAGGACAACGTGACGCCCTAGCGGTTAAGTGGGTTTAATACGACGGTACACAATAAGTATCCCACCAGAATCTGTCTATTGAGTGGATTAGATTAAAAGATATTCGGCCTGGATCTCGACTTAGAATGACGAAATATTTGGCAAAAAAATAGGGTATTCGGCAAATCCTGTTGTTAAGACATCCCGAATACCCAAAAAATATTTGGCAATCAATATGAATTGCCCATACCCACAATTGACAATAAGAGAGTTTTTTGGCAATTCGTATAATTAGGCCAATTCATCCGTGTCGTCTATTGCACTAACGAAGTATTCCGTGCGGTAGTCATCTCCCCCCCTCAACTAGACTGAAGGTGATCCATCTTTTGCAAGCGTACGG [...]
+NODE 20 63 13687 13687 0 0
+GAGCTGGCTGCACAACAGCCATTACGCCCAATCAACTGGTGCAGTCGTCTTCTGAAAATGACA
+CTCCTGACAGTTCAATATCAGAAGTGATCTGCACCAATCTCGACTATGCTCAATACTCGTGTG
+NODE 21 1552 113256 113256 0 0
+GACGCACTTTGCGCCGAATAAATACCTGTGACGGAAGATCACTTCGCAGAATAAATAAATCCTGGTGTCCCTGTTGATACCGGGAAGCCCTGGGCCAACTTTTGGCGAAAATGAGACGTTGATCGGCACGTAAGAGGTTCCAACTTTCACCATAATGAAATAAGATCACTACCGGGCGTATTTTTTGAGTTATCGAGATTTTCAGGAGCTAAGGAAGCTAAAATGGAGAAAAAAATCACTGGATATACCACCGTTGATATATCCCAATGGCATCGTAAAGAACATTTTGAGGCATTTCAGTCAGTTGCTCAATGTACCTATAACCAGACCGTTCAGCTGGATATTACGGCCTTTTTAAAGACCGTAAAGAAAAATAAGCACAAGTTTTATCCGGCCTTTATTCACATTCTTGCCCGCCTGATGAATGCTCATCCGGAATTCCGTATGGCAATGAAAGACGGTGAGCTGGTGATATGGGATAGTGTTCACCCT [...]
+ATTATGGCGAAGGTATCATTCAGGAAGCGTTGATGAAGGATTATCTCTGTAAAAAGTTATTCAACCGGCTTTCCGGTACCCTGGTGATCAGAGCGCGCTGCGGCAATAACATTACTGGCCTGGCATGTTGCAATATTCTTTATCCCTCGCCCCGATACAGCGGTCAGCTGCATATTAAAGAGCTGTATGTTTCTCAGTGCGATCGAAATAAGGGCACGGGTAAAGCGATAATGCGCTTTATAGCCCGGCTTGCGCTTGAACAGGAATGCCTTAGCCTTAGCTGGAACGCTGAAAAATCCAACCCCGGCGCTAACCGTTTTTATCAGGCTCTGGGAGGCAGAATAAATGATCATATCGTCAATTATTACCTCCACGGGGAGAGCCTGAGCAAACTGGCCTCAGGCATTTGAGAAGCACACGGTCACACTGCTTCCGGTAGTCAATAAACCGGTAAACCAGCAATAGACATAAGCGGCTATTTAACGACCCTGC [...]
+NODE 22 9 1343 1343 0 0
+CGACAAGTT
+ACGACCCCT
+NODE 23 306 45829 45829 0 0
+GCTTTTCTGCTGGAATTTGGCATTAGCGTTCCCCGAGGAGCTGCCGTTATTAGCCGACTGAGTACCATTCTTGAGGATAATAGTTTGCCTCTTTACCTCAGCCAGTTATTGCTGAAATTACAACAGCATTATCACTATCTTGTTGAGCAGATTAAAGATTTGGAATCCCAGTTGAAACGAAAGTTGGACGAAGATGAGGTTGGACAGCGCTTGCTGAGCATTCCCTGCGTCGGAACACTGACAGCGAGTACTATTTCAACTGAGATTGGCGACGGGAAGCAGTACGCCAGCAGCCGTGACTTTGCG
+CGCTGTCAGTGTTCCGACGCAGGGAATGCTCAGCAAGCGCTGTCCAACCTCATCTTCGTCCAACTTTCGTTTCAACTGGGATTCCAAATCTTTAATCTGCTCAACAAGATAGTGATAATGCTGTTGTAATTTCAGCAATAACTGGCTGAGGTAAAGAGGCAAACTATTATCCTCAAGAATGGTACTCAGTCGGCTAATAACGGCAGCTCCTCGGGGAACGCTAATGCCAAATTCCAGCAGAAAAGCATGCATTTGATTGGTTGTTTTTACCTTATCCTGAACCAGGGATTCACGGACACGATGCAG
+NODE 24 14 2989 2989 0 0
+GCGGCAACAGGGCT
+GTTGAAATAGTACT
+NODE 25 1300 95957 95957 0 0
+ATCGGCGTAGTAGTGGATGTGGTCGATGACAAAGCCGGTGCGGGTCAGCGTGCGCCGGAGGATCGGCAGAAAATCGACCAGGAACGAAGTAGCGCGTGTGACGACGGCCGGTACGCCGACACGCGCCACGGCCTCGGCCCAGCGCGCGGCCGGCGGTTGGAGCAGGCCGTTGTGCACCGAACCGTGGTAGGTGCCGACCGCCAATGTGAGCCAGCGCTCTAGCTCGCGCAGCGTCAGGGCGGCCTTGTTTTCGGAATCGTAGTCGCCGCGCTGGTCAGGGTTGGAGAAGGTCGTTCCCGGCAGTTCGTCGTGAATCATCTGCATCGCCGTGCCGATGATCCGTTCCACGATGCCGCCATAGTGCGGCTGTCCCAGCGGGCGATAGTCCAGCCGGATGCCATGCTGCTCGCAACCCCGGCGCAGGGCCTCGCTCTTGAACTCGGCCGCGTTGTCTAGGTAGAGCAGCAAGGGCTTGCCGCTCATCTGCCAATC [...]
+CACCCCACGGATTCCAGAACAAGGCGTGGCCACTCTGCCTGATGAGGCTTGGGAGCGTGCGCGCCGTCGTGCGGAGATCATCAGTCCGTTGGCGCAGTCGGAGACGGTCGGGCACGAAGCGGCCGATATGGCGGCTCAGGCGCTGGGCTTGTCTCGGCGCCAGGTATACGTTCTGATCCGGCGTGCCCGGCAAGGCAGCGGCCTCGTGACGGATCTGGTGCCCGGCCAGTCCGGTGGAGGTAAAGGTAAGGGGCGCTTGCCGGAACCGGTCGAGCGCGTCATCCACGAGCTACTGCAAAAGCGGTTCCTGACCAAGCAGAAGCGCAGCCTAGCGGCCTTTCACCGCGAAGTCACTCAGGTGTGCAAGGCTCAAAAACTGCGAGTGCCGGCGCGCAATACCGTGGCCTTACGGATCGCTAGCCTTGACCCGCGCAAGGTCATCCGCCGGCGGGAAGGCCAGGATGCCGCTCGTGACCTACAAGGTGTGGGCGG [...]
+NODE 26 117 9291 9291 0 0
+AGCCCGCATTGCCTGCTGAGATTCCGTTCTGGGCTGCACAAAACGCATAGACGGACGCGATGCAGCTTCACAAATAGCTTCGGCGTCGACAAAGTCGTTTTTATTGCTTTTAACGAA
+CGTCCGTCTATGCGTTTTGTGCAGCCCAGAACGGAATCTCAGCAGGCAATGCGGGCTCTGCATCGTGTCCGTGAATCCCTGGTTCAGGATAAGGTAAAAACAACCAATCAAATGCAT
+NODE 27 4443 316893 316893 0 0
+TAAATCCATGCTGGCCCTGCAACTGGCCGCACAGATTGCAGGCGGGCCGGATCTGCTGGAGGTGGGCGAACTGCCCACCGGCCCGGTGATCTACCTGCCCGCCGAAGACCCGCCCACCGCCATTCATCACCGCCTGCACGCCCTTGGGGCGCACCTCAGCGCCGAGGAACGGCAAGCCGTGGCTGACGGCCTGCTGATCCAGCCGCTGATCGGCAGCCTGCCCAACATCATGGCCCCGGAGTGGTTCGACGGCCTCAAGCGCGCCGCCGAGGGCCGCCGCCTGATGGTGCTGGACACGCTGCGCCGGTTCCACATCGAGGAAGAAAACGCCAGCGGCCCCATGGCCCAGGTCATCGGTCGCATGGAGGCCATCGCCGCCGATACCGGGTGCTCTATCGTGTTCCTGCACCATGCCAGCAAGGGCGCGGCCATGATGGGCGCAGGCGACCAGCAGCAGGCCAGCCGGGGCAGCTCGGTACTGGTCGATAACAT [...]
+TTGATATCTAGTATGACGTCTGTCGCACCTGCTTGATCGCGGCCGCGATAGCTAGATCGCGTTGCTCCTCTTCTCCATCCGCGTTCCAAGCTGCGGAAAGGCACCCATAAGCGTACGCCTGGTCGAGCAGGCGACGCGGATCGACGTCCAGCGCACGAGAGAATGCGTCCGCCATCTGTGCAATGCGTCTAGGATCGAGACAAAGGTCGTCTCTGTCAGCCGGATCGTAGAACATATTGGCGGCGCCAAAGCCCACTTCACCGACCAGACCGACGGGATCTATCACCAGCCAGCCGCGACTGGAGAACATGATGTTTTCATGATGCAGATCGCCATGTAGCCCACGCAGTTCCGAGGCATTGCTCATCATTTGATCGGCTATAATCGCCGCGTGGACGTAGTCAGTTTGACAACCTGCGTTTTGATCATCGCGCGCCCGCTGAAACAAAGCTGCAAAGCGATCCCGGATCGGGAGAAGGGCAGAAGGCAGGG [...]
+NODE 28 7 2806 2806 0 0
+TCTGCGC
+TTTTTAA
+NODE 29 21 6456 6456 0 0
+GGAAATGGACGAACAGTGGGG
+GTTACCGACTGCGGCCTGAGT
+NODE 30 334 51057 51057 0 0
+CGGGCGGACAAATTGTGGTGATATCAGCTTTGGGGAATGCCCCAACTCTTCCAACTTGCGTGCCATAAAGTGAGAACCGCCACAGGCTTCCATTGCGATGGTTGTAGCGGGGCATGTCGCCAAAAATTCGATCAACTTTGGCCGGGTAAATTTTTTACGGTAAACAGCCTTCCCGCGACGATCCTGGCAATGAATATGGAAAGAGTTTTTACCCAGATCGATACCAATGAGCGCAATGTTTTCCATGATAGTTCTCCGAATGAAAGCCTGTCCTCAGCATAGTACCGGGAAGGAGGGAGTGACCATCTCATTAAATAAAGCACGCTAAGCCGGT
+AGGACAGGCTTTCATTCGGAGAACTATCATGGAAAACATTGCGCTCATTGGTATCGATCTGGGTAAAAACTCTTTCCATATTCATTGCCAGGATCGTCGCGGGAAGGCTGTTTACCGTAAAAAATTTACCCGGCCAAAGTTGATCGAATTTTTGGCGACATGCCCCGCTACAACCATCGCAATGGAAGCCTGTGGCGGTTCTCACTTTATGGCACGCAAGTTGGAAGAGTTGGGGCATTCCCCAAAGCTGATATCACCACAATTTGTCCGCCCGTTCGTTAAAAGCAATAAAAACGACTTTGTCGACGCCGAAGCTATTTGTGAAGCTGCATCG
+NODE 31 127 10075 10075 0 0
+GTGACGTAAAATCGTGTTGAGGCCAACGCCCATAATGCGGGCAGTTGCCCGGCATCCAACGCCATTAATGGCCATATCAATGATTTTCTGGTGCGTACCGGGTTGAGAAGCGGTGTAAGTGAACTGC
+TAATGGCGTTGGATGCCGGGCAACTGCCCGCATTATGGGCGTTGGCCTCAACACGATTTTACGTCACTTAAAAAACTCAGGCCGCAGTCGGTAACCTCGCGCATACAGCCGGGCAGTGACGTCATCG
+NODE 32 354 52515 52515 0 0
+TGTACCTCGGCAGTACAGCACGGGAGGTAGGACGACATTGCTGGGAATTAGTAAGCGAGGTAATAAAAAGATCCGAACTTTGTTGGTTCAATGTGCCAGGGTATTCATACAAAAACTGGAACACCAGTCTGGCAAATTGGCCGATTGGGTCAGGGATTTACTGTGCCGGAAAAGCAACTTTGTCGTCACTTGTGCTCTGGCAAACAAGCTGGCCAGAATAGCCTGGGCCCTAACGGCACGACAGCAAACTTATGTAGCATAACGGCAGAAATACACCGGTTTAAAGAATTACTGATCTGGTTTTGCGAATACTGATATTGATGATACTAACGGCCCACCGGCCTGTTGAGGAAC
+CAGTAATTCTTTAAACCGGTGTATTTCTGCCGTTATGCTACATAAGTTTGCTGTCGTGCCGTTAGGGCCCAGGCTATTCTGGCCAGCTTGTTTGCCAGAGCACAAGTGACGACAAAGTTGCTTTTCCGGCACAGTAAATCCCTGACCCAATCGGCCAATTTGCCAGACTGGTGTTCCAGTTTTTGTATGAATACCCTGGCACATTGAACCAACAAAGTTCGGATCTTTTTATTACCTCGCTTACTAATTCCCAGCAATGTCGTCCTACCTCCCGTGCTGTACTGCCGAGGTACAAGCCCTGTTGCCGCCGCAAAGTCACGGCTGCTGGCGTACTGCTTCCCGTCGCCAATCTCA
+NODE 33 252 18197 18197 0 0
+CGCGAGCACCTGAGCGAGCTGCAAACCGTGTTCGGTTTCCGGCCCTTCACCATGAGCCATTACCGGCAGGCCGTCCAGATGCTGACCGAGCTGGCGATGCAAACCGACAAAGGCATCGTGCTGGCCAGCGCCTTGATCGGGCACCTGCGGCGGCAGTCGGTCATTCTGCCCGCCCTCAACGCCGTCGAGCGGGGGCACTGTTGCAAAGTTAGCGATGAGGCAGCCTTTTGTCTTATTCAAAGGCCTTACATT
+CCGCTCGACGGCGTTGAGGGCGGGCAGAATGACCGACTGCCGCCGCAGGTGCCCGATCAAGGCGCTGGCCAGCACGATGCCTTTGTCGGTTTGCATCGCCAGCTCGGTCAGCATCTGGACGGCCTGCCGGTAATGGCTCATGGTGAAGGGCCGGAAACCGAACACGGTTTGCAGCTCGCTCAGGTGCTCGCGCCGGCACTGTTGCAAAGTTAGCGATGAGGCAGCCTTTTGTCTTATTCAAAGGCCTTACAT
+NODE 34 177 40491 36335 0 0
+CTGTAAAACGGAAAGGCTCATTGAAGCCGTATATTTTCTGGAGGTTCATCAGGCGCGGAACTCATCAAGGCGCGGGAATAAAATCCCATTCAGACGCCGGATAGATTCAAGCAAGCCAACTTGTCGTCAAAATCGGTGTTGCAAAAACGGGAGTGACCATAGATTCCGTTTTCTGAG
+GGCTTGCTTGAATCTATCCGGCGTCTGAATGGGATTTTATTCCCGCGCCTTGATGAGTTCCGCGCCTGATGAACCTCCAGAAAATATACGGCTTCAATGAGCCTTTCCGTTTTACAGGTTCCTCAACAGGCCGGTGGGCCGTTAGTATCATCAATATCAGTATTCGCAAAACCAGAT
+NODE 35 940 69876 69876 0 0
+GGCTCTGTTGCAAAGATTGGCGGCAGTCAGAGGTAGGCTGTCGCTCTGCGCCGATCAGGCGGCTGCTGCGAAATGGTGGTTGAGCATGCCCATGGCCTCCGTCAGCGCCGAGGGCCCAATGCCAAAAGCTCTCTCCACAAGGCGCACCTCGCCCCTGATGCCGGGCTGCAGGCACCAGGGGCGAGCCTGTCCTTTGCGCAGGGCTCGCATGACTTCGAATCCCTTGATCGTGGCATAGGCCGTGGGGATCGATTTGAAACCGCGCACCGGCTTGATCAGTATCTTGAGCTTTCCGTGATCGGCCTCGATCACGTTATTGAGATACTTCACCTGCCGGTGGGCCGTCTCCCGGTCCAGCTTTCCTTCGCGCTTCAATTCGGTGATCGCTGCACCATAGCTCGGCGCTTTGTCGGTATTGAGCGTGGCAGGCTTTTCCCAGTGCTTCAGGCCTCGCAGGGCCTTGCCCAGGAACCGCTTCGCTGCCTTGGCGCT [...]
+GGCTCTGTTGCAAAAATCGTGAAGCTTGAGCATGCTTGGCGGAGATTGGACGGACGGAACGATGACGGATTTCAAGTGGCGCCATTTCCAGGGTGATGTGATCCTGTGGGCGGTGCGCTGGTATTGTCGCTATCCGATCAGCTATCGCGACCTTGAGGAAATGCTGGCGGAACGCGGCATTTCGGTCGACCATACGACGATCTATCGCTGGGTCCAGTGCTACGCCCCGGAGATGGAGAAGCGGCTGCGCTGGTTCTGGCGGCGTGGCTTTGATCCGAGCTGGCGCCTGGATGAAACCTACGTCAAGGTGCGGGGCAAGTGGACCTACCTGTACCGGGCAGTCGACAAGCGGGGCGACACGATCGATTTCTACCTGTCGCCGACCCGCAGCGCCAAGGCAGCGAAGCGGTTCCTGGGCAAGGCCCTGCGAGGCCTGAAGCACTGGGAAAAGCCTGCCACGCTCAATACCGACAAAGCGCCGAGCTATGGTGC [...]
+NODE 36 127 34874 29975 0 0
+ATGGCGGAAAATCGTGTTGAGGCCAACGCCCATAATGCGGGCGGTTGCCCGGCATCCAACGCCATTCATGGCCATATCAATGATTTTCTGGTGCGTACCGGGTTGAGAAGCGGTGTAAGTGAACTGC
+GAATGGCGTTGGATGCCGGGCAACCGCCCGCATTATGGGCGTTGGCCTCAACACGATTTTCCGCCATTTAAAAAACTCAGGCCGCAGTCGGTAACCTCGCGCATACAGCCGGGCAGTGACGTCATCG
+NODE 37 52 3605 3605 0 0
+TGTCCGTGAATCCCTGGTTCAGGATAAGGTAAAAACAACCAATCAAATGCAT
+CTTCACAAATAGCTTCGGCGTCGACAAAGTCGTTTTTATTGCTTTTAACGAA
+NODE 38 205 14188 14188 0 0
+CCATTACCCGGGAAGAGGGGGAAAATCTAGTGTGACAAACTACCCTCAGGATAGGATGACAAATTGCCCTCAATTCTGGCTCCACTACCGGTTACAGCCAAAAAACCATGAGTAAGCGCAGGATGCCAGGGAGGGAACAGCAAAACTGTGACAAATCACCCTCAACCTTCCAGATCAAATGTGACGAACCACCCTTAAATCTGTG
+TTTTGCTGTTCCCTCCCTGGCATCCTGCGCTTACTCATGGTTTTTTGGCTGTAACCGGTAGTGGAGCCAGAATTGAGGGCAATTTGTCATCCTATCCTGAGGGTAGTTTGTCACACTAGATTTTCCCCCTCTTCCCGGGTAATGGTGCCAACTTACTGATTTAGTGTATGATGGTGTTTTTGAGGTGCTCCAGTGGCTTCTGTTT
+NODE 39 58 5180 5180 0 0
+TAAATCGCGCCAGCGCTGGCTGTTTTACGCGTATGACAGGCTCCGGAAGACGGTTGTT
+GCAGACGATGACGTCACTGCCCGGCTGTATGCGCGAGGTTACCGACTGCGGCCTGAGT
+NODE 40 306 90197 85404 0 0
+GCGCACGTATTCGGTGAACGCACTATGGCGACGCTGGGGCGTCTTATGAGCCTGCTGTCACCCTTTGACGTGGTGATATGGATGACGGATGGCTGGCCGCTGTATGAATCCCGCCTGAAGGGAAAGCTGCACGTAATCAGCAAGCGATATACGCAGCGAATTGAGCGGCATAACCTGAATCTGAGGCAGCACCTGGCACGGCTGGGACGGAAGTCGCTGTCGTTCTCAAAATCGGTGGAGCTGCATGACAAAGTCATCGGGCATTATCTGAACATAAAACACTATCAATAAGTTGGAGTCATTACC
+ATGCAGCTCCACCGATTTTGAGAACGACAGCGACTTCCGTCCCAGCCGTGCCAGGTGCTGCCTCAGATTCAGGTTATGCCGCTCAATTCGCTGCGTATATCGCTTGCTGATTACGTGCAGCTTTCCCTTCAGGCGGGATTCATACAGCGGCCAGCCATCCGTCATCCATATCACCACGTCAAAGGGTGACAGCAGGCTCATAAGACGCCCCAGCGTCGCCATAGTGCGTTCACCGAATACGTGCGCAACAACCGTCTTCCGGAGCCTGTCATACGCGTAAAACAGCCAGCGCTGGCGCGATTTAGC
+NODE 41 214 15240 15240 0 0
+CCCACGGTACCCGGCCAGCTTCCCGCCATGCTCTGGCGATTAAGGGGGTTAAATGCCAGGATACGCGACCAGCATTCCCCATGGTCTGGCGAATAAGGGAGTTAAATACCACGGTACCTGACCAGAATGACCCCATGTCCTGGCGATTAAAGGGTTAAATGCCACGCTACGCGACCAGCCTCCCCATGGCCTGGCGATTAAGGGGGTTAAATGC
+CCCTTTAATCGCCAGGACATGGGGTCATTCTGGTCAGGTACCGTGGTATTTAACTCCCTTATTCGCCAGACCATGGGGAATGCTGGTCGCGTATCCTGGCATTTAACCCCCTTAATCGCCAGAGCATGGCGGGAAGCTGGCCGGGTACCGTGGGATTTAACCCCCTTAATCGCCAGACCATGGAGGAAAGCTGGGCGTGTCCCATGGAATTTAA
+NODE 42 125 9064 9064 0 0
+GTGCCCCCTAATAGTGTTCTTCCATTTCGGTAAAAATCCCTACCATGGATTCCCACTCGTCCGGGGGGTAATGACTCCAACTTATTGATAGTGTTTTATGTTCAGATAATGCCCGATGACTTTGT
+CCCGGACGAGTGGGAATCCATGGTAGGGATTTTTACCGAAATGGAAGAACACTATTAGGGGGCACCTCAGAAAACGGAATCTATGGTCACTCCCGTTTTTGCAACACCGATTTTGACGACAAGTT
+NODE 43 29 4823 4823 0 0
+GCAGATCACTTCTGATATTGAACTGTCAG
+CACCAAAGCGAGGTGAGCATGGCGACGGA
+NODE 44 70 10135 10135 0 0
+ATTAAGGGGGTTAAATTCCATGGGACACGCCCAGCTTTCCTCCATGGTCTGGCGATTAAGGGGGTTAAAT
+CCCCCTTAATCGCCAGACCATGGAGGAAAGCTGGTCGTGTCCCGTGGCATTTAACCCCCTTAATCGCCAG
+NODE 45 1 141 141 0 0
+G
+C
+NODE 46 5 816 816 0 0
+CACGG
+TTTAA
+NODE 47 31 2320 2320 0 0
+GACACGACCAGCTTTCCTCCATGGTCTGGCG
+GCCATGGGGAGGCTGGTCGCGTAGCGTGGCA
+NODE 48 1 167 167 0 0
+C
+C
+NODE 49 51 3430 3430 0 0
+TATCTGTCACAGATTTAAGGGTGGTTCGTCACATTTGATCTGGAAGGTTGA
+CTTCCAGATCAAATGTGACGAACCACCCTTAAATCTGTGACAGATAACCCT
+NODE 50 4 600 600 0 0
+GGGT
+CAAC
+NODE 51 354 25881 25881 0 0
+GAATGATTGTTTAAACTGGTGTATTTCTGCCTTTATGCTTCGTAAGTTTGCTGTCGCGCCGTCAGTGCCCAGGCTATTCTGGCCAGCTTGTTTGCCAGAGCACAGGTGACGACAAAGTTGCTTTTCCGACACAACAACTCCCTGACCCAGTCGGCCAACTTGCCAGACTGGTGTTCCAGTTTTTGTATGAATACCCTGGCACACTGAACCAACAAAGTTCGGATCTTTTTGTTGCCCCGCTTGCTAATCCCTAACAATGTCGTCCGACCTCCCGTGCTGTACTGTCGGGGTACCAGCCCTGTTGCCGCCGCAAAGTCACGGCTGCTGGCGTACTGCTTCCCGTCGCCAATCTCA
+GGTACCCCGACAGTACAGCACGGGAGGTCGGACGACATTGTTAGGGATTAGCAAGCGGGGCAACAAAAAGATCCGAACTTTGTTGGTTCAGTGTGCCAGGGTATTCATACAAAAACTGGAACACCAGTCTGGCAAGTTGGCCGACTGGGTCAGGGAGTTGTTGTGTCGGAAAAGCAACTTTGTCGTCACCTGTGCTCTGGCAAACAAGCTGGCCAGAATAGCCTGGGCACTGACGGCGCGACAGCAAACTTACGAAGCATAAAGGCAGAAATACACCAGTTTAAACAATCATTCATCTGGTTTTGCGAATACTGATATTGATGATACTAACGGCCCACCGGCCTGTTGAGGAAC
+NODE 52 71 5984 5984 0 0
+TCCTCCATGGTCTGGCGATTAAGGGGGTTAAATGCCACGGGACACGACCAGCTTTCCTCCATGGTCTGGCG
+ACCATGGAGGAAAGCTGGTTGCGTACCGTGGCATTTAACCCCCTTAATCGCCAGACCATGGAGGAAAGCTG
+NODE 53 169 62531 54018 0 0
+AGTTGCCATGTTTTACGGCAGTGAGAGCAGAGATAGCGCTGATGTCCGGCGGTGCTTTTGCCGTTACGCACCACCCCGTCAGTAGCTGAACAGGAGGGACAGCTGATAGAAACAGAAGCCACTGGAGCACCTCAAAAACACCATCATACACTAAATCAGTAAGTTGGCA
+CTATCAGCTGTCCCTCCTGTTCAGCTACTGACGGGGTGGTGCGTAACGGCAAAAGCACCGCCGGACATCAGCGCTATCTCTGCTCTCACTGCCGTAAAACATGGCAACTGCAGTTCACTTACACCGCTTCTCAACCCGGTACGCACCAGAAAATCATTGATATGGCCAT
+NODE 54 8 2392 2392 0 0
+GCATCACC
+TTCTGTTT
+NODE 55 1 163 163 0 0
+C
+C
+NODE 56 1 148 148 0 0
+T
+C
+NODE 57 4 584 584 0 0
+ATAT
+GCTG
+NODE 58 2 302 302 0 0
+GG
+TT
+NODE 59 20 1406 1406 0 0
+GCCACGGTACGCAACCAGCT
+GCGTGTCCCATGGAATTTAA
+NODE 60 1 154 154 0 0
+T
+G
+NODE 61 1 155 155 0 0
+T
+C
+ARC 1 -60 78
+ARC -1 -54 73
+ARC 2 45 66
+ARC -2 -30 71
+ARC 3 48 86
+ARC -3 9 78
+ARC 4 -57 69
+ARC -4 -57 74
+ARC 5 -30 70
+ARC -5 -20 73
+ARC 6 -20 73
+ARC -6 -29 63
+ARC 7 -54 57
+ARC -7 46 90
+ARC 8 9 58
+ARC -8 22 65
+ARC 9 10 64
+ARC 9 18 84
+ARC 10 -61 79
+ARC 11 50 78
+ARC -11 -61 72
+ARC 12 13 67
+ARC -12 -13 68
+ARC 13 14 67
+ARC -13 -38 69
+ARC 14 -50 68
+ARC 15 -45 138
+ARC 15 57 143
+ARC -15 -56 147
+ARC -15 58 146
+ARC 16 24 72
+ARC -16 -20 70
+ARC 17 -29 223
+ARC -17 40 203
+ARC 18 -55 82
+ARC 19 -46 69
+ARC -19 60 70
+ARC -20 -43 160
+ARC -20 -35 71
+ARC 21 22 86
+ARC -21 -55 77
+ARC 22 -34 137
+ARC 23 24 141
+ARC -23 -37 62
+ARC -23 26 76
+ARC 24 -51 73
+ARC 24 32 136
+ARC 25 43 85
+ARC -25 45 66
+ARC 26 30 79
+ARC 27 56 70
+ARC -27 -58 86
+ARC 28 29 304
+ARC 28 39 96
+ARC -28 31 89
+ARC -28 36 292
+ARC -30 37 70
+ARC 31 53 74
+ARC 32 34 134
+ARC 33 56 68
+ARC -33 -58 63
+ARC 34 42 80
+ARC -34 51 78
+ARC -35 43 77
+ARC 36 53 292
+ARC -38 -53 76
+ARC 39 40 57
+ARC 40 -48 163
+ARC 40 61 151
+ARC 41 46 73
+ARC -41 -44 76
+ARC 42 48 79
+ARC 44 59 62
+ARC -44 -52 76
+ARC -44 -47 69
+ARC 46 47 87
+ARC 49 50 66
+ARC -49 -50 76
+ARC -52 -60 74
+ARC 53 54 292
+ARC 54 55 161
+ARC 59 60 75
diff --git a/command_line/commoncommandlinefunctions.cpp b/command_line/commoncommandlinefunctions.cpp
new file mode 100644
index 0000000..9e74c6a
--- /dev/null
+++ b/command_line/commoncommandlinefunctions.cpp
@@ -0,0 +1,1307 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "commoncommandlinefunctions.h"
+#include "../graph/assemblygraph.h"
+#include <QDir>
+#include "../blast/blastsearch.h"
+#include <QApplication>
+#include "../program/memory.h"
+#include <limits>
+
+
+QStringList getArgumentList(int argc, char *argv[])
+{
+ QStringList arguments;
+ for (int i = 1; i < argc; ++i)
+ {
+ QString argument = argv[i];
+ arguments.push_back(argument);
+ }
+ return arguments;
+}
+
+
+
+void getSettingsUsage(QStringList * text)
+{
+ QString dashes = "";
+ for (int i = 0; i < g_memory->terminalWidth - 10; ++i)
+ dashes += '-';
+
+ *text << "Settings: The following options configure the Bandage settings that are available in the Bandage GUI.";
+ *text << "";
+ *text << "Colours can be specified using hex values, with or without an alpha channel, (e.g. #FFB6C1 or #7FD2B48C) or using standard colour names (e.g. red, yellowgreen or skyblue). Note that hex colours will either need to be enclosed in quotes (e.g. \"#FFB6C1\") or have the hash symbol escaped (e.g. \\#FFB6C1).";
+ *text << "";
+ *text << "Graph scope";
+ *text << dashes;
+ *text << "These settings control the graph scope. If the aroundnodes scope is used, then the --nodes option must also be used. If the aroundblast scope is used, a BLAST query must be given with the --query option.";
+ getGraphScopeOptions(text);
+ *text << "--double Draw graph in double mode (default: off)";
+ *text << "";
+ *text << "Graph size";
+ *text << dashes;
+ *text << "--nodelen <float> Node length per megabase " + getRangeAndDefault(g_settings->manualNodeLengthPerMegabase, "auto");
+ *text << "--minnodlen <float> Minimum node length " + getRangeAndDefault(g_settings->minimumNodeLength);
+ *text << "--edgelen <float> Edge length " + getRangeAndDefault(g_settings->edgeLength);
+ *text << "--edgewidth <float> Edge width " + getRangeAndDefault(g_settings->edgeWidth);
+ *text << "--doubsep <float> Double mode separation " + getRangeAndDefault(g_settings->doubleModeNodeSeparation);
+ *text << "";
+ *text << "Graph layout";
+ *text << dashes;
+ *text << "--nodseglen <float> Node segment length " + getRangeAndDefault(g_settings->nodeSegmentLength);
+ *text << "--iter <int> Graph layout iterations " + getRangeAndDefault(g_settings->graphLayoutQuality);
+ *text << "--linear Linear graph layout (default: off)" ;
+ *text << "";
+ *text << "Graph appearance";
+ *text << dashes;
+ *text << "--edgecol <col> Colour for edges " + getDefaultColour(g_settings->edgeColour);
+ *text << "--outcol <col> Colour for node outlines " + getDefaultColour(g_settings->outlineColour);
+ *text << "--outline <float> Node outline thickness " + getRangeAndDefault(g_settings->outlineThickness);
+ *text << "--selcol <col> Colour for selections " + getDefaultColour(g_settings->selectionColour);
+ *text << "--noaa Disable antialiasing (default: antialiasing on)";
+ *text << "--singlearr Show node arrowheads in single mode (default: nodes are only displayed with arrowheads in double mode)";
+ *text << "";
+ *text << "Text appearance";
+ *text << dashes;
+ *text << "--textcol <col> Colour for label text " + getDefaultColour(g_settings->textColour);
+ *text << "--toutcol <col> Colour for text outline " + getDefaultColour(g_settings->textOutlineColour);
+ *text << "--toutline <float> Surround text with an outline with this thickness " + getRangeAndDefault(g_settings->textOutlineThickness);
+ *text << "--centre Node labels appear at the centre of the node (default: off, node labels appear over visible parts of nodes)";
+ *text << "";
+ *text << "Node width";
+ *text << dashes;
+ *text << "Node widths are determined using the following formula:";
+ *text << "a*b*((c/d)^e-1)+1";
+ *text << " a = average node width";
+ *text << " b = depth effect on width";
+ *text << " c = node depth";
+ *text << " d = mean depth";
+ *text << " e = power of depth effect on width";
+ *text << "--nodewidth <float> Average node width " + getRangeAndDefault(g_settings->averageNodeWidth);
+ *text << "--depwidth <float> Depth effect on width " + getRangeAndDefault(g_settings->depthEffectOnWidth);
+ *text << "--deppower <float> Power of depth effect on width " + getRangeAndDefault(g_settings->depthPower);
+ *text << "";
+ *text << "Node labels";
+ *text << dashes;
+ *text << "--names Label nodes with name (default: off)";
+ *text << "--lengths Label nodes with length (default: off)";
+ *text << "--depth Label nodes with depth (default: off)";
+ *text << "--blasthits Label BLAST hits (default: off)";
+ *text << "--fontsize <int> Font size for node labels " + getRangeAndDefault(1, 100, g_settings->labelFont.pointSize());
+ *text << "";
+ *text << "Node colours";
+ *text << dashes;
+ *text << "--colour <scheme> Node colouring scheme, from one of the following options: random, uniform, depth, blastsolid, blastrainbow (default: random if --query option not used, blastsolid if --query option used)";
+ *text << "";
+ *text << "Random colour scheme";
+ *text << dashes;
+ *text << "These settings only apply when the random colour scheme is used.";
+ *text << "--ransatpos <int> Positive node saturation " + getRangeAndDefault(g_settings->randomColourPositiveSaturation);
+ *text << "--ransatneg <int> Negative node saturation " + getRangeAndDefault(g_settings->randomColourNegativeSaturation);
+ *text << "--ranligpos <int> Positive node lightness " + getRangeAndDefault(g_settings->randomColourPositiveLightness);
+ *text << "--ranligneg <int> Negative node lightness " + getRangeAndDefault(g_settings->randomColourNegativeLightness);
+ *text << "--ranopapos <int> Positive node opacity " + getRangeAndDefault(g_settings->randomColourPositiveOpacity);
+ *text << "--ranopaneg <int> Negative node opacity " + getRangeAndDefault(g_settings->randomColourNegativeOpacity);
+ *text << "";
+ *text << "Uniform colour scheme";
+ *text << dashes;
+ *text << "These settings only apply when the uniform colour scheme is used.";
+ *text << "--unicolpos <col> Positive node colour " + getDefaultColour(g_settings->uniformPositiveNodeColour);
+ *text << "--unicolneg <col> Negative node colour " + getDefaultColour(g_settings->uniformNegativeNodeColour);
+ *text << "--unicolspe <col> Special node colour " + getDefaultColour(g_settings->uniformNodeSpecialColour);
+ *text << "";
+ *text << "Depth colour scheme";
+ *text << dashes;
+ *text << "These settings only apply when the depth colour scheme is used.";
+ *text << "--depcollow <col> Colour for nodes with depth below the low depth value " + getDefaultColour(g_settings->lowDepthColour);
+ *text << "--depcolhi <col> Colour for nodes with depth above the high depth value " + getDefaultColour(g_settings->highDepthColour);
+ *text << "--depvallow <float> Low depth value " + getRangeAndDefault(g_settings->lowDepthValue, "auto");
+ *text << "--depvalhi <float> High depth value " + getRangeAndDefault(g_settings->highDepthValue, "auto");
+ *text << "";
+ *text << "BLAST search";
+ *text << dashes;
+ *text << "--query <fastafile> A FASTA file of either nucleotide or protein sequences to be used as BLAST queries (default: none)";
+ *text << "--blastp <param> Parameters to be used by blastn and tblastn when conducting a BLAST search in Bandage (default: none). Format BLAST parameters exactly as they would be used for blastn/tblastn on the command line, and enclose them in quotes.";
+ *text << "--alfilter <int> Alignment length filter for BLAST hits. Hits with shorter alignments will be excluded " + getRangeAndDefault(g_settings->blastAlignmentLengthFilter);
+ *text << "--qcfilter <float> Query coverage filter for BLAST hits. Hits with less coverage will be excluded " + getRangeAndDefault(g_settings->blastQueryCoverageFilter);
+ *text << "--ifilter <float> Identity filter for BLAST hits. Hits with less identity will be excluded " + getRangeAndDefault(g_settings->blastIdentityFilter);
+ *text << "--evfilter <sci> E-value filter for BLAST hits. Hits with larger e-values will be excluded " + getRangeAndDefault(g_settings->blastEValueFilter);
+ *text << "--bsfilter <float> Bit score filter for BLAST hits. Hits with lower bit scores will be excluded " + getRangeAndDefault(g_settings->blastBitScoreFilter);
+ *text << "";
+ *text << "BLAST query paths";
+ *text << dashes;
+ *text << "These settings control how Bandage searches for query paths after conducting a BLAST search.";
+ *text << "--pathnodes <int> The number of allowed nodes in a BLAST query path " + getRangeAndDefault(g_settings->maxQueryPathNodes);
+ *text << "--minpatcov <float> Minimum fraction of a BLAST query which must be covered by a query path " + getRangeAndDefault(g_settings->minQueryCoveredByPath);
+ *text << "--minhitcov <float> Minimum fraction of a BLAST query which must be covered by BLAST hits in a query path " + getRangeAndDefault(g_settings->minQueryCoveredByHits);
+ *text << "--minmeanid <float> Minimum mean identity of BLAST hits in a query path " + getRangeAndDefault(g_settings->minMeanHitIdentity);
+ *text << "--maxevprod <sci> Maximum e-value product for all BLAST hits in a query path " + getRangeAndDefault(g_settings->maxEValueProduct);
+ *text << "--minpatlen <float> Minimum allowed relative path length as compared to the query " + getRangeAndDefault(g_settings->minLengthPercentage);
+ *text << "--maxpatlen <float> Maximum allowed relative path length as compared to the query " + getRangeAndDefault(g_settings->maxLengthPercentage);
+ *text << "--minlendis <int> Minimum allowed length discrepancy (in bases) between a BLAST query and its path in the graph " + getRangeAndDefault(g_settings->minLengthBaseDiscrepancy);
+ *text << "--maxlendis <int> Maximum allowed length discrepancy (in bases) between a BLAST query and its path in the graph " + getRangeAndDefault(g_settings->maxLengthBaseDiscrepancy);
+ *text << "";
+}
+
+
+
+void outputText(QString text, QTextStream * out)
+{
+ QStringList list;
+ list << text;
+ outputText(list, out);
+}
+
+void outputText(QStringList text, QTextStream * out)
+{
+ QStringList wrapped;
+
+ bool seenHeaderOrList = false;
+ for (int i = 0; i < text.size(); ++i)
+ {
+ QString line = text[i];
+
+ if (isSectionHeader(line) || isListItem(line))
+ seenHeaderOrList = true;
+
+ if (isError(line))
+ wrapped << wrapText(line, g_memory->terminalWidth, 0, 0);
+ else if (!seenHeaderOrList)
+ wrapped << wrapText(line, g_memory->terminalWidth, 0, 0);
+ else if (isSectionHeader(line) && line.contains("--"))
+ wrapped << wrapText(line, g_memory->terminalWidth, 0, 30);
+ else if (isSectionHeader(line))
+ wrapped << wrapText(line, g_memory->terminalWidth, 0, 10);
+ else if (isListItem(line))
+ wrapped << wrapText(line, g_memory->terminalWidth, 2, 4);
+ else if (isCommand(line))
+ wrapped << wrapText(line, g_memory->terminalWidth, 10, 23);
+ else if (isOption(line))
+ wrapped << wrapText(line, g_memory->terminalWidth, 10, 30);
+ else
+ wrapped << wrapText(line, g_memory->terminalWidth, 10, 10);
+ }
+
+ *out << endl;
+ for (int i = 0; i < wrapped.size(); ++i)
+ {
+ *out << wrapped[i];
+ *out << endl;
+ }
+}
+
+
+//This is in a separate function because the command line tool Bandage reduce
+//also displays these.
+void getGraphScopeOptions(QStringList * text)
+{
+ *text << "--scope <scope> Graph scope, from one of the following options: entire, aroundnodes, aroundblast, depthrange (default: entire)";
+ *text << "--nodes <list> A comma-separated list of starting nodes for the aroundnodes scope (default: none)";
+ *text << "--partial Use partial node name matching (default: exact node name matching)";
+ *text << "--distance <int> The number of node steps away to draw for the aroundnodes and aroundblast scopes " + getRangeAndDefault(g_settings->nodeDistance);
+ *text << "--mindepth <float> The minimum allowed depth for the depthrange scope " + getRangeAndDefault(g_settings->minDepthRange);
+ *text << "--maxdepth <float> The maximum allowed depth for the depthrange scope " + getRangeAndDefault(g_settings->maxDepthRange);
+}
+
+
+//This function checks the values of the Bandage settings.
+//If everything is fine, it removes the good arguments/values and returns
+//a null string. If there's a problem, it returns an error message.
+QString checkForInvalidOrExcessSettings(QStringList * arguments)
+{
+ QStringList argumentsCopy = *arguments;
+
+ QStringList validScopeOptions;
+ validScopeOptions << "entire" << "aroundnodes" << "aroundblast" << "depthrange";
+ QString error;
+
+ error = checkOptionForString("--scope", arguments, validScopeOptions); if (error.length() > 0) return error;
+ error = checkOptionForString("--nodes", arguments, QStringList(), "a list of node names"); if (error.length() > 0) return error;
+ checkOptionWithoutValue("--partial", arguments);
+ error = checkOptionForInt("--distance", arguments, g_settings->nodeDistance, false); if (error.length() > 0) return error;
+ error = checkOptionForFloat("--mindepth", arguments, g_settings->minDepthRange, false); if (error.length() > 0) return error;
+ error = checkOptionForFloat("--maxdepth", arguments, g_settings->maxDepthRange, false); if (error.length() > 0) return error;
+ if (isOptionPresent("--query", arguments) && g_memory->commandLineCommand == NO_COMMAND) return "A graph must be given (e.g. via Bandage load) to use the --query option";
+ error = checkOptionForFile("--query", arguments); if (error.length() > 0) return error;
+ error = checkOptionForString("--blastp", arguments, QStringList(), "blastn/tblastn parameters"); if (error.length() > 0) return error;
+ checkOptionWithoutValue("--double", arguments);
+ error = checkOptionForFloat("--nodelen", arguments, g_settings->manualNodeLengthPerMegabase, false); if (error.length() > 0) return error;
+ error = checkOptionForFloat("--minnodlen", arguments, g_settings->minimumNodeLength, false); if (error.length() > 0) return error;
+ error = checkOptionForFloat("--edgelen", arguments, g_settings->edgeLength, false); if (error.length() > 0) return error;
+ error = checkOptionForFloat("--doubsep", arguments, g_settings->doubleModeNodeSeparation, false); if (error.length() > 0) return error;
+ error = checkOptionForInt("--iter", arguments, g_settings->graphLayoutQuality, false); if (error.length() > 0) return error;
+ checkOptionWithoutValue("--linear", arguments);
+ error = checkOptionForFloat("--nodseglen", arguments, g_settings->nodeSegmentLength, false); if (error.length() > 0) return error;
+ error = checkOptionForFloat("--nodewidth", arguments, g_settings->averageNodeWidth, false); if (error.length() > 0) return error;
+ error = checkOptionForFloat("--depwidth", arguments, g_settings->depthEffectOnWidth, false); if (error.length() > 0) return error;
+ error = checkOptionForFloat("--deppower", arguments, g_settings->depthPower, false); if (error.length() > 0) return error;
+ error = checkOptionForFloat("--edgewidth", arguments, g_settings->edgeWidth, false); if (error.length() > 0) return error;
+ error = checkOptionForFloat("--outline", arguments, g_settings->outlineThickness, false); if (error.length() > 0) return error;
+ checkOptionWithoutValue("--names", arguments);
+ checkOptionWithoutValue("--lengths", arguments);
+ checkOptionWithoutValue("--depth", arguments);
+ checkOptionWithoutValue("--blasthits", arguments);
+ error = checkOptionForInt("--fontsize", arguments, IntSetting(0, 1, 100), false); if (error.length() > 0) return error;
+ error = checkOptionForFloat("--toutline", arguments, g_settings->textOutlineThickness, false); if (error.length() > 0) return error;
+ checkOptionWithoutValue("--centre", arguments);
+ error = checkOptionForColour("--edgecol", arguments); if (error.length() > 0) return error;
+ error = checkOptionForColour("--outcol", arguments); if (error.length() > 0) return error;
+ error = checkOptionForColour("--selcol", arguments); if (error.length() > 0) return error;
+ error = checkOptionForColour("--textcol", arguments); if (error.length() > 0) return error;
+ error = checkOptionForColour("--toutcol", arguments); if (error.length() > 0) return error;
+ checkOptionWithoutValue("--noaa", arguments);
+ checkOptionWithoutValue("--singlearr", arguments);
+ QStringList validColourOptions;
+ validColourOptions << "random" << "uniform" << "depth" << "blastsolid" << "blastrainbow";
+ error = checkOptionForString("--colour", arguments, validColourOptions); if (error.length() > 0) return error;
+ error = checkOptionForInt("--ransatpos", arguments, g_settings->randomColourPositiveSaturation, false); if (error.length() > 0) return error;
+ error = checkOptionForInt("--ransatneg", arguments, g_settings->randomColourNegativeSaturation, false); if (error.length() > 0) return error;
+ error = checkOptionForInt("--ranligpos", arguments, g_settings->randomColourPositiveLightness, false); if (error.length() > 0) return error;
+ error = checkOptionForInt("--ranligneg", arguments, g_settings->randomColourNegativeLightness, false); if (error.length() > 0) return error;
+ error = checkOptionForInt("--ranopapos", arguments, g_settings->randomColourPositiveOpacity, false); if (error.length() > 0) return error;
+ error = checkOptionForInt("--ranopaneg", arguments, g_settings->randomColourNegativeOpacity, false); if (error.length() > 0) return error;
+ error = checkOptionForColour("--unicolpos", arguments); if (error.length() > 0) return error;
+ error = checkOptionForColour("--unicolneg", arguments); if (error.length() > 0) return error;
+ error = checkOptionForColour("--unicolspe", arguments); if (error.length() > 0) return error;
+ error = checkOptionForColour("--depcollow", arguments); if (error.length() > 0) return error;
+ error = checkOptionForColour("--depcolhi", arguments); if (error.length() > 0) return error;
+ error = checkTwoOptionsForFloats("--depvallow", "--depvalhi", arguments, g_settings->lowDepthValue, g_settings->highDepthValue, true); if (error.length() > 0) return error;
+ error = checkOptionForInt("--pathnodes", arguments, g_settings->maxQueryPathNodes, false); if (error.length() > 0) return error;
+ error = checkOptionForFloat("--minpatcov", arguments, g_settings->minQueryCoveredByPath, false); if (error.length() > 0) return error;
+ error = checkOptionForFloat("--minhitcov", arguments, g_settings->minQueryCoveredByHits, true); if (error.length() > 0) return error;
+ error = checkOptionForFloat("--minmeanid", arguments, g_settings->minMeanHitIdentity, true); if (error.length() > 0) return error;
+ error = checkOptionForSciNot("--maxevprod", arguments, g_settings->maxEValueProduct, true); if (error.length() > 0) return error;
+ error = checkOptionForFloat("--minpatlen", arguments, g_settings->minLengthPercentage, true); if (error.length() > 0) return error;
+ error = checkOptionForFloat("--maxpatlen", arguments, g_settings->maxLengthPercentage, true); if (error.length() > 0) return error;
+ error = checkOptionForInt("--minlendis", arguments, g_settings->minLengthBaseDiscrepancy, true); if (error.length() > 0) return error;
+ error = checkOptionForInt("--maxlendis", arguments, g_settings->maxLengthBaseDiscrepancy, true); if (error.length() > 0) return error;
+ error = checkOptionForInt("--alfilter", arguments, g_settings->blastAlignmentLengthFilter, false); if (error.length() > 0) return error;
+ error = checkOptionForFloat("--qcfilter", arguments, g_settings->blastQueryCoverageFilter, false); if (error.length() > 0) return error;
+ error = checkOptionForFloat("--ifilter", arguments, g_settings->blastIdentityFilter, false); if (error.length() > 0) return error;
+ error = checkOptionForSciNot("--evfilter", arguments, g_settings->blastEValueFilter, false); if (error.length() > 0) return error;
+ error = checkOptionForFloat("--bsfilter", arguments, g_settings->blastBitScoreFilter, false); if (error.length() > 0) return error;
+
+ //Make sure that the min depth is less than or equal to the max read
+ //depth.
+ double minDepth = g_settings->minDepthRange;
+ double maxDepth = g_settings->maxDepthRange;
+ if (isOptionPresent("--mindepth", &argumentsCopy))
+ minDepth = getFloatOption("--mindepth", &argumentsCopy);
+ if (isOptionPresent("--maxdepth", &argumentsCopy))
+ maxDepth = getFloatOption("--maxdepth", &argumentsCopy);
+ if (minDepth > maxDepth)
+ return "the maximum depth must be greater than or equal to the minimum depth.";
+
+ //Make sure that the min path length is less than or equal to the max path
+ //length.
+ bool minLengthPercentageOn = g_settings->minLengthPercentage.on;
+ bool maxLengthPercentageOn = g_settings->maxLengthPercentage.on;
+ double minLengthPercentage = g_settings->minLengthPercentage;
+ double maxLengthPercentage = g_settings->maxLengthPercentage;
+ if (isOptionPresent("--minpatlen", &argumentsCopy))
+ {
+ QString optionString = getStringOption("--minpatlen", &argumentsCopy);
+ if (optionString.toLower() == "off")
+ minLengthPercentageOn = false;
+ else
+ {
+ minLengthPercentageOn = true;
+ minLengthPercentage = getFloatOption("--minpatlen", &argumentsCopy);
+ }
+ }
+ if (isOptionPresent("--maxpatlen", &argumentsCopy))
+ {
+ QString optionString = getStringOption("--maxpatlen", &argumentsCopy);
+ if (optionString.toLower() == "off")
+ maxLengthPercentageOn = false;
+ else
+ {
+ maxLengthPercentageOn = true;
+ maxLengthPercentage = getFloatOption("--maxpatlen", &argumentsCopy);
+ }
+ }
+ if (minLengthPercentageOn && maxLengthPercentageOn &&
+ minLengthPercentage > maxLengthPercentage)
+ return "the maximum BLAST query path length discrepancy must be greater than or equal to the minimum length discrepancy.";
+
+ //Make sure that the min length discrepancy is less than or equal to the max
+ //length discrepancy.
+ bool minLengthBaseDiscrepancyOn = g_settings->minLengthBaseDiscrepancy.on;
+ bool maxLengthBaseDiscrepancyOn = g_settings->maxLengthBaseDiscrepancy.on;
+ int minLengthBaseDiscrepancy = g_settings->minLengthBaseDiscrepancy;
+ int maxLengthBaseDiscrepancy = g_settings->maxLengthBaseDiscrepancy;
+ if (isOptionPresent("--minlendis", &argumentsCopy))
+ {
+ QString optionString = getStringOption("--minlendis", &argumentsCopy);
+ if (optionString.toLower() == "off")
+ minLengthBaseDiscrepancyOn = false;
+ else
+ {
+ minLengthBaseDiscrepancyOn = true;
+ minLengthBaseDiscrepancy = getIntOption("--minlendis", &argumentsCopy);
+ }
+ }
+ if (isOptionPresent("--maxlendis", &argumentsCopy))
+ {
+ QString optionString = getStringOption("--maxlendis", &argumentsCopy);
+ if (optionString.toLower() == "off")
+ g_settings->maxLengthBaseDiscrepancy.on = false;
+ else
+ {
+ maxLengthBaseDiscrepancyOn = true;
+ maxLengthBaseDiscrepancy = getIntOption("--maxlendis", &argumentsCopy);
+ }
+ }
+ if (minLengthBaseDiscrepancyOn && maxLengthBaseDiscrepancyOn &&
+ minLengthBaseDiscrepancy > maxLengthBaseDiscrepancy)
+ return "the maximum BLAST query path length discrepancy must be greater than or equal to the minimum length discrepancy.";
+
+ bool blastScope = isOptionAndValuePresent("--scope", "aroundblast", &argumentsCopy);
+ bool queryFile = isOptionPresent("--query", &argumentsCopy);
+ if (blastScope && !queryFile)
+ return "A BLAST query must be given with the --query option when the\naroundblast scope is used.";
+
+ bool nodesScope = isOptionAndValuePresent("--scope", "aroundnodes", &argumentsCopy);
+ bool nodesList = isOptionPresent("--nodes", &argumentsCopy);
+ if (nodesScope && !nodesList)
+ return "A list of starting nodes must be given with the --nodes option\nwhen the aroundnodes scope is used.";
+
+ bool depthScope = isOptionAndValuePresent("--scope", "depthrange", &argumentsCopy);
+ bool minDepthPresent = isOptionPresent("--mindepth", &argumentsCopy);
+ bool maxDepthPresent = isOptionPresent("--maxdepth", &argumentsCopy);
+ if (depthScope && !(minDepthPresent && maxDepthPresent))
+ return "A depth range must be given with the --mindepth and\n--maxdepth options when the aroundnodes scope is used.";
+
+ return checkForExcessArguments(*arguments);
+}
+
+
+
+void parseSettings(QStringList arguments)
+{
+ if (isOptionPresent("--scope", &arguments))
+ g_settings->graphScope = getGraphScopeOption("--scope", &arguments);
+
+ if (isOptionPresent("--distance", &arguments))
+ g_settings->nodeDistance = getIntOption("--distance", &arguments);
+
+ if (isOptionPresent("--mindepth", &arguments))
+ g_settings->minDepthRange = getFloatOption("--mindepth", &arguments);
+ if (isOptionPresent("--maxdepth", &arguments))
+ g_settings->maxDepthRange = getFloatOption("--maxdepth", &arguments);
+
+ if (isOptionPresent("--nodes", &arguments))
+ g_settings->startingNodes = getStringOption("--nodes", &arguments);
+ g_settings->startingNodesExactMatch = !isOptionPresent("--partial", &arguments);
+
+ if (isOptionPresent("--query", &arguments))
+ g_settings->blastQueryFilename = getStringOption("--query", &arguments);
+ if (isOptionPresent("--blastp", &arguments))
+ g_settings->blastSearchParameters = getStringOption("--blastp", &arguments);
+
+ g_settings->doubleMode = isOptionPresent("--double", &arguments);
+
+ if (isOptionPresent("--nodelen", &arguments))
+ {
+ g_settings->manualNodeLengthPerMegabase = getIntOption("--nodelen", &arguments);
+ g_settings->nodeLengthMode = MANUAL_NODE_LENGTH;
+ }
+ if (isOptionPresent("--edgelen", &arguments))
+ g_settings->edgeLength = getFloatOption("--edgelen", &arguments);
+
+ if (isOptionPresent("--iter", &arguments))
+ {
+ int quality = getIntOption("--iter", &arguments);
+ if (quality < 0)
+ quality = 0;
+ if (quality > 4)
+ quality = 4;
+ g_settings->graphLayoutQuality = quality;
+ }
+ g_settings->linearLayout = isOptionPresent("--linear", &arguments);
+
+ if (isOptionPresent("--nodseglen", &arguments))
+ g_settings->nodeSegmentLength = getFloatOption("--nodseglen", &arguments);
+ if (isOptionPresent("--nodewidth", &arguments))
+ g_settings->averageNodeWidth = getFloatOption("--nodewidth", &arguments);
+ if (isOptionPresent("--depwidth", &arguments))
+ g_settings->depthEffectOnWidth = getFloatOption("--depwidth", &arguments);
+ if (isOptionPresent("--deppower", &arguments))
+ g_settings->depthPower = getFloatOption("--deppower", &arguments);
+
+ if (isOptionPresent("--edgewidth", &arguments))
+ g_settings->edgeWidth = getFloatOption("--edgewidth", &arguments);
+ if (isOptionPresent("--outline", &arguments))
+ g_settings->outlineThickness = getFloatOption("--outline", &arguments);
+ g_settings->antialiasing = !isOptionPresent("--noaa", &arguments);
+ g_settings->arrowheadsInSingleMode = isOptionPresent("--singlearr", &arguments);
+
+
+ if (isOptionPresent("--edgecol", &arguments))
+ g_settings->edgeColour = getColourOption("--edgecol", &arguments);
+ if (isOptionPresent("--outcol", &arguments))
+ g_settings->outlineColour = getColourOption("--outcol", &arguments);
+ if (isOptionPresent("--selcol", &arguments))
+ g_settings->selectionColour = getColourOption("--selcol", &arguments);
+ if (isOptionPresent("--textcol", &arguments))
+ g_settings->textColour = getColourOption("--textcol", &arguments);
+ if (isOptionPresent("--toutcol", &arguments))
+ g_settings->textOutlineColour = getColourOption("--toutcol", &arguments);
+ g_settings->positionTextNodeCentre = isOptionPresent("--centre", &arguments);
+
+ g_settings->displayNodeNames = isOptionPresent("--names", &arguments);
+ g_settings->displayNodeLengths = isOptionPresent("--lengths", &arguments);
+ g_settings->displayNodeDepth = isOptionPresent("--depth", &arguments);
+ g_settings->displayBlastHits = isOptionPresent("--blasthits", &arguments);
+
+ if (isOptionPresent("--fontsize", &arguments))
+ {
+ int fontsize = getIntOption("--fontsize", &arguments);
+ QFont font = g_settings->labelFont;
+ font.setPointSize(fontsize);
+ g_settings->labelFont = font;
+ }
+
+ if (isOptionPresent("--toutline", &arguments))
+ {
+ double textOutlineThickness = getFloatOption("--toutline", &arguments);
+ if (textOutlineThickness == 0.0)
+ g_settings->textOutline = false;
+ else
+ {
+ g_settings->textOutline = true;
+ g_settings->textOutlineThickness = textOutlineThickness;
+ }
+ }
+
+ g_settings->nodeColourScheme = getColourSchemeOption("--colour", &arguments);
+
+ if (isOptionPresent("--ransatpos", &arguments))
+ g_settings->randomColourPositiveSaturation = getIntOption("--ransatpos", &arguments);
+ if (isOptionPresent("--ransatneg", &arguments))
+ g_settings->randomColourNegativeSaturation = getIntOption("--ransatneg", &arguments);
+ if (isOptionPresent("--ranligpos", &arguments))
+ g_settings->randomColourPositiveLightness = getIntOption("--ranligpos", &arguments);
+ if (isOptionPresent("--ranligneg", &arguments))
+ g_settings->randomColourNegativeLightness = getIntOption("--ranligneg", &arguments);
+ if (isOptionPresent("--ranopapos", &arguments))
+ g_settings->randomColourPositiveOpacity = getIntOption("--ranopapos", &arguments);
+ if (isOptionPresent("--ranopaneg", &arguments))
+ g_settings->randomColourNegativeOpacity = getIntOption("--ranopaneg", &arguments);
+
+ if (isOptionPresent("--unicolpos", &arguments))
+ g_settings->uniformPositiveNodeColour = getColourOption("--unicolpos", &arguments);
+ if (isOptionPresent("--unicolneg", &arguments))
+ g_settings->uniformNegativeNodeColour = getColourOption("--unicolneg", &arguments);
+ if (isOptionPresent("--unicolspe", &arguments))
+ g_settings->uniformNodeSpecialColour = getColourOption("--unicolspe", &arguments);
+
+ if (isOptionPresent("--depcollow", &arguments))
+ g_settings->lowDepthColour = getColourOption("--depcollow", &arguments);
+ if (isOptionPresent("--depcolhi", &arguments))
+ g_settings->highDepthColour = getColourOption("--depcolhi", &arguments);
+ if (isOptionPresent("--depvallow", &arguments))
+ {
+ g_settings->lowDepthValue = getFloatOption("--depvallow", &arguments);
+ g_settings->autoDepthValue = false;
+ }
+ if (isOptionPresent("--depvalhi", &arguments))
+ {
+ g_settings->highDepthValue = getFloatOption("--depvalhi", &arguments);
+ g_settings->autoDepthValue = false;
+ }
+
+ if (isOptionPresent("--pathnodes", &arguments))
+ g_settings->maxQueryPathNodes = getIntOption("--pathnodes", &arguments);
+ if (isOptionPresent("--minpatcov", &arguments))
+ g_settings->minQueryCoveredByPath = getFloatOption("--minpatcov", &arguments);
+ if (isOptionPresent("--minhitcov", &arguments))
+ {
+ QString optionString = getStringOption("--minhitcov", &arguments);
+ if (optionString.toLower() == "off")
+ g_settings->minQueryCoveredByHits.on = false;
+ else
+ {
+ g_settings->minQueryCoveredByHits.on = true;
+ g_settings->minQueryCoveredByHits = getFloatOption("--minhitcov", &arguments);
+ }
+ }
+ if (isOptionPresent("--minmeanid", &arguments))
+ {
+ QString optionString = getStringOption("--minmeanid", &arguments);
+ if (optionString.toLower() == "off")
+ g_settings->minMeanHitIdentity.on = false;
+ else
+ {
+ g_settings->minMeanHitIdentity.on = true;
+ g_settings->minMeanHitIdentity = getFloatOption("--minmeanid", &arguments);
+ }
+ }
+ if (isOptionPresent("--maxevprod", &arguments))
+ {
+ QString optionString = getStringOption("--maxevprod", &arguments);
+ if (optionString.toLower() == "off")
+ g_settings->maxEValueProduct.on = false;
+ else
+ {
+ g_settings->maxEValueProduct.on = true;
+ g_settings->maxEValueProduct = getSciNotOption("--maxevprod", &arguments);
+ }
+ }
+ if (isOptionPresent("--minpatlen", &arguments))
+ {
+ QString optionString = getStringOption("--minpatlen", &arguments);
+ if (optionString.toLower() == "off")
+ g_settings->minLengthPercentage.on = false;
+ else
+ {
+ g_settings->minLengthPercentage.on = true;
+ g_settings->minLengthPercentage = getFloatOption("--minpatlen", &arguments);
+ }
+ }
+ if (isOptionPresent("--maxpatlen", &arguments))
+ {
+ QString optionString = getStringOption("--maxpatlen", &arguments);
+ if (optionString.toLower() == "off")
+ g_settings->maxLengthPercentage.on = false;
+ else
+ {
+ g_settings->maxLengthPercentage.on = true;
+ g_settings->maxLengthPercentage = getFloatOption("--maxpatlen", &arguments);
+ }
+ }
+ if (isOptionPresent("--minlendis", &arguments))
+ {
+ QString optionString = getStringOption("--minlendis", &arguments);
+ if (optionString.toLower() == "off")
+ g_settings->minLengthBaseDiscrepancy.on = false;
+ else
+ {
+ g_settings->minLengthBaseDiscrepancy.on = true;
+ g_settings->minLengthBaseDiscrepancy = getIntOption("--minlendis", &arguments);
+ }
+ }
+ if (isOptionPresent("--maxlendis", &arguments))
+ {
+ QString optionString = getStringOption("--maxlendis", &arguments);
+ if (optionString.toLower() == "off")
+ g_settings->maxLengthBaseDiscrepancy.on = false;
+ else
+ {
+ g_settings->maxLengthBaseDiscrepancy.on = true;
+ g_settings->maxLengthBaseDiscrepancy = getIntOption("--maxlendis", &arguments);
+ }
+ }
+
+ if (isOptionPresent("--alfilter", &arguments))
+ {
+ g_settings->blastAlignmentLengthFilter.on = true;
+ g_settings->blastAlignmentLengthFilter = getIntOption("--alfilter", &arguments);
+ }
+ if (isOptionPresent("--qcfilter", &arguments))
+ {
+ g_settings->blastQueryCoverageFilter.on = true;
+ g_settings->blastQueryCoverageFilter = getFloatOption("--qcfilter", &arguments);
+ }
+ if (isOptionPresent("--ifilter", &arguments))
+ {
+ g_settings->blastIdentityFilter.on = true;
+ g_settings->blastIdentityFilter = getFloatOption("--ifilter", &arguments);
+ }
+ if (isOptionPresent("--evfilter", &arguments))
+ {
+ g_settings->blastEValueFilter.on = true;
+ g_settings->blastEValueFilter = getSciNotOption("--evfilter", &arguments);
+ }
+ if (isOptionPresent("--bsfilter", &arguments))
+ {
+ g_settings->blastBitScoreFilter.on = true;
+ g_settings->blastBitScoreFilter = getFloatOption("--bsfilter", &arguments);
+ }
+}
+
+
+
+bool checkForHelp(QStringList arguments)
+{
+ int h1 = arguments.indexOf("-h");
+ int h2 = arguments.indexOf("-help");
+ int h3 = arguments.indexOf("--help");
+
+ return (h1 != -1 || h2 != -1 || h3 != -1);
+}
+
+bool checkForHelpAll(QStringList arguments)
+{
+ return (arguments.indexOf("--helpall") != -1);
+}
+
+bool checkForVersion(QStringList arguments)
+{
+ int v1 = arguments.indexOf("-v");
+ int v2 = arguments.indexOf("-version");
+ int v3 = arguments.indexOf("--version");
+
+ return (v1 != -1 || v2 != -1 || v3 != -1);
+}
+
+
+
+//This function checks the value for an integer-accepting command line option.
+//If offOkay is true, then it will also accept "off" as a valid argument.
+//Returns empty string if everything is okay and an error message if there's a
+//problem. If everything is okay, it also removes the option and its value from
+//arguments.
+QString checkOptionForInt(QString option, QStringList * arguments, IntSetting setting, bool offOkay)
+{
+ int optionIndex = arguments->indexOf(option);
+
+ //If the option isn't found, that's fine.
+ if (optionIndex == -1)
+ return "";
+
+ int integerIndex = optionIndex + 1;
+
+ //If nothing follows the option, that's a problem.
+ if (integerIndex >= arguments->size())
+ return option + " must be followed by an integer";
+
+ //If the thing following the option isn't an integer, that's a problem.
+ bool optionIsInt;
+ int optionInt = arguments->at(integerIndex).toInt(&optionIsInt);
+ bool optionIsOff = arguments->at(integerIndex).toLower() == "off";
+ if (offOkay && !(optionIsInt || optionIsOff))
+ return option + " must be followed by an integer or \"off\"";
+ if (!offOkay && !optionIsInt)
+ return option + " must be followed by an integer";
+
+ //Check the range of the option.
+ if (optionIsInt)
+ {
+ if (optionInt < setting.min || optionInt > setting.max)
+ return "Value of " + option + " must be between "
+ + QString::number(setting.min) + " and " + QString::number(setting.max) +
+ " (inclusive)";
+ }
+
+ //If the code got here, the option and its integer are okay.
+ //Remove them from the arguments.
+ arguments->removeAt(integerIndex);
+ arguments->removeAt(optionIndex);
+
+ return "";
+}
+
+
+//This function checks the value for a float-accepting command line option.
+//If offOkay is true, then it will also accept "off" as a valid argument.
+//Returns empty string if everything is okay and an error message if there's a
+//problem. If everything is okay, it also removes the option and its value from
+//arguments.
+QString checkOptionForFloat(QString option, QStringList * arguments, FloatSetting setting, bool offOkay)
+{
+ int optionIndex = arguments->indexOf(option);
+
+ //If the option isn't found, that's fine.
+ if (optionIndex == -1)
+ return "";
+
+ int floatIndex = optionIndex + 1;
+
+ //If nothing follows the option, that's a problem.
+ if (floatIndex >= arguments->size())
+ return option + " must be followed by a number";
+
+ //If the thing following the option isn't a number, that's a problem.
+ bool optionIsFloat;
+ double optionFloat = arguments->at(floatIndex).toDouble(&optionIsFloat);
+ bool optionIsOff = arguments->at(floatIndex).toLower() == "off";
+ if (offOkay && !(optionIsFloat || optionIsOff))
+ return option + " must be followed by a number or \"off\"";
+ if (!offOkay && !optionIsFloat)
+ return option + " must be followed by a number";
+
+ //Check the range of the option.
+ if (optionIsFloat)
+ {
+ if (optionFloat < setting.min || optionFloat > setting.max)
+ return "Value of " + option + " must be between "
+ + QString::number(setting.min) + " and " + QString::number(setting.max) +
+ " (inclusive)";
+ }
+
+ //If the code got here, the option and its number are okay.
+ //Remove them from the arguments.
+ arguments->removeAt(floatIndex);
+ arguments->removeAt(optionIndex);
+
+ return "";
+}
+
+
+//This function checks the value for a scientific notation-accepting command
+//line option. If offOkay is true, then it will also accept "off" as a valid
+//argument.
+//Returns empty string if everything is okay and an error message if there's a
+//problem. If everything is okay, it also removes the option and its value from
+//arguments.
+QString checkOptionForSciNot(QString option, QStringList * arguments,
+ SciNotSetting setting, bool offOkay)
+{
+ int optionIndex = arguments->indexOf(option);
+
+ //If the option isn't found, that's fine.
+ if (optionIndex == -1)
+ return "";
+
+ int sciNotIndex = optionIndex + 1;
+
+ //If nothing follows the option, that's a problem.
+ if (sciNotIndex >= arguments->size())
+ return option + " must be followed by a number in scientific notation";
+
+ //If the thing following the option isn't a number in scientific notation or
+ //"off", that's a problem.
+ bool optionIsSciNot = SciNot::isValidSciNotString(arguments->at(sciNotIndex));
+ bool optionIsOff = arguments->at(sciNotIndex).toLower() == "off";
+ if (offOkay && !(optionIsSciNot || optionIsOff))
+ return option + " must be followed by a number in scientific notation or \"off\"";
+ if (!offOkay && !optionIsSciNot)
+ return option + " must be followed by a number in scientific notation";
+
+ SciNot optionSciNot = SciNot(arguments->at(sciNotIndex));
+
+ //Check the range of the option.
+ if (optionIsSciNot)
+ {
+ if (optionSciNot < setting.min || optionSciNot > setting.max)
+ return "Value of " + option + " must be between "
+ + setting.min.asString(true) + " and " + setting.max.asString(true) +
+ " (inclusive)";
+ }
+
+ //If the code got here, the option and its number are okay.
+ //Remove them from the arguments.
+ arguments->removeAt(sciNotIndex);
+ arguments->removeAt(optionIndex);
+
+ return "";
+}
+
+
+//Returns empty string if everything is okay and an error
+//message if there's a problem. If everything is okay, it
+//also removes the option and its value from arguments.
+QString checkOptionForString(QString option, QStringList * arguments, QStringList validOptionsList, QString validDescription)
+{
+ int optionIndex = arguments->indexOf(option);
+
+ //If the option isn't found, that's fine.
+ if (optionIndex == -1)
+ return "";
+
+ int stringIndex = optionIndex + 1;
+
+ QString validOptions;
+ for (int i = 0; i < validOptionsList.size(); ++i)
+ {
+ validOptions += validOptionsList.at(i);
+ if (i == validOptionsList.size() - 2)
+ validOptions += " or ";
+ else if (i < validOptionsList.size() - 2)
+ validOptions += ", ";
+ }
+ if (validOptions == "")
+ validOptions = validDescription;
+
+ //If nothing follows the option, that's a problem.
+ if (stringIndex >= arguments->size())
+ return option + " must be followed by " + validOptions;
+
+ //If the thing following the option isn't a valid choice, that's a problem.
+ if (validOptionsList.size() > 0)
+ {
+ QString value = arguments->at(stringIndex);
+ if (!validOptionsList.contains(value, Qt::CaseInsensitive))
+ return option + " must be followed by " + validOptions;
+ }
+
+ //If the code got here, the option and its string are okay.
+ //Remove them from the arguments.
+ arguments->removeAt(stringIndex);
+ arguments->removeAt(optionIndex);
+
+ return "";
+}
+
+
+QString checkOptionForColour(QString option, QStringList * arguments)
+{
+ int optionIndex = arguments->indexOf(option);
+
+ //If the option isn't found, that's fine.
+ if (optionIndex == -1)
+ return "";
+
+ int colIndex = optionIndex + 1;
+
+ //If nothing follows the option, that's a problem.
+ if (colIndex >= arguments->size())
+ return option + " must be followed by a 6-digit hex colour (e.g. #FFB6C1), an 8-digit hex colour (e.g. #7FD2B48C) or a standard colour name (e.g. skyblue)";
+
+ //If the thing following the option isn't a colour, that's a problem.
+ QColor colour(arguments->at(colIndex));
+ if (!colour.isValid())
+ return option + " must be followed by a 6-digit hex colour (e.g. #FFB6C1), an 8-digit hex colour (e.g. #7FD2B48C) or a standard colour name (e.g. skyblue)";
+
+ //If the code got here, the option and its colour are okay.
+ //Remove them from the arguments.
+ arguments->removeAt(colIndex);
+ arguments->removeAt(optionIndex);
+
+ return "";
+}
+
+
+QString checkOptionForFile(QString option, QStringList * arguments)
+{
+ int optionIndex = arguments->indexOf(option);
+
+ //If the option isn't found, that's fine.
+ if (optionIndex == -1)
+ return "";
+
+ int fileIndex = optionIndex + 1;
+
+ //If nothing follows the option, that's a problem.
+ if (fileIndex >= arguments->size())
+ return option + " must be followed by a filename";
+
+ //If the thing that follows the option isn't a file that's a problem
+ if (!checkIfFileExists(arguments->at(fileIndex)))
+ return option + " must be followed by a valid filename";
+
+ //If the code got here, the option and its file are okay.
+ //Remove them from the arguments.
+ arguments->removeAt(fileIndex);
+ arguments->removeAt(optionIndex);
+
+ return "";
+}
+
+
+bool checkIfFileExists(QString filename)
+{
+ QFileInfo checkFile(filename);
+ return (checkFile.exists() && checkFile.isFile());
+}
+
+
+//This function simply removes an option from arguments if it is found.
+void checkOptionWithoutValue(QString option, QStringList * arguments)
+{
+ int optionIndex = arguments->indexOf(option);
+
+ //If the option isn't found, that's fine.
+ if (optionIndex == -1)
+ return ;
+
+ //If the code got here, the option is okay.
+ //Remove it from the arguments.
+ arguments->removeAt(optionIndex);
+}
+
+
+//This function checks to make sure either both or neither of the options
+//are used. It can also optionally check to make sure the second is larger
+//than the first.
+QString checkTwoOptionsForFloats(QString option1, QString option2, QStringList * arguments,
+ FloatSetting setting1, FloatSetting setting2,
+ bool secondMustBeEqualOrLarger)
+{
+ //First check each option independently
+ QStringList argumentsCopy = *arguments;
+ QString option1Error = checkOptionForFloat(option1, &argumentsCopy, setting1, false);
+ if (option1Error != "")
+ return option1Error;
+ QString option2Error = checkOptionForFloat(option2, &argumentsCopy, setting2, false);
+ if (option2Error != "")
+ return option2Error;
+
+ //Now make sure either both or neither are present.
+ if (isOptionPresent(option1, arguments) != isOptionPresent(option2, arguments))
+ return option1 + " and " + option2 + " must be used together";
+
+ if (secondMustBeEqualOrLarger)
+ {
+ if (getFloatOption(option2, arguments) < getFloatOption(option1, arguments))
+ return option2 + " must be greater than or equal to " + option1;
+ }
+
+ //Now remove the options from the arguments before finishing.
+ checkOptionForFloat(option1, arguments, setting1, false);
+ checkOptionForFloat(option2, arguments, setting2, false);
+ return "";
+}
+
+
+
+bool isOptionPresent(QString option, QStringList * arguments)
+{
+ return (arguments->indexOf(option) > -1);
+}
+
+bool isOptionAndValuePresent(QString option, QString value, QStringList * arguments)
+{
+ int optionIndex = arguments->indexOf(option);
+ if (optionIndex == -1)
+ return false;
+
+ int valueIndex = optionIndex + 1;
+ if (valueIndex >= arguments->size())
+ return false;
+
+ QString optionValue = arguments->at(valueIndex);
+ return (optionValue == value);
+}
+
+
+
+int getIntOption(QString option, QStringList * arguments)
+{
+ int optionIndex = arguments->indexOf(option);
+ if (optionIndex == -1)
+ return 0;
+
+ int integerIndex = optionIndex + 1;
+ if (integerIndex >= arguments->size())
+ return 0;
+
+ return arguments->at(integerIndex).toInt();
+}
+
+double getFloatOption(QString option, QStringList * arguments)
+{
+ int optionIndex = arguments->indexOf(option);
+ if (optionIndex == -1)
+ return 0;
+
+ int floatIndex = optionIndex + 1;
+ if (floatIndex >= arguments->size())
+ return 0;
+
+ return arguments->at(floatIndex).toDouble();
+}
+
+
+SciNot getSciNotOption(QString option, QStringList * arguments)
+{
+ int optionIndex = arguments->indexOf(option);
+ if (optionIndex == -1)
+ return 0;
+
+ int sciNotIndex = optionIndex + 1;
+ if (sciNotIndex >= arguments->size())
+ return SciNot();
+
+ return SciNot(arguments->at(sciNotIndex));
+}
+
+NodeColourScheme getColourSchemeOption(QString option, QStringList * arguments)
+{
+ NodeColourScheme defaultScheme = RANDOM_COLOURS;
+ if (isOptionPresent("--query", arguments))
+ defaultScheme = BLAST_HITS_SOLID_COLOUR;
+
+ int optionIndex = arguments->indexOf(option);
+ if (optionIndex == -1)
+ return defaultScheme;
+
+ int colourIndex = optionIndex + 1;
+ if (colourIndex >= arguments->size())
+ return defaultScheme;
+
+ QString colourString = arguments->at(colourIndex).toLower();
+ if (colourString == "random")
+ return RANDOM_COLOURS;
+ else if (colourString == "uniform")
+ return UNIFORM_COLOURS;
+ else if (colourString == "depth")
+ return DEPTH_COLOUR;
+ else if (colourString == "blastsolid")
+ return BLAST_HITS_SOLID_COLOUR;
+ else if (colourString == "blastrainbow")
+ return BLAST_HITS_RAINBOW_COLOUR;
+
+ //Random colours is the default
+ return defaultScheme;
+}
+
+
+GraphScope getGraphScopeOption(QString option, QStringList * arguments)
+{
+ int optionIndex = arguments->indexOf(option);
+ if (optionIndex == -1)
+ return WHOLE_GRAPH;
+
+ int scopeIndex = optionIndex + 1;
+ if (scopeIndex >= arguments->size())
+ return WHOLE_GRAPH;
+
+ QString scopeString = arguments->at(scopeIndex).toLower();
+ if (scopeString == "entire")
+ return WHOLE_GRAPH;
+ else if (scopeString == "aroundnodes")
+ return AROUND_NODE;
+ else if (scopeString == "aroundblast")
+ return AROUND_BLAST_HITS;
+ else if (scopeString == "depthrange")
+ return DEPTH_RANGE;
+
+ //Entire graph scope is the default.
+ return WHOLE_GRAPH;
+}
+
+
+QColor getColourOption(QString option, QStringList * arguments)
+{
+ int optionIndex = arguments->indexOf(option);
+ if (optionIndex == -1)
+ return QColor();
+
+ int colIndex = optionIndex + 1;
+ if (colIndex >= arguments->size())
+ return QColor();
+
+ return QColor(arguments->at(colIndex));
+}
+
+
+QString getStringOption(QString option, QStringList * arguments)
+{
+ int optionIndex = arguments->indexOf(option);
+ if (optionIndex == -1)
+ return "";
+
+ int stringIndex = optionIndex + 1;
+ if (stringIndex >= arguments->size())
+ return "";
+
+ return arguments->at(stringIndex);
+}
+
+
+
+
+
+
+//This function generates an error if excess arguments are left after
+//parsing.
+QString checkForExcessArguments(QStringList arguments)
+{
+ if (arguments.size() == 0)
+ return "";
+
+ QString invalidOptionText = "Invalid option";
+ if (arguments.size() > 1)
+ invalidOptionText += "s";
+ invalidOptionText += ": ";
+ for (int i = 0; i < arguments.size(); ++i)
+ {
+ invalidOptionText += arguments.at(i);
+ if (i < arguments.size() - 1)
+ invalidOptionText += ", ";
+ }
+
+ return invalidOptionText;
+}
+
+
+void getCommonHelp(QStringList * text)
+{
+ *text << "--help View this help message";
+ *text << "--helpall View all command line settings";
+ *text << "--version View Bandage version number";
+ *text << "";
+}
+
+
+
+bool createBlastTempDirectory()
+{
+ //Running from the command line, it makes more sense to put the temp
+ //directory in the current directory.
+ g_blastSearch->m_tempDirectory = "bandage_temp-" + QString::number(QApplication::applicationPid()) + "/";
+
+ if (!QDir().mkdir(g_blastSearch->m_tempDirectory))
+ return false;
+
+ g_blastSearch->m_blastQueries.createTempQueryFiles();
+ return true;
+}
+
+void deleteBlastTempDirectory()
+{
+ if (g_blastSearch->m_tempDirectory != "" &&
+ QDir(g_blastSearch->m_tempDirectory).exists() &&
+ QDir(g_blastSearch->m_tempDirectory).dirName().contains("bandage_temp"))
+ QDir(g_blastSearch->m_tempDirectory).removeRecursively();
+}
+
+
+
+QString getElapsedTime(QDateTime start, QDateTime end)
+{
+ int msecElapsed = start.msecsTo(end);
+ int secElapsed = msecElapsed / 1000;
+ msecElapsed = msecElapsed % 1000;
+ int minElapsed = secElapsed / 60;
+ secElapsed = secElapsed % 60;
+ int hoursElapsed = minElapsed / 60;
+ minElapsed = minElapsed % 60;
+
+ QString msecString = QString("%1").arg(msecElapsed, 2, 10, QChar('0'));
+ QString secString = QString("%1").arg(secElapsed, 2, 10, QChar('0'));
+ QString minString = QString("%1").arg(minElapsed, 2, 10, QChar('0'));
+ QString hourString = QString("%1").arg(hoursElapsed, 2, 10, QChar('0'));
+
+ return hourString + ":" + minString + ":" + secString + "." + msecString;
+}
+
+
+QStringList wrapText(QString text, int width, int firstLineIndent, int laterLineIndent)
+{
+ QStringList returnList;
+
+ QString firstLineSpaces = "";
+ for (int i = 0; i < firstLineIndent; ++i)
+ firstLineSpaces += ' ';
+ QString laterLineSpaces = "";
+ for (int i = 0; i < laterLineIndent; ++i)
+ laterLineSpaces += ' ';
+
+ text = firstLineSpaces + text;
+
+ //If the terminal width is at the minimum, don't bother wrapping.
+ if (g_memory->terminalWidth <= 50)
+ {
+ returnList << text;
+ return returnList;
+ }
+
+ while (text.length() > width)
+ {
+ QString leftString = text.left(width);
+ int spaceIndex = leftString.lastIndexOf(' ');
+ if (spaceIndex < width / 2)
+ spaceIndex = width;
+
+ leftString = text.left(spaceIndex);
+ returnList << rstrip(leftString);
+ text = laterLineSpaces + text.mid(spaceIndex).trimmed();
+ }
+
+ returnList << text;
+ return returnList;
+}
+
+//http://stackoverflow.com/questions/8215303/how-do-i-remove-trailing-whitespace-from-a-qstring
+QString rstrip(const QString& str)
+{
+ int n = str.size() - 1;
+ for (; n >= 0; --n)
+ {
+ if (!str.at(n).isSpace())
+ return str.left(n + 1);
+ }
+ return "";
+}
+
+QString getRangeAndDefault(IntSetting setting) {return (setting.on) ? getRangeAndDefault(setting.min, setting.max, setting.val) : getRangeAndDefault(setting.min, setting.max, "off");}
+QString getRangeAndDefault(IntSetting setting, QString defaultVal) {return getRangeAndDefault(setting.min, setting.max, defaultVal);}
+QString getRangeAndDefault(FloatSetting setting) {return (setting.on) ? getRangeAndDefault(setting.min, setting.max, setting.val) : getRangeAndDefault(setting.min, setting.max, "off");}
+QString getRangeAndDefault(FloatSetting setting, QString defaultVal) {return getRangeAndDefault(setting.min, setting.max, defaultVal);}
+QString getRangeAndDefault(SciNotSetting setting) {return (setting.on) ? getRangeAndDefault(setting.min.asString(true), setting.max.asString(true), setting.val.asString(true)) : getRangeAndDefault(setting.min.asString(true), setting.max.asString(true), "off");}
+QString getRangeAndDefault(int min, int max, int defaultVal) { return getRangeAndDefault(double(min), double(max), QString::number(defaultVal));}
+QString getRangeAndDefault(int min, int max, QString defaultVal) {return getRangeAndDefault(double(min), double(max), defaultVal);}
+QString getRangeAndDefault(double min, double max, double defaultVal) {return getRangeAndDefault(min, max, QString::number(defaultVal));}
+QString getRangeAndDefault(double min, double max, QString defaultVal) {return getRangeAndDefault(QString::number(min), QString::number(max), defaultVal);}
+
+QString getRangeAndDefault(QString min, QString max, QString defaultVal)
+{
+ return "(" + min + " to " + max + ", default: " + defaultVal + ")";
+}
+
+QString getDefaultColour(QColor colour)
+{
+ return "(default: " + getColourName(colour.name()) + ")";
+}
+
+QString getBandageTitleAsciiArt()
+{
+ return " ____ _ \n | _ \\ | | \n | |_) | __ _ _ __ __| | __ _ __ _ ___ \n | _ < / _` | '_ \\ / _` |/ _` |/ _` |/ _ \\\n | |_) | (_| | | | | (_| | (_| | (_| | __/\n |____/ \\__,_|_| |_|\\__,_|\\__,_|\\__, |\\___|\n __/ | \n |___/ ";
+}
+
+bool isOption(QString text)
+{
+ bool option = (text.length() > 2 && text[0] == '-' && text[1] == '-' && text[2] != '-');
+
+ QRegExp rx("^<[\\w_]+>");
+ bool positional = (rx.indexIn(text) != -1);
+
+ return option || positional;
+}
+
+bool isSectionHeader(QString text)
+{
+ //Make an exception:
+ if (text.startsWith("Node widths are determined"))
+ return false;
+
+ QRegExp rx("^[\\w ]+:");
+ return (rx.indexIn(text) != -1);
+}
+
+
+bool isListItem(QString text)
+{
+ return (text.length() > 1 && text[0] == '*' && text[1] == ' ');
+}
+
+bool isCommand(QString text)
+{
+ return text.startsWith("load ") ||
+ text.startsWith("info ") ||
+ text.startsWith("image ") ||
+ text.startsWith("querypaths ") ||
+ text.startsWith("reduce ");
+}
+
+
+bool isError(QString text)
+{
+ return text.startsWith("Bandage error");
+}
+
+void getOnlineHelpMessage(QStringList * text)
+{
+ *text << "Online Bandage help: https://github.com/rrwick/Bandage/wiki";
+ *text << "";
+}
+
diff --git a/command_line/commoncommandlinefunctions.h b/command_line/commoncommandlinefunctions.h
new file mode 100644
index 0000000..6394214
--- /dev/null
+++ b/command_line/commoncommandlinefunctions.h
@@ -0,0 +1,108 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef COMMANDCOMMANDLINEFUNCTIONS_H
+#define COMMANDCOMMANDLINEFUNCTIONS_H
+
+#include "../program/globals.h"
+#include <QString>
+#include <QStringList>
+#include <QColor>
+#include <QTextStream>
+#include "../program/scinot.h"
+#include <QDateTime>
+#include <QStringList>
+#include "../program/settings.h"
+
+QStringList getArgumentList(int argc, char *argv[]);
+
+bool checkForHelp(QStringList arguments);
+bool checkForHelpAll(QStringList arguments);
+bool checkForVersion(QStringList arguments);
+
+QString checkOptionForInt(QString option, QStringList * arguments, IntSetting setting, bool offOkay);
+QString checkOptionForFloat(QString option, QStringList * arguments, FloatSetting setting, bool offOkay);
+QString checkOptionForSciNot(QString option, QStringList * arguments, SciNotSetting setting, bool offOkay);
+QString checkOptionForString(QString option, QStringList * arguments,
+ QStringList validOptionsList,
+ QString validDescription = "");
+QString checkOptionForColour(QString option, QStringList * arguments);
+QString checkOptionForFile(QString option, QStringList * arguments);
+bool checkIfFileExists(QString filename);
+void checkOptionWithoutValue(QString option, QStringList * arguments);
+QString checkTwoOptionsForFloats(QString option1, QString option2,
+ QStringList * arguments,
+ FloatSetting setting1,
+ FloatSetting setting2,
+ bool secondMustBeEqualOrLarger = false);
+
+bool isOptionPresent(QString option, QStringList * arguments);
+bool isOptionAndValuePresent(QString option, QString value,
+ QStringList * arguments);
+
+int getIntOption(QString option, QStringList * arguments);
+double getFloatOption(QString option, QStringList * arguments);
+SciNot getSciNotOption(QString option, QStringList * arguments);
+QColor getColourOption(QString option, QStringList * arguments);
+NodeColourScheme getColourSchemeOption(QString option, QStringList * arguments);
+GraphScope getGraphScopeOption(QString option, QStringList * arguments);
+QString getStringOption(QString option, QStringList * arguments);
+
+QString checkForInvalidOrExcessSettings(QStringList * arguments);
+QString checkForExcessArguments(QStringList arguments);
+
+void parseSettings(QStringList arguments);
+
+void getCommonHelp(QStringList * text);
+void getSettingsUsage(QStringList *text);
+
+bool createBlastTempDirectory();
+void deleteBlastTempDirectory();
+
+QString getElapsedTime(QDateTime start, QDateTime end);
+
+void getGraphScopeOptions(QStringList * text);
+
+QStringList wrapText(QString text, int width, int firstLineIndent, int laterLineIndent);
+QString rstrip(const QString& str);
+
+
+QString getRangeAndDefault(IntSetting setting);
+QString getRangeAndDefault(IntSetting setting, QString defaultVal);
+QString getRangeAndDefault(FloatSetting setting);
+QString getRangeAndDefault(FloatSetting setting, QString defaultVal);
+QString getRangeAndDefault(SciNotSetting setting);
+QString getRangeAndDefault(int min, int max, int defaultVal);
+QString getRangeAndDefault(int min, int max, int defaultVal);
+QString getRangeAndDefault(int min, int max, QString defaultVal);
+QString getRangeAndDefault(double min, double max, double defaultVal);
+QString getRangeAndDefault(double min, double max, QString defaultVal);
+QString getRangeAndDefault(QString min, QString max, QString defaultVal);
+QString getDefaultColour(QColor colour);
+
+QString getBandageTitleAsciiArt();
+bool isOption(QString text);
+bool isSectionHeader(QString text);
+bool isListItem(QString text);
+bool isCommand(QString text);
+bool isError(QString text);
+void outputText(QString text, QTextStream * out);
+void outputText(QStringList text, QTextStream * out);
+void getOnlineHelpMessage(QStringList * text);
+
+#endif // COMMANDCOMMANDLINEFUNCTIONS_H
diff --git a/command_line/image.cpp b/command_line/image.cpp
new file mode 100644
index 0000000..0ded558
--- /dev/null
+++ b/command_line/image.cpp
@@ -0,0 +1,253 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "image.h"
+#include "commoncommandlinefunctions.h"
+#include "../program/globals.h"
+#include "../ui/mygraphicsscene.h"
+#include "../ui/mygraphicsview.h"
+#include "../graph/assemblygraph.h"
+#include <vector>
+#include "../program/settings.h"
+#include <QPainter>
+#include <QSvgGenerator>
+#include <QDir>
+#include "../blast/blastsearch.h"
+
+int bandageImage(QStringList arguments)
+{
+ QTextStream out(stdout);
+ QTextStream err(stderr);
+
+ if (checkForHelp(arguments))
+ {
+ printImageUsage(&out, false);
+ return 0;
+ }
+
+ if (checkForHelpAll(arguments))
+ {
+ printImageUsage(&out, true);
+ return 0;
+ }
+
+ if (arguments.size() < 2)
+ {
+ printImageUsage(&err, false);
+ return 1;
+ }
+
+ QString graphFilename = arguments.at(0);
+ arguments.pop_front();
+
+ if (!checkIfFileExists(graphFilename))
+ {
+ outputText("Bandage error: " + graphFilename + " does not exist", &err);
+ return 1;
+ }
+
+ QString imageSaveFilename = arguments.at(0);
+ arguments.pop_front();
+
+ QString imageFileExtension = imageSaveFilename.right(4);
+ bool pixelImage;
+ if (imageFileExtension == ".png" || imageFileExtension == ".jpg")
+ pixelImage = true;
+ else if (imageFileExtension == ".svg")
+ pixelImage = false;
+ else
+ {
+ outputText("Bandage error: the output filename must end in .png, .jpg or .svg", &err);
+ return 1;
+ }
+
+ QString error = checkForInvalidImageOptions(arguments);
+ if (error.length() > 0)
+ {
+ outputText("Bandage error: " + error, &err);
+ return 1;
+ }
+
+ bool loadSuccess = g_assemblyGraph->loadGraphFromFile(graphFilename);
+ if (!loadSuccess)
+ {
+ outputText("Bandage error: could not load " + graphFilename, &err);
+ return 1;
+ }
+
+ int width = 0;
+ int height = 0;
+
+ //Since frame rate performance doesn't matter for a fixed image, set the
+ //default node outline to a nonzero value.
+ g_settings->outlineThickness = 0.3;
+
+ parseImageOptions(arguments, &width, &height);
+
+ //For Bandage image, it is necessary to position node labels at the
+ //centre of the node, not the visible centre(s). This is because there
+ //is no viewport.
+ g_settings->positionTextNodeCentre = true;
+
+ bool blastUsed = isOptionPresent("--query", &arguments);
+
+ if (blastUsed)
+ {
+ if (!createBlastTempDirectory())
+ {
+ err << "Error creating temporary directory for BLAST files" << endl;
+ return 1;
+ }
+
+ QString blastError = g_blastSearch->doAutoBlastSearch();
+
+ if (blastError != "")
+ {
+ err << blastError << endl;
+ return 1;
+ }
+ }
+
+ QString errorTitle;
+ QString errorMessage;
+ std::vector<DeBruijnNode *> startingNodes = g_assemblyGraph->getStartingNodes(&errorTitle, &errorMessage,
+ g_settings->doubleMode,
+ g_settings->startingNodes,
+ "all");
+
+ if (errorMessage != "")
+ {
+ err << errorMessage << endl;
+ return 1;
+ }
+
+ g_assemblyGraph->buildOgdfGraphFromNodesAndEdges(startingNodes, g_settings->nodeDistance);
+ g_assemblyGraph->layoutGraph();
+
+ MyGraphicsScene scene;
+ g_assemblyGraph->addGraphicsItemsToScene(&scene);
+ scene.setSceneRectangle();
+ double sceneRectAspectRatio = scene.sceneRect().width() / scene.sceneRect().height();
+
+ //Determine image size
+ //If neither height nor width set, use a default of height = 1000.
+ if (height == 0 && width == 0)
+ height = 1000;
+
+ //If only height or width is set, scale the other to fit.
+ if (height > 0 && width == 0)
+ width = height * sceneRectAspectRatio;
+ else if (height == 0 && width > 0)
+ height = width / sceneRectAspectRatio;
+
+ bool success = true;
+ QPainter painter;
+ if (pixelImage)
+ {
+ QImage image(width, height, QImage::Format_ARGB32);
+ image.fill(Qt::white);
+ painter.begin(&image);
+ painter.setRenderHint(QPainter::Antialiasing);
+ painter.setRenderHint(QPainter::TextAntialiasing);
+ scene.render(&painter);
+ success = image.save(imageSaveFilename);
+ painter.end();
+ }
+ else //SVG
+ {
+ QSvgGenerator generator;
+ generator.setFileName(imageSaveFilename);
+ generator.setSize(QSize(width, height));
+ generator.setViewBox(QRect(0, 0, width, height));
+ painter.begin(&generator);
+ painter.fillRect(0, 0, width, height, Qt::white);
+ painter.setRenderHint(QPainter::Antialiasing);
+ painter.setRenderHint(QPainter::TextAntialiasing);
+ scene.render(&painter);
+ painter.end();
+ }
+
+ int returnCode;
+ if (!success)
+ {
+ out << "There was an error writing the image to file." << endl;
+ returnCode = 1;
+ }
+ else
+ returnCode = 0;
+
+ if (blastUsed)
+ deleteBlastTempDirectory();
+
+ return returnCode;
+}
+
+
+void printImageUsage(QTextStream * out, bool all)
+{
+ QStringList text;
+
+ text << "Bandage image will generate an image file of the graph visualisation without opening the GUI.";
+ text << "";
+ text << "Usage: Bandage image <graph> <outputfile> [options]";
+ text << "";
+ text << "Positional parameters:";
+ text << "<graph> A graph file of any type supported by Bandage";
+ text << "<outputfile> The image file to be created (must end in '.jpg', '.png' or '.svg')";
+ text << "";
+ text << "Options: --height <int> Image height (default: 1000)";
+ text << "--width <int> Image width (default: not set)";
+ text << "";
+ text << "If only height or width is set, the other will be determined automatically. If both are set, the image will be exactly that size.";
+ text << "";
+
+ getCommonHelp(&text);
+ if (all)
+ getSettingsUsage(&text);
+ getOnlineHelpMessage(&text);
+
+ outputText(text, out);
+}
+
+QString checkForInvalidImageOptions(QStringList arguments)
+{
+ QString error = checkOptionForInt("--height", &arguments, IntSetting(0, 1, 32767), false);
+ if (error.length() > 0) return error;
+
+ error = checkOptionForInt("--width", &arguments, IntSetting(0, 1, 32767), false);
+ if (error.length() > 0) return error;
+
+ return checkForInvalidOrExcessSettings(&arguments);
+}
+
+
+
+
+//This function parses the command line options. It assumes that the options
+//have already been checked for correctness.
+void parseImageOptions(QStringList arguments, int * width, int * height)
+{
+ if (isOptionPresent("--height", &arguments))
+ *height = getIntOption("--height", &arguments);
+
+ if (isOptionPresent("--width", &arguments))
+ *width = getIntOption("--width", &arguments);
+
+ parseSettings(arguments);
+}
+
diff --git a/command_line/image.h b/command_line/image.h
new file mode 100644
index 0000000..dc990b4
--- /dev/null
+++ b/command_line/image.h
@@ -0,0 +1,32 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef IMAGE_H
+#define IMAGE_H
+
+#include <QStringList>
+#include "../ui/mainwindow.h"
+#include <QTextStream>
+#include <QApplication>
+
+int bandageImage(QStringList arguments);
+void printImageUsage(QTextStream * out, bool all);
+QString checkForInvalidImageOptions(QStringList arguments);
+void parseImageOptions(QStringList arguments, int * width, int * height);
+
+#endif // IMAGE_H
diff --git a/command_line/info.cpp b/command_line/info.cpp
new file mode 100644
index 0000000..b585f64
--- /dev/null
+++ b/command_line/info.cpp
@@ -0,0 +1,210 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "info.h"
+#include "commoncommandlinefunctions.h"
+#include "../graph/assemblygraph.h"
+#include <QPair>
+
+
+
+int bandageInfo(QStringList arguments)
+{
+ QTextStream out(stdout);
+ QTextStream err(stderr);
+
+ if (checkForHelp(arguments))
+ {
+ printInfoUsage(&out, false);
+ return 0;
+ }
+
+ if (checkForHelpAll(arguments))
+ {
+ printInfoUsage(&out, true);
+ return 0;
+ }
+
+ if (arguments.size() < 1)
+ {
+ printInfoUsage(&err, false);
+ return 1;
+ }
+
+ QString graphFilename = arguments.at(0);
+ arguments.pop_front();
+
+ if (!checkIfFileExists(graphFilename))
+ {
+ outputText("Bandage error: " + graphFilename + " does not exist.", &err);
+ return 1;
+ }
+
+ QString error = checkForInvalidInfoOptions(arguments);
+ if (error.length() > 0)
+ {
+ outputText("Bandage error: " + error, &err);
+ return 1;
+ }
+
+ bool tsv;
+ parseInfoOptions(arguments, &tsv);
+
+ bool loadSuccess = g_assemblyGraph->loadGraphFromFile(graphFilename);
+ if (!loadSuccess)
+ {
+ err << "Bandage error: could not load " << graphFilename << endl;
+ return 1;
+ }
+
+ int nodeCount = g_assemblyGraph->m_nodeCount;
+ int edgeCount = g_assemblyGraph->m_edgeCount;
+ QPair<int, int> overlapRange = g_assemblyGraph->getOverlapRange();
+ int smallestOverlap = overlapRange.first;
+ int largestOverlap = overlapRange.second;
+ int totalLength = g_assemblyGraph->m_totalLength;
+ int totalLengthNoOverlaps = g_assemblyGraph->getTotalLengthMinusEdgeOverlaps();
+ int deadEnds = g_assemblyGraph->getDeadEndCount();
+ double percentageDeadEnds = 100.0 * double(deadEnds) / (2 * nodeCount);
+
+ int n50 = 0;
+ int shortestNode = 0;
+ int firstQuartile = 0;
+ int median = 0;
+ int thirdQuartile = 0;
+ int longestNode = 0;
+ g_assemblyGraph->getNodeStats(&n50, &shortestNode, &firstQuartile, &median, &thirdQuartile, &longestNode);
+
+ int componentCount = 0;
+ int largestComponentLength = 0;
+ g_assemblyGraph->getGraphComponentCountAndLargestComponentSize(&componentCount, &largestComponentLength);
+ long long totalLengthOrphanedNodes = g_assemblyGraph->getTotalLengthOrphanedNodes();
+
+ double medianDepthByBase = g_assemblyGraph->getMedianDepthByBase();
+ long long estimatedSequenceLength = g_assemblyGraph->getEstimatedSequenceLength(medianDepthByBase);
+
+ if (tsv)
+ {
+ out << graphFilename << "\t";
+ out << nodeCount << "\t";
+ out << edgeCount << "\t";
+ out << smallestOverlap << "\t";
+ out << largestOverlap << "\t";
+ out << totalLength << "\t";
+ out << totalLengthNoOverlaps << "\t";
+ out << deadEnds << "\t";
+ out << percentageDeadEnds << "%\t";
+ out << componentCount << "\t";
+ out << largestComponentLength << "\t";
+ out << totalLengthOrphanedNodes << "\t";
+ out << n50 << "\t";
+ out << shortestNode << "\t";
+ out << firstQuartile << "\t";
+ out << median << "\t";
+ out << thirdQuartile << "\t";
+ out << longestNode << "\t";
+ out << medianDepthByBase << "\n";
+ out << estimatedSequenceLength << "\n";
+ }
+ else
+ {
+ out << "Node count: " << nodeCount << "\n";
+ out << "Edge count: " << edgeCount << "\n";
+ out << "Smallest edge overlap (bp): " << smallestOverlap << "\n";
+ out << "Largest edge overlap (bp): " << largestOverlap << "\n";
+ out << "Total length (bp): " << totalLength << "\n";
+ out << "Total length no overlaps (bp): " << totalLengthNoOverlaps << "\n";
+ out << "Dead ends: " << deadEnds << "\n";
+ out << "Percentage dead ends: " << percentageDeadEnds << "%\n";
+ out << "Connected components: " << componentCount << "\n";
+ out << "Largest component (bp): " << largestComponentLength << "\n";
+ out << "Total length orphaned nodes (bp): " << largestComponentLength << "\n";
+ out << "N50 (bp): " << n50 << "\n";
+ out << "Shortest node (bp): " << shortestNode << "\n";
+ out << "Lower quartile node (bp): " << firstQuartile << "\n";
+ out << "Median node (bp): " << median << "\n";
+ out << "Upper quartile node (bp): " << thirdQuartile << "\n";
+ out << "Longest node (bp): " << longestNode << "\n";
+ out << "Median depth: " << medianDepthByBase << "\n";
+ out << "Estimated sequence length (bp): " << estimatedSequenceLength << "\n";
+ }
+
+ return 0;
+}
+
+
+
+void printInfoUsage(QTextStream * out, bool all)
+{
+ QStringList text;
+
+ text << "Bandage info takes a graph file as input and outputs (to stdout) the following statistics about the graph:";
+ text << "* Node count: The number of nodes in the graph. Only positive nodes are counted (i.e. each complementary pair counts as one).";
+ text << "* Edge count: The number of edges in the graph. Only one edge in each complementary pair is counted.";
+ text << "* Smallest edge overlap: The smallest overlap size (in bp) for the edges in the graph.";
+ text << "* Largest edge overlap: The smallest overlap size (in bp) for the edges in the graph. For most graphs this will be the same as the smallest edge overlap (i.e. all edges have the same overlap).";
+ text << "* Total length: The total number of base pairs in the graph.";
+ text << "* Total length no overlaps: The total number of base pairs in the graph, subtracting bases that are duplicated in edge overlaps.";
+ text << "* Dead ends: The number of instances where an end of a node does not connect to any other nodes.";
+ text << "* Percentage dead ends: The proportion of possible dead ends. The maximum number of dead ends is twice the number of nodes (occurs when there are no edges), so this value is the number of dead ends divided by twice the node count.";
+ text << "* Connected components: The number of regions of the graph which are disconnected from each other.";
+ text << "* Largest component: The total number of base pairs in the largest connected component.";
+ text << "* N50: Nodes that are this length or greater will collectively add up to at least half of the total length.";
+ text << "* Shortest node: The length of the shortest node in the graph.";
+ text << "* Lower quartile node: The median node length for the shorter half of the nodes.";
+ text << "* Median node: The median node length for the graph.";
+ text << "* Upper quartile node: The median node length for the longer half of the nodes.";
+ text << "* Longest node: The length of the longest node in the graph.";
+ text << "* Median depth: The median depth of the graph, by base.";
+ text << "* Estimated sequence length: An estimate of the total number of bases in the original sequence, calculated by multiplying each node's length (minus overlaps) by its depth relative to the median.";
+ text << "";
+ text << "Usage: Bandage info <graph> [options]";
+ text << "";
+ text << "Positional parameters:";
+ text << "<graph> A graph file of any type supported by Bandage";
+ text << "";
+ text << "Options: --tsv Output the information in a single tab-delimited line starting with the graph file";
+ text << "";
+
+ getCommonHelp(&text);
+ if (all)
+ getSettingsUsage(&text);
+ getOnlineHelpMessage(&text);
+
+ outputText(text, out);
+}
+
+
+
+QString checkForInvalidInfoOptions(QStringList arguments)
+{
+ checkOptionWithoutValue("--tsv", &arguments);
+
+ QString error = checkForInvalidOrExcessSettings(&arguments);
+ if (error.length() > 0) return error;
+
+ return checkForInvalidOrExcessSettings(&arguments);
+}
+
+
+
+void parseInfoOptions(QStringList arguments, bool * tsv)
+{
+ int tsvIndex = arguments.indexOf("--tsv");
+ *tsv = (tsvIndex > -1);
+}
diff --git a/command_line/info.h b/command_line/info.h
new file mode 100644
index 0000000..afa3634
--- /dev/null
+++ b/command_line/info.h
@@ -0,0 +1,31 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef INFO_H
+#define INFO_H
+
+#include <QStringList>
+#include <QTextStream>
+
+
+int bandageInfo(QStringList arguments);
+void printInfoUsage(QTextStream * out, bool all);
+QString checkForInvalidInfoOptions(QStringList arguments);
+void parseInfoOptions(QStringList arguments, bool * tsv);
+
+#endif // INFO_H
diff --git a/command_line/load.cpp b/command_line/load.cpp
new file mode 100644
index 0000000..2d711f6
--- /dev/null
+++ b/command_line/load.cpp
@@ -0,0 +1,113 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "load.h"
+#include "commoncommandlinefunctions.h"
+#include <QApplication>
+
+int bandageLoad(QStringList arguments)
+{
+ QTextStream out(stdout);
+ QTextStream err(stderr);
+
+ if (checkForHelp(arguments))
+ {
+ printLoadUsage(&out, false);
+ return 0;
+ }
+
+ if (checkForHelpAll(arguments))
+ {
+ printLoadUsage(&out, true);
+ return 0;
+ }
+
+ if (arguments.size() == 0)
+ {
+ printLoadUsage(&err, false);
+ return 1;
+ }
+
+ QString filename = arguments.at(0);
+ arguments.pop_front();
+
+ if (!checkIfFileExists(filename))
+ {
+ outputText("Bandage error: " + filename + " does not exist", &err);
+ return 1;
+ }
+
+ QString error = checkForInvalidLoadOptions(arguments);
+ if (error.length() > 0)
+ {
+ outputText("Bandage error: " + error, &err);
+ return 1;
+ }
+
+ bool drawGraph;
+ parseLoadOptions(arguments, &drawGraph);
+
+ MainWindow w(filename, drawGraph);
+ w.show();
+ return QApplication::exec();
+}
+
+
+void printLoadUsage(QTextStream * out, bool all)
+{
+ QStringList text;
+
+ text << "Bandage load will open the Bandage GUI and immediately load the specified graph file.";
+ text << "";
+ text << "Usage: Bandage load <graph> [options]";
+ text << "";
+ text << "Positional parameters:";
+ text << "<graph> A graph file of any type supported by Bandage";
+ text << "";
+ text << "Options: --draw Draw graph after loading";
+ text << "";
+
+ getCommonHelp(&text);
+ if (all)
+ getSettingsUsage(&text);
+ getOnlineHelpMessage(&text);
+
+ outputText(text, out);
+}
+
+
+
+QString checkForInvalidLoadOptions(QStringList arguments)
+{
+ checkOptionWithoutValue("--draw", &arguments);
+
+ QString error = checkForInvalidOrExcessSettings(&arguments);
+ if (error.length() > 0) return error;
+
+ return checkForInvalidOrExcessSettings(&arguments);
+}
+
+
+
+void parseLoadOptions(QStringList arguments, bool * drawGraph)
+{
+ int drawIndex = arguments.indexOf("--draw");
+ *drawGraph = (drawIndex > -1);
+
+ parseSettings(arguments);
+}
diff --git a/command_line/load.h b/command_line/load.h
new file mode 100644
index 0000000..0215c57
--- /dev/null
+++ b/command_line/load.h
@@ -0,0 +1,31 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef LOAD_H
+#define LOAD_H
+
+#include <QStringList>
+#include "../ui/mainwindow.h"
+#include <QTextStream>
+
+int bandageLoad(QStringList arguments);
+void printLoadUsage(QTextStream * out, bool all);
+QString checkForInvalidLoadOptions(QStringList arguments);
+void parseLoadOptions(QStringList arguments, bool *drawGraph);
+
+#endif // LOAD_H
diff --git a/command_line/querypaths.cpp b/command_line/querypaths.cpp
new file mode 100644
index 0000000..b9517d0
--- /dev/null
+++ b/command_line/querypaths.cpp
@@ -0,0 +1,319 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "querypaths.h"
+#include "commoncommandlinefunctions.h"
+#include "../program/settings.h"
+#include "../graph/assemblygraph.h"
+#include "../blast/blastsearch.h"
+#include <QDateTime>
+
+int bandageQueryPaths(QStringList arguments)
+{
+ QTextStream out(stdout);
+ QTextStream err(stderr);
+
+ if (checkForHelp(arguments))
+ {
+ printQueryPathsUsage(&out, false);
+ return 0;
+ }
+
+ if (checkForHelpAll(arguments))
+ {
+ printQueryPathsUsage(&out, true);
+ return 0;
+ }
+
+ if (arguments.size() < 3)
+ {
+ printQueryPathsUsage(&err, false);
+ return 1;
+ }
+
+ QString graphFilename = arguments.at(0);
+ arguments.pop_front();
+ if (!checkIfFileExists(graphFilename))
+ {
+ outputText("Bandage error: " + graphFilename, &err);
+ return 1;
+ }
+
+ QString queriesFilename = arguments.at(0);
+ arguments.pop_front();
+ if (!checkIfFileExists(queriesFilename))
+ {
+ outputText("Bandage error: " + queriesFilename, &err);
+ return 1;
+ }
+ g_settings->blastQueryFilename = queriesFilename;
+
+ //Ensure that the --query option isn't used, as that would overwrite the
+ //queries file that is a positional argument.
+ if (isOptionPresent("--query", &arguments))
+ {
+ err << "Bandage error: the --query option cannot be used with Bandage querypaths." << endl;
+ return 1;
+ }
+
+ QString outputPrefix = arguments.at(0);
+ QString tableFilename = outputPrefix + ".tsv";
+ QString pathFastaFilename = outputPrefix + "_paths.fasta";
+ QString hitsFastaFilename = outputPrefix + "_hits.fasta";
+ arguments.pop_front();
+
+ QString error = checkForInvalidQueryPathsOptions(arguments);
+ if (error.length() > 0)
+ {
+ outputText("Bandage error: " + error, &err);
+ return 1;
+ }
+
+ bool pathFasta = false;
+ bool hitsFasta = false;
+ parseQueryPathsOptions(arguments, &pathFasta, &hitsFasta);
+
+ //Check to make sure the output files don't already exist.
+ QFile tableFile(tableFilename);
+ QFile pathsFile(pathFastaFilename);
+ QFile hitsFile(hitsFastaFilename);
+ if (tableFile.exists())
+ {
+ outputText("Bandage error: " + tableFilename + " already exists.", &err);
+ return 1;
+ }
+ if (pathFasta && pathsFile.exists())
+ {
+ outputText("Bandage error: " + pathFastaFilename + " already exists.", &err);
+ return 1;
+ }
+ if (hitsFasta && hitsFile.exists())
+ {
+ outputText("Bandage error: " + hitsFastaFilename + " already exists.", &err);
+ return 1;
+ }
+
+ QDateTime startTime = QDateTime::currentDateTime();
+
+ out << endl << "(" << QDateTime::currentDateTime().toString("dd MMM yyyy hh:mm:ss") << ") Loading graph... " << flush;
+
+ bool loadSuccess = g_assemblyGraph->loadGraphFromFile(graphFilename);
+ if (!loadSuccess)
+ return 1;
+ out << "done" << endl;
+
+ if (!createBlastTempDirectory())
+ {
+ err << "Error creating temporary directory for BLAST files" << endl;
+ return 1;
+ }
+
+ out << "(" << QDateTime::currentDateTime().toString("dd MMM yyyy hh:mm:ss") << ") Running BLAST search... " << flush;
+ QString blastError = g_blastSearch->doAutoBlastSearch();
+ if (blastError != "")
+ {
+ err << endl << blastError << endl;
+ return 1;
+ }
+ out << "done" << endl;
+ out << "(" << QDateTime::currentDateTime().toString("dd MMM yyyy hh:mm:ss") << ") Saving results... " << flush;
+
+ //Create the table file.
+ tableFile.open(QIODevice::WriteOnly | QIODevice::Text);
+ QTextStream tableOut(&tableFile);
+
+ //Write the TSV header line.
+ tableOut << "Query\t"
+ "Path\t"
+ "Length\t"
+ "Query covered by path\t"
+ "Query covered by hits\t"
+ "Mean hit identity\t"
+ "Total hit mismatches\t"
+ "Total hit gap opens\t"
+ "Relative length\t"
+ "Length discrepancy\t"
+ "E-value product\t";
+
+ //If the user asked for a separate path sequence file, then the last column
+ //will be a reference to that sequence ID. If not, the sequence will go in
+ //the table.
+ if (pathFasta)
+ tableOut << "Sequence ID\n";
+ else
+ tableOut << "Sequence\n";
+
+ //If a path sequence FASTA file is used, these will store the sequences
+ //that will go there.
+ QList<QString> pathSequenceIDs;
+ QList<QByteArray> pathSequences;
+
+ //If a hits sequence FASTA file is used, these will store the sequences
+ //that will go there.
+ QList<QString> hitSequenceIDs;
+ QList<QByteArray> hitSequences;
+
+ for (size_t i = 0; i < g_blastSearch->m_blastQueries.m_queries.size(); ++i)
+ {
+ BlastQuery * query = g_blastSearch->m_blastQueries.m_queries[i];
+ QList<BlastQueryPath> queryPaths = query->getPaths();
+
+ for (int j = 0; j < queryPaths.size(); ++j)
+ {
+ BlastQueryPath queryPath = queryPaths[j];
+ Path path = queryPath.getPath();
+
+ tableOut << query->getName() << "\t";
+ tableOut << path.getString(true) << "\t";
+ tableOut << QString::number(path.getLength()) << "\t";
+ tableOut << QString::number(100.0 * queryPath.getPathQueryCoverage()) << "%\t";
+ tableOut << QString::number(100.0 * queryPath.getHitsQueryCoverage()) << "%\t";
+ tableOut << QString::number(queryPath.getMeanHitPercIdentity()) << "%\t";
+ tableOut << QString::number(queryPath.getTotalHitMismatches()) << "\t";
+ tableOut << QString::number(queryPath.getTotalHitGapOpens()) << "\t";
+ tableOut << QString::number(100.0 * queryPath.getRelativePathLength()) << "%\t";
+ tableOut << queryPath.getAbsolutePathLengthDifferenceString(false) << "\t";
+ tableOut << queryPath.getEvalueProduct().asString(false) << "\t";
+
+ //If we are using a separate file for the path sequences, save the
+ //sequence along with its ID to save later, and store the ID here.
+ //Otherwise, just include the sequence in this table.
+ QByteArray sequence = path.getPathSequence();
+ QString pathSequenceID = query->getName() + "_" + QString::number(j+1);
+ if (pathFasta)
+ {
+ pathSequenceIDs.push_back(pathSequenceID);
+ pathSequences.push_back(sequence);
+ tableOut << pathSequenceID << "\n";
+ }
+ else
+ tableOut << sequence << "\n";
+
+ //If we are also saving the hit sequences, save the hit sequence
+ //along with its ID to save later.
+ if (hitsFasta)
+ {
+ QList<BlastHit *> hits = queryPath.getHits();
+ for (int k = 0; k < hits.size(); ++k)
+ {
+ BlastHit * hit = hits[k];
+ QString hitSequenceID = pathSequenceID + "_" + QString::number(k+1);
+ QByteArray hitSequence = hit->getNodeSequence();
+ hitSequenceIDs.push_back(hitSequenceID);
+ hitSequences.push_back(hitSequence);
+ }
+ }
+ }
+ }
+
+ //Write the path sequence FASTA file, if appropriate.
+ if (pathFasta)
+ {
+ pathsFile.open(QIODevice::WriteOnly | QIODevice::Text);
+ QTextStream pathsOut(&pathsFile);
+
+ for (int i = 0; i < pathSequenceIDs.size(); ++i)
+ {
+ pathsOut << ">" + pathSequenceIDs[i] + "\n";
+ pathsOut << AssemblyGraph::addNewlinesToSequence(pathSequences[i]);
+ }
+ }
+
+ //Write the hits sequence FASTA file, if appropriate.
+ if (hitsFasta)
+ {
+ hitsFile.open(QIODevice::WriteOnly | QIODevice::Text);
+ QTextStream hitsOut(&hitsFile);
+
+ for (int i = 0; i < hitSequenceIDs.size(); ++i)
+ {
+ hitsOut << ">" << hitSequenceIDs[i] << "\n";
+ hitsOut << AssemblyGraph::addNewlinesToSequence(hitSequences[i]);
+ }
+ }
+
+ out << "done" << endl;
+
+ out << endl << "Results: " + tableFilename << endl;
+ if (pathFasta)
+ out << " " + pathFastaFilename << endl;
+ if (hitsFasta)
+ out << " " + hitsFastaFilename << endl;
+
+ out << endl << "Summary: Total BLAST queries: " << g_blastSearch->m_blastQueries.getQueryCount() << endl;
+ out << " Queries with found paths: " << g_blastSearch->m_blastQueries.getQueryCountWithAtLeastOnePath() << endl;
+ out << " Total query paths: " << g_blastSearch->m_blastQueries.getQueryPathCount() << endl;
+
+ out << endl << "Elapsed time: " << getElapsedTime(startTime, QDateTime::currentDateTime()) << endl;
+
+ deleteBlastTempDirectory();
+ return 0;
+}
+
+
+void printQueryPathsUsage(QTextStream * out, bool all)
+{
+ QStringList text;
+
+ text << "Bandage querypaths searches for queries in the graph using BLAST and outputs the results to a tab-delimited file.";
+ text << "";
+ text << "Usage: Bandage querypaths <graph> <queries> <output_prefix> [options]";
+ text << "";
+ text << "Positional parameters:";
+ text << "<graph> A graph file of any type supported by Bandage";
+ text << "<queries> A FASTA file of one or more BLAST queries";
+ text << "<output_prefix> The output file prefix (used to create the '.tsv' output file, and possibly FASTA files as well, depending on options)";
+ text << "";
+ text << "Options: --pathfasta Put all query path sequences in a multi-FASTA file, not in the TSV file";
+ text << "--hitsfasta Produce a multi-FASTA file of all BLAST hits in the query paths";
+ text << "";
+
+ getCommonHelp(&text);
+ if (all)
+ getSettingsUsage(&text);
+ getOnlineHelpMessage(&text);
+
+ outputText(text, out);
+}
+
+
+
+QString checkForInvalidQueryPathsOptions(QStringList arguments)
+{
+ checkOptionWithoutValue("--pathfasta", &arguments);
+ checkOptionWithoutValue("--hitsfasta", &arguments);
+
+ QString error = checkForInvalidOrExcessSettings(&arguments);
+ if (error.length() > 0) return error;
+
+ return checkForInvalidOrExcessSettings(&arguments);
+}
+
+
+
+void parseQueryPathsOptions(QStringList arguments, bool * pathFasta,
+ bool * hitsFasta)
+{
+ int pathFastaIndex = arguments.indexOf("--pathfasta");
+ *pathFasta = (pathFastaIndex > -1);
+
+ int hitsFastaIndex = arguments.indexOf("--hitsfasta");
+ *hitsFasta = (hitsFastaIndex > -1);
+
+ parseSettings(arguments);
+}
diff --git a/command_line/querypaths.h b/command_line/querypaths.h
new file mode 100644
index 0000000..fc51c30
--- /dev/null
+++ b/command_line/querypaths.h
@@ -0,0 +1,34 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef QUERYPATHS_H
+#define QUERYPATHS_H
+
+
+#include <QStringList>
+#include "../ui/mainwindow.h"
+#include <QTextStream>
+#include <QApplication>
+
+int bandageQueryPaths(QStringList arguments);
+void printQueryPathsUsage(QTextStream * out, bool all);
+QString checkForInvalidQueryPathsOptions(QStringList arguments);
+void parseQueryPathsOptions(QStringList arguments, bool *pathFasta,
+ bool * hitsFasta);
+
+#endif // QUERYPATHS_H
diff --git a/command_line/reduce.cpp b/command_line/reduce.cpp
new file mode 100644
index 0000000..acf7527
--- /dev/null
+++ b/command_line/reduce.cpp
@@ -0,0 +1,168 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "reduce.h"
+#include "commoncommandlinefunctions.h"
+#include "../program/globals.h"
+#include "../ui/mygraphicsscene.h"
+#include "../ui/mygraphicsview.h"
+#include "../graph/assemblygraph.h"
+#include <vector>
+#include "../program/settings.h"
+#include <QPainter>
+#include <QSvgGenerator>
+#include <QDir>
+#include "../blast/blastsearch.h"
+
+int bandageReduce(QStringList arguments)
+{
+ QTextStream out(stdout);
+ QTextStream err(stderr);
+
+ if (checkForHelp(arguments))
+ {
+ printReduceUsage(&out, false);
+ return 0;
+ }
+
+ if (checkForHelpAll(arguments))
+ {
+ printReduceUsage(&out, true);
+ return 0;
+ }
+
+ if (arguments.size() < 2)
+ {
+ printReduceUsage(&err, false);
+ return 1;
+ }
+
+ QString inputFilename = arguments.at(0);
+ arguments.pop_front();
+
+ if (!checkIfFileExists(inputFilename))
+ {
+ outputText("Bandage error: " + inputFilename + " does not exist", &err);
+ return 1;
+ }
+
+ QString outputFilename = arguments.at(0);
+ arguments.pop_front();
+ if (!outputFilename.endsWith(".gfa"))
+ outputFilename += ".gfa";
+
+ QString error = checkForInvalidReduceOptions(arguments);
+ if (error.length() > 0)
+ {
+ outputText("Bandage error: " + error, &err);
+ return 1;
+ }
+
+ bool loadSuccess = g_assemblyGraph->loadGraphFromFile(inputFilename);
+ if (!loadSuccess)
+ {
+ outputText("Bandage error: could not load " + inputFilename, &err);
+ return 1;
+ }
+
+ parseSettings(arguments);
+
+ bool blastUsed = isOptionPresent("--query", &arguments);
+ if (blastUsed)
+ {
+ if (!createBlastTempDirectory())
+ {
+ err << "Error creating temporary directory for BLAST files" << endl;
+ return 1;
+ }
+
+ QString blastError = g_blastSearch->doAutoBlastSearch();
+
+ if (blastError != "")
+ {
+ err << blastError << endl;
+ return 1;
+ }
+ }
+
+ QString errorTitle;
+ QString errorMessage;
+ std::vector<DeBruijnNode *> startingNodes = g_assemblyGraph->getStartingNodes(&errorTitle, &errorMessage,
+ g_settings->doubleMode,
+ g_settings->startingNodes,
+ "all");
+
+ if (errorMessage != "")
+ {
+ err << errorMessage << endl;
+ return 1;
+ }
+
+ g_assemblyGraph->buildOgdfGraphFromNodesAndEdges(startingNodes, g_settings->nodeDistance);
+
+ bool success = g_assemblyGraph->saveVisibleGraphToGfa(outputFilename);
+ if (!success)
+ {
+ err << "Bandage was unable to save the graph file." << endl;
+ return 1;
+ }
+
+ return 0;
+}
+
+
+void printReduceUsage(QTextStream * out, bool all)
+{
+ QStringList text;
+
+ text << "Bandage reduce takes an input graph and saves a reduced subgraph using the graph scope settings. The saved graph will be in GFA format.";
+ text << "";
+ text << "If a graph scope is not specified, then the 'entire' scope will be used, in which case this will simply convert the input graph to GFA format.";
+ text << "";
+ text << "Usage: Bandage reduce <inputgraph> <outputgraph> [options]";
+ text << "";
+ text << "Positional parameters:";
+ text << "<inputgraph> A graph file of any type supported by Bandage";
+ text << "<outputgraph> The filename for the GFA graph to be made (if it does not end in '.gfa', that extension will be added)";
+ text << "";
+
+ int nextLineIndex = text.size();
+ getCommonHelp(&text);
+ text[nextLineIndex] = "Options: " + text[nextLineIndex];
+
+ if (all)
+ getSettingsUsage(&text);
+ else
+ {
+ nextLineIndex = text.size();
+ getGraphScopeOptions(&text);
+ text[nextLineIndex] = "Settings: " + text[nextLineIndex];
+ }
+ text << "";
+ getOnlineHelpMessage(&text);
+
+ outputText(text, out);
+}
+
+
+
+QString checkForInvalidReduceOptions(QStringList arguments)
+{
+ return checkForInvalidOrExcessSettings(&arguments);
+}
+
diff --git a/command_line/reduce.h b/command_line/reduce.h
new file mode 100644
index 0000000..236e748
--- /dev/null
+++ b/command_line/reduce.h
@@ -0,0 +1,33 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef REDUCE_H
+#define REDUCE_H
+
+#include <QStringList>
+#include "../ui/mainwindow.h"
+#include <QTextStream>
+#include <QApplication>
+
+int bandageReduce(QStringList arguments);
+void printReduceUsage(QTextStream * out, bool all);
+QString checkForInvalidReduceOptions(QStringList arguments);
+void parseReduceOptions(QStringList arguments, int * width, int * height);
+
+#endif // REDUCE_H
+
diff --git a/graph/assemblygraph.cpp b/graph/assemblygraph.cpp
new file mode 100644
index 0000000..a27b793
--- /dev/null
+++ b/graph/assemblygraph.cpp
@@ -0,0 +1,3771 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "assemblygraph.h"
+#include <QMapIterator>
+#include "../program/globals.h"
+#include "../program/settings.h"
+#include <limits>
+#include <algorithm>
+#include "../graph/debruijnnode.h"
+#include "../graph/debruijnedge.h"
+#include "../graph/graphicsitemnode.h"
+#include <QFile>
+#include <QTextStream>
+#include <QApplication>
+#include "../graph/graphicsitemedge.h"
+#include "../blast/blastsearch.h"
+#include "../ogdf/energybased/FMMMLayout.h"
+#include "../program/graphlayoutworker.h"
+#include "../program/memory.h"
+#include "path.h"
+#include "../ui/myprogressdialog.h"
+#include <limits>
+#include <QSet>
+#include <QQueue>
+#include <QList>
+#include <math.h>
+#include <QFileInfo>
+#include <QDir>
+#include "ogdfnode.h"
+#include "../command_line/commoncommandlinefunctions.h"
+
+AssemblyGraph::AssemblyGraph() :
+ m_kmer(0), m_contiguitySearchDone(false),
+ m_sequencesLoadedFromFasta(NOT_READY)
+{
+ m_ogdfGraph = new ogdf::Graph();
+ m_edgeArray = new ogdf::EdgeArray<double>(*m_ogdfGraph);
+ m_graphAttributes = new ogdf::GraphAttributes(*m_ogdfGraph, ogdf::GraphAttributes::nodeGraphics |
+ ogdf::GraphAttributes::edgeGraphics);
+ clearGraphInfo();
+}
+
+AssemblyGraph::~AssemblyGraph()
+{
+ delete m_graphAttributes;
+ delete m_edgeArray;
+ delete m_ogdfGraph;
+}
+
+
+void AssemblyGraph::cleanUp()
+{
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ delete i.value();
+ }
+ m_deBruijnGraphNodes.clear();
+
+ QMapIterator<QPair<DeBruijnNode*, DeBruijnNode*>, DeBruijnEdge*> j(m_deBruijnGraphEdges);
+ while (j.hasNext())
+ {
+ j.next();
+ delete j.value();
+ }
+ m_deBruijnGraphEdges.clear();
+
+ m_contiguitySearchDone = false;
+
+ clearGraphInfo();
+}
+
+
+
+
+
+//This function makes a double edge: in one direction for the given nodes
+//and the opposite direction for their reverse complements. It adds the
+//new edges to the vector here and to the nodes themselves.
+void AssemblyGraph::createDeBruijnEdge(QString node1Name, QString node2Name,
+ int overlap, EdgeOverlapType overlapType)
+{
+ QString node1Opposite = getOppositeNodeName(node1Name);
+ QString node2Opposite = getOppositeNodeName(node2Name);
+
+ //Quit if any of the nodes don't exist.
+ if (!m_deBruijnGraphNodes.contains(node1Name) ||
+ !m_deBruijnGraphNodes.contains(node2Name) ||
+ !m_deBruijnGraphNodes.contains(node1Opposite) ||
+ !m_deBruijnGraphNodes.contains(node2Opposite))
+ return;
+
+ DeBruijnNode * node1 = m_deBruijnGraphNodes[node1Name];
+ DeBruijnNode * node2 = m_deBruijnGraphNodes[node2Name];
+ DeBruijnNode * negNode1 = m_deBruijnGraphNodes[node1Opposite];
+ DeBruijnNode * negNode2 = m_deBruijnGraphNodes[node2Opposite];
+
+ //Quit if the edge already exists
+ const std::vector<DeBruijnEdge *> * edges = node1->getEdgesPointer();
+ for (size_t i = 0; i < edges->size(); ++i)
+ {
+ if ((*edges)[i]->getStartingNode() == node1 &&
+ (*edges)[i]->getEndingNode() == node2)
+ return;
+ }
+
+ //Usually, an edge has a different pair, but it is possible
+ //for an edge to be its own pair.
+ bool isOwnPair = (node1 == negNode2 && node2 == negNode1);
+
+ DeBruijnEdge * forwardEdge = new DeBruijnEdge(node1, node2);
+ DeBruijnEdge * backwardEdge;
+
+ if (isOwnPair)
+ backwardEdge = forwardEdge;
+ else
+ backwardEdge = new DeBruijnEdge(negNode2, negNode1);
+
+ forwardEdge->setReverseComplement(backwardEdge);
+ backwardEdge->setReverseComplement(forwardEdge);
+
+ forwardEdge->setOverlap(overlap);
+ backwardEdge->setOverlap(overlap);
+ forwardEdge->setOverlapType(overlapType);
+ backwardEdge->setOverlapType(overlapType);
+
+ m_deBruijnGraphEdges.insert(QPair<DeBruijnNode*, DeBruijnNode*>(forwardEdge->getStartingNode(), forwardEdge->getEndingNode()), forwardEdge);
+ if (!isOwnPair)
+ m_deBruijnGraphEdges.insert(QPair<DeBruijnNode*, DeBruijnNode*>(backwardEdge->getStartingNode(), backwardEdge->getEndingNode()), backwardEdge);
+
+ node1->addEdge(forwardEdge);
+ node2->addEdge(forwardEdge);
+ negNode1->addEdge(backwardEdge);
+ negNode2->addEdge(backwardEdge);
+}
+
+
+
+
+void AssemblyGraph::clearOgdfGraphAndResetNodes()
+{
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ i.value()->resetNode();
+ }
+
+ m_ogdfGraph->clear();
+ m_edgeArray->init(*m_ogdfGraph);
+}
+
+
+
+
+
+
+//http://www.code10.info/index.php?option=com_content&view=article&id=62:articledna-reverse-complement&catid=49:cat_coding_algorithms_bioinformatics&Itemid=74
+QByteArray AssemblyGraph::getReverseComplement(QByteArray forwardSequence)
+{
+ QByteArray reverseComplement;
+
+ for (int i = forwardSequence.length() - 1; i >= 0; --i)
+ {
+ char letter = forwardSequence.at(i);
+
+ switch (letter)
+ {
+ case 'A': reverseComplement.append('T'); break;
+ case 'T': reverseComplement.append('A'); break;
+ case 'G': reverseComplement.append('C'); break;
+ case 'C': reverseComplement.append('G'); break;
+ case 'a': reverseComplement.append('t'); break;
+ case 't': reverseComplement.append('a'); break;
+ case 'g': reverseComplement.append('c'); break;
+ case 'c': reverseComplement.append('g'); break;
+ case 'R': reverseComplement.append('Y'); break;
+ case 'Y': reverseComplement.append('R'); break;
+ case 'S': reverseComplement.append('S'); break;
+ case 'W': reverseComplement.append('W'); break;
+ case 'K': reverseComplement.append('M'); break;
+ case 'M': reverseComplement.append('K'); break;
+ case 'r': reverseComplement.append('y'); break;
+ case 'y': reverseComplement.append('r'); break;
+ case 's': reverseComplement.append('s'); break;
+ case 'w': reverseComplement.append('w'); break;
+ case 'k': reverseComplement.append('m'); break;
+ case 'm': reverseComplement.append('k'); break;
+ case 'B': reverseComplement.append('V'); break;
+ case 'D': reverseComplement.append('H'); break;
+ case 'H': reverseComplement.append('D'); break;
+ case 'V': reverseComplement.append('B'); break;
+ case 'b': reverseComplement.append('v'); break;
+ case 'd': reverseComplement.append('h'); break;
+ case 'h': reverseComplement.append('d'); break;
+ case 'v': reverseComplement.append('b'); break;
+ case 'N': reverseComplement.append('N'); break;
+ case 'n': reverseComplement.append('n'); break;
+ case '.': reverseComplement.append('.'); break;
+ case '-': reverseComplement.append('-'); break;
+ case '?': reverseComplement.append('?'); break;
+ case '*': reverseComplement.append('*'); break;
+ }
+ }
+
+ return reverseComplement;
+}
+
+
+
+
+void AssemblyGraph::resetEdges()
+{
+ QMapIterator<QPair<DeBruijnNode*, DeBruijnNode*>, DeBruijnEdge*> i(m_deBruijnGraphEdges);
+ while (i.hasNext())
+ {
+ i.next();
+ i.value()->reset();
+ }
+}
+
+
+double AssemblyGraph::getMeanDepth(bool drawnNodesOnly)
+{
+ long double depthSum = 0.0;
+ long long totalLength = 0;
+
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ DeBruijnNode * node = i.value();
+
+ if (drawnNodesOnly && node->isNotDrawn())
+ continue;
+
+ totalLength += node->getLength();
+ depthSum += node->getLength() * node->getDepth();
+ }
+
+ if (totalLength == 0)
+ return 0.0;
+ else
+ return depthSum / totalLength;
+}
+
+
+double AssemblyGraph::getMeanDepth(std::vector<DeBruijnNode *> nodes)
+{
+ if (nodes.size() == 0)
+ return 0.0;
+
+ if (nodes.size() == 1)
+ return nodes[0]->getDepth();
+
+ int nodeCount = 0;
+ long double depthSum = 0.0;
+ long long totalLength = 0;
+
+ for (size_t i = 0; i < nodes.size(); ++i)
+ {
+ DeBruijnNode * node = nodes[i];
+ ++nodeCount;
+ totalLength += node->getLength();
+ depthSum += node->getLength() * node->getDepth();
+ }
+
+ //If the total length is zero, that means all nodes have a length of zero.
+ //In this case, just return the average node depth.
+ if (totalLength == 0)
+ {
+ long double depthSum = 0.0;
+ for (size_t i = 0; i < nodes.size(); ++i)
+ depthSum += nodes[i]->getDepth();
+ return depthSum / nodes.size();
+ }
+
+ return depthSum / totalLength;
+}
+
+
+double AssemblyGraph::getMeanDepth(QList<DeBruijnNode *> nodes)
+{
+ int nodeCount = 0;
+ long double depthSum = 0.0;
+ long long totalLength = 0;
+
+ for (int i = 0; i < nodes.size(); ++i)
+ {
+ DeBruijnNode * node = nodes[i];
+ ++nodeCount;
+ totalLength += node->getLength();
+ depthSum += node->getLength() * node->getDepth();
+ }
+
+ if (totalLength == 0)
+ return 0.0;
+ else
+ return depthSum / totalLength;
+}
+
+
+void AssemblyGraph::resetNodeContiguityStatus()
+{
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ i.value()->resetContiguityStatus();
+ }
+ m_contiguitySearchDone = false;
+
+ resetAllNodeColours();
+}
+
+void AssemblyGraph::resetAllNodeColours()
+{
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ if (i.value()->getGraphicsItemNode() != 0)
+ i.value()->getGraphicsItemNode()->setNodeColour();
+ }
+}
+
+void AssemblyGraph::clearAllBlastHitPointers()
+{
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ i.value()->clearBlastHits();
+ }
+}
+
+void AssemblyGraph::determineGraphInfo()
+{
+ m_shortestContig = std::numeric_limits<long long>::max();
+ m_longestContig = 0;
+ int nodeCount = 0;
+ long long totalLength = 0;
+ std::vector<double> nodeDepths;
+
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ long long nodeLength = i.value()->getLength();
+
+ if (nodeLength < m_shortestContig)
+ m_shortestContig = nodeLength;
+ if (nodeLength > m_longestContig)
+ m_longestContig = nodeLength;
+
+ //Only add up the length for positive nodes
+ if (i.value()->isPositiveNode())
+ {
+ totalLength += nodeLength;
+ ++nodeCount;
+ }
+
+ nodeDepths.push_back(i.value()->getDepth());
+ }
+
+ //Count up the edges that will be shown in single mode (i.e. positive
+ //edges).
+ int edgeCount = 0;
+ QMapIterator<QPair<DeBruijnNode*, DeBruijnNode*>, DeBruijnEdge*> j(m_deBruijnGraphEdges);
+ while (j.hasNext())
+ {
+ j.next();
+ DeBruijnEdge * edge = j.value();
+ if (edge->isPositiveEdge())
+ ++edgeCount;
+ }
+
+ m_nodeCount = nodeCount;
+ m_edgeCount = edgeCount;
+ m_totalLength = totalLength;
+ m_meanDepth = getMeanDepth();
+
+ std::sort(nodeDepths.begin(), nodeDepths.end());
+
+ double firstQuartileIndex = (nodeDepths.size() - 1) / 4.0;
+ double medianIndex = (nodeDepths.size() - 1) / 2.0;
+ double thirdQuartileIndex = (nodeDepths.size() - 1) * 3.0 / 4.0;
+
+ m_firstQuartileDepth = getValueUsingFractionalIndex(&nodeDepths, firstQuartileIndex);
+ m_medianDepth = getValueUsingFractionalIndex(&nodeDepths, medianIndex);
+ m_thirdQuartileDepth = getValueUsingFractionalIndex(&nodeDepths, thirdQuartileIndex);
+
+ //Set the auto node length setting. This is determined by aiming for a
+ //target average node length. But if the graph is small, the value will be
+ //increased (to avoid having an overly small and simple graph layout).
+ double targetDrawnGraphLength = std::max(m_nodeCount * g_settings->meanNodeLength,
+ g_settings->minTotalGraphLength);
+ double megabases = totalLength / 1000000.0;
+ if (megabases > 0.0)
+ g_settings->autoNodeLengthPerMegabase = targetDrawnGraphLength / megabases;
+ else
+ g_settings->autoNodeLengthPerMegabase = 10000.0;
+}
+
+template<typename T> double AssemblyGraph::getValueUsingFractionalIndex(std::vector<T> * v, double index) const
+{
+ if (v->size() == 0)
+ return 0.0;
+ if (v->size() == 1)
+ return double((*v)[0]);
+
+ int wholePart = floor(index);
+
+ if (wholePart < 0)
+ return double((*v)[0]);
+ if (wholePart >= int(v->size()) - 1)
+ return double((*v)[v->size() - 1]);
+
+ double fractionalPart = index - wholePart;
+
+ double piece1 = double((*v)[wholePart]);
+ double piece2 = double((*v)[wholePart+1]);
+
+ return piece1 * (1.0 - fractionalPart) + piece2 * fractionalPart;
+}
+
+
+
+void AssemblyGraph::clearGraphInfo()
+{
+ m_totalLength = 0;
+ m_shortestContig = 0;
+ m_longestContig = 0;
+
+ m_meanDepth = 0.0;
+ m_firstQuartileDepth = 0.0;
+ m_medianDepth = 0.0;
+ m_thirdQuartileDepth = 0.0;
+}
+
+
+
+
+
+
+void AssemblyGraph::buildDeBruijnGraphFromLastGraph(QString fullFileName)
+{
+ m_graphFileType = LAST_GRAPH;
+ m_filename = fullFileName;
+ m_depthTag = "KC";
+
+ bool firstLine = true;
+ QFile inputFile(fullFileName);
+ if (inputFile.open(QIODevice::ReadOnly))
+ {
+ QTextStream in(&inputFile);
+ while (!in.atEnd())
+ {
+ QApplication::processEvents();
+ QString line = in.readLine();
+
+ if (firstLine)
+ {
+ QStringList firstLineParts = line.split(QRegExp("\\s+"));
+ if (firstLineParts.size() > 2)
+ m_kmer = firstLineParts[2].toInt();
+ firstLine = false;
+ }
+
+ if (line.startsWith("NODE"))
+ {
+ QStringList nodeDetails = line.split(QRegExp("\\s+"));
+
+ if (nodeDetails.size() < 4)
+ throw "load error";
+
+ QString nodeName = nodeDetails.at(1);
+ QString posNodeName = nodeName + "+";
+ QString negNodeName = nodeName + "-";
+
+ int nodeLength = nodeDetails.at(2).toInt();
+
+ double nodeDepth;
+ if (nodeLength > 0)
+ nodeDepth = double(nodeDetails.at(3).toInt()) / nodeLength; //IS THIS COLUMN ($COV_SHORT1) THE BEST ONE TO USE?
+ else
+ nodeDepth = double(nodeDetails.at(3).toInt());
+
+ QByteArray sequence = in.readLine().toLocal8Bit();
+ QByteArray revCompSequence = in.readLine().toLocal8Bit();
+
+ DeBruijnNode * node = new DeBruijnNode(posNodeName, nodeDepth, sequence);
+ DeBruijnNode * reverseComplementNode = new DeBruijnNode(negNodeName, nodeDepth, revCompSequence);
+ node->setReverseComplement(reverseComplementNode);
+ reverseComplementNode->setReverseComplement(node);
+ m_deBruijnGraphNodes.insert(posNodeName, node);
+ m_deBruijnGraphNodes.insert(negNodeName, reverseComplementNode);
+ }
+
+ //ARC lines contain edges.
+ else if (line.startsWith("ARC"))
+ {
+ QStringList arcDetails = line.split(QRegExp("\\s+"));
+
+ if (arcDetails.size() < 3)
+ throw "load error";
+
+ QString node1Name = convertNormalNumberStringToBandageNodeName(arcDetails.at(1));
+ QString node2Name = convertNormalNumberStringToBandageNodeName(arcDetails.at(2));
+
+ createDeBruijnEdge(node1Name, node2Name);
+ }
+
+ //NR lines occur after ARC lines, so we can quit looking when we see one.
+ else if (line.startsWith("NR"))
+ break;
+ }
+ inputFile.close();
+
+ setAllEdgesExactOverlap(0);
+ }
+
+ if (m_deBruijnGraphNodes.size() == 0)
+ throw "load error";
+}
+
+
+//This function takes a normal number string like "5" or "-6" and changes
+//it to "5+" or "6-" - the format of Bandage node names.
+QString AssemblyGraph::convertNormalNumberStringToBandageNodeName(QString number)
+{
+ if (number.at(0) == '-')
+ {
+ number.remove(0, 1);
+ return number + "-";
+ }
+ else
+ return number + "+";
+}
+
+
+
+//This function loads a graph from a GFA file. It reports whether or not it
+//encountered an unsupported CIGAR string, whether the GFA has custom labels
+//and whether it has custom colours.
+void AssemblyGraph::buildDeBruijnGraphFromGfa(QString fullFileName, bool *unsupportedCigar,
+ bool *customLabels, bool *customColours, QString *bandageOptionsError)
+{
+ m_graphFileType = GFA;
+ m_filename = fullFileName;
+
+ *unsupportedCigar = false;
+ *customLabels = false;
+ *customColours = false;
+ *bandageOptionsError = "";
+
+ QFile inputFile(fullFileName);
+ if (inputFile.open(QIODevice::ReadOnly)) {
+ std::vector<QString> edgeStartingNodeNames;
+ std::vector<QString> edgeEndingNodeNames;
+ std::vector<int> edgeOverlaps;
+
+ QMap<QString, QColor> colours;
+ QMap<QString, QString> labels;
+
+ QTextStream in(&inputFile);
+ while (!in.atEnd()) {
+ QApplication::processEvents();
+ QString line = in.readLine();
+
+ QStringList lineParts = line.split(QRegExp("\t"));
+
+ if (lineParts.size() < 1)
+ continue;
+
+ //Lines beginning with "H" are header lines.
+ if (lineParts.at(0) == "H") {
+
+ // Check for a tag containing Bandage options.
+ for (int i = 1; i < lineParts.size(); ++i) {
+ QString part = lineParts.at(i);
+ if (part.size() < 6)
+ continue;
+ if (part.left(5) != "bn:Z:")
+ continue;
+ QString bandageOptionsString = part.right(part.length() - 5);
+ QStringList bandageOptions = bandageOptionsString.split(' ', QString::SkipEmptyParts);
+ QStringList bandageOptionsCopy = bandageOptions;
+ *bandageOptionsError = checkForInvalidOrExcessSettings(&bandageOptionsCopy);
+ if (bandageOptionsError->length() == 0)
+ parseSettings(bandageOptions);
+ }
+ }
+
+ //Lines beginning with "S" are sequence (node) lines.
+ if (lineParts.at(0) == "S") {
+ if (lineParts.size() < 3)
+ throw "load error";
+
+ QString nodeName = lineParts.at(1);
+ if (nodeName.isEmpty())
+ nodeName = "node";
+
+ QByteArray sequence = lineParts.at(2).toLocal8Bit();
+
+ //Get the tags.
+ bool kcFound = false, rcFound = false, fcFound = false, dpFound = false;
+ double kc = 0.0, rc = 0.0, fc = 0.0, dp = 0.0;
+ int ln = 0;
+ QString lb, l2;
+ QColor cl, c2;
+ for (int i = 3; i < lineParts.size(); ++i) {
+ QString part = lineParts.at(i);
+ if (part.size() < 6)
+ continue;
+ if (part.at(2) != ':')
+ continue;
+ QString tag = part.left(2).toUpper();
+ QString valString = part.right(part.length() - 5);
+ if (tag == "KC") {
+ kcFound = true;
+ kc = valString.toDouble();
+ }
+ if (tag == "RC") {
+ rcFound = true;
+ rc = valString.toDouble();
+ }
+ if (tag == "FC") {
+ fcFound = true;
+ fc = valString.toDouble();
+ }
+ if (tag == "DP") {
+ dpFound = true;
+ dp = valString.toDouble();
+ }
+ if (tag == "LN")
+ ln = valString.toInt();
+ if (tag == "LB")
+ lb = valString;
+ if (tag == "CL")
+ cl = QColor(valString);
+ if (tag == "L2")
+ l2 = valString;
+ if (tag == "C2")
+ c2 = QColor(valString);
+ }
+
+ //GFA can use * to indicate that the sequence is not in the
+ //file. In this case, try to use the LN tag for length. If
+ //that's not available, use a length of 0.
+ //If there is a sequence, then the LN tag will be ignored.
+ int length;
+ if (sequence == "*" || sequence == "") {
+ length = ln;
+ sequence = "";
+ }
+ else
+ length = sequence.length();
+
+ //If there is an attribute holding the depth, we'll use that.
+ //If there isn't, then we'll use 1.0.
+ //We try to load 'DP' (depth), 'KC' (k-mer count), 'RC'
+ //(read count) or 'FC'(fragment count) in that order of
+ //preference.
+ //If we use KC, RC or FC for the depth, then that is really a
+ //count, so we need to divide by the sequence length to get the
+ //depth.
+ //We also remember which tag was used so if the graph is saved
+ //we can use the same tag in the output.
+ double nodeDepth = 1.0;
+ if (dpFound) {
+ m_depthTag = "DP";
+ nodeDepth = dp;
+ }
+ else if (kcFound) {
+ m_depthTag = "KC";
+ if (length > 0)
+ nodeDepth = kc / length;
+ }
+ else if (rcFound) {
+ m_depthTag = "RC";
+ if (length > 0)
+ nodeDepth = rc / length;
+ }
+ else if (fcFound) {
+ m_depthTag = "FC";
+ if (length > 0)
+ nodeDepth = fc / length;
+ }
+
+ //We check to see if the node ended in a "+" or "-".
+ //If so, we assume that is giving the orientation and leave it.
+ //And if it doesn't end in a "+" or "-", we assume "+" and add
+ //that to the node name.
+ QString lastChar = nodeName.right(1);
+ if (lastChar != "+" && lastChar != "-")
+ nodeName += "+";
+
+ // Canu nodes start with "tig" which we can remove for simplicity.
+ nodeName = simplifyCanuNodeName(nodeName);
+
+ //Save custom colours and labels to be applied later, after
+ //reverse complement nodes are built.
+ if (cl.isValid()) {
+ *customColours = true;
+ colours.insert(nodeName, cl);
+ }
+ if (c2.isValid()) {
+ *customColours = true;
+ colours.insert(getOppositeNodeName(nodeName), c2);
+ }
+ if (!lb.isEmpty()) {
+ *customLabels = true;
+ labels.insert(nodeName, lb);
+ }
+ if (!l2.isEmpty()) {
+ *customLabels = true;
+ labels.insert(getOppositeNodeName(nodeName), l2);
+ }
+
+ DeBruijnNode * node = new DeBruijnNode(nodeName, nodeDepth, sequence, length);
+ m_deBruijnGraphNodes.insert(nodeName, node);
+ }
+
+ //Lines beginning with "L" are link (edge) lines
+ else if (lineParts.at(0) == "L") {
+ //Edges aren't made now, in case their sequence hasn't yet been specified.
+ //Instead, we save the starting and ending nodes and make the edges after
+ //we're done looking at the file.
+
+ if (lineParts.size() < 6)
+ throw "load error";
+
+ //Parts 1 and 3 hold the node names and parts 2 and 4 hold the corresponding +/-.
+ QString startingNode = lineParts.at(1) + lineParts.at(2);
+ QString endingNode = lineParts.at(3) + lineParts.at(4);
+ startingNode = simplifyCanuNodeName(startingNode);
+ endingNode = simplifyCanuNodeName(endingNode);
+ edgeStartingNodeNames.push_back(startingNode);
+ edgeEndingNodeNames.push_back(endingNode);
+
+ //Part 5 holds the node overlap cigar string. A "*" means unspecified, so
+ //we 0 for that.
+ QString cigar = lineParts.at(5);
+ if (cigar == "*")
+ edgeOverlaps.push_back(0);
+ if (cigarContainsOnlyM(cigar))
+ edgeOverlaps.push_back(getLengthFromSimpleCigar(cigar));
+ else {
+ edgeOverlaps.push_back(getLengthFromCigar(cigar));
+ *unsupportedCigar = true;
+ }
+ }
+ }
+
+ //Pair up reverse complements, creating them if necessary.
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext()) {
+ i.next();
+ DeBruijnNode * node = i.value();
+ makeReverseComplementNodeIfNecessary(node);
+ }
+ pointEachNodeToItsReverseComplement();
+
+ //Add any custom colours or labels that were loaded.
+ QMapIterator<QString, QColor> j(colours);
+ while (j.hasNext()) {
+ j.next();
+ QString nodeName = j.key();
+ if (m_deBruijnGraphNodes.contains(nodeName))
+ m_deBruijnGraphNodes[nodeName]->setCustomColour(j.value());
+ }
+ QMapIterator<QString, QString> k(labels);
+ while (k.hasNext()) {
+ k.next();
+ QString nodeName = k.key();
+ if (m_deBruijnGraphNodes.contains(nodeName))
+ m_deBruijnGraphNodes[nodeName]->setCustomLabel(k.value());
+ }
+
+ //Create all of the edges.
+ for (size_t i = 0; i < edgeStartingNodeNames.size(); ++i) {
+ QString node1Name = edgeStartingNodeNames[i];
+ QString node2Name = edgeEndingNodeNames[i];
+ int overlap = edgeOverlaps[i];
+ createDeBruijnEdge(node1Name, node2Name, overlap, EXACT_OVERLAP);
+ }
+ }
+
+ if (m_deBruijnGraphNodes.size() == 0)
+ throw "load error";
+
+ // For Canu graphs, if there is a file called *.layout.readToTig, then we
+ // can use that to get better read depth values.
+ QFileInfo gfaFileInfo(m_filename);
+ QString baseName = gfaFileInfo.completeBaseName();
+ QString readToTigFilename = gfaFileInfo.dir().filePath(baseName + ".layout.readToTig");
+ QFileInfo readToTigFileInfo(readToTigFilename);
+ if (readToTigFileInfo.exists()) {
+ QFile readToTigFile(readToTigFilename);
+ if (readToTigFile.open(QIODevice::ReadOnly)) {
+ // Keep track of how many bases are put into each node.
+ QMap<QString, long long> baseCounts;
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext()) {
+ i.next();
+ DeBruijnNode * node = i.value();
+ if (node->isPositiveNode())
+ baseCounts[node->getNameWithoutSign()] = 0;
+ }
+
+ QTextStream in(&readToTigFile);
+ while (!in.atEnd()) {
+ QApplication::processEvents();
+ QString line = in.readLine();
+ QStringList lineParts = line.split(QRegExp("\t"));
+ if (lineParts.length() >= 5) {
+ bool conversionOkay;
+ long long readStart = lineParts[3].toLongLong(&conversionOkay);
+ if (!conversionOkay)
+ continue;
+ long long readEnd = lineParts[4].toLongLong(&conversionOkay);
+ if (!conversionOkay)
+ continue;
+ long long readLength = (readEnd < readStart) ? (readStart - readEnd) : (readEnd - readStart);
+ QString nodeName = lineParts[1];
+ if (baseCounts.contains(nodeName))
+ baseCounts[nodeName] += readLength;
+ }
+ }
+
+ // A node's depth is its total bases divided by its length.
+ QMapIterator<QString, DeBruijnNode*> j(m_deBruijnGraphNodes);
+ while (j.hasNext()) {
+ j.next();
+ DeBruijnNode * node = j.value();
+ if (node->isPositiveNode()) {
+ QString nodeName = node->getNameWithoutSign();
+ double depth;
+ if (node->getLength() > 0)
+ depth = double(baseCounts[nodeName]) / double(node->getLength());
+ else
+ depth = 1.0;
+ node->setDepth(depth);
+ node->getReverseComplement()->setDepth(depth);
+ }
+ }
+ }
+ }
+
+ m_sequencesLoadedFromFasta = NOT_TRIED;
+}
+
+
+
+bool AssemblyGraph::cigarContainsOnlyM(QString cigar)
+{
+ QRegExp rx("\\d+M");
+ return (rx.indexIn(cigar) != -1);
+}
+
+
+//This function assumes that the cigar string is simple: just digits followed
+//by "M".
+int AssemblyGraph::getLengthFromSimpleCigar(QString cigar)
+{
+ cigar.chop(1);
+ return cigar.toInt();
+}
+
+//This function returns the length defined by a cigar string, relative to the
+//second sequence in the edge (the CIGAR reference).
+//Bandage does not fully support non-M CIGAR strings, so this is fairly crude
+//at the moment.
+int AssemblyGraph::getLengthFromCigar(QString cigar)
+{
+ int length = 0;
+
+ length = getCigarCount("M", cigar);
+ length += getCigarCount("=", cigar);
+ length += getCigarCount("X", cigar);
+ length += getCigarCount("I", cigar);
+ length -= getCigarCount("D", cigar);
+ length -= getCigarCount("N", cigar);
+ length += getCigarCount("S", cigar);
+ length += getCigarCount("H", cigar);
+ length += getCigarCount("P", cigar);
+
+ return length;
+}
+
+
+//This function totals up the numbers for any given CIGAR code.
+int AssemblyGraph::getCigarCount(QString cigarCode, QString cigar)
+{
+ QRegExp rx("(\\d+)" + cigarCode);
+ QStringList list;
+ int pos = 0;
+ while ((pos = rx.indexIn(cigar, pos)) != -1)
+ {
+ list << rx.cap(1);
+ pos += rx.matchedLength();
+ }
+
+ int sum = 0;
+ for (int i = 0; i < list.size(); ++i)
+ sum += list.at(i).toInt();
+
+ return sum;
+}
+
+
+void AssemblyGraph::buildDeBruijnGraphFromFastg(QString fullFileName)
+{
+ m_graphFileType = FASTG;
+ m_filename = fullFileName;
+ m_depthTag = "KC";
+
+ QFile inputFile(fullFileName);
+ if (inputFile.open(QIODevice::ReadOnly))
+ {
+ std::vector<QString> edgeStartingNodeNames;
+ std::vector<QString> edgeEndingNodeNames;
+ DeBruijnNode * node = 0;
+
+ QTextStream in(&inputFile);
+ while (!in.atEnd())
+ {
+ QApplication::processEvents();
+
+ QString nodeName;
+ double nodeDepth;
+
+ QString line = in.readLine();
+
+ //If the line starts with a '>', then we are beginning a new node.
+ if (line.startsWith(">"))
+ {
+ line.remove(0, 1); //Remove '>' from start
+ line.chop(1); //Remove ';' from end
+ QStringList nodeDetails = line.split(":");
+
+ QString thisNode = nodeDetails.at(0);
+
+ //A single quote as the last character indicates a negative node.
+ bool negativeNode = thisNode.at(thisNode.size() - 1) == '\'';
+
+ QStringList thisNodeDetails = thisNode.split("_");
+
+ if (thisNodeDetails.size() < 6)
+ throw "load error";
+
+ nodeName = thisNodeDetails.at(1);
+ if (negativeNode)
+ nodeName += "-";
+ else
+ nodeName += "+";
+
+ QString nodeDepthString = thisNodeDetails.at(5);
+ if (negativeNode)
+ {
+ //It may be necessary to remove a single quote from the end of the depth
+ if (nodeDepthString.at(nodeDepthString.size() - 1) == '\'')
+ nodeDepthString.chop(1);
+ }
+ nodeDepth = nodeDepthString.toDouble();
+
+ //Make the node
+ node = new DeBruijnNode(nodeName, nodeDepth, ""); //Sequence string is currently empty - will be added to on subsequent lines of the fastg file
+ m_deBruijnGraphNodes.insert(nodeName, node);
+
+ //The second part of nodeDetails is a comma-delimited list of edge nodes.
+ //Edges aren't made right now (because the other node might not yet exist),
+ //so they are saved into vectors and made after all the nodes have been made.
+ if (nodeDetails.size() == 1 || nodeDetails.at(1).isEmpty())
+ continue;
+ QStringList edgeNodes = nodeDetails.at(1).split(",");
+ for (int i = 0; i < edgeNodes.size(); ++i)
+ {
+ QString edgeNode = edgeNodes.at(i);
+
+ QChar lastChar = edgeNode.at(edgeNode.size() - 1);
+ bool negativeNode = false;
+ if (lastChar == '\'')
+ {
+ negativeNode = true;
+ edgeNode.chop(1);
+ }
+ QStringList edgeNodeDetails = edgeNode.split("_");
+
+ if (edgeNodeDetails.size() < 2)
+ throw "load error";
+
+ QString edgeNodeName = edgeNodeDetails.at(1);
+ if (negativeNode)
+ edgeNodeName += "-";
+ else
+ edgeNodeName += "+";
+
+ edgeStartingNodeNames.push_back(nodeName);
+ edgeEndingNodeNames.push_back(edgeNodeName);
+ }
+ }
+
+ //If the line does not start with a '>', then this line is part of the
+ //sequence for the last node.
+ else
+ {
+ QByteArray sequenceLine = line.simplified().toLocal8Bit();
+ if (node != 0)
+ node->appendToSequence(sequenceLine);
+ }
+ }
+
+ inputFile.close();
+
+ //If all went well, each node will have a reverse complement and the code
+ //will never get here. However, I have noticed that some SPAdes fastg files
+ //have, for some reason, negative nodes with no positive counterpart. For
+ //that reason, we will now make any reverse complement nodes for nodes that
+ //lack them.
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ DeBruijnNode * node = i.value();
+ makeReverseComplementNodeIfNecessary(node);
+ }
+ pointEachNodeToItsReverseComplement();
+
+
+ //Create all of the edges.
+ for (size_t i = 0; i < edgeStartingNodeNames.size(); ++i)
+ {
+ QString node1Name = edgeStartingNodeNames[i];
+ QString node2Name = edgeEndingNodeNames[i];
+ createDeBruijnEdge(node1Name, node2Name);
+ }
+ }
+
+ autoDetermineAllEdgesExactOverlap();
+
+ if (m_deBruijnGraphNodes.size() == 0)
+ throw "load error";
+}
+
+
+void AssemblyGraph::makeReverseComplementNodeIfNecessary(DeBruijnNode * node)
+{
+ QString reverseComplementName = getOppositeNodeName(node->getName());
+
+ DeBruijnNode * reverseComplementNode = m_deBruijnGraphNodes[reverseComplementName];
+ if (reverseComplementNode == 0)
+ {
+ QByteArray nodeSequence;
+ if (node->sequenceIsMissing())
+ nodeSequence = "*";
+ else
+ nodeSequence = node->getSequence();
+ DeBruijnNode * newNode = new DeBruijnNode(reverseComplementName, node->getDepth(),
+ getReverseComplement(nodeSequence),
+ node->getLength());
+ m_deBruijnGraphNodes.insert(reverseComplementName, newNode);
+ }
+}
+
+
+void AssemblyGraph::pointEachNodeToItsReverseComplement()
+{
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ DeBruijnNode * positiveNode = i.value();
+
+ if (positiveNode->isPositiveNode())
+ {
+ DeBruijnNode * negativeNode = m_deBruijnGraphNodes[getOppositeNodeName(positiveNode->getName())];
+ if (negativeNode != 0)
+ {
+ positiveNode->setReverseComplement(negativeNode);
+ negativeNode->setReverseComplement(positiveNode);
+ }
+ }
+ }
+}
+
+
+
+
+void AssemblyGraph::buildDeBruijnGraphFromTrinityFasta(QString fullFileName)
+{
+ m_graphFileType = TRINITY;
+ m_filename = fullFileName;
+ m_depthTag = "";
+
+ std::vector<QString> names;
+ std::vector<QByteArray> sequences;
+ readFastaFile(fullFileName, &names, &sequences);
+
+ std::vector<QString> edgeStartingNodeNames;
+ std::vector<QString> edgeEndingNodeNames;
+
+ for (size_t i = 0; i < names.size(); ++i)
+ {
+ QApplication::processEvents();
+
+ QString name = names[i];
+ QByteArray sequence = sequences[i];
+
+ //The header can come in a few different formats:
+ // TR1|c0_g1_i1 len=280 path=[274:0-228 275:229-279] [-1, 274, 275, -2]
+ // TRINITY_DN31_c1_g1_i1 len=301 path=[279:0-300] [-1, 279, -2]
+ // GG1|c0_g1_i1 len=302 path=[1:0-301]
+ // comp0_c0_seq1 len=286 path=[6:0-285]
+ // c0_g1_i1 len=363 path=[119:0-185 43:186-244 43:245-303 43:304-362]
+
+ //The node names will begin with a string that contains everything
+ //up to the component number (e.g. "c0"), in the same format as it is
+ //in the Trinity.fasta file. If the node name begins with "TRINITY_DN"
+ //or "TRINITY_GG", "TR" or "GG", then that will be trimmed off.
+
+ if (name.length() < 4)
+ throw "load error";
+
+ int componentStartIndex = name.indexOf(QRegExp("c\\d+_"));
+ int componentEndIndex = name.indexOf("_", componentStartIndex);
+
+ if (componentStartIndex < 0 || componentEndIndex < 0)
+ throw "load error";
+
+ QString component = name.left(componentEndIndex);
+ if (component.startsWith("TRINITY_DN") || component.startsWith("TRINITY_GG"))
+ component = component.remove(0, 10);
+ else if (component.startsWith("TR") || component.startsWith("GG"))
+ component = component.remove(0, 2);
+
+ if (component.length() < 2)
+ throw "load error";
+
+ int pathStartIndex = name.indexOf("path=[") + 6;
+ int pathEndIndex = name.indexOf("]", pathStartIndex);
+ if (pathStartIndex < 0 || pathEndIndex < 0)
+ throw "load error";
+ int pathLength = pathEndIndex - pathStartIndex;
+ QString path = name.mid(pathStartIndex, pathLength);
+ if (path.size() == 0)
+ throw "load error";
+
+ QStringList pathParts = path.split(" ");
+
+ //Each path part is a node
+ QString previousNodeName;
+ for (int i = 0; i < pathParts.length(); ++i)
+ {
+ QString pathPart = pathParts.at(i);
+ QStringList nodeParts = pathPart.split(":");
+ if (nodeParts.size() < 2)
+ throw "load error";
+
+ //Most node numbers will be formatted simply as the number, but some
+ //(I don't know why) have '@' and the start and '@!' at the end. In
+ //these cases, we must strip those extra characters off.
+ QString nodeNumberString = nodeParts.at(0);
+ if (nodeNumberString.at(0) == '@')
+ nodeNumberString = nodeNumberString.mid(1, nodeNumberString.length() - 3);
+
+ QString nodeName = component + "_" + nodeNumberString + "+";
+
+ //If the node doesn't yet exist, make it now.
+ if (!m_deBruijnGraphNodes.contains(nodeName))
+ {
+ QString nodeRange = nodeParts.at(1);
+ QStringList nodeRangeParts = nodeRange.split("-");
+
+ if (nodeRangeParts.size() < 2)
+ throw "load error";
+
+ int nodeRangeStart = nodeRangeParts.at(0).toInt();
+ int nodeRangeEnd = nodeRangeParts.at(1).toInt();
+ int nodeLength = nodeRangeEnd - nodeRangeStart + 1;
+
+ QByteArray nodeSequence = sequence.mid(nodeRangeStart, nodeLength);
+ DeBruijnNode * node = new DeBruijnNode(nodeName, 1.0, nodeSequence);
+ m_deBruijnGraphNodes.insert(nodeName, node);
+ }
+
+ //Remember to make an edge for the previous node to this one.
+ if (i > 0)
+ {
+ edgeStartingNodeNames.push_back(previousNodeName);
+ edgeEndingNodeNames.push_back(nodeName);
+ }
+ previousNodeName = nodeName;
+ }
+ }
+
+ //Even though the Trinity.fasta file only contains positive nodes, Bandage
+ //expects negative reverse complements nodes, so make them now.
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ DeBruijnNode * node = i.value();
+ makeReverseComplementNodeIfNecessary(node);
+ }
+ pointEachNodeToItsReverseComplement();
+
+ //Create all of the edges. The createDeBruijnEdge function checks for
+ //duplicates, so it's okay if we try to add the same edge multiple times.
+ for (size_t i = 0; i < edgeStartingNodeNames.size(); ++i)
+ {
+ QString node1Name = edgeStartingNodeNames[i];
+ QString node2Name = edgeEndingNodeNames[i];
+ createDeBruijnEdge(node1Name, node2Name);
+ }
+
+ setAllEdgesExactOverlap(0);
+
+ if (m_deBruijnGraphNodes.size() == 0)
+ throw "load error";
+}
+
+
+
+//This function builds a graph from an ASQG file. Bandage expects edges to
+//conform to its expectation: overlaps are only at the ends of sequences and
+//always have the same length in each of the two sequences. It will not load
+//edges which fail to meet this expectation. The function's return value is
+//the number of edges which could not be loaded.
+int AssemblyGraph::buildDeBruijnGraphFromAsqg(QString fullFileName)
+{
+ m_graphFileType = ASQG;
+ m_filename = fullFileName;
+ m_depthTag = "";
+
+ int badEdgeCount = 0;
+
+ QFile inputFile(fullFileName);
+ if (inputFile.open(QIODevice::ReadOnly))
+ {
+ std::vector<QString> edgeStartingNodeNames;
+ std::vector<QString> edgeEndingNodeNames;
+ std::vector<int> edgeOverlaps;
+
+ QTextStream in(&inputFile);
+ while (!in.atEnd())
+ {
+ QApplication::processEvents();
+ QString line = in.readLine();
+
+ QStringList lineParts = line.split(QRegExp("\t"));
+
+ if (lineParts.size() < 1)
+ continue;
+
+ //Lines beginning with "VT" are sequence (node) lines
+ if (lineParts.at(0) == "VT")
+ {
+ if (lineParts.size() < 3)
+ throw "load error";
+
+ //We treat all nodes in this file as positive nodes and add "+" to the end of their names.
+ QString nodeName = lineParts.at(1);
+ if (nodeName.isEmpty())
+ nodeName = "node";
+ nodeName += "+";
+
+ QByteArray sequence = lineParts.at(2).toLocal8Bit();
+ int length = sequence.length();
+
+ //ASQG files don't seem to include depth, so just set this to one for every node.
+ double nodeDepth = 1.0;
+
+ DeBruijnNode * node = new DeBruijnNode(nodeName, nodeDepth, sequence, length);
+ m_deBruijnGraphNodes.insert(nodeName, node);
+ }
+
+ //Lines beginning with "ED" are edge lines
+ else if (lineParts.at(0) == "ED")
+ {
+ //Edges aren't made now, in case their sequence hasn't yet been specified.
+ //Instead, we save the starting and ending nodes and make the edges after
+ //we're done looking at the file.
+
+ if (lineParts.size() < 2)
+ throw "load error";
+
+ QStringList edgeParts = lineParts[1].split(" ");
+ if (edgeParts.size() < 8)
+ throw "load error";
+
+ QString s1Name = edgeParts.at(0);
+ QString s2Name = edgeParts.at(1);
+ int s1OverlapStart = edgeParts.at(2).toInt();
+ int s1OverlapEnd = edgeParts.at(3).toInt();
+ int s1Length = edgeParts.at(4).toInt();
+ int s2OverlapStart = edgeParts.at(5).toInt();
+ int s2OverlapEnd = edgeParts.at(6).toInt();
+ int s2Length = edgeParts.at(7).toInt();
+
+ //We want the overlap region of s1 to be at the end of the node sequence. If it isn't, we use the
+ //negative node and flip the overlap coordinates.
+ if (s1OverlapEnd == s1Length - 1)
+ s1Name += "+";
+ else
+ {
+ s1Name += "-";
+ int newOverlapStart = s1Length - s1OverlapEnd - 1;
+ int newOverlapEnd = s1Length - s1OverlapStart - 1;
+ s1OverlapStart = newOverlapStart;
+ s1OverlapEnd = newOverlapEnd;
+ }
+
+ //We want the overlap region of s2 to be at the start of the node sequence. If it isn't, we use the
+ //negative node and flip the overlap coordinates.
+ if (s2OverlapStart == 0)
+ s2Name += "+";
+ else
+ {
+ s2Name += "-";
+ int newOverlapStart = s2Length - s2OverlapEnd - 1;
+ int newOverlapEnd = s2Length - s2OverlapStart - 1;
+ s2OverlapStart = newOverlapStart;
+ s2OverlapEnd = newOverlapEnd;
+ }
+
+ int s1OverlapLength = s1OverlapEnd - s1OverlapStart + 1;
+ int s2OverlapLength = s2OverlapEnd - s2OverlapStart + 1;
+
+ //If the overlap between the two nodes is in agreement and the overlap regions extend to the ends of the
+ //nodes, then we will make the edge.
+ if (s1OverlapLength == s2OverlapLength && s1OverlapEnd == s1Length - 1 && s2OverlapStart == 0)
+ {
+ edgeStartingNodeNames.push_back(s1Name);
+ edgeEndingNodeNames.push_back(s2Name);
+ edgeOverlaps.push_back(s1OverlapLength);
+ }
+ else
+ ++badEdgeCount;
+ }
+ }
+
+ //Pair up reverse complements, creating them if necessary.
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ DeBruijnNode * node = i.value();
+ makeReverseComplementNodeIfNecessary(node);
+ }
+ pointEachNodeToItsReverseComplement();
+
+ //Create all of the edges.
+ for (size_t i = 0; i < edgeStartingNodeNames.size(); ++i)
+ {
+ QString node1Name = edgeStartingNodeNames[i];
+ QString node2Name = edgeEndingNodeNames[i];
+ int overlap = edgeOverlaps[i];
+ createDeBruijnEdge(node1Name, node2Name, overlap, EXACT_OVERLAP);
+ }
+ }
+
+ if (m_deBruijnGraphNodes.size() == 0)
+ throw "load error";
+
+ return badEdgeCount;
+}
+
+
+void AssemblyGraph::buildDeBruijnGraphFromPlainFasta(QString fullFileName)
+{
+ m_graphFileType = PLAIN_FASTA;
+ m_filename = fullFileName;
+ m_depthTag = "";
+
+ std::vector<QString> names;
+ std::vector<QByteArray> sequences;
+ readFastaFile(fullFileName, &names, &sequences);
+
+ for (size_t i = 0; i < names.size(); ++i)
+ {
+ QApplication::processEvents();
+
+ QString name = names[i];
+ double depth = 1.0;
+ QByteArray sequence = sequences[i];
+
+ // Check to see if the node name matches the Velvet/SPAdes contig format. If so, we can get the depth and node
+ // number.
+ QStringList thisNodeDetails = name.split("_");
+ if (thisNodeDetails.size() >= 6 && thisNodeDetails[2] == "length" && thisNodeDetails[4] == "cov") {
+ name = thisNodeDetails[1];
+ depth = thisNodeDetails[5].toDouble();
+ m_depthTag = "KC";
+ }
+
+ // If it doesn't match, then we will use the sequence name up to the first space. We'll then look for "depth="
+ // in the rest of the header and use it if possible.
+ else {
+ if (name.contains("depth=")) {
+ QString depthString = name.split("depth=")[1].toLower();
+ if (depthString.contains("x"))
+ depthString = depthString.split("x")[0];
+ else
+ depthString = depthString.split(" ")[0];
+ bool ok;
+ double depthFromString = depthString.toFloat(&ok);
+ if (ok)
+ depth = depthFromString;
+ }
+ QStringList nameParts = name.split(" ");
+ if (nameParts.size() > 0)
+ name = nameParts[0];
+ }
+
+ name = cleanNodeName(name);
+ name = getUniqueNodeName(name) + "+";
+
+ if (name.length() < 1)
+ throw "load error";
+
+ DeBruijnNode * node = new DeBruijnNode(name, depth, sequence);
+ m_deBruijnGraphNodes.insert(name, node);
+ makeReverseComplementNodeIfNecessary(node);
+ }
+ pointEachNodeToItsReverseComplement();
+}
+
+
+
+//This function adjusts a node name to make sure it is valid for use in Bandage.
+QString AssemblyGraph::cleanNodeName(QString name)
+{
+ //Replace whitespace with underscores
+ name = name.replace(QRegExp("\\s"), "_");
+
+ //Remove any commas.
+ name = name.replace(",", "");
+
+ //Remove any trailing + or -.
+ if (name.endsWith('+') || name.endsWith('-'))
+ name.chop(1);
+
+ return name;
+}
+
+
+GraphFileType AssemblyGraph::getGraphFileTypeFromFile(QString fullFileName)
+{
+ if (checkFileIsLastGraph(fullFileName))
+ return LAST_GRAPH;
+ if (checkFileIsFastG(fullFileName))
+ return FASTG;
+ if (checkFileIsGfa(fullFileName))
+ return GFA;
+ if (checkFileIsTrinityFasta(fullFileName))
+ return TRINITY;
+ if (checkFileIsAsqg(fullFileName))
+ return ASQG;
+ if (checkFileIsFasta(fullFileName))
+ return PLAIN_FASTA;
+ return UNKNOWN_FILE_TYPE;
+}
+
+
+//Cursory look to see if file appears to be a LastGraph file.
+bool AssemblyGraph::checkFileIsLastGraph(QString fullFileName)
+{
+ return checkFirstLineOfFile(fullFileName, "^\\d+\\s+\\d+\\s+\\d+\\s+\\d+");
+}
+
+//Cursory look to see if file appears to be a FASTG file.
+bool AssemblyGraph::checkFileIsFastG(QString fullFileName)
+{
+ return checkFirstLineOfFile(fullFileName, "^>(NODE|EDGE).*;");
+}
+
+//Cursory look to see if file appears to be a FASTA file.
+bool AssemblyGraph::checkFileIsFasta(QString fullFileName)
+{
+ return checkFirstLineOfFile(fullFileName, "^>");
+}
+
+//Cursory look to see if file appears to be a GFA file.
+bool AssemblyGraph::checkFileIsGfa(QString fullFileName)
+{
+ return checkFirstLineOfFile(fullFileName, "^[SLH]\t");
+}
+
+//Cursory look to see if file appears to be a Trinity.fasta file.
+bool AssemblyGraph::checkFileIsTrinityFasta(QString fullFileName)
+{
+ return checkFirstLineOfFile(fullFileName, "path=\\[");
+}
+
+//Cursory look to see if file appears to be an ASQG file.
+bool AssemblyGraph::checkFileIsAsqg(QString fullFileName)
+{
+ return checkFirstLineOfFile(fullFileName, "^HT\t");
+}
+
+
+bool AssemblyGraph::checkFirstLineOfFile(QString fullFileName, QString regExp)
+{
+ QFile inputFile(fullFileName);
+ if (inputFile.open(QIODevice::ReadOnly))
+ {
+ QTextStream in(&inputFile);
+ if (in.atEnd())
+ return false;
+ QRegExp rx(regExp);
+ QString line = in.readLine();
+ if (rx.indexIn(line) != -1)
+ return true;
+ }
+ return false;
+}
+
+/* Split a QString according to CSV rules
+ *
+ * @param line line of a csv
+ * @param sep field separator to use
+ * @result list of fields with escaping removed
+ *
+ * Known Bugs: CSV (as per RFC4180) allows multi-line fields (\r\n between "..."), which
+ * can't be parsed line-by line an hence isn't supported.
+ */
+QStringList AssemblyGraph::splitCsv(QString line, QString sep)
+{
+ QStringList list;
+ QRegExp rx("(\"(?:[^\"]|\"\")*\"|[^"+sep+"]*)");
+ int pos = 0;
+
+ while (rx.indexIn(line, pos) != -1)
+ {
+ QString field = rx.cap().replace("\"\"","\"");
+ if (field[0] == '"' && field[field.length()-1] == '"')
+ field=field.mid(1,field.length()-2);
+ list << field;
+ pos += rx.matchedLength() +1;
+ }
+ return list;
+}
+
+/* Load data from CSV and add to deBruijnGraphNodes
+ *
+ * @param filename the full path of the file to be loaded
+ * @param *columns will contain the names of each column after loading data
+ * (to add these to the GUI)
+ * @param *errormsg if not empty, message to be displayed to user containing warning
+ * or other information
+ * @returns true/false if loading data worked
+ */
+bool AssemblyGraph::loadCSV(QString filename, QStringList * columns, QString * errormsg, bool * coloursLoaded)
+{
+ clearAllCsvData();
+
+ QFile inputFile(filename);
+ if (!inputFile.open(QIODevice::ReadOnly))
+ {
+ *errormsg = "Unable to read from specified file.";
+ return false;
+ }
+ QTextStream in(&inputFile);
+ QString line = in.readLine();
+
+ // guess at separator; this assumes that any tab in the first line means
+ // we have a tab separated file
+ QString sep = "\t";
+ if (line.split(sep).length() == 1)
+ {
+ sep = ",";
+ if (line.split(sep).length() == 1)
+ {
+ *errormsg = "Neither tab nor comma in first line. Please check file format.";
+ return false;
+ }
+ }
+
+ int unmatched_nodes = 0; // keep a counter for lines in file that can't be matched to nodes
+
+ QStringList headers = splitCsv(line, sep);
+ if (headers.size() < 2)
+ {
+ *errormsg = "Not enough CSV headers: at least two required.";
+ return false;
+ }
+ headers.pop_front();
+
+ //Check to see if any of the columns holds colour data.
+ int colourCol = -1;
+ for (int i = 0; i < headers.size(); ++i)
+ {
+ QString header = headers[i].toLower();
+ if (header == "colour" || header == "color")
+ {
+ colourCol = i;
+ *coloursLoaded = true;
+ break;
+ }
+ }
+
+ *columns = headers;
+ int columnCount = headers.size();
+ QMap<QString, QColor> colourCategories;
+ std::vector<QColor> presetColours = getPresetColours();
+
+ while (!in.atEnd())
+ {
+ QApplication::processEvents();
+
+ QStringList cols = splitCsv(in.readLine(), sep);
+ QString nodeName = getNodeNameFromString(cols[0]);
+
+ //Get rid of the node name - no need to save that.
+ cols.pop_front();
+
+ //If one of the columns holds colour data, get the colour from that one.
+ //Acceptable colour formats: 6-digit hex colour (e.g. #FFB6C1), an 8-digit hex colour (e.g. #7FD2B48C) or a
+ //standard colour name (e.g. skyblue).
+ //If the colour value is something other than one of these, a colour will be assigned to the value. That way
+ //categorical names can be used and automatically given colours.
+ QColor colour;
+ if (colourCol != -1 && cols.size() > colourCol)
+ {
+ QString colourString = cols[colourCol];
+ colour = QColor(colourString);
+ if (!colour.isValid())
+ {
+ if (!colourCategories.contains(colourString))
+ {
+ int nextColourIndex = colourCategories.size();
+ colourCategories[colourString] = presetColours[nextColourIndex];
+ }
+ colour = colourCategories[colourString];
+ }
+ }
+
+ //Get rid of any extra data that doesn't have a header.
+ while (cols.size() > columnCount)
+ cols.pop_back();
+
+ if (nodeName != "" && m_deBruijnGraphNodes.contains(nodeName))
+ {
+ m_deBruijnGraphNodes[nodeName]->setCsvData(cols);
+ if (colour.isValid())
+ m_deBruijnGraphNodes[nodeName]->setCustomColour(colour);
+ }
+ else
+ ++unmatched_nodes;
+ }
+
+ if (unmatched_nodes)
+ *errormsg = "There were " + QString::number(unmatched_nodes) + " unmatched entries in the CSV.";
+
+ return true;
+}
+
+
+//This function extracts a node name from a string.
+//The string may be in this Bandage format:
+// NODE_6+_length_50434_cov_42.3615
+//Or in a number of variations of that format.
+//If the node name it finds does not end in a '+' or '-', it will add '+'.
+QString AssemblyGraph::getNodeNameFromString(QString string)
+{
+ QStringList parts = string.split("_");
+ if (parts.size() == 0)
+ return "";
+
+ if (parts[0] == "NODE")
+ parts.pop_front();
+ if (parts.size() == 0)
+ return "";
+
+ QString nodeName;
+
+ //This checks for the standard Bandage format where the node name does
+ //not have any underscores.
+ if (parts.size() == 5 && parts[1] == "length")
+ nodeName = parts[0];
+
+ //This checks for the simple case of nothing but a node name.
+ else if (parts.size() == 1)
+ nodeName = parts[0];
+
+ //If the code got here, then it is likely that the node name contains
+ //underscores. Grab everything in the string up until we encounter
+ //"length".
+ else
+ {
+ for (int i = 0; i < parts.size(); ++i)
+ {
+ if (parts[i] == "length")
+ break;
+ if (nodeName.length() > 0)
+ nodeName += "_";
+ nodeName += parts[i];
+ }
+ }
+
+ int nameLength = nodeName.length();
+ if (nameLength == 0)
+ return "";
+
+ QChar lastChar = nodeName.at(nameLength - 1);
+ if (lastChar == '+' || lastChar == '-')
+ return nodeName;
+ else
+ return nodeName + "+";
+}
+
+//Returns true if successful, false if not.
+bool AssemblyGraph::loadGraphFromFile(QString filename)
+{
+ GraphFileType graphFileType = getGraphFileTypeFromFile(filename);
+
+ if (graphFileType == UNKNOWN_FILE_TYPE)
+ return false;
+
+ try
+ {
+ if (graphFileType == LAST_GRAPH)
+ buildDeBruijnGraphFromLastGraph(filename);
+ if (graphFileType == FASTG)
+ buildDeBruijnGraphFromFastg(filename);
+ if (graphFileType == GFA)
+ {
+ bool unsupportedCigar, customLabels, customColours;
+ QString bandageOptionsError;
+ buildDeBruijnGraphFromGfa(filename, &unsupportedCigar, &customLabels, &customColours, &bandageOptionsError);
+ }
+ if (graphFileType == TRINITY)
+ buildDeBruijnGraphFromTrinityFasta(filename);
+ if (graphFileType == ASQG)
+ buildDeBruijnGraphFromAsqg(filename);
+ if (graphFileType == PLAIN_FASTA)
+ buildDeBruijnGraphFromPlainFasta(filename);
+ }
+
+ catch (...)
+ {
+ return false;
+ }
+
+ determineGraphInfo();
+ g_memory->clearGraphSpecificMemory();
+ return true;
+}
+
+
+
+//The startingNodes and nodeDistance parameters are only used if the graph scope
+//is not WHOLE_GRAPH.
+void AssemblyGraph::buildOgdfGraphFromNodesAndEdges(std::vector<DeBruijnNode *> startingNodes, int nodeDistance)
+{
+ if (g_settings->graphScope == WHOLE_GRAPH)
+ {
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+
+ //If double mode is off, only positive nodes are drawn. If it's
+ //on, all nodes are drawn.
+ if (i.value()->isPositiveNode() || g_settings->doubleMode)
+ i.value()->setAsDrawn();
+ }
+ }
+ else //The scope is either around specified nodes, around nodes with BLAST hits or a depth range.
+ {
+ //Distance is only used for around nodes and around blast scopes, not
+ //for the depth range scope.
+ if (g_settings->graphScope == DEPTH_RANGE)
+ nodeDistance = 0;
+
+ for (size_t i = 0; i < startingNodes.size(); ++i)
+ {
+ DeBruijnNode * node = startingNodes[i];
+
+ //If we are in single mode, make sure that each node is positive.
+ if (!g_settings->doubleMode && node->isNegativeNode())
+ node = node->getReverseComplement();
+
+ node->setAsDrawn();
+ node->setAsSpecial();
+ node->labelNeighbouringNodesAsDrawn(nodeDistance, 0);
+ }
+ }
+
+ // If performing a linear layout, we first sort the drawn nodes and add them left-to-right.
+ if (g_settings->linearLayout) {
+ QList<DeBruijnNode *> sortedDrawnNodes;
+
+ // We first try to sort the nodes numerically.
+ QList<QPair<int, DeBruijnNode *>> numericallySortedDrawnNodes;
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ bool successfulIntConversion = true;
+ while (i.hasNext())
+ {
+ i.next();
+ DeBruijnNode * node = i.value();
+ if (node->isDrawn() && node->thisOrReverseComplementNotInOgdf()) {
+ int nodeInt = node->getNameWithoutSign().toInt(&successfulIntConversion);
+ if (!successfulIntConversion)
+ break;
+ numericallySortedDrawnNodes.push_back(QPair<int, DeBruijnNode*>(nodeInt, node));
+ }
+ }
+ if (successfulIntConversion) {
+ std::sort(numericallySortedDrawnNodes.begin(), numericallySortedDrawnNodes.end(),
+ [](const QPair<int, DeBruijnNode *> & a, const QPair<int, DeBruijnNode *> & b) {return a.first < b.first;});
+ for (int i = 0; i < numericallySortedDrawnNodes.size(); ++i) {
+ sortedDrawnNodes.reserve(numericallySortedDrawnNodes.size());
+ sortedDrawnNodes.push_back(numericallySortedDrawnNodes[i].second);
+ }
+ }
+
+ // If any of the conversions from node name to integer failed, then we instead sort the nodes alphabetically.
+ else {
+ i = QMapIterator<QString, DeBruijnNode*>(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ DeBruijnNode * node = i.value();
+ if (node->isDrawn())
+ sortedDrawnNodes.push_back(node);
+ }
+ std::sort(sortedDrawnNodes.begin(), sortedDrawnNodes.end(),
+ [](DeBruijnNode * a, DeBruijnNode * b) {return QString::localeAwareCompare(a->getNameWithoutSign().toUpper(), b->getNameWithoutSign().toUpper()) < 0;});
+ }
+
+ // Now we add the drawn nodes to the OGDF graph, given them initial positions based on their sort order.
+ QSet<QPair<double, double> > usedStartPositions;
+ double lastXPos = 0.0;
+ for (int i = 0; i < sortedDrawnNodes.size(); ++i) {
+ DeBruijnNode * node = sortedDrawnNodes[i];
+ if (node->thisOrReverseComplementInOgdf())
+ continue;
+ std::vector<DeBruijnNode *> upstreamNodes = node->getUpstreamNodes();
+ for (size_t j = 0; j < upstreamNodes.size(); ++j) {
+ DeBruijnNode * upstreamNode = upstreamNodes[j];
+ if (!upstreamNode->inOgdf())
+ continue;
+ ogdf::node upstreamEnd = upstreamNode->getOgdfNode()->getLast();
+ double upstreamEndPos = m_graphAttributes->x(upstreamEnd);
+ if (j == 0)
+ lastXPos = upstreamEndPos;
+ else
+ lastXPos = std::max(lastXPos, upstreamEndPos);
+ }
+ double xPos = lastXPos + g_settings->edgeLength;
+ double yPos = 0.0;
+ while (usedStartPositions.contains(QPair<double, double>(xPos, yPos)))
+ yPos += g_settings->edgeLength;
+ node->addToOgdfGraph(m_ogdfGraph, m_graphAttributes, m_edgeArray, xPos, yPos);
+ usedStartPositions.insert(QPair<double, double>(xPos, yPos));
+ lastXPos = m_graphAttributes->x(node->getOgdfNode()->getLast());
+ }
+ }
+
+ // If the layout isn't linear, then we don't worry about the initial positions because they'll be randomised anyway.
+ else {
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ DeBruijnNode * node = i.value();
+ if (node->isDrawn() && node->thisOrReverseComplementNotInOgdf())
+ node->addToOgdfGraph(m_ogdfGraph, m_graphAttributes, m_edgeArray, 0.0, 0.0);
+ }
+ }
+
+ //Then loop through each edge determining its drawn status and adding it to OGDF if it is drawn.
+ QMapIterator<QPair<DeBruijnNode*, DeBruijnNode*>, DeBruijnEdge*> j(m_deBruijnGraphEdges);
+ while (j.hasNext())
+ {
+ j.next();
+ DeBruijnEdge * edge = j.value();
+ edge->determineIfDrawn();
+ if (edge->isDrawn())
+ edge->addToOgdfGraph(m_ogdfGraph, m_edgeArray);
+ }
+}
+
+
+
+void AssemblyGraph::addGraphicsItemsToScene(MyGraphicsScene * scene)
+{
+ scene->clear();
+
+ double meanDrawnDepth = getMeanDepth(true);
+
+ //First make the GraphicsItemNode objects
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ DeBruijnNode * node = i.value();
+
+ if (node->isDrawn())
+ {
+ if (meanDrawnDepth == 0)
+ node->setDepthRelativeToMeanDrawnDepth(1.0);
+ else
+ node->setDepthRelativeToMeanDrawnDepth(node->getDepth() / meanDrawnDepth);
+ GraphicsItemNode * graphicsItemNode = new GraphicsItemNode(node, m_graphAttributes);
+ node->setGraphicsItemNode(graphicsItemNode);
+ graphicsItemNode->setFlag(QGraphicsItem::ItemIsSelectable);
+ graphicsItemNode->setFlag(QGraphicsItem::ItemIsMovable);
+ }
+ }
+
+ resetAllNodeColours();
+
+ //Then make the GraphicsItemEdge objects and add them to the scene first
+ //so they are drawn underneath
+ QMapIterator<QPair<DeBruijnNode*, DeBruijnNode*>, DeBruijnEdge*> j(m_deBruijnGraphEdges);
+ while (j.hasNext())
+ {
+ j.next();
+ DeBruijnEdge * edge = j.value();
+
+ if (edge->isDrawn())
+ {
+ GraphicsItemEdge * graphicsItemEdge = new GraphicsItemEdge(edge);
+ edge->setGraphicsItemEdge(graphicsItemEdge);
+ graphicsItemEdge->setFlag(QGraphicsItem::ItemIsSelectable);
+ scene->addItem(graphicsItemEdge);
+ }
+ }
+
+ //Now add the GraphicsItemNode objects to the scene so they are drawn
+ //on top
+ QMapIterator<QString, DeBruijnNode*> k(m_deBruijnGraphNodes);
+ while (k.hasNext())
+ {
+ k.next();
+ DeBruijnNode * node = k.value();
+ if (node->hasGraphicsItem())
+ scene->addItem(node->getGraphicsItemNode());
+ }
+}
+
+
+
+
+std::vector<DeBruijnNode *> AssemblyGraph::getStartingNodes(QString * errorTitle, QString * errorMessage, bool doubleMode,
+ QString nodesList, QString blastQueryName)
+{
+ std::vector<DeBruijnNode *> startingNodes;
+
+ if (g_settings->graphScope == AROUND_NODE)
+ {
+ if (checkIfStringHasNodes(nodesList))
+ {
+ *errorTitle = "No starting nodes";
+ *errorMessage = "Please enter at least one node when drawing the graph using the 'Around node(s)' scope. "
+ "Separate multiple nodes with commas.";
+ return startingNodes;
+ }
+
+ //Make sure the nodes the user typed in are actually in the graph.
+ std::vector<QString> nodesNotInGraph;
+ std::vector<DeBruijnNode *> nodesInGraph = getNodesFromString(nodesList,
+ g_settings->startingNodesExactMatch,
+ &nodesNotInGraph);
+ if (nodesNotInGraph.size() > 0)
+ {
+ *errorTitle = "Nodes not found";
+ *errorMessage = generateNodesNotFoundErrorMessage(nodesNotInGraph, g_settings->startingNodesExactMatch);
+ if (nodesInGraph.size() == 0)
+ return startingNodes;
+ }
+ }
+
+ else if (g_settings->graphScope == AROUND_BLAST_HITS)
+ {
+ std::vector<DeBruijnNode *> startingNodes = getNodesFromBlastHits(blastQueryName);
+
+ if (startingNodes.size() == 0)
+ {
+ *errorTitle = "No BLAST hits";
+ *errorMessage = "To draw the graph around BLAST hits, you must first conduct a BLAST search.";
+ return startingNodes;
+ }
+ }
+
+ else if (g_settings->graphScope == DEPTH_RANGE)
+ {
+ if (g_settings->minDepthRange > g_settings->maxDepthRange)
+ {
+ *errorTitle = "Invalid depth range";
+ *errorMessage = "The maximum depth must be greater than or equal to the minimum depth.";
+ return startingNodes;
+ }
+
+ std::vector<DeBruijnNode *> startingNodes = getNodesInDepthRange(g_settings->minDepthRange,
+ g_settings->maxDepthRange);
+
+ if (startingNodes.size() == 0)
+ {
+ *errorTitle = "No nodes in range";
+ *errorMessage = "There are no nodes with depths in the specified range.";
+ return startingNodes;
+ }
+ }
+
+ g_settings->doubleMode = doubleMode;
+ clearOgdfGraphAndResetNodes();
+
+ if (g_settings->graphScope == AROUND_NODE)
+ startingNodes = getNodesFromString(nodesList, g_settings->startingNodesExactMatch);
+ else if (g_settings->graphScope == AROUND_BLAST_HITS)
+ startingNodes = getNodesFromBlastHits(blastQueryName);
+ else if (g_settings->graphScope == DEPTH_RANGE)
+ startingNodes = getNodesInDepthRange(g_settings->minDepthRange,
+ g_settings->maxDepthRange);
+
+ return startingNodes;
+}
+
+
+bool AssemblyGraph::checkIfStringHasNodes(QString nodesString)
+{
+ nodesString = nodesString.simplified();
+ QStringList nodesList = nodesString.split(",");
+ nodesList = removeNullStringsFromList(nodesList);
+ return (nodesList.size() == 0);
+}
+
+
+QString AssemblyGraph::generateNodesNotFoundErrorMessage(std::vector<QString> nodesNotInGraph, bool exact)
+{
+ QString errorMessage;
+ if (exact)
+ errorMessage += "The following nodes are not in the graph:\n";
+ else
+ errorMessage += "The following queries do not match any nodes in the graph:\n";
+
+ for (size_t i = 0; i < nodesNotInGraph.size(); ++i)
+ {
+ errorMessage += nodesNotInGraph[i];
+ if (i != nodesNotInGraph.size() - 1)
+ errorMessage += ", ";
+ }
+ errorMessage += "\n";
+
+ return errorMessage;
+}
+
+
+std::vector<DeBruijnNode *> AssemblyGraph::getNodesFromString(QString nodeNamesString, bool exactMatch, std::vector<QString> * nodesNotInGraph)
+{
+ nodeNamesString = nodeNamesString.simplified();
+ QStringList nodesList = nodeNamesString.split(",");
+
+ if (exactMatch)
+ return getNodesFromListExact(nodesList, nodesNotInGraph);
+ else
+ return getNodesFromListPartial(nodesList, nodesNotInGraph);
+}
+
+
+//Given a list of node names (as strings), this function will return all nodes which match
+//those names exactly. The last +/- on the end of the node name is optional - if missing
+//both + and - nodes will be returned.
+std::vector<DeBruijnNode *> AssemblyGraph::getNodesFromListExact(QStringList nodesList,
+ std::vector<QString> * nodesNotInGraph)
+{
+ std::vector<DeBruijnNode *> returnVector;
+
+ for (int i = 0; i < nodesList.size(); ++i)
+ {
+ QString nodeName = nodesList.at(i).simplified();
+ if (nodeName == "")
+ continue;
+
+ //If the node name ends in +/-, then we assume the user was specifying the exact
+ //node in the pair. If the node name does not end in +/-, then we assume the
+ //user is asking for either node in the pair.
+ QChar lastChar = nodeName.at(nodeName.length() - 1);
+ if (lastChar == '+' || lastChar == '-')
+ {
+ if (m_deBruijnGraphNodes.contains(nodeName))
+ returnVector.push_back(m_deBruijnGraphNodes[nodeName]);
+ else if (nodesNotInGraph != 0)
+ nodesNotInGraph->push_back(nodesList.at(i).trimmed());
+ }
+ else
+ {
+ QString posNodeName = nodeName + "+";
+ QString negNodeName = nodeName + "-";
+
+ bool posNodeFound = false;
+ if (m_deBruijnGraphNodes.contains(posNodeName))
+ {
+ returnVector.push_back(m_deBruijnGraphNodes[posNodeName]);
+ posNodeFound = true;
+ }
+
+ bool negNodeFound = false;
+ if (m_deBruijnGraphNodes.contains(negNodeName))
+ {
+ returnVector.push_back(m_deBruijnGraphNodes[negNodeName]);
+ negNodeFound = true;
+ }
+
+ if (!posNodeFound && !negNodeFound && nodesNotInGraph != 0)
+ nodesNotInGraph->push_back(nodesList.at(i).trimmed());
+ }
+ }
+
+ return returnVector;
+}
+
+std::vector<DeBruijnNode *> AssemblyGraph::getNodesFromListPartial(QStringList nodesList,
+ std::vector<QString> * nodesNotInGraph)
+{
+ std::vector<DeBruijnNode *> returnVector;
+
+ for (int i = 0; i < nodesList.size(); ++i)
+ {
+ QString queryName = nodesList.at(i).simplified();
+ if (queryName == "")
+ continue;
+
+ bool found = false;
+ QMapIterator<QString, DeBruijnNode*> j(m_deBruijnGraphNodes);
+ while (j.hasNext())
+ {
+ j.next();
+ QString nodeName = j.value()->getName();
+
+ if (nodeName.contains(queryName))
+ {
+ found = true;
+ returnVector.push_back(j.value());
+ }
+ }
+
+ if (!found && nodesNotInGraph != 0)
+ nodesNotInGraph->push_back(queryName.trimmed());
+ }
+
+ return returnVector;
+}
+
+std::vector<DeBruijnNode *> AssemblyGraph::getNodesFromBlastHits(QString queryName)
+{
+ std::vector<DeBruijnNode *> returnVector;
+
+ if (g_blastSearch->m_blastQueries.m_queries.size() == 0)
+ return returnVector;
+
+ std::vector<BlastQuery *> queries;
+
+ //If "all" is selected, then we'll display nodes with hits from any query
+ if (queryName == "all")
+ queries = g_blastSearch->m_blastQueries.m_queries;
+
+ //If only one query is selected, then we just display nodes with hits from that query
+ else
+ queries.push_back(g_blastSearch->m_blastQueries.getQueryFromName(queryName));
+
+ //Add pointers to nodes that have a hit for the selected target(s).
+ for (size_t i = 0; i < queries.size(); ++i)
+ {
+ BlastQuery * currentQuery = queries[i];
+ for (int j = 0; j < g_blastSearch->m_allHits.size(); ++j)
+ {
+ if (g_blastSearch->m_allHits[j]->m_query == currentQuery)
+ returnVector.push_back(g_blastSearch->m_allHits[j]->m_node);
+ }
+ }
+
+ return returnVector;
+}
+
+std::vector<DeBruijnNode *> AssemblyGraph::getNodesInDepthRange(double min,
+ double max)
+{
+ std::vector<DeBruijnNode *> returnVector;
+
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ DeBruijnNode * node = i.value();
+
+ if (node->isInDepthRange(min, max))
+ returnVector.push_back(node);
+ }
+ return returnVector;
+}
+
+
+QStringList AssemblyGraph::removeNullStringsFromList(QStringList in)
+{
+ QStringList out;
+
+ for (int i = 0; i < in.size(); ++i)
+ {
+ QString string = in.at(i);
+ if (string.length() > 0)
+ out.push_back(string);
+ }
+ return out;
+}
+
+
+//Unlike the equivalent function in MainWindow, this does the graph layout in the main thread.
+void AssemblyGraph::layoutGraph()
+{
+ ogdf::FMMMLayout fmmm;
+ GraphLayoutWorker * graphLayoutWorker = new GraphLayoutWorker(&fmmm, m_graphAttributes, m_edgeArray,
+ g_settings->graphLayoutQuality,
+ useLinearLayout(),
+ g_settings->componentSeparation);
+ graphLayoutWorker->layoutGraph();
+}
+
+
+void AssemblyGraph::setAllEdgesExactOverlap(int overlap)
+{
+ QMapIterator<QPair<DeBruijnNode*, DeBruijnNode*>, DeBruijnEdge*> i(m_deBruijnGraphEdges);
+ while (i.hasNext())
+ {
+ i.next();
+ i.value()->setExactOverlap(overlap);
+ }
+}
+
+
+
+void AssemblyGraph::autoDetermineAllEdgesExactOverlap()
+{
+ int edgeCount = int(m_deBruijnGraphEdges.size());
+ if (edgeCount == 0)
+ return;
+
+ //Determine the overlap for each edge.
+ QMapIterator<QPair<DeBruijnNode*, DeBruijnNode*>, DeBruijnEdge*> i(m_deBruijnGraphEdges);
+ while (i.hasNext())
+ {
+ i.next();
+ i.value()->autoDetermineExactOverlap();
+ }
+
+ //The expectation here is that most overlaps will be
+ //the same or from a small subset of possible sizes.
+ //Edges with an overlap that do not match the most common
+ //overlap(s) are suspected of having their overlap
+ //misidentified. They are therefore rechecked using the
+ //common ones.
+ std::vector<int> overlapCounts = makeOverlapCountVector();
+
+ //Sort the overlaps in order of decreasing numbers of edges.
+ //I.e. the first overlap size in the vector will be the most
+ //common overlap, the second will be the second most common,
+ //etc.
+ std::vector<int> sortedOverlaps;
+ int overlapsSoFar = 0;
+ double fractionOverlapsFound = 0.0;
+ while (fractionOverlapsFound < 1.0)
+ {
+ int mostCommonOverlap = 0;
+ int mostCommonOverlapCount = 0;
+
+ //Find the overlap size with the most instances.
+ for (size_t i = 0; i < overlapCounts.size(); ++i)
+ {
+ if (overlapCounts[i] > mostCommonOverlapCount)
+ {
+ mostCommonOverlap = int(i);
+ mostCommonOverlapCount = overlapCounts[i];
+ }
+ }
+
+ //Add that overlap to the common collection and remove it from the counts.
+ sortedOverlaps.push_back(mostCommonOverlap);
+ overlapsSoFar += mostCommonOverlapCount;
+ fractionOverlapsFound = double(overlapsSoFar) / edgeCount;
+ overlapCounts[mostCommonOverlap] = 0;
+ }
+
+ //For each edge, see if one of the more common overlaps also works.
+ //If so, use that instead.
+ QMapIterator<QPair<DeBruijnNode*, DeBruijnNode*>, DeBruijnEdge*> j(m_deBruijnGraphEdges);
+ while (j.hasNext())
+ {
+ j.next();
+ DeBruijnEdge * edge = j.value();
+ for (size_t k = 0; k < sortedOverlaps.size(); ++k)
+ {
+ if (edge->getOverlap() == sortedOverlaps[k])
+ break;
+ else if (edge->testExactOverlap(sortedOverlaps[k]))
+ {
+ edge->setOverlap(sortedOverlaps[k]);
+ break;
+ }
+ }
+ }
+}
+
+
+//This function produces a vector for which the values are the number
+//of edges that have an overlap of the index length.
+//E.g. if overlapVector[61] = 123, that means that 123 edges have an
+//overlap of 61.
+std::vector<int> AssemblyGraph::makeOverlapCountVector()
+{
+ std::vector<int> overlapCounts;
+
+ QMapIterator<QPair<DeBruijnNode*, DeBruijnNode*>, DeBruijnEdge*> i(m_deBruijnGraphEdges);
+ while (i.hasNext())
+ {
+ i.next();
+ int overlap = i.value()->getOverlap();
+
+ //Add the overlap to the count vector
+ if (int(overlapCounts.size()) < overlap + 1)
+ overlapCounts.resize(overlap + 1, 0);
+ ++overlapCounts[overlap];
+ }
+
+ return overlapCounts;
+}
+
+
+//The function returns a node name, replacing "+" at the end with "-" or
+//vice-versa.
+QString AssemblyGraph::getOppositeNodeName(QString nodeName)
+{
+ QChar lastChar = nodeName.at(nodeName.size() - 1);
+ nodeName.chop(1);
+
+ if (lastChar == '-')
+ return nodeName + "+";
+ else
+ return nodeName + "-";
+}
+
+
+void AssemblyGraph::readFastaFile(QString filename, std::vector<QString> * names, std::vector<QByteArray> *sequences)
+{
+ QFile inputFile(filename);
+ if (inputFile.open(QIODevice::ReadOnly))
+ {
+ QString name = "";
+ QByteArray sequence = "";
+
+ QTextStream in(&inputFile);
+ while (!in.atEnd())
+ {
+ QApplication::processEvents();
+
+ QString line = in.readLine();
+
+ if (line.length() == 0)
+ continue;
+
+ if (line.at(0) == '>')
+ {
+ //If there is a current sequence, add it to the vectors now.
+ if (name.length() > 0)
+ {
+ names->push_back(name);
+ sequences->push_back(sequence);
+ }
+
+ line.remove(0, 1); //Remove '>' from start
+ name = line;
+ sequence = "";
+ }
+
+ else //It's a sequence line
+ sequence += line.simplified();
+ }
+
+ //Add the last target to the results now.
+ if (name.length() > 0)
+ {
+ names->push_back(name);
+ sequences->push_back(sequence);
+ }
+
+ inputFile.close();
+ }
+}
+
+
+void AssemblyGraph::recalculateAllDepthsRelativeToDrawnMean()
+{
+ double meanDrawnDepth = getMeanDepth(true);
+ QMapIterator<QString, DeBruijnNode*> k(m_deBruijnGraphNodes);
+ while (k.hasNext())
+ {
+ k.next();
+ DeBruijnNode * node = k.value();
+
+ double depthRelativeToMeanDrawnDepth;
+ if (meanDrawnDepth == 0)
+ depthRelativeToMeanDrawnDepth = 1.0;
+ else
+ depthRelativeToMeanDrawnDepth = node->getDepth() / meanDrawnDepth;
+
+ node->setDepthRelativeToMeanDrawnDepth(depthRelativeToMeanDrawnDepth);
+ }
+}
+
+
+void AssemblyGraph::recalculateAllNodeWidths()
+{
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ GraphicsItemNode * graphicsItemNode = i.value()->getGraphicsItemNode();
+ if (graphicsItemNode != 0)
+ graphicsItemNode->setWidth();
+ }
+}
+
+
+
+void AssemblyGraph::clearAllCsvData()
+{
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ i.value()->clearCsvData();
+ }
+}
+
+
+int AssemblyGraph::getDrawnNodeCount() const
+{
+ int nodeCount = 0;
+
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ DeBruijnNode * node = i.value();
+
+ if (node->isDrawn())
+ ++nodeCount;
+ }
+
+ return nodeCount;
+}
+
+
+void AssemblyGraph::deleteNodes(std::vector<DeBruijnNode *> * nodes)
+{
+ //Build a list of nodes to delete.
+ QList<DeBruijnNode *> nodesToDelete;
+ for (size_t i = 0; i < nodes->size(); ++i)
+ {
+ DeBruijnNode * node = (*nodes)[i];
+ DeBruijnNode * rcNode = node->getReverseComplement();
+
+ if (!nodesToDelete.contains(node))
+ nodesToDelete.push_back(node);
+ if (!nodesToDelete.contains(rcNode))
+ nodesToDelete.push_back(rcNode);
+ }
+
+ //Build a list of edges to delete.
+ std::vector<DeBruijnEdge *> edgesToDelete;
+ for (int i = 0; i < nodesToDelete.size(); ++i)
+ {
+ DeBruijnNode * node = nodesToDelete[i];
+ const std::vector<DeBruijnEdge *> * nodeEdges = node->getEdgesPointer();
+ for (size_t j = 0; j < nodeEdges->size(); ++j)
+ {
+ DeBruijnEdge * edge = (*nodeEdges)[j];
+ bool alreadyAdded = std::find(edgesToDelete.begin(), edgesToDelete.end(), edge) != edgesToDelete.end();
+ if (!alreadyAdded)
+ edgesToDelete.push_back(edge);
+ }
+ }
+
+ //Build a list of node names to delete.
+ QStringList nodesNamesToDelete;
+ for (int i = 0; i < nodesToDelete.size(); ++i)
+ {
+ DeBruijnNode * node = nodesToDelete[i];
+ nodesNamesToDelete.push_back(node->getName());
+ }
+
+ //Remove the edges from the graph,
+ deleteEdges(&edgesToDelete);
+
+ //Remove the nodes from the graph.
+ for (int i = 0; i < nodesNamesToDelete.size(); ++i)
+ {
+ QString nodeName = nodesNamesToDelete[i];
+ m_deBruijnGraphNodes.remove(nodeName);
+ }
+ for (int i = 0; i < nodesToDelete.size(); ++i)
+ {
+ DeBruijnNode * node = nodesToDelete[i];
+ delete node;
+ }
+}
+
+void AssemblyGraph::deleteEdges(std::vector<DeBruijnEdge *> * edges)
+{
+ //Build a list of edges to delete.
+ QList<DeBruijnEdge *> edgesToDelete;
+ for (size_t i = 0; i < edges->size(); ++i)
+ {
+ DeBruijnEdge * edge = (*edges)[i];
+ DeBruijnEdge * rcEdge = edge->getReverseComplement();
+
+ if (!edgesToDelete.contains(edge))
+ edgesToDelete.push_back(edge);
+ if (!edgesToDelete.contains(rcEdge))
+ edgesToDelete.push_back(rcEdge);
+ }
+
+ //Remove the edges from the graph,
+ for (int i = 0; i < edgesToDelete.size(); ++i)
+ {
+ DeBruijnEdge * edge = edgesToDelete[i];
+ DeBruijnNode * startingNode = edge->getStartingNode();
+ DeBruijnNode * endingNode = edge->getEndingNode();
+
+ m_deBruijnGraphEdges.remove(QPair<DeBruijnNode*, DeBruijnNode*>(startingNode, endingNode));
+ startingNode->removeEdge(edge);
+ endingNode->removeEdge(edge);
+
+ delete edge;
+ }
+}
+
+
+
+//This function assumes it is receiving a positive node. It will duplicate both
+//the positive and negative node in the pair. It divided their depth in
+//two, giving half to each node.
+void AssemblyGraph::duplicateNodePair(DeBruijnNode * node, MyGraphicsScene * scene)
+{
+ DeBruijnNode * originalPosNode = node;
+ DeBruijnNode * originalNegNode = node->getReverseComplement();
+
+ QString newNodeBaseName = getNewNodeName(originalPosNode->getName());
+ QString newPosNodeName = newNodeBaseName + "+";
+ QString newNegNodeName = newNodeBaseName + "-";
+
+ double newDepth = node->getDepth() / 2.0;
+
+ //Create the new nodes.
+ DeBruijnNode * newPosNode = new DeBruijnNode(newPosNodeName, newDepth, originalPosNode->getSequence());
+ DeBruijnNode * newNegNode = new DeBruijnNode(newNegNodeName, newDepth, originalNegNode->getSequence());
+ newPosNode->setReverseComplement(newNegNode);
+ newNegNode->setReverseComplement(newPosNode);
+
+ //Copy over additional stuff from the original nodes.
+ newPosNode->setCustomColour(originalPosNode->getCustomColour());
+ newNegNode->setCustomColour(originalNegNode->getCustomColour());
+ newPosNode->setCustomLabel(originalPosNode->getCustomLabel());
+ newNegNode->setCustomLabel(originalNegNode->getCustomLabel());
+ newPosNode->setCsvData(originalPosNode->getAllCsvData());
+ newNegNode->setCsvData(originalNegNode->getAllCsvData());
+
+ m_deBruijnGraphNodes.insert(newPosNodeName, newPosNode);
+ m_deBruijnGraphNodes.insert(newNegNodeName, newNegNode);
+
+ std::vector<DeBruijnEdge *> leavingEdges = originalPosNode->getLeavingEdges();
+ for (size_t i = 0; i < leavingEdges.size(); ++i)
+ {
+ DeBruijnEdge * edge = leavingEdges[i];
+ DeBruijnNode * downstreamNode = edge->getEndingNode();
+ createDeBruijnEdge(newPosNodeName, downstreamNode->getName(),
+ edge->getOverlap(), edge->getOverlapType());
+ }
+
+ std::vector<DeBruijnEdge *> enteringEdges = originalPosNode->getEnteringEdges();
+ for (size_t i = 0; i < enteringEdges.size(); ++i)
+ {
+ DeBruijnEdge * edge = enteringEdges[i];
+ DeBruijnNode * upstreamNode = edge->getStartingNode();
+ createDeBruijnEdge(upstreamNode->getName(), newPosNodeName,
+ edge->getOverlap(), edge->getOverlapType());
+ }
+
+ originalPosNode->setDepth(newDepth);
+ originalNegNode->setDepth(newDepth);
+
+ double meanDrawnDepth = getMeanDepth(true);
+ double depthRelativeToMeanDrawnDepth;
+ if (meanDrawnDepth == 0)
+ depthRelativeToMeanDrawnDepth = 1.0;
+ else
+ depthRelativeToMeanDrawnDepth = originalPosNode->getDepth() / meanDrawnDepth;
+
+ originalPosNode->setDepthRelativeToMeanDrawnDepth(depthRelativeToMeanDrawnDepth);
+ originalNegNode->setDepthRelativeToMeanDrawnDepth(depthRelativeToMeanDrawnDepth);
+ newPosNode->setDepthRelativeToMeanDrawnDepth(depthRelativeToMeanDrawnDepth);
+ newPosNode->setDepthRelativeToMeanDrawnDepth(depthRelativeToMeanDrawnDepth);
+
+ duplicateGraphicsNode(originalPosNode, newPosNode, scene);
+ duplicateGraphicsNode(originalNegNode, newNegNode, scene);
+}
+
+QString AssemblyGraph::getNewNodeName(QString oldNodeName)
+{
+ oldNodeName.chop(1); //Remove trailing +/-
+
+ QString newNodeNameBase = oldNodeName + "_copy";
+ QString newNodeName = newNodeNameBase;
+
+ int suffix = 1;
+ while (m_deBruijnGraphNodes.contains(newNodeName + "+"))
+ {
+ ++suffix;
+ newNodeName = newNodeNameBase + QString::number(suffix);
+ }
+
+ return newNodeName;
+}
+
+
+void AssemblyGraph::duplicateGraphicsNode(DeBruijnNode * originalNode, DeBruijnNode * newNode, MyGraphicsScene * scene)
+{
+ GraphicsItemNode * originalGraphicsItemNode = originalNode->getGraphicsItemNode();
+ if (originalGraphicsItemNode == 0)
+ return;
+
+ GraphicsItemNode * newGraphicsItemNode = new GraphicsItemNode(newNode, originalGraphicsItemNode);
+
+ newNode->setGraphicsItemNode(newGraphicsItemNode);
+ newGraphicsItemNode->setFlag(QGraphicsItem::ItemIsSelectable);
+ newGraphicsItemNode->setFlag(QGraphicsItem::ItemIsMovable);
+
+ originalGraphicsItemNode->shiftPointsLeft();
+ newGraphicsItemNode->shiftPointsRight();
+ originalGraphicsItemNode->fixEdgePaths();
+
+ originalGraphicsItemNode->setNodeColour();
+ newGraphicsItemNode->setNodeColour();
+
+ originalGraphicsItemNode->setWidth();
+
+ scene->addItem(newGraphicsItemNode);
+
+ const std::vector<DeBruijnEdge *> * newEdges = newNode->getEdgesPointer();
+ for (size_t i = 0; i < newEdges->size(); ++i)
+ {
+ DeBruijnEdge * newEdge = (*newEdges)[i];
+ GraphicsItemEdge * graphicsItemEdge = new GraphicsItemEdge(newEdge);
+ graphicsItemEdge->setZValue(-1.0);
+ newEdge->setGraphicsItemEdge(graphicsItemEdge);
+ graphicsItemEdge->setFlag(QGraphicsItem::ItemIsSelectable);
+ scene->addItem(graphicsItemEdge);
+ }
+}
+
+
+//This function will merge the given nodes, if possible. Nodes can only be
+//merged if they are in a simple, unbranching path with no extra edges. If the
+//merge is successful, it returns true, otherwise false.
+bool AssemblyGraph::mergeNodes(QList<DeBruijnNode *> nodes, MyGraphicsScene * scene,
+ bool recalulateDepth)
+{
+ if (nodes.size() == 0)
+ return true;
+
+ //We now need to sort the nodes into merge order.
+ QList<DeBruijnNode *> orderedList;
+ orderedList.push_back(nodes[0]);
+ nodes.pop_front();
+
+ bool addedNode;
+ do
+ {
+ addedNode = false;
+ for (int i = 0; i < nodes.size(); ++i)
+ {
+ DeBruijnNode * potentialNextNode = nodes[i];
+
+ //Check if the node can be added to the end of the list.
+ if (canAddNodeToEndOfMergeList(&orderedList, potentialNextNode))
+ {
+ orderedList.push_back(potentialNextNode);
+ nodes.removeAt(i);
+ addedNode = true;
+ break;
+ }
+
+ //Check if the node can be added to the front of the list.
+ if (canAddNodeToStartOfMergeList(&orderedList, potentialNextNode))
+ {
+ orderedList.push_front(potentialNextNode);
+ nodes.removeAt(i);
+ addedNode = true;
+ break;
+ }
+
+ //If neither of those worked, then we should try the node's reverse
+ //complement.
+ DeBruijnNode * potentialNextNodeRevComp = potentialNextNode->getReverseComplement();
+ if (canAddNodeToEndOfMergeList(&orderedList, potentialNextNodeRevComp))
+ {
+ orderedList.push_back(potentialNextNodeRevComp);
+ nodes.removeAt(i);
+ addedNode = true;
+ break;
+ }
+ if (canAddNodeToStartOfMergeList(&orderedList, potentialNextNodeRevComp))
+ {
+ orderedList.push_front(potentialNextNodeRevComp);
+ nodes.removeAt(i);
+ addedNode = true;
+ break;
+ }
+ }
+
+ if (nodes.size() == 0)
+ break;
+
+ } while (addedNode);
+
+ //If there are still nodes left in the first list, then they don't form a
+ //nice simple path and the merge won't work.
+ if (nodes.size() > 0)
+ return false;
+
+ double mergedNodeDepth = getMeanDepth(orderedList);
+
+ Path posPath = Path::makeFromOrderedNodes(orderedList, false);
+ QByteArray mergedNodePosSequence = posPath.getPathSequence();
+
+ QList<DeBruijnNode *> revCompOrderedList;
+ for (int i = 0; i < orderedList.size(); ++i)
+ revCompOrderedList.push_front(orderedList[i]->getReverseComplement());
+
+ Path negPath = Path::makeFromOrderedNodes(revCompOrderedList, false);
+ QByteArray mergedNodeNegSequence = negPath.getPathSequence();
+
+ QString newNodeBaseName;
+ for (int i = 0; i < orderedList.size(); ++i)
+ {
+ newNodeBaseName += orderedList[i]->getNameWithoutSign();
+ if (i < orderedList.size() - 1)
+ newNodeBaseName += "_";
+ }
+ newNodeBaseName = getUniqueNodeName(newNodeBaseName);
+ QString newPosNodeName = newNodeBaseName + "+";
+ QString newNegNodeName = newNodeBaseName + "-";
+
+ DeBruijnNode * newPosNode = new DeBruijnNode(newPosNodeName, mergedNodeDepth, mergedNodePosSequence);
+ DeBruijnNode * newNegNode = new DeBruijnNode(newNegNodeName, mergedNodeDepth, mergedNodeNegSequence);
+
+ newPosNode->setReverseComplement(newNegNode);
+ newNegNode->setReverseComplement(newPosNode);
+
+ m_deBruijnGraphNodes.insert(newPosNodeName, newPosNode);
+ m_deBruijnGraphNodes.insert(newNegNodeName, newNegNode);
+
+ std::vector<DeBruijnEdge *> leavingEdges = orderedList.back()->getLeavingEdges();
+ for (size_t i = 0; i < leavingEdges.size(); ++i)
+ {
+ DeBruijnEdge * leavingEdge = leavingEdges[i];
+ createDeBruijnEdge(newPosNodeName, leavingEdge->getEndingNode()->getName(), leavingEdge->getOverlap(),
+ leavingEdge->getOverlapType());
+ }
+
+ std::vector<DeBruijnEdge *> enteringEdges = orderedList.front()->getEnteringEdges();
+ for (size_t i = 0; i < enteringEdges.size(); ++i)
+ {
+ DeBruijnEdge * enteringEdge = enteringEdges[i];
+ createDeBruijnEdge(enteringEdge->getStartingNode()->getName(), newPosNodeName, enteringEdge->getOverlap(),
+ enteringEdge->getOverlapType());
+ }
+
+ if (recalulateDepth)
+ {
+ double meanDrawnDepth = getMeanDepth(true);
+ double depthRelativeToMeanDrawnDepth;
+ if (meanDrawnDepth == 0)
+ depthRelativeToMeanDrawnDepth = 1.0;
+ else
+ depthRelativeToMeanDrawnDepth = newPosNode->getDepth() / meanDrawnDepth;
+
+ newPosNode->setDepthRelativeToMeanDrawnDepth(depthRelativeToMeanDrawnDepth);
+ newNegNode->setDepthRelativeToMeanDrawnDepth(depthRelativeToMeanDrawnDepth);
+ }
+ else
+ {
+ newPosNode->setDepthRelativeToMeanDrawnDepth(1.0);
+ newNegNode->setDepthRelativeToMeanDrawnDepth(1.0);
+ }
+
+ mergeGraphicsNodes(&orderedList, &revCompOrderedList, newPosNode, scene);
+
+ std::vector<DeBruijnNode *> nodesToDelete;
+ for (int i = 0; i < orderedList.size(); ++i)
+ nodesToDelete.push_back(orderedList[i]);
+ deleteNodes(&nodesToDelete);
+
+ return true;
+}
+
+
+bool AssemblyGraph::canAddNodeToStartOfMergeList(QList<DeBruijnNode *> * mergeList,
+ DeBruijnNode * potentialNode)
+{
+ DeBruijnNode * firstNode = mergeList->front();
+ std::vector<DeBruijnEdge *> edgesEnteringFirstNode = firstNode->getEnteringEdges();
+ std::vector<DeBruijnEdge *> edgesLeavingPotentialNode = potentialNode->getLeavingEdges();
+ return (edgesEnteringFirstNode.size() == 1 &&
+ edgesLeavingPotentialNode.size() == 1 &&
+ edgesEnteringFirstNode[0]->getStartingNode() == potentialNode &&
+ edgesLeavingPotentialNode[0]->getEndingNode() == firstNode);
+}
+
+
+bool AssemblyGraph::canAddNodeToEndOfMergeList(QList<DeBruijnNode *> * mergeList,
+ DeBruijnNode * potentialNode)
+{
+ DeBruijnNode * lastNode = mergeList->back();
+ std::vector<DeBruijnEdge *> edgesLeavingLastNode = lastNode->getLeavingEdges();
+ std::vector<DeBruijnEdge *> edgesEnteringPotentialNode = potentialNode->getEnteringEdges();
+ return (edgesLeavingLastNode.size() == 1 &&
+ edgesEnteringPotentialNode.size() == 1 &&
+ edgesLeavingLastNode[0]->getEndingNode() == potentialNode &&
+ edgesEnteringPotentialNode[0]->getStartingNode() == lastNode);
+}
+
+
+QString AssemblyGraph::getUniqueNodeName(QString baseName)
+{
+ //If the base name is untaken, then that's it!
+ if (!m_deBruijnGraphNodes.contains(baseName + "+"))
+ return baseName;
+
+ int suffix = 1;
+ while (true)
+ {
+ ++suffix;
+ QString potentialUniqueName = baseName + "_" + QString::number(suffix);
+ if (!m_deBruijnGraphNodes.contains(potentialUniqueName + "+"))
+ return potentialUniqueName;
+ }
+
+ //Code should never get here.
+ return baseName;
+}
+
+
+void AssemblyGraph::mergeGraphicsNodes(QList<DeBruijnNode *> * originalNodes,
+ QList<DeBruijnNode *> * revCompOriginalNodes,
+ DeBruijnNode * newNode,
+ MyGraphicsScene * scene)
+{
+ bool success = mergeGraphicsNodes2(originalNodes, newNode, scene);
+ if (success)
+ newNode->setAsDrawn();
+
+ if (g_settings->doubleMode) {
+ DeBruijnNode * newRevComp = newNode->getReverseComplement();
+ bool revCompSuccess = mergeGraphicsNodes2(revCompOriginalNodes, newRevComp, scene);
+ if (revCompSuccess)
+ newRevComp->setAsDrawn();
+ }
+
+ std::vector<DeBruijnNode *> nodesToRemove;
+ for (int i = 0; i < originalNodes->size(); ++i)
+ nodesToRemove.push_back((*originalNodes)[i]);
+ removeGraphicsItemNodes(&nodesToRemove, true, scene);
+}
+
+
+bool AssemblyGraph::mergeGraphicsNodes2(QList<DeBruijnNode *> * originalNodes,
+ DeBruijnNode * newNode,
+ MyGraphicsScene * scene)
+{
+ bool success = true;
+ std::vector<QPointF> linePoints;
+
+ for (int i = 0; i < originalNodes->size(); ++i)
+ {
+ DeBruijnNode * node = (*originalNodes)[i];
+
+ //If we are in single mode, then we should check for a GraphicsItemNode only
+ //in the positive nodes.
+ bool opposite = false;
+ if (!g_settings->doubleMode && node->isNegativeNode())
+ {
+ node = node->getReverseComplement();
+ opposite = true;
+ }
+
+ GraphicsItemNode * originalGraphicsItemNode = node->getGraphicsItemNode();
+ if (originalGraphicsItemNode == 0)
+ {
+ success = false;
+ break;
+ }
+
+ std::vector<QPointF> originalLinePoints = originalGraphicsItemNode->m_linePoints;
+
+ //Add the original line points to the new line point collection. If we
+ //are working with an opposite node, then we need to reverse the order.
+ if (opposite)
+ {
+ for (size_t j = originalLinePoints.size(); j > 0; --j)
+ linePoints.push_back(originalLinePoints[j-1]);
+ }
+ else
+ {
+ for (size_t j = 0; j < originalLinePoints.size(); ++j)
+ linePoints.push_back(originalLinePoints[j]);
+ }
+ }
+
+ if (success)
+ {
+ GraphicsItemNode * newGraphicsItemNode = new GraphicsItemNode(newNode, linePoints);
+
+ newNode->setGraphicsItemNode(newGraphicsItemNode);
+ newGraphicsItemNode->setFlag(QGraphicsItem::ItemIsSelectable);
+ newGraphicsItemNode->setFlag(QGraphicsItem::ItemIsMovable);
+
+ newGraphicsItemNode->setNodeColour();
+
+ scene->addItem(newGraphicsItemNode);
+
+ const std::vector<DeBruijnEdge *> * newEdges = newNode->getEdgesPointer();
+ for (size_t i = 0; i < newEdges->size(); ++i)
+ {
+ DeBruijnEdge * newEdge = (*newEdges)[i];
+ GraphicsItemEdge * graphicsItemEdge = new GraphicsItemEdge(newEdge);
+ graphicsItemEdge->setZValue(-1.0);
+ newEdge->setGraphicsItemEdge(graphicsItemEdge);
+ graphicsItemEdge->setFlag(QGraphicsItem::ItemIsSelectable);
+ scene->addItem(graphicsItemEdge);
+ }
+ }
+ return success;
+}
+
+
+
+//If reverseComplement is true, this function will also remove the graphics items for reverse complements of the nodes.
+void AssemblyGraph::removeGraphicsItemNodes(const std::vector<DeBruijnNode *> * nodes,
+ bool reverseComplement,
+ MyGraphicsScene * scene)
+{
+ QSet<GraphicsItemNode *> graphicsItemNodesToDelete;
+ for (size_t i = 0; i < nodes->size(); ++i)
+ {
+ DeBruijnNode * node = (*nodes)[i];
+ removeAllGraphicsEdgesFromNode(node, reverseComplement, scene);
+
+ GraphicsItemNode * graphicsItemNode = node->getGraphicsItemNode();
+ if (graphicsItemNode != 0 && !graphicsItemNodesToDelete.contains(graphicsItemNode))
+ graphicsItemNodesToDelete.insert(graphicsItemNode);
+ node->setGraphicsItemNode(0);
+
+ if (reverseComplement)
+ {
+ DeBruijnNode * rcNode = node->getReverseComplement();
+ GraphicsItemNode * rcGraphicsItemNode = rcNode->getGraphicsItemNode();
+ if (rcGraphicsItemNode != 0 && !graphicsItemNodesToDelete.contains(rcGraphicsItemNode))
+ graphicsItemNodesToDelete.insert(rcGraphicsItemNode);
+ rcNode->setGraphicsItemNode(0);
+ }
+ }
+
+ if (scene != 0)
+ scene->blockSignals(true);
+ QSetIterator<GraphicsItemNode *> i(graphicsItemNodesToDelete);
+ while (i.hasNext())
+ {
+ GraphicsItemNode * graphicsItemNode = i.next();
+ if (graphicsItemNode != 0)
+ {
+ if (scene != 0)
+ scene->removeItem(graphicsItemNode);
+ delete graphicsItemNode;
+ }
+ }
+ if (scene != 0)
+ scene->blockSignals(false);
+}
+
+
+void AssemblyGraph::removeAllGraphicsEdgesFromNode(DeBruijnNode * node, bool reverseComplement,
+ MyGraphicsScene * scene)
+{
+ const std::vector<DeBruijnEdge *> * edges = node->getEdgesPointer();
+ removeGraphicsItemEdges(edges, reverseComplement, scene);
+}
+
+void AssemblyGraph::removeGraphicsItemEdges(const std::vector<DeBruijnEdge *> * edges,
+ bool reverseComplement,
+ MyGraphicsScene * scene)
+{
+ QSet<GraphicsItemEdge *> graphicsItemEdgesToDelete;
+ for (size_t i = 0; i < edges->size(); ++i)
+ {
+ DeBruijnEdge * edge = (*edges)[i];
+
+ GraphicsItemEdge * graphicsItemEdge = edge->getGraphicsItemEdge();
+ if (graphicsItemEdge != 0 && !graphicsItemEdgesToDelete.contains(graphicsItemEdge))
+ graphicsItemEdgesToDelete.insert(graphicsItemEdge);
+ edge->setGraphicsItemEdge(0);
+
+ if (reverseComplement)
+ {
+ DeBruijnEdge * rcEdge = edge->getReverseComplement();
+ GraphicsItemEdge * rcGraphicsItemEdge = rcEdge->getGraphicsItemEdge();
+ if (rcGraphicsItemEdge != 0 && !graphicsItemEdgesToDelete.contains(rcGraphicsItemEdge))
+ graphicsItemEdgesToDelete.insert(rcGraphicsItemEdge);
+ rcEdge->setGraphicsItemEdge(0);
+ }
+ }
+
+ if (scene != 0)
+ scene->blockSignals(true);
+ QSetIterator<GraphicsItemEdge *> i(graphicsItemEdgesToDelete);
+ while (i.hasNext())
+ {
+ GraphicsItemEdge * graphicsItemEdge = i.next();
+ if (graphicsItemEdge != 0)
+ {
+ if (scene != 0)
+ scene->removeItem(graphicsItemEdge);
+ delete graphicsItemEdge;
+ }
+ }
+ if (scene != 0)
+ scene->blockSignals(false);
+}
+
+
+//This function simplifies the graph by merging all possible nodes in a simple
+//line. It returns the number of merges that it did.
+//It gets a pointer to the progress dialog as well so it can check to see if the
+//user has cancelled the merge.
+int AssemblyGraph::mergeAllPossible(MyGraphicsScene * scene,
+ MyProgressDialog * progressDialog)
+{
+ //Create a set of all nodes.
+ QSet<DeBruijnNode *> uncheckedNodes;
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ uncheckedNodes.insert(i.value());
+ }
+
+ //Create a list of all merges to be done.
+ QList< QList<DeBruijnNode *> > allMerges;
+ QMapIterator<QString, DeBruijnNode*> j(m_deBruijnGraphNodes);
+ while (j.hasNext())
+ {
+ j.next();
+ DeBruijnNode * node = j.value();
+
+ //If the current node isn't checked, then we will find the longest
+ //possible mergable sequence containing this node.
+ if (uncheckedNodes.contains(node))
+ {
+ QList<DeBruijnNode *> nodesToMerge;
+ nodesToMerge.push_back(node);
+
+ uncheckedNodes.remove(node);
+ uncheckedNodes.remove(node->getReverseComplement());
+
+ //Extend forward as much as possible.
+ bool extended;
+ do
+ {
+ extended = false;
+ DeBruijnNode * last = nodesToMerge.back();
+ std::vector<DeBruijnEdge *> outgoingEdges = last->getLeavingEdges();
+ if (outgoingEdges.size() == 1)
+ {
+ DeBruijnEdge * potentialEdge = outgoingEdges[0];
+ DeBruijnNode * potentialNode = potentialEdge->getEndingNode();
+ std::vector<DeBruijnEdge *> edgesEnteringPotentialNode = potentialNode->getEnteringEdges();
+ if (edgesEnteringPotentialNode.size() == 1 &&
+ edgesEnteringPotentialNode[0] == potentialEdge &&
+ !nodesToMerge.contains(potentialNode) &&
+ uncheckedNodes.contains(potentialNode))
+ {
+ nodesToMerge.push_back(potentialNode);
+ uncheckedNodes.remove(potentialNode);
+ uncheckedNodes.remove(potentialNode->getReverseComplement());
+ extended = true;
+ }
+ }
+ } while (extended);
+
+ //Extend backward as much as possible.
+ do
+ {
+ extended = false;
+ DeBruijnNode * first = nodesToMerge.front();
+ std::vector<DeBruijnEdge *> incomingEdges = first->getEnteringEdges();
+ if (incomingEdges.size() == 1)
+ {
+ DeBruijnEdge * potentialEdge = incomingEdges[0];
+ DeBruijnNode * potentialNode = potentialEdge->getStartingNode();
+ std::vector<DeBruijnEdge *> edgesLeavingPotentialNode = potentialNode->getLeavingEdges();
+ if (edgesLeavingPotentialNode.size() == 1 &&
+ edgesLeavingPotentialNode[0] == potentialEdge &&
+ !nodesToMerge.contains(potentialNode) &&
+ uncheckedNodes.contains(potentialNode))
+ {
+ nodesToMerge.push_front(potentialNode);
+ uncheckedNodes.remove(potentialNode);
+ uncheckedNodes.remove(potentialNode->getReverseComplement());
+ extended = true;
+ }
+ }
+ } while (extended);
+
+ if (nodesToMerge.size() > 1)
+ allMerges.push_back(nodesToMerge);
+ }
+ }
+
+ //Now do the actual merges.
+ QApplication::processEvents();
+ emit setMergeTotalCount(allMerges.size());
+ for (int i = 0; i < allMerges.size(); ++i)
+ {
+ if (progressDialog != 0 && progressDialog->wasCancelled())
+ break;
+
+ mergeNodes(allMerges[i], scene, false);
+ emit setMergeCompletedCount(i+1);
+ QApplication::processEvents();
+ }
+
+ recalculateAllDepthsRelativeToDrawnMean();
+ recalculateAllNodeWidths();
+
+ return allMerges.size();
+}
+
+void AssemblyGraph::saveEntireGraphToFasta(QString filename)
+{
+ QFile file(filename);
+ file.open(QIODevice::WriteOnly | QIODevice::Text);
+ QTextStream out(&file);
+
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ out << i.value()->getFasta(true);
+ }
+}
+
+void AssemblyGraph::saveEntireGraphToFastaOnlyPositiveNodes(QString filename)
+{
+ QFile file(filename);
+ file.open(QIODevice::WriteOnly | QIODevice::Text);
+ QTextStream out(&file);
+
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ DeBruijnNode * node = i.value();
+ if (node->isPositiveNode())
+ out << node->getFasta(false);
+ }
+}
+
+bool AssemblyGraph::saveEntireGraphToGfa(QString filename)
+{
+ QFile file(filename);
+ bool success = file.open(QIODevice::WriteOnly | QIODevice::Text);
+ if (!success)
+ return false;
+
+ QTextStream out(&file);
+
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ DeBruijnNode * node = i.value();
+ if (node->isPositiveNode())
+ out << node->getGfaSegmentLine(m_depthTag);
+ }
+
+ QList<DeBruijnEdge*> edgesToSave;
+ QMapIterator<QPair<DeBruijnNode*, DeBruijnNode*>, DeBruijnEdge*> j(m_deBruijnGraphEdges);
+ while (j.hasNext())
+ {
+ j.next();
+ DeBruijnEdge * edge = j.value();
+ if (edge->isPositiveEdge())
+ edgesToSave.push_back(edge);
+ }
+
+ std::sort(edgesToSave.begin(), edgesToSave.end(), DeBruijnEdge::compareEdgePointers);
+
+ for (int i = 0; i < edgesToSave.size(); ++i)
+ out << edgesToSave[i]->getGfaLinkLine();
+
+ return true;
+}
+
+bool AssemblyGraph::saveVisibleGraphToGfa(QString filename)
+{
+ QFile file(filename);
+ bool success = file.open(QIODevice::WriteOnly | QIODevice::Text);
+ if (!success)
+ return false;
+
+ QTextStream out(&file);
+
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ DeBruijnNode * node = i.value();
+ if (node->thisNodeOrReverseComplementIsDrawn() && node->isPositiveNode())
+ out << node->getGfaSegmentLine(m_depthTag);
+ }
+
+ QList<DeBruijnEdge*> edgesToSave;
+ QMapIterator<QPair<DeBruijnNode*, DeBruijnNode*>, DeBruijnEdge*> j(m_deBruijnGraphEdges);
+ while (j.hasNext())
+ {
+ j.next();
+ DeBruijnEdge * edge = j.value();
+ if (edge->getStartingNode()->thisNodeOrReverseComplementIsDrawn() &&
+ edge->getEndingNode()->thisNodeOrReverseComplementIsDrawn() &&
+ edge->isPositiveEdge())
+ edgesToSave.push_back(edge);
+ }
+
+ std::sort(edgesToSave.begin(), edgesToSave.end(), DeBruijnEdge::compareEdgePointers);
+
+ for (int i = 0; i < edgesToSave.size(); ++i)
+ out << edgesToSave[i]->getGfaLinkLine();
+
+ return true;
+}
+
+
+
+
+//This function changes the name of a node pair. The new and old names are
+//both assumed to not include the +/- at the end.
+void AssemblyGraph::changeNodeName(QString oldName, QString newName)
+{
+ if (checkNodeNameValidity(newName) != NODE_NAME_OKAY)
+ return;
+
+ QString posOldNodeName = oldName + "+";
+ QString negOldNodeName = oldName + "-";
+
+ if (!m_deBruijnGraphNodes.contains(posOldNodeName))
+ return;
+ if (!m_deBruijnGraphNodes.contains(negOldNodeName))
+ return;
+
+ DeBruijnNode * posNode = m_deBruijnGraphNodes[posOldNodeName];
+ DeBruijnNode * negNode = m_deBruijnGraphNodes[negOldNodeName];
+
+ m_deBruijnGraphNodes.remove(posOldNodeName);
+ m_deBruijnGraphNodes.remove(negOldNodeName);
+
+ QString posNewNodeName = newName + "+";
+ QString negNewNodeName = newName + "-";
+
+ posNode->setName(posNewNodeName);
+ negNode->setName(negNewNodeName);
+
+ m_deBruijnGraphNodes.insert(posNewNodeName, posNode);
+ m_deBruijnGraphNodes.insert(negNewNodeName, negNode);
+}
+
+
+
+//This function checks whether a new node name is okay. It takes a node name
+//without a +/- at the end.
+NodeNameStatus AssemblyGraph::checkNodeNameValidity(QString nodeName)
+{
+ if (nodeName.contains('\t'))
+ return NODE_NAME_CONTAINS_TAB;
+
+ if (nodeName.contains('\n'))
+ return NODE_NAME_CONTAINS_NEWLINE;
+
+ if (nodeName.contains(','))
+ return NODE_NAME_CONTAINS_COMMA;
+
+ if (nodeName.contains(' '))
+ return NODE_NAME_CONTAINS_SPACE;
+
+ if (m_deBruijnGraphNodes.contains(nodeName + "+"))
+ return NODE_NAME_TAKEN;
+
+ return NODE_NAME_OKAY;
+}
+
+
+
+void AssemblyGraph::changeNodeDepth(std::vector<DeBruijnNode *> * nodes,
+ double newDepth)
+{
+ if (nodes->size() == 0)
+ return;
+
+ for (size_t i = 0; i < nodes->size(); ++i)
+ {
+ (*nodes)[i]->setDepth(newDepth);
+ (*nodes)[i]->getReverseComplement()->setDepth(newDepth);
+ }
+
+ //If this graph does not already have a depthTag, give it a depthTag of KC
+ //so the depth info will be saved.
+ if (m_depthTag == "")
+ m_depthTag = "KC";
+}
+
+
+
+//This function is used when making FASTA outputs - it breaks a sequence into
+//separate lines. The default interval is 70, as that seems to be what NCBI
+//uses.
+//The returned string always ends in a newline.
+QByteArray AssemblyGraph::addNewlinesToSequence(QByteArray sequence,
+ int interval)
+{
+ QByteArray output;
+
+ int charactersRemaining = sequence.length();
+ int currentIndex = 0;
+ while (charactersRemaining > interval)
+ {
+ output += sequence.mid(currentIndex, interval);
+ output += "\n";
+ charactersRemaining -= interval;
+ currentIndex += interval;
+ }
+ output += sequence.mid(currentIndex);
+ output += "\n";
+
+ return output;
+}
+
+
+
+
+//This function returns the number of dead ends in the graph.
+//It looks only at positive nodes, which can have 0, 1 or 2 dead ends each.
+//This value therefore varies between zero and twice the node count (specifically
+//the positive node count).
+int AssemblyGraph::getDeadEndCount() const
+{
+ int deadEndCount = 0;
+
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ DeBruijnNode * node = i.value();
+ if (node->isPositiveNode())
+ deadEndCount += node->getDeadEndCount();
+ }
+
+ return deadEndCount;
+}
+
+
+
+void AssemblyGraph::getNodeStats(int * n50, int * shortestNode, int * firstQuartile, int * median, int * thirdQuartile, int * longestNode) const
+{
+ if (m_totalLength == 0.0)
+ return;
+
+ std::vector<int> nodeLengths;
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ DeBruijnNode * node = i.value();
+ if (node->isPositiveNode())
+ nodeLengths.push_back(node->getLength());
+ }
+
+ if (nodeLengths.size() == 0)
+ return;
+
+ std::sort(nodeLengths.begin(), nodeLengths.end());
+
+ *shortestNode = nodeLengths.front();
+ *longestNode = nodeLengths.back();
+
+ double firstQuartileIndex = (nodeLengths.size() - 1) / 4.0;
+ double medianIndex = (nodeLengths.size() - 1) / 2.0;
+ double thirdQuartileIndex = (nodeLengths.size() - 1) * 3.0 / 4.0;
+
+ *firstQuartile = round(getValueUsingFractionalIndex(&nodeLengths, firstQuartileIndex));
+ *median = round(getValueUsingFractionalIndex(&nodeLengths, medianIndex));
+ *thirdQuartile = round(getValueUsingFractionalIndex(&nodeLengths, thirdQuartileIndex));
+
+ double halfTotalLength = m_totalLength / 2.0;
+ long long totalSoFar = 0;
+ for (int i = int(nodeLengths.size()) - 1; i >= 0 ; --i)
+ {
+ totalSoFar += nodeLengths[i];
+ if (totalSoFar >= halfTotalLength)
+ {
+ *n50 = nodeLengths[i];
+ break;
+ }
+ }
+}
+
+
+
+//This function uses an algorithm adapted from: http://math.hws.edu/eck/cs327_s04/chapter9.pdf
+void AssemblyGraph::getGraphComponentCountAndLargestComponentSize(int * componentCount, int * largestComponentLength) const
+{
+ *componentCount = 0;
+ *largestComponentLength = 0;
+
+ QSet<DeBruijnNode *> visitedNodes;
+ QList< QList<DeBruijnNode *> > connectedComponents;
+
+ //Loop through all positive nodes.
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ DeBruijnNode * v = i.value();
+ if (v->isNegativeNode())
+ continue;
+
+ //If the node has not yet been visited, then it must be the start of a new connected component.
+ if (!visitedNodes.contains(v))
+ {
+ QList<DeBruijnNode *> connectedComponent;
+
+ QQueue<DeBruijnNode *> q;
+ q.enqueue(v);
+ visitedNodes.insert(v);
+
+ while (!q.isEmpty())
+ {
+ DeBruijnNode * w = q.dequeue();
+ connectedComponent.push_back(w);
+
+ std::vector<DeBruijnNode *> connectedNodes = w->getAllConnectedPositiveNodes();
+ for (size_t j = 0; j < connectedNodes.size(); ++j)
+ {
+ DeBruijnNode * k = connectedNodes[j];
+ if (!visitedNodes.contains(k))
+ {
+ visitedNodes.insert(k);
+ q.enqueue(k);
+ }
+ }
+ }
+
+ connectedComponents.push_back(connectedComponent);
+ }
+ }
+
+ //Now that the list of connected components is built, we look for the
+ //largest one (as measured by total node length).
+ *componentCount = connectedComponents.size();
+ for (int i = 0; i < *componentCount; ++i)
+ {
+ int componentLength = 0;
+ for (int j = 0; j < connectedComponents[i].size(); ++j)
+ componentLength += connectedComponents[i][j]->getLength();
+
+ if (componentLength > *largestComponentLength)
+ *largestComponentLength = componentLength;
+ }
+}
+
+bool compareNodeDepth(DeBruijnNode * a, DeBruijnNode * b) {return (a->getDepth() < b->getDepth());}
+
+
+
+double AssemblyGraph::getMedianDepthByBase() const
+{
+ if (m_totalLength == 0)
+ return 0.0;
+
+ //Make a list of all nodes.
+ long long totalLength = 0;
+ QList<DeBruijnNode *> nodeList;
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ DeBruijnNode * node = i.value();
+ if (node->isPositiveNode())
+ {
+ nodeList.push_back(node);
+ totalLength += node->getLength();
+ }
+ }
+
+ //If there is only one node, then its depth is the median.
+ if (nodeList.size() == 1)
+ return nodeList[0]->getDepth();
+
+ //Sort the node list from low to high depth.
+ std::sort(nodeList.begin(), nodeList.end(), compareNodeDepth);
+
+ if (totalLength % 2 == 0) //Even total length
+ {
+ long long medianIndex2 = totalLength / 2;
+ long long medianIndex1 = medianIndex2 - 1;
+ double depth1 = findDepthAtIndex(&nodeList, medianIndex1);
+ double depth2 = findDepthAtIndex(&nodeList, medianIndex2);
+ return (depth1 + depth2) / 2.0;
+ }
+ else //Odd total length
+ {
+ long long medianIndex = (totalLength - 1) / 2;
+ return findDepthAtIndex(&nodeList, medianIndex);
+ }
+}
+
+
+
+//This function takes a node list sorted by depth and a target index (in terms of
+//the whole sequence length). It returns the depth at that index.
+double AssemblyGraph::findDepthAtIndex(QList<DeBruijnNode *> * nodeList, long long targetIndex) const
+{
+ long long lengthSoFar = 0;
+ for (int i = 0; i < nodeList->size(); ++i)
+ {
+ DeBruijnNode * node = (*nodeList)[i];
+
+ lengthSoFar += node->getLength();
+ long long currentIndex = lengthSoFar - 1;
+
+ if (currentIndex >= targetIndex)
+ return node->getDepth();
+ }
+ return 0.0;
+}
+
+
+
+long long AssemblyGraph::getEstimatedSequenceLength() const
+{
+ return getEstimatedSequenceLength(getMedianDepthByBase());
+}
+
+
+
+long long AssemblyGraph::getEstimatedSequenceLength(double medianDepthByBase) const
+{
+ long long estimatedSequenceLength = 0;
+ if (medianDepthByBase == 0.0)
+ return 0;
+
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ DeBruijnNode * node = i.value();
+
+ if (node->isPositiveNode())
+ {
+ int nodeLength = node->getLengthWithoutTrailingOverlap();
+ double relativeDepth = node->getDepth() / medianDepthByBase;
+
+ int closestIntegerDepth = round(relativeDepth);
+ int lengthAdjustedForDepth = nodeLength * closestIntegerDepth;
+
+ estimatedSequenceLength += lengthAdjustedForDepth;
+ }
+ }
+
+ return estimatedSequenceLength;
+}
+
+
+
+long long AssemblyGraph::getTotalLengthMinusEdgeOverlaps() const
+{
+ long long totalLength = 0;
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ DeBruijnNode * node = i.value();
+ if (node->isPositiveNode())
+ {
+ totalLength += node->getLength();
+ const std::vector<DeBruijnEdge *> * edges = node->getEdgesPointer();
+ int maxOverlap = 0;
+ for (size_t j = 0; j < edges->size(); ++j)
+ {
+ int edgeOverlap = (*edges)[j]->getOverlap();
+ maxOverlap = std::max(maxOverlap, edgeOverlap);
+ }
+ totalLength -= maxOverlap;
+ }
+ }
+
+ return totalLength;
+}
+
+
+QPair<int, int> AssemblyGraph::getOverlapRange() const
+{
+ int smallestOverlap = std::numeric_limits<int>::max();
+ int largestOverlap = 0;
+ QMapIterator<QPair<DeBruijnNode*, DeBruijnNode*>, DeBruijnEdge*> i(m_deBruijnGraphEdges);
+ while (i.hasNext())
+ {
+ i.next();
+ int overlap = i.value()->getOverlap();
+ if (overlap < smallestOverlap)
+ smallestOverlap = overlap;
+ if (overlap > largestOverlap)
+ largestOverlap = overlap;
+ }
+ if (smallestOverlap == std::numeric_limits<int>::max())
+ smallestOverlap = 0;
+ return QPair<int, int>(smallestOverlap, largestOverlap);
+}
+
+
+
+//This function will look to see if there is a FASTA file (.fa or .fasta) with
+//the same base name as the graph. If so, it will load it and give its
+//sequences to the graph nodes with matching names. This is useful for GFA
+//files which have no sequences (just '*') like ABySS makes.
+//Returns true if any sequences were loaded (doesn't have to be all sequences
+//in the graph).
+bool AssemblyGraph::attemptToLoadSequencesFromFasta()
+{
+ if (m_sequencesLoadedFromFasta == NOT_READY || m_sequencesLoadedFromFasta == TRIED)
+ return false;
+
+ m_sequencesLoadedFromFasta = TRIED;
+
+ QFileInfo gfaFileInfo(m_filename);
+ QString baseName = gfaFileInfo.completeBaseName();
+ QString fastaName = gfaFileInfo.dir().filePath(baseName + ".fa");
+ QFileInfo fastaFileInfo(fastaName);
+ if (!fastaFileInfo.exists())
+ {
+ fastaName = gfaFileInfo.dir().filePath(baseName + ".fasta");
+ fastaFileInfo = QFileInfo(fastaName);
+ }
+ if (!fastaFileInfo.exists())
+ {
+ fastaName = gfaFileInfo.dir().filePath(baseName + ".contigs.fasta");
+ fastaFileInfo = QFileInfo(fastaName);
+ }
+ if (!fastaFileInfo.exists())
+ return false;
+
+ bool atLeastOneNodeSequenceLoaded = false;
+ std::vector<QString> names;
+ std::vector<QByteArray> sequences;
+ readFastaFile(fastaName, &names, &sequences);
+
+ for (size_t i = 0; i < names.size(); ++i)
+ {
+ QString name = names[i];
+ name = simplifyCanuNodeName(name);
+ name = name.split(QRegExp("\\s+"))[0];
+ if (m_deBruijnGraphNodes.contains(name + "+"))
+ {
+ DeBruijnNode * posNode = m_deBruijnGraphNodes[name + "+"];
+ if (posNode->sequenceIsMissing())
+ {
+ atLeastOneNodeSequenceLoaded = true;
+ posNode->setSequence(sequences[i]);
+ DeBruijnNode * negNode = m_deBruijnGraphNodes[name + "-"];
+ negNode->setSequence(getReverseComplement(sequences[i]));
+ }
+ }
+ }
+
+ return atLeastOneNodeSequenceLoaded;
+}
+
+// Returns true if every node name in the graph starts with the string.
+bool AssemblyGraph::allNodesStartWith(QString start) const
+{
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ DeBruijnNode * node = i.value();
+ if (!node->getName().startsWith(start))
+ return false;
+ }
+ return true;
+}
+
+
+QString AssemblyGraph::simplifyCanuNodeName(QString oldName) const
+{
+ QString newName;
+
+ // Remove "tig" from front.
+ if (!oldName.startsWith("tig"))
+ return oldName;
+ newName = oldName.remove(0, 3);
+ if (newName.isEmpty())
+ return oldName;
+
+ // Remove +/- from end.
+ QChar sign = oldName[oldName.length()-1];
+ newName.chop(1);
+ if (newName.isEmpty())
+ return oldName;
+
+ // Remove leading zeros.
+ while (newName.length() > 1 && newName[0] == '0')
+ newName.remove(0, 1);
+ return newName + sign;
+}
+
+long long AssemblyGraph::getTotalLengthOrphanedNodes() const {
+ long long total = 0;
+ QMapIterator<QString, DeBruijnNode*> i(m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ DeBruijnNode * node = i.value();
+ if (node->isPositiveNode() && node->getDeadEndCount() == 2)
+ total += node->getLength();
+ }
+ return total;
+}
+
+
+bool AssemblyGraph::useLinearLayout() const {
+ return g_settings->linearLayout || m_graphFileType == PLAIN_FASTA;
+}
diff --git a/graph/assemblygraph.h b/graph/assemblygraph.h
new file mode 100644
index 0000000..ef5a0f8
--- /dev/null
+++ b/graph/assemblygraph.h
@@ -0,0 +1,215 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef ASSEMBLYGRAPH_H
+#define ASSEMBLYGRAPH_H
+
+#include <QObject>
+#include <vector>
+
+#include "../ogdf/basic/Graph.h"
+#include "../ogdf/basic/GraphAttributes.h"
+#include <QString>
+#include <QMap>
+#include "../program/globals.h"
+#include "../ui/mygraphicsscene.h"
+#include "path.h"
+#include <QPair>
+
+class DeBruijnNode;
+class DeBruijnEdge;
+class MyProgressDialog;
+
+class AssemblyGraph : public QObject
+{
+ Q_OBJECT
+
+public:
+ AssemblyGraph();
+ ~AssemblyGraph();
+
+ //Nodes are stored in a map with a key of the node's name.
+ QMap<QString, DeBruijnNode*> m_deBruijnGraphNodes;
+
+ //Edges are stored in a map with a key of the starting and ending node
+ //pointers.
+ QMap<QPair<DeBruijnNode*, DeBruijnNode*>, DeBruijnEdge*> m_deBruijnGraphEdges;
+
+ ogdf::Graph * m_ogdfGraph;
+ ogdf::EdgeArray<double> * m_edgeArray;
+ ogdf::GraphAttributes * m_graphAttributes;
+
+ int m_kmer;
+ int m_nodeCount;
+ int m_edgeCount;
+ long long m_totalLength;
+ long long m_shortestContig;
+ long long m_longestContig;
+ double m_meanDepth;
+ double m_firstQuartileDepth;
+ double m_medianDepth;
+ double m_thirdQuartileDepth;
+ GraphFileType m_graphFileType;
+ bool m_contiguitySearchDone;
+ QString m_filename;
+ QString m_depthTag;
+ SequencesLoadedFromFasta m_sequencesLoadedFromFasta;
+
+ void cleanUp();
+ void createDeBruijnEdge(QString node1Name, QString node2Name,
+ int overlap = 0,
+ EdgeOverlapType overlapType = UNKNOWN_OVERLAP);
+ void clearOgdfGraphAndResetNodes();
+ static QByteArray getReverseComplement(QByteArray forwardSequence);
+ void resetEdges();
+ double getMeanDepth(bool drawnNodesOnly = false);
+ double getMeanDepth(std::vector<DeBruijnNode *> nodes);
+ double getMeanDepth(QList<DeBruijnNode *> nodes);
+ void resetNodeContiguityStatus();
+ void resetAllNodeColours();
+ void clearAllBlastHitPointers();
+ void determineGraphInfo();
+ void clearGraphInfo();
+ void buildDeBruijnGraphFromLastGraph(QString fullFileName);
+ void buildDeBruijnGraphFromGfa(QString fullFileName, bool * unsupportedCigar, bool * customLabels,
+ bool * customColours, QString *bandageOptionsError);
+ void buildDeBruijnGraphFromFastg(QString fullFileName);
+ void buildDeBruijnGraphFromTrinityFasta(QString fullFileName);
+ int buildDeBruijnGraphFromAsqg(QString fullFileName);
+ void buildDeBruijnGraphFromPlainFasta(QString fullFileName);
+ void recalculateAllDepthsRelativeToDrawnMean();
+ void recalculateAllNodeWidths();
+
+ GraphFileType getGraphFileTypeFromFile(QString fullFileName);
+ bool checkFileIsLastGraph(QString fullFileName);
+ bool checkFileIsFastG(QString fullFileName);
+ bool checkFileIsFasta(QString fullFileName);
+ bool checkFileIsGfa(QString fullFileName);
+ bool checkFileIsTrinityFasta(QString fullFileName);
+ bool checkFileIsAsqg(QString fullFileName);
+ bool checkFirstLineOfFile(QString fullFileName, QString regExp);
+
+ bool loadGraphFromFile(QString filename);
+ void buildOgdfGraphFromNodesAndEdges(std::vector<DeBruijnNode *> startingNodes,
+ int nodeDistance);
+ void addGraphicsItemsToScene(MyGraphicsScene * scene);
+
+ QStringList splitCsv(QString line, QString sep=",");
+ bool loadCSV(QString filename, QStringList * columns, QString * errormsg, bool * coloursLoaded);
+ std::vector<DeBruijnNode *> getStartingNodes(QString * errorTitle,
+ QString * errorMessage,
+ bool doubleMode,
+ QString nodesList,
+ QString blastQueryName);
+
+ bool checkIfStringHasNodes(QString nodesString);
+ QString generateNodesNotFoundErrorMessage(std::vector<QString> nodesNotInGraph,
+ bool exact);
+ std::vector<DeBruijnNode *> getNodesFromString(QString nodeNamesString,
+ bool exactMatch,
+ std::vector<QString> * nodesNotInGraph = 0);
+ void layoutGraph();
+
+ void setAllEdgesExactOverlap(int overlap);
+ void autoDetermineAllEdgesExactOverlap();
+
+ static void readFastaFile(QString filename, std::vector<QString> * names,
+ std::vector<QByteArray> * sequences);
+
+ int getDrawnNodeCount() const;
+ void deleteNodes(std::vector<DeBruijnNode *> * nodes);
+ void deleteEdges(std::vector<DeBruijnEdge *> * edges);
+ void duplicateNodePair(DeBruijnNode * node, MyGraphicsScene * scene);
+ bool mergeNodes(QList<DeBruijnNode *> nodes, MyGraphicsScene * scene,
+ bool recalulateDepth);
+ void removeGraphicsItemEdges(const std::vector<DeBruijnEdge *> * edges,
+ bool reverseComplement,
+ MyGraphicsScene * scene);
+ void removeGraphicsItemNodes(const std::vector<DeBruijnNode *> * nodes,
+ bool reverseComplement,
+ MyGraphicsScene * scene);
+ int mergeAllPossible(MyGraphicsScene * scene = 0,
+ MyProgressDialog * progressDialog = 0);
+
+ void saveEntireGraphToFasta(QString filename);
+ void saveEntireGraphToFastaOnlyPositiveNodes(QString filename);
+ bool saveEntireGraphToGfa(QString filename);
+ bool saveVisibleGraphToGfa(QString filename);
+ void changeNodeName(QString oldName, QString newName);
+ NodeNameStatus checkNodeNameValidity(QString nodeName);
+ void changeNodeDepth(std::vector<DeBruijnNode *> * nodes,
+ double newDepth);
+
+ static QByteArray addNewlinesToSequence(QByteArray sequence, int interval = 70);
+ int getDeadEndCount() const;
+ void getNodeStats(int * n50, int * shortestNode, int * firstQuartile, int * median, int * thirdQuartile, int * longestNode) const;
+ void getGraphComponentCountAndLargestComponentSize(int * componentCount, int * largestComponentLength) const;
+ double getMedianDepthByBase() const;
+ long long getEstimatedSequenceLength() const;
+ long long getEstimatedSequenceLength(double medianDepthByBase) const;
+ long long getTotalLengthMinusEdgeOverlaps() const;
+ QPair<int, int> getOverlapRange() const;
+ bool attemptToLoadSequencesFromFasta();
+ long long getTotalLengthOrphanedNodes() const;
+ bool useLinearLayout() const;
+
+
+private:
+ template<typename T> double getValueUsingFractionalIndex(std::vector<T> * v, double index) const;
+ QString convertNormalNumberStringToBandageNodeName(QString number);
+ void makeReverseComplementNodeIfNecessary(DeBruijnNode * node);
+ void pointEachNodeToItsReverseComplement();
+ QStringList removeNullStringsFromList(QStringList in);
+ std::vector<DeBruijnNode *> getNodesFromListExact(QStringList nodesList, std::vector<QString> * nodesNotInGraph);
+ std::vector<DeBruijnNode *> getNodesFromListPartial(QStringList nodesList, std::vector<QString> * nodesNotInGraph);
+ std::vector<DeBruijnNode *> getNodesFromBlastHits(QString queryName);
+ std::vector<DeBruijnNode *> getNodesInDepthRange(double min, double max);
+ std::vector<int> makeOverlapCountVector();
+ bool cigarContainsOnlyM(QString cigar);
+ int getLengthFromSimpleCigar(QString cigar);
+ int getLengthFromCigar(QString cigar);
+ int getCigarCount(QString cigarCode, QString cigar);
+ QString getOppositeNodeName(QString nodeName);
+ void clearAllCsvData();
+ QString getNodeNameFromString(QString string);
+ QString getNewNodeName(QString oldNodeName);
+ void duplicateGraphicsNode(DeBruijnNode * originalNode, DeBruijnNode * newNode, MyGraphicsScene * scene);
+ bool canAddNodeToStartOfMergeList(QList<DeBruijnNode *> * mergeList,
+ DeBruijnNode * potentialNode);
+ bool canAddNodeToEndOfMergeList(QList<DeBruijnNode *> * mergeList,
+ DeBruijnNode * potentialNode);
+ QString getUniqueNodeName(QString baseName);
+ void mergeGraphicsNodes(QList<DeBruijnNode *> * originalNodes,
+ QList<DeBruijnNode *> * revCompOriginalNodes,
+ DeBruijnNode * newNode, MyGraphicsScene * scene);
+ bool mergeGraphicsNodes2(QList<DeBruijnNode *> * originalNodes,
+ DeBruijnNode * newNode, MyGraphicsScene * scene);
+ void removeAllGraphicsEdgesFromNode(DeBruijnNode * node,
+ bool reverseComplement,
+ MyGraphicsScene * scene);
+ QString cleanNodeName(QString name);
+ double findDepthAtIndex(QList<DeBruijnNode *> * nodeList, long long targetIndex) const;
+ bool allNodesStartWith(QString start) const;
+ QString simplifyCanuNodeName(QString oldName) const;
+
+signals:
+ void setMergeTotalCount(int totalCount);
+ void setMergeCompletedCount(int completedCount);
+};
+
+#endif // ASSEMBLYGRAPH_H
diff --git a/graph/debruijnedge.cpp b/graph/debruijnedge.cpp
new file mode 100644
index 0000000..d878639
--- /dev/null
+++ b/graph/debruijnedge.cpp
@@ -0,0 +1,445 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "debruijnedge.h"
+#include <math.h>
+#include "../program/settings.h"
+#include "ogdfnode.h"
+#include <QApplication>
+#include "../program/settings.h"
+#include "../program/globals.h"
+#include "assemblygraph.h"
+
+DeBruijnEdge::DeBruijnEdge(DeBruijnNode *startingNode, DeBruijnNode *endingNode) :
+ m_startingNode(startingNode), m_endingNode(endingNode), m_graphicsItemEdge(0),
+ m_drawn(false), m_overlapType(UNKNOWN_OVERLAP), m_overlap(0)
+{
+}
+
+
+
+//This function assumes that the parameter node pointer is one of the two nodes
+//in this edge, and it returns the other one.
+DeBruijnNode * DeBruijnEdge::getOtherNode(const DeBruijnNode * node) const
+{
+ if (node == m_startingNode)
+ return m_endingNode;
+ else
+ return m_startingNode;
+}
+
+
+//This function determines whether the edge should be drawn to the screen.
+bool DeBruijnEdge::edgeIsVisible() const
+{
+ //If the program is in double mode, then draw any edge where both of its
+ //nodes are drawn.
+ if (g_settings->doubleMode)
+ return m_startingNode->isDrawn() && m_endingNode->isDrawn();
+
+ //If the program is in single mode, then draw any edge where both of its
+ //nodes or their reverse complements are drawn.
+ else
+ {
+ bool drawEdge = (m_startingNode->isDrawn() || m_startingNode->getReverseComplement()->isDrawn())
+ && (m_endingNode->isDrawn() || m_endingNode->getReverseComplement()->isDrawn());
+ if (!drawEdge)
+ return false;
+
+ //But it is also necessary to avoid drawing both an edge and its
+ //reverse complement edge.
+ return isPositiveEdge();
+ }
+}
+
+
+
+//This function says whether an edge is 'positive'. This is used to distinguish
+//an edge from its reverse complement - i.e. half of the graph edges are
+//positive and their reverse complements are negative.
+//When one node in the edge is positive and the other is negative, then the
+//choice is somewhat arbitrary.
+bool DeBruijnEdge::isPositiveEdge() const
+{
+ //If both nodes have a positive number, show this edge, and not
+ //the reverse complement where both nodes are negative.
+ if (m_startingNode->isPositiveNode() && m_endingNode->isPositiveNode())
+ return true;
+ if (m_startingNode->isNegativeNode() && m_endingNode->isNegativeNode())
+ return false;
+
+ //Edges that are their own reverse complement are considered positive (but
+ //will not have a negative counterpart).
+ if (isOwnReverseComplement())
+ return true;
+
+ //If the code got here, then one node is positive and the other
+ //negative. In this case, just choose the one with the first name
+ //alphabetically - an arbitrary choice, but at least it is
+ //consistent.
+ return (m_startingNode->getName() > m_reverseComplement->m_startingNode->getName());
+}
+
+
+void DeBruijnEdge::addToOgdfGraph(ogdf::Graph * ogdfGraph, ogdf::EdgeArray<double> * edgeArray) const
+{
+ ogdf::node firstEdgeOgdfNode;
+ ogdf::node secondEdgeOgdfNode;
+
+ if (m_startingNode->inOgdf())
+ firstEdgeOgdfNode = m_startingNode->getOgdfNode()->getLast();
+ else if (m_startingNode->getReverseComplement()->inOgdf())
+ firstEdgeOgdfNode = m_startingNode->getReverseComplement()->getOgdfNode()->getFirst();
+ else
+ return; //Ending node or its reverse complement isn't in OGDF
+
+ if (m_endingNode->inOgdf())
+ secondEdgeOgdfNode = m_endingNode->getOgdfNode()->getFirst();
+ else if (m_endingNode->getReverseComplement()->inOgdf())
+ secondEdgeOgdfNode = m_endingNode->getReverseComplement()->getOgdfNode()->getLast();
+ else
+ return; //Ending node or its reverse complement isn't in OGDF
+
+ //If this in an edge connected a single-segment node to itself, then we
+ //don't want to put it in the OGDF graph, because it would be redundant
+ //with the node segment (and created conflict with the node/edge length).
+ if (m_startingNode == m_endingNode)
+ {
+ if (m_startingNode->getNumberOfOgdfGraphEdges(m_startingNode->getDrawnNodeLength()) == 1)
+ return;
+ }
+
+ ogdf::edge newEdge = ogdfGraph->newEdge(firstEdgeOgdfNode, secondEdgeOgdfNode);
+ (*edgeArray)[newEdge] = g_settings->edgeLength;
+}
+
+
+
+
+
+
+
+
+//This function traces all possible paths from this edge.
+//It proceeds a number of steps, as determined by a setting.
+//If forward is true, it looks in a forward direction (starting nodes to
+//ending nodes). If forward is false, it looks in a backward direction
+//(ending nodes to starting nodes).
+void DeBruijnEdge::tracePaths(bool forward,
+ int stepsRemaining,
+ std::vector< std::vector <DeBruijnNode *> > * allPaths,
+ DeBruijnNode * startingNode,
+ std::vector<DeBruijnNode *> pathSoFar) const
+{
+ //This can go for a while, so keep the UI responsive.
+ QApplication::processEvents();
+
+ //Find the node in the direction we are tracing.
+ DeBruijnNode * nextNode;
+ if (forward)
+ nextNode = m_endingNode;
+ else
+ nextNode = m_startingNode;
+
+ //Add that node to the path so far.
+ pathSoFar.push_back(nextNode);
+
+ //If there are no steps left, then the path so far is done.
+ --stepsRemaining;
+ if (stepsRemaining == 0)
+ {
+ allPaths->push_back(pathSoFar);
+ return;
+ }
+
+ //If the code got here, then more steps remain.
+ //Find the edges that are in the correct direction.
+ std::vector<DeBruijnEdge *> nextEdges = findNextEdgesInPath(nextNode, forward);
+
+ //If there are no next edges, then we are finished with the
+ //path search, even though steps remain.
+ if (nextEdges.size() == 0)
+ {
+ allPaths->push_back(pathSoFar);
+ return;
+ }
+
+ //Call this function on all of the next edges.
+ //However, we also need to check to see if we are tracing a loop
+ //and stop if that is the case.
+ for (size_t i = 0; i < nextEdges.size(); ++i)
+ {
+ DeBruijnEdge * nextEdge = nextEdges[i];
+
+ //Determine the node that this next edge leads to.
+ DeBruijnNode * nextNextNode;
+ if (forward)
+ nextNextNode = nextEdge->m_endingNode;
+ else
+ nextNextNode = nextEdge->m_startingNode;
+
+ //If that node is the starting node, then we've made
+ //a full loop and the path should be considered complete.
+ if (nextNextNode == startingNode)
+ {
+ allPaths->push_back(pathSoFar);
+ continue;
+ }
+
+ //If that node is already in the path TWICE so far, that means
+ //we're caught in a loop, and we should throw this path out.
+ //If it appears 0 or 1 times, then continue the path search.
+ if (timesNodeInPath(nextNextNode, &pathSoFar) < 2)
+ nextEdge->tracePaths(forward, stepsRemaining, allPaths, startingNode, pathSoFar);
+ }
+}
+
+
+//This function counts how many times a node appears in a path
+int DeBruijnEdge::timesNodeInPath(DeBruijnNode * node, std::vector<DeBruijnNode *> * path) const
+{
+ int count = 0;
+ for (size_t i = 0; i < path->size(); ++i)
+ {
+ if ( (*path)[i] == node)
+ ++count;
+ }
+
+ return count;
+}
+
+
+
+bool DeBruijnEdge::leadsOnlyToNode(bool forward,
+ int stepsRemaining,
+ DeBruijnNode * target,
+ std::vector<DeBruijnNode *> pathSoFar,
+ bool includeReverseComplement) const
+{
+ //This can go for a while, so keep the UI responsive.
+ QApplication::processEvents();
+
+ //Find the node in the direction we are tracing.
+ DeBruijnNode * nextNode;
+ if (forward)
+ nextNode = m_endingNode;
+ else
+ nextNode = m_startingNode;
+
+ //Add that node to the path so far.
+ pathSoFar.push_back(nextNode);
+
+ //If this path has landed on the node from which the search began,
+ //that means we've followed a loop around. The search has therefore
+ //failed because this path could represent circular DNA that does
+ //not contain the target.
+ if (nextNode == pathSoFar[0])
+ return false;
+
+ //If the next node is the target, the search succeeded!
+ if (nextNode == target)
+ return true;
+
+ //If we are including reverse complements and the next node is
+ //the reverse complement of the target, the search succeeded!
+ if (includeReverseComplement && nextNode->getReverseComplement() == target)
+ return true;
+
+ //If there are no steps left, then the search failed.
+ --stepsRemaining;
+ if (stepsRemaining == 0)
+ return false;
+
+ //If the code got here, then more steps remain.
+ //Find the edges that are in the correct direction.
+ std::vector<DeBruijnEdge *> nextEdges = findNextEdgesInPath(nextNode, forward);
+
+ //If there are no next edges, then the search failed, even
+ //though steps remain.
+ if (nextEdges.size() == 0)
+ return false;
+
+ //In order for the search to succeed, this function needs to return true
+ //for all of the nextEdges.
+ //However, we also need to check to see if we are tracing a loop
+ //and stop if that is the case.
+ for (size_t i = 0; i < nextEdges.size(); ++i)
+ {
+ DeBruijnEdge * nextEdge = nextEdges[i];
+
+ //Determine the node that this next edge leads to.
+ DeBruijnNode * nextNextNode;
+ if (forward)
+ nextNextNode = nextEdge->m_endingNode;
+ else
+ nextNextNode = nextEdge->m_startingNode;
+
+ //If that node is already in the path TWICE so far, that means
+ //we're caught in a loop, and we should throw this path out.
+ //If it appears 0 or 1 times, then continue the path search.
+ if (timesNodeInPath(nextNextNode, &pathSoFar) < 2)
+ {
+ if ( !nextEdge->leadsOnlyToNode(forward, stepsRemaining, target, pathSoFar, includeReverseComplement) )
+ return false;
+ }
+ }
+
+ //If the code got here, then the search succeeded!
+ return true;
+}
+
+
+std::vector<DeBruijnEdge *> DeBruijnEdge::findNextEdgesInPath(DeBruijnNode * nextNode,
+ bool forward) const
+{
+ std::vector<DeBruijnEdge *> nextEdges;
+ const std::vector<DeBruijnEdge *> * nextNodeEdges = nextNode->getEdgesPointer();
+ for (size_t i = 0; i < nextNodeEdges->size(); ++i)
+ {
+ DeBruijnEdge * edge = (*nextNodeEdges)[i];
+
+ //If forward, we're looking for edges that lead away from
+ //nextNode. If backward, we're looking for edges that lead
+ //into nextNode.
+ if ((forward && edge->m_startingNode == nextNode) ||
+ (!forward && edge->m_endingNode == nextNode))
+ nextEdges.push_back(edge);
+ }
+
+ return nextEdges;
+}
+
+
+//This function tries to automatically determine the overlap size
+//between the two nodes. It tries each overlap size between the min
+//to the max (in settings), assigning the first one it finds.
+void DeBruijnEdge::autoDetermineExactOverlap()
+{
+ m_overlap = 0;
+ m_overlapType = AUTO_DETERMINED_EXACT_OVERLAP;
+
+ //Find an appropriate search range
+ int minPossibleOverlap = std::min(m_startingNode->getLength(), m_endingNode->getLength());
+ if (minPossibleOverlap < g_settings->minAutoFindEdgeOverlap)
+ return;
+ int min = std::min(minPossibleOverlap, g_settings->minAutoFindEdgeOverlap);
+ int max = std::min(minPossibleOverlap, g_settings->maxAutoFindEdgeOverlap);
+
+ //Try each overlap in the range and set the first one found.
+ //However, we don't want the search to be biased towards larger
+ //or smaller overlaps, so start with a pseudorandom value and loop.
+ int testOverlap = min + (rand() % (max - min + 1));
+ for (int i = min; i <= max; ++i)
+ {
+ if (testExactOverlap(testOverlap))
+ {
+ m_overlap = testOverlap;
+ return;
+ }
+
+ ++testOverlap;
+ if (testOverlap > max)
+ testOverlap = min;
+ }
+}
+
+
+
+
+//This function tries the given overlap between the two nodes.
+//If the overlap works perfectly, it returns true.
+bool DeBruijnEdge::testExactOverlap(int overlap) const
+{
+ bool mismatchFound = false;
+
+ int seq1Offset = m_startingNode->getLength() - overlap;
+
+ //Look at each position in the overlap
+ for (int j = 0; j < overlap && !mismatchFound; ++j)
+ {
+ char a = m_startingNode->getBaseAt(seq1Offset + j);
+ char b = m_endingNode->getBaseAt(j);
+ if (a != b)
+ mismatchFound = true;
+ }
+
+ return !mismatchFound;
+}
+
+
+QByteArray DeBruijnEdge::getGfaLinkLine() const
+{
+ DeBruijnNode * startingNode = getStartingNode();
+ DeBruijnNode * endingNode = getEndingNode();
+
+ QByteArray gfaLinkLine = "L\t";
+ gfaLinkLine += startingNode->getNameWithoutSign() + "\t";
+ gfaLinkLine += startingNode->getSign() + "\t";
+ gfaLinkLine += endingNode->getNameWithoutSign() + "\t";
+ gfaLinkLine += endingNode->getSign() + "\t";
+
+ //When Velvet graphs are saved to GFA, the sequences are extended to include
+ //the overlap. So even though this edge might have no overlap, the GFA link
+ //line should.
+ if (g_assemblyGraph->m_graphFileType == LAST_GRAPH)
+ gfaLinkLine += QString::number(g_assemblyGraph->m_kmer - 1) + "M";
+ else
+ gfaLinkLine += QString::number(getOverlap()) + "M";
+
+ gfaLinkLine += "\n";
+ return gfaLinkLine;
+}
+
+bool DeBruijnEdge::compareEdgePointers(DeBruijnEdge * a, DeBruijnEdge * b)
+{
+ QString aStart = a->getStartingNode()->getName();
+ QString bStart = b->getStartingNode()->getName();
+ QString aStartNoSign = aStart;
+ aStartNoSign.chop(1);
+ QString bStartNoSign = bStart;
+ bStartNoSign.chop(1);
+ bool ok1;
+ long long aStartNumber = aStartNoSign.toLongLong(&ok1);
+ bool ok2;
+ long long bStartNumber = bStartNoSign.toLongLong(&ok2);
+
+ QString aEnd = a->getEndingNode()->getName();
+ QString bEnd = b->getEndingNode()->getName();
+ QString aEndNoSign = aEnd;
+ aEndNoSign.chop(1);
+ QString bEndNoSign = bEnd;
+ bEndNoSign.chop(1);
+ bool ok3;
+ long long aEndNumber = aEndNoSign.toLongLong(&ok3);
+ bool ok4;
+ long long bEndNumber = bEndNoSign.toLongLong(&ok4);
+
+
+ //If the node names are essentially numbers, then sort them as numbers.
+ if (ok1 && ok2 && ok3 && ok4)
+ {
+ if (aStartNumber != bStartNumber)
+ return aStartNumber < bStartNumber;
+
+ if (aStartNumber == bStartNumber)
+ return aEndNumber < bEndNumber;
+ }
+
+ //If the node names are strings, then just sort them as strings.
+ return aStart < bStart;
+}
diff --git a/graph/debruijnedge.h b/graph/debruijnedge.h
new file mode 100644
index 0000000..9d0de05
--- /dev/null
+++ b/graph/debruijnedge.h
@@ -0,0 +1,86 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef DEBRUIJNEDGE_H
+#define DEBRUIJNEDGE_H
+
+#include "../ogdf/basic/Graph.h"
+#include "debruijnnode.h"
+
+class GraphicsItemEdge;
+
+class DeBruijnEdge
+{
+public:
+ //CREATORS
+ DeBruijnEdge(DeBruijnNode * startingNode, DeBruijnNode * endingNode);
+
+ //ACCESSORS
+ bool isStartingNode(DeBruijnNode * node) const {return node == m_startingNode;}
+ DeBruijnNode * getStartingNode() const {return m_startingNode;}
+ DeBruijnNode * getEndingNode() const {return m_endingNode;}
+ GraphicsItemEdge * getGraphicsItemEdge() const {return m_graphicsItemEdge;}
+ DeBruijnEdge * getReverseComplement() const {return m_reverseComplement;}
+ bool isDrawn() const {return m_drawn;}
+ int getOverlap() const {return m_overlap;}
+ EdgeOverlapType getOverlapType() const {return m_overlapType;}
+ DeBruijnNode * getOtherNode(const DeBruijnNode * node) const;
+ bool testExactOverlap(int overlap) const;
+ void tracePaths(bool forward,
+ int stepsRemaining,
+ std::vector<std::vector<DeBruijnNode *> > * allPaths,
+ DeBruijnNode * startingNode,
+ std::vector<DeBruijnNode *> pathSoFar = std::vector<DeBruijnNode *>()) const;
+ bool leadsOnlyToNode(bool forward,
+ int stepsRemaining,
+ DeBruijnNode * target,
+ std::vector<DeBruijnNode *> pathSoFar,
+ bool includeReverseComplement) const;
+ QByteArray getGfaLinkLine() const;
+ bool isPositiveEdge() const;
+ bool isNegativeEdge() const {return !isPositiveEdge();}
+ bool isOwnReverseComplement() const {return this == getReverseComplement();}
+ static bool compareEdgePointers(DeBruijnEdge * a, DeBruijnEdge * b);
+
+ //MODIFERS
+ void setGraphicsItemEdge(GraphicsItemEdge * gie) {m_graphicsItemEdge = gie;}
+ void setReverseComplement(DeBruijnEdge * rc) {m_reverseComplement = rc;}
+ void setOverlap(int ol) {m_overlap = ol;}
+ void setOverlapType(EdgeOverlapType olt) {m_overlapType = olt;}
+ void reset() {m_graphicsItemEdge = 0; m_drawn = false;}
+ void determineIfDrawn() {m_drawn = edgeIsVisible();}
+ void setExactOverlap(int overlap) {m_overlap = overlap; m_overlapType = EXACT_OVERLAP;}
+ void autoDetermineExactOverlap();
+ void addToOgdfGraph(ogdf::Graph * ogdfGraph, ogdf::EdgeArray<double> * edgeArray) const;
+
+private:
+ DeBruijnNode * m_startingNode;
+ DeBruijnNode * m_endingNode;
+ GraphicsItemEdge * m_graphicsItemEdge;
+ DeBruijnEdge * m_reverseComplement;
+ bool m_drawn;
+ EdgeOverlapType m_overlapType;
+ int m_overlap;
+
+ bool edgeIsVisible() const;
+ int timesNodeInPath(DeBruijnNode * node, std::vector<DeBruijnNode *> * path) const;
+ std::vector<DeBruijnEdge *> findNextEdgesInPath(DeBruijnNode * nextNode,
+ bool forward) const;
+};
+
+#endif // DEBRUIJNEDGE_H
diff --git a/graph/debruijnnode.cpp b/graph/debruijnnode.cpp
new file mode 100644
index 0000000..fe1f48b
--- /dev/null
+++ b/graph/debruijnnode.cpp
@@ -0,0 +1,840 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "debruijnnode.h"
+#include "debruijnedge.h"
+#include "ogdfnode.h"
+#include "graphicsitemnode.h"
+#include <math.h>
+#include "../blast/blasthit.h"
+#include "../blast/blastquery.h"
+#include "assemblygraph.h"
+#include <set>
+#include <QApplication>
+#include <QSet>
+
+
+//The length parameter is optional. If it is set, then the node will use that
+//for its length. If not set, it will just use the sequence length.
+DeBruijnNode::DeBruijnNode(QString name, double depth, QByteArray sequence, int length) :
+ m_name(name),
+ m_depth(depth),
+ m_depthRelativeToMeanDrawnDepth(1.0),
+ m_sequence(sequence),
+ m_length(sequence.length()),
+ m_contiguityStatus(NOT_CONTIGUOUS),
+ m_reverseComplement(0),
+ m_ogdfNode(0),
+ m_graphicsItemNode(0),
+ m_specialNode(false),
+ m_drawn(false),
+ m_highestDistanceInNeighbourSearch(0),
+ m_csvData()
+{
+ if (length > 0)
+ m_length = length;
+}
+
+
+DeBruijnNode::~DeBruijnNode()
+{
+ if (m_ogdfNode != 0)
+ delete m_ogdfNode;
+}
+
+
+
+//This function adds an edge to the Node, but only if the edge hasn't already
+//been added.
+void DeBruijnNode::addEdge(DeBruijnEdge * edge)
+{
+ if (std::find(m_edges.begin(), m_edges.end(), edge) == m_edges.end())
+ m_edges.push_back(edge);
+}
+
+
+//This function deletes an edge from the node, if it exists.
+void DeBruijnNode::removeEdge(DeBruijnEdge * edge)
+{
+ m_edges.erase(std::remove(m_edges.begin(), m_edges.end(), edge), m_edges.end());
+}
+
+
+//This function resets the node to the state it would be in after a graph
+//file was loaded - no contiguity status and no OGDF nodes.
+void DeBruijnNode::resetNode()
+{
+ if (m_ogdfNode != 0)
+ delete m_ogdfNode;
+ m_ogdfNode = 0;
+ m_graphicsItemNode = 0;
+ resetContiguityStatus();
+ setAsNotDrawn();
+ setAsNotSpecial();
+ m_highestDistanceInNeighbourSearch = 0;
+}
+
+
+void DeBruijnNode::addToOgdfGraph(ogdf::Graph * ogdfGraph, ogdf::GraphAttributes * graphAttributes,
+ ogdf::EdgeArray<double> * edgeArray, double xPos, double yPos)
+{
+ //If this node or its reverse complement is already in OGDF, then
+ //it's not necessary to make the node.
+ if (thisOrReverseComplementInOgdf())
+ return;
+
+ //Create the OgdfNode object
+ m_ogdfNode = new OgdfNode();
+
+ //Each node in the Velvet sense is made up of multiple nodes in the
+ //OGDF sense. This way, Velvet nodes appear as lines whose length
+ //corresponds to the sequence length.
+ double drawnNodeLength = getDrawnNodeLength();
+ int numberOfGraphEdges = getNumberOfOgdfGraphEdges(drawnNodeLength);
+ int numberOfGraphNodes = numberOfGraphEdges + 1;
+ double drawnLengthPerEdge = drawnNodeLength / numberOfGraphEdges;
+
+ ogdf::node newNode = 0;
+ ogdf::node previousNode = 0;
+ for (int i = 0; i < numberOfGraphNodes; ++i)
+ {
+ newNode = ogdfGraph->newNode();
+ m_ogdfNode->addOgdfNode(newNode);
+
+ if (g_assemblyGraph->useLinearLayout()) {
+ graphAttributes->x(newNode) = xPos;
+ graphAttributes->y(newNode) = yPos;
+ xPos += g_settings->nodeSegmentLength;
+ }
+
+ if (i > 0)
+ {
+ ogdf::edge newEdge = ogdfGraph->newEdge(previousNode, newNode);
+ (*edgeArray)[newEdge] = drawnLengthPerEdge;
+ }
+
+ previousNode = newNode;
+ }
+}
+
+
+
+double DeBruijnNode::getDrawnNodeLength() const
+{
+ double drawnNodeLength = getNodeLengthPerMegabase() * double(getLength()) / 1000000.0;
+ if (drawnNodeLength < g_settings->minimumNodeLength)
+ drawnNodeLength = g_settings->minimumNodeLength;
+ return drawnNodeLength;
+}
+
+int DeBruijnNode::getNumberOfOgdfGraphEdges(double drawnNodeLength) const
+{
+ int numberOfGraphEdges = ceil(drawnNodeLength / g_settings->nodeSegmentLength);
+ if (numberOfGraphEdges <= 0)
+ numberOfGraphEdges = 1;
+ return numberOfGraphEdges;
+}
+
+
+
+//This function determines the contiguity of nodes relative to this one.
+//It has two steps:
+// -First, for each edge leaving this node, all paths outward are found.
+// Any nodes in any path are MAYBE_CONTIGUOUS, and nodes in all of the
+// paths are CONTIGUOUS.
+// -Second, it is necessary to check in the opposite direction - for each
+// of the MAYBE_CONTIGUOUS nodes, do they have a path that unambiguously
+// leads to this node? If so, then they are CONTIGUOUS.
+void DeBruijnNode::determineContiguity()
+{
+ upgradeContiguityStatus(STARTING);
+
+ //A set is used to store all nodes found in the paths, as the nodes
+ //that show up as MAYBE_CONTIGUOUS will have their paths checked
+ //to this node.
+ std::set<DeBruijnNode *> allCheckedNodes;
+
+ //For each path leaving this node, find all possible paths
+ //outward. Nodes in any of the paths for an edge are
+ //MAYBE_CONTIGUOUS. Nodes in all of the paths for an edge
+ //are CONTIGUOUS.
+ for (size_t i = 0; i < m_edges.size(); ++i)
+ {
+ DeBruijnEdge * edge = m_edges[i];
+ bool outgoingEdge = (this == edge->getStartingNode());
+
+ std::vector< std::vector <DeBruijnNode *> > allPaths;
+ edge->tracePaths(outgoingEdge, g_settings->contiguitySearchSteps, &allPaths, this);
+
+ //Set all nodes in the paths as MAYBE_CONTIGUOUS
+ for (size_t j = 0; j < allPaths.size(); ++j)
+ {
+ QApplication::processEvents();
+ for (size_t k = 0; k < allPaths[j].size(); ++k)
+ {
+ DeBruijnNode * node = allPaths[j][k];
+ node->upgradeContiguityStatus(MAYBE_CONTIGUOUS);
+ allCheckedNodes.insert(node);
+ }
+ }
+
+ //Set all common nodes as CONTIGUOUS_STRAND_SPECIFIC
+ std::vector<DeBruijnNode *> commonNodesStrandSpecific = getNodesCommonToAllPaths(&allPaths, false);
+ for (size_t j = 0; j < commonNodesStrandSpecific.size(); ++j)
+ (commonNodesStrandSpecific[j])->upgradeContiguityStatus(CONTIGUOUS_STRAND_SPECIFIC);
+
+ //Set all common nodes (when including reverse complement nodes)
+ //as CONTIGUOUS_EITHER_STRAND
+ std::vector<DeBruijnNode *> commonNodesEitherStrand = getNodesCommonToAllPaths(&allPaths, true);
+ for (size_t j = 0; j < commonNodesEitherStrand.size(); ++j)
+ {
+ DeBruijnNode * node = commonNodesEitherStrand[j];
+ node->upgradeContiguityStatus(CONTIGUOUS_EITHER_STRAND);
+ node->getReverseComplement()->upgradeContiguityStatus(CONTIGUOUS_EITHER_STRAND);
+ }
+ }
+
+ //For each node that was checked, then we check to see if any
+ //of its paths leads unambiuously back to the starting node (this node).
+ for (std::set<DeBruijnNode *>::iterator i = allCheckedNodes.begin(); i != allCheckedNodes.end(); ++i)
+ {
+ QApplication::processEvents();
+ DeBruijnNode * node = *i;
+ ContiguityStatus status = node->getContiguityStatus();
+
+ //First check without reverse complement target for
+ //strand-specific contiguity.
+ if (status != CONTIGUOUS_STRAND_SPECIFIC &&
+ node->doesPathLeadOnlyToNode(this, false))
+ node->upgradeContiguityStatus(CONTIGUOUS_STRAND_SPECIFIC);
+
+ //Now check including the reverse complement target for
+ //either strand contiguity.
+ if (status != CONTIGUOUS_STRAND_SPECIFIC &&
+ status != CONTIGUOUS_EITHER_STRAND &&
+ node->doesPathLeadOnlyToNode(this, true))
+ {
+ node->upgradeContiguityStatus(CONTIGUOUS_EITHER_STRAND);
+ node->getReverseComplement()->upgradeContiguityStatus(CONTIGUOUS_EITHER_STRAND);
+ }
+ }
+}
+
+
+//This function differs from the above by including all reverse complement
+//nodes in the path search.
+std::vector<DeBruijnNode *> DeBruijnNode::getNodesCommonToAllPaths(std::vector< std::vector <DeBruijnNode *> > * paths,
+ bool includeReverseComplements) const
+{
+ std::vector<DeBruijnNode *> commonNodes;
+
+ //If there are no paths, then return the empty vector.
+ if (paths->size() == 0)
+ return commonNodes;
+
+ //If there is only one path in path, then they are all common nodes
+ commonNodes = (*paths)[0];
+ if (paths->size() == 1)
+ return commonNodes;
+
+ //If there are two or more paths, it's necessary to find the intersection.
+ for (size_t i = 1; i < paths->size(); ++i)
+ {
+ QApplication::processEvents();
+ std::vector <DeBruijnNode *> * path = &((*paths)[i]);
+
+ //If we are including reverse complements in the search,
+ //then it is necessary to build a new vector that includes
+ //reverse complement nodes and then use that vector.
+ std::vector <DeBruijnNode *> pathWithReverseComplements;
+ if (includeReverseComplements)
+ {
+ for (size_t j = 0; j < path->size(); ++j)
+ {
+ DeBruijnNode * node = (*path)[j];
+ pathWithReverseComplements.push_back(node);
+ pathWithReverseComplements.push_back(node->getReverseComplement());
+ }
+ path = &pathWithReverseComplements;
+ }
+
+ //Combine the commonNodes vector with the path vector,
+ //excluding any repeats.
+ std::sort(commonNodes.begin(), commonNodes.end());
+ std::sort(path->begin(), path->end());
+ std::vector<DeBruijnNode *> newCommonNodes;
+ std::set_intersection(commonNodes.begin(), commonNodes.end(), path->begin(), path->end(), std::back_inserter(newCommonNodes));
+ commonNodes = newCommonNodes;
+ }
+
+ return commonNodes;
+}
+
+
+//This function checks whether this node has any path leading outward that
+//unambiguously leads to the given node.
+//It checks a number of steps as set by the contiguitySearchSteps setting.
+//If includeReverseComplement is true, then this function returns true if
+//all paths lead either to the node or its reverse complement node.
+bool DeBruijnNode::doesPathLeadOnlyToNode(DeBruijnNode * node, bool includeReverseComplement)
+{
+ for (size_t i = 0; i < m_edges.size(); ++i)
+ {
+ DeBruijnEdge * edge = m_edges[i];
+ bool outgoingEdge = (this == edge->getStartingNode());
+
+ std::vector<DeBruijnNode *> pathSoFar;
+ pathSoFar.push_back(this);
+ if (edge->leadsOnlyToNode(outgoingEdge, g_settings->contiguitySearchSteps, node, pathSoFar, includeReverseComplement))
+ return true;
+ }
+
+ return false;
+}
+
+
+//This function only upgrades a node's status, never downgrades.
+void DeBruijnNode::upgradeContiguityStatus(ContiguityStatus newStatus)
+{
+ if (newStatus < m_contiguityStatus)
+ m_contiguityStatus = newStatus;
+}
+
+
+
+//It is expected that the argument connectedNode is either in incomingNodes or
+//outgoingNodes. If that node is the only one in whichever container it is in,
+//this function returns true.
+bool DeBruijnNode::isOnlyPathInItsDirection(DeBruijnNode * connectedNode,
+ std::vector<DeBruijnNode *> * incomingNodes,
+ std::vector<DeBruijnNode *> * outgoingNodes) const
+{
+ std::vector<DeBruijnNode *> * container;
+ if (std::find(incomingNodes->begin(), incomingNodes->end(), connectedNode) != incomingNodes->end())
+ container = incomingNodes;
+ else
+ container = outgoingNodes;
+
+ return (container->size() == 1 && (*container)[0] == connectedNode);
+}
+bool DeBruijnNode::isNotOnlyPathInItsDirection(DeBruijnNode * connectedNode,
+ std::vector<DeBruijnNode *> * incomingNodes,
+ std::vector<DeBruijnNode *> * outgoingNodes) const
+{
+ return !isOnlyPathInItsDirection(connectedNode, incomingNodes, outgoingNodes);
+}
+
+
+QByteArray DeBruijnNode::getFasta(bool sign, bool newLines, bool evenIfEmpty) const
+{
+ QByteArray sequence = getSequence();
+ if (sequence.isEmpty() && !evenIfEmpty)
+ return QByteArray();
+
+ QByteArray fasta = ">";
+ fasta += getNodeNameForFasta(sign);
+ fasta += "\n";
+ if (newLines)
+ fasta += AssemblyGraph::addNewlinesToSequence(sequence);
+ else
+ {
+ fasta += sequence;
+ fasta += "\n";
+ }
+ return fasta;
+}
+
+
+QByteArray DeBruijnNode::getGfaSegmentLine(QString depthTag) const
+{
+ QByteArray gfaSequence = getSequenceForGfa();
+
+ QByteArray gfaSegmentLine = "S";
+ gfaSegmentLine += "\t" + getNameWithoutSign();
+ gfaSegmentLine += "\t" + gfaSequence;
+ gfaSegmentLine += "\tLN:i:" + QString::number(gfaSequence.length());
+
+ //We use the depthTag to guide how we save the node depth.
+ //If it is empty, that implies that the loaded graph did not have depth
+ //information and so we don't save depth.
+ if (depthTag == "DP")
+ gfaSegmentLine += "\tDP:f:" + QString::number(getDepth());
+ else if (depthTag == "KC")
+ gfaSegmentLine += "\tKC:i:" + QString::number(int(getDepth() * gfaSequence.length() + 0.5));
+ else if (depthTag == "RC")
+ gfaSegmentLine += "\tRC:i:" + QString::number(int(getDepth() * gfaSequence.length() + 0.5));
+ else if (depthTag == "FC")
+ gfaSegmentLine += "\tFC:i:" + QString::number(int(getDepth() * gfaSequence.length() + 0.5));
+
+ //If the user has included custom labels or colours, include those.
+ if (!m_customLabel.isEmpty())
+ gfaSegmentLine += "\tLB:z:" + getCustomLabel();
+ if (!m_reverseComplement->m_customLabel.isEmpty())
+ gfaSegmentLine += "\tL2:z:" + m_reverseComplement->getCustomLabel();
+ if (hasCustomColour())
+ gfaSegmentLine += "\tCL:z:" + getColourName(getCustomColour());
+ if (m_reverseComplement->hasCustomColour())
+ gfaSegmentLine += "\tC2:z:" + getColourName(m_reverseComplement->getCustomColour());
+ gfaSegmentLine += "\n";
+ return gfaSegmentLine;
+}
+
+
+//This function gets the node's sequence for a GFA file. It has two main
+//differences from getSequence:
+// -If the graph is from Velvet, it will extend the node sequences
+// -If the sequence is missing, it will just give "*"
+QByteArray DeBruijnNode::getSequenceForGfa() const
+{
+ if (sequenceIsMissing())
+ return QByteArray("*");
+
+ if (g_assemblyGraph->m_graphFileType != LAST_GRAPH)
+ return getSequence();
+
+ //If the code got here, then we are getting a full sequence from a Velvet
+ //LastGraph graph, so we need to extend the beginning of the sequence.
+ int extensionLength = g_assemblyGraph->m_kmer - 1;
+
+ //If the node is at least k-1 in length, then the necessary sequence can be
+ //deduced from the reverse complement node.
+ if (getLength() >= extensionLength)
+ {
+ QByteArray revCompSeq = getReverseComplement()->getSequence();
+ QByteArray endOfRevCompSeq = revCompSeq.right(extensionLength);
+ QByteArray extension = AssemblyGraph::getReverseComplement(endOfRevCompSeq);
+ return extension + getSequence();
+ }
+
+ //If the node is not long enough, then we must look in upstream nodes for
+ //the rest of the sequence.
+ else
+ {
+ QByteArray extension = getUpstreamSequence(extensionLength);
+ if (extension.length() < extensionLength)
+ {
+ int additionalBases = extensionLength - extension.length();
+ QByteArray n;
+ n.fill('N', additionalBases);
+ extension = n + extension;
+ }
+ return extension + getSequence();
+ }
+}
+
+
+QByteArray DeBruijnNode::getUpstreamSequence(int upstreamSequenceLength) const
+{
+ std::vector<DeBruijnNode*> upstreamNodes = getUpstreamNodes();
+
+ QByteArray bestUpstreamNodeSequence;
+
+ for (size_t i = 0; i < upstreamNodes.size(); ++i)
+ {
+ DeBruijnNode * upstreamNode = upstreamNodes[i];
+ QByteArray upstreamNodeFullSequence = upstreamNode->getSequence();
+ QByteArray upstreamNodeSequence;
+
+ //If the upstream node has enough sequence, great!
+ if (upstreamNodeFullSequence.length() >= upstreamSequenceLength)
+ upstreamNodeSequence = upstreamNodeFullSequence.right(upstreamSequenceLength);
+
+ //If the upstream node does not have enough sequence, then we need to
+ //look even further upstream.
+ else
+ upstreamNodeSequence = upstreamNode->getUpstreamSequence(upstreamSequenceLength - upstreamNodeFullSequence.length()) + upstreamNodeFullSequence;
+
+ //If we now have enough sequence, then we can return it.
+ if (upstreamNodeSequence.length() == upstreamSequenceLength)
+ return upstreamNodeSequence;
+
+ //If we don't have enough sequence, then we need to try the next
+ //upstream node. If our current one is the best so far, save that in
+ //case no complete sequence is found.
+ if (upstreamNodeSequence.length() > bestUpstreamNodeSequence.length())
+ bestUpstreamNodeSequence = upstreamNodeSequence;
+ }
+
+ //If the code got here, that means that not enough upstream sequence was
+ //found in any path! Return what we have managed to get so far.
+ return bestUpstreamNodeSequence;
+}
+
+
+int DeBruijnNode::getFullLength() const
+{
+ if (g_assemblyGraph->m_graphFileType != LAST_GRAPH)
+ return getLength();
+ else
+ return getLength() + g_assemblyGraph->m_kmer - 1;
+}
+
+
+int DeBruijnNode::getLengthWithoutTrailingOverlap() const
+{
+ int length = getLength();
+ std::vector<DeBruijnEdge *> leavingEdges = getLeavingEdges();
+
+ if (leavingEdges.size() == 0)
+ return length;
+
+ int maxOverlap = 0;
+ for (size_t i = 0; i < leavingEdges.size(); ++i)
+ {
+ int overlap = leavingEdges[i]->getOverlap();
+ if (overlap > maxOverlap)
+ maxOverlap = overlap;
+ }
+
+ length -= maxOverlap;
+
+ if (length < 0)
+ length = 0;
+
+ return length;
+}
+
+
+QString DeBruijnNode::getNodeNameForFasta(bool sign) const
+{
+ QString nodeNameForFasta;
+
+ nodeNameForFasta += "NODE_";
+ if (sign)
+ nodeNameForFasta += getName();
+ else
+ nodeNameForFasta += getNameWithoutSign();
+
+ nodeNameForFasta += "_length_";
+ nodeNameForFasta += QByteArray::number(getLength());
+ nodeNameForFasta += "_cov_";
+ nodeNameForFasta += QByteArray::number(getDepth());
+
+ return nodeNameForFasta;
+}
+
+
+//This function recursively labels all nodes as drawn that are within a
+//certain distance of this node. Whichever node called this will
+//definitely be drawn, so that one is excluded from the recursive call.
+void DeBruijnNode::labelNeighbouringNodesAsDrawn(int nodeDistance, DeBruijnNode * callingNode)
+{
+ if (m_highestDistanceInNeighbourSearch > nodeDistance)
+ return;
+ m_highestDistanceInNeighbourSearch = nodeDistance;
+
+ if (nodeDistance == 0)
+ return;
+
+ DeBruijnNode * otherNode;
+ for (size_t i = 0; i < m_edges.size(); ++i)
+ {
+ otherNode = m_edges[i]->getOtherNode(this);
+
+ if (otherNode == callingNode)
+ continue;
+
+ if (g_settings->doubleMode)
+ otherNode->m_drawn = true;
+ else //single mode
+ {
+ if (otherNode->isPositiveNode())
+ otherNode->m_drawn = true;
+ else
+ otherNode->getReverseComplement()->m_drawn = true;
+ }
+ otherNode->labelNeighbouringNodesAsDrawn(nodeDistance-1, this);
+ }
+}
+
+
+
+std::vector<BlastHitPart> DeBruijnNode::getBlastHitPartsForThisNode(double scaledNodeLength) const
+{
+ std::vector<BlastHitPart> returnVector;
+
+ for (size_t i = 0; i < m_blastHits.size(); ++i)
+ {
+ std::vector<BlastHitPart> hitParts = m_blastHits[i]->getBlastHitParts(false, scaledNodeLength);
+ returnVector.insert(returnVector.end(), hitParts.begin(), hitParts.end());
+ }
+
+ return returnVector;
+}
+
+std::vector<BlastHitPart> DeBruijnNode::getBlastHitPartsForThisNodeOrReverseComplement(double scaledNodeLength) const
+{
+ const DeBruijnNode * positiveNode = this;
+ const DeBruijnNode * negativeNode = getReverseComplement();
+ if (isNegativeNode())
+ std::swap(positiveNode, negativeNode);
+
+ //Look for blast hit parts on both the positive and the negative node,
+ //since hits were previously filtered such that startPos < endPos,
+ //hence we need to look at both positive and negative nodes to recover all hits.
+ std::vector<BlastHitPart> returnVector;
+ for (size_t i = 0; i < positiveNode->m_blastHits.size(); ++i)
+ {
+ std::vector<BlastHitPart> hitParts = positiveNode->m_blastHits[i]->getBlastHitParts(false, scaledNodeLength);
+ returnVector.insert(returnVector.end(), hitParts.begin(), hitParts.end());
+ }
+ for (size_t i = 0; i < negativeNode->m_blastHits.size(); ++i)
+ {
+ std::vector<BlastHitPart> hitParts = negativeNode->m_blastHits[i]->getBlastHitParts(true, scaledNodeLength);
+ returnVector.insert(returnVector.end(), hitParts.begin(), hitParts.end());
+ }
+
+ return returnVector;
+}
+
+
+
+bool DeBruijnNode::isPositiveNode() const
+{
+ QChar lastChar = m_name.at(m_name.length() - 1);
+ return lastChar == '+';
+}
+
+bool DeBruijnNode::isNegativeNode() const
+{
+ QChar lastChar = m_name.at(m_name.length() - 1);
+ return lastChar == '-';
+}
+
+
+
+//This function checks to see if the passed node leads into
+//this node. If so, it returns the connecting edge. If not,
+//it returns a null pointer.
+DeBruijnEdge * DeBruijnNode::doesNodeLeadIn(DeBruijnNode * node) const
+{
+ for (size_t i = 0; i < m_edges.size(); ++i)
+ {
+ DeBruijnEdge * edge = m_edges[i];
+ if (edge->getStartingNode() == node && edge->getEndingNode() == this)
+ return edge;
+ }
+ return 0;
+}
+
+//This function checks to see if the passed node leads away from
+//this node. If so, it returns the connecting edge. If not,
+//it returns a null pointer.
+DeBruijnEdge * DeBruijnNode::doesNodeLeadAway(DeBruijnNode * node) const
+{
+ for (size_t i = 0; i < m_edges.size(); ++i)
+ {
+ DeBruijnEdge * edge = m_edges[i];
+ if (edge->getStartingNode() == this && edge->getEndingNode() == node)
+ return edge;
+ }
+ return 0;
+}
+
+
+bool DeBruijnNode::isNodeConnected(DeBruijnNode * node) const
+{
+ for (size_t i = 0; i < m_edges.size(); ++i)
+ {
+ DeBruijnEdge * edge = m_edges[i];
+ if (edge->getStartingNode() == node || edge->getEndingNode() == node)
+ return true;
+ }
+ return false;
+}
+
+
+
+std::vector<DeBruijnEdge *> DeBruijnNode::getEnteringEdges() const
+{
+ std::vector<DeBruijnEdge *> returnVector;
+ for (size_t i = 0; i < m_edges.size(); ++i)
+ {
+ DeBruijnEdge * edge = m_edges[i];
+ if (this == edge->getEndingNode())
+ returnVector.push_back(edge);
+ }
+ return returnVector;
+}
+std::vector<DeBruijnEdge *> DeBruijnNode::getLeavingEdges() const
+{
+ std::vector<DeBruijnEdge *> returnVector;
+ for (size_t i = 0; i < m_edges.size(); ++i)
+ {
+ DeBruijnEdge * edge = m_edges[i];
+ if (this == edge->getStartingNode())
+ returnVector.push_back(edge);
+ }
+ return returnVector;
+}
+
+
+
+std::vector<DeBruijnNode *> DeBruijnNode::getDownstreamNodes() const
+{
+ std::vector<DeBruijnEdge *> leavingEdges = getLeavingEdges();
+
+ std::vector<DeBruijnNode *> returnVector;
+ for (size_t i = 0; i < leavingEdges.size(); ++i)
+ returnVector.push_back(leavingEdges[i]->getEndingNode());
+
+ return returnVector;
+}
+
+
+std::vector<DeBruijnNode *> DeBruijnNode::getUpstreamNodes() const
+{
+ std::vector<DeBruijnEdge *> enteringEdges = getEnteringEdges();
+
+ std::vector<DeBruijnNode *> returnVector;
+ for (size_t i = 0; i < enteringEdges.size(); ++i)
+ returnVector.push_back(enteringEdges[i]->getStartingNode());
+
+ return returnVector;
+}
+
+
+
+double DeBruijnNode::getNodeLengthPerMegabase() const
+{
+ if (g_settings->nodeLengthMode == AUTO_NODE_LENGTH)
+ return g_settings->autoNodeLengthPerMegabase;
+ else
+ return g_settings->manualNodeLengthPerMegabase;
+}
+
+
+
+bool DeBruijnNode::isInDepthRange(double min, double max) const
+{
+ return m_depth >= min && m_depth <= max;
+}
+
+
+bool DeBruijnNode::sequenceIsMissing() const
+{
+ return m_sequence == "*" || (m_sequence == "" && m_length > 0);
+}
+
+
+QByteArray DeBruijnNode::getSequence() const
+{
+ if (sequenceIsMissing() && g_assemblyGraph->m_sequencesLoadedFromFasta == NOT_TRIED)
+ g_assemblyGraph->attemptToLoadSequencesFromFasta();
+
+ //If the sequence is still missing, return a string of Ns equal to the
+ //sequence length.
+ if (sequenceIsMissing())
+ return QByteArray(m_length, 'N');
+ else
+ return m_sequence;
+}
+
+
+
+//If the node has an edge which leads to itself (creating a loop), this function
+//will return it. Otherwise, it returns 0.
+DeBruijnEdge * DeBruijnNode::getSelfLoopingEdge() const
+{
+ for (size_t i = 0; i < m_edges.size(); ++i)
+ {
+ DeBruijnEdge * edge = m_edges[i];
+ if (edge->getStartingNode() == this && edge->getEndingNode() == this)
+ return edge;
+ }
+
+ return 0;
+}
+
+
+//This function returns either 0, 1 or 2. A node with connections on both ends
+//(i.e. has both incoming and outgoing edges) returns 0. A node with no edges
+//returns 2. A node with either incoming or outgoing edges returns 1.
+int DeBruijnNode::getDeadEndCount() const
+{
+ if (m_edges.size() == 0)
+ return 2;
+
+ std::vector<DeBruijnEdge *> enteringEdges = getEnteringEdges();
+ std::vector<DeBruijnEdge *> leavingEdges = getLeavingEdges();
+
+ if (enteringEdges.size() > 0 && leavingEdges.size() > 0)
+ return 0;
+ else
+ return 1;
+}
+
+
+
+
+//This function returns all of the positive nodes that this node (or its
+//reverse complement) are connected to.
+std::vector<DeBruijnNode *> DeBruijnNode::getAllConnectedPositiveNodes() const
+{
+ QSet<DeBruijnNode *> connectedPositiveNodesSet;
+
+ for (size_t i = 0; i < m_edges.size(); ++i)
+ {
+ DeBruijnEdge * edge = m_edges[i];
+ DeBruijnNode * connectedNode = edge->getOtherNode(this);
+ if (connectedNode->isNegativeNode())
+ connectedNode = connectedNode->getReverseComplement();
+
+ connectedPositiveNodesSet.insert(connectedNode);
+ }
+
+ std::vector<DeBruijnNode *> connectedPositiveNodesVector;
+ QSetIterator<DeBruijnNode *> i(connectedPositiveNodesSet);
+ while (i.hasNext())
+ connectedPositiveNodesVector.push_back(i.next());
+
+ return connectedPositiveNodesVector;
+}
+
+void DeBruijnNode::setCustomLabel(QString newLabel)
+{
+ newLabel.replace("\t", " ");
+ m_customLabel = newLabel;
+}
+
+
+QStringList DeBruijnNode::getCustomLabelForDisplay() const
+{
+ QStringList customLabelLines;
+ if (!getCustomLabel().isEmpty()) {
+ QStringList labelLines = getCustomLabel().split("\\n");
+ for (int i = 0; i < labelLines.size(); ++i)
+ customLabelLines << labelLines[i];
+ }
+ if (!g_settings->doubleMode && !m_reverseComplement->getCustomLabel().isEmpty()) {
+ QStringList labelLines2 = m_reverseComplement->getCustomLabel().split("\n");
+ for (int i = 0; i < labelLines2.size(); ++i)
+ customLabelLines << labelLines2[i];
+ }
+ return customLabelLines;
+}
+
+
+QColor DeBruijnNode::getCustomColourForDisplay() const
+{
+ if (hasCustomColour())
+ return getCustomColour();
+ if (!g_settings->doubleMode && m_reverseComplement->hasCustomColour())
+ return m_reverseComplement->getCustomColour();
+ return g_settings->defaultCustomNodeColour;
+}
diff --git a/graph/debruijnnode.h b/graph/debruijnnode.h
new file mode 100644
index 0000000..4e58a77
--- /dev/null
+++ b/graph/debruijnnode.h
@@ -0,0 +1,163 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef DEBRUIJNNODE_H
+#define DEBRUIJNNODE_H
+
+#include <QByteArray>
+#include <vector>
+#include "../ogdf/basic/Graph.h"
+#include "../ogdf/basic/GraphAttributes.h"
+#include "../program/globals.h"
+#include <QColor>
+#include "../blast/blasthitpart.h"
+#include "../program/settings.h"
+
+class OgdfNode;
+class DeBruijnEdge;
+class GraphicsItemNode;
+class BlastHit;
+
+class DeBruijnNode
+{
+public:
+ //CREATORS
+ DeBruijnNode(QString name, double depth, QByteArray sequence, int length = 0);
+ ~DeBruijnNode();
+
+ //ACCESSORS
+ QString getName() const {return m_name;}
+ QString getNameWithoutSign() const {return m_name.left(m_name.length() - 1);}
+ QString getSign() const {if (m_name.length() > 0) return m_name.right(1); else return "+";}
+ double getDepth() const {return m_depth;}
+ double getDepthRelativeToMeanDrawnDepth() const {return m_depthRelativeToMeanDrawnDepth;}
+ QByteArray getSequence() const;
+ int getLength() const {return m_length;}
+ QByteArray getSequenceForGfa() const;
+ int getFullLength() const;
+ int getLengthWithoutTrailingOverlap() const;
+ QByteArray getFasta(bool sign, bool newLines = true, bool evenIfEmpty = true) const;
+ QByteArray getGfaSegmentLine(QString depthTag) const;
+ char getBaseAt(int i) const {if (i >= 0 && i < m_sequence.length()) return m_sequence.at(i); else return '\0';}
+ ContiguityStatus getContiguityStatus() const {return m_contiguityStatus;}
+ DeBruijnNode * getReverseComplement() const {return m_reverseComplement;}
+ OgdfNode * getOgdfNode() const {return m_ogdfNode;}
+ GraphicsItemNode * getGraphicsItemNode() const {return m_graphicsItemNode;}
+ bool thisOrReverseComplementHasGraphicsItemNode() const {return (m_graphicsItemNode != 0 || getReverseComplement()->m_graphicsItemNode != 0);}
+ bool hasGraphicsItem() const {return m_graphicsItemNode != 0;}
+ const std::vector<DeBruijnEdge *> * getEdgesPointer() const {return &m_edges;}
+ std::vector<DeBruijnEdge *> getEnteringEdges() const;
+ std::vector<DeBruijnEdge *> getLeavingEdges() const;
+ std::vector<DeBruijnNode *> getDownstreamNodes() const;
+ std::vector<DeBruijnNode *> getUpstreamNodes() const;
+ std::vector<DeBruijnNode *> getAllConnectedPositiveNodes() const;
+ bool isSpecialNode() const {return m_specialNode;}
+ bool isDrawn() const {return m_drawn;}
+ bool thisNodeOrReverseComplementIsDrawn() const {return isDrawn() || getReverseComplement()->isDrawn();}
+ bool isNotDrawn() const {return !m_drawn;}
+ QColor getCustomColour() const {return m_customColour;}
+ QColor getCustomColourForDisplay() const;
+ QString getCustomLabel() const {return m_customLabel;}
+ QStringList getCustomLabelForDisplay() const;
+ bool hasCustomColour() const {return m_customColour.isValid();}
+ bool isPositiveNode() const;
+ bool isNegativeNode() const;
+ bool inOgdf() const {return m_ogdfNode != 0;}
+ bool notInOgdf() const {return m_ogdfNode == 0;}
+ bool thisOrReverseComplementInOgdf() const {return (inOgdf() || getReverseComplement()->inOgdf());}
+ bool thisOrReverseComplementNotInOgdf() const {return !thisOrReverseComplementInOgdf();}
+ bool isNodeConnected(DeBruijnNode * node) const;
+ const std::vector<BlastHit *> * getBlastHitsPointer() const {return &m_blastHits;}
+ bool thisNodeHasBlastHits() const {return m_blastHits.size() > 0;}
+ bool thisNodeOrReverseComplementHasBlastHits() const {return m_blastHits.size() > 0 || getReverseComplement()->m_blastHits.size() > 0;}
+ DeBruijnEdge * doesNodeLeadIn(DeBruijnNode * node) const;
+ DeBruijnEdge * doesNodeLeadAway(DeBruijnNode * node) const;
+ std::vector<BlastHitPart> getBlastHitPartsForThisNode(double scaledNodeLength) const;
+ std::vector<BlastHitPart> getBlastHitPartsForThisNodeOrReverseComplement(double scaledNodeLength) const;
+ bool hasCsvData() const {return !m_csvData.isEmpty();}
+ QStringList getAllCsvData() const {return m_csvData;}
+ QString getCsvLine(int i) const {if (i < m_csvData.length()) return m_csvData[i]; else return "";}
+ bool isInDepthRange(double min, double max) const;
+ bool sequenceIsMissing() const;
+ DeBruijnEdge *getSelfLoopingEdge() const;
+ int getDeadEndCount() const;
+ int getNumberOfOgdfGraphEdges(double drawnNodeLength) const;
+ double getDrawnNodeLength() const;
+
+ //MODIFERS
+ void setDepthRelativeToMeanDrawnDepth(double newVal) {m_depthRelativeToMeanDrawnDepth = newVal;}
+ void setSequence(QByteArray newSeq) {m_sequence = newSeq; m_length = m_sequence.length();}
+ void appendToSequence(QByteArray additionalSeq) {m_sequence.append(additionalSeq); m_length = m_sequence.length();}
+ void upgradeContiguityStatus(ContiguityStatus newStatus);
+ void resetContiguityStatus() {m_contiguityStatus = NOT_CONTIGUOUS;}
+ void setReverseComplement(DeBruijnNode * rc) {m_reverseComplement = rc;}
+ void setGraphicsItemNode(GraphicsItemNode * gin) {m_graphicsItemNode = gin;}
+ void setAsSpecial() {m_specialNode = true;}
+ void setAsNotSpecial() {m_specialNode = false;}
+ void setAsDrawn() {m_drawn = true;}
+ void setAsNotDrawn() {m_drawn = false;}
+ void setCustomColour(QColor newColour) {m_customColour = newColour;}
+ void setCustomLabel(QString newLabel);
+ void resetNode();
+ void addEdge(DeBruijnEdge * edge);
+ void removeEdge(DeBruijnEdge * edge);
+ void addToOgdfGraph(ogdf::Graph * ogdfGraph, ogdf::GraphAttributes * graphAttributes,
+ ogdf::EdgeArray<double> * edgeArray, double xPos, double yPos);
+ void determineContiguity();
+ void clearBlastHits() {m_blastHits.clear();}
+ void addBlastHit(BlastHit * newHit) {m_blastHits.push_back(newHit);}
+ void labelNeighbouringNodesAsDrawn(int nodeDistance, DeBruijnNode * callingNode);
+ void setCsvData(QStringList csvData) {m_csvData = csvData;}
+ void clearCsvData() {m_csvData.clear();}
+ void setDepth(double newDepth) {m_depth = newDepth;}
+ void setName(QString newName) {m_name = newName;}
+
+private:
+ QString m_name;
+ double m_depth;
+ double m_depthRelativeToMeanDrawnDepth;
+ QByteArray m_sequence;
+ int m_length;
+ ContiguityStatus m_contiguityStatus;
+ DeBruijnNode * m_reverseComplement;
+ OgdfNode * m_ogdfNode;
+ GraphicsItemNode * m_graphicsItemNode;
+ std::vector<DeBruijnEdge *> m_edges;
+ bool m_specialNode;
+ bool m_drawn;
+ int m_highestDistanceInNeighbourSearch;
+ QColor m_customColour;
+ QString m_customLabel;
+ std::vector<BlastHit *> m_blastHits;
+ QStringList m_csvData;
+ QString getNodeNameForFasta(bool sign) const;
+ QByteArray getUpstreamSequence(int upstreamSequenceLength) const;
+
+ double getNodeLengthPerMegabase() const;
+ bool isOnlyPathInItsDirection(DeBruijnNode * connectedNode,
+ std::vector<DeBruijnNode *> * incomingNodes,
+ std::vector<DeBruijnNode *> * outgoingNodes) const;
+ bool isNotOnlyPathInItsDirection(DeBruijnNode * connectedNode,
+ std::vector<DeBruijnNode *> * incomingNodes,
+ std::vector<DeBruijnNode *> * outgoingNodes) const;
+ std::vector<DeBruijnNode *> getNodesCommonToAllPaths(std::vector< std::vector <DeBruijnNode *> > * paths,
+ bool includeReverseComplements) const;
+ bool doesPathLeadOnlyToNode(DeBruijnNode * node, bool includeReverseComplement);
+};
+
+#endif // DEBRUIJNNODE_H
diff --git a/graph/graphicsitemedge.cpp b/graph/graphicsitemedge.cpp
new file mode 100644
index 0000000..97696d0
--- /dev/null
+++ b/graph/graphicsitemedge.cpp
@@ -0,0 +1,196 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "graphicsitemedge.h"
+#include "debruijnedge.h"
+#include <QPainterPathStroker>
+#include <QPainter>
+#include <QPen>
+#include "../program/globals.h"
+#include "../program/settings.h"
+#include "debruijnnode.h"
+#include "ogdfnode.h"
+#include <QLineF>
+#include "graphicsitemnode.h"
+
+GraphicsItemEdge::GraphicsItemEdge(DeBruijnEdge * deBruijnEdge, QGraphicsItem * parent) :
+ QGraphicsPathItem(parent), m_deBruijnEdge(deBruijnEdge)
+
+{
+ calculateAndSetPath();
+}
+
+
+
+QPointF GraphicsItemEdge::extendLine(QPointF start, QPointF end, double extensionLength)
+{
+ double extensionRatio = extensionLength / QLineF(start, end).length();
+ QPointF difference = end - start;
+ difference *= extensionRatio;
+ return end + difference;
+}
+
+
+void GraphicsItemEdge::paint(QPainter * painter, const QStyleOptionGraphicsItem *, QWidget *)
+{
+ double edgeWidth = g_settings->edgeWidth;
+ QColor penColour;
+ if (isSelected())
+ penColour = g_settings->selectionColour;
+ else
+ penColour = g_settings->edgeColour;
+ QPen edgePen(QBrush(penColour), edgeWidth, Qt::SolidLine, Qt::RoundCap);
+ painter->setPen(edgePen);
+ painter->drawPath(path());
+}
+
+
+
+QPainterPath GraphicsItemEdge::shape() const
+{
+ QPainterPathStroker stroker;
+ stroker.setWidth(g_settings->edgeWidth);
+ stroker.setCapStyle(Qt::RoundCap);
+ stroker.setJoinStyle(Qt::RoundJoin);
+ return stroker.createStroke(path());
+}
+
+
+
+void GraphicsItemEdge::calculateAndSetPath()
+{
+ setControlPointLocations();
+
+ double edgeDistance = QLineF(m_startingLocation, m_endingLocation).length();
+
+ double extensionLength = g_settings->edgeLength;
+ if (extensionLength > edgeDistance / 2.0)
+ extensionLength = edgeDistance / 2.0;
+
+ m_controlPoint1 = extendLine(m_beforeStartingLocation, m_startingLocation, extensionLength);
+ m_controlPoint2 = extendLine(m_afterEndingLocation, m_endingLocation, extensionLength);
+
+
+ //If this edge is connecting a node to itself, and that node
+ //is made of only one line segment, then a special path is
+ //required, otherwise the edge will be mostly hidden underneath
+ //the node.
+ DeBruijnNode * startingNode = m_deBruijnEdge->getStartingNode();
+ DeBruijnNode * endingNode = m_deBruijnEdge->getEndingNode();
+ if (startingNode == endingNode)
+ {
+ GraphicsItemNode * graphicsItemNode = startingNode->getGraphicsItemNode();
+ if (graphicsItemNode == 0)
+ graphicsItemNode = startingNode->getReverseComplement()->getGraphicsItemNode();
+ if (graphicsItemNode != 0 && graphicsItemNode->m_linePoints.size() == 2)
+ {
+ makeSpecialPathConnectingNodeToSelf();
+ return;
+ }
+ }
+
+ //If we are in single mode and the edge connects a node to its reverse
+ //complement, then we need a special path to make it visible.
+ if (startingNode == endingNode->getReverseComplement() &&
+ !g_settings->doubleMode)
+ {
+ makeSpecialPathConnectingNodeToReverseComplement();
+ return;
+ }
+
+ //Otherwise, the path is just a single cubic Bezier curve.
+ QPainterPath path;
+ path.moveTo(m_startingLocation);
+ path.cubicTo(m_controlPoint1, m_controlPoint2, m_endingLocation);
+
+ setPath(path);
+}
+
+void GraphicsItemEdge::setControlPointLocations()
+{
+ DeBruijnNode * startingNode = m_deBruijnEdge->getStartingNode();
+ DeBruijnNode * endingNode = m_deBruijnEdge->getEndingNode();
+
+ if (startingNode->hasGraphicsItem())
+ {
+ m_startingLocation = startingNode->getGraphicsItemNode()->getLast();
+ m_beforeStartingLocation = startingNode->getGraphicsItemNode()->getSecondLast();
+ }
+ else if (startingNode->getReverseComplement()->hasGraphicsItem())
+ {
+ m_startingLocation = startingNode->getReverseComplement()->getGraphicsItemNode()->getFirst();
+ m_beforeStartingLocation = startingNode->getReverseComplement()->getGraphicsItemNode()->getSecond();
+ }
+
+ if (endingNode->hasGraphicsItem())
+ {
+ m_endingLocation = endingNode->getGraphicsItemNode()->getFirst();
+ m_afterEndingLocation = endingNode->getGraphicsItemNode()->getSecond();
+ }
+ else if (endingNode->getReverseComplement()->hasGraphicsItem())
+ {
+ m_endingLocation = endingNode->getReverseComplement()->getGraphicsItemNode()->getLast();
+ m_afterEndingLocation = endingNode->getReverseComplement()->getGraphicsItemNode()->getSecondLast();
+ }
+}
+
+
+//This function handles the special case of an edge that connects a node
+//to itself where the node graphics item has only one line segment.
+void GraphicsItemEdge::makeSpecialPathConnectingNodeToSelf()
+{
+ double extensionLength = g_settings->edgeLength;
+ m_controlPoint1 = extendLine(m_beforeStartingLocation, m_startingLocation, extensionLength);
+ m_controlPoint2 = extendLine(m_afterEndingLocation, m_endingLocation, extensionLength);
+
+ QLineF nodeLine(m_startingLocation, m_endingLocation);
+ QLineF normalUnitLine = nodeLine.normalVector().unitVector();
+ QPointF perpendicularShift = (normalUnitLine.p2() - normalUnitLine.p1()) * g_settings->edgeLength;
+ QPointF nodeMidPoint = (m_startingLocation + m_endingLocation) / 2.0;
+
+ QPainterPath path;
+ path.moveTo(m_startingLocation);
+
+ path.cubicTo(m_controlPoint1, m_controlPoint1 + perpendicularShift, nodeMidPoint + perpendicularShift);
+ path.cubicTo(m_controlPoint2 + perpendicularShift, m_controlPoint2, m_endingLocation);
+
+ setPath(path);
+}
+
+//This function handles the special case of an edge that connects a node to its
+//reverse complement and is displayed in single mode.
+void GraphicsItemEdge::makeSpecialPathConnectingNodeToReverseComplement()
+{
+ double extensionLength = g_settings->edgeLength / 2.0;
+ m_controlPoint1 = extendLine(m_beforeStartingLocation, m_startingLocation, extensionLength);
+ m_controlPoint2 = extendLine(m_afterEndingLocation, m_endingLocation, extensionLength);
+
+ QPointF startToControl = m_controlPoint1 - m_startingLocation;
+ QPointF pathMidPoint = m_startingLocation + startToControl * 3.0;
+
+ QLineF normalLine = QLineF(m_controlPoint1, m_startingLocation).normalVector();
+ QPointF perpendicularShift = (normalLine.p2() - normalLine.p1()) * 1.5;
+
+ QPainterPath path;
+ path.moveTo(m_startingLocation);
+
+ path.cubicTo(m_controlPoint1, pathMidPoint + perpendicularShift, pathMidPoint);
+ path.cubicTo(pathMidPoint - perpendicularShift, m_controlPoint2, m_endingLocation);
+
+ setPath(path);
+}
diff --git a/graph/graphicsitemedge.h b/graph/graphicsitemedge.h
new file mode 100644
index 0000000..f5a6add
--- /dev/null
+++ b/graph/graphicsitemedge.h
@@ -0,0 +1,56 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef GRAPHICSITEMEDGE_H
+#define GRAPHICSITEMEDGE_H
+
+#include <QGraphicsPathItem>
+#include <QPainterPath>
+
+
+#include "../ogdf/basic/Graph.h"
+#include "../ogdf/basic/GraphAttributes.h"
+#include <QPointF>
+
+class DeBruijnEdge;
+
+class GraphicsItemEdge : public QGraphicsPathItem
+{
+public:
+ GraphicsItemEdge(DeBruijnEdge * deBruijnEdge, QGraphicsItem * parent = 0);
+
+ DeBruijnEdge * m_deBruijnEdge;
+ QPointF m_startingLocation;
+ QPointF m_endingLocation;
+ QPointF m_beforeStartingLocation;
+ QPointF m_afterEndingLocation;
+ QPointF m_controlPoint1;
+ QPointF m_controlPoint2;
+
+ void paint(QPainter * painter, const QStyleOptionGraphicsItem *, QWidget *);
+ QPainterPath shape() const;
+ QPointF extendLine(QPointF start, QPointF end, double extensionLength);
+ void calculateAndSetPath();
+ void setControlPointLocations();
+ void setStartingPoints(QPointF startingLocation, QPointF beforeStartingLocation) {m_startingLocation = startingLocation; m_beforeStartingLocation = beforeStartingLocation;}
+ void setEndingPoints(QPointF endingLocation, QPointF afterEndingLocation) {m_endingLocation = endingLocation; m_afterEndingLocation = afterEndingLocation;}
+ void makeSpecialPathConnectingNodeToSelf();
+ void makeSpecialPathConnectingNodeToReverseComplement();
+};
+
+#endif // GRAPHICSITEMEDGE_H
diff --git a/graph/graphicsitemnode.cpp b/graph/graphicsitemnode.cpp
new file mode 100644
index 0000000..18f923e
--- /dev/null
+++ b/graph/graphicsitemnode.cpp
@@ -0,0 +1,1148 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "graphicsitemnode.h"
+#include "debruijnnode.h"
+#include "ogdfnode.h"
+#include <QPainterPathStroker>
+#include "../graph/ogdfnode.h"
+#include "../program/settings.h"
+#include <QPainter>
+#include <QPen>
+#include <QMessageBox>
+#include "debruijnedge.h"
+#include "graphicsitemedge.h"
+#include "../ogdf/basic/GraphAttributes.h"
+#include <math.h>
+#include <QFontMetrics>
+#include <QSize>
+#include <stdlib.h>
+#include <QGraphicsScene>
+#include "../ui/mygraphicsscene.h"
+#include <set>
+#include "../ui/mygraphicsview.h"
+#include <QTransform>
+#include "../blast/blasthit.h"
+#include "../blast/blastquery.h"
+#include "../blast/blasthitpart.h"
+#include "assemblygraph.h"
+#include <math.h>
+#include <QFontMetrics>
+#include "../program/memory.h"
+
+GraphicsItemNode::GraphicsItemNode(DeBruijnNode * deBruijnNode,
+ ogdf::GraphAttributes * graphAttributes, QGraphicsItem * parent) :
+ QGraphicsItem(parent), m_deBruijnNode(deBruijnNode),
+ m_hasArrow(g_settings->doubleMode || g_settings->arrowheadsInSingleMode)
+
+{
+ setWidth();
+
+ OgdfNode * pathOgdfNode = deBruijnNode->getOgdfNode();
+ if (pathOgdfNode != 0)
+ {
+ for (size_t i = 0; i < pathOgdfNode->m_ogdfNodes.size(); ++i)
+ {
+ ogdf::node ogdfNode = pathOgdfNode->m_ogdfNodes[i];
+ QPointF point(graphAttributes->x(ogdfNode), graphAttributes->y(ogdfNode));
+ m_linePoints.push_back(point);
+ }
+ }
+ else
+ {
+ pathOgdfNode = deBruijnNode->getReverseComplement()->getOgdfNode();
+ for (int i = int(pathOgdfNode->m_ogdfNodes.size()) - 1; i >= 0; --i)
+ {
+ ogdf::node ogdfNode = pathOgdfNode->m_ogdfNodes[i];
+ QPointF point(graphAttributes->x(ogdfNode), graphAttributes->y(ogdfNode));
+ m_linePoints.push_back(point);
+ }
+ }
+
+ //If we are in double mode and this node's complement is also drawn,
+ //then we should shift the points so the two nodes are not drawn directly
+ //on top of each other.
+ if (g_settings->doubleMode && deBruijnNode->getReverseComplement()->isDrawn())
+ shiftPointsLeft();
+
+ remakePath();
+}
+
+
+//This constructor makes a new GraphicsItemNode by copying the line points of
+//the given node.
+GraphicsItemNode::GraphicsItemNode(DeBruijnNode * deBruijnNode,
+ GraphicsItemNode * toCopy,
+ QGraphicsItem * parent) :
+ QGraphicsItem(parent), m_deBruijnNode(deBruijnNode),
+ m_hasArrow(toCopy->m_hasArrow),
+ m_linePoints(toCopy->m_linePoints)
+{
+ setWidth();
+ remakePath();
+}
+
+//This constructor makes a new GraphicsItemNode with a specific collection of
+//line points.
+GraphicsItemNode::GraphicsItemNode(DeBruijnNode * deBruijnNode,
+ std::vector<QPointF> linePoints,
+ QGraphicsItem * parent) :
+ QGraphicsItem(parent), m_deBruijnNode(deBruijnNode),
+ m_hasArrow(g_settings->doubleMode),
+ m_linePoints(linePoints)
+{
+ setWidth();
+ remakePath();
+}
+
+
+
+void GraphicsItemNode::paint(QPainter * painter, const QStyleOptionGraphicsItem *, QWidget *)
+{
+ //This code lets me see the node's bounding box.
+ //I use it for debugging graphics issues.
+// painter->setBrush(Qt::NoBrush);
+// painter->setPen(QPen(Qt::black, 1.0));
+// painter->drawRect(boundingRect());
+
+ QPainterPath outlinePath = shape();
+
+ //Fill the node's colour
+ QBrush brush(m_colour);
+ painter->fillPath(outlinePath, brush);
+
+ bool nodeHasBlastHits;
+ if (g_settings->doubleMode)
+ nodeHasBlastHits = m_deBruijnNode->thisNodeHasBlastHits();
+ else
+ nodeHasBlastHits = m_deBruijnNode->thisNodeOrReverseComplementHasBlastHits();
+
+ //If the node contains a BLAST hit, draw that on top.
+ if (nodeHasBlastHits && (g_settings->nodeColourScheme == BLAST_HITS_RAINBOW_COLOUR ||
+ g_settings->nodeColourScheme == BLAST_HITS_SOLID_COLOUR))
+ {
+ std::vector<BlastHitPart> parts;
+
+ //The scaled node length is passed to the function which makes the
+ //BlastHitPart objects, because we don't want those parts to be much
+ //less than 1 pixel in size, which isn't necessary and can cause weird
+ //visual artefacts.
+ double scaledNodeLength = getNodePathLength() * g_absoluteZoom;
+
+ if (g_settings->doubleMode)
+ {
+ if (m_deBruijnNode->thisNodeHasBlastHits())
+ parts = m_deBruijnNode->getBlastHitPartsForThisNode(scaledNodeLength);
+ }
+ else
+ {
+ if (m_deBruijnNode->thisNodeOrReverseComplementHasBlastHits())
+ parts = m_deBruijnNode->getBlastHitPartsForThisNodeOrReverseComplement(scaledNodeLength);
+ }
+
+ QPen partPen;
+ partPen.setWidthF(m_width);
+ partPen.setCapStyle(Qt::FlatCap);
+ partPen.setJoinStyle(Qt::BevelJoin);
+
+ //If the node has an arrow, then it's necessary to use the outline
+ //as a clipping path so the colours don't extend past the edge of the
+ //node.
+ if (m_hasArrow)
+ painter->setClipPath(outlinePath);
+
+ for (size_t i = 0; i < parts.size(); ++i)
+ {
+ partPen.setColor(parts[i].m_colour);
+ painter->setPen(partPen);
+
+ painter->drawPath(makePartialPath(parts[i].m_nodeFractionStart,
+ parts[i].m_nodeFractionEnd));
+ }
+ painter->setClipping(false);
+ }
+
+
+ //Draw the node outline
+ QColor outlineColour = g_settings->outlineColour;
+ double outlineThickness = g_settings->outlineThickness;
+ if (isSelected())
+ {
+ outlineColour = g_settings->selectionColour;
+ outlineThickness = g_settings->selectionThickness;
+ }
+ if (outlineThickness > 0.0)
+ {
+ outlinePath = outlinePath.simplified();
+ QPen outlinePen(QBrush(outlineColour), outlineThickness, Qt::SolidLine,
+ Qt::SquareCap, Qt::RoundJoin);
+ painter->setPen(outlinePen);
+ painter->drawPath(outlinePath);
+ }
+
+
+ //Draw the path highlighting outline, if appropriate
+ if (g_memory->pathDialogIsVisible)
+ exactPathHighlightNode(painter);
+
+
+ //Draw the query path, if appropriate
+ if (g_memory->queryPathDialogIsVisible)
+ queryPathHighlightNode(painter);
+
+
+ //Draw node labels if there are any to display.
+ if (anyNodeDisplayText())
+ {
+ QStringList nodeText = getNodeText();
+ QPainterPath textPath;
+
+ QFontMetrics metrics(g_settings->labelFont);
+ double fontHeight = metrics.ascent();
+
+ for (int i = 0; i < nodeText.size(); ++i)
+ {
+ QString text = nodeText.at(i);
+ int stepsUntilLast = nodeText.size() - 1 - i;
+ double shiftLeft = -metrics.width(text) / 2.0;
+ textPath.addText(shiftLeft, -stepsUntilLast * fontHeight, g_settings->labelFont, text);
+ }
+
+ std::vector<QPointF> centres;
+ if (g_settings->positionTextNodeCentre)
+ centres.push_back(getCentre(m_linePoints));
+ else
+ centres = getCentres();
+
+ for (size_t i = 0; i < centres.size(); ++i)
+ drawTextPathAtLocation(painter, textPath, centres[i]);
+ }
+
+ //Draw BLAST hit labels, if appropriate.
+ if (g_settings->displayBlastHits && nodeHasBlastHits)
+ {
+ std::vector<QString> blastHitText;
+ std::vector<QPointF> blastHitLocation;
+
+ if (g_settings->doubleMode)
+ getBlastHitsTextAndLocationThisNode(&blastHitText, &blastHitLocation);
+ else
+ getBlastHitsTextAndLocationThisNodeOrReverseComplement(&blastHitText, &blastHitLocation);
+
+ for (size_t i = 0; i < blastHitText.size(); ++i)
+ {
+ QString text = blastHitText[i];
+ QPointF centre = blastHitLocation[i];
+
+ QPainterPath textPath;
+ QFontMetrics metrics(g_settings->labelFont);
+ double shiftLeft = -metrics.width(text) / 2.0;
+ textPath.addText(shiftLeft, 0.0, g_settings->labelFont, text);
+
+ drawTextPathAtLocation(painter, textPath, centre);
+ }
+ }
+}
+
+
+void GraphicsItemNode::drawTextPathAtLocation(QPainter * painter, QPainterPath textPath, QPointF centre)
+{
+ QRectF textBoundingRect = textPath.boundingRect();
+ double textHeight = textBoundingRect.height();
+ QPointF offset(0.0, textHeight / 2.0);
+
+ double zoom = g_absoluteZoom;
+ if (zoom == 0.0)
+ zoom = 1.0;
+
+ double zoomAdjustment = 1.0 / (1.0 + ((zoom - 1.0) * g_settings->textZoomScaleFactor));
+ double inverseZoomAdjustment = 1.0 / zoomAdjustment;
+
+ painter->translate(centre);
+ painter->rotate(-g_graphicsView->getRotation());
+ painter->scale(zoomAdjustment, zoomAdjustment);
+ painter->translate(offset);
+
+ if (g_settings->textOutline)
+ {
+ painter->setPen(QPen(g_settings->textOutlineColour,
+ g_settings->textOutlineThickness * 2.0,
+ Qt::SolidLine,
+ Qt::SquareCap,
+ Qt::RoundJoin));
+ painter->drawPath(textPath);
+ }
+
+ painter->fillPath(textPath, QBrush(g_settings->textColour));
+ painter->translate(-offset);
+ painter->scale(inverseZoomAdjustment, inverseZoomAdjustment);
+ painter->rotate(g_graphicsView->getRotation());
+ painter->translate(-centre);
+}
+
+
+
+void GraphicsItemNode::setNodeColour()
+{
+ switch (g_settings->nodeColourScheme)
+ {
+ case UNIFORM_COLOURS:
+ if (m_deBruijnNode->isSpecialNode())
+ m_colour = g_settings->uniformNodeSpecialColour;
+ else if (usePositiveNodeColour())
+ m_colour = g_settings->uniformPositiveNodeColour;
+ else
+ m_colour = g_settings->uniformNegativeNodeColour;
+ break;
+
+ case RANDOM_COLOURS:
+ {
+ //Make a colour with a random hue. Assign a colour to both this node and
+ //it complement so their hue matches.
+ int hue = rand() % 360;
+ QColor posColour;
+ posColour.setHsl(hue,
+ g_settings->randomColourPositiveSaturation,
+ g_settings->randomColourPositiveLightness);
+ posColour.setAlpha(g_settings->randomColourPositiveOpacity);
+
+ QColor negColour;
+ negColour.setHsl(hue,
+ g_settings->randomColourNegativeSaturation,
+ g_settings->randomColourNegativeLightness);
+ negColour.setAlpha(g_settings->randomColourNegativeOpacity);
+
+ QColor colour1, colour2;
+ if (m_deBruijnNode->isPositiveNode())
+ {
+ colour1 = posColour;
+ colour2 = negColour;
+ }
+ else
+ {
+ colour1 = negColour;
+ colour2 = posColour;
+ }
+
+ m_colour = colour1;
+ DeBruijnNode * revCompNode = m_deBruijnNode->getReverseComplement();
+ if (revCompNode != 0)
+ {
+ GraphicsItemNode * revCompGraphNode = revCompNode->getGraphicsItemNode();
+ if (revCompGraphNode != 0)
+ revCompGraphNode->m_colour = colour2;
+ }
+ break;
+ }
+
+ case DEPTH_COLOUR:
+ {
+ m_colour = getDepthColour();
+ break;
+ }
+
+ case BLAST_HITS_RAINBOW_COLOUR:
+ {
+ m_colour = g_settings->noBlastHitsColour;
+ break;
+ }
+
+ case BLAST_HITS_SOLID_COLOUR:
+ {
+ m_colour = g_settings->noBlastHitsColour;
+ break;
+ }
+
+ case CUSTOM_COLOURS:
+ {
+ m_colour = m_deBruijnNode->getCustomColourForDisplay();
+ break;
+ }
+
+ default: //CONTIGUITY COLOUR
+ {
+ //For single nodes, display the colour of whichever of the
+ //twin nodes has the greatest contiguity status.
+ ContiguityStatus contiguityStatus = m_deBruijnNode->getContiguityStatus();
+ if (!m_hasArrow)
+ {
+ ContiguityStatus twinContiguityStatus = m_deBruijnNode->getReverseComplement()->getContiguityStatus();
+ if (twinContiguityStatus < contiguityStatus)
+ contiguityStatus = twinContiguityStatus;
+ }
+
+ switch (contiguityStatus)
+ {
+ case STARTING:
+ m_colour = g_settings->contiguityStartingColour;
+ break;
+ case CONTIGUOUS_STRAND_SPECIFIC:
+ m_colour = g_settings->contiguousStrandSpecificColour;
+ break;
+ case CONTIGUOUS_EITHER_STRAND:
+ m_colour = g_settings->contiguousEitherStrandColour;
+ break;
+ case MAYBE_CONTIGUOUS:
+ m_colour = g_settings->maybeContiguousColour;
+ break;
+ default: //NOT_CONTIGUOUS
+ m_colour = g_settings->notContiguousColour;
+ break;
+ }
+ }
+ }
+}
+
+
+QPainterPath GraphicsItemNode::shape() const
+{
+ //If there is only one segment and it is shorter than half its
+ //width, then the arrow head will not be made with 45 degree
+ //angles, but rather whatever angle is made by going from the
+ //end to the back corners (the final node will be a triangle).
+ if (m_hasArrow
+ && m_linePoints.size() == 2
+ && distance(getLast(), getSecondLast()) < m_width / 2.0)
+ {
+ QLineF backline = QLineF(getSecondLast(), getLast()).normalVector();
+ backline.setLength(m_width / 2.0);
+ QPointF backVector = backline.p2() - backline.p1();
+ QPainterPath trianglePath;
+ trianglePath.moveTo(getLast());
+ trianglePath.lineTo(getSecondLast() + backVector);
+ trianglePath.lineTo(getSecondLast() - backVector);
+ trianglePath.lineTo(getLast());
+ return trianglePath;
+ }
+
+ //Create a path that outlines the main node shape.
+ QPainterPathStroker stroker;
+ stroker.setWidth(m_width);
+ stroker.setCapStyle(Qt::FlatCap);
+ stroker.setJoinStyle(Qt::RoundJoin);
+ QPainterPath mainNodePath = stroker.createStroke(m_path);
+
+ if (!m_hasArrow)
+ return mainNodePath;
+
+ //If the node has an arrow head, subtract the part of its
+ //final segment to give it a pointy end.
+ //NOTE: THIS APPROACH CAN LEAD TO WEIRD EFFECTS WHEN THE NODE'S
+ //POINTY END OVERLAPS WITH ANOTHER PART OF THE NODE. PERHAPS THERE
+ //IS A BETTER WAY TO MAKE ARROWHEADS?
+ QLineF frontline = QLineF(getLast(), getSecondLast()).normalVector();
+ frontline.setLength(m_width / 2.0);
+ QPointF frontVector = frontline.p2() - frontline.p1();
+ QLineF arrowheadLine(getLast(), getSecondLast());
+ arrowheadLine.setLength(1.42 * (m_width / 2.0));
+ arrowheadLine.setAngle(arrowheadLine.angle() + 45.0);
+ QPointF arrow1 = arrowheadLine.p2();
+ arrowheadLine.setAngle(arrowheadLine.angle() - 90.0);
+ QPointF arrow2 = arrowheadLine.p2();
+ QLineF lastSegmentLine(getSecondLast(), getLast());
+ lastSegmentLine.setLength(0.01);
+ QPointF additionalForwardBit = lastSegmentLine.p2() - lastSegmentLine.p1();
+ QPainterPath subtractionPath;
+ subtractionPath.moveTo(getLast());
+ subtractionPath.lineTo(arrow1);
+ subtractionPath.lineTo(getLast() + frontVector + additionalForwardBit);
+ subtractionPath.lineTo(getLast() - frontVector + additionalForwardBit);
+ subtractionPath.lineTo(arrow2);
+ subtractionPath.lineTo(getLast());
+ return mainNodePath.subtracted(subtractionPath);
+}
+
+
+void GraphicsItemNode::mousePressEvent(QGraphicsSceneMouseEvent * event)
+{
+ m_grabIndex = 0;
+ QPointF grabPoint = event->pos();
+
+ double closestPointDistance = distance(grabPoint, m_linePoints[0]);
+ for (size_t i = 1; i < m_linePoints.size(); ++i)
+ {
+ double pointDistance = distance(grabPoint, m_linePoints[i]);
+ if (pointDistance < closestPointDistance)
+ {
+ closestPointDistance = pointDistance;
+ m_grabIndex = i;
+ }
+ }
+}
+
+
+//When this node graphics item is moved, each of the connected edge
+//graphics items will need to be adjusted accordingly.
+void GraphicsItemNode::mouseMoveEvent(QGraphicsSceneMouseEvent * event)
+{
+ QPointF difference = event->pos() - event->lastPos();
+
+ //If this node is selected, then move all of the other selected nodes too.
+ //If it is not selected, then only move this node.
+ std::vector<GraphicsItemNode *> nodesToMove;
+ MyGraphicsScene * graphicsScene = dynamic_cast<MyGraphicsScene *>(scene());
+ if (isSelected())
+ nodesToMove = graphicsScene->getSelectedGraphicsItemNodes();
+ else
+ nodesToMove.push_back(this);
+
+ for (size_t i = 0; i < nodesToMove.size(); ++i)
+ {
+ nodesToMove[i]->shiftPoints(difference);
+ nodesToMove[i]->remakePath();
+ }
+ graphicsScene->possiblyExpandSceneRectangle(&nodesToMove);
+
+ fixEdgePaths(&nodesToMove);
+}
+
+
+//This function remakes edge paths. If nodes is passed, it will remake the
+//edge paths for all of the nodes. If nodes isn't passed, then it will just
+//do it for this node.
+void GraphicsItemNode::fixEdgePaths(std::vector<GraphicsItemNode *> * nodes)
+{
+ std::set<DeBruijnEdge *> edgesToFix;
+
+ if (nodes == 0)
+ {
+ const std::vector<DeBruijnEdge *> * edges = m_deBruijnNode->getEdgesPointer();
+ for (size_t j = 0; j < edges->size(); ++j)
+ edgesToFix.insert((*edges)[j]);
+ }
+ else
+ {
+ for (size_t i = 0; i < nodes->size(); ++i)
+ {
+ DeBruijnNode * node = (*nodes)[i]->m_deBruijnNode;
+ const std::vector<DeBruijnEdge *> * edges = node->getEdgesPointer();
+ for (size_t j = 0; j < edges->size(); ++j)
+ edgesToFix.insert((*edges)[j]);
+ }
+ }
+
+ for (std::set<DeBruijnEdge *>::iterator i = edgesToFix.begin(); i != edgesToFix.end(); ++i)
+ {
+ DeBruijnEdge * deBruijnEdge = *i;
+ GraphicsItemEdge * graphicsItemEdge = deBruijnEdge->getGraphicsItemEdge();
+
+ //If this edge has a graphics item, adjust it now.
+ if (graphicsItemEdge != 0)
+ graphicsItemEdge->calculateAndSetPath();
+
+ //If this edge does not have a graphics item, then perhaps its
+ //reverse complment does. Only do this check if the graph was drawn
+ //on single mode.
+ else if (!g_settings->doubleMode)
+ {
+ graphicsItemEdge = deBruijnEdge->getReverseComplement()->getGraphicsItemEdge();
+ if (graphicsItemEdge != 0)
+ graphicsItemEdge->calculateAndSetPath();
+ }
+ }
+}
+
+
+void GraphicsItemNode::shiftPoints(QPointF difference)
+{
+ prepareGeometryChange();
+
+ if (g_settings->nodeDragging == NO_DRAGGING)
+ return;
+
+ else if (isSelected()) //Move all pieces for selected nodes
+ {
+ for (size_t i = 0; i < m_linePoints.size(); ++i)
+ m_linePoints[i] += difference;
+ }
+
+ else if (g_settings->nodeDragging == ONE_PIECE)
+ m_linePoints[m_grabIndex] += difference;
+
+ else if (g_settings->nodeDragging == NEARBY_PIECES)
+ {
+ for (size_t i = 0; i < m_linePoints.size(); ++i)
+ {
+ int indexDistance = abs(int(i) - int(m_grabIndex));
+ double dragStrength = pow(2.0, -1.0 * pow(double(indexDistance), 1.8) / g_settings->dragStrength); //constants chosen for dropoff of drag strength
+ m_linePoints[i] += difference * dragStrength;
+ }
+ }
+}
+
+void GraphicsItemNode::remakePath()
+{
+ QPainterPath path;
+
+ path.moveTo(m_linePoints[0]);
+ for (size_t i = 1; i < m_linePoints.size(); ++i)
+ path.lineTo(m_linePoints[i]);
+
+ m_path = path;
+}
+
+
+QPainterPath GraphicsItemNode::makePartialPath(double startFraction, double endFraction)
+{
+ if (endFraction < startFraction)
+ std::swap(startFraction, endFraction);
+
+ double totalLength = getNodePathLength();
+
+ QPainterPath path;
+ bool pathStarted = false;
+ double lengthSoFar = 0.0;
+ for (size_t i = 0; i < m_linePoints.size() - 1; ++i)
+ {
+ QPointF point1 = m_linePoints[i];
+ QPointF point2 = m_linePoints[i + 1];
+ QLineF line(point1, point2);
+
+ double point1Fraction = lengthSoFar / totalLength;
+ lengthSoFar += line.length();
+ double point2Fraction = lengthSoFar / totalLength;
+
+ //If the path hasn't yet begun and this segment is before
+ //the starting fraction, do nothing.
+ if (!pathStarted && point2Fraction < startFraction)
+ continue;
+
+ //If the path hasn't yet begun but this segment covers the starting
+ //fraction, start the path now.
+ if (!pathStarted && point2Fraction >= startFraction)
+ {
+ pathStarted = true;
+ path.moveTo(findIntermediatePoint(point1, point2, point1Fraction, point2Fraction, startFraction));
+ }
+
+ //If the path is in progress and this segment hasn't yet reached the end,
+ //just continue the path.
+ if (pathStarted && point2Fraction < endFraction)
+ path.lineTo(point2);
+
+ //If the path is in progress and this segment passes the end, finish the line.
+ if (pathStarted && point2Fraction >= endFraction)
+ {
+ path.lineTo(findIntermediatePoint(point1, point2, point1Fraction, point2Fraction, endFraction));
+ return path;
+ }
+ }
+
+ return path;
+}
+
+
+double GraphicsItemNode::getNodePathLength()
+{
+ double totalLength = 0.0;
+ for (size_t i = 0; i < m_linePoints.size() - 1; ++i)
+ {
+ QLineF line(m_linePoints[i], m_linePoints[i + 1]);
+ totalLength += line.length();
+ }
+ return totalLength;
+}
+
+
+//This function will find the point that is a certain fraction of the way along the node's path.
+QPointF GraphicsItemNode::findLocationOnPath(double fraction)
+{
+ double totalLength = getNodePathLength();
+
+ double lengthSoFar = 0.0;
+ for (size_t i = 0; i < m_linePoints.size() - 1; ++i)
+ {
+ QPointF point1 = m_linePoints[i];
+ QPointF point2 = m_linePoints[i + 1];
+ QLineF line(point1, point2);
+
+ double point1Fraction = lengthSoFar / totalLength;
+ lengthSoFar += line.length();
+ double point2Fraction = lengthSoFar / totalLength;
+
+ //If point2 hasn't yet reached the target, do nothing.
+ if (point2Fraction < fraction)
+ continue;
+
+ //If the path hasn't yet begun but this segment covers the starting
+ //fraction, start the path now.
+ if (point2Fraction >= fraction)
+ return findIntermediatePoint(point1, point2, point1Fraction, point2Fraction, fraction);
+ }
+
+ //The code shouldn't get here, as the target point should have been found in the above loop.
+ return QPointF();
+}
+
+QPointF GraphicsItemNode::findIntermediatePoint(QPointF p1, QPointF p2, double p1Value, double p2Value, double targetValue)
+{
+ QPointF difference = p2 - p1;
+ double fraction = (targetValue - p1Value) / (p2Value - p1Value);
+ return difference * fraction + p1;
+}
+
+double GraphicsItemNode::distance(QPointF p1, QPointF p2) const
+{
+ double xDiff = p1.x() - p2.x();
+ double yDiff = p1.y() - p2.y();
+ return sqrt(xDiff * xDiff + yDiff * yDiff);
+}
+
+
+bool GraphicsItemNode::usePositiveNodeColour()
+{
+ return !m_hasArrow || m_deBruijnNode->isPositiveNode();
+}
+
+
+
+
+//This function returns the nodes' visible centres. If the entire node is visible,
+//then there is just one visible centre. If none of the node is visible, then
+//there are no visible centres. If multiple parts of the node are visible, then there
+//are multiple visible centres.
+std::vector<QPointF> GraphicsItemNode::getCentres() const
+{
+ std::vector<QPointF> centres;
+ std::vector<QPointF> currentRun;
+
+ QPointF lastP;
+ bool lastPointVisible = false;
+
+ for (size_t i = 0; i < m_linePoints.size(); ++i)
+ {
+ QPointF p = m_linePoints[i];
+ bool pVisible = g_graphicsView->isPointVisible(p);
+
+ //If this point is visible, but the last wasn't, a new run is started.
+ if (pVisible && !lastPointVisible)
+ {
+ //If this is not the first point, then we need to find the intermediate
+ //point that lies on the visible boundary and start the path with that.
+ if (i > 0)
+ currentRun.push_back(g_graphicsView->findIntersectionWithViewportBoundary(QLineF(p, lastP)));
+ currentRun.push_back(p);
+ }
+
+ //If th last point is visible and this one is too, add it to the current run.
+ else if (pVisible && lastPointVisible)
+ currentRun.push_back(p);
+
+ //If the last point is visible and this one isn't, then a run has ended.
+ else if (!pVisible && lastPointVisible)
+ {
+ //We need to find the intermediate point that is on the visible boundary.
+ currentRun.push_back(g_graphicsView->findIntersectionWithViewportBoundary(QLineF(p, lastP)));
+
+ centres.push_back(getCentre(currentRun));
+ currentRun.clear();
+ }
+
+ //If neither this point nor the last were visible, we still need to check whether
+ //the line segment between them is. If so, then then this may be a case where
+ //we are really zoomed in (and so line segments are large compared to the scene rect).
+ else if (i > 0 && !pVisible && !lastPointVisible)
+ {
+ bool success;
+ QLineF v = g_graphicsView->findVisiblePartOfLine(QLineF(lastP, p), &success);
+ if (success)
+ {
+ QPointF vCentre = QPointF((v.p1().x() + v.p2().x()) / 2.0, (v.p1().y() + v.p2().y()) / 2.0);
+ centres.push_back(vCentre);
+ }
+ }
+
+ lastPointVisible = pVisible;
+ lastP = p;
+ }
+
+ //If there is a current run, add its centre
+ if (currentRun.size() > 0)
+ centres.push_back(getCentre(currentRun));
+
+ return centres;
+}
+
+
+
+//This function finds the centre point on the path defined by linePoints.
+QPointF GraphicsItemNode::getCentre(std::vector<QPointF> linePoints) const
+{
+ if (linePoints.size() == 0)
+ return QPointF();
+ if (linePoints.size() == 1)
+ return linePoints[0];
+
+ double pathLength = 0.0;
+ for (size_t i = 0; i < linePoints.size() - 1; ++i)
+ pathLength += distance(linePoints[i], linePoints[i+1]);
+
+ double endToCentre = pathLength / 2.0;
+
+ double lengthSoFar = 0.0;
+ for (size_t i = 0; i < linePoints.size() - 1; ++i)
+ {
+ QPointF a = linePoints[i];
+ QPointF b = linePoints[i+1];
+ double segmentLength = distance(a, b);
+
+ //If this segment will push the distance over halfway, then it
+ //contains the centre point.
+ if (lengthSoFar + segmentLength >= endToCentre)
+ {
+ double additionalLengthNeeded = endToCentre - lengthSoFar;
+ double fractionOfCurrentSegment = additionalLengthNeeded / segmentLength;
+ return (b - a) * fractionOfCurrentSegment + a;
+ }
+
+ lengthSoFar += segmentLength;
+ }
+
+ //Code should never get here.
+ return QPointF();
+}
+
+QStringList GraphicsItemNode::getNodeText()
+{
+ QStringList nodeText;
+
+ if (g_settings->displayNodeCustomLabels)
+ nodeText << m_deBruijnNode->getCustomLabelForDisplay();
+ if (g_settings->displayNodeNames)
+ {
+ QString nodeName = m_deBruijnNode->getName();
+ if (!g_settings->doubleMode)
+ nodeName.chop(1);
+ nodeText << nodeName;
+ }
+ if (g_settings->displayNodeLengths)
+ nodeText << formatIntForDisplay(m_deBruijnNode->getLength()) + " bp";
+ if (g_settings->displayNodeDepth)
+ nodeText << formatDepthForDisplay(m_deBruijnNode->getDepth());
+ if (g_settings->displayNodeCsvData && m_deBruijnNode->hasCsvData())
+ nodeText << m_deBruijnNode->getCsvLine(g_settings->displayNodeCsvDataCol);
+
+ return nodeText;
+}
+
+
+QSize GraphicsItemNode::getNodeTextSize(QString text)
+{
+ QFontMetrics fontMetrics(g_settings->labelFont);
+ return fontMetrics.size(0, text);
+}
+
+
+QColor GraphicsItemNode::getDepthColour()
+{
+ double depth = m_deBruijnNode->getDepth();
+ double lowValue;
+ double highValue;
+ if (g_settings->autoDepthValue)
+ {
+ lowValue = g_assemblyGraph->m_firstQuartileDepth;
+ highValue = g_assemblyGraph->m_thirdQuartileDepth;
+ }
+ else
+ {
+ lowValue = g_settings->lowDepthValue;
+ highValue = g_settings->highDepthValue;
+ }
+
+ if (depth <= lowValue)
+ return g_settings->lowDepthColour;
+ if (depth >= highValue)
+ return g_settings->highDepthColour;
+
+ double fraction = (depth - lowValue) / (highValue - lowValue);
+
+ int redDifference = g_settings->highDepthColour.red() - g_settings->lowDepthColour.red();
+ int greenDifference = g_settings->highDepthColour.green() - g_settings->lowDepthColour.green();
+ int blueDifference = g_settings->highDepthColour.blue() - g_settings->lowDepthColour.blue();
+ int alphaDifference = g_settings->highDepthColour.alpha() - g_settings->lowDepthColour.alpha();
+
+ int red = int(g_settings->lowDepthColour.red() + (fraction * redDifference) + 0.5);
+ int green = int(g_settings->lowDepthColour.green() + (fraction * greenDifference) + 0.5);
+ int blue = int(g_settings->lowDepthColour.blue() + (fraction * blueDifference) + 0.5);
+ int alpha = int(g_settings->lowDepthColour.alpha() + (fraction * alphaDifference) + 0.5);
+
+ return QColor(red, green, blue, alpha);
+}
+
+
+
+void GraphicsItemNode::setWidth()
+{
+ m_width = getNodeWidth(m_deBruijnNode->getDepthRelativeToMeanDrawnDepth(), g_settings->depthPower,
+ g_settings->depthEffectOnWidth, g_settings->averageNodeWidth);
+ if (m_width < 0.0)
+ m_width = 0.0;
+}
+
+
+
+//The bounding rectangle of a node has to be a little bit bigger than
+//the node's path, because of the outline. The selection outline is
+//the largest outline we can expect, so use that to define the bounding
+//rectangle.
+QRectF GraphicsItemNode::boundingRect() const
+{
+ double extraSize = g_settings->selectionThickness / 2.0;
+ QRectF bound = shape().boundingRect();
+
+ bound.setTop(bound.top() - extraSize);
+ bound.setBottom(bound.bottom() + extraSize);
+ bound.setLeft(bound.left() - extraSize);
+ bound.setRight(bound.right() + extraSize);
+
+ return bound;
+}
+
+
+double GraphicsItemNode::getNodeWidth(double depthRelativeToMeanDrawnDepth, double depthPower,
+ double depthEffectOnWidth, double averageNodeWidth)
+{
+ if (depthRelativeToMeanDrawnDepth < 0.0)
+ depthRelativeToMeanDrawnDepth = 0.0;
+ double widthRelativeToAverage = (pow(depthRelativeToMeanDrawnDepth, depthPower) - 1.0) * depthEffectOnWidth + 1.0;
+ return averageNodeWidth * widthRelativeToAverage;
+}
+
+
+
+//This function shifts all the node's points to the left (relative to its
+//direction). This is used in double mode to prevent nodes from displaying
+//directly on top of their complement nodes.
+void GraphicsItemNode::shiftPointsLeft()
+{
+ shiftPointSideways(true);
+}
+
+void GraphicsItemNode::shiftPointsRight()
+{
+ shiftPointSideways(false);
+}
+
+void GraphicsItemNode::shiftPointSideways(bool left)
+{
+ prepareGeometryChange();
+
+ //The collection of line points should be at least
+ //two large. But just to be safe, quit now if it
+ //is not.
+ size_t linePointsSize = m_linePoints.size();
+ if (linePointsSize < 2)
+ return;
+
+ //Shift by a quarter of the segment length. This should make
+ //nodes one half segment length separated from their complements.
+ double shiftDistance = g_settings->doubleModeNodeSeparation;
+
+ for (size_t i = 0; i < linePointsSize; ++i)
+ {
+ QPointF point = m_linePoints[i];
+ QLineF nodeDirection;
+
+ //If the point is on the end, then determine the node direction
+ //using this point and its adjacent point.
+ if (i == 0)
+ {
+ QPointF nextPoint = m_linePoints[i+1];
+ nodeDirection = QLineF(point, nextPoint);
+ }
+ else if (i == linePointsSize - 1)
+ {
+ QPointF previousPoint = m_linePoints[i-1];
+ nodeDirection = QLineF(previousPoint, point);
+ }
+
+ // If the point is in the middle, then determine the node direction
+ //using both adjacent points.
+ else
+ {
+ QPointF previousPoint = m_linePoints[i-1];
+ QPointF nextPoint = m_linePoints[i+1];
+ nodeDirection = QLineF(previousPoint, nextPoint);
+ }
+
+ QLineF shiftLine = nodeDirection.normalVector().unitVector();
+ shiftLine.setLength(shiftDistance);
+
+ QPointF shiftVector;
+ if (left)
+ shiftVector = shiftLine.p2() - shiftLine.p1();
+ else
+ shiftVector = shiftLine.p1() - shiftLine.p2();
+ QPointF newPoint = point + shiftVector;
+ m_linePoints[i] = newPoint;
+ }
+
+ remakePath();
+}
+
+
+void GraphicsItemNode::getBlastHitsTextAndLocationThisNode(std::vector<QString> * blastHitText,
+ std::vector<QPointF> * blastHitLocation)
+{
+ const std::vector<BlastHit *> * blastHits = m_deBruijnNode->getBlastHitsPointer();
+ for (size_t i = 0; i < blastHits->size(); ++i)
+ {
+ BlastHit * hit = (*blastHits)[i];
+ blastHitText->push_back(hit->m_query->getName());
+ blastHitLocation->push_back(findLocationOnPath(hit->getNodeCentreFraction()));
+ }
+}
+
+void GraphicsItemNode::getBlastHitsTextAndLocationThisNodeOrReverseComplement(std::vector<QString> * blastHitText,
+ std::vector<QPointF> * blastHitLocation)
+{
+ getBlastHitsTextAndLocationThisNode(blastHitText, blastHitLocation);
+
+ const std::vector<BlastHit *> * blastHits = m_deBruijnNode->getReverseComplement()->getBlastHitsPointer();
+ for (size_t i = 0; i < blastHits->size(); ++i)
+ {
+ BlastHit * hit = (*blastHits)[i];
+ blastHitText->push_back(hit->m_query->getName());
+ blastHitLocation->push_back(findLocationOnPath(1.0 - hit->getNodeCentreFraction()));
+ }
+}
+
+
+
+
+//This function outlines and shades the appropriate part of a node if it is
+//in the user-specified path.
+void GraphicsItemNode::exactPathHighlightNode(QPainter * painter)
+{
+ if (g_memory->userSpecifiedPath.containsNode(m_deBruijnNode))
+ pathHighlightNode2(painter, m_deBruijnNode, false, &g_memory->userSpecifiedPath);
+
+ if (!g_settings->doubleMode &&
+ g_memory->userSpecifiedPath.containsNode(m_deBruijnNode->getReverseComplement()))
+ pathHighlightNode2(painter, m_deBruijnNode->getReverseComplement(), true, &g_memory->userSpecifiedPath);
+}
+
+
+
+//This function outlines and shades the appropriate part of a node if it is
+//in the user-specified path.
+void GraphicsItemNode::queryPathHighlightNode(QPainter * painter)
+{
+ if (g_memory->queryPaths.size() == 0)
+ return;
+
+ for (int i = 0; i < g_memory->queryPaths.size(); ++i)
+ {
+ Path * path = &(g_memory->queryPaths[i]);
+ if (path->containsNode(m_deBruijnNode))
+ pathHighlightNode2(painter, m_deBruijnNode, false, path);
+
+ if (!g_settings->doubleMode &&
+ path->containsNode(m_deBruijnNode->getReverseComplement()))
+ pathHighlightNode2(painter, m_deBruijnNode->getReverseComplement(), true, path);
+ }
+}
+
+
+
+void GraphicsItemNode::pathHighlightNode2(QPainter * painter,
+ DeBruijnNode * node,
+ bool reverse,
+ Path * path)
+{
+ int numberOfTimesInMiddle = path->numberOfOccurrencesInMiddleOfPath(node);
+ for (int i = 0; i < numberOfTimesInMiddle; ++i)
+ pathHighlightNode3(painter, shape());
+
+ bool isStartingNode = path->isStartingNode(node);
+ bool isEndingNode = path->isEndingNode(node);
+
+ //If this is the only node in the path, then we limit the highlighting to the appropriate region.
+ if (isStartingNode && isEndingNode && path->getNodeCount() == 1)
+ {
+ pathHighlightNode3(painter, buildPartialHighlightPath(path->getStartFraction(), path->getEndFraction(), reverse));
+ return;
+ }
+
+ if (isStartingNode)
+ pathHighlightNode3(painter, buildPartialHighlightPath(path->getStartFraction(), 1.0, reverse));
+
+ if (isEndingNode)
+ pathHighlightNode3(painter, buildPartialHighlightPath(0.0, path->getEndFraction(), reverse));
+}
+
+
+void GraphicsItemNode::pathHighlightNode3(QPainter * painter,
+ QPainterPath highlightPath)
+{
+ QBrush shadingBrush(g_settings->pathHighlightShadingColour);
+ painter->fillPath(highlightPath, shadingBrush);
+
+ highlightPath = highlightPath.simplified();
+ QPen outlinePen(QBrush(g_settings->pathHighlightOutlineColour),
+ g_settings->selectionThickness, Qt::SolidLine,
+ Qt::SquareCap, Qt::RoundJoin);
+ painter->setPen(outlinePen);
+ painter->drawPath(highlightPath);
+}
+
+
+
+QPainterPath GraphicsItemNode::buildPartialHighlightPath(double startFraction,
+ double endFraction,
+ bool reverse)
+{
+ if (reverse)
+ {
+ startFraction = 1.0 - startFraction;
+ endFraction = 1.0 - endFraction;
+ std::swap(startFraction, endFraction);
+ }
+
+ QPainterPath partialPath = makePartialPath(startFraction,
+ endFraction);
+
+ QPainterPathStroker stroker;
+
+ //If the node has an arrow, we need a path intersection with the
+ //shape to make sure the arrowhead is part of the path. Adding a bit
+ //to the width seems to help with the intersection.
+ if (m_hasArrow)
+ stroker.setWidth(m_width + 0.1);
+ else
+ stroker.setWidth(m_width);
+
+ stroker.setCapStyle(Qt::FlatCap);
+ stroker.setJoinStyle(Qt::RoundJoin);
+ QPainterPath highlightPath = stroker.createStroke(partialPath);
+
+ if (m_hasArrow)
+ highlightPath = highlightPath.intersected(shape());
+
+ return highlightPath;
+}
+
+
+bool GraphicsItemNode::anyNodeDisplayText()
+{
+ return g_settings->displayNodeCustomLabels ||
+ g_settings->displayNodeNames ||
+ g_settings->displayNodeLengths ||
+ g_settings->displayNodeDepth ||
+ g_settings->displayNodeCsvData;
+}
diff --git a/graph/graphicsitemnode.h b/graph/graphicsitemnode.h
new file mode 100644
index 0000000..f4d355f
--- /dev/null
+++ b/graph/graphicsitemnode.h
@@ -0,0 +1,105 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef GRAPHICSITEMNODE_H
+#define GRAPHICSITEMNODE_H
+
+#include <QGraphicsItem>
+#include <QGraphicsSceneMouseEvent>
+#include "../ogdf/basic/GraphAttributes.h"
+#include <vector>
+#include <QPointF>
+#include <QColor>
+#include <QFont>
+#include <QString>
+#include <QPainterPath>
+#include <QStringList>
+
+class DeBruijnNode;
+class Path;
+
+class GraphicsItemNode : public QGraphicsItem
+{
+public:
+ GraphicsItemNode(DeBruijnNode * deBruijnNode,
+ ogdf::GraphAttributes * graphAttributes,
+ QGraphicsItem * parent = 0);
+ GraphicsItemNode(DeBruijnNode * deBruijnNode,
+ GraphicsItemNode * toCopy,
+ QGraphicsItem * parent = 0);
+ GraphicsItemNode(DeBruijnNode * deBruijnNode,
+ std::vector<QPointF> linePoints,
+ QGraphicsItem * parent = 0);
+
+ DeBruijnNode * m_deBruijnNode;
+ double m_width;
+ bool m_hasArrow;
+ std::vector<QPointF> m_linePoints;
+ size_t m_grabIndex;
+ QColor m_colour;
+ QPainterPath m_path;
+
+ void mousePressEvent(QGraphicsSceneMouseEvent * event);
+ void mouseMoveEvent(QGraphicsSceneMouseEvent * event);
+ void paint(QPainter * painter, const QStyleOptionGraphicsItem *, QWidget *);
+ QPainterPath shape() const;
+ void shiftPoints(QPointF difference);
+ void remakePath();
+ double distance(QPointF p1, QPointF p2) const;
+ bool usePositiveNodeColour();
+ QPointF getFirst() const {return m_linePoints[0];}
+ QPointF getSecond() const {return m_linePoints[1];}
+ QPointF getLast() const {return m_linePoints[m_linePoints.size()-1];}
+ QPointF getSecondLast() const {return m_linePoints[m_linePoints.size()-2];}
+ std::vector<QPointF> getCentres() const;
+ QPointF getCentre(std::vector<QPointF> linePoints) const;
+ void setNodeColour();
+ QStringList getNodeText();
+ QSize getNodeTextSize(QString text);
+ QColor getDepthColour();
+ void setWidth();
+ QPainterPath makePartialPath(double startFraction, double endFraction);
+ double getNodePathLength();
+ QPointF findLocationOnPath(double fraction);
+ QPointF findIntermediatePoint(QPointF p1, QPointF p2, double p1Value,
+ double p2Value, double targetValue);
+ QRectF boundingRect() const;
+ static double getNodeWidth(double depthRelativeToMeanDrawnDepth,
+ double depthPower,
+ double depthEffectOnWidth,
+ double averageNodeWidth);
+ void shiftPointsLeft();
+ void shiftPointsRight();
+ void getBlastHitsTextAndLocationThisNode(std::vector<QString> * blastHitText,
+ std::vector<QPointF> * blastHitLocation);
+ void getBlastHitsTextAndLocationThisNodeOrReverseComplement(std::vector<QString> * blastHitText,
+ std::vector<QPointF> * blastHitLocation);
+ void drawTextPathAtLocation(QPainter *painter, QPainterPath textPath, QPointF centre);
+ void fixEdgePaths(std::vector<GraphicsItemNode *> * nodes = 0);
+
+private:
+ void exactPathHighlightNode(QPainter * painter);
+ void queryPathHighlightNode(QPainter * painter);
+ void pathHighlightNode2(QPainter * painter, DeBruijnNode * node, bool reverse, Path * path);
+ void pathHighlightNode3(QPainter * painter, QPainterPath highlightPath);
+ QPainterPath buildPartialHighlightPath(double startFraction, double endFraction, bool reverse);
+ bool anyNodeDisplayText();
+ void shiftPointSideways(bool left);
+};
+
+#endif // GRAPHICSITEMNODE_H
diff --git a/graph/graphlocation.cpp b/graph/graphlocation.cpp
new file mode 100644
index 0000000..eb83f31
--- /dev/null
+++ b/graph/graphlocation.cpp
@@ -0,0 +1,205 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage.
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "graphlocation.h"
+
+#include "debruijnnode.h"
+#include "assemblygraph.h"
+#include "../program/globals.h"
+
+
+
+GraphLocation::GraphLocation() :
+ m_node(0), m_position(0)
+{
+
+}
+
+GraphLocation::GraphLocation(DeBruijnNode * node, int position) :
+ m_node(node), m_position(position)
+{
+}
+
+
+GraphLocation GraphLocation::startOfNode(DeBruijnNode * node)
+{
+ GraphLocation location(node, 1);
+ if (location.isValid())
+ return location;
+ else
+ return GraphLocation::null();
+}
+
+
+GraphLocation GraphLocation::endOfNode(DeBruijnNode * node)
+{
+ if (node == 0)
+ return GraphLocation::null();
+
+ int pos = node->getLength();
+ GraphLocation location(node, pos);
+ if (location.isValid())
+ return location;
+ else
+ return GraphLocation::null();
+}
+
+
+GraphLocation GraphLocation::null()
+{
+ return GraphLocation(0, 0);
+}
+
+bool GraphLocation::isValid() const
+{
+ if (isNull())
+ return false;
+ if (m_position < 1)
+ return false;
+ return m_position <= m_node->getLength();
+}
+
+
+bool GraphLocation::isNull() const
+{
+ return (m_node == 0 || m_position == 0);
+}
+
+
+GraphLocation GraphLocation::reverseComplementLocation() const
+{
+ int newPos = m_node->getLength() - m_position + 1;
+ GraphLocation newLocation(m_node->getReverseComplement(), newPos);
+
+ //For Velvet graphs, the reverse complement location is shifted by the k-mer
+ //size and may not even be on the same node!
+ if (g_assemblyGraph->m_graphFileType == LAST_GRAPH)
+ newLocation.moveLocation(-g_assemblyGraph->m_kmer + 1);
+
+ if (newLocation.isValid())
+ return newLocation;
+ else
+ return GraphLocation::null();
+}
+
+
+
+void GraphLocation::moveLocation(int change)
+{
+ if (change > 0)
+ moveForward(change);
+ else if (change < 0)
+ moveBackward(-change);
+}
+
+
+void GraphLocation::moveForward(int change)
+{
+ //See if there are enough bases left in this node to move by the
+ //required amount. If so, we're done!
+ int basesLeftInNode = m_node->getLength() - m_position;
+ if (change <= basesLeftInNode)
+ {
+ m_position += change;
+ return;
+ }
+
+ //If there aren't enough bases left, then we recursively try with the
+ //next nodes.
+ std::vector<DeBruijnNode *> downstreamNodes = m_node->getDownstreamNodes();
+ for (size_t i = 0; i < downstreamNodes.size(); ++i)
+ {
+ DeBruijnNode * node = downstreamNodes[i];
+ GraphLocation nextNodeLocation = GraphLocation::startOfNode(node);
+ nextNodeLocation.moveForward(change - basesLeftInNode - 1);
+
+ if (nextNodeLocation.isValid())
+ {
+ m_node = nextNodeLocation.getNode();
+ m_position = nextNodeLocation.getPosition();
+ return;
+ }
+ }
+
+ //If the code got here, then we failed to move and we make this a null
+ //position.
+ m_node = 0;
+ m_position = 0;
+ return;
+}
+
+void GraphLocation::moveBackward(int change)
+{
+ //See if there are enough bases left in this node to move by the
+ //required amount. If so, we're done!
+ int basesLeftInNode = m_position - 1;
+ if (change <= basesLeftInNode)
+ {
+ m_position -= change;
+ return;
+ }
+
+ //If there aren't enough bases left, then we recursively try with the
+ //next nodes.
+ std::vector<DeBruijnNode *> upstreamNodes = m_node->getUpstreamNodes();
+ for (size_t i = 0; i < upstreamNodes.size(); ++i)
+ {
+ DeBruijnNode * node = upstreamNodes[i];
+ GraphLocation nextNodeLocation = GraphLocation::endOfNode(node);
+ nextNodeLocation.moveBackward(change - basesLeftInNode - 1);
+
+ if (nextNodeLocation.isValid())
+ {
+ m_node = nextNodeLocation.getNode();
+ m_position = nextNodeLocation.getPosition();
+ return;
+ }
+ }
+
+ //If the code got here, then we failed to move and we make this a null
+ //position.
+ m_node = 0;
+ m_position = 0;
+ return;
+}
+
+
+char GraphLocation::getBase() const
+{
+ if (!isValid())
+ return '\0';
+ else
+ return m_node->getBaseAt(m_position - 1);
+}
+
+
+
+bool GraphLocation::isAtStartOfNode() const
+{
+ return (isValid() && m_position == 1);
+}
+
+bool GraphLocation::isAtEndOfNode() const
+{
+ return (isValid() && m_position == m_node->getLength());
+}
+
+bool GraphLocation::operator==(GraphLocation const &other) const
+{
+ return (m_node == other.m_node && m_position == other.m_position);
+}
diff --git a/graph/graphlocation.h b/graph/graphlocation.h
new file mode 100644
index 0000000..9254f66
--- /dev/null
+++ b/graph/graphlocation.h
@@ -0,0 +1,57 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage.
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef GRAPHLOCATION_H
+#define GRAPHLOCATION_H
+
+
+class DeBruijnNode;
+
+class GraphLocation
+{
+public:
+ //CREATORS
+ GraphLocation();
+ GraphLocation(DeBruijnNode * node, int position);
+ static GraphLocation startOfNode(DeBruijnNode * node);
+ static GraphLocation endOfNode(DeBruijnNode * node);
+ static GraphLocation null();
+
+ //ACCESSORS
+ DeBruijnNode * getNode() const {return m_node;}
+ int getPosition() const {return m_position;}
+ bool isValid() const;
+ bool isNull() const;
+ GraphLocation reverseComplementLocation() const;
+ char getBase() const;
+ bool isAtStartOfNode() const;
+ bool isAtEndOfNode() const;
+ bool operator==(GraphLocation const &other) const;
+
+ //MODIFERS
+ void moveLocation(int change);
+
+
+private:
+ DeBruijnNode * m_node;
+ int m_position;
+ void moveForward(int change);
+ void moveBackward(int change);
+};
+
+#endif // GRAPHLOCATION_H
diff --git a/graph/ogdfnode.h b/graph/ogdfnode.h
new file mode 100644
index 0000000..acb4b22
--- /dev/null
+++ b/graph/ogdfnode.h
@@ -0,0 +1,42 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef OGDFNODE_H
+#define OGDFNODE_H
+
+#include <vector>
+#include "../ogdf/basic/Graph.h"
+#include <QPainterPath>
+#include "../ogdf/basic/GraphAttributes.h"
+#include <QPointF>
+
+class OgdfNode
+{
+public:
+ OgdfNode() {}
+
+ std::vector<ogdf::node> m_ogdfNodes;
+
+ void addOgdfNode(ogdf::node newNode) {m_ogdfNodes.push_back(newNode);}
+ ogdf::node getFirst() {if (m_ogdfNodes.size() == 0) return 0; else return m_ogdfNodes[0];}
+ ogdf::node getSecond() {if (m_ogdfNodes.size() < 2) return 0; else return m_ogdfNodes[1];}
+ ogdf::node getLast() {if (m_ogdfNodes.size() == 0) return 0; else return m_ogdfNodes[m_ogdfNodes.size()-1];}
+ ogdf::node getSecondLast() {if (m_ogdfNodes.size() < 2) return 0; else return m_ogdfNodes[m_ogdfNodes.size()-2];}
+};
+
+#endif // OGDFNODE_H
diff --git a/graph/path.cpp b/graph/path.cpp
new file mode 100644
index 0000000..2b859f8
--- /dev/null
+++ b/graph/path.cpp
@@ -0,0 +1,929 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "path.h"
+#include "debruijnnode.h"
+#include "debruijnedge.h"
+#include "../blast/blasthit.h"
+#include "../blast/blastquery.h"
+#include <QRegularExpression>
+#include "assemblygraph.h"
+#include <QStringList>
+#include <QApplication>
+#include <limits>
+
+
+
+//These will try to produce a path using the given nodes.
+//They will only succeed if the nodes produce one and only one path.
+//If they are disconnected, branching or ambiguous, they will fail
+//and only contruct an empty Path.
+Path Path::makeFromUnorderedNodes(QList<DeBruijnNode *> nodes,
+ bool strandSpecific)
+{
+ Path path;
+ path.buildUnambiguousPathFromNodes(nodes, strandSpecific);
+ return path;
+}
+
+Path Path::makeFromUnorderedNodes(std::vector<DeBruijnNode *> nodes,
+ bool strandSpecific)
+{
+ QList<DeBruijnNode *> nodesList;
+ for (size_t i = 0; i < nodes.size(); ++i)
+ nodesList.push_back(nodes[i]);
+
+ Path path;
+ path.buildUnambiguousPathFromNodes(nodesList, strandSpecific);
+ return path;
+}
+
+
+//This will build a Path from an ordered list of nodes. If the nodes
+//form a valid path (i.e. there is an edge connecting each step along
+//the way), a Path is made, otherwise just an empty Path is made.
+//This function needs exact, strand-specific nodes. If circular is
+//given, then it will also look for an edge connecting the last node
+//to the first.
+Path Path::makeFromOrderedNodes(QList<DeBruijnNode *> nodes, bool circular)
+{
+ Path path;
+
+ path.m_nodes = nodes;
+
+ int targetNumberOfEdges = path.m_nodes.size() - 1;
+ if (circular)
+ ++targetNumberOfEdges;
+
+ for (int i = 0; i < targetNumberOfEdges; ++i)
+ {
+ int firstNodeIndex = i;
+ int secondNodeIndex = i + 1;
+ if (secondNodeIndex >= path.m_nodes.size())
+ secondNodeIndex = 0;
+
+ DeBruijnNode * node1 = path.m_nodes[firstNodeIndex];
+ DeBruijnNode * node2 = path.m_nodes[secondNodeIndex];
+
+ bool foundEdge = false;
+ const std::vector<DeBruijnEdge *> * edges = node1->getEdgesPointer();
+ for (size_t j = 0; j < edges->size(); ++j)
+ {
+ DeBruijnEdge * edge = (*edges)[j];
+ if (edge->getStartingNode() == node1 && edge->getEndingNode() == node2)
+ {
+ path.m_edges.push_back(edge);
+ foundEdge = true;
+ break;
+ }
+ }
+
+ //If we failed to find an edge connecting the nodes, then
+ //the path failed.
+ if (!foundEdge)
+ {
+ path.m_nodes.clear();
+ path.m_edges.clear();
+ return path;
+ }
+ }
+
+ if (path.m_nodes.empty())
+ return path;
+
+ //If the code got here, then the path building was successful.
+ path.m_startLocation = GraphLocation::startOfNode(path.m_nodes.front());
+ path.m_endLocation = GraphLocation::endOfNode(path.m_nodes.back());
+
+ return path;
+}
+
+
+
+Path Path::makeFromString(QString pathString, bool circular,
+ QString * pathStringFailure)
+{
+ Path path;
+
+ QRegularExpression re("^(?:\\(([0-9]+)\\) ?)*((?:[^,]+[-\\+], ?)*[^,]+[-\\+])(?: ?\\(([0-9]+)\\))*$");
+ QRegularExpressionMatch match = re.match(pathString);
+
+ //If the string failed to match the regex, return an empty path.
+ if (!match.hasMatch())
+ {
+ *pathStringFailure = "the text is not formatted correctly";
+ return path;
+ }
+
+ QString startPosString = match.captured(1);
+ QString nodeListString = match.captured(2);
+ QString endPosString = match.captured(3);
+
+ //Circular paths cannot have start and end positions.
+ if (circular && (startPosString != "" || endPosString != ""))
+ {
+ *pathStringFailure = "circular paths cannot contain start or end positions";
+ return path;
+ }
+
+ //Make sure there is at least one proposed node name listed.
+ QStringList nodeNameList = nodeListString.simplified().split(",", QString::SkipEmptyParts);
+ if (nodeNameList.empty())
+ {
+ *pathStringFailure = "the text is not formatted correctly";
+ return path;
+ }
+
+ //Find which node names are and are not actually in the graph.
+ QList<DeBruijnNode *> nodesInGraph;
+ QStringList nodesNotInGraph;
+ for (int i = 0; i < nodeNameList.size(); ++i)
+ {
+ QString nodeName = nodeNameList[i].simplified();
+ if (g_assemblyGraph->m_deBruijnGraphNodes.contains(nodeName))
+ nodesInGraph.push_back(g_assemblyGraph->m_deBruijnGraphNodes[nodeName]);
+ else
+ nodesNotInGraph.push_back(nodeName);
+ }
+
+ //If the path contains nodes not in the graph, we fail.
+ if (nodesNotInGraph.size() > 0)
+ {
+ *pathStringFailure = "the following nodes are not in the graph: ";
+ for (int i = 0; i < nodesNotInGraph.size(); ++i)
+ {
+ *pathStringFailure += nodesNotInGraph[i];
+ if (i != nodesNotInGraph.size() - 1)
+ *pathStringFailure += ", ";
+ }
+ return path;
+ }
+
+ //If the code got here, then the list at least consists of valid nodes.
+ //We now use it to create a Path object.
+ path = Path::makeFromOrderedNodes(nodesInGraph, circular);
+
+ //If the path is empty, then we don't have to worry about start/end
+ //positions and we just return it.
+ if (path.isEmpty())
+ {
+ if (circular)
+ *pathStringFailure = "the nodes do not form a circular path";
+ else
+ *pathStringFailure = "the nodes do not form a path";
+ return path;
+ }
+
+ //If the code got here, then a path was made, and now we must check whether
+ //the start/end points are valid.
+ DeBruijnNode * firstNode = path.m_nodes.front();
+ DeBruijnNode * lastNode = path.m_nodes.back();
+
+ if (startPosString.length() > 0)
+ {
+ int startPos = startPosString.toInt();
+ if (startPos < 1 || startPos > firstNode->getLength())
+ {
+ *pathStringFailure = "starting node position not valid";
+ return Path();
+ }
+
+ path.m_startLocation = GraphLocation(firstNode, startPos);
+ }
+ else
+ path.m_startLocation = GraphLocation::startOfNode(firstNode);
+
+
+ if (endPosString.length() > 0)
+ {
+ int endPos = endPosString.toInt();
+ if (endPos < 1 || endPos > lastNode->getLength())
+ {
+ *pathStringFailure = "ending node position not valid";
+ return Path();
+ }
+
+ path.m_endLocation = GraphLocation(lastNode, endPos);
+ }
+ else
+ path.m_endLocation = GraphLocation::endOfNode(lastNode);
+
+ return path;
+}
+
+
+
+void Path::buildUnambiguousPathFromNodes(QList<DeBruijnNode *> nodes,
+ bool strandSpecific)
+{
+ if (nodes.isEmpty())
+ return;
+
+ //Loop through the nodes, trying to add them to the Path. If a node can't
+ //be added, then we fail and make an empty Path. If one can be added, we
+ //quit the loop and try again with the remaining nodes.
+ while (nodes.size() > 0)
+ {
+ bool addSuccess = false;
+ for (int i = 0; i < nodes.size(); ++i)
+ {
+ addSuccess = addNode(nodes.at(i), strandSpecific, true);
+ if (addSuccess)
+ {
+ nodes.removeAt(i);
+ break;
+ }
+ }
+
+ if (!addSuccess)
+ {
+ m_nodes.clear();
+ m_edges.clear();
+ return;
+ }
+ }
+
+ //If the nodes in the path contain other edges which connect them to each
+ //other, then the path is ambiguous and we fail.
+ if (checkForOtherEdges())
+ {
+ m_nodes.clear();
+ m_edges.clear();
+ return;
+ }
+
+ if (m_nodes.empty())
+ return;
+
+ //If the code got here, then the path building was successful.
+ m_startLocation = GraphLocation::startOfNode(m_nodes.front());
+ m_endLocation = GraphLocation::endOfNode(m_nodes.back());
+}
+
+
+//This function will try to add a node to the path on either end.
+//It will only succeed (and return true) if there is a single way
+//to add the node on one of the path's ends.
+//It can, however, add a node that connects the end to both ends,
+//making a circular Path.
+bool Path::addNode(DeBruijnNode * newNode, bool strandSpecific, bool makeCircularIfPossible)
+{
+ //If the Path is empty, then this function always succeeds.
+ if (m_nodes.isEmpty())
+ {
+ m_nodes.push_back(newNode);
+ m_startLocation = GraphLocation::startOfNode(newNode);
+ m_endLocation = GraphLocation::endOfNode(newNode);
+
+ if (makeCircularIfPossible)
+ {
+ //If there is an edge connecting the node to itself, then add that
+ //too to make a circular path.
+ DeBruijnEdge * selfLoopingEdge = newNode->getSelfLoopingEdge();
+ if (selfLoopingEdge != 0)
+ m_edges.push_back(selfLoopingEdge);
+ }
+
+ return true;
+ }
+
+ //If the Path is circular, then this function fails, as there
+ //is no way to add a node to a circular path without making
+ //it ambiguous.
+ if (isCircular())
+ return false;
+
+ //Check to see if the node can be added anywhere in the middle
+ //of the Path. If so, this function fails.
+ for (int i = 1; i < m_nodes.size() - 1; ++i)
+ {
+ DeBruijnNode * middleNode = m_nodes.at(i);
+ if (middleNode->isNodeConnected(newNode))
+ return false;
+ }
+
+ DeBruijnNode * firstNode = m_nodes.front();
+ DeBruijnNode * lastNode = m_nodes.back();
+
+ DeBruijnEdge * edgeIntoFirst = firstNode->doesNodeLeadIn(newNode);
+ DeBruijnEdge * edgeAwayFromLast = lastNode->doesNodeLeadAway(newNode);
+
+ //If not strand-specific, then we also check to see if the reverse
+ //complement of the new node can be added.
+ DeBruijnEdge * revCompEdgeIntoFirst = 0;
+ DeBruijnEdge * revCompEdgeAwayFromLast = 0;
+ if (!strandSpecific)
+ {
+ revCompEdgeIntoFirst = firstNode->doesNodeLeadIn(newNode->getReverseComplement());
+ revCompEdgeAwayFromLast = lastNode->doesNodeLeadAway(newNode->getReverseComplement());
+ }
+
+ //To be successful, either:
+ // 1) exactly one of the four edge pointers should be non-null. This
+ // indicates the node extends a linear path.
+ // 2) there is both an edge away from the last and an edge into the first.
+ // This indicates that the node completes a circular Path.
+ if (edgeIntoFirst == 0 && edgeAwayFromLast == 0 &&
+ revCompEdgeIntoFirst == 0 && revCompEdgeAwayFromLast == 0)
+ return false;
+
+ if (edgeIntoFirst != 0 && edgeAwayFromLast == 0 &&
+ revCompEdgeIntoFirst == 0 && revCompEdgeAwayFromLast == 0)
+ {
+ m_nodes.push_front(newNode);
+ m_startLocation = GraphLocation::startOfNode(newNode);
+ m_edges.push_front(edgeIntoFirst);
+ return true;
+ }
+
+ if (edgeIntoFirst == 0 && edgeAwayFromLast != 0 &&
+ revCompEdgeIntoFirst == 0 && revCompEdgeAwayFromLast == 0)
+ {
+ m_nodes.push_back(newNode);
+ m_endLocation = GraphLocation::endOfNode(newNode);
+ m_edges.push_back(edgeAwayFromLast);
+ return true;
+ }
+
+ if (edgeIntoFirst == 0 && edgeAwayFromLast == 0 &&
+ revCompEdgeIntoFirst != 0 && revCompEdgeAwayFromLast == 0)
+ {
+ newNode = newNode->getReverseComplement();
+ m_nodes.push_front(newNode);
+ m_startLocation = GraphLocation::startOfNode(newNode);
+ m_edges.push_front(revCompEdgeIntoFirst);
+ return true;
+ }
+
+ if (edgeIntoFirst == 0 && edgeAwayFromLast == 0 &&
+ revCompEdgeIntoFirst == 0 && revCompEdgeAwayFromLast != 0)
+ {
+ newNode = newNode->getReverseComplement();
+ m_nodes.push_back(newNode);
+ m_endLocation = GraphLocation::endOfNode(newNode);
+ m_edges.push_back(revCompEdgeAwayFromLast);
+ return true;
+ }
+
+ if (edgeIntoFirst != 0 && edgeAwayFromLast != 0 &&
+ revCompEdgeIntoFirst == 0 && revCompEdgeAwayFromLast == 0)
+ {
+ m_edges.push_back(edgeAwayFromLast);
+ m_nodes.push_back(newNode);
+ m_edges.push_back(edgeIntoFirst);
+ return true;
+ }
+
+ if (edgeIntoFirst == 0 && edgeAwayFromLast == 0 &&
+ revCompEdgeIntoFirst != 0 && revCompEdgeAwayFromLast != 0)
+ {
+ m_edges.push_back(revCompEdgeAwayFromLast);
+ m_nodes.push_back(newNode->getReverseComplement());
+ m_edges.push_back(revCompEdgeIntoFirst);
+ return true;
+ }
+
+ //If the code got here, then there are multiple ways of adding the node, so
+ //we fail.
+ return false;
+}
+
+
+//This function looks to see if there are other edges connecting path nodes
+//that aren't in the list of path edges. If so, it returns true.
+//This is used to check whether a Path is ambiguous or node.
+bool Path::checkForOtherEdges()
+{
+ //First compile a list of all edges which connect any
+ //node in the Path to any other node in the Path.
+ QList<DeBruijnEdge *> allConnectingEdges;
+ for (int i = 0; i < m_nodes.size(); ++i)
+ {
+ DeBruijnNode * startingNode = m_nodes[i];
+ const std::vector<DeBruijnEdge *> * startingNodeEdges = startingNode->getEdgesPointer();
+ for (int j = 0; j < m_nodes.size(); ++j)
+ {
+ DeBruijnNode * endingNode = m_nodes[j];
+ for (size_t k = 0; k < startingNodeEdges->size(); ++k)
+ {
+ DeBruijnEdge * edge = (*startingNodeEdges)[k];
+ if (edge->getStartingNode() == startingNode &&
+ edge->getEndingNode() == endingNode)
+ allConnectingEdges.push_back(edge);
+ }
+ }
+ }
+
+ //If this list of edges is greater than the number of edges in the path,
+ //then other edges exist.
+ return allConnectingEdges.size() > m_edges.size();
+}
+
+
+
+
+//This function extracts the sequence for the whole path. It uses the overlap
+//value in the edges to remove sequences that are duplicated at the end of one
+//node and the start of the next.
+QByteArray Path::getPathSequence() const
+{
+ if (m_nodes.empty())
+ return "";
+
+ QByteArray sequence;
+ QByteArray firstNodeSequence = m_nodes[0]->getSequence();
+
+ //If the path is circular, we trim the overlap from the first node.
+ if (isCircular())
+ {
+ int overlap = m_edges.back()->getOverlap();
+ if (overlap != 0)
+ firstNodeSequence = modifySequenceUsingOverlap(firstNodeSequence, overlap);
+ sequence += firstNodeSequence;
+ }
+
+ //If the path is linear, then we begin either with the entire first node
+ //sequence or part of it.
+ else
+ {
+ int rightChars = firstNodeSequence.length() - m_startLocation.getPosition() + 1;
+ sequence += firstNodeSequence.right(rightChars);
+ }
+
+ //The middle nodes are not affected by whether or not the path is circular
+ //or has partial node ends.
+ for (int i = 1; i < m_nodes.size(); ++i)
+ {
+ int overlap = m_edges[i-1]->getOverlap();
+ QByteArray nodeSequence = m_nodes[i]->getSequence();
+ if (overlap != 0)
+ nodeSequence = modifySequenceUsingOverlap(nodeSequence, overlap);
+ sequence += nodeSequence;
+ }
+
+ DeBruijnNode * lastNode = m_nodes.back();
+ int amountToTrimFromEnd = lastNode->getLength() - m_endLocation.getPosition();
+ sequence.chop(amountToTrimFromEnd);
+
+ return sequence;
+}
+
+
+//This function will trim bases from the start of a sequence (in the case of
+//positive overlap) or add Ns to the start (in the case of negative overlap).
+QByteArray Path::modifySequenceUsingOverlap(QByteArray sequence, int overlap) const
+{
+ if (overlap > 0)
+ {
+ int rightChars = sequence.length() - overlap;
+ if (rightChars >= 0)
+ sequence = sequence.right(rightChars);
+ }
+ else if (overlap < 0)
+ sequence = QByteArray(-overlap, 'N') + sequence;
+
+ return sequence;
+}
+
+
+int Path::getLength() const
+{
+ int length = 0;
+ for (int i = 0; i < m_nodes.size(); ++i)
+ length += m_nodes[i]->getLength();
+
+ for (int i = 0; i < m_edges.size(); ++i)
+ length -= m_edges[i]->getOverlap();
+
+ length -= m_startLocation.getPosition() - 1;
+
+ DeBruijnNode * lastNode = m_nodes.back();
+ length -= lastNode->getLength() - m_endLocation.getPosition();
+
+ return length;
+}
+
+
+QString Path::getFasta() const
+{
+ //The description line is a comma-delimited list of the nodes in the path
+ QString fasta = ">" + getString(false);
+
+ if (isCircular())
+ fasta += "(circular)";
+ fasta += "\n";
+
+ QString pathSequence = getPathSequence();
+ int charactersOnLine = 0;
+ for (int i = 0; i < pathSequence.length(); ++i)
+ {
+ fasta += pathSequence.at(i);
+ ++charactersOnLine;
+ if (charactersOnLine >= 70)
+ {
+ fasta += "\n";
+ charactersOnLine = 0;
+ }
+ }
+ fasta += "\n";
+
+ return fasta;
+}
+
+
+
+QString Path::getString(bool spaces) const
+{
+ QString output;
+ for (int i = 0; i < m_nodes.size(); ++i)
+ {
+ if (i == 0 && !m_startLocation.isAtStartOfNode())
+ {
+ output += "(" + QString::number(m_startLocation.getPosition()) + ")";
+ if (spaces)
+ output += " ";
+ }
+
+ output += m_nodes[i]->getName();
+ if (i < m_nodes.size() - 1)
+ {
+ output += ",";
+ if (spaces)
+ output += " ";
+ }
+
+ if (i == m_nodes.size() - 1 && !m_endLocation.isAtEndOfNode())
+ {
+ if (spaces)
+ output += " ";
+ output += "(" + QString::number(m_endLocation.getPosition()) + ")";
+ }
+ }
+ return output;
+}
+
+
+//This function tests whether the last node in the path leads into the first.
+bool Path::isCircular() const
+{
+ if (isEmpty())
+ return false;
+ if (m_edges.empty())
+ return false;
+
+ //A circular path should have the same number of nodes and edges.
+ if (m_nodes.size() != m_edges.size())
+ return false;
+
+ DeBruijnEdge * lastEdge = m_edges.back();
+ DeBruijnNode * firstNode = m_nodes.front();
+ DeBruijnNode * lastNode = m_nodes.back();
+
+ return (lastEdge->getStartingNode() == lastNode &&
+ lastEdge->getEndingNode() == firstNode);
+}
+
+
+
+//These functions test whether the specified node could be added to
+//the end/front of the path to form a larger valid path.
+//If so, they set the path pointed to by extendedPath to equal the new, larger
+//path.
+bool Path::canNodeFitOnEnd(DeBruijnNode * node, Path * extendedPath) const
+{
+ if (isEmpty())
+ {
+ QList<DeBruijnNode *> nodeList;
+ nodeList.push_back(node);
+ *extendedPath = Path::makeFromOrderedNodes(nodeList, false);
+ return true;
+ }
+ if (isCircular())
+ return false;
+
+ DeBruijnNode * lastNode = m_nodes.back();
+ const std::vector<DeBruijnEdge *> * lastNodeEdges = lastNode->getEdgesPointer();
+ for (size_t i = 0; i < lastNodeEdges->size(); ++i)
+ {
+ DeBruijnEdge * edge = (*lastNodeEdges)[i];
+ if (edge->getStartingNode() == lastNode && edge->getEndingNode() == node)
+ {
+ *extendedPath = *this;
+ extendedPath->m_edges.push_back(edge);
+ extendedPath->m_nodes.push_back(node);
+ extendedPath->m_endLocation = GraphLocation::endOfNode(node);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+bool Path::canNodeFitAtStart(DeBruijnNode * node, Path * extendedPath) const
+{
+ if (isEmpty())
+ {
+ QList<DeBruijnNode *> nodeList;
+ nodeList.push_back(node);
+ *extendedPath = Path::makeFromOrderedNodes(nodeList, false);
+ return true;
+ }
+ if (isCircular())
+ return false;
+
+ DeBruijnNode * firstNode = m_nodes.front();
+ const std::vector<DeBruijnEdge *> * firstNodeEdges = firstNode->getEdgesPointer();
+ for (size_t i = 0; i < firstNodeEdges->size(); ++i)
+ {
+ DeBruijnEdge * edge = (*firstNodeEdges)[i];
+ if (edge->getStartingNode() == node && edge->getEndingNode() == firstNode)
+ {
+ *extendedPath = *this;
+ extendedPath->m_edges.push_front(edge);
+ extendedPath->m_nodes.push_front(node);
+ extendedPath->m_startLocation = GraphLocation::startOfNode(node);
+ return true;
+ }
+ }
+
+ return false;
+}
+
+
+//This function builds all possible paths between the given start and end,
+//within the given restrictions.
+QList<Path> Path::getAllPossiblePaths(GraphLocation startLocation,
+ GraphLocation endLocation,
+ int nodeSearchDepth,
+ int minDistance, int maxDistance)
+{
+ QList<Path> finishedPaths;
+ QList<Path> unfinishedPaths;
+
+ Path startPath;
+ startPath.addNode(startLocation.getNode(), true, false);
+ startPath.m_startLocation = startLocation;
+ startPath.m_endLocation = GraphLocation::endOfNode(startLocation.getNode());
+ unfinishedPaths.push_back(startPath);
+
+ for (int i = 0; i <= nodeSearchDepth; ++i)
+ {
+ QApplication::processEvents();
+
+ //Look at each of the unfinished paths to see if they end with the end
+ //node. If so, see if it has the appropriate length.
+ //If it does, it will go into the final returned list.
+ //If it doesn't and it's over length, then it will be removed.
+ QList<Path>::iterator j = unfinishedPaths.begin();
+ while (j != unfinishedPaths.end())
+ {
+ DeBruijnNode * lastNode = (*j).m_nodes.back();
+ if (lastNode == endLocation.getNode())
+ {
+ Path potentialFinishedPath = *j;
+ potentialFinishedPath.m_endLocation = endLocation;
+ int length = potentialFinishedPath.getLength();
+ if (length >= minDistance && length <= maxDistance)
+ finishedPaths.push_back(potentialFinishedPath);
+ ++j;
+ }
+ else
+ {
+ if ((*j).getLength() > maxDistance)
+ j = unfinishedPaths.erase(j);
+ else
+ ++j;
+ }
+ }
+
+ //Make new unfinished paths by extending each of the paths.
+ QList<Path> newUnfinishedPaths;
+ for (int j = 0; j < unfinishedPaths.size(); ++j)
+ newUnfinishedPaths.append(unfinishedPaths[j].extendPathInAllPossibleWays());
+ unfinishedPaths = newUnfinishedPaths;
+ }
+
+ return finishedPaths;
+}
+
+
+//This function takes the current path and extends it in all possible ways by
+//adding one more node, then returning a list of the new paths. How many paths
+//it returns depends on the number of edges leaving the last node in the path.
+QList<Path> Path::extendPathInAllPossibleWays() const
+{
+ QList<Path> returnList;
+
+ if (isEmpty())
+ return returnList;
+
+ //Since circular paths don't really have an end to extend, this function
+ //doesn't work for them.
+ if (isCircular())
+ return returnList;
+
+ DeBruijnNode * lastNode = m_nodes.back();
+ std::vector<DeBruijnEdge *> nextEdges = lastNode->getLeavingEdges();
+ for (size_t i = 0; i < nextEdges.size(); ++i)
+ {
+ DeBruijnEdge * nextEdge = nextEdges[i];
+ DeBruijnNode * nextNode = nextEdge->getEndingNode();
+
+ Path newPath(*this);
+ newPath.m_edges.push_back(nextEdge);
+ newPath.m_nodes.push_back(nextNode);
+ newPath.m_endLocation = GraphLocation::endOfNode(nextNode);
+
+ returnList.push_back(newPath);
+ }
+
+ return returnList;
+}
+
+
+
+double Path::getMeanDepth() const
+{
+ long double depthTimesLengthSum = 0.0;
+ int nodeLengthTotal = 0;
+ for (int i = 0; i < m_nodes.size(); ++i)
+ {
+ DeBruijnNode * node = m_nodes[i];
+ depthTimesLengthSum += node->getDepth() * node->getLength();
+ nodeLengthTotal += node->getLength();
+ }
+
+ return depthTimesLengthSum / nodeLengthTotal;
+}
+
+
+
+bool Path::operator==(Path const &other) const
+{
+ return (m_nodes == other.m_nodes &&
+ m_startLocation == other.m_startLocation &&
+ m_endLocation == other.m_endLocation);
+}
+
+
+bool Path::haveSameNodes(Path other) const
+{
+ return (m_nodes == other.m_nodes);
+}
+
+
+
+//This function checks to see if this path is actually a sub-path (i.e.
+//entirely contained within) the other given path.
+//It ignores start/end type and position, looking only at the nodes.
+//If the two paths have the same nodes, it will return false.
+bool Path::hasNodeSubset(Path other) const
+{
+ //To contain this path, the other path should be have a larger number of
+ //nodes.
+ int nodeCountDifference = other.m_nodes.size() - m_nodes.size();
+ if (nodeCountDifference <= 0)
+ return false;
+
+ //If the paths have the same number of nodes, check to see if they are
+ //identical.
+ if (nodeCountDifference == 0)
+ return (m_nodes == other.m_nodes);
+
+ //If the code got here, then the other path has more nodes than this path.
+ //We now see if we can find an ordered set of nodes in the other path that
+ //matches this path's nodes.
+ for (int i = 0; i <= nodeCountDifference; ++i)
+ {
+ QList<DeBruijnNode *> otherPathNodeSubset = other.m_nodes.mid(i, m_nodes.size());
+ if (m_nodes == otherPathNodeSubset)
+ return true;
+ }
+
+ return false;
+}
+
+
+
+void Path::extendPathToIncludeEntirityOfNodes()
+{
+ if (m_nodes.empty())
+ return;
+
+ m_startLocation = GraphLocation::startOfNode(m_nodes.front());
+ m_endLocation = GraphLocation::endOfNode(m_nodes.back());
+}
+
+
+bool Path::containsNode(DeBruijnNode * node) const
+{
+ return m_nodes.contains(node);
+}
+
+bool Path::containsEntireNode(DeBruijnNode * node) const
+{
+ if (m_nodes.empty())
+ return false;
+
+ if (m_nodes.size() == 1) {
+ if (m_nodes.front() != node)
+ return false;
+ return m_startLocation.isAtStartOfNode() && m_endLocation.isAtEndOfNode();
+ }
+
+ if (m_nodes.front() == node && m_startLocation.isAtStartOfNode())
+ return true;
+
+ if (m_nodes.back() == node && m_endLocation.isAtEndOfNode())
+ return true;
+
+ for (int i = 1; i < m_nodes.size() - 1; ++i)
+ {
+ if (m_nodes[i] == node)
+ return true;
+ }
+
+ return false;
+}
+
+
+
+
+bool Path::isInMiddleOfPath(DeBruijnNode * node) const
+{
+ return containsNode(node) && !isStartingNode(node) && !isEndingNode(node);
+}
+
+
+//This function counts the number of times the node is in the path, not
+//counting the first or last nodes.
+int Path::numberOfOccurrencesInMiddleOfPath(DeBruijnNode * node) const
+{
+ int count = 0;
+ for (int i = 1; i < m_nodes.size() - 1; ++i)
+ {
+ if (m_nodes[i] == node)
+ ++count;
+ }
+ return count;
+}
+
+bool Path::isStartingNode(DeBruijnNode * node) const
+{
+ if (m_nodes.empty())
+ return false;
+ return m_nodes.front() == node;
+}
+
+bool Path::isEndingNode(DeBruijnNode * node) const
+{
+ if (m_nodes.empty())
+ return false;
+ return m_nodes.back() == node;
+}
+
+
+double Path::getStartFraction() const
+{
+ if (m_nodes.empty())
+ return 0.0;
+
+ int firstNodeLength = m_nodes.front()->getLength();
+ if (firstNodeLength == 0)
+ return 0.0;
+
+ return double(m_startLocation.getPosition() - 1) / firstNodeLength;
+}
+
+double Path::getEndFraction() const
+{
+ if (m_nodes.empty())
+ return 1.0;
+
+ int lastNodeLength = m_nodes.back()->getLength();
+ if (lastNodeLength == 0)
+ return 1.0;
+
+ return double(m_endLocation.getPosition()) / lastNodeLength;
+}
+
+
+int Path::getNodeCount() const
+{
+ return m_nodes.size();
+}
diff --git a/graph/path.h b/graph/path.h
new file mode 100644
index 0000000..1b7df00
--- /dev/null
+++ b/graph/path.h
@@ -0,0 +1,97 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef PATH_H
+#define PATH_H
+
+#include <QByteArray>
+#include <QList>
+#include <vector>
+#include <QString>
+#include <QStringList>
+#include "../program/globals.h"
+#include "graphlocation.h"
+
+class DeBruijnNode;
+class DeBruijnEdge;
+
+class Path
+{
+public:
+ //CREATORS
+ Path() {}
+ static Path makeFromUnorderedNodes(QList<DeBruijnNode *> nodes,
+ bool strandSpecific);
+ static Path makeFromUnorderedNodes(std::vector<DeBruijnNode *> nodes,
+ bool strandSpecific);
+ static Path makeFromOrderedNodes(QList<DeBruijnNode *> nodes,
+ bool circular);
+ static Path makeFromString(QString pathString, bool circular,
+ QString * pathStringFailure);
+
+ //ACCESSORS
+ QList<DeBruijnNode *> getNodes() const {return m_nodes;}
+ QList<DeBruijnEdge *> getEdges() const {return m_edges;}
+ bool isEmpty() const {return m_nodes.empty();}
+ bool isCircular() const;
+ bool haveSameNodes(Path other) const;
+ bool hasNodeSubset(Path other) const;
+ QByteArray getPathSequence() const;
+ QString getFasta() const;
+ QString getString(bool spaces) const;
+ int getLength() const;
+ QList<Path> extendPathInAllPossibleWays() const;
+ bool canNodeFitOnEnd(DeBruijnNode * node, Path * extendedPath) const;
+ bool canNodeFitAtStart(DeBruijnNode * node, Path * extendedPath) const;
+ double getMeanDepth() const;
+ bool containsNode(DeBruijnNode * node) const;
+ bool containsEntireNode(DeBruijnNode * node) const;
+ bool isInMiddleOfPath(DeBruijnNode * node) const;
+ int numberOfOccurrencesInMiddleOfPath(DeBruijnNode * node) const;
+ bool isStartingNode(DeBruijnNode * node) const;
+ bool isEndingNode(DeBruijnNode * node) const;
+ double getStartFraction() const;
+ double getEndFraction() const;
+ int getNodeCount() const;
+ GraphLocation getStartLocation() const {return m_startLocation;}
+ GraphLocation getEndLocation() const {return m_endLocation;}
+ bool operator==(Path const &other) const;
+
+ //MODIFERS
+ bool addNode(DeBruijnNode * newNode, bool strandSpecific, bool makeCircularIfPossible);
+ void extendPathToIncludeEntirityOfNodes();
+
+ //STATIC
+ static QList<Path> getAllPossiblePaths(GraphLocation startLocation,
+ GraphLocation endLocation,
+ int nodeSearchDepth,
+ int minDistance, int maxDistance);
+
+private:
+ GraphLocation m_startLocation;
+ GraphLocation m_endLocation;
+ QList<DeBruijnNode *> m_nodes;
+ QList<DeBruijnEdge *> m_edges;
+
+ void buildUnambiguousPathFromNodes(QList<DeBruijnNode *> nodes,
+ bool strandSpecific);
+ QByteArray modifySequenceUsingOverlap(QByteArray sequence, int overlap) const;
+ bool checkForOtherEdges();
+};
+
+#endif // PATH_H
diff --git a/graph/querydistance.h b/graph/querydistance.h
new file mode 100644
index 0000000..8ef2624
--- /dev/null
+++ b/graph/querydistance.h
@@ -0,0 +1,39 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef QUERYDISTANCE_H
+#define QUERYDISTANCE_H
+
+#include "path.h"
+#include <QString>
+
+class QueryDistance
+{
+public:
+ QueryDistance(Path path, QString orientation);
+
+ Path m_path;
+ int m_distance;
+ QString m_orientation;
+
+
+ bool operator<(QueryDistance const &other) const;
+ bool operator==(QueryDistance const &other) const;
+};
+
+#endif // QUERYDISTANCE_H
diff --git a/images/BLAST.png b/images/BLAST.png
new file mode 100755
index 0000000..27d913f
Binary files /dev/null and b/images/BLAST.png differ
diff --git a/images/application.icns b/images/application.icns
new file mode 100644
index 0000000..8d2cd14
Binary files /dev/null and b/images/application.icns differ
diff --git a/images/application.ico b/images/application.ico
new file mode 100644
index 0000000..3e479b8
Binary files /dev/null and b/images/application.ico differ
diff --git a/images/bring-to-front.png b/images/bring-to-front.png
new file mode 100755
index 0000000..f04e009
Binary files /dev/null and b/images/bring-to-front.png differ
diff --git a/images/contiguity-contiguous.png b/images/contiguity-contiguous.png
new file mode 100755
index 0000000..41809a1
Binary files /dev/null and b/images/contiguity-contiguous.png differ
diff --git a/images/contiguity-maybe_contiguous.png b/images/contiguity-maybe_contiguous.png
new file mode 100755
index 0000000..2bd3b2e
Binary files /dev/null and b/images/contiguity-maybe_contiguous.png differ
diff --git a/images/contiguity-not_contiguous.png b/images/contiguity-not_contiguous.png
new file mode 100755
index 0000000..0f8efdb
Binary files /dev/null and b/images/contiguity-not_contiguous.png differ
diff --git a/images/contiguity.png b/images/contiguity.png
new file mode 100755
index 0000000..faad727
Binary files /dev/null and b/images/contiguity.png differ
diff --git a/images/copy.png b/images/copy.png
new file mode 100755
index 0000000..5311bec
Binary files /dev/null and b/images/copy.png differ
diff --git a/images/cross-128.png b/images/cross-128.png
new file mode 100644
index 0000000..85cf5c9
Binary files /dev/null and b/images/cross-128.png differ
diff --git a/images/exit-256.png b/images/exit-256.png
new file mode 100644
index 0000000..c0d8b14
Binary files /dev/null and b/images/exit-256.png differ
diff --git a/images/icon.png b/images/icon.png
new file mode 100644
index 0000000..050f789
Binary files /dev/null and b/images/icon.png differ
diff --git a/images/images.qrc b/images/images.qrc
new file mode 100644
index 0000000..1842319
--- /dev/null
+++ b/images/images.qrc
@@ -0,0 +1,26 @@
+<RCC>
+ <qresource prefix="/icons">
+ <file>icon.png</file>
+ <file>load-256.png</file>
+ <file>settings-256.png</file>
+ <file>tick-128.png</file>
+ <file>information-256.png</file>
+ <file>save-256.png</file>
+ <file>exit-256.png</file>
+ <file>information-256-inactive.png</file>
+ <file>BLAST.png</file>
+ <file>bring-to-front.png</file>
+ <file>contiguity.png</file>
+ <file>contiguity-contiguous.png</file>
+ <file>contiguity-maybe_contiguous.png</file>
+ <file>contiguity-not_contiguous.png</file>
+ <file>invert-selection.png</file>
+ <file>select-all.png</file>
+ <file>select-none.png</file>
+ <file>copy.png</file>
+ <file>zoom.png</file>
+ <file>cross-128.png</file>
+ <file>specify-path.png</file>
+ <file>ncbi-256.png</file>
+ </qresource>
+</RCC>
diff --git a/images/information-256-inactive.png b/images/information-256-inactive.png
new file mode 100644
index 0000000..dc5c5dc
Binary files /dev/null and b/images/information-256-inactive.png differ
diff --git a/images/information-256.png b/images/information-256.png
new file mode 100644
index 0000000..183ab48
Binary files /dev/null and b/images/information-256.png differ
diff --git a/images/invert-selection.png b/images/invert-selection.png
new file mode 100755
index 0000000..81cf114
Binary files /dev/null and b/images/invert-selection.png differ
diff --git a/images/load-256.png b/images/load-256.png
new file mode 100644
index 0000000..a5816c0
Binary files /dev/null and b/images/load-256.png differ
diff --git a/images/myapp.rc b/images/myapp.rc
new file mode 100644
index 0000000..882c3d9
--- /dev/null
+++ b/images/myapp.rc
@@ -0,0 +1 @@
+IDI_ICON1 ICON DISCARDABLE "application.ico"
\ No newline at end of file
diff --git a/images/ncbi-256.png b/images/ncbi-256.png
new file mode 100644
index 0000000..9823d3f
Binary files /dev/null and b/images/ncbi-256.png differ
diff --git a/images/save-256.png b/images/save-256.png
new file mode 100644
index 0000000..308eebd
Binary files /dev/null and b/images/save-256.png differ
diff --git a/images/select-all.png b/images/select-all.png
new file mode 100755
index 0000000..2a78945
Binary files /dev/null and b/images/select-all.png differ
diff --git a/images/select-none.png b/images/select-none.png
new file mode 100755
index 0000000..495b14f
Binary files /dev/null and b/images/select-none.png differ
diff --git a/images/settings-256.png b/images/settings-256.png
new file mode 100644
index 0000000..c3a092c
Binary files /dev/null and b/images/settings-256.png differ
diff --git a/images/specify-path.png b/images/specify-path.png
new file mode 100644
index 0000000..b857836
Binary files /dev/null and b/images/specify-path.png differ
diff --git a/images/tick-128.png b/images/tick-128.png
new file mode 100644
index 0000000..eaa56a8
Binary files /dev/null and b/images/tick-128.png differ
diff --git a/images/zoom.png b/images/zoom.png
new file mode 100755
index 0000000..9dcfa0e
Binary files /dev/null and b/images/zoom.png differ
diff --git a/ogdf/LICENSE.txt b/ogdf/LICENSE.txt
new file mode 100644
index 0000000..e945710
--- /dev/null
+++ b/ogdf/LICENSE.txt
@@ -0,0 +1,50 @@
+***********************************************************
+* OGDF - The Open Graph Drawing Framework *
+* *
+* LICENSE *
+***********************************************************
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+Version 2 or 3 as published by the Free Software Foundation
+and appearing in the files LICENSE_GPL_v2.txt and
+LICENSE_GPL_v3.txt included in the packaging of this file.
+
+In addition, as a special exception, you have permission to link
+this software with
+
+ - Tulip (http://www.tulip-software.org)
+
+ - the libraries of the COIN-OR Osi project (see
+ http://www.coin-or.org/projects/Osi.xml);
+
+ - all libraries required by Osi;
+
+ - and all LP-solver libraries directly supported by the
+ COIN-OR Osi project,
+
+and distribute executables, as long as you follow the requirements
+of the GNU General Public License in regard to all of the software
+in the executable aside from these third-party libraries.
+
+Moreover, we grant a special exception to the OGDF QML
+(https://github.com/schulzch/qml-ogdf) plugin by Christoph Schulz
+(licensed under the GNU Lesser General Public License) for linking
+OGDF and distributing the plugin under LGPL v2 or v3.
+
+See also: http://www.ogdf.net/license.html
+
+
+Third-party software:
+
+ - the ABACUS framework, licensed under the GNU GPL
+ (see http://www.informatik.uni-koeln.de/abacus/).
+ The files are located in {src,include}/ogdf/abacus.
+
+ - the COIN-OR project, licensed under the Eclipse Public License 1.0
+ (see http://www.eclipse.org/legal/epl-v10.html).
+ The files are located in {src,include}/coin.
+
+ - the GTest framework, licensed under the 3-clause BSD license
+ (see test/gtest/gtest.h header).
+ The files are located in test/gtest.
diff --git a/ogdf/basic/AdjEntryArray.h b/ogdf/basic/AdjEntryArray.h
new file mode 100644
index 0000000..36a85f1
--- /dev/null
+++ b/ogdf/basic/AdjEntryArray.h
@@ -0,0 +1,225 @@
+/*
+ * $Revision: 2615 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-16 14:23:36 +0200 (Mo, 16. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration and implementation of AdjEntryArray class.
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_ADJ_ENTRY_ARRAY_H
+#define OGDF_ADJ_ENTRY_ARRAY_H
+
+
+
+#include "Graph.h"
+
+
+namespace ogdf {
+
+
+//! Abstract base class for adjacency entry arrays.
+/**
+ * Defines the interface for event handling used by the Graph class.
+ * Use the parameterized class AdjEntryArray for creating adjacency arrays.
+ */
+class AdjEntryArrayBase {
+ /**
+ * Pointer to list element in the list of all registered adjacency
+ * entry arrays which references this array.
+ */
+ ListIterator<AdjEntryArrayBase*> m_it;
+
+public:
+ const Graph *m_pGraph; //!< The associated graph.
+
+ //! Initializes an adjacency entry array not associated with a graph.
+ AdjEntryArrayBase() : m_pGraph(0) { }
+ //! Initializes an adjacency entry array associated with \a pG.
+ AdjEntryArrayBase(const Graph *pG) : m_pGraph(pG) {
+ if(pG) m_it = pG->registerArray(this);
+ }
+
+ // destructor, unregisters the array
+ virtual ~AdjEntryArrayBase() {
+ if (m_pGraph) m_pGraph->unregisterArray(m_it);
+ }
+
+ // event interface used by Graph
+ //! Virtual function called when table size has to be enlarged.
+ virtual void enlargeTable(int newTableSize) = 0;
+ //! Virtual function called when table has to be reinitialized.
+ virtual void reinit(int initTableSize) = 0;
+ //! Virtual function called when array is disconnected from the graph.
+ virtual void disconnect() = 0;
+ //! Virtual function called when the index of an adjacency entry is changed.
+ virtual void resetIndex(int newIndex, int oldIndex) = 0;
+
+ //! Associates the array with a new graph.
+ void reregister(const Graph *pG) {
+ if (m_pGraph) m_pGraph->unregisterArray(m_it);
+ if ((m_pGraph = pG) != 0) m_it = pG->registerArray(this);
+ }
+}; // class AdjEntryArrayBase
+
+
+//! Dynamic arrays indexed with adjacency entries.
+/**
+ * Adjacency entry arrays represent a mapping from adjacency entries to data of type \a T.
+ * They adjust their table size automatically when the graph grows.
+ *
+ * @tparam T is the element type.
+ */
+template<class T> class AdjEntryArray : private Array<T>, protected AdjEntryArrayBase {
+ T m_x; //!< The default value for array elements.
+
+public:
+ //! Constructs an empty adjacency entry array associated with no graph.
+ AdjEntryArray() : Array<T>(), AdjEntryArrayBase() { }
+ //! Constructs an adjacency entry array associated with \a G.
+ AdjEntryArray(const Graph &G) : Array<T>(G.adjEntryArrayTableSize()), AdjEntryArrayBase(&G) { }
+ //! Constructs an adjacency entry array associated with \a G.
+ /**
+ * @param G is the associated graph.
+ * @param x is the default value for all array elements.
+ */
+ AdjEntryArray(const Graph &G, const T &x) :
+ Array<T>(0,G.adjEntryArrayTableSize()-1,x), AdjEntryArrayBase(&G), m_x(x) { }
+ //! Constructs an adjacency entry array that is a copy of \a A.
+ /**
+ * Associates the array with the same graph as \a A and copies all elements.
+ */
+ AdjEntryArray(const AdjEntryArray<T> &A) : Array<T>(A), AdjEntryArrayBase(A.m_pGraph), m_x(A.m_x) { }
+
+ //! Returns true iff the array is associated with a graph.
+ bool valid() const { return (Array<T>::low() <= Array<T>::high()); }
+
+ //! Returns a reference to the element with index \a adj.
+ const T &operator[](adjEntry adj) const {
+ OGDF_ASSERT(adj != 0 && adj->graphOf() == m_pGraph)
+ return Array<T>::operator [](adj->index());
+ }
+
+ //! Returns a reference to the element with index \a adj.
+ T &operator[](adjEntry adj) {
+ OGDF_ASSERT(adj != 0 && adj->graphOf() == m_pGraph)
+ return Array<T>::operator [](adj->index());
+ }
+
+ //! Returns a reference the element with index \a index.
+ /**
+ * \attention Make sure that \a index is a valid index for an adjacency
+ * entry in the associated graph!
+ */
+ const T &operator[](int index) const {
+ return Array<T>::operator [](index);
+ }
+
+ //! Returns a reference the element with index \a index.
+ /**
+ * \attention Make sure that \a index is a valid index for an adjacency
+ * entry in the associated graph!
+ */
+ T &operator[](int index) {
+ return Array<T>::operator [](index);
+ }
+
+ //! Assignment operator.
+ AdjEntryArray<T> &operator=(const AdjEntryArray<T> &A) {
+ Array<T>::operator =(A);
+ m_x = A.m_x;
+ reregister(A.m_pGraph);
+ return *this;
+ }
+
+ //! Reinitializes the array. Associates the array with no graph.
+ void init() {
+ Array<T>::init(); reregister(0);
+ }
+
+ //! Reinitializes the array. Associates the array with \a G.
+ void init(const Graph &G) {
+ Array<T>::init(G.adjEntryArrayTableSize()); reregister(&G);
+ }
+
+ //! Reinitializes the array. Associates the array with \a G.
+ /**
+ * @param G is the associated graph.
+ * @param x is the default value.
+ */
+ void init(const Graph &G, const T &x) {
+ Array<T>::init(0,G.adjEntryArrayTableSize()-1, m_x = x); reregister(&G);
+ }
+
+ //! Sets all array elements to \a x.
+ void fill(const T &x) {
+ int high = m_pGraph->maxAdjEntryIndex();
+ if(high >= 0)
+ Array<T>::fill(0,high,x);
+ }
+
+private:
+ virtual void enlargeTable(int newTableSize) {
+ Array<T>::grow(newTableSize-Array<T>::size(),m_x);
+ }
+
+ virtual void reinit(int initTableSize) {
+ Array<T>::init(0,initTableSize-1,m_x);
+ }
+
+ virtual void resetIndex(int newIndex, int oldIndex) {
+ Array<T>::operator [](newIndex) = Array<T>::operator [](oldIndex);
+ }
+
+ virtual void disconnect() {
+ Array<T>::init();
+ m_pGraph = 0;
+ }
+
+ OGDF_NEW_DELETE
+
+}; // class AdjEntryArray<T>
+
+
+} // end namespace ogdf
+
+
+#endif
diff --git a/ogdf/basic/Array.h b/ogdf/basic/Array.h
new file mode 100644
index 0000000..1dbcd64
--- /dev/null
+++ b/ogdf/basic/Array.h
@@ -0,0 +1,589 @@
+/*
+ * $Revision: 2615 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-16 14:23:36 +0200 (Mo, 16. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration and implementation of Array class and
+ * Array algorithms
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_ARRAY_H
+#define OGDF_ARRAY_H
+
+
+
+
+#include "basic.h"
+
+
+namespace ogdf {
+
+//! Iteration over all indices \a i of an array \a A.
+/**
+ * Note that the index variable \a i has to be defined prior to this macro
+ * (just as for \c #forall_edges, etc.).
+ * <h3>Example</h3>
+ *
+ * \code
+ * Array<double> A;
+ * ...
+ * int i;
+ * forall_arrayindices(i, A) {
+ * cout << A[i] << endl;
+ * }
+ * \endcode
+ *
+ * Note that this code is equivalent to the following tedious long version
+ *
+ * \code
+ * Array<double> A;
+ * ...
+ * int i;
+ * for(i = A.low(); i <= A.high(); ++i) {
+ * cout << A[i] << endl;
+ * }
+ * \endcode
+ */
+#define forall_arrayindices(i, A) \
+ for(i = (A).low(); i<=(A).high(); ++i)
+
+//! Iteration over all indices \a i of an array \a A, in reverse order.
+/**
+ * Note that the index variable \a i has to be defined prior to this macro
+ * (just as for \c #forall_edges, etc.).
+ * See \c #forall_arrayindices for an example
+ */
+#define forall_rev_arrayindices(i, A) \
+ for(i = (A).high(); i>=(A).low(); --i)
+
+
+
+//! The parameterized class \a Array<E,INDEX> implements dynamic arrays of type \a E.
+/**
+ * @tparam E denotes the element type.
+ * @tparam INDEX denotes the index type. The index type must be chosen such that it can
+ * express the whole index range of the array instance, as well as its size.
+ * The default index type is \c int, other possible types are \c short and
+ * <code>long long</code> (on 64-bit systems).
+ */
+template<class E, class INDEX = int> class Array {
+public:
+ //! Threshold used by \a quicksort() such that insertion sort is
+ //! called for instances smaller than \a maxSizeInsertionSort.
+ enum { maxSizeInsertionSort = 40 };
+
+
+ //! Creates an array with empty index set.
+ Array() { construct(0,-1); }
+
+ //! Creates an array with index set [0..\a s-1].
+ explicit Array(INDEX s) {
+ construct(0,s-1); initialize();
+ }
+
+ //! Creates an array with index set [\a a..\a b].
+ Array(INDEX a, INDEX b) {
+ construct(a,b); initialize();
+ }
+
+ //! Creates an array with index set [\a a..\a b] and initializes each element with \a x.
+ Array(INDEX a, INDEX b, const E &x) {
+ construct(a,b); initialize(x);
+ }
+
+ //! Creates an array that is a copy of \a A.
+ Array(const Array<E> &A) {
+ copy(A);
+ }
+
+ // destruction
+ ~Array() {
+ deconstruct();
+ }
+
+ //! Returns the minimal array index.
+ INDEX low() const { return m_low; }
+
+ //! Returns the maximal array index.
+ INDEX high() const { return m_high; }
+
+ //! Returns the size (number of elements) of the array.
+ INDEX size() const { return m_high - m_low + 1; }
+
+ //! Returns a pointer to the first element.
+ E *begin() { return m_pStart; }
+
+ //! Returns a pointer to the first element.
+ const E *begin() const { return m_pStart; }
+
+ //! Returns a pointer to one past the last element.
+ E *end() { return m_pStop; }
+
+ //! Returns a pointer to one past the last element.
+ const E *end() const { return m_pStop; }
+
+ //! Returns a pointer to the last element.
+ E *rbegin() { return m_pStop-1; }
+
+ //! Returns a pointer to the last element.
+ const E *rbegin() const { return m_pStop-1; }
+
+ //! Returns a pointer to one before the first element.
+ E *rend() { return m_pStart-1; }
+
+ //! Returns a pointer to one before the first element.
+ const E *rend() const { return m_pStart-1; }
+
+ //! Returns a reference to the element at position \a i.
+ const E &operator[](INDEX i) const {
+ OGDF_ASSERT(m_low <= i && i <= m_high)
+ return m_vpStart[i];
+ }
+
+ //! Returns a reference to the element at position \a i.
+ E &operator[](INDEX i) {
+ OGDF_ASSERT(m_low <= i && i <= m_high)
+ return m_vpStart[i];
+ }
+
+ //! Swaps the elements at position \a i and \a j.
+ void swap(INDEX i, INDEX j) {
+ OGDF_ASSERT(m_low <= i && i <= m_high)
+ OGDF_ASSERT(m_low <= j && j <= m_high)
+
+ std::swap(m_vpStart[i], m_vpStart[j]);
+ }
+
+ //! Reinitializes the array to an array with empty index set.
+ void init() {
+ //init(0,-1);
+ deconstruct();
+ construct(0,-1);
+ }
+
+ //! Reinitializes the array to an array with index set [0..\a s-1].
+ /**
+ * Notice that the elements contained in the array get discarded!
+ */
+ void init(INDEX s) { init(0,s-1); }
+
+ //! Reinitializes the array to an array with index set [\a a..\a b].
+ /**
+ * Notice that the elements contained in the array get discarded!
+ */
+ void init(INDEX a, INDEX b) {
+ deconstruct();
+ construct(a,b);
+ initialize();
+ }
+
+ //! Reinitializes the array to an array with index set [\a a..\a b] and sets all entries to \a x.
+ void init(INDEX a, INDEX b, const E &x) {
+ deconstruct();
+ construct(a,b);
+ initialize(x);
+ }
+
+ //! Assignment operator.
+ Array<E,INDEX> &operator=(const Array<E,INDEX> &array2) {
+ deconstruct();
+ copy(array2);
+ return *this;
+ }
+
+ //! Sets all elements to \a x.
+ void fill(const E &x) {
+ E *pDest = m_pStop;
+ while(pDest > m_pStart)
+ *--pDest = x;
+ }
+
+ //! Sets elements in the intervall [\a i..\a j] to \a x.
+ void fill(INDEX i, INDEX j, const E &x) {
+ OGDF_ASSERT(m_low <= i && i <= m_high)
+ OGDF_ASSERT(m_low <= j && j <= m_high)
+
+ E *pI = m_vpStart + i, *pJ = m_vpStart + j+1;
+ while(pJ > pI)
+ *--pJ = x;
+ }
+
+ //! Enlarges the array by \a add elements and sets new elements to \a x.
+ /**
+ * Note: address of array entries in memory may change!
+ * @param add is the number of additional elements; \a add can be negative in order to shrink the array.
+ * @param x is the inital value of all new elements.
+ */
+ void grow(INDEX add, const E &x);
+
+ //! Enlarges the array by \a add elements.
+ /**
+ * Note: address of array entries in memory may change!
+ * @param add is the number of additional elements; \a add can be negative in order to shrink the array.
+ */
+ void grow(INDEX add);
+
+ //! Randomly permutes the subarray with index set [\a l..\a r].
+ void permute (INDEX l, INDEX r);
+
+ //! Randomly permutes the array.
+ void permute() {
+ permute(low(), high());
+ }
+
+ //! Performs a binary search for element \a x.
+ /**
+ * \pre The array must be sorted!
+ * \return the index of the found element, and low()-1 if not found.
+ */
+ inline int binarySearch (const E& x) const {
+ return binarySearch(x, StdComparer<E>());
+ }
+
+ //! Performs a binary search for element \a x with comparer \a comp.
+ /**
+ * \pre The array must be sorted according to \a comp!
+ * \return the index of the found element, and low()-1 if not found.
+ */
+ template<class COMPARER>
+ int binarySearch(const E& e, const COMPARER &comp) const {
+ if(size() < 2) {
+ if(size() == 1 && comp.equal(e, m_vpStart[low()]))
+ return low();
+ return low()-1;
+ }
+ int l = low();
+ int r = high();
+ do {
+ int m = (r + l)/2;
+ if(comp.greater(e, m_vpStart[m]))
+ l = m+1;
+ else
+ r = m;
+ } while(r>l);
+ return comp.equal(e, m_vpStart[l]) ? l : low()-1;
+ }
+
+ //! Performs a linear search for element \a x.
+ /**
+ * Warning: This method has linear running time!
+ * Note that the linear search runs from back to front.
+ * \return the index of the found element, and low()-1 if not found.
+ */
+ inline int linearSearch (const E& e) const {
+ int i;
+ for(i = size(); i-->0;)
+ if(e == m_pStart[i]) break;
+ return i+low(); }
+
+ //! Performs a linear search for element \a x with comparer \a comp.
+ /**
+ * Warning: This method has linear running time!
+ * Note that the linear search runs from back to front.
+ * \return the index of the found element, and low()-1 if not found.
+ */
+ template<class COMPARER>
+ int linearSearch(const E& e, const COMPARER &comp) const {
+ int i;
+ for(i = size(); i-->0;)
+ if(comp.equal(e, m_pStart[i])) break;
+ return i+low();
+ }
+
+ //! Sorts array using Quicksort.
+ inline void quicksort() {
+ quicksort(StdComparer<E>());
+ }
+
+ //! Sorts subarray with index set [\a l..\a r] using Quicksort.
+ inline void quicksort(INDEX l, INDEX r) {
+ quicksort(l, r, StdComparer<E>());
+ }
+
+ //! Sorts array using Quicksort and a user-defined comparer \a comp.
+ /**
+ * @param comp is a user-defined comparer; \a C must be a class providing a \a less(x,y) method.
+ */
+ template<class COMPARER>
+ inline void quicksort(const COMPARER &comp) {
+ if(low() < high())
+ quicksortInt(m_pStart,m_pStop-1,comp);
+ }
+
+ //! Sorts the subarray with index set [\a l..\a r] using Quicksort and a user-defined comparer \a comp.
+ /**
+ * @param l is the left-most position in the range to be sorted.
+ * @param r is the right-most position in the range to be sorted.
+ * @param comp is a user-defined comparer; \a C must be a class providing a \a less(x,y) method.
+ */
+ template<class COMPARER>
+ void quicksort(INDEX l, INDEX r, const COMPARER &comp) {
+ OGDF_ASSERT(low() <= l && l <= high())
+ OGDF_ASSERT(low() <= r && r <= high())
+ if(l < r)
+ quicksortInt(m_vpStart+l,m_vpStart+r,comp);
+ }
+
+ template<class F, class I> friend class ArrayBuffer; // for efficient ArrayBuffer::compact-method
+
+private:
+ E *m_vpStart; //!< The virtual start of the array (address of A[0]).
+ E *m_pStart; //!< The real start of the array (address of A[m_low]).
+ E *m_pStop; //!< Successor of last element (address of A[m_high+1]).
+ INDEX m_low; //!< The lowest index.
+ INDEX m_high; //!< The highest index.
+
+ //! Allocates new array with index set [\a a..\a b].
+ void construct(INDEX a, INDEX b);
+
+ //! Initializes elements with default constructor.
+ void initialize();
+
+ //! Initializes elements with \a x.
+ void initialize(const E &x);
+
+ //! Deallocates array.
+ void deconstruct();
+
+ //! Constructs a new array which is a copy of \a A.
+ void copy(const Array<E,INDEX> &A);
+
+ //! Internal Quicksort implementation with comparer template.
+ template<class COMPARER>
+ static void quicksortInt(E *pL, E *pR, const COMPARER &comp) {
+ size_t s = pR-pL;
+
+ // use insertion sort for small instances
+ if (s < maxSizeInsertionSort) {
+ for (E *pI = pL+1; pI <= pR; pI++) {
+ E v = *pI;
+ E *pJ = pI;
+ while (--pJ >= pL && comp.less(v,*pJ)) {
+ *(pJ+1) = *pJ;
+ }
+ *(pJ+1) = v;
+ }
+ return;
+ }
+
+ E *pI = pL, *pJ = pR;
+ E x = *(pL+(s>>1));
+
+ do {
+ while (comp.less(*pI,x)) pI++;
+ while (comp.less(x,*pJ)) pJ--;
+ if (pI <= pJ) std::swap(*pI++,*pJ--);
+ } while (pI <= pJ);
+
+ if (pL < pJ) quicksortInt(pL,pJ,comp);
+ if (pI < pR) quicksortInt(pI,pR,comp);
+ }
+
+ OGDF_NEW_DELETE
+}; // class Array
+
+
+
+
+// enlarges array by add elements and sets new elements to x
+template<class E, class INDEX>
+void Array<E,INDEX>::grow(INDEX add, const E &x)
+{
+ INDEX sOld = size(), sNew = sOld + add;
+
+ // expand allocated memory block
+ if(m_pStart != 0) {
+ E *p = (E *)realloc(m_pStart, sNew*sizeof(E));
+ if(p == 0) OGDF_THROW(InsufficientMemoryException);
+ m_pStart = p;
+ } else {
+ m_pStart = (E *)malloc(sNew*sizeof(E));
+ if (m_pStart == 0) OGDF_THROW(InsufficientMemoryException);
+ }
+
+ m_vpStart = m_pStart-m_low;
+ m_pStop = m_pStart+sNew;
+ m_high += add;
+
+ // initialize new array entries
+ for (E *pDest = m_pStart+sOld; pDest < m_pStop; pDest++)
+ new (pDest) E(x);
+}
+
+// enlarges array by add elements (initialized with default constructor)
+template<class E, class INDEX>
+void Array<E,INDEX>::grow(INDEX add)
+{
+ INDEX sOld = size(), sNew = sOld + add;
+
+ // expand allocated memory block
+ if(m_pStart != 0) {
+ E *p = (E *)realloc(m_pStart, sNew*sizeof(E));
+ if(p == 0) OGDF_THROW(InsufficientMemoryException);
+ m_pStart = p;
+ } else {
+ m_pStart = (E *)malloc(sNew*sizeof(E));
+ if (m_pStart == 0) OGDF_THROW(InsufficientMemoryException);
+ }
+
+ m_vpStart = m_pStart-m_low;
+ m_pStop = m_pStart+sNew;
+ m_high += add;
+
+ // initialize new array entries
+ for (E *pDest = m_pStart+sOld; pDest < m_pStop; pDest++)
+ new (pDest) E;
+}
+
+template<class E, class INDEX>
+void Array<E,INDEX>::construct(INDEX a, INDEX b)
+{
+ m_low = a; m_high = b;
+ INDEX s = b-a+1;
+
+ if (s < 1) {
+ m_pStart = m_vpStart = m_pStop = 0;
+
+ } else {
+ m_pStart = (E *)malloc(s*sizeof(E));
+ if (m_pStart == 0) OGDF_THROW(InsufficientMemoryException);
+
+ m_vpStart = m_pStart - a;
+ m_pStop = m_pStart + s;
+ }
+}
+
+
+template<class E, class INDEX>
+void Array<E,INDEX>::initialize()
+{
+ E *pDest = m_pStart;
+ try {
+ for (; pDest < m_pStop; pDest++)
+ new(pDest) E;
+ } catch (...) {
+ while(--pDest >= m_pStart)
+ pDest->~E();
+ free(m_pStart);
+ throw;
+ }
+}
+
+
+template<class E, class INDEX>
+void Array<E,INDEX>::initialize(const E &x)
+{
+ E *pDest = m_pStart;
+ try {
+ for (; pDest < m_pStop; pDest++)
+ new(pDest) E(x);
+ } catch (...) {
+ while(--pDest >= m_pStart)
+ pDest->~E();
+ free(m_pStart);
+ throw;
+ }
+}
+
+
+template<class E, class INDEX>
+void Array<E,INDEX>::deconstruct()
+{
+ if (doDestruction((E*)0)) {
+ for (E *pDest = m_pStart; pDest < m_pStop; pDest++)
+ pDest->~E();
+ }
+ free(m_pStart);
+}
+
+
+template<class E, class INDEX>
+void Array<E,INDEX>::copy(const Array<E,INDEX> &array2)
+{
+ construct(array2.m_low, array2.m_high);
+
+ if (m_pStart != 0) {
+ E *pSrc = array2.m_pStop;
+ E *pDest = m_pStop;
+ while(pDest > m_pStart)
+ //*--pDest = *--pSrc;
+ new (--pDest) E(*--pSrc);
+ }
+}
+
+
+// permutes array a from a[l] to a[r] randomly
+template<class E, class INDEX>
+void Array<E,INDEX>::permute (INDEX l, INDEX r)
+{
+ OGDF_ASSERT(low() <= l && l <= high())
+ OGDF_ASSERT(low() <= r && r <= high())
+
+ E *pI = m_vpStart+l, *pStart = m_vpStart+l, *pStop = m_vpStart+r;
+ while(pI <= pStop)
+ std::swap(*pI++,*(pStart+randomNumber(0,r-l)));
+}
+
+
+// prints array a to output stream os using delimiter delim
+template<class E, class INDEX>
+void print(ostream &os, const Array<E,INDEX> &a, char delim = ' ')
+{
+ for (int i = a.low(); i <= a.high(); i++) {
+ if (i > a.low()) os << delim;
+ os << a[i];
+ }
+}
+
+
+// output operator
+template<class E, class INDEX>
+ostream &operator<<(ostream &os, const ogdf::Array<E,INDEX> &a)
+{
+ print(os,a);
+ return os;
+}
+
+} // end namespace ogdf
+
+
+#endif
diff --git a/ogdf/basic/Array2D.h b/ogdf/basic/Array2D.h
new file mode 100644
index 0000000..1a64c29
--- /dev/null
+++ b/ogdf/basic/Array2D.h
@@ -0,0 +1,327 @@
+/*
+ * $Revision: 2615 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-16 14:23:36 +0200 (Mo, 16. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration and implementation of class Array2D which
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_ARRAY2D_H
+#define OGDF_ARRAY2D_H
+
+
+
+
+#include "basic.h"
+#include <math.h>
+
+
+namespace ogdf {
+
+
+//! The parameterized class \a Array2D<E> implements dynamic two-dimensional arrays.
+/**
+ * @tparam E denotes the element type.
+ */
+template<class E> class Array2D
+{
+public:
+ // constructors
+
+ //! Creates a two-dimensional array with empty index set.
+ Array2D() { construct(0,-1,0,-1); }
+
+ //! Creates a two-dimensional array with index set [\a a..\a b]*[\a c..\a d].
+ Array2D(int a, int b, int c, int d) {
+ construct(a,b,c,d); initialize();
+ }
+
+ //! Creates a two-dimensional array with index set [\a a..\a b]*[\a c..\a d] and initailizes all elements with \a x.
+ Array2D(int a, int b, int c, int d, const E &x) {
+ construct(a,b,c,d); initialize(x);
+ }
+
+ //! Creates a two-dimensional array that is a copy of \a A.
+ Array2D(const Array2D<E> &array2) {
+ copy(array2);
+ }
+
+ // destructor
+ ~Array2D() {
+ deconstruct();
+ }
+
+ //! Returns the minimal array index in dimension 1.
+ int low1() const { return m_a; }
+
+ //! Returns the maximal array index in dimension 1.
+ int high1() const { return m_b; }
+
+ //! Returns the minimal array index in dimension 2.
+ int low2() const { return m_c; }
+
+ //! Returns the maximal array index in dimension 2.
+ int high2() const { return m_d; }
+
+ //! Returns the size (number of elements) of the array.
+ int size() const { return size1() * size2(); }
+
+ //! Returns the length of the index interval (number of entries) in dimension 1.
+ int size1() const { return m_b - m_a + 1; }
+
+ //! Returns the length of the index interval (number of entries) in dimension 2.
+ int size2() const { return m_lenDim2; }
+
+ //! Returns the determinant of the matrix
+ /*! \note use only for square matrices and floating point values */
+ float det() const;
+
+ //! Returns a reference to the element with index (\a i,\a j).
+ const E &operator()(int i, int j) const {
+ OGDF_ASSERT(m_a <= i && i <= m_b && m_c <= j && j <= m_d);
+ return m_vpStart[(i-m_a)*m_lenDim2+j];
+ }
+
+ //! Returns a reference to the element with index (\a i,\a j).
+ E &operator()(int i, int j) {
+ OGDF_ASSERT(m_a <= i && i <= m_b && m_c <= j && j <= m_d);
+ return m_vpStart[(i-m_a)*m_lenDim2+j];
+ }
+
+ //! Reinitializes the array to an array with empty index set.
+ void init() { init(0,-1,0,-1); }
+
+ //! Reinitializes the array to an array with index set [\a a..\a b]*[\a c,\a d].
+ void init(int a, int b, int c, int d) {
+ deconstruct();
+ construct(a,b,c,d);
+ initialize();
+ }
+
+ //! Reinitializes the array to an array with index set [\a a..\a b]*[\a c,\a d] and initializes all entries with \a x.
+ void init(int a, int b, int c, int d, const E &x) {
+ deconstruct();
+ construct(a,b,c,d);
+ initialize(x);
+ }
+
+ //! Assignment operator.
+ Array2D<E> &operator=(const Array2D<E> &array2) {
+ deconstruct();
+ copy(array2);
+ return *this;
+ }
+
+ //! Sets all elements to \a x.
+ void fill(const E &x) {
+ E *pDest = m_pStop;
+ while(pDest > m_pStart)
+ *--pDest = x;
+ }
+
+private:
+ E *m_vpStart; //!< The virtual start of the array (address of A[0,0]).
+ int m_a; //!< The lowest index in dimension 1.
+ int m_lenDim2; //!< The number of elements in dimension 2.
+ E *m_pStart; //!< The real start of the array (address of A[low1,low2]).
+ E *m_pStop; //!< Successor of last element (address of A[high1,high2+1]).
+ int m_b; //!< The highest index in dimension 1.
+ int m_c; //!< The lowest index in dimension 2.
+ int m_d; //!< The highest index in dimension 2.
+
+ void construct(int a, int b, int c, int d);
+
+ void initialize();
+ void initialize(const E &x);
+
+ void deconstruct();
+
+ void copy(const Array2D<E> &array2);
+
+};
+
+
+
+template<class E>
+void Array2D<E>::construct(int a, int b, int c, int d)
+{
+ m_a = a;
+ m_b = b;
+ m_c = c;
+ m_d = d;
+
+ int lenDim1 = b-a+1;
+ m_lenDim2 = d-c+1;
+
+ if (lenDim1 < 1 || m_lenDim2 < 1) {
+ m_pStart = m_vpStart = m_pStop = 0;
+
+ } else {
+ int len = lenDim1*m_lenDim2;
+ m_pStart = (E *)malloc(len*sizeof(E));
+ if (m_pStart == 0)
+ OGDF_THROW(InsufficientMemoryException);
+
+ m_vpStart = m_pStart - c;
+ m_pStop = m_pStart + len;
+ }
+}
+
+
+template<class E>
+void Array2D<E>::initialize()
+{
+ E *pDest = m_pStart;
+ try {
+ for (; pDest < m_pStop; pDest++)
+ new(pDest) E;
+ } catch (...) {
+ while(--pDest >= m_pStart)
+ pDest->~E();
+ free(m_pStart);
+ throw;
+ }
+}
+
+
+template<class E>
+void Array2D<E>::initialize(const E &x)
+{
+ E *pDest = m_pStart;
+ try {
+ for (; pDest < m_pStop; pDest++)
+ new(pDest) E(x);
+ } catch (...) {
+ while(--pDest >= m_pStart)
+ pDest->~E();
+ free(m_pStart);
+ throw;
+ }
+}
+
+
+template<class E>
+void Array2D<E>::deconstruct()
+{
+ if (doDestruction((E*)0)) {
+ for (E *pDest = m_pStart; pDest < m_pStop; pDest++)
+ pDest->~E();
+ }
+ free(m_pStart);
+}
+
+
+template<class E>
+void Array2D<E>::copy(const Array2D<E> &array2)
+{
+ construct(array2.m_a, array2.m_b, array2.m_c, array2.m_d);
+
+ if (m_pStart != 0) {
+ E *pSrc = array2.m_pStop;
+ E *pDest = m_pStop;
+ while(pDest > m_pStart)
+ new (--pDest) E(*--pSrc);
+ }
+}
+
+
+
+template<class E>
+float Array2D<E>::det() const
+{
+ int a = m_a;
+ int b = m_b;
+ int c = m_c;
+ int d = m_d;
+// int m = m_b - m_a + 1;
+ int n = m_lenDim2;
+
+ int i, j;
+ int rem_i, rem_j, column;
+
+ float determinant = 0.0;
+
+// OGDF_ASSERT(m == n);
+
+ switch(n) {
+ case 0:
+ break;
+ case 1:
+ determinant = (float)((*this)(a, c));
+ break;
+ case 2:
+ determinant = (float)((*this)(a, c) * (*this)(b, d) - (*this)(a, d) * (*this)(b, c));
+ break;
+
+ // Expanding along the first row (Laplace's Formula)
+ default:
+ Array2D<E> remMatrix(0, n-2, 0, n-2); // the remaining matrix
+ for(column = c; column <= d; column++) {
+ rem_i = 0;
+ rem_j = 0;
+ for(i = a; i <= b; i++) {
+ for(j = c; j <= d; j++) {
+ if(i != a && j != column) {
+ remMatrix(rem_i, rem_j) = (*this)(i, j);
+ if(rem_j < n-2) {
+ rem_j++;
+ }
+ else {
+ rem_i++;
+ rem_j = 0;
+ }
+ }
+ }
+ }
+ determinant += pow(-1.0,(a+column)) * (*this)(a,column) * remMatrix.det();
+ }
+ }
+
+ return determinant;
+}
+
+
+
+} // end namespace ogdf
+
+
+#endif
diff --git a/ogdf/basic/BoundedStack.h b/ogdf/basic/BoundedStack.h
new file mode 100644
index 0000000..d8f4355
--- /dev/null
+++ b/ogdf/basic/BoundedStack.h
@@ -0,0 +1,211 @@
+/*
+ * $Revision: 2615 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-16 14:23:36 +0200 (Mo, 16. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration and implementation of bounded stack class.
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_B_STACK_H
+#define OGDF_B_STACK_H
+
+
+
+
+#include "basic.h"
+
+
+namespace ogdf {
+
+template<class E, class INDEX> class BoundedStack;
+
+// output
+template<class E, class INDEX>
+void print(ostream &os, const BoundedStack<E,INDEX> &S, char delim = ' ');
+
+
+//! The parameterized class \a BoundedStack<E,INDEX> implements stacks with bounded size.
+/**
+ * @tparam E is the element type.
+ * @tparam INDEX is the index type. The default index type is \c int, other possible types
+ * are \c short and <code>long long</code> (on 64-bit systems).
+ */
+template<class E, class INDEX = int> class BoundedStack {
+
+ E *m_pTop; //!< Pointer to top element.
+ E *m_pStart; //!< Pointer to first element.
+ E *m_pStop; //!< Pointer to one past last element.
+
+public:
+ //! Constructs an empty bounded stack for no elements at all.
+ /**
+ * The default constructor does not allocate any space for elements; before
+ * using the stack, it is required to initialize the stack with init().
+ */
+ BoundedStack() {
+ m_pTop = m_pStart = m_pStop = 0;
+ }
+
+ //! Constructs an empty bounded stack for at most \a n elements.
+ explicit BoundedStack(INDEX n) {
+ OGDF_ASSERT(n >= 1)
+ m_pStart = new E[n];
+ if (m_pStart == 0) OGDF_THROW(InsufficientMemoryException);
+ m_pTop = m_pStart - 1;
+ m_pStop = m_pStart+n;
+ }
+
+ //! Constructs a bounded stack that is a copy of \a S.
+ BoundedStack(const BoundedStack<E> &S) {
+ copy(S);
+ }
+
+ // destruction
+ ~BoundedStack() {
+ delete [] m_pStart;
+ }
+
+ //! Returns top element.
+ const E &top() const {
+ OGDF_ASSERT(m_pTop != m_pStart-1)
+ return *m_pTop;
+ }
+
+ //! Returns top element.
+ E &top() {
+ OGDF_ASSERT(m_pTop != m_pStart-1)
+ return *m_pTop;
+ }
+
+ //! Returns current size of the stack.
+ INDEX size() const { return m_pTop - (m_pStart-1); }
+
+ //! Returns true iff the stack is empty.
+ bool empty() { return m_pTop == (m_pStart-1); }
+
+ //! Returns true iff the stack is full.
+ bool full() { return m_pTop == (m_pStop-1); }
+
+ //! Returns true iff the stack was initialized.
+ bool valid() const { return m_pStart != 0; }
+
+ //! Returns the capacity of the bounded stack.
+ INDEX capacity() const { return m_pStop - m_pStart; }
+
+ //! Reinitializes the stack for no elements at all (actually frees memory).
+ void init() {
+ delete [] m_pStart;
+ m_pTop = m_pStart = m_pStart = 0;
+ }
+
+ //! Reinitializes the stack for \a n elements.
+ void init(INDEX n) {
+ OGDF_ASSERT(n >= 1)
+
+ delete [] m_pStart;
+
+ m_pStart = new E[n];
+ if (m_pStart == 0) OGDF_THROW(InsufficientMemoryException);
+ m_pTop = m_pStart - 1;
+ m_pStop = m_pStart+n;
+ }
+
+ //! Assignment operator.
+ BoundedStack<E> &operator=(const BoundedStack &S) {
+ delete [] m_pStart;
+ copy(S);
+ return *this;
+ }
+
+ //! Adds element \a x as top-most element to the stack.
+ void push(const E &x) {
+ OGDF_ASSERT(m_pTop != m_pStop-1)
+ *++m_pTop = x;
+ }
+
+ //! Removes the top-most element from the stack and returns it.
+ E pop() {
+ OGDF_ASSERT(m_pTop != (m_pStart-1))
+ return *m_pTop--;
+ }
+
+ //! Makes the stack empty.
+ void clear() { m_pTop = m_pStart-1; }
+
+ //! Prints the stack to output stream \a os.
+ void print(ostream &os, char delim = ' ') const
+ {
+ for (const E *pX = m_pStart; pX != m_pTop; )
+ os << *++pX << delim;
+ }
+
+private:
+ void copy(const BoundedStack<E> &S)
+ {
+ if(!S.valid()) {
+ m_pTop = m_pStart = m_pStop = 0;
+ } else {
+ INDEX sz = S.m_pStop - S.m_pStart;
+ m_pStart = new E[sz+1];
+ if (m_pStart == 0) OGDF_THROW(InsufficientMemoryException);
+ m_pStop = m_pStart + sz;
+ m_pTop = m_pStart-1;
+ for (E *pX = S.m_pStart-1; pX != S.m_pTop; )
+ *++m_pTop = *++pX;
+ }
+ }
+}; // class BoundedStack
+
+
+
+// output operator
+template<class E, class INDEX>
+ostream &operator<<(ostream &os, const BoundedStack<E,INDEX> &S)
+{
+ S.print(os);
+ return os;
+}
+
+} // end namespace ogdf
+
+
+#endif
diff --git a/ogdf/basic/CombinatorialEmbedding.cpp b/ogdf/basic/CombinatorialEmbedding.cpp
new file mode 100644
index 0000000..1599a2a
--- /dev/null
+++ b/ogdf/basic/CombinatorialEmbedding.cpp
@@ -0,0 +1,630 @@
+/*
+ * $Revision: 2555 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-06 12:12:10 +0200 (Fr, 06. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of class CombinatorialEmbedding
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "CombinatorialEmbedding.h"
+#include "FaceArray.h"
+
+
+#define MIN_FACE_TABLE_SIZE (1 << 4)
+
+
+namespace ogdf {
+
+ConstCombinatorialEmbedding::ConstCombinatorialEmbedding()
+{
+ m_cpGraph = 0;
+ m_externalFace = 0;
+ m_nFaces = m_faceIdCount = 0;
+ m_faceArrayTableSize = MIN_FACE_TABLE_SIZE;
+}
+
+
+ConstCombinatorialEmbedding::ConstCombinatorialEmbedding(const Graph &G) :
+ m_cpGraph(&G), m_rightFace(G,0)
+{
+ computeFaces();
+}
+
+ConstCombinatorialEmbedding::ConstCombinatorialEmbedding(
+ const ConstCombinatorialEmbedding &C)
+ : m_cpGraph(C.m_cpGraph), m_rightFace(*C.m_cpGraph,0)
+{
+ computeFaces();
+
+ if(C.m_externalFace == 0)
+ m_externalFace = 0;
+ else
+ m_externalFace = m_rightFace[C.m_externalFace->firstAdj()];
+}
+
+ConstCombinatorialEmbedding &ConstCombinatorialEmbedding::operator=(
+ const ConstCombinatorialEmbedding &C)
+{
+ init(*C.m_cpGraph);
+
+ if(C.m_externalFace == 0)
+ m_externalFace = 0;
+ else
+ m_externalFace = m_rightFace[C.m_externalFace->firstAdj()];
+
+ return *this;
+}
+
+void ConstCombinatorialEmbedding::init(const Graph &G)
+{
+ m_cpGraph = &G;
+ m_rightFace.init(G,0);
+ computeFaces();
+}
+
+
+void ConstCombinatorialEmbedding::init()
+{
+ m_cpGraph = 0;
+ m_externalFace = 0;
+ m_nFaces = m_faceIdCount = 0;
+ m_faceArrayTableSize = MIN_FACE_TABLE_SIZE;
+ m_rightFace.init();
+ m_faces.clear();
+
+ reinitArrays();
+}
+
+
+void ConstCombinatorialEmbedding::computeFaces()
+{
+ m_externalFace = 0; // no longer valid!
+ m_faceIdCount = 0;
+ m_faces.clear();
+
+ m_rightFace.fill(0);
+
+ node v;
+ forall_nodes(v,*m_cpGraph) {
+ adjEntry adj;
+ forall_adj(adj,v) {
+ if (m_rightFace[adj]) continue;
+
+#ifdef OGDF_DEBUG
+ face f = OGDF_NEW FaceElement(this,adj,m_faceIdCount++);
+#else
+ face f = OGDF_NEW FaceElement(adj,m_faceIdCount++);
+#endif
+
+ m_faces.pushBack(f);
+
+ adjEntry adj2 = adj;
+ do {
+ m_rightFace[adj2] = f;
+ f->m_size++;
+ adj2 = adj2->faceCycleSucc();
+ } while (adj2 != adj);
+ }
+ }
+
+ m_nFaces = m_faceIdCount;
+ m_faceArrayTableSize = Graph::nextPower2(MIN_FACE_TABLE_SIZE,m_faceIdCount);
+ reinitArrays();
+
+ OGDF_ASSERT_IF(dlConsistencyChecks, consistencyCheck());
+}
+
+
+face ConstCombinatorialEmbedding::createFaceElement(adjEntry adjFirst)
+{
+ if (m_faceIdCount == m_faceArrayTableSize) {
+ m_faceArrayTableSize <<= 1;
+ for(ListIterator<FaceArrayBase*> it = m_regFaceArrays.begin();
+ it.valid(); ++it)
+ {
+ (*it)->enlargeTable(m_faceArrayTableSize);
+ }
+ }
+
+#ifdef OGDF_DEBUG
+ face f = OGDF_NEW FaceElement(this,adjFirst,m_faceIdCount++);
+#else
+ face f = OGDF_NEW FaceElement(adjFirst,m_faceIdCount++);
+#endif
+
+ m_faces.pushBack(f);
+ m_nFaces++;
+
+ return f;
+}
+
+
+edge CombinatorialEmbedding::split(edge e)
+{
+ face f1 = m_rightFace[e->adjSource()];
+ face f2 = m_rightFace[e->adjTarget()];
+
+ edge e2 = m_pGraph->split(e);
+
+ m_rightFace[e->adjSource()] = m_rightFace[e2->adjSource()] = f1;
+ f1->m_size++;
+ m_rightFace[e->adjTarget()] = m_rightFace[e2->adjTarget()] = f2;
+ f2->m_size++;
+
+ OGDF_ASSERT_IF(dlConsistencyChecks, consistencyCheck());
+
+ return e2;
+}
+
+
+void CombinatorialEmbedding::unsplit(edge eIn, edge eOut)
+{
+ face f1 = m_rightFace[eIn->adjSource()];
+ face f2 = m_rightFace[eIn->adjTarget()];
+
+ --f1->m_size;
+ --f2->m_size;
+
+ if (f1->m_adjFirst == eOut->adjSource())
+ f1->m_adjFirst = eIn->adjSource();
+
+ if (f2->m_adjFirst == eIn->adjTarget())
+ f2->m_adjFirst = eOut->adjTarget();
+
+ m_pGraph->unsplit(eIn,eOut);
+}
+
+
+node CombinatorialEmbedding::splitNode(adjEntry adjStartLeft, adjEntry adjStartRight)
+{
+ face fL = leftFace(adjStartLeft);
+ face fR = leftFace(adjStartRight);
+
+ node u = m_pGraph->splitNode(adjStartLeft,adjStartRight);
+
+ adjEntry adj = adjStartLeft->cyclicPred();
+
+ m_rightFace[adj] = fL;
+ ++fL->m_size;
+ m_rightFace[adj->twin()] = fR;
+ ++fR->m_size;
+
+ OGDF_ASSERT_IF(dlConsistencyChecks, consistencyCheck());
+
+ return u;
+}
+
+
+node CombinatorialEmbedding::contract(edge e)
+{
+ // Since we remove face e, we also remove adjSrc and adjTgt.
+ // We make sure that node of them is stored as first adjacency
+ // entry of a face.
+ adjEntry adjSrc = e->adjSource();
+ adjEntry adjTgt = e->adjTarget();
+
+ face fSrc = m_rightFace[adjSrc];
+ face fTgt = m_rightFace[adjTgt];
+
+ if(fSrc->m_adjFirst == adjSrc) {
+ adjEntry adj = adjSrc->faceCycleSucc();
+ fSrc->m_adjFirst = (adj != adjTgt) ? adj : adj->faceCycleSucc();
+ }
+
+ if(fTgt->m_adjFirst == adjTgt) {
+ adjEntry adj = adjTgt->faceCycleSucc();
+ fTgt->m_adjFirst = (adj != adjSrc) ? adj : adj->faceCycleSucc();
+ }
+
+ node v = m_pGraph->contract(e);
+ --fSrc->m_size;
+ --fTgt->m_size;
+
+ OGDF_ASSERT_IF(dlConsistencyChecks, consistencyCheck());
+
+ return v;
+}
+
+
+edge CombinatorialEmbedding::splitFace(adjEntry adjSrc, adjEntry adjTgt)
+{
+ OGDF_ASSERT(m_rightFace[adjSrc] == m_rightFace[adjTgt])
+ OGDF_ASSERT(adjSrc != adjTgt)
+
+ edge e = m_pGraph->newEdge(adjSrc,adjTgt);
+
+ face f1 = m_rightFace[adjTgt];
+ face f2 = createFaceElement(adjSrc);
+
+ adjEntry adj = adjSrc;
+ do {
+ m_rightFace[adj] = f2;
+ f2->m_size++;
+ adj = adj->faceCycleSucc();
+ } while (adj != adjSrc);
+
+ f1->m_adjFirst = adjTgt;
+ f1->m_size += (2 - f2->m_size);
+ m_rightFace[e->adjSource()] = f1;
+
+ OGDF_ASSERT_IF(dlConsistencyChecks, consistencyCheck());
+
+ return e;
+}
+
+//special version of the above function doing a pushback of the new edge
+//on the adjacency list of v making it possible to insert new degree 0
+//nodes into a face
+edge CombinatorialEmbedding::splitFace(node v, adjEntry adjTgt)
+{
+ adjEntry adjSrc = v->lastAdj();
+ edge e = 0;
+ bool degZ = v->degree() == 0;
+ if (degZ) {
+ e = m_pGraph->newEdge(v, adjTgt);
+ }
+ else
+ {
+ OGDF_ASSERT(m_rightFace[adjSrc] == m_rightFace[adjTgt])
+ OGDF_ASSERT(adjSrc != adjTgt)
+ e = m_pGraph->newEdge(adjSrc,adjTgt); //could use ne(v,ad) here, too
+ }
+
+ face f1 = m_rightFace[adjTgt];
+ //if v already had an adjacent edge, we split the face in two faces
+ int subSize = 0;
+ if (!degZ)
+ {
+ face f2 = createFaceElement(adjSrc);
+
+ adjEntry adj = adjSrc;
+ do
+ {
+ m_rightFace[adj] = f2;
+ f2->m_size++;
+ adj = adj->faceCycleSucc();
+ } while (adj != adjSrc);
+ subSize = f2->m_size;
+ }//if not zero degree
+ else
+ {
+ m_rightFace[e->adjTarget()] = f1;
+ }
+
+ f1->m_adjFirst = adjTgt;
+ f1->m_size += (2 - subSize);
+ m_rightFace[e->adjSource()] = f1;
+
+ OGDF_ASSERT_IF(dlConsistencyChecks, consistencyCheck());
+
+ return e;
+}//splitface
+//--
+//-----------------
+//incremental stuff
+//special version of the above function doing a pushback of the new edge
+//on the adjacency list of v making it possible to insert new degree 0
+//nodes into a face, end node v
+edge CombinatorialEmbedding::splitFace(adjEntry adjSrc, node v)
+{
+ adjEntry adjTgt = v->lastAdj();
+ edge e = 0;
+ bool degZ = v->degree() == 0;
+ if (degZ)
+ {
+ e = m_pGraph->newEdge(adjSrc, v);
+ }
+ else
+ {
+ OGDF_ASSERT(m_rightFace[adjSrc] == m_rightFace[adjTgt])
+ OGDF_ASSERT(adjSrc != adjTgt)
+ e = m_pGraph->newEdge(adjSrc, adjTgt); //could use ne(v,ad) here, too
+ }
+
+ face f1 = m_rightFace[adjSrc];
+ //if v already had an adjacent edge, we split the face in two faces
+ int subSize = 0;
+ if (!degZ)
+ {
+ face f2 = createFaceElement(adjTgt);
+
+ adjEntry adj = adjTgt;
+ do
+ {
+ m_rightFace[adj] = f2;
+ f2->m_size++;
+ adj = adj->faceCycleSucc();
+ } while (adj != adjTgt);
+ subSize = f2->m_size;
+ }//if not zero degree
+ else
+ {
+ m_rightFace[e->adjSource()] = f1;
+ }
+
+ f1->m_adjFirst = adjSrc;
+ f1->m_size += (2 - subSize);
+ m_rightFace[e->adjTarget()] = f1;
+
+ OGDF_ASSERT_IF(dlConsistencyChecks, consistencyCheck());
+
+ return e;
+}//splitface
+
+//update face information after inserting a merger ith edge e in a copy graph
+void CombinatorialEmbedding::updateMerger(edge e, face fRight, face fLeft)
+{
+ //two cases: a single face/two faces
+ fRight->m_size++;
+ fLeft->m_size++;
+ m_rightFace[e->adjSource()] = fRight;
+ m_rightFace[e->adjTarget()] = fLeft;
+ //check for first adjacency entry
+ if (fRight != fLeft)
+ {
+ fRight->m_adjFirst = e->adjSource();
+ fLeft->m_adjFirst = e->adjTarget();
+ }//if
+}//updateMerger
+
+//--
+
+
+face CombinatorialEmbedding::joinFaces(edge e)
+{
+ OGDF_ASSERT(e->graphOf() == m_pGraph);
+
+ // get the two faces adjacent to e
+ face f1 = m_rightFace[e->adjSource()];
+ face f2 = m_rightFace[e->adjTarget()];
+
+ OGDF_ASSERT(f1 != f2);
+
+ // we will reuse the largest face and delete the other one
+ if (f2->m_size > f1->m_size)
+ swap(f1,f2);
+
+ // the size of the joined face is the sum of the sizes of the two faces
+ // f1 and f2 minus the two adjacency entries of e
+ f1->m_size += f2->m_size - 2;
+
+ // If the stored (first) adjacency entry of f1 belongs to e, we must set
+ // it to the next entry in the face, because we will remove it by deleting
+ // edge e
+ if (f1->m_adjFirst->theEdge() == e)
+ f1->m_adjFirst = f1->m_adjFirst->faceCycleSucc();
+
+ // each adjacency entry in f2 belongs now to f1
+ adjEntry adj1 = f2->firstAdj(), adj = adj1;
+ do {
+ m_rightFace[adj] = f1;
+ } while((adj = adj->faceCycleSucc()) != adj1);
+
+ m_pGraph->delEdge(e);
+
+ m_faces.del(f2);
+ --m_nFaces;
+
+ OGDF_ASSERT_IF(dlConsistencyChecks, consistencyCheck());
+
+ return f1;
+}
+
+
+void CombinatorialEmbedding::reverseEdge(edge e)
+{
+ // reverse edge in graph
+ m_pGraph->reverseEdge(e);
+
+ OGDF_ASSERT_IF(dlConsistencyChecks, consistencyCheck());
+}
+
+
+void CombinatorialEmbedding::moveBridge(adjEntry adjBridge, adjEntry adjBefore)
+{
+ OGDF_ASSERT(m_rightFace[adjBridge] == m_rightFace[adjBridge->twin()]);
+ OGDF_ASSERT(m_rightFace[adjBridge] != m_rightFace[adjBefore]);
+
+ face fOld = m_rightFace[adjBridge];
+ face fNew = m_rightFace[adjBefore];
+
+ adjEntry adjCand = adjBridge->faceCycleSucc();
+
+ int sz = 0;
+ adjEntry adj;
+ for(adj = adjBridge->twin(); adj != adjCand; adj = adj->faceCycleSucc()) {
+ if(fOld->m_adjFirst == adj)
+ fOld->m_adjFirst = adjCand;
+ m_rightFace[adj] = fNew;
+ ++sz;
+ }
+
+ fOld->m_size -= sz;
+ fNew->m_size += sz;
+
+ edge e = adjBridge->theEdge();
+ if(e->source() == adjBridge->twinNode())
+ m_pGraph->moveSource(e, adjBefore, after);
+ else
+ m_pGraph->moveTarget(e, adjBefore, after);
+
+ OGDF_ASSERT_IF(dlConsistencyChecks, consistencyCheck());
+}
+
+
+void CombinatorialEmbedding::removeDeg1(node v)
+{
+ OGDF_ASSERT(v->degree() == 1);
+
+ adjEntry adj = v->firstAdj();
+ face f = m_rightFace[adj];
+
+ if(f->m_adjFirst == adj || f->m_adjFirst == adj->twin())
+ f->m_adjFirst = adj->faceCycleSucc();
+ f->m_size -= 2;
+
+ m_pGraph->delNode(v);
+
+ OGDF_ASSERT_IF(dlConsistencyChecks, consistencyCheck());
+}
+
+
+void CombinatorialEmbedding::clear()
+{
+ m_pGraph->clear();
+
+ m_faces.clear();
+
+ m_nFaces = m_faceIdCount = 0;
+ m_faceArrayTableSize = MIN_FACE_TABLE_SIZE;
+ m_externalFace = 0;
+
+ reinitArrays();
+
+ OGDF_ASSERT_IF(dlConsistencyChecks, consistencyCheck());
+}
+
+
+face ConstCombinatorialEmbedding::chooseFace() const
+{
+ if (m_nFaces == 0) return 0;
+
+ int k = ogdf::randomNumber(0,m_nFaces-1);
+ face f = firstFace();
+ while(k--) f = f->succ();
+
+ return f;
+}
+
+
+face ConstCombinatorialEmbedding::maximalFace() const
+{
+ if (m_nFaces == 0) return 0;
+
+ face fMax = firstFace();
+ int max = fMax->size();
+
+ for(face f = fMax->succ(); f != 0; f = f->succ())
+ {
+ if (f->size() > max) {
+ max = f->size();
+ fMax = f;
+ }
+ }
+
+ return fMax;
+}
+
+
+ListIterator<FaceArrayBase*> ConstCombinatorialEmbedding::
+ registerArray(FaceArrayBase *pFaceArray) const
+{
+ return m_regFaceArrays.pushBack(pFaceArray);
+}
+
+
+void ConstCombinatorialEmbedding::unregisterArray(
+ ListIterator<FaceArrayBase*> it) const
+{
+ m_regFaceArrays.del(it);
+}
+
+
+void ConstCombinatorialEmbedding::reinitArrays()
+{
+ ListIterator<FaceArrayBase*> it = m_regFaceArrays.begin();
+ for(; it.valid(); ++it)
+ (*it)->reinit(m_faceArrayTableSize);
+}
+
+
+bool ConstCombinatorialEmbedding::consistencyCheck()
+{
+ if (m_cpGraph->consistencyCheck() == false)
+ return false;
+
+ if(m_cpGraph->representsCombEmbedding() == false)
+ return false;
+
+ AdjEntryArray<bool> visited(*m_cpGraph,false);
+ int nF = 0;
+
+ face f;
+ forall_faces(f,*this) {
+#ifdef OGDF_DEBUG
+ if (f->embeddingOf() != this)
+ return false;
+#endif
+
+ nF++;
+
+ adjEntry adj = f->firstAdj(), adj2 = adj;
+ int sz = 0;
+ do {
+ sz++;
+ if (visited[adj2] == true)
+ return false;
+
+ visited[adj2] = true;
+
+ if (m_rightFace[adj2] != f)
+ return false;
+
+ adj2 = adj2->faceCycleSucc();
+ } while(adj2 != adj);
+
+ if (f->size() != sz)
+ return false;
+ }
+
+ if (nF != m_nFaces)
+ return false;
+
+ node v;
+ forall_nodes(v,*m_cpGraph) {
+ adjEntry adj;
+ forall_adj(adj,v) {
+ if (visited[adj] == false)
+ return false;
+ }
+ }
+
+ return true;
+}
+
+} // end namespace ogdf
diff --git a/ogdf/basic/CombinatorialEmbedding.h b/ogdf/basic/CombinatorialEmbedding.h
new file mode 100644
index 0000000..7a37e86
--- /dev/null
+++ b/ogdf/basic/CombinatorialEmbedding.h
@@ -0,0 +1,486 @@
+/*
+ * $Revision: 2523 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-02 20:59:27 +0200 (Mon, 02 Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of CombinatorialEmbedding and face.
+ *
+ * Enriches graph by the notion of faces
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_COMBINATORIAL_EMBEDDING_H
+#define OGDF_COMBINATORIAL_EMBEDDING_H
+
+
+
+
+#include "AdjEntryArray.h"
+
+
+namespace ogdf {
+
+class OGDF_EXPORT ConstCombinatorialEmbedding;
+
+typedef FaceElement *face;
+
+/**
+ * \brief Faces in a combinatorial embedding.
+ */
+class OGDF_EXPORT FaceElement : private GraphElement
+{
+ friend class ConstCombinatorialEmbedding;
+ friend class CombinatorialEmbedding;
+ friend class GraphList<FaceElement>;
+
+ adjEntry m_adjFirst; //!< The first adjacency element in the face.
+ int m_id; //!< The index of the face.
+ int m_size; //!< The size of the face.
+
+#ifdef OGDF_DEBUG
+ const ConstCombinatorialEmbedding *m_pEmbedding;
+#endif
+
+ // constructor
+#ifdef OGDF_DEBUG
+ FaceElement(const ConstCombinatorialEmbedding *pEmbedding,
+ adjEntry adjFirst,
+ int id) :
+ m_adjFirst(adjFirst), m_id(id), m_size(0), m_pEmbedding(pEmbedding) { }
+#else
+ //! Creates a face with given first adjacency element \a adjFirst and face index \a id.
+ FaceElement(adjEntry adjFirst, int id) :
+ m_adjFirst(adjFirst), m_id(id), m_size(0) { }
+#endif
+
+public:
+ //! Returns the index of the face.
+ int index() const { return m_id; }
+
+ //! Returns the first adjacency element in the face.
+ adjEntry firstAdj() const { return m_adjFirst; }
+
+ //! Returns the size of the face, i.e., the number of edges in the face.
+ int size() const { return m_size; }
+
+ //! Returns the successor in the list of all faces.
+ face succ() const { return (face)m_next; }
+
+ //! Returns the predecessor in the list of all faces.
+ face pred() const { return (face)m_prev; }
+
+ //! Returns the successor of \a adj in the list of all adjacency elements in the face.
+ adjEntry nextFaceEdge(adjEntry adj) const {
+ adj = adj->faceCycleSucc();
+ return (adj != m_adjFirst) ? adj : 0;
+ }
+
+#ifdef OGDF_DEBUG
+ const ConstCombinatorialEmbedding *embeddingOf() const { return m_pEmbedding; }
+#endif
+
+ OGDF_NEW_DELETE
+}; // class FaceElement
+
+
+class FaceArrayBase;
+template<class T>class FaceArray;
+
+
+/**
+ * \brief Combinatorial embeddings of planar graphs.
+ *
+ * Maintains a combinatorial embedding of an embedded graph, i.e., the set of
+ * faces. A combinatorial embedding is defined by the (cyclic) order of the
+ * adjacency entries around a vertex; more precisely, the adjacency list
+ * gives the cyclic order of the adjacency entries in clockwise order.
+ * Each adjacency entry \a adj is contained in exactly one face, the face
+ * to the right of \a adj. The list of adjacency entries defining a face is given
+ * in clockwise order for internal faces, and in counter-clockwise order for the
+ * external face.
+ *
+ * \see CombinatorialEmbedding provides additional functionality for modifying
+ * the embedding.
+ */
+class OGDF_EXPORT ConstCombinatorialEmbedding
+{
+protected:
+ const Graph *m_cpGraph; //!< The associated graph.
+
+ GraphList<FaceElement> m_faces; //!< The list of all faces.
+ int m_nFaces; //!< The number of faces.
+ int m_faceIdCount; //!< The index assigned to the next created face.
+ int m_faceArrayTableSize; //!< The current table size of face arrays.
+
+ AdjEntryArray<face> m_rightFace; //!< The face to which an adjacency entry belongs.
+ face m_externalFace; //! The external face.
+
+ mutable ListPure<FaceArrayBase*> m_regFaceArrays; //!< The registered face arrays.
+
+public:
+ /** @{
+ * \brief Creates a combinatorial embedding associated with no graph.
+ */
+ ConstCombinatorialEmbedding();
+
+ /**
+ * \brief Creates a combinatorial embedding of graph \a G.
+ *
+ * \pre Graph \a G must be embedded, i.e., the adjacency lists of its nodes
+ * must define an embedding.
+ */
+ explicit ConstCombinatorialEmbedding(const Graph &G);
+
+
+ //! Copy constructor.
+ ConstCombinatorialEmbedding(const ConstCombinatorialEmbedding &C);
+
+ //! Assignment operator.
+ ConstCombinatorialEmbedding &operator=(const ConstCombinatorialEmbedding &C);
+
+ /** @} @{
+ * \brief Returns the associated graph of the combinatorial embedding.
+ */
+ const Graph &getGraph() const { return *m_cpGraph; }
+
+ //! Returns associated graph
+ operator const Graph &() const { return *m_cpGraph; }
+
+ /** @} @{
+ * \brief Returns the first face in the list of all faces.
+ */
+ face firstFace() const { return m_faces.begin(); }
+
+ //! Returns the last face in the list of all faces.
+ face lastFace() const { return m_faces.rbegin(); }
+
+ //! Returns the number of faces.
+ int numberOfFaces() const { return m_nFaces; }
+
+ /** @} @{
+ * \brief Returns the face to the right of \a adj, i.e., the face containing \a adj.
+ * @param adj is an adjecency element in the associated graph.
+ */
+ face rightFace(adjEntry adj) const { return m_rightFace[adj]; }
+
+ /**
+ * \brief Returns the face to the left of \a adj, i.e., the face containing the twin of \a adj.
+ * @param adj is an adjacency element in the associated graph.
+ */
+ face leftFace(adjEntry adj) const { return m_rightFace[adj->twin()]; }
+
+ /** @} @{
+ * \brief Returns the largest used face index.
+ */
+ int maxFaceIndex() const { return m_faceIdCount-1; }
+
+ //! Returns the table size of face arrays associated with this embedding.
+ int faceArrayTableSize() const { return m_faceArrayTableSize; }
+
+ /** @} @{
+ * \brief Returns a random face.
+ */
+ face chooseFace() const;
+
+ //! Returns a face of maximal size.
+ face maximalFace() const;
+
+ /** @} @{
+ * \brief Returns the external face.
+ */
+ face externalFace() const {
+ return m_externalFace;
+ }
+
+ /**
+ * \brief Sets the external face to \a f.
+ * @param f is a face in this embedding.
+ */
+ void setExternalFace(face f) {
+ OGDF_ASSERT(f->embeddingOf() == this);
+ m_externalFace = f;
+ }
+
+ bool isBridge(edge e) const {
+ return m_rightFace[e->adjSource()] == m_rightFace[e->adjTarget()];
+ }
+
+ /** @} @{
+ * \brief Initializes the embedding for graph \a G.
+ *
+ * \pre Graph \a G must be embedded, i.e., the adjacency lists of its nodes
+ * must define an embedding.
+ */
+ void init(const Graph &G);
+
+ void init();
+
+ //! Computes the list of faces.
+ void computeFaces();
+
+
+ /** @} @{
+ * \brief Checks the consistency of the data structure.
+ */
+ bool consistencyCheck();
+
+
+ /** @} @{
+ * \brief Registers the face array \a pFaceArray.
+ *
+ * This method is only used by face arrays.
+ */
+ ListIterator<FaceArrayBase*> registerArray(FaceArrayBase *pFaceArray) const;
+
+ /**
+ * \brief Unregisters the face array identified by \a it.
+ *
+ * This method is only used by face arrays.
+ */
+ void unregisterArray(ListIterator<FaceArrayBase*> it) const;
+
+ /** @} */
+
+protected:
+ //! Create a new face.
+ face createFaceElement(adjEntry adjFirst);
+
+ //! Reinitialize associated face arrays.
+ void reinitArrays();
+
+}; // class ConstCombinatorialEmbedding
+
+
+
+/**
+ * \brief Combinatorial embeddings of planar graphs with modification functionality.
+ *
+ * Maintains a combinatorial embedding of an embedded graph, i.e., the set of
+ * faces, and provides method for modifying the embedding, e.g., by inserting edges.
+ */
+class OGDF_EXPORT CombinatorialEmbedding : public ConstCombinatorialEmbedding
+{
+ Graph *m_pGraph; //!< The associated graph.
+
+ // the following methods are private in order to make them unusable
+ // It is not clear which meaning copying of a comb. embedding should
+ // have since we only store a pointer to the topology (Graph)
+ CombinatorialEmbedding(const CombinatorialEmbedding &) : ConstCombinatorialEmbedding() { }
+ CombinatorialEmbedding &operator=(const CombinatorialEmbedding &) {
+ return *this;
+ }
+
+public:
+ /** @{
+ * \brief Creates a combinatorial embedding associated with no graph.
+ */
+ CombinatorialEmbedding() : ConstCombinatorialEmbedding() {
+ m_pGraph = 0;
+ }
+
+ /**
+ * \brief Creates a combinatorial embedding of graph \a G.
+ *
+ * \pre Graph \a G must be embedded, i.e., the adjacency lists of its nodes
+ * must define an embedding.
+ */
+ explicit CombinatorialEmbedding(Graph &G) : ConstCombinatorialEmbedding(G) {
+ m_pGraph = &G;
+ }
+
+ //@}
+ /**
+ * @name Access to the associated graph
+ */
+ //@{
+
+ /**
+ * \brief Returns the associated graph.
+ */
+ const Graph &getGraph() const { return *m_cpGraph; }
+
+ Graph &getGraph() { return *m_pGraph; }
+
+ operator const Graph &() const { return *m_cpGraph; }
+
+ operator Graph &() { return *m_pGraph; }
+
+
+ //@}
+ /**
+ * @name Initialization
+ */
+ //@{
+
+ /**
+ * \brief Initializes the embedding for graph \a G.
+ *
+ * \pre Graph \a G must be embedded, i.e., the adjacency lists of its nodes
+ * must define an embedding.
+ */
+ void init(Graph &G) {
+ ConstCombinatorialEmbedding::init(G);
+ m_pGraph = &G;
+ }
+
+ /**
+ * \brief Removes all nodes, edges, and faces from the graph and the embedding.
+ */
+ void clear();
+
+
+ //@}
+ /**
+ * @name Update of embedding
+ */
+ //@{
+
+ /**
+ * \brief Splits edge \a e=(\a v,\a w) into \a e=(\a v,\a u) and \a e'=(\a u,\a w) creating a new node \a u.
+ * @param e is the edge to be split; \a e is modified by the split.
+ * \return the edge \a e'.
+ */
+ edge split(edge e);
+
+ /**
+ * \brief Undoes a split operation.
+ * @param eIn is the edge (\a v,\a u).
+ * @param eOut is the edge (\a u,\a w).
+ */
+ void unsplit(edge eIn, edge eOut);
+
+ /**
+ * \brief Splits a node while preserving the order of adjacency entries.
+ *
+ * This method splits a node \a v into two nodes \a vl and \a vr. Node
+ * \a vl receives all adjacent edges of \a v from \a adjStartLeft until
+ * the edge preceding \a adjStartRight, and \a vr the remaining nodes
+ * (thus \a adjStartRight is the first edge that goes to \a vr). The
+ * order of adjacency entries is preserved. Additionally, a new edge
+ * (\a vl,\a vr) is created, such that this edge is inserted before
+ * \a adjStartLeft and \a adjStartRight in the the adjacency lists of
+ * \a vl and \a vr.
+ *
+ * Node \a v is modified to become node \a vl, and node \a vr is returned.
+ *
+ * @param adjStartLeft is the first entry that goes to the left node.
+ * @param adjStartRight is the first entry that goes to the right node.
+ * \return the newly created node.
+ */
+ node splitNode(adjEntry adjStartLeft, adjEntry adjStartRight);
+
+ /**
+ * \brief Contracts edge \a e.
+ * @param e is an edge is the associated graph.
+ * @return the node resulting from the contraction.
+ */
+ node contract(edge e);
+
+ /**
+ * \brief Splits a face by inserting a new edge.
+ *
+ * This operation introduces a new edge \a e from the node to which \a adjSrc
+ * belongs to the node to which \a adjTgt belongs.
+ * \pre \a adjSrc and \a adjTgt belong to the same face.
+ * \return the new edge \a e.
+ */
+ edge splitFace(adjEntry adjSrc, adjEntry adjTgt);
+
+ // incremental stuff
+
+ //special version of the above function doing a pushback of the new edge
+ //on the adjacency list of v making it possible to insert new degree 0
+ //nodes into a face
+ edge splitFace(node v, adjEntry adjTgt);
+ edge splitFace(adjEntry adjSrc, node v);
+
+ /**
+ * \brief Removes edge e and joins the two faces adjacent to \a e.
+ * @param e is an edge in the associated graph.
+ * \return the resulting (joined) face.
+ */
+ face joinFaces(edge e);
+
+ //! Reverses edges \a e and updates embedding.
+ void reverseEdge(edge e);
+
+ void moveBridge(adjEntry adjBridge, adjEntry adjBefore);
+
+ void removeDeg1(node v);
+
+ //! Update face information after inserting a merger in a copy graph.
+ void updateMerger(edge e, face fRight, face fLeft);
+
+
+ /** @} */
+
+}; // class CombinatorialEmbedding
+
+
+//---------------------------------------------------------
+// iteration macros
+//---------------------------------------------------------
+
+//! Iteration over all faces \a f of the combinatorial embedding \a E.
+#define forall_faces(f,E) for((f)=(E).firstFace(); (f); (f)=(f)->succ())
+
+
+//! Iteration over all faces \a f of the combinatorial embedding \a E (in reverse order).
+#define forall_rev_faces(f,E) for((f)=(E).lastFace(); (f); (f)=(f)->pred())
+
+/**
+ * \brief Iteration over all adjacency entries \a adj of the face \a f.
+ *
+ * A faster version for this iteration demonstrates the following code snippet:
+ * \code
+ * adjEntry adj1 = f->firstAdj(), adj = adj1;
+ * do {
+ * ...
+ * adj = adj->faceCycleSucc();
+ * } while (adj != adj1);
+ * \endcode
+ */
+#define forall_face_adj(adj,f) for((adj)=(f)->firstAdj(); (adj); (adj)=(f)->nextFaceEdge(adj))
+
+
+} // end namespace ogdf
+
+
+#endif
diff --git a/ogdf/basic/Constraint.cpp b/ogdf/basic/Constraint.cpp
new file mode 100644
index 0000000..9fbb3c0
--- /dev/null
+++ b/ogdf/basic/Constraint.cpp
@@ -0,0 +1,83 @@
+/*
+ * $Revision: 2549 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-04 23:09:19 +0200 (Mi, 04. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of class Constraint, which is a base
+ * class for classes responsible for specifying and storing
+ * drawing constraints.
+ *
+ * \author PG478
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "ogdf/basic/Constraints.h"
+#include "../fileformats/DinoXmlParser.h"
+#include "../fileformats/Ogml.h"
+
+
+namespace ogdf {
+
+
+bool Constraint::buildFromOgml(XmlTagObject* /*constraintTag*/, Hashing <String, node> * /*nodes*/)
+{
+ return true;
+}
+
+bool Constraint::storeToOgml(int /*id*/, ostream & /*os*/, int /*indentStep*/)
+{
+ return true;
+}
+
+/*
+void Constraint::generateIndent(char ** indent, const int & indentSize)
+{
+ // free memory block (INFO: indent must point to an array of chars or to NULL)
+ delete [] *indent;
+ // instantiate array of chars
+ *indent = new char[indentSize + 1];
+ // if memory couldn't be allocated, we throw an exception
+ if (!*indent) {
+ OGDF_THROW(InsufficientMemoryException); // don't use regular throw!
+ }
+ // fill char array
+ for(int i = 0; i < indentSize; ++i) {
+ (*indent)[i] = INDENTCHAR;
+ }
+ // terminate string
+ (*indent)[indentSize] = '\0';
+}*/
+
+} //end namespace ogdf
diff --git a/ogdf/basic/Constraints.h b/ogdf/basic/Constraints.h
new file mode 100644
index 0000000..7819246
--- /dev/null
+++ b/ogdf/basic/Constraints.h
@@ -0,0 +1,212 @@
+/*
+ * $Revision: 2523 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-02 20:59:27 +0200 (Mon, 02 Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of base class for drawing constraints.
+ *
+ * \author PG478
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_CONSTRAINTS_H
+#define OGDF_CONSTRAINTS_H
+
+#include "Graph.h"
+#include "String.h"
+
+
+namespace ogdf {
+
+
+class GraphConstraints;
+struct XmlTagObject;
+
+
+/* -------------------------- Constraint ----------------------------------------- */
+class Constraint
+{
+ friend class GraphConstraints;
+
+private:
+ ListIterator<Constraint *> listIt;
+
+protected:
+ String m_Name;
+ /* */
+ bool m_UserDisabled;
+
+ int m_Status; // OK, Suspended, notOk
+ /* The Graph this Constraint belongs to. No Constraint without a Graph! */
+ const Graph *m_pGraph;
+
+ /* Will be called by the GraphConstraints when a Node in mGraph is removed. */
+ virtual void nodeDeleted(node /*v*/) { }
+
+public:
+ Constraint(const Graph &g) : m_pGraph(&g) { m_Status = 0; m_UserDisabled = false; }
+
+ virtual ~Constraint() {}
+
+ const Graph& constGraph() const { return *m_pGraph; }
+
+ virtual bool isValid() { return (!m_UserDisabled && (m_Status==0)); }
+
+ virtual int getInternalStatus() { return m_Status; }
+
+ virtual void setInternalStatus(int s) { m_Status = s; }
+
+ //virtual bool load(int stuff) = 0;
+ //virtual bool save(int stuff) = 0;
+ //virtual bool checkConstraints(List<Constraint*> csts) {return true; }
+
+ void userEnable() { m_UserDisabled = false; }
+
+ void userDisable() { m_UserDisabled = true; }
+
+ bool isUserDisabled() { return m_UserDisabled; }
+
+ virtual int getType() { return 0; }
+
+ static int getStaticType() { return 0; }
+
+ void setName(String text) { m_Name = text; }
+
+ String getName() { return m_Name; }
+
+ //DEBUG
+ virtual bool buildFromOgml(XmlTagObject * constraintTag, Hashing <String, node> * nodes);
+ virtual bool storeToOgml(int id, ostream & os, int indentStep);
+ //static void generateIndent(char ** indent, const int & indentSize);
+
+ OGDF_NEW_DELETE
+};
+
+
+/* -------------------------- GraphConstraints ----------------------------------------- */
+/* For each Graph a Set of Constraints*/
+class GraphConstraints //: public GraphStructure
+{
+ friend class ConstraintManager;
+
+protected:
+ /* The Graph this Constraint belongs to. No Constraint without a Graph! */
+ const Graph *m_pGraph;
+
+ /* All Constraints for mGraph */
+ List<Constraint *> m_List;
+
+public:
+ /* Constructor, GraphStructure */
+ GraphConstraints(const Graph &g) : m_pGraph(&g), m_List() { }
+
+ /* Returns the Graph */
+ const Graph *constGraph() { return m_pGraph; }
+
+ /* adds a Constraint to this Set */
+ void addConstraint(Constraint *c) { c->listIt = m_List.pushBack(c); }
+
+ /* removes a Constraint from this set */
+ void removeConstraint(Constraint *c) { m_List.del(c->listIt); }
+
+ /* returns all Constraints */
+ List<Constraint *> *getConstraints() { return &m_List; }
+
+ /* Return Constraint Count */
+ int numberOfConstraints() { return m_List.size(); }
+
+ /* returns all Constraints of Type type */
+ List<Constraint *> getConstraintsOfType(int type);
+
+ template<class TYP> void getConstraintsOfType(List<TYP *> *res) {
+ //List<TYP *> res;
+ ListConstIterator<Constraint *> it;
+ for(it = m_List.begin(); it.valid(); ++it)
+ {
+ Constraint *c = *it;
+
+ if (TYP::getStaticType()==c->getType())
+ {
+ if (c->isValid()) res->pushBack(static_cast<TYP *>(c));
+ }
+ }
+ //return res;
+ }
+
+ void clear() {
+ m_List.clear();
+ }
+
+ virtual ~GraphConstraints() {
+ ListConstIterator<Constraint *> it;
+ for(it = m_List.begin(); it.valid(); ++it)
+ {
+ Constraint *c = *it;
+ delete c;
+ }
+ }
+
+ virtual void nodeDeleted(node v);
+ virtual void nodeAdded(node /*v*/) { }
+ virtual void edgeDeleted(edge /*e*/) { }
+ virtual void edgeAdded(edge /*e*/) { }
+ virtual void reInit() { }
+ virtual void cleared() { }
+
+ OGDF_NEW_DELETE
+};
+
+
+/* -------------------------- ConstraintManager ----------------------------------------- */
+class ConstraintManager
+{
+public:
+
+ static Constraint *createConstraintByName(const Graph &G, String *name);
+
+ static String getClassnameOfConstraint(Constraint *c);
+
+ OGDF_NEW_DELETE
+};
+
+} // end namespace
+
+#endif
diff --git a/ogdf/basic/CriticalSection.h b/ogdf/basic/CriticalSection.h
new file mode 100644
index 0000000..409d437
--- /dev/null
+++ b/ogdf/basic/CriticalSection.h
@@ -0,0 +1,164 @@
+/*
+ * $Revision: 2583 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-12 01:02:21 +0200 (Do, 12. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of criticial sections.
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+
+#ifndef OGDF_CRITICAL_SECTION_H
+#define OGDF_CRITICAL_SECTION_H
+
+#if !defined(OGDF_SYSTEM_WINDOWS)
+#include <pthread.h>
+#include <errno.h>
+#endif
+
+#include "System.h"
+
+
+namespace ogdf {
+
+#if defined(OGDF_SYSTEM_WINDOWS)
+
+//! Representation of a critical section.
+/**
+ * Critical sections are used to synchronize access to resources shared by
+ * several threads. It can be used to protect an object or a piece of code
+ * allowing always one thread at a time access.
+ */
+class OGDF_EXPORT CriticalSection
+{
+public:
+ //! Creates a critical section object.
+ CriticalSection() {
+ InitializeCriticalSection(&m_cs);
+ }
+
+ //! Creates a critical section object with spin count.
+ /**
+ * The spin count determines how many times the calling thread spins
+ * when the critical section is unavailable, before it performs a wait.
+ * \remark The spin count is only used on multiprocessor systems;
+ * otherwise it makes no sense.
+ */
+ explicit CriticalSection(int spinCount) {
+ InitializeCriticalSectionAndSpinCount(&m_cs, spinCount);
+ }
+
+ ~CriticalSection() {
+ DeleteCriticalSection(&m_cs);
+ }
+
+ //! Enters the critical section.
+ void enter() {
+ EnterCriticalSection(&m_cs);
+ }
+
+ //! Tries to enter the critical section; returns true on success.
+ bool tryEnter() {
+ return (TryEnterCriticalSection(&m_cs) != 0);
+ }
+
+ //! Leaves the critical section.
+ void leave() {
+ LeaveCriticalSection(&m_cs);
+ }
+
+private:
+ CRITICAL_SECTION m_cs; //!< The Windows critical section object.
+};
+
+
+#else
+
+class OGDF_EXPORT CriticalSection
+{
+public:
+ CriticalSection() : m_spinCount(0) {
+ pthread_mutex_init(&m_mutex, NULL);
+ }
+
+ explicit CriticalSection(int spinCount) {
+ m_spinCount = (System::numberOfProcessors() >= 2) ? spinCount : 0;
+ int ret = pthread_mutex_init(&m_mutex, NULL);
+ if(ret != 0)
+ cout << "initialization of mutex failed: " << ret << endl;
+ }
+
+ ~CriticalSection() {
+ pthread_mutex_destroy(&m_mutex);
+ }
+
+ void enter() {
+ if(m_spinCount > 0) {
+ for(int i = m_spinCount; i > 0; --i)
+ if(pthread_mutex_trylock(&m_mutex) != EBUSY)
+ return;
+ }
+ pthread_mutex_lock(&m_mutex);
+ }
+
+ bool tryEnter() {
+ return (pthread_mutex_trylock(&m_mutex) != EBUSY);
+ }
+
+ void leave() {
+ pthread_mutex_unlock(&m_mutex);
+ }
+
+private:
+ pthread_mutex_t m_mutex;
+ int m_spinCount;
+};
+
+#endif
+
+
+} // end namespace ogdf
+
+
+#endif
diff --git a/ogdf/basic/EdgeArray.h b/ogdf/basic/EdgeArray.h
new file mode 100644
index 0000000..9d02aa4
--- /dev/null
+++ b/ogdf/basic/EdgeArray.h
@@ -0,0 +1,259 @@
+/*
+ * $Revision: 2615 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-16 14:23:36 +0200 (Mo, 16. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration and implementation of EdgeArray class.
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_EDGE_ARRAY_H
+#define OGDF_EDGE_ARRAY_H
+
+
+#include "Graph_d.h"
+
+
+namespace ogdf {
+
+
+//! Abstract base class for edge arrays.
+/**
+ * Defines the interface for event handling used by the Graph class.
+ * Use the parameterized class EdgeArray for creating edge arrays.
+ */
+class EdgeArrayBase {
+ /**
+ * Pointer to list element in the list of all registered edge
+ * arrays which references this array.
+ */
+ ListIterator<EdgeArrayBase*> m_it;
+
+public:
+ const Graph *m_pGraph; //!< The associated graph.
+
+ //! Initializes an edge array not associated with a graph.
+ EdgeArrayBase() : m_pGraph(0) { }
+ //! Initializes an edge array associated with \a pG.
+ EdgeArrayBase(const Graph *pG) : m_pGraph(pG) {
+ if(pG) m_it = pG->registerArray(this);
+ }
+
+ // destructor, unregisters the array
+ virtual ~EdgeArrayBase() {
+ if (m_pGraph) m_pGraph->unregisterArray(m_it);
+ }
+
+ // event interface used by Graph
+ //! Virtual function called when table size has to be enlarged.
+ virtual void enlargeTable(int newTableSize) = 0;
+ //! Virtual function called when table has to be reinitialized.
+ virtual void reinit(int initTableSize) = 0;
+ //! Virtual function called when array is disconnected from the graph.
+ virtual void disconnect() = 0;
+
+ //! Associates the array with a new graph.
+ void reregister(const Graph *pG) {
+ if (m_pGraph) m_pGraph->unregisterArray(m_it);
+ if ((m_pGraph = pG) != 0) m_it = pG->registerArray(this);
+ }
+}; // class EdgeArrayBase
+
+
+//! Dynamic arrays indexed with edges.
+/**
+ * Edge arrays represent a mapping from edges to data of type \a T.
+ * They adjust their table size automatically when the graph grows.
+ *
+ * @tparam T is the element type.
+ */
+template<class T> class EdgeArray : private Array<T>, protected EdgeArrayBase {
+ T m_x; //!< The default value for array elements.
+
+public:
+ //! Constructs an empty edge array associated with no graph.
+ EdgeArray() : Array<T>(), EdgeArrayBase() { }
+ //! Constructs an edge array associated with \a G.
+ EdgeArray(const Graph &G) : Array<T>(G.edgeArrayTableSize()), EdgeArrayBase(&G) { }
+ //! Constructs an edge array associated with \a G.
+ /**
+ * @param G is the associated graph.
+ * @param x is the default value for all array elements.
+ */
+ EdgeArray(const Graph &G, const T &x) :
+ Array<T>(0,G.edgeArrayTableSize()-1,x), EdgeArrayBase(&G), m_x(x) { }
+ //! Constructs an edge array that is a copy of \a A.
+ /**
+ * Associates the array with the same graph as \a A and copies all elements.
+ */
+ EdgeArray(const EdgeArray<T> &A) : Array<T>(A), EdgeArrayBase(A.m_pGraph), m_x(A.m_x) { }
+
+ //! Returns true iff the array is associated with a graph.
+ bool valid() const { return (Array<T>::low() <= Array<T>::high()); }
+
+ //! Returns a pointer to the associated graph.
+ const Graph *graphOf() const {
+ return m_pGraph;
+ }
+
+ //! Returns a reference to the element with index \a e.
+ const T &operator[](edge e) const {
+ OGDF_ASSERT(e != 0 && e->graphOf() == m_pGraph)
+ return Array<T>::operator [](e->index());
+ }
+
+ //! Returns a reference to the element with index \a e.
+ T &operator[](edge e) {
+ OGDF_ASSERT(e != 0 && e->graphOf() == m_pGraph)
+ return Array<T>::operator [](e->index());
+ }
+
+ //! Returns a reference to the element with index edge of \a adj.
+ const T &operator[](adjEntry adj) const {
+ OGDF_ASSERT(adj != 0)
+ return Array<T>::operator [](adj->index() >> 1);
+ }
+
+ //! Returns a reference to the element with index edge of \a adj.
+ T &operator[](adjEntry adj) {
+ OGDF_ASSERT(adj != 0)
+ return Array<T>::operator [](adj->index() >> 1);
+ }
+
+ //! Returns a reference to the element with index \a index.
+ /**
+ * \attention Make sure that \a index is a valid index for an edge
+ * in the associated graph!
+ */
+ const T &operator[](int index) const {
+ return Array<T>::operator [](index);
+ }
+
+ //! Returns a reference to the element with index \a index.
+ /**
+ * \attention Make sure that \a index is a valid index for an edge
+ * in the associated graph!
+ */
+ T &operator[](int index) {
+ return Array<T>::operator [](index);
+ }
+
+ //! Assignment operator.
+ EdgeArray<T> &operator=(const EdgeArray<T> &a) {
+ Array<T>::operator =(a);
+ m_x = a.m_x;
+ reregister(a.m_pGraph);
+ return *this;
+ }
+
+ //! Reinitializes the array. Associates the array with no graph.
+ void init() {
+ Array<T>::init(); reregister(0);
+ }
+
+ //! Reinitializes the array. Associates the array with \a G.
+ void init(const Graph &G) {
+ Array<T>::init(G.edgeArrayTableSize()); reregister(&G);
+ }
+
+ //! Reinitializes the array. Associates the array with \a G.
+ /**
+ * @param G is the associated graph.
+ * @param x is the default value.
+ */
+ void init(const Graph &G, const T &x) {
+ Array<T>::init(0,G.edgeArrayTableSize()-1, m_x = x); reregister(&G);
+ }
+
+ //! Sets all array elements to \a x.
+ void fill(const T &x) {
+ int high = m_pGraph->maxEdgeIndex();
+ if(high >= 0)
+ Array<T>::fill(0,high,x);
+ }
+
+private:
+ virtual void enlargeTable(int newTableSize) {
+ Array<T>::grow(newTableSize-Array<T>::size(),m_x);
+ }
+
+ virtual void reinit(int initTableSize) {
+ Array<T>::init(0,initTableSize-1,m_x);
+ }
+
+ virtual void disconnect() {
+ Array<T>::init();
+ m_pGraph = 0;
+ }
+
+ OGDF_NEW_DELETE
+
+}; // class EdgeArray<T>
+
+
+//! Bucket function for edges.
+/**
+ * The bucket of an edge is stored in an edge array which is passed
+ * by the user at construction; only a pointer is stored to that array.
+ */
+class OGDF_EXPORT BucketEdgeArray : public BucketFunc<edge>
+{
+ const EdgeArray<int> *m_pEdgeArray; //!< Pointer to edge array.
+
+public:
+ //! Constructs a bucket function.
+ /**
+ * @param edgeArray contains the buckets for the edges. May not be deleted
+ * as long as the bucket function is used.
+ */
+ BucketEdgeArray(const EdgeArray<int> &edgeArray) : m_pEdgeArray(&edgeArray) { }
+
+ //! Returns bucket of edge \a e.
+ int getBucket(const edge &e) { return (*m_pEdgeArray)[e]; }
+};
+
+
+} // end namespace ogdf
+#include "Graph.h"
+
+#endif
diff --git a/ogdf/basic/FaceArray.h b/ogdf/basic/FaceArray.h
new file mode 100644
index 0000000..f50ddf5
--- /dev/null
+++ b/ogdf/basic/FaceArray.h
@@ -0,0 +1,224 @@
+/*
+ * $Revision: 2615 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-16 14:23:36 +0200 (Mo, 16. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief declaration and implementation of FaceArray class
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_FACE_ARRAY_H
+#define OGDF_FACE_ARRAY_H
+
+
+#include "Array.h"
+#include "CombinatorialEmbedding.h"
+
+
+namespace ogdf {
+
+
+//! Abstract base class for face arrays.
+/**
+ * Defines the interface for event handling used by the
+ * CombinatorialEmbedding class.
+ * Use the parameterized class FaceArray for creating face arrays.
+ */
+class FaceArrayBase {
+ /**
+ * Pointer to list element in the list of all registered face
+ * arrays which references this array.
+ */
+ ListIterator<FaceArrayBase*> m_it;
+
+public:
+ const ConstCombinatorialEmbedding *m_pEmbedding; //!< The associated combinatorial embedding.
+
+ //! Initializes a face array not associated with a combinatorial embedding.
+ FaceArrayBase() : m_pEmbedding(0) { }
+ //! Initializes a face array associated with \a pE.
+ FaceArrayBase(const ConstCombinatorialEmbedding *pE) : m_pEmbedding(pE) {
+ if(pE) m_it = pE->registerArray(this);
+ }
+
+ // destructor, unregisters the array
+ virtual ~FaceArrayBase() {
+ if (m_pEmbedding) m_pEmbedding->unregisterArray(m_it);
+ }
+
+ // event interface used by CombinatorialEmbedding
+ //! Virtual function called when table size has to be enlarged.
+ virtual void enlargeTable(int newTableSize) = 0;
+ //! Virtual function called when table has to be reinitialized.
+ virtual void reinit(int initTableSize) = 0;
+
+ //! Associates the array with a new combinatorial embedding.
+ void reregister(const ConstCombinatorialEmbedding *pE) {
+ if (m_pEmbedding) m_pEmbedding->unregisterArray(m_it);
+ if ((m_pEmbedding = pE) != 0) m_it = pE->registerArray(this);
+ }
+}; // class FaceArrayBase
+
+
+//! Dynamic arrays indexed with faces of a combinatorial embedding.
+/**
+ * Face arrays represent a mapping from faces to data of type \a T.
+ * They adjust their table size automatically when the number of faces in the
+ * corresponding combinatorial embedding increases.
+ *
+ * @tparam T is the element type.
+ */
+template<class T> class FaceArray : private Array<T>, protected FaceArrayBase {
+ T m_x; //!< The default value for array elements.
+
+public:
+ //! Constructs an empty face array associated with no combinatorial embedding.
+ FaceArray() : Array<T>(), FaceArrayBase() { }
+ //! Constructs a face array associated with \a E.
+ FaceArray(const ConstCombinatorialEmbedding &E) :
+ Array<T>(E.faceArrayTableSize()), FaceArrayBase(&E) { }
+ //! Constructs a face array associated with \a E.
+ /**
+ * @param E is the associated combinatorial embedding.
+ * @param x is the default value for all array elements.
+ */
+ FaceArray(const ConstCombinatorialEmbedding &E, const T &x) :
+ Array<T>(0,E.faceArrayTableSize()-1,x), FaceArrayBase(&E), m_x(x) { }
+ //! Constructs an face array that is a copy of \a A.
+ /**
+ * Associates the array with the same combinatorial embedding as
+ * \a A and copies all elements.
+ */
+ FaceArray(const FaceArray<T> &A) : Array<T>(A), FaceArrayBase(A.m_pEmbedding), m_x(A.m_x) { }
+
+ //! Returns true iff the array is associated with a combinatorial embedding.
+ bool valid() const { return (Array<T>::low() <= Array<T>::high()); }
+
+ //! Returns a pointer to the associated combinatorial embedding.
+ const ConstCombinatorialEmbedding *embeddingOf() const {
+ return m_pEmbedding;
+ }
+
+ //! Returns a reference to the element with index \a f.
+ const T &operator[](face f) const {
+ OGDF_ASSERT(f != 0 && f->embeddingOf() == m_pEmbedding)
+ return Array<T>::operator [](f->index());
+ }
+
+ //! Returns a reference to the element with index \a f.
+ T &operator[](face f) {
+ OGDF_ASSERT(f != 0 && f->embeddingOf() == m_pEmbedding)
+ return Array<T>::operator [](f->index());
+ }
+
+ //! Returns a reference to the element with index \a index.
+ /**
+ * \attention Make sure that \a index is a valid index for a face
+ * in the associated combinatorial embedding!
+ */
+ const T &operator[](int index) const {
+ return Array<T>::operator [](index);
+ }
+
+ //! Returns a reference to the element with index \a index.
+ /**
+ * \attention Make sure that \a index is a valid index for a face
+ * in the associated combinatorial embedding!
+ */
+ T &operator[](int index) {
+ return Array<T>::operator [](index);
+ }
+
+ //! Assignment operator.
+ FaceArray<T> &operator=(const FaceArray<T> &a) {
+ Array<T>::operator =(a);
+ m_x = a.m_x;
+ reregister(a.m_pEmbedding);
+ return *this;
+ }
+
+ //! Reinitializes the array. Associates the array with no combinatorial embedding.
+ void init() {
+ Array<T>::init(); reregister(0);
+ }
+
+ //! Reinitializes the array. Associates the array with \a E.
+ void init(const ConstCombinatorialEmbedding &E) {
+ Array<T>::init(E.faceArrayTableSize()); reregister(&E);
+ }
+
+ //! Reinitializes the array. Associates the array with \a E.
+ /**
+ * @param E is the associated combinatorial embedding.
+ * @param x is the default value.
+ */
+ void init(const ConstCombinatorialEmbedding &E, const T &x) {
+ Array<T>::init(0,E.faceArrayTableSize()-1, m_x = x); reregister(&E);
+ }
+
+ //! Sets all array elements to \a x.
+ void fill(const T &x) {
+ int high = m_pEmbedding->maxFaceIndex();
+ if(high >= 0)
+ Array<T>::fill(0,high,x);
+ }
+
+private:
+ virtual void enlargeTable(int newTableSize) {
+ Array<T>::grow(newTableSize-Array<T>::size(),m_x);
+ }
+
+ virtual void reinit(int initTableSize) {
+ Array<T>::init(0,initTableSize-1,m_x);
+ }
+
+ OGDF_NEW_DELETE
+
+}; // class FaceArray<T>
+
+
+} // end namespace ogdf
+
+
+#endif
diff --git a/ogdf/basic/FaceSet.h b/ogdf/basic/FaceSet.h
new file mode 100644
index 0000000..86f4a83
--- /dev/null
+++ b/ogdf/basic/FaceSet.h
@@ -0,0 +1,274 @@
+/*
+ * $Revision: 2523 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-02 20:59:27 +0200 (Mon, 02 Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief declaration and implementation of class FaceSetSimple,
+ * FaceSetPure and FaceSet
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_FACE_SET_H
+#define OGDF_FACE_SET_H
+
+
+#include "FaceArray.h"
+#include "List.h"
+
+
+
+namespace ogdf {
+
+
+//! Maintains a subset S of the faces contained in an associated combinatorial embedding E
+/** (only insertion of elements and clear operation)
+ */
+class OGDF_EXPORT FaceSetSimple {
+public:
+ //! creates a new empty face set associated with combinatorial embedding E
+ FaceSetSimple(const CombinatorialEmbedding &E) : m_isContained(E,false) { }
+
+ //! destructor
+ ~FaceSetSimple() { }
+
+ //! inserts face f into set S
+ /** running time: O(1)
+ * Precond.: f is a face in the associated combinatorial embedding
+ */
+ void insert(face f) {
+ OGDF_ASSERT(f->embeddingOf() == m_isContained.embeddingOf());
+ bool &isContained = m_isContained[f];
+ if (isContained == false) {
+ isContained = true;
+ m_faces.pushFront(f);
+ }
+ }
+
+
+ //! removes all faces from set S
+ /** running time: O(|S|)
+ */
+ void clear() {
+ SListIterator<face> it;
+ for(it = m_faces.begin(); it.valid(); ++it) {
+ m_isContained[*it] = false;
+ }
+ m_faces.clear();
+ }
+
+
+ //! returns true iff face f is contained in S
+ /** running time: O(1)
+ * Precond.: f is a face in the asociated embedding
+ */
+ bool isMember(face f) const {
+ OGDF_ASSERT(f->embeddingOf() == m_isContained.embeddingOf());
+ return m_isContained[f];
+ }
+
+ //! returns the list of faces contained in S
+ const SListPure<face> &faces() const {
+ return m_faces;
+ }
+
+private:
+ //! m_isContained[f] is true <=> f is contained in S
+ FaceArray<bool> m_isContained;
+ //! list of faces contained in S
+ SListPure<face> m_faces;
+};
+
+
+
+//! maintains a subset S of the faces contained in an associated combinatorial embedding E
+/** (no efficient access to size of S)
+ */
+class OGDF_EXPORT FaceSetPure {
+public:
+ //! creates a new empty face set associated with combinatorial embedding E
+ FaceSetPure(const CombinatorialEmbedding &E) : m_it(E,ListIterator<face>()) { }
+
+ //! destructor
+ ~FaceSetPure() { }
+
+ //! inserts face f into set S
+ /** running time: O(1)
+ * Precond.: f is a face in the associated combinatorial embedding
+ */
+ void insert(face f) {
+ OGDF_ASSERT(f->embeddingOf() == m_it.embeddingOf());
+ ListIterator<face> &itF = m_it[f];
+ if (!itF.valid())
+ itF = m_faces.pushBack(f);
+ }
+
+ //! removes face f from set S
+ /** running time: O(1)
+ * Precond.: f is a face in the asociated embedding
+ */
+ void remove(face f) {
+ OGDF_ASSERT(f->embeddingOf() == m_it.embeddingOf());
+ ListIterator<face> &itF = m_it[f];
+ if (itF.valid()) {
+ m_faces.del(itF);
+ itF = ListIterator<face>();
+ }
+ }
+
+
+ //! removes all faces from set S
+ /** running time: O(|S|)
+ */
+ void clear() {
+ ListIterator<face> it;
+ for(it = m_faces.begin(); it.valid(); ++it) {
+ m_it[*it] = ListIterator<face>();
+ }
+ m_faces.clear();
+ }
+
+
+ //! returns true iff face f is contained in S
+ /** running time: O(1)
+ * Precond.: f is a face in the asociated embedding
+ */
+ bool isMember(face f) const {
+ OGDF_ASSERT(f->embeddingOf() == m_it.embeddingOf());
+ return m_it[f].valid();
+ }
+
+ //! returns the list of faces contained in S
+ const ListPure<face> &faces() const {
+ return m_faces;
+ }
+
+private:
+ //! m_it[f] contains list iterator pointing to f if f is contained in S, an invalid list iterator otherwise
+ FaceArray<ListIterator<face> > m_it;
+ //! list of faces contained in S
+ ListPure<face> m_faces;
+};
+
+
+
+//! maintains a subset S of the faces contained in an associated combinatorial embedding E
+class OGDF_EXPORT FaceSet {
+public:
+ //! creates a new empty face set associated with combinatorial embedding E
+ FaceSet(const CombinatorialEmbedding &E) : m_it(E,ListIterator<face>()) { }
+
+ //! destructor
+ ~FaceSet() { }
+
+ //! inserts face f into set S
+ /** running time: O(1)
+ * Precond.: f is a face in the associated combinatorial embedding
+ */
+ void insert(face f) {
+ OGDF_ASSERT(f->embeddingOf() == m_it.embeddingOf());
+ ListIterator<face> &itF = m_it[f];
+ if (!itF.valid())
+ itF = m_faces.pushBack(f);
+ }
+
+ //! removes face f from set S
+ /* running time: O(1)
+ * Precond.: f is a face in the asociated embedding
+ */
+ void remove(face f) {
+ OGDF_ASSERT(f->embeddingOf() == m_it.embeddingOf());
+ ListIterator<face> &itF = m_it[f];
+ if (itF.valid()) {
+ m_faces.del(itF);
+ itF = ListIterator<face>();
+ }
+ }
+
+
+ //! removes all faces from set S
+ /** running time: O(|S|)
+ */
+ void clear() {
+ ListIterator<face> it;
+ for(it = m_faces.begin(); it.valid(); ++it) {
+ m_it[*it] = ListIterator<face>();
+ }
+ m_faces.clear();
+ }
+
+
+ //! returns true iff face f is contained in S
+ /** running time: O(1)
+ * Precond.: f is a face in the asociated embedding
+ */
+ bool isMember(face f) const {
+ OGDF_ASSERT(f->embeddingOf() == m_it.embeddingOf());
+ return m_it[f].valid();
+ }
+
+ //! returns the size of set S
+ /** running time: O(1)
+ */
+ int size() const {
+ return m_faces.size();
+ }
+
+ //! returns the list of faces contained in S
+ const List<face> &faces() const {
+ return m_faces;
+ }
+
+private:
+ //! m_it[f] contains list iterator pointing to f if f is contained in S,an invalid list iterator otherwise
+ FaceArray<ListIterator<face> > m_it;
+ //! list of faces contained in S
+ List<face> m_faces;
+};
+
+
+} // end namespace ogdf
+
+
+#endif
+
diff --git a/ogdf/basic/Graph.cpp b/ogdf/basic/Graph.cpp
new file mode 100644
index 0000000..ff14a38
--- /dev/null
+++ b/ogdf/basic/Graph.cpp
@@ -0,0 +1,1481 @@
+/*
+ * $Revision: 2523 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-02 20:59:27 +0200 (Mon, 02 Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of Graph class
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+#include "Array.h"
+#include "AdjEntryArray.h"
+#include "../fileformats/GmlParser.h"
+#include "simple_graph_alg.h"
+#include "GraphObserver.h"
+
+
+#define MIN_NODE_TABLE_SIZE (1 << 4)
+#define MIN_EDGE_TABLE_SIZE (1 << 4)
+
+
+namespace ogdf {
+
+Graph::Graph()
+{
+ m_nNodes = m_nEdges = m_nodeIdCount = m_edgeIdCount = 0;
+ m_nodeArrayTableSize = MIN_NODE_TABLE_SIZE;
+ m_edgeArrayTableSize = MIN_EDGE_TABLE_SIZE;
+}
+
+
+Graph::Graph(const Graph &G)
+{
+ m_nNodes = m_nEdges = m_nodeIdCount = m_edgeIdCount = 0;
+ copy(G);
+ m_nodeArrayTableSize = nextPower2(MIN_NODE_TABLE_SIZE,m_nodeIdCount);
+ m_edgeArrayTableSize = nextPower2(MIN_EDGE_TABLE_SIZE,m_edgeIdCount);
+}
+
+
+Graph::~Graph()
+{
+ ListIterator<NodeArrayBase*> itVNext;
+ for(ListIterator<NodeArrayBase*> itV = m_regNodeArrays.begin();
+ itV.valid(); itV = itVNext)
+ {
+ itVNext = itV.succ();
+ (*itV)->disconnect();
+ }
+
+ ListIterator<EdgeArrayBase*> itENext;
+ for(ListIterator<EdgeArrayBase*> itE = m_regEdgeArrays.begin();
+ itE.valid(); itE = itENext)
+ {
+ itENext = itE.succ();
+ (*itE)->disconnect();
+ }
+
+ ListIterator<AdjEntryArrayBase*> itAdjNext;
+ for(ListIterator<AdjEntryArrayBase*> itAdj = m_regAdjArrays.begin();
+ itAdj.valid(); itAdj = itAdjNext)
+ {
+ itAdjNext = itAdj.succ();
+ (*itAdj)->disconnect();
+ }
+
+ for (node v = m_nodes.begin(); v; v = v->succ()) {
+ v->m_adjEdges.~GraphList<AdjElement>();
+ }
+}
+
+
+Graph &Graph::operator=(const Graph &G)
+{
+ clear(); copy(G);
+ m_nodeArrayTableSize = nextPower2(MIN_NODE_TABLE_SIZE,m_nodeIdCount);
+ m_edgeArrayTableSize = nextPower2(MIN_EDGE_TABLE_SIZE,m_edgeIdCount);
+ reinitArrays();
+
+ OGDF_ASSERT_IF(dlConsistencyChecks, consistencyCheck());
+
+ return *this;
+}
+
+
+void Graph::assign(const Graph &G, NodeArray<node> &mapNode,
+ EdgeArray<edge> &mapEdge)
+{
+ clear();
+ copy(G,mapNode,mapEdge);
+ m_nodeArrayTableSize = nextPower2(MIN_NODE_TABLE_SIZE,m_nodeIdCount);
+ m_edgeArrayTableSize = nextPower2(MIN_EDGE_TABLE_SIZE,m_edgeIdCount);
+ reinitArrays();
+}
+
+
+void Graph::construct(const Graph &G, NodeArray<node> &mapNode,
+ EdgeArray<edge> &mapEdge)
+{
+ copy(G,mapNode,mapEdge);
+ m_nodeArrayTableSize = nextPower2(MIN_NODE_TABLE_SIZE,m_nodeIdCount);
+ m_edgeArrayTableSize = nextPower2(MIN_EDGE_TABLE_SIZE,m_edgeIdCount);
+}
+
+
+void Graph::copy(const Graph &G, NodeArray<node> &mapNode,
+ EdgeArray<edge> &mapEdge)
+{
+ if (G.m_nNodes == 0) return;
+
+ mapNode.init(G,0);
+
+ node vG;
+ forall_nodes(vG,G) {
+ node v = mapNode[vG] = pureNewNode();
+ v->m_indeg = vG->m_indeg;
+ v->m_outdeg = vG->m_outdeg;
+ }
+
+ if (G.m_nEdges == 0) return;
+
+ mapEdge.init(G,0);
+
+ edge e, eC;
+ forall_edges(e,G) {
+ m_edges.pushBack(eC = mapEdge[e] =
+ OGDF_NEW EdgeElement(
+ mapNode[e->source()],mapNode[e->target()],m_edgeIdCount));
+
+ eC->m_adjSrc = OGDF_NEW AdjElement(eC,m_edgeIdCount<<1);
+ (eC->m_adjTgt = OGDF_NEW AdjElement(eC,(m_edgeIdCount<<1)|1))
+ ->m_twin = eC->m_adjSrc;
+ eC->m_adjSrc->m_twin = eC->m_adjTgt;
+ m_edgeIdCount++;
+ }
+ m_nEdges = G.m_nEdges;
+
+ EdgeArray<bool> mark(G,false);
+
+ forall_nodes(vG,G) {
+ node v = mapNode[vG];
+ GraphList<AdjElement> &adjEdges = vG->m_adjEdges;
+ for (AdjElement *adjG = adjEdges.begin(); adjG; adjG = adjG->succ()) {
+ int id = adjG->m_edge->index();
+ edge eC = mapEdge[id];
+
+ adjEntry adj;
+ if (eC->isSelfLoop()) {
+ if (mark[id])
+ adj = eC->m_adjTgt;
+ else {
+ adj = eC->m_adjSrc;
+ mark[id] = true;
+ }
+ } else
+ adj = (v == eC->m_src) ? eC->m_adjSrc : eC->m_adjTgt;
+
+ v->m_adjEdges.pushBack(adj);
+ adj->m_node = v;
+ }
+ }
+}
+
+
+void Graph::copy(const Graph &G)
+{
+ NodeArray<node> mapNode;
+ EdgeArray<edge> mapEdge;
+ copy(G,mapNode,mapEdge);
+
+ OGDF_ASSERT_IF(dlConsistencyChecks, consistencyCheck());
+}
+
+
+void Graph::constructInitByNodes(
+ const Graph &G,
+ const List<node> &nodes,
+ NodeArray<node> &mapNode,
+ EdgeArray<edge> &mapEdge)
+{
+ // clear
+ for (node v = m_nodes.begin(); v; v = v->succ()) {
+ v->m_adjEdges.~GraphList<AdjElement>();
+ }
+
+ m_nodes.clear();
+ m_edges.clear();
+
+ m_nNodes = m_nEdges = m_nodeIdCount = m_edgeIdCount = 0;
+ m_nodeArrayTableSize = MIN_NODE_TABLE_SIZE;
+
+
+ // list of edges adjacent to nodes in nodes
+ SListPure<edge> edges;
+
+ // create nodes and assemble list of edges
+ ListConstIterator<node> itG;
+ for(itG = nodes.begin(); itG.valid(); ++itG) {
+ node vG = *itG;
+ node v = mapNode[vG] = pureNewNode();
+
+ v->m_indeg = vG->m_indeg;
+ v->m_outdeg = vG->m_outdeg;
+
+ adjEntry adjG;
+ forall_adj(adjG,vG) {
+ // corresponding adjacency entries differ by index modulo 2
+ // the following conditions makes sure that each edge is
+ // added only once to edges
+ if ((adjG->m_id & 1) == 0)
+ edges.pushBack(adjG->m_edge);
+ }
+ }
+
+ // create edges
+ SListConstIterator<edge> it;
+ for(it = edges.begin(); it.valid(); ++it)
+ {
+ edge eG = *it;
+ node v = mapNode[eG->source()];
+ node w = mapNode[eG->target()];
+
+ edge eC = mapEdge[eG] = OGDF_NEW EdgeElement(v, w, m_edgeIdCount);
+ m_edges.pushBack(eC);
+
+ eC->m_adjSrc = OGDF_NEW AdjElement(eC, m_edgeIdCount<<1);
+ (eC->m_adjTgt = OGDF_NEW AdjElement(eC, (m_edgeIdCount<<1)|1))
+ ->m_twin = eC->m_adjSrc;
+ eC->m_adjSrc->m_twin = eC->m_adjTgt;
+ ++m_edgeIdCount;
+ ++m_nEdges;
+ }
+
+ EdgeArray<bool> mark(G,false);
+ for(itG = nodes.begin(); itG.valid(); ++itG) {
+ node vG = *itG;
+ node v = mapNode[vG];
+
+ GraphList<AdjElement> &adjEdges = vG->m_adjEdges;
+ for (AdjElement *adjG = adjEdges.begin(); adjG; adjG = adjG->succ()) {
+ int id = adjG->m_edge->index();
+ edge eC = mapEdge[id];
+
+ adjEntry adj;
+ if (eC->isSelfLoop()) {
+ if (mark[id])
+ adj = eC->m_adjTgt;
+ else {
+ adj = eC->m_adjSrc;
+ mark[id] = true;
+ }
+ } else
+ adj = (v == eC->m_src) ? eC->m_adjSrc : eC->m_adjTgt;
+
+ v->m_adjEdges.pushBack(adj);
+ adj->m_node = v;
+ }
+ }
+
+/*
+ AdjElement *adjSrc = OGDF_NEW AdjElement(v);
+
+ v->m_adjEdges.pushBack(adjSrc);
+ //v->m_outdeg++;
+
+ AdjElement *adjTgt = OGDF_NEW AdjElement(w);
+
+ w->m_adjEdges.pushBack(adjTgt);
+ //w->m_indeg++;
+
+ adjSrc->m_twin = adjTgt;
+ adjTgt->m_twin = adjSrc;
+
+ adjTgt->m_id = (adjSrc->m_id = m_edgeIdCount << 1) | 1;
+ edge e = OGDF_NEW EdgeElement(v,w,adjSrc,adjTgt,m_edgeIdCount++);
+
+ ++m_nEdges;
+ m_edges.pushBack(e);
+
+ mapEdge[eG] = adjSrc->m_edge = adjTgt->m_edge = e;
+ }*/
+
+ // set size of associated arrays and reinitialize all (we have now a
+ // completely new graph)
+ m_nodeArrayTableSize = nextPower2(MIN_NODE_TABLE_SIZE,m_nodeIdCount);
+ m_edgeArrayTableSize = nextPower2(MIN_EDGE_TABLE_SIZE,m_edgeIdCount);
+ reinitArrays();
+
+ OGDF_ASSERT_IF(dlConsistencyChecks, consistencyCheck());
+}
+
+
+//------------------
+//mainly a copy of the above code, remerge this again
+void Graph::constructInitByActiveNodes(
+ const List<node> &nodes,
+ const NodeArray<bool> &activeNodes,
+ NodeArray<node> &mapNode,
+ EdgeArray<edge> &mapEdge)
+{
+ // clear
+ for (node v = m_nodes.begin(); v; v = v->succ()) {
+ v->m_adjEdges.~GraphList<AdjElement>();
+ }
+
+ m_nodes.clear();
+ m_edges.clear();
+
+ m_nNodes = m_nEdges = m_nodeIdCount = m_edgeIdCount = 0;
+ m_nodeArrayTableSize = MIN_NODE_TABLE_SIZE;
+
+
+ // list of edges adjacent to nodes in nodes
+ SListPure<edge> edges;
+
+ // create nodes and assemble list of edges
+ //NOTE: nodes is a list of ACTIVE nodes
+ ListConstIterator<node> itG;
+ for(itG = nodes.begin(); itG.valid(); ++itG) {
+ node vG = *itG;
+ node v = mapNode[vG] = pureNewNode();
+
+ //we cannot assign the original degree, as there
+ //may be edges to non-active nodes
+ //v->m_indeg = vG->m_indeg;
+ //v->m_outdeg = vG->m_outdeg;
+
+ int inCount = 0;
+ int outCount = 0;
+ adjEntry adjG;
+ forall_adj(adjG,vG)
+ {
+ // coresponding adjacency entries differ by index modulo 2
+ // the following conditions makes sure that each edge is
+ // added only once to edges
+ if (activeNodes[adjG->m_edge->opposite(vG)])
+ {
+ if ((adjG->m_id & 1) == 0)
+ {
+ edges.pushBack(adjG->m_edge);
+ }//if one time
+ if (adjG->m_edge->source() == vG) outCount++;
+ else inCount++;
+ }//if opposite active
+ }//foralladj
+ v->m_indeg = inCount;
+ v->m_outdeg = outCount;
+ }//for nodes
+
+ // create edges
+ SListConstIterator<edge> it;
+ for(it = edges.begin(); it.valid(); ++it)
+ {
+ edge eG = *it;
+ node v = mapNode[eG->source()];
+ node w = mapNode[eG->target()];
+
+ AdjElement *adjSrc = OGDF_NEW AdjElement(v);
+
+ v->m_adjEdges.pushBack(adjSrc);
+ //v->m_outdeg++;
+
+ AdjElement *adjTgt = OGDF_NEW AdjElement(w);
+
+ w->m_adjEdges.pushBack(adjTgt);
+ //w->m_indeg++;
+
+ adjSrc->m_twin = adjTgt;
+ adjTgt->m_twin = adjSrc;
+
+ adjTgt->m_id = (adjSrc->m_id = m_edgeIdCount << 1) | 1;
+ edge e = OGDF_NEW EdgeElement(v,w,adjSrc,adjTgt,m_edgeIdCount++);
+
+ ++m_nEdges;
+ m_edges.pushBack(e);
+
+ mapEdge[eG] = adjSrc->m_edge = adjTgt->m_edge = e;
+ }
+
+ // set size of associated arrays and reinitialize all (we have now a
+ // completely new graph)
+ m_nodeArrayTableSize = nextPower2(MIN_NODE_TABLE_SIZE,m_nodeIdCount);
+ m_edgeArrayTableSize = nextPower2(MIN_EDGE_TABLE_SIZE,m_edgeIdCount);
+ reinitArrays();
+
+ OGDF_ASSERT_IF(dlConsistencyChecks, consistencyCheck());
+}//constructinitbyactivenodes
+
+//------------------
+
+
+
+node Graph::newNode()
+{
+ ++m_nNodes;
+ if (m_nodeIdCount == m_nodeArrayTableSize) {
+ m_nodeArrayTableSize <<= 1;
+ for(ListIterator<NodeArrayBase*> it = m_regNodeArrays.begin();
+ it.valid(); ++it)
+ {
+ (*it)->enlargeTable(m_nodeArrayTableSize);
+ }
+ }
+
+#ifdef OGDF_DEBUG
+ node v = OGDF_NEW NodeElement(this,m_nodeIdCount++);
+#else
+ node v = OGDF_NEW NodeElement(m_nodeIdCount++);
+#endif
+
+ m_nodes.pushBack(v);
+ // notify all registered observers
+ for(ListIterator<GraphObserver*> it = m_regStructures.begin();
+ it.valid(); ++it) (*it)->nodeAdded(v);
+
+ return v;
+}
+
+
+//what about negative index numbers?
+node Graph::newNode(int index)
+{
+ ++m_nNodes;
+
+ if(index >= m_nodeIdCount) {
+ m_nodeIdCount = index+1;
+
+ if(index >= m_nodeArrayTableSize) {
+ m_nodeArrayTableSize = nextPower2(m_nodeArrayTableSize,index);
+ for(ListIterator<NodeArrayBase*> it = m_regNodeArrays.begin();
+ it.valid(); ++it)
+ {
+ (*it)->enlargeTable(m_nodeArrayTableSize);
+ }
+ }
+ }
+
+#ifdef OGDF_DEBUG
+ node v = OGDF_NEW NodeElement(this,index);
+#else
+ node v = OGDF_NEW NodeElement(index);
+#endif
+
+ m_nodes.pushBack(v);
+ // notify all registered observers
+ for(ListIterator<GraphObserver*> it = m_regStructures.begin();
+ it.valid(); ++it) (*it)->nodeAdded(v);
+ return v;
+}
+
+
+node Graph::pureNewNode()
+{
+ ++m_nNodes;
+
+#ifdef OGDF_DEBUG
+ node v = OGDF_NEW NodeElement(this,m_nodeIdCount++);
+#else
+ node v = OGDF_NEW NodeElement(m_nodeIdCount++);
+#endif
+
+ m_nodes.pushBack(v);
+ // notify all registered observers
+ for(ListIterator<GraphObserver*> it = m_regStructures.begin();
+ it.valid(); ++it) (*it)->nodeAdded(v);
+ return v;
+}
+
+
+// IMPORTANT:
+// The indices of the two adjacency entries pointing to an edge differ
+// only in the last bit (adjSrc/2 == adjTgt/2)
+//
+// This can be useful sometimes in order to avoid visiting an edge twice.
+edge Graph::createEdgeElement(node v, node w, adjEntry adjSrc, adjEntry adjTgt)
+{
+ if (m_edgeIdCount == m_edgeArrayTableSize) {
+ m_edgeArrayTableSize <<= 1;
+
+ for(ListIterator<EdgeArrayBase*> it = m_regEdgeArrays.begin();
+ it.valid(); ++it)
+ {
+ (*it)->enlargeTable(m_edgeArrayTableSize);
+ }
+
+ for(ListIterator<AdjEntryArrayBase*> itAdj = m_regAdjArrays.begin();
+ itAdj.valid(); ++itAdj)
+ {
+ (*itAdj)->enlargeTable(m_edgeArrayTableSize << 1);
+ }
+ }
+
+ adjTgt->m_id = (adjSrc->m_id = m_edgeIdCount << 1) | 1;
+ edge e = OGDF_NEW EdgeElement(v,w,adjSrc,adjTgt,m_edgeIdCount++);
+ m_edges.pushBack(e);
+ // notify all registered observers
+ for(ListIterator<GraphObserver*> it = m_regStructures.begin();
+ it.valid(); ++it) (*it)->edgeAdded(e);
+ return e;
+}
+
+
+edge Graph::newEdge(node v, node w, int index)
+{
+ OGDF_ASSERT(v != 0 && w != 0);
+ OGDF_ASSERT(v->graphOf() == this && w->graphOf() == this);
+
+ ++m_nEdges;
+
+ AdjElement *adjSrc = OGDF_NEW AdjElement(v);
+
+ v->m_adjEdges.pushBack(adjSrc);
+ v->m_outdeg++;
+
+ AdjElement *adjTgt = OGDF_NEW AdjElement(w);
+
+ w->m_adjEdges.pushBack(adjTgt);
+ w->m_indeg++;
+
+ adjSrc->m_twin = adjTgt;
+ adjTgt->m_twin = adjSrc;
+
+ if(index >= m_edgeIdCount) {
+ m_edgeIdCount = index+1;
+
+ if(index >= m_edgeArrayTableSize) {
+ m_edgeArrayTableSize = nextPower2(m_edgeArrayTableSize,index);
+
+ for(ListIterator<EdgeArrayBase*> it = m_regEdgeArrays.begin();
+ it.valid(); ++it)
+ {
+ (*it)->enlargeTable(m_edgeArrayTableSize);
+ }
+
+ for(ListIterator<AdjEntryArrayBase*> itAdj = m_regAdjArrays.begin();
+ itAdj.valid(); ++itAdj)
+ {
+ (*itAdj)->enlargeTable(m_edgeArrayTableSize << 1);
+ }
+ }
+ }
+
+ adjTgt->m_id = (adjSrc->m_id = index/*m_edgeIdCount*/ << 1) | 1;
+ edge e = OGDF_NEW EdgeElement(v,w,adjSrc,adjTgt,index);
+ m_edges.pushBack(e);
+ // notify all registered observers
+ for(ListIterator<GraphObserver*> it = m_regStructures.begin();
+ it.valid(); ++it) (*it)->edgeAdded(e);
+ return adjSrc->m_edge = adjTgt->m_edge = e;
+}
+
+
+edge Graph::newEdge(node v, node w)
+{
+ OGDF_ASSERT(v != 0 && w != 0);
+ OGDF_ASSERT(v->graphOf() == this && w->graphOf() == this);
+
+ ++m_nEdges;
+
+ AdjElement *adjSrc = OGDF_NEW AdjElement(v);
+
+ v->m_adjEdges.pushBack(adjSrc);
+ v->m_outdeg++;
+
+ AdjElement *adjTgt = OGDF_NEW AdjElement(w);
+
+ w->m_adjEdges.pushBack(adjTgt);
+ w->m_indeg++;
+
+ adjSrc->m_twin = adjTgt;
+ adjTgt->m_twin = adjSrc;
+
+ edge e = createEdgeElement(v,w,adjSrc,adjTgt);
+
+ return adjSrc->m_edge = adjTgt->m_edge = e;
+}
+
+
+edge Graph::newEdge(adjEntry adjStart, adjEntry adjEnd, Direction dir)
+{
+ OGDF_ASSERT(adjStart != 0 && adjEnd != 0)
+ OGDF_ASSERT(adjStart->graphOf() == this && adjEnd->graphOf() == this);
+
+ ++m_nEdges;
+
+ node v = adjStart->theNode(), w = adjEnd->theNode();
+
+ AdjElement *adjTgt = OGDF_NEW AdjElement(w);
+ AdjElement *adjSrc = OGDF_NEW AdjElement(v);
+
+ if(dir == ogdf::after) {
+ w->m_adjEdges.insertAfter(adjTgt,adjEnd);
+ v->m_adjEdges.insertAfter(adjSrc,adjStart);
+ } else {
+ w->m_adjEdges.insertBefore(adjTgt,adjEnd);
+ v->m_adjEdges.insertBefore(adjSrc,adjStart);
+ }
+
+ w->m_indeg++;
+ v->m_outdeg++;
+
+ adjSrc->m_twin = adjTgt;
+ adjTgt->m_twin = adjSrc;
+
+ edge e = createEdgeElement(v,w,adjSrc,adjTgt);
+
+ return adjSrc->m_edge = adjTgt->m_edge = e;
+}
+
+edge Graph::newEdge(node v, adjEntry adjEnd)
+{
+ OGDF_ASSERT(v != 0 && adjEnd != 0)
+ OGDF_ASSERT(v->graphOf() == this && adjEnd->graphOf() == this);
+
+ ++m_nEdges;
+
+ node w = adjEnd->theNode();
+
+ AdjElement *adjTgt = OGDF_NEW AdjElement(w);
+
+ w->m_adjEdges.insertAfter(adjTgt,adjEnd);
+ w->m_indeg++;
+
+ AdjElement *adjSrc = OGDF_NEW AdjElement(v);
+
+ v->m_adjEdges.pushBack(adjSrc);
+ v->m_outdeg++;
+
+ adjSrc->m_twin = adjTgt;
+ adjTgt->m_twin = adjSrc;
+
+ edge e = createEdgeElement(v,w,adjSrc,adjTgt);
+
+ return adjSrc->m_edge = adjTgt->m_edge = e;
+}//newedge
+//copy of above function with edge ending at v
+edge Graph::newEdge(adjEntry adjStart, node v)
+{
+ OGDF_ASSERT(v != 0 && adjStart != 0)
+ OGDF_ASSERT(v->graphOf() == this && adjStart->graphOf() == this);
+
+ ++m_nEdges;
+
+ node w = adjStart->theNode();
+
+ AdjElement *adjSrc = OGDF_NEW AdjElement(w);
+
+ w->m_adjEdges.insertAfter(adjSrc, adjStart);
+ w->m_outdeg++;
+
+ AdjElement *adjTgt = OGDF_NEW AdjElement(v);
+
+ v->m_adjEdges.pushBack(adjTgt);
+ v->m_indeg++;
+
+ adjSrc->m_twin = adjTgt;
+ adjTgt->m_twin = adjSrc;
+
+ edge e = createEdgeElement(w,v,adjSrc,adjTgt);
+
+ return adjSrc->m_edge = adjTgt->m_edge = e;
+}//newedge
+
+
+void Graph::move(edge e,
+ adjEntry adjSrc,
+ Direction dirSrc,
+ adjEntry adjTgt,
+ Direction dirTgt)
+{
+ OGDF_ASSERT(e->graphOf() == this);
+ OGDF_ASSERT(adjSrc->graphOf() == this && adjTgt->graphOf() == this);
+ OGDF_ASSERT(adjSrc != e->m_adjSrc && adjSrc != e->m_adjTgt);
+ OGDF_ASSERT(adjTgt != e->m_adjSrc && adjTgt != e->m_adjTgt);
+
+ node v = adjSrc->m_node, w = adjTgt->m_node;
+ adjEntry adj1 = e->m_adjSrc, adj2 = e->m_adjTgt;
+ e->m_src->m_adjEdges.move(adj1,v->m_adjEdges,adjSrc,dirSrc);
+ e->m_tgt->m_adjEdges.move(adj2,w->m_adjEdges,adjTgt,dirTgt);
+
+ e->m_src->m_outdeg--;
+ e->m_tgt->m_indeg--;
+
+ adj1->m_node = e->m_src = v;
+ adj2->m_node = e->m_tgt = w;
+
+ v->m_outdeg++;
+ w->m_indeg++;
+}
+
+
+void Graph::moveTarget(edge e, node v)
+{
+ OGDF_ASSERT(e->graphOf() == this);
+ OGDF_ASSERT(v->graphOf() == this);
+
+ adjEntry adj = e->m_adjTgt;
+ e->m_tgt->m_adjEdges.move(adj,v->m_adjEdges);
+
+ e->m_tgt->m_indeg--;
+ adj->m_node = e->m_tgt = v;
+ v->m_indeg++;
+}
+
+void Graph::moveTarget(edge e, adjEntry adjTgt, Direction dir)
+{
+ node v = adjTgt->theNode();
+
+ OGDF_ASSERT(e->graphOf() == this);
+ OGDF_ASSERT(v->graphOf() == this);
+
+ adjEntry adj = e->m_adjTgt;
+ e->m_tgt->m_adjEdges.move(adj,v->m_adjEdges, adjTgt, dir);
+
+ e->m_tgt->m_indeg--;
+ adj->m_node = e->m_tgt = v;
+ v->m_indeg++;
+}
+
+// By Leipert
+void Graph::moveSource(edge e, node v)
+{
+ OGDF_ASSERT(e->graphOf() == this);
+ OGDF_ASSERT(v->graphOf() == this);
+
+ adjEntry adj = e->m_adjSrc;
+ e->m_src->m_adjEdges.move(adj,v->m_adjEdges);
+
+ e->m_src->m_outdeg--;
+ adj->m_node = e->m_src = v;
+ v->m_outdeg++;
+}
+
+void Graph::moveSource(edge e, adjEntry adjSrc, Direction dir)
+{
+ node v = adjSrc->theNode();
+
+ OGDF_ASSERT(e->graphOf() == this);
+ OGDF_ASSERT(v->graphOf() == this);
+
+ adjEntry adj = e->m_adjSrc;
+ e->m_src->m_adjEdges.move(adj,v->m_adjEdges, adjSrc, dir);
+
+ e->m_src->m_outdeg--;
+ adj->m_node = e->m_src = v;
+ v->m_outdeg++;
+}
+
+edge Graph::split(edge e)
+{
+ OGDF_ASSERT(e != 0 && e->graphOf() == this);
+
+ ++m_nEdges;
+
+ node u = newNode();
+ u->m_indeg = u->m_outdeg = 1;
+
+ adjEntry adjTgt = OGDF_NEW AdjElement(u);
+ adjTgt->m_edge = e;
+ adjTgt->m_twin = e->m_adjSrc;
+ e->m_adjSrc->m_twin = adjTgt;
+
+ // adapt adjacency entry index to hold invariant
+ adjTgt->m_id = e->m_adjTgt->m_id;
+
+ u->m_adjEdges.pushBack(adjTgt);
+
+ adjEntry adjSrc = OGDF_NEW AdjElement(u);
+ adjSrc->m_twin = e->m_adjTgt;
+ u->m_adjEdges.pushBack(adjSrc);
+
+ int oldId = e->m_adjTgt->m_id;
+ edge e2 = createEdgeElement(u,e->m_tgt,adjSrc,e->m_adjTgt);
+ resetAdjEntryIndex(e->m_adjTgt->m_id,oldId);
+
+ e2->m_adjTgt->m_twin = adjSrc;
+ e->m_adjTgt->m_edge = adjSrc->m_edge = e2;
+
+ e->m_tgt = u;
+ e->m_adjTgt = adjTgt;
+ return e2;
+}
+
+
+void Graph::unsplit(node u)
+{
+ edge eIn = u->firstAdj()->theEdge();
+ edge eOut = u->lastAdj()->theEdge();
+
+ if (eIn->target() != u)
+ swap(eIn,eOut);
+
+ unsplit(eIn,eOut);
+}
+
+
+
+void Graph::unsplit(edge eIn, edge eOut)
+{
+ node u = eIn->target();
+
+ // u must be a node with exactly one incoming edge eIn and one outgoing
+ // edge eOut
+ OGDF_ASSERT(u->graphOf() == this && u->indeg() == 1 &&
+ u->outdeg() == 1 && eOut->source() == u);
+
+ // none of them is a self-loop!
+ OGDF_ASSERT(eIn->isSelfLoop() == false && eOut->isSelfLoop() == false);
+
+ // we reuse these adjacency entries
+ adjEntry adjSrc = eIn ->m_adjSrc;
+ adjEntry adjTgt = eOut->m_adjTgt;
+
+ eIn->m_tgt = eOut->m_tgt;
+
+ // adapt adjacency entry index to hold invariant
+ resetAdjEntryIndex(eIn->m_adjTgt->m_id,adjTgt->m_id);
+ adjTgt->m_id = eIn->m_adjTgt->m_id; // correct id of adjacency entry!
+
+ eIn->m_adjTgt = adjTgt;
+
+ adjSrc->m_twin = adjTgt;
+ adjTgt->m_twin = adjSrc;
+
+ adjTgt->m_edge = eIn;
+
+ // notify all registered observers
+ for(ListIterator<GraphObserver*> it = m_regStructures.begin();
+ it.valid(); ++it) (*it)->edgeDeleted(eOut);
+ // notify all registered observers
+ for(ListIterator<GraphObserver*> it = m_regStructures.begin();
+ it.valid(); ++it) (*it)->nodeDeleted(u);
+ // remove structures that are no longer used
+ m_edges.del(eOut);
+ m_nodes.del(u);
+ --m_nNodes;
+ --m_nEdges;
+
+}
+
+
+void Graph::delNode(node v)
+{
+ OGDF_ASSERT(v != 0 && v->graphOf() == this)
+
+ for(ListIterator<GraphObserver*> it = m_regStructures.begin();
+ it.valid(); ++it) (*it)->nodeDeleted(v);
+
+ --m_nNodes;
+
+ GraphList<AdjElement> &adjEdges = v->m_adjEdges;
+ AdjElement *adj;
+ while((adj = adjEdges.begin()) != 0)
+ delEdge(adj->m_edge);
+
+ m_nodes.del(v);
+}
+
+
+void Graph::delEdge(edge e)
+{
+ OGDF_ASSERT(e != 0 && e->graphOf() == this)
+
+ // notify all registered observers
+ for(ListIterator<GraphObserver*> it = m_regStructures.begin();
+ it.valid(); ++it) (*it)->edgeDeleted(e);
+
+ --m_nEdges;
+
+ node src = e->m_src, tgt = e->m_tgt;
+
+ src->m_adjEdges.del(e->m_adjSrc);
+ src->m_outdeg--;
+ tgt->m_adjEdges.del(e->m_adjTgt);
+ tgt->m_indeg--;
+
+ m_edges.del(e);
+}
+
+
+void Graph::clear()
+{
+ //tell all structures to clear their graph-initialized data
+ for(ListIterator<GraphObserver*> it = m_regStructures.begin();
+ it.valid(); ++it)
+ {
+ (*it)->cleared();
+ }//for
+ for (node v = m_nodes.begin(); v; v = v->succ()) {
+ v->m_adjEdges.~GraphList<AdjElement>();
+ }
+
+ m_nodes.clear();
+ m_edges.clear();
+
+ m_nNodes = m_nEdges = m_nodeIdCount = m_edgeIdCount = 0;
+ m_nodeArrayTableSize = MIN_NODE_TABLE_SIZE;
+ reinitArrays();
+
+ OGDF_ASSERT_IF(dlConsistencyChecks, consistencyCheck());
+}
+
+
+void Graph::reverseEdge(edge e)
+{
+ OGDF_ASSERT(e != 0 && e->graphOf() == this)
+ node &src = e->m_src, &tgt = e->m_tgt;
+
+ swap(src,tgt);
+ swap(e->m_adjSrc,e->m_adjTgt);
+ src->m_outdeg++; src->m_indeg--;
+ tgt->m_outdeg--; tgt->m_indeg++;
+}
+
+
+void Graph::reverseAllEdges()
+{
+ for (edge e = m_edges.begin(); e; e = e->succ())
+ reverseEdge(e);
+
+ OGDF_ASSERT_IF(dlConsistencyChecks, consistencyCheck());
+}
+
+
+void Graph::reverseAdjEdges()
+{
+ node v;
+ forall_nodes(v,*this)
+ reverseAdjEdges(v);
+}
+
+
+node Graph::chooseNode() const
+{
+ if (m_nNodes == 0) return 0;
+ int k = ogdf::randomNumber(0,m_nNodes-1);
+ node v = firstNode();
+ while(k--) v = v->succ();
+ return v;
+}
+
+
+edge Graph::chooseEdge() const
+{
+ if (m_nEdges == 0) return 0;
+ int k = ogdf::randomNumber(0,m_nEdges-1);
+ edge e = firstEdge();
+ while(k--) e = e->succ();
+ return e;
+}
+
+
+edge Graph::searchEdge(node v, node w) const
+{
+ OGDF_ASSERT(v != 0 && v->graphOf() == this)
+ OGDF_ASSERT(w != 0 && w->graphOf() == this)
+ adjEntry adj;
+ forall_adj(adj,v) {
+ if(adj->twinNode() == w) return adj->twin()->theEdge();
+ }
+ return 0;
+}
+
+
+void Graph::hideEdge(edge e)
+{
+ OGDF_ASSERT(e != 0 && e->graphOf() == this)
+ --m_nEdges;
+
+ node src = e->m_src, tgt = e->m_tgt;
+
+ src->m_adjEdges.delPure(e->m_adjSrc);
+ src->m_outdeg--;
+ tgt->m_adjEdges.delPure(e->m_adjTgt);
+ tgt->m_indeg--;
+
+ m_edges.move(e, m_hiddenEdges);
+}
+
+
+void Graph::restoreEdge(edge e)
+{
+ ++m_nEdges;
+
+ node v = e->m_src;
+ v->m_adjEdges.pushBack(e->m_adjSrc);
+ ++v->m_outdeg;
+
+ node w = e->m_tgt;
+ w->m_adjEdges.pushBack(e->m_adjTgt);
+ ++w->m_indeg;
+
+ m_hiddenEdges.move(e, m_edges);
+}
+
+
+void Graph::restoreAllEdges()
+{
+ edge e, ePrev;
+ for(e = m_hiddenEdges.rbegin(); e != 0; e = ePrev) {
+ ePrev = e->pred();
+ restoreEdge(e);
+ }
+}
+
+
+int Graph::genus() const
+{
+ if (m_nNodes == 0) return 0;
+
+ int nIsolated = 0;
+ node v;
+ forall_nodes(v,*this)
+ if (v->degree() == 0) ++nIsolated;
+
+ NodeArray<int> component(*this);
+ int nCC = connectedComponents(*this,component);
+
+ AdjEntryArray<bool> visited(*this,false);
+ int nFaceCycles = 0;
+
+ forall_nodes(v,*this) {
+ adjEntry adj1;
+ forall_adj(adj1,v) {
+ if (visited[adj1]) continue;
+
+ adjEntry adj = adj1;
+ do {
+ visited[adj] = true;
+ adj = adj->faceCycleSucc();
+ } while (adj != adj1);
+
+ ++nFaceCycles;
+ }
+ }
+
+ return (m_nEdges - m_nNodes - nIsolated - nFaceCycles + 2*nCC) / 2;
+}
+
+
+ListIterator<NodeArrayBase*> Graph::registerArray(
+ NodeArrayBase *pNodeArray) const
+{
+ return m_regNodeArrays.pushBack(pNodeArray);
+}
+
+
+ListIterator<EdgeArrayBase*> Graph::registerArray(
+ EdgeArrayBase *pEdgeArray) const
+{
+ return m_regEdgeArrays.pushBack(pEdgeArray);
+}
+
+
+ListIterator<AdjEntryArrayBase*> Graph::registerArray(
+ AdjEntryArrayBase *pAdjArray) const
+{
+ return m_regAdjArrays.pushBack(pAdjArray);
+}
+
+ListIterator<GraphObserver*> Graph::registerStructure(
+ GraphObserver *pStructure) const
+{
+ return m_regStructures.pushBack(pStructure);
+}//registerstructure
+
+
+void Graph::unregisterArray(ListIterator<NodeArrayBase*> it) const
+{
+ m_regNodeArrays.del(it);
+}
+
+
+void Graph::unregisterArray(ListIterator<EdgeArrayBase*> it) const
+{
+ m_regEdgeArrays.del(it);
+}
+
+
+void Graph::unregisterArray(ListIterator<AdjEntryArrayBase*> it) const
+{
+ m_regAdjArrays.del(it);
+}
+
+void Graph::unregisterStructure(ListIterator<GraphObserver*> it) const
+{
+ m_regStructures.del(it);
+}
+
+void Graph::reinitArrays()
+{
+ ListIterator<NodeArrayBase*> itNode = m_regNodeArrays.begin();
+ for(; itNode.valid(); ++itNode)
+ (*itNode)->reinit(m_nodeArrayTableSize);
+
+ ListIterator<EdgeArrayBase*> itEdge = m_regEdgeArrays.begin();
+ for(; itEdge.valid(); ++itEdge)
+ (*itEdge)->reinit(m_edgeArrayTableSize);
+
+ ListIterator<AdjEntryArrayBase*> itAdj = m_regAdjArrays.begin();
+ for(; itAdj.valid(); ++itAdj)
+ (*itAdj)->reinit(m_edgeArrayTableSize << 1);
+}
+
+void Graph::reinitStructures()
+{
+ //is there a challenge?
+ ListIterator<GraphObserver*> itGS = m_regStructures.begin();
+ for (;itGS.valid(); ++itGS)
+ (*itGS)->reInit();
+}
+
+
+void Graph::resetAdjEntryIndex(int newIndex, int oldIndex)
+{
+ ListIterator<AdjEntryArrayBase*> itAdj = m_regAdjArrays.begin();
+ for(; itAdj.valid(); ++itAdj)
+ (*itAdj)->resetIndex(newIndex,oldIndex);
+}
+
+
+int Graph::nextPower2(int start, int idCount)
+{
+ while (start <= idCount)
+ start <<= 1;
+
+ return start;
+}
+
+
+bool Graph::readGML(const char *fileName)
+{
+ ifstream is(fileName);
+ return readGML(is);
+}
+
+
+bool Graph::readGML(istream &is)
+{
+ GmlParser gml(is);
+ if (gml.error()) return false;
+ bool result = gml.read(*this);
+
+ OGDF_ASSERT_IF(dlConsistencyChecks, consistencyCheck());
+
+ return result;
+}
+
+
+void Graph::writeGML(const char *fileName) const
+{
+ ofstream os(fileName);
+ writeGML(os);
+}
+
+
+void Graph::writeGML(ostream &os) const
+{
+ NodeArray<int> id(*this);
+ int nextId = 0;
+
+ os << "Creator \"ogdf::Graph::writeGML\"\n";
+ os << "graph [\n";
+ os << " directed 1\n";
+
+ node v;
+ forall_nodes(v,*this) {
+ os << " node [\n";
+ os << " id " << (id[v] = nextId++) << "\n";
+ os << " ]\n"; // node
+ }
+
+ edge e;
+ forall_edges(e,*this) {
+ os << " edge [\n";
+ os << " source " << id[e->source()] << "\n";
+ os << " target " << id[e->target()] << "\n";
+ os << " ]\n"; // edge
+ }
+
+ os << "]\n"; // graph
+}
+
+
+// read graph in LEDA format from file fileName
+bool Graph::readLEDAGraph(const char *fileName)
+{
+ ifstream is(fileName);
+ return readLEDAGraph(is);
+}
+
+
+bool Graph::readToEndOfLine(istream &is)
+{
+ int c;
+ do {
+ if (is.eof()) return false;
+ c = is.get();
+ } while(c != '\n');
+ return true;
+}
+
+
+// read graph in LEDA format from input stream is
+bool Graph::readLEDAGraph(istream &is)
+{
+ clear();
+
+ // the first three strings in the LEDA format describe the type of the
+ // format, of nodes and of edges. We simply ignore the additional node/
+ // edge attributes
+ String formatType, nodeType, edgeType;
+
+ is >> formatType;
+ is >> nodeType;
+ is >> edgeType;
+
+ if (formatType != "LEDA.GRAPH")
+ return false;
+
+
+ // number of nodes
+ int n;
+ is >> n >> std::ws;
+
+ // create n nodes and ignore n lines
+ Array<node> nodes(1,n);
+ int i;
+ for(i = 1; i <= n; ++i) {
+ if (readToEndOfLine(is) == false)
+ return false;
+ nodes[i] = newNode();
+ }
+
+ // number of edges
+ int m;
+ is >> m;
+
+ for(i = 1; i <= m; ++i) {
+ // read index of source and target node
+ int src, tgt;
+ is >> src >> tgt;
+
+ // indices valid?
+ if (src < 1 || n < src || tgt < 1 || n < tgt)
+ return false;
+
+ newEdge(nodes[src],nodes[tgt]);
+
+ // ignore rest of line
+ if (readToEndOfLine(is) == false)
+ return false;
+ }
+
+ OGDF_ASSERT_IF(dlConsistencyChecks, consistencyCheck());
+
+ return true;
+}
+
+
+bool Graph::consistencyCheck() const
+{
+ int n = 0;
+ node v;
+ forall_nodes(v,*this) {
+#ifdef OGDF_DEBUG
+ if (v->graphOf() != this)
+ return false;
+#endif
+
+ n++;
+ int in = 0, out = 0;
+
+ adjEntry adj;
+ forall_adj(adj,v) {
+ edge e = adj->m_edge;
+ if (adj->m_twin->m_edge != e)
+ return false;
+
+ if (e->m_adjSrc == adj)
+ out++;
+ else if (e->m_adjTgt == adj)
+ in++;
+ else
+ return false;
+
+ if (adj->m_node != v)
+ return false;
+
+#ifdef OGDF_DEBUG
+ if (adj->graphOf() != this)
+ return false;
+#endif
+ }
+
+ if (v->m_indeg != in)
+ return false;
+
+ if (v->m_outdeg != out)
+ return false;
+ }
+
+ if (n != m_nNodes)
+ return false;
+
+ int m = 0;
+ edge e;
+ forall_edges(e,*this) {
+#ifdef OGDF_DEBUG
+ if (e->graphOf() != this)
+ return false;
+#endif
+
+ m++;
+ if (e->m_adjSrc == e->m_adjTgt)
+ return false;
+
+ if (e->m_adjSrc->m_edge != e)
+ return false;
+
+ if (e->m_adjTgt->m_edge != e)
+ return false;
+
+ if (e->m_adjSrc->m_node != e->m_src)
+ return false;
+
+ if (e->m_adjTgt->m_node != e->m_tgt)
+ return false;
+ }
+
+ if (m != m_nEdges)
+ return false;
+
+ return true;
+}
+
+
+void Graph::resetEdgeIdCount(int maxId)
+{
+ m_edgeIdCount = maxId+1;
+
+#ifdef OGDF_DEBUG
+ if (ogdf::debugLevel >= int(ogdf::dlConsistencyChecks)) {
+ edge e;
+ forall_edges(e,*this)
+ {
+ // if there is an edge with higer index than maxId, we cannot
+ // set the edge id count to maxId+1
+ if (e->index() > maxId)
+ OGDF_ASSERT(false);
+ }
+ }
+#endif
+}
+
+
+node Graph::splitNode(adjEntry adjStartLeft, adjEntry adjStartRight)
+{
+ OGDF_ASSERT(adjStartLeft != 0 && adjStartRight != 0);
+ OGDF_ASSERT(adjStartLeft->graphOf() == this && adjStartRight->graphOf() == this);
+ OGDF_ASSERT(adjStartLeft->theNode() == adjStartRight->theNode());
+
+ node w = newNode();
+
+ adjEntry adj, adjSucc;
+ for(adj = adjStartRight; adj != adjStartLeft; adj = adjSucc) {
+ adjSucc = adj->cyclicSucc();
+ moveAdj(adj,w);
+ }
+
+ newEdge(adjStartLeft, adjStartRight, ogdf::before);
+
+ return w;
+}
+
+
+node Graph::contract(edge e)
+{
+ adjEntry adjSrc = e->adjSource();
+ adjEntry adjTgt = e->adjTarget();
+ node v = e->source();
+ node w = e->target();
+
+ adjEntry adjNext;
+ for(adjEntry adj = adjTgt->cyclicSucc(); adj != adjTgt; adj = adjNext)
+ {
+ adjNext = adj->cyclicSucc();
+
+ edge eAdj = adj->theEdge();
+ if(w == eAdj->source())
+ moveSource(eAdj, adjSrc, before);
+ else
+ moveTarget(eAdj, adjSrc, before);
+ }
+
+ delNode(adjTgt->theNode());
+
+ return v;
+}
+
+
+void Graph::moveAdj(adjEntry adj, node w)
+{
+ node v = adj->m_node;
+
+ v->m_adjEdges.move(adj,w->m_adjEdges);
+ adj->m_node = w;
+
+ edge e = adj->m_edge;
+ if(v == e->m_src) {
+ --v->m_outdeg;
+ e->m_src = w;
+ ++w->m_outdeg;
+ } else {
+ --v->m_indeg;
+ e->m_tgt = w;
+ ++w->m_indeg;
+ }
+}
+
+
+ostream &operator<<(ostream &os, ogdf::node v)
+{
+ if (v) os << v->index(); else os << "nil";
+ return os;
+}
+
+ostream &operator<<(ostream &os, ogdf::edge e)
+{
+ if (e) os << "(" << e->source() << "," << e->target() << ")";
+ else os << "nil";
+ return os;
+}
+
+ostream &operator<<(ostream &os, ogdf::adjEntry adj)
+{
+ if (adj) {
+ ogdf::edge e = adj->theEdge();
+ if (adj == e->adjSource())
+ os << e->source() << "->" << e->target();
+ else
+ os << e->target() << "->" << e->source();
+ } else os << "nil";
+ return os;
+}
+
+
+} // end namespace ogdf
+
diff --git a/ogdf/basic/Graph.h b/ogdf/basic/Graph.h
new file mode 100644
index 0000000..6f2fc64
--- /dev/null
+++ b/ogdf/basic/Graph.h
@@ -0,0 +1,75 @@
+/*
+ * $Revision: 2523 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-02 20:59:27 +0200 (Mon, 02 Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Includes declaration of graph class.
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_GRAPH_H
+#define OGDF_GRAPH_H
+
+
+#include "List.h"
+#include "NodeArray.h"
+#include "EdgeArray.h"
+
+
+
+namespace ogdf {
+
+ //! Output operator for nodes; prints node index (or "nil").
+ OGDF_EXPORT ostream &operator<<(ostream &os, ogdf::node v);
+
+ //! Output operator for edges; prints source and target indices (or "nil").
+ OGDF_EXPORT ostream &operator<<(ostream &os, ogdf::edge e);
+
+ //! Output operator for adjacency entries; prints node and twin indices (or "nil").
+ OGDF_EXPORT ostream &operator<<(ostream &os, ogdf::adjEntry adj);
+
+
+} // end namespace ogdf
+
+#endif
diff --git a/ogdf/basic/GraphAttributes.cpp b/ogdf/basic/GraphAttributes.cpp
new file mode 100644
index 0000000..2f9418c
--- /dev/null
+++ b/ogdf/basic/GraphAttributes.cpp
@@ -0,0 +1,1256 @@
+/*
+ * $Revision: 2571 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-10 17:25:20 +0200 (Di, 10. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of class GraphAttributes.
+ *
+ * Class GraphAttributes extends a graph by graphical attributes like
+ * node position, color, etc.
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "GraphAttributes.h"
+#include "../fileformats/GmlParser.h"
+#include "../fileformats/XmlParser.h"
+
+
+namespace ogdf {
+
+//---------------------------------------------------------
+// GraphAttributes
+// graph topology + graphical attributes
+//---------------------------------------------------------
+
+GraphAttributes::GraphAttributes() : m_pGraph(0), m_directed(true) { }
+
+
+
+GraphAttributes::GraphAttributes(const Graph &G, long initAttr) :
+ m_pGraph(&G), m_directed(true), m_attributes(0)
+{
+ initAttributes(m_attributes = initAttr);
+}
+
+
+
+void GraphAttributes::initAttributes(long attr)
+{
+ m_attributes |= attr;
+
+ //no color without graphics
+ OGDF_ASSERT( (m_attributes & nodeGraphics) != 0 || (m_attributes & nodeColor) == 0);
+ //no fill and linewithout graphics
+ OGDF_ASSERT( (m_attributes & nodeGraphics) != 0 || (attr & nodeStyle) == 0);
+ //no color without graphics
+ OGDF_ASSERT( (m_attributes & edgeGraphics) != 0 || (attr & edgeColor) == 0);
+
+ if (attr & nodeGraphics) {
+ m_x .init(*m_pGraph,0.0);
+ m_y .init(*m_pGraph,0.0);
+ m_width .init(*m_pGraph,0.0);
+ m_height.init(*m_pGraph,0.0);
+ m_nodeShape.init(*m_pGraph,rectangle);
+ }
+
+ if (attr & nodeColor)
+ {
+ m_nodeColor.init(*m_pGraph, "");
+ m_nodeLine.init(*m_pGraph, "");
+ }
+
+ if (attr & nodeStyle)
+ {
+ m_nodePattern.init(*m_pGraph, bpNone);
+ m_nodeStyle.init(*m_pGraph, esSolid);
+ m_nodeLineWidth.init(*m_pGraph, 1);
+ //images should not be added here as nodestyle, purely experimental
+ //such that it fits PG code
+ //images:
+ m_imageUri.init(*m_pGraph, "");
+ m_imageStyle.init(*m_pGraph, GraphAttributes::FreeScale);
+ m_imageAlign.init(*m_pGraph, GraphAttributes::Center);
+ m_imageDrawLine.init(*m_pGraph, false);
+ m_imageWidth.init(*m_pGraph, 0);
+ m_imageHeight.init(*m_pGraph, 0);
+ }
+
+ if (attr & edgeGraphics) {
+ m_bends.init(*m_pGraph,DPolyline());
+ }
+
+ if (attr & edgeColor)
+ m_edgeColor.init(*m_pGraph);
+
+ if (attr & edgeStyle)
+ {
+ m_edgeStyle.init(*m_pGraph, esSolid);
+ m_edgeWidth.init(*m_pGraph, 1.0);
+ }
+
+ if (attr & nodeLevel) {
+ m_level.init(*m_pGraph,0);
+ }
+ if (attr & nodeWeight) {
+ m_nodeIntWeight.init(*m_pGraph,0);
+ }
+ if (attr & edgeIntWeight) {
+ m_intWeight.init(*m_pGraph,1);
+ }
+ if (attr & edgeDoubleWeight) {
+ m_doubleWeight.init(*m_pGraph,1.0);
+ }
+ if (attr & nodeLabel) {
+ m_nodeLabel.init(*m_pGraph);
+ }
+ if (attr & edgeLabel) {
+ m_edgeLabel.init(*m_pGraph);
+ }
+ if (attr & edgeType) {
+ m_eType.init(*m_pGraph,Graph::association);//should be Graph::standard end explicitly set
+ }
+ if (attr & nodeType) {
+ m_vType.init(*m_pGraph,Graph::vertex);
+ }
+ if (attr & nodeId) {
+ m_nodeId.init(*m_pGraph, -1);
+ }
+ if (attr & edgeArrow) {
+ m_edgeArrow.init(*m_pGraph, undefined);
+ }
+ if (attr & nodeTemplate) {
+ m_nodeTemplate.init(*m_pGraph);
+ }
+ if (attr & edgeSubGraph) {
+ m_subGraph.init(*m_pGraph,0);
+ }
+}
+
+void GraphAttributes::destroyAttributes(long attr)
+{
+ m_attributes &= ~attr;
+
+ if (attr & nodeGraphics) {
+ m_x .init();
+ m_y .init();
+ m_width .init();
+ m_height.init();
+ m_nodeShape.init();
+ if (attr & nodeColor)
+ m_nodeColor.init();
+ if (attr & nodeStyle)
+ {
+ m_nodePattern.init();
+ m_nodeLine.init();
+ m_nodeLineWidth.init();
+ //should have its own trigger attribute
+ //images
+ m_imageUri.init();
+ m_imageStyle.init();
+ m_imageAlign.init();
+ m_imageDrawLine.init();
+ m_imageWidth.init();
+ m_imageHeight.init();
+ }
+ }
+
+ if (attr & edgeGraphics) {
+ m_bends.init();
+ }
+ if (attr & edgeColor)
+ {
+ m_edgeColor.init();
+ }
+ if (attr & edgeStyle)
+ {
+ m_edgeStyle.init();
+ m_edgeWidth.init();
+ }
+
+ if (attr & nodeLevel) {
+ m_level.init();
+ }
+ if (attr & nodeWeight) {
+ m_nodeIntWeight.init();
+ }
+ if (attr & edgeIntWeight) {
+ m_intWeight.init();
+ }
+ if (attr & edgeDoubleWeight) {
+ m_doubleWeight.init();
+ }
+ if (attr & nodeLabel) {
+ m_nodeLabel.init();
+ }
+ if (attr & edgeLabel) {
+ m_edgeLabel.init();
+ }
+ if (attr & nodeId) {
+ m_nodeId.init();
+ }
+ if (attr & edgeArrow) {
+ m_edgeArrow.init();
+ }
+ if (attr & nodeTemplate) {
+ m_nodeTemplate.init();
+ }
+ if (attr & edgeSubGraph) {
+ m_subGraph.init();
+ }
+}
+
+
+void GraphAttributes::init(const Graph &G, long initAttr)
+{
+ m_pGraph = &G;
+ destroyAttributes(m_attributes);
+ m_attributes = 0;
+ initAttributes(m_attributes = initAttr);
+}
+
+void GraphAttributes::setAllWidth(double w)
+{
+ node v;
+ forall_nodes(v,*m_pGraph)
+ m_width[v] = w;
+}
+
+
+void GraphAttributes::setAllHeight(double h)
+{
+ node v;
+ forall_nodes(v,*m_pGraph)
+ m_height[v] = h;
+}
+
+
+void GraphAttributes::clearAllBends()
+{
+ edge e;
+ forall_edges(e,*m_pGraph)
+ m_bends[e].clear();
+}
+
+
+bool GraphAttributes::readGML(Graph &G, const String &fileName)
+{
+ ifstream is(fileName.cstr());
+ if (!is)
+ return false; // couldn't open file
+
+ return readGML(G,is);
+}
+
+
+bool GraphAttributes::readGML(Graph &G, istream &is)
+{
+ GmlParser gml(is);
+ if (gml.error())
+ return false;
+
+ return gml.read(G,*this);
+}
+
+
+bool GraphAttributes::readRudy(Graph &G, const String &fileName)
+{
+ ifstream is(fileName.cstr());
+ if (!is)
+ return false;
+ return readRudy(G,is);
+}
+
+
+bool GraphAttributes::readRudy(Graph &G, istream &is)
+{
+ if (!is)
+ return false;
+ int i;
+ int n, m;
+ int src, tgt;
+ double weight;
+ edge e;
+
+ is >> n >> m;
+
+ G.clear();
+ Array<node> mapToNode(0,n-1,0);
+
+ if (attributes() & edgeDoubleWeight){
+ for(i=0; i<m; i++) {
+ is >> src >> tgt >> weight;
+ src--;
+ tgt--;
+ if(mapToNode[src] == 0) mapToNode[src] = G.newNode(src);
+ if(mapToNode[tgt] == 0) mapToNode[tgt] = G.newNode(tgt);
+ e = G.newEdge(mapToNode[src],mapToNode[tgt]);
+ this->doubleWeight(e)=weight;
+ }
+ }
+ return true;
+}
+
+
+void GraphAttributes::writeRudy(const String &fileName) const
+{
+ ofstream os(fileName.cstr());
+ writeRudy(os);
+}
+
+
+void GraphAttributes::writeRudy(ostream &os) const
+{
+ const Graph &G = this->constGraph();
+ os << G.numberOfNodes() << " " << G.numberOfEdges() << endl;
+
+ edge e;
+ if (attributes() & edgeDoubleWeight){
+ forall_edges(e,G) {
+ os << (e->source()->index())+1 << " " << (e->target()->index())+1;
+ os << " " << this->doubleWeight(e) << endl;
+ }
+ }
+ else forall_edges(e,G) os << (e->source()->index())+1 << " " << (e->target()->index())+1 << endl;
+}
+
+
+const int c_maxLengthPerLine = 200;
+
+void GraphAttributes::writeLongString(ostream &os, const String &str) const
+{
+ os << "\"";
+
+ int num = 1;
+ const char *p = str.cstr();
+ while(*p != 0)
+ {
+ switch(*p) {
+ case '\\':
+ os << "\\\\";
+ num += 2;
+ break;
+ case '\"':
+ os << "\\\"";
+ num += 2;
+ break;
+
+ // ignored white space
+ case '\r':
+ case '\n':
+ case '\t':
+ break;
+
+ default:
+ os << *p;
+ ++num;
+ }
+
+ if(num >= c_maxLengthPerLine) {
+ os << "\\\n";
+ num = 0;
+ }
+
+ ++p;
+ }
+
+ os << "\"";
+}
+
+
+void GraphAttributes::writeGML(const String &fileName) const
+{
+ ofstream os(fileName.cstr());
+ writeGML(os);
+}
+
+
+void GraphAttributes::writeGML(ostream &os) const
+{
+ NodeArray<int> id(*m_pGraph);
+ int nextId = 0;
+
+ os.setf(ios::showpoint);
+ os.precision(10);
+
+ os << "Creator \"ogdf::GraphAttributes::writeGML\"\n";
+
+ os << "graph [\n";
+
+ os << (m_directed ? " directed 1\n" : " directed 0\n");
+
+ node v;
+ forall_nodes(v,*m_pGraph) {
+ os << " node [\n";
+
+ os << " id " << (id[v] = nextId++) << "\n";
+
+ if (attributes() & nodeTemplate) {
+ os << " template ";
+ writeLongString(os, templateNode(v));
+ os << "\n";
+ }
+
+ if (attributes() & nodeLabel) {
+ //os << "label \"" << labelNode(v) << "\"\n";
+ os << " label ";
+ writeLongString(os, labelNode(v));
+ os << "\n";
+ }
+
+ if (m_attributes & nodeGraphics) {
+ os << " graphics [\n";
+ os << " x " << m_x[v] << "\n";
+ os << " y " << m_y[v] << "\n";
+ os << " w " << m_width[v] << "\n";
+ os << " h " << m_height[v] << "\n";
+ if (m_attributes & nodeColor)
+ {
+ os << " fill \"" << m_nodeColor[v] << "\"\n";
+ os << " line \"" << m_nodeLine[v] << "\"\n";
+ }//color
+ if (m_attributes & nodeStyle)
+ {
+ os << " pattern \"" << m_nodePattern[v] << "\"\n";
+ os << " stipple " << styleNode(v) << "\n";
+ os << " lineWidth " << lineWidthNode(v) << "\n";
+ }
+ switch (m_nodeShape[v])
+ {
+ case rectangle: os << " type \"rectangle\"\n"; break;
+ case oval: os << " type \"oval\"\n"; break;
+ }
+ os << " width 1.0\n";
+ os << " ]\n"; // graphics
+ }
+
+ os << " ]\n"; // node
+ }
+
+ edge e;
+ forall_edges(e,*m_pGraph) {
+ os << " edge [\n";
+
+ os << " source " << id[e->source()] << "\n";
+ os << " target " << id[e->target()] << "\n";
+
+ if (attributes() & edgeLabel){
+ os << " label ";
+ writeLongString(os, labelEdge(e));
+ os << "\n";
+ }
+ if (attributes() & edgeType)
+ os << " generalization " << type(e) << "\n";
+
+ if (attributes() & edgeSubGraph)
+ os << " subgraph " << subGraphBits(e) << "\n";
+
+ if (m_attributes & edgeGraphics) {
+ os << " graphics [\n";
+
+ os << " type \"line\"\n";
+
+ if (attributes() & GraphAttributes::edgeType) {
+ if (attributes() & GraphAttributes::edgeArrow) {
+ switch(arrowEdge(e)) {
+ case GraphAttributes::none:
+ os << " arrow \"none\"\n";
+ break;
+
+ case GraphAttributes::last:
+ os << " arrow \"last\"\n";
+ break;
+
+ case GraphAttributes::first:
+ os << " arrow \"first\"\n";
+ break;
+
+ case GraphAttributes::both:
+ os << " arrow \"both\"\n";
+ break;
+
+ case GraphAttributes::undefined:
+ // do nothing
+ break;
+
+ default:
+ // do nothing
+ break;
+ }
+ } else {
+ if (type(e) == Graph::generalization)
+ os << " arrow \"last\"\n";
+ else
+ os << " arrow \"none\"\n";
+ }
+
+ } else { // GraphAttributes::edgeType not used
+ if (m_directed) {
+ os << " arrow \"last\"\n";
+ } else {
+ os << " arrow \"none\"\n";
+ }
+ }
+
+ if (attributes() & GraphAttributes::edgeStyle)
+ {
+ os << " stipple " << styleEdge(e) << "\n";
+ os << " lineWidth " << edgeWidth(e) << "\n";
+ }//edgestyle is gml graphlet extension!!!
+ if (attributes() & edgeDoubleWeight)
+ {
+ os << " weight " << doubleWeight(e) << "\n";
+ }
+ //hier noch Unterscheidung Knotentypen, damit die Berechnung
+ //fuer Ellipsen immer bis zum echten Rand rechnet
+ const DPolyline &dpl = m_bends[e];
+ if (!dpl.empty()) {
+ os << " Line [\n";
+
+ node v = e->source();
+ if(dpl.front().m_x < m_x[v] - m_width[v]/2 ||
+ dpl.front().m_x > m_x[v] + m_width[v]/2 ||
+ dpl.front().m_y < m_y[v] - m_height[v]/2 ||
+ dpl.front().m_y > m_y[v] + m_height[v]/2)
+ {
+ os << " point [ x " << m_x[e->source()] << " y " <<
+ m_y[e->source()] << " ]\n";
+ }
+
+ ListConstIterator<DPoint> it;
+ for(it = dpl.begin(); it.valid(); ++it)
+ os << " point [ x " << (*it).m_x << " y " << (*it).m_y << " ]\n";
+
+ v = e->target();
+ if(dpl.back().m_x < m_x[v] - m_width[v]/2 ||
+ dpl.back().m_x > m_x[v] + m_width[v]/2 ||
+ dpl.back().m_y < m_y[v] - m_height[v]/2 ||
+ dpl.back().m_y > m_y[v] + m_height[v]/2)
+ {
+ os << " point [ x " << m_x[e->target()] << " y " <<
+ m_y[e->target()] << " ]\n";
+ }
+
+ os << " ]\n"; // Line
+ }//bends
+
+ //output width and color
+ if ((m_attributes & edgeColor) &&
+ (m_edgeColor[e].length() != 0))
+ os << " fill \"" << m_edgeColor[e] << "\"\n";
+
+ os << " ]\n"; // graphics
+ }
+
+ os << " ]\n"; // edge
+ }
+
+ os << "]\n"; // graph
+}
+
+
+bool GraphAttributes::readXML(Graph &G, const String &fileName)
+{
+ ifstream is(fileName.cstr());
+ return readXML(G,is);
+}
+
+
+bool GraphAttributes::readXML(Graph &G, istream &is)
+{
+ // need at least these attributes
+ initAttributes(~m_attributes &
+ (nodeGraphics | edgeGraphics | nodeLabel | edgeLabel));
+
+ XmlParser xml(is);
+ if (xml.error()) return false;
+
+ return xml.read(G,*this);
+}
+
+
+
+//
+// calculates the bounding box of the graph
+const DRect GraphAttributes::boundingBox() const
+{
+ double minx, maxx, miny, maxy;
+ const Graph &G = constGraph();
+ const GraphAttributes &AG = *this;
+ node v = G.firstNode();
+
+ if (v == 0) {
+ minx = maxx = miny = maxy = 0.0;
+ }
+ else {
+ minx = AG.x(v) - AG.width(v)/2;
+ maxx = AG.x(v) + AG.width(v)/2;
+ miny = AG.y(v) - AG.height(v)/2;
+ maxy = AG.y(v) + AG.height(v)/2;
+
+ forall_nodes(v, G) {
+ double x1 = AG.x(v) - AG.width(v)/2;
+ double x2 = AG.x(v) + AG.width(v)/2;
+ double y1 = AG.y(v) - AG.height(v)/2;
+ double y2 = AG.y(v) + AG.height(v)/2;
+
+ if (x1 < minx) minx = x1;
+ if (x2 > maxx) maxx = x2;
+ if (y1 < miny) miny = y1;
+ if (y2 > maxy) maxy = y2;
+ }
+ }
+
+ edge e;
+ forall_edges(e, G) {
+ const DPolyline &dpl = AG.bends(e);
+ ListConstIterator<DPoint> iter;
+ for (iter = dpl.begin(); iter.valid(); ++iter) {
+ if ((*iter).m_x < minx) minx = (*iter).m_x;
+ if ((*iter).m_x > maxx) maxx = (*iter).m_x;
+ if ((*iter).m_y < miny) miny = (*iter).m_y;
+ if ((*iter).m_y > maxy) maxy = (*iter).m_y;
+ }
+ }
+
+ return DRect(minx, miny, maxx, maxy);
+}
+
+
+//
+// returns a list of all hierachies in the graph (a hierachy consists of a set of nodes)
+// at least one list is returned, which is the list of all nodes not belonging to any hierachy
+// this is always the first list
+// the return-value of this function is the number of hierachies
+int GraphAttributes::hierarchyList(List<List<node>* > &list) const
+{
+ // list must be empty during startup
+ OGDF_ASSERT(list.empty());
+
+ const Graph &G = constGraph();
+ Array<bool> processed(0, G.maxNodeIndex(), false);
+ node v;
+ edge e;
+
+ // initialize the first list of all single nodes
+ List<node> *firstList = OGDF_NEW List<node>;
+ list.pushBack(firstList);
+
+ forall_nodes(v, G) { // scan all nodes
+
+ // skip, if already processed
+ if (processed[v->index()])
+ continue;
+
+ List<node> nodeSet; // set of nodes in this hierachy,
+ // whose neighbours have to be processed
+ List<node> *hierachy = OGDF_NEW List<node>; // holds all nodes in this hierachy
+
+ nodeSet.pushBack(v); // push the unprocessed node to the list
+ processed[v->index()] = true; // and mark it as processed
+
+ do { // scan all neighbours of nodes in 'nodeSet'
+ node v = nodeSet.popFrontRet();
+ hierachy->pushBack(v); // push v to the list of nodes in this hierachy
+
+ // process all the neighbours of v, e.g. push them into 'nodeSet'
+ forall_adj_edges(e, v) {
+ if (type(e) == Graph::generalization) {
+ node w = e->source() == v ? e->target() : e->source();
+ if (!processed[w->index()]) {
+ nodeSet.pushBack(w);
+ processed[w->index()] = true;
+ }
+ }
+ }
+ } while (!nodeSet.empty());
+
+ // skip adding 'hierachy', if it contains only one node
+ if (hierachy->size() == 1) {
+ firstList->conc(*hierachy);
+ delete hierachy;
+ }
+ else
+ list.pushBack(hierachy);
+ }
+
+ return list.size() - 1 + (*list.begin())->size();
+}
+
+
+//
+// returns a list of all hierarchies in the graph (in this case, a hierarchy consists of a set of edges)
+// list may be empty, if no generalizations are used
+// the return-value of this function is the number of hierarchies with generalizations
+int GraphAttributes::hierarchyList(List<List<edge>* > &list) const
+{
+ // list must be empty during startup
+ OGDF_ASSERT(list.empty());
+
+ const Graph &G = constGraph();
+ Array<bool> processed(0, G.maxNodeIndex(), false);
+ node v;
+ edge e;
+
+ forall_nodes(v, G) { // scan all nodes
+
+ // skip, if already processed
+ if (processed[v->index()])
+ continue;
+
+ List<node> nodeSet; // set of nodes in this hierarchy,
+ // whose neighbours have to be processed
+ List<edge> *hierarchy = OGDF_NEW List<edge>; // holds all edges in this hierarchy
+
+ nodeSet.pushBack(v); // push the unprocessed node to the list
+ processed[v->index()] = true; // and mark it as processed
+
+ do { // scan all neighbours of nodes in 'nodeSet'
+ node v = nodeSet.popFrontRet();
+
+ // process all the neighbours of v, e.g. push them into 'nodeSet'
+ forall_adj_edges(e, v) {
+ if (type(e) == Graph::generalization) {
+ node w = e->source() == v ? e->target() : e->source();
+ if (!processed[w->index()]) {
+ nodeSet.pushBack(w);
+ processed[w->index()] = true;
+ hierarchy->pushBack(e); // push e to the list of edges in this hierarchy
+ }
+ }
+ }
+ } while (!nodeSet.empty());
+
+ // skip adding 'hierarchy', if it contains only one node
+ if (hierarchy->empty())
+ delete hierarchy;
+ else
+ list.pushBack(hierarchy);
+ }
+
+ return list.size();
+}
+
+
+
+void GraphAttributes::removeUnnecessaryBendsHV()
+{
+ edge e;
+ forall_edges(e,*m_pGraph)
+ {
+ DPolyline &dpl = m_bends[e];
+
+ if(dpl.size() < 3)
+ continue;
+
+ ListIterator<DPoint> it1, it2, it3;
+
+ it1 = dpl.begin();
+ it2 = it1.succ();
+ it3 = it2.succ();
+
+ do {
+ if(((*it1).m_x == (*it2).m_x && (*it2).m_x == (*it3).m_x) ||
+ ((*it1).m_y == (*it2).m_y && (*it2).m_y == (*it3).m_y))
+ {
+ dpl.del(it2);
+ it2 = it3;
+ } else {
+ it1 = it2;
+ it2 = it3;
+ }
+
+ it3 = it2.succ();
+ } while(it3.valid());
+ }
+}
+
+
+void GraphAttributes::writeXML(
+ const String &fileName,
+ const char* delimiter,
+ const char* offset) const
+{
+ ofstream os(fileName.cstr());
+ writeXML(os,delimiter,offset);
+}
+
+
+void GraphAttributes::writeXML(
+ ostream &os,
+ const char* delimiter,
+ const char* offset) const
+{
+ NodeArray<int> id(*m_pGraph);
+
+ int nextId = 0;
+
+ os.setf(ios::showpoint);
+ os.precision(10);
+
+ os << "<GRAPH TYPE=\"SSJ\">" << delimiter;
+
+ node v;
+ forall_nodes(v,*m_pGraph) {
+ if (m_attributes & nodeLabel)
+ {
+ os << "<NODE NAME=\"" << m_nodeLabel[v] << "\">" << delimiter;
+ }
+ id[v] = nextId++;
+
+ if (m_attributes & nodeGraphics) {
+ os << offset << "<POSITION X=\"" << m_x[v] << "\" ";
+ os << "Y=\"" << m_y[v] << "\" /> " << delimiter;
+ os << offset << "<SIZE WIDTH=\"" << m_width[v] << "\" ";
+ os << "HEIGHT=\"" << m_height[v] << "\" />" << delimiter;
+
+ }
+ os << "</NODE>" << delimiter;
+ }
+
+ edge e;
+ forall_edges(e,*m_pGraph) {
+ if (m_attributes & edgeLabel)
+ {
+ os << "<EDGE NAME=\"" << m_edgeLabel[e] << "\" ";
+ }
+ if (m_attributes & nodeLabel)
+ {
+ os << "SOURCE=\"" << m_nodeLabel[e->source()] << "\" ";
+ os << "TARGET=\"" << m_nodeLabel[e->target()] << "\" ";
+ os << "GENERALIZATION=\"" << (m_eType[e]==Graph::generalization?1:0) << "\">" << delimiter;
+ }
+
+ if (m_attributes & edgeGraphics) {
+
+ const DPolyline &dpl = m_bends[e];
+ if (!dpl.empty()) {
+ os << offset << "<PATH TYPE=\"polyline\">" << delimiter;
+/* if (m_backward[e])
+ {
+ os << (*dpl.rbegin()).m_x << " " << (*dpl.rbegin()).m_y << " ";
+ if (dpl.size() > 1)
+ os << (*dpl.begin()).m_x << " " << (*dpl.begin()).m_y << " ";
+ }
+ else
+ {
+*/
+ ListConstIterator<DPoint> iter;
+ for (iter = dpl.begin(); iter.valid(); ++iter)
+ os << offset << offset << "<POSITION X=\"" << (*iter).m_x << "\" "
+ << "Y=\"" << (*iter).m_y << "\" />" << delimiter;
+// if (dpl.size() > 1)
+// os << "<POSITION X=\"" << (*dpl.rbegin()).m_x << "\" "
+// << "Y=\"" << (*dpl.rbegin()).m_y << "\" />";
+// }
+ os << offset << "</PATH>" << delimiter;
+ }
+
+ }
+
+ os << "</EDGE>" << delimiter; // edge
+ }
+
+ os << "</GRAPH>";
+}
+
+void GraphAttributes::addNodeCenter2Bends(int mode)
+{
+ edge e;
+ forall_edges(e, *m_pGraph) {
+ node v = e->source();
+ node w = e->target();
+ DPolyline &bendpoints = bends(e);
+ switch (mode) {
+ case 0 : // push center to the bends and return
+ bendpoints.pushFront(DPoint(x(v), y(v)));
+ bendpoints.pushBack (DPoint(x(w), y(w)));
+ break;
+ case 1 : // determine intersection with node and [center, last-bend-point]
+ bendpoints.pushFront(DPoint(x(v), y(v)));
+ bendpoints.pushBack (DPoint(x(w), y(w)));
+ case 2 : // determine intersection between node and last bend-segment
+ {
+ DPoint sp1(x(v) - width(v)/2, y(v) - height(v)/2);
+ DPoint sp2(x(v) - width(v)/2, y(v) + height(v)/2);
+ DPoint sp3(x(v) + width(v)/2, y(v) + height(v)/2);
+ DPoint sp4(x(v) + width(v)/2, y(v) - height(v)/2);
+ DLine sourceRect[4] = {
+ DLine(sp1, sp2),
+ DLine(sp2, sp3),
+ DLine(sp3, sp4),
+ DLine(sp4, sp1)
+ };
+
+ DPoint tp1(x(w) - width(w)/2, y(w) - height(w)/2);
+ DPoint tp2(x(w) - width(w)/2, y(w) + height(w)/2);
+ DPoint tp3(x(w) + width(w)/2, y(w) + height(w)/2);
+ DPoint tp4(x(w) + width(w)/2, y(w) - height(w)/2);
+ DLine targetRect[4] = {
+ DLine(tp1, tp2),
+ DLine(tp2, tp3),
+ DLine(tp3, tp4),
+ DLine(tp4, tp1)
+ };
+
+ DRect source(sp1, sp3);
+ DRect target(tp1, tp3);
+
+ DPoint c1 = bendpoints.popFrontRet();
+ DPoint c2 = bendpoints.popBackRet();
+
+ while (!bendpoints.empty() && source.contains(bendpoints.front()))
+ c1 = bendpoints.popFrontRet();
+ while (!bendpoints.empty() && target.contains(bendpoints.back()))
+ c2 = bendpoints.popBackRet();
+
+ DPoint a1, a2;
+ int i;
+ if (bendpoints.size() == 0) {
+ DLine cross(c1, c2);
+ for (i = 0; i < 4; i++)
+ if (cross.intersection(sourceRect[i], a1)) break;
+ for (i = 0; i < 4; i++)
+ if (cross.intersection(targetRect[i], a2)) break;
+ }
+ else {
+ DLine cross1(c1, bendpoints.front());
+ for (i = 0; i < 4; i++)
+ if (cross1.intersection(sourceRect[i], a1)) break;
+ DLine cross2(bendpoints.back(), c2);
+ for (i = 0; i < 4; i++)
+ if (cross2.intersection(targetRect[i], a2)) break;
+ }
+ bendpoints.pushFront(a1);
+ bendpoints.pushBack(a2);
+ break;
+ }
+ OGDF_NODEFAULT
+ }
+ bendpoints.normalize();
+ }
+}
+
+/* Methods for OGML serialization */
+
+// static helper method for mapping edge styles to ogml
+const char * GraphAttributes::edgeStyleToOGML(const GraphAttributes::EdgeStyle & edgeStyle)
+{
+ switch (edgeStyle) {
+ case GraphAttributes::esNoPen:
+ return "esNoPen";
+ case GraphAttributes::esSolid:
+ return "esSolid";
+ case GraphAttributes::esDash:
+ return "esDash";
+ case GraphAttributes::esDot:
+ return "esDot";
+ case GraphAttributes::esDashdot:
+ return "esDashdot";
+ case GraphAttributes::esDashdotdot:
+ return "esDashdotdot";
+ default:
+ return "esSolid";
+ }//switch
+}
+
+// static helper method for mapping image alignments to ogml
+const char * GraphAttributes::imageAlignmentToOGML(const GraphAttributes::ImageAlignment &imgAlign)
+{
+ switch (imgAlign) {
+ case GraphAttributes::TopLeft:
+ return "topLeft";
+ case GraphAttributes::TopCenter:
+ return "topCenter";
+ case GraphAttributes::TopRight:
+ return "topRight";
+ case GraphAttributes::CenterLeft:
+ return "centerLeft";
+ case GraphAttributes::Center:
+ return "center";
+ case GraphAttributes::CenterRight:
+ return "centerRight";
+ case GraphAttributes::BottomLeft:
+ return "bottomLeft";
+ case GraphAttributes::BottomCenter:
+ return "bottomCenter";
+ case GraphAttributes::BottomRight:
+ return "bottomRight";
+ default:
+ return "center";
+ }//switch
+}
+
+
+// static helper method for mapping image style to ogml
+const char * GraphAttributes::imageStyleToOGML(const GraphAttributes::ImageStyle &imgStyle)
+{
+ switch (imgStyle) {
+ case GraphAttributes::FreeScale: return "freeScale";
+ case GraphAttributes::FixScale: return "fixScale";
+ default: return "freeScale";
+ }//switch
+}
+
+
+// static helper method for mapping brush patterns styles to ogml
+const char * GraphAttributes::brushPatternToOGML(const GraphAttributes::BrushPattern & brushPattern)
+{
+ switch (brushPattern) {
+ case GraphAttributes::bpNone:
+ return "bpNone";
+ case GraphAttributes::bpSolid:
+ return "bpSolid";
+ case GraphAttributes::bpDense1:
+ return "bpDense1";
+ case GraphAttributes::bpDense2:
+ return "bpDense2";
+ case GraphAttributes::bpDense3:
+ return "bpDense3";
+ case GraphAttributes::bpDense4:
+ return "bpDense4";
+ case GraphAttributes::bpDense5:
+ return "bpDense5";
+ case GraphAttributes::bpDense6:
+ return "bpDense6";
+ case GraphAttributes::bpDense7:
+ return "bpDense7";
+ case GraphAttributes::bpHorizontal:
+ return "bpHorizontal";
+ case GraphAttributes::bpVertical:
+ return "bpVertical";
+ case GraphAttributes::bpCross:
+ return "bpCross";
+ case GraphAttributes::BackwardDiagonal:
+ return "BackwardDiagonal";
+ case GraphAttributes::ForwardDiagonal:
+ return "ForwardDiagonal";
+ case GraphAttributes::DiagonalCross:
+ return "DiagonalCross";
+ default:
+ return "bpSolid";
+ }//switch
+}
+
+
+// static helper method for exchanging X(HT)ML-tag specific chars
+String GraphAttributes::formatLabel(const String& labelText)
+{
+ size_t length = labelText.length();
+ String formattedString;
+
+ for (size_t i = 0; i < length; ++i) {
+ char c = labelText[i];
+ if (c == '<') {
+ formattedString += "<";
+ } else {
+ if (c == '>') {
+ formattedString += ">";
+ if ((i+1 < length) && (labelText[i+1] != '\n'))
+ formattedString += '\n';
+ } else {
+ formattedString += c;
+ }
+ }
+ }
+ return formattedString;
+}
+
+void GraphAttributes::writeSVG(const String &fileName, int fontSize, const String &fontColor) const
+ {
+ ofstream os(fileName.cstr());
+ writeSVG(os, fontSize, fontColor);
+ }
+
+void GraphAttributes::writeSVG(ostream &os, int fontSize, const String &fontColor) const
+{
+ os.setf(ios::showpoint);
+ os.precision(10);
+
+ os << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
+ os << "<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" xmlns:ev=\"http://www.w3.org/2001/xml-events\" version=\"1.1\" baseProfile=\"full\" ";
+
+ // determine bounding box of svg
+ OGDF_ASSERT((*m_pGraph).numberOfNodes() > 0);
+ double maxX = x((*m_pGraph).firstNode());
+ double maxY = y((*m_pGraph).firstNode());
+ double minX = x((*m_pGraph).firstNode());
+ double minY = y((*m_pGraph).firstNode());
+ double nodeStrokeWidth;
+
+ node v;
+ forall_nodes(v, *m_pGraph) {
+ if (m_attributes & nodeStyle) {
+ nodeStrokeWidth = lineWidthNode(v);
+ } else {
+ nodeStrokeWidth = 1.0;
+ }
+ maxX = max(maxX, x(v) + m_width[v]/2 + nodeStrokeWidth);
+ maxY = max(maxY, y(v) + m_height[v]/2 + nodeStrokeWidth);
+ minX = min(minX, x(v) - m_width[v]/2 - nodeStrokeWidth);
+ minY = min(minY, y(v) - m_height[v]/2 - nodeStrokeWidth);
+ }
+
+ edge e;
+ ListConstIterator<DPoint> it;
+ double edgeStrokeWidth;
+ forall_edges(e, *m_pGraph) {
+ if (m_attributes & edgeGraphics) {
+ if (attributes() & GraphAttributes::edgeStyle) {
+ edgeStrokeWidth = edgeWidth(e);
+ } else {
+ edgeStrokeWidth = 1.0;
+ }
+ const DPolyline &dpl = m_bends[e];
+ if (!dpl.empty()) {
+ for(it = dpl.begin(); it.valid(); ++it) {
+ maxX = max(maxX, (*it).m_x + edgeStrokeWidth);
+ maxY = max(maxY, (*it).m_y + edgeStrokeWidth);
+ minX = min(minX, (*it).m_x - edgeStrokeWidth);
+ minY = min(minY, (*it).m_y - edgeStrokeWidth);
+ }
+ }
+ }
+ }
+
+ os << "width=\"" << (maxX - minX) << "px\" ";
+ os << "height=\"" << (maxY - minY) << "px\" ";
+ os << "viewBox=\"" << 0 << " " << 0 << " " << (maxX - minX) << " " << (maxY - minY) << "\">\n";
+
+ forall_edges(e, *m_pGraph) {
+
+ const DPolyline &dpl = m_bends[e];
+ if (m_attributes & edgeGraphics) {
+ if (!dpl.empty()) { //polyline
+ os << "<polyline fill=\"none\" ";
+
+ if ((m_attributes & edgeColor) && (m_edgeColor[e].length() != 0)) {
+ os << "stroke=\"" << m_edgeColor[e] << "\" ";
+ }
+
+ if (attributes() & GraphAttributes::edgeStyle) {
+ os << "stroke-width=\"" << edgeWidth(e) << "px\" ";
+ } else {
+ os << "stroke=\"#000000\" ";
+ }
+
+ os << "points=\"";
+ node v = e->source();
+ if(dpl.front().m_x < m_x[v] - m_width[v]/2 ||
+ dpl.front().m_x > m_x[v] + m_width[v]/2 ||
+ dpl.front().m_y < m_y[v] - m_height[v]/2 ||
+ dpl.front().m_y > m_y[v] + m_height[v]/2)
+ {
+ os << (m_x[e->source()] - minX) << "," << (m_y[e->source()] - minY) << " ";
+ }
+
+ for(it = dpl.begin(); it.valid(); ++it)
+ os << ((*it).m_x - minX) << "," << ((*it).m_y - minY) << " ";
+
+ v = e->target();
+ if(dpl.back().m_x < m_x[v] - m_width[v]/2 ||
+ dpl.back().m_x > m_x[v] + m_width[v]/2 ||
+ dpl.back().m_y < m_y[v] - m_height[v]/2 ||
+ dpl.back().m_y > m_y[v] + m_height[v]/2)
+ {
+ os << (m_x[e->target()] - minX) << "," << (m_y[e->target()] - minY) << " ";
+ }
+
+ os << "\"/>\n";
+ } else { // single line
+ os << "<line ";
+ os << "x1=\"" << x(e->source()) - minX << "\" ";
+ os << "y1=\"" << y(e->source()) - minY << "\" ";
+ os << "x2=\"" << x(e->target()) - minX << "\" ";
+ os << "y2=\"" << y(e->target()) - minY<< "\" ";
+
+ if ((m_attributes & edgeColor) && (m_edgeColor[e].length() != 0)) {
+ os << "stroke=\"" << m_edgeColor[e] << "\" ";
+ } else {
+ os << "stroke=\"#000000\" ";
+ }
+
+ if (attributes() & GraphAttributes::edgeStyle) {
+ os << "stroke-width=\"" << edgeWidth(e) << "px\" ";
+ }
+
+ os << "/>\n";
+ }
+ }
+ }
+
+ forall_nodes(v,*m_pGraph) {
+ if (m_attributes & nodeGraphics) {
+ switch (m_nodeShape[v])
+ {
+ case rectangle:
+ os << "<rect ";
+ os << "x=\"" << m_x[v] - minX - m_width[v]/2 << "\" ";
+ os << "y=\"" << m_y[v] - minY - m_height[v]/2 << "\" ";
+ os << "width=\"" << m_width[v] << "\" ";
+ os << "height=\"" << m_height[v] << "\" ";
+ break;
+ case oval:
+ os << "<ellipse ";
+ os << "cx=\"" << m_x[v] - minX << "\" ";
+ os << "cy=\"" << m_y[v] - minY << "\" ";
+ os << "rx=\"" << m_width[v]/2 << "\" ";
+ os << "ry=\"" << m_height[v]/2 << "\" ";
+ break;
+ }
+
+ if (m_attributes & nodeColor) {
+ os << "fill=\"" << m_nodeColor[v] << "\" ";
+ os << "stroke=\"" << m_nodeLine[v] << "\" ";
+ }
+
+ if (m_attributes & nodeStyle)
+ {
+ os << "stroke-width=\"" << lineWidthNode(v) << "px\" ";
+ }
+
+ os << "/>\n";
+
+ if(m_attributes & nodeLabel){
+ os << "<text x=\"" << m_x[v] - minX - m_width[v]/2 << "\" y=\"" << m_y[v] - minY << "\" textLength=\"" << m_width[v] << "\" font-size=\"" << fontSize << "\" fill=\"" << fontColor << "\" lengthAdjust=\"spacingAndGlyphs\">" << m_nodeLabel[v] << "</text>\n";
+ }
+ }
+ }
+
+ os << "</svg>\n";
+}
+
+} // end namespace ogdf
diff --git a/ogdf/basic/GraphAttributes.h b/ogdf/basic/GraphAttributes.h
new file mode 100644
index 0000000..50fc9b7
--- /dev/null
+++ b/ogdf/basic/GraphAttributes.h
@@ -0,0 +1,863 @@
+/*
+ * $Revision: 2585 $
+ *
+ * last checkin:
+ * $Author: klein $
+ * $Date: 2012-07-12 03:46:50 +0200 (Do, 12. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of class GraphAttributes which extends a Graph
+ * by additional attributes.
+ *
+ * \author Carsten Gutwenger
+ * Karsten Klein
+ * Joachim Kupke
+ * Sebastian Leipert
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_ATTRIBUTED_GRAPH_H
+#define OGDF_ATTRIBUTED_GRAPH_H
+
+#include "NodeArray.h"
+#include "EdgeArray.h"
+#include "String.h"
+#include "geometry.h"
+
+namespace ogdf {
+
+//---------------------------------------------------------
+// GraphAttributes
+// graph topology + graphical attributes
+//---------------------------------------------------------
+//! Stores additional attributes of a graph (like layout information).
+/**
+ * It is frequently necessary to associate additional attributes with a graph.
+ * The class GraphAttributes provides various such attributes and is the
+ * central place were such attributes are stored.
+ *
+ * Attributes are simply stored in node or edge arrays; for memory consumption
+ * reasons, only a subset of these arrays is in fact initialized for the graph;
+ * non-initialized arrays require only a few bytes of extra memory.
+ *
+ * Which arrays are initialized is specified by a bit vector; each bit in this
+ * bit vector corresponds to one or more attributes. E.g., \a #nodeGraphics
+ * corresponds to the attributes \a #m_x, \a #m_y, \a #m_width, and \a #m_height;
+ * whereas \a #edgeDoubleWeight only corresponds to the attribute \a #m_doubleWeight.
+ *
+ * Attributes can be initialized by the constructor GraphAttributes(const Graph &,long)
+ * or the function initAttributes(); attributes can also be deinitialized by
+ * calling destroyAttributes().
+ */
+
+class OGDF_EXPORT GraphAttributes {
+public:
+ //! Types for edge arrows.
+ enum EdgeArrow {
+ none, //!< no edge arrows
+ last, //!< edge arrow at target node of the edge
+ first, //!< edge arrow at source node of the edge
+ both, //!< edge arrow at target and source node of the edge
+ undefined
+ };
+
+ //! Types for line styles.
+ /**
+ * The line styles are preliminary the same as in QT.
+ */
+ enum EdgeStyle {
+ esNoPen = 0, //!< no line
+ esSolid = 1, //!< solid line
+ esDash = 2, //!< dashed line
+ esDot = 3, //!< dotted line
+ esDashdot = 4, //!< line style "dash dot dash dot ..."
+ esDashdotdot = 5
+ //!< line style "dash dot dot dash dot dot ..."
+ };
+
+ //! Converts integer \a i to edge style.
+ static EdgeStyle intToStyle(int i) {
+ switch (i) {
+ case 0:
+ return esNoPen;
+ case 1:
+ return esSolid;
+ case 2:
+ return esDash;
+ case 3:
+ return esDot;
+ case 4:
+ return esDashdot;
+ case 5:
+ return esDashdotdot;
+ default:
+ return esNoPen;
+
+ }
+ }
+
+ //! Types for object brush patterns.
+ /**
+ * The brush patterns are currently the same as the GDE project.
+ */
+ enum BrushPattern {
+ bpNone = 0,
+ bpSolid = 1,
+ bpDense1 = 2,
+ bpDense2 = 3,
+ bpDense3 = 4,
+ bpDense4 = 5,
+ bpDense5 = 6,
+ bpDense6 = 7,
+ bpDense7 = 8,
+ bpHorizontal = 9,
+ bpVertical = 10,
+ bpCross = 11,
+ BackwardDiagonal = 12,
+ ForwardDiagonal = 13,
+ DiagonalCross = 14
+ };
+
+ //! Converts integer \a i to brush pattern.
+ static BrushPattern intToPattern(int i) {
+ switch (i) {
+ case 0:
+ return bpNone;
+ break;
+ case 1:
+ return bpSolid;
+ break;
+ case 2:
+ return bpDense1;
+ break;
+ case 3:
+ return bpDense2;
+ break;
+ case 4:
+ return bpDense3;
+ break;
+ case 5:
+ return bpDense4;
+ break;
+ case 6:
+ return bpDense5;
+ break;
+ case 7:
+ return bpDense6;
+ break;
+ case 8:
+ return bpDense7;
+ break;
+ case 9:
+ return bpHorizontal;
+ break;
+ case 10:
+ return bpVertical;
+ break;
+ case 11:
+ return bpCross;
+ break;
+ case 12:
+ return BackwardDiagonal;
+ break;
+ case 13:
+ return ForwardDiagonal;
+ break;
+ case 14:
+ return DiagonalCross;
+ break;
+ default:
+ return bpNone;
+ break;
+ }
+ }
+
+ //! Specifies scaling of images.
+ enum ImageStyle {
+ FreeScale = 0, FixScale = 1
+ };
+ //! Specifies image alignment.
+ enum ImageAlignment {
+ TopLeft = 0, TopCenter, TopRight, CenterLeft, Center, CenterRight, BottomLeft, BottomCenter, BottomRight
+ };
+
+ //! Helper function mapping int values to image styles
+ static ImageStyle intToImageStyle(int i) {
+ switch (i) {
+ case 0:
+ return FreeScale;
+ break;
+ case 1:
+ return FixScale;
+ break;
+ default:
+ return FreeScale;
+ }//switch
+ }//intToStyle
+
+ //! Helper function mapping int values to image alignment
+ static ImageAlignment intToImageAlignment(int i) {
+ switch (i) {
+ case 0:
+ return TopLeft;
+ break;
+ case 1:
+ return TopCenter;
+ break;
+ case 2:
+ return TopRight;
+ break;
+ case 3:
+ return CenterLeft;
+ break;
+ case 4:
+ return Center;
+ break;
+ case 5:
+ return CenterRight;
+ break;
+ case 6:
+ return BottomLeft;
+ break;
+ case 7:
+ return BottomCenter;
+ break;
+ case 8:
+ return BottomRight;
+ break;
+ default:
+ return TopLeft;
+ }//switch
+ }//intToAlignment
+
+protected:
+ /**
+ * Writes string \a str into a GML file such that line length limits
+ * are respected and characters '\', '"' are correctly escaped.
+ */
+ void writeLongString(ostream &os, const String &str) const;
+
+ /* Methods for OGML serialization */
+
+ //! Static helper method for mapping edge styles to ogml.
+ static const char * edgeStyleToOGML(const GraphAttributes::EdgeStyle & edgeStyle);
+
+ //! Static helper method for mapping image alignments to ogml.
+ static const char * imageAlignmentToOGML(const GraphAttributes::ImageAlignment &imgAlign);
+
+ //! Static helper method for mapping image style to ogml.
+ static const char * imageStyleToOGML(const GraphAttributes::ImageStyle &imgStyle);
+
+ //! Static helper method for mapping brush patterns styles to ogml.
+ static const char * brushPatternToOGML(const GraphAttributes::BrushPattern & brushPattern);
+
+ //static void generateIndent(char ** indent, const int & indentSize);
+
+ //! Static helper method for exchanging X(HT)ML-tag specific chars.
+ String formatLabel(const String & labelText);
+
+ /* End methods for OGML serialization */
+
+ const Graph *m_pGraph; //!< associated graph
+
+ bool m_directed; //!< whether or not the graph is directed
+
+ // graphical representation of nodes
+ NodeArray<double> m_x; //!< x-coordinate of a node
+ NodeArray<double> m_y; //!< y-coordinate pf a node
+ NodeArray<double> m_width; //!< width of a node's bounding box
+ NodeArray<double> m_height; //!< height of a nodes's bounding box
+ NodeArray<String> m_nodeLabel; //!< label of a node
+ NodeArray<String> m_nodeColor; //!< color of a node
+ NodeArray<String> m_nodeLine; //!< line color of a node
+ NodeArray<int> m_nodeShape; //!< shape of a node
+ NodeArray<double> m_nodeLineWidth; //!< line width of a node
+ NodeArray<BrushPattern> m_nodePattern; //!< brush pattern of a node
+ NodeArray<EdgeStyle> m_nodeStyle; //!< line style of a node
+ NodeArray<String> m_nodeTemplate; //!< name of template of a node
+
+ // images
+ NodeArray<String> m_imageUri;
+ NodeArray<ImageStyle> m_imageStyle;
+ NodeArray<ImageAlignment> m_imageAlign;
+ NodeArray<bool> m_imageDrawLine;
+ NodeArray<double> m_imageWidth;
+ NodeArray<double> m_imageHeight;
+
+ // other node attributes
+ NodeArray<int> m_nodeId; //!< user ID of a node
+ NodeArray<int> m_level; //!< level of a node
+ NodeArray<int> m_nodeIntWeight; //!< (integer) weight of a node
+ NodeArray<Graph::NodeType> m_vType; // type (vertex, dummy, generalizationMerger)
+
+ // graphical representation of edges
+ EdgeArray<DPolyline> m_bends; //!< list of bend points of an edge
+ EdgeArray<String> m_edgeLabel; //!< label of an edge
+ EdgeArray<EdgeArrow> m_edgeArrow; //!< arrow type of an edge
+ EdgeArray<EdgeStyle> m_edgeStyle; //!< line style of an edge
+ EdgeArray<String> m_edgeColor; //!< line color of an edge
+ EdgeArray<double> m_edgeWidth; //!< line width of an edge
+ EdgeArray<Graph::EdgeType> m_eType; //!< type of an edge (association or generalization)
+
+ // other edge attributes
+ EdgeArray<int> m_intWeight; //!< (integer) weight of an edge
+ EdgeArray<double> m_doubleWeight; //!< (real number) weight of an edge
+ EdgeArray<unsigned int> m_subGraph; //!< is element of subgraphs given by bitvector
+
+ long m_attributes; //!< bit vector of currently used attributes
+
+public:
+ //! Bits for specifying attributes.
+ enum {
+ nodeGraphics = 0x00001, //!< node attributes m_x, m_y, m_width, m_height, m_nodeShape
+ edgeGraphics = 0x00002, //!< edge attribute m_bends
+ nodeLevel = 0x00004, //!< node attribute m_level
+ edgeIntWeight = 0x00008, //!< edge attribute m_intWeight
+ edgeDoubleWeight = 0x00010, //!< edge attribute m_doubleWeight
+ edgeLabel = 0x00020, //!< edge attribute m_edgeLabel
+ nodeLabel = 0x00040, //!< node attribute m_nodeLabel
+ edgeType = 0x00080, //!< edge attribute m_eType
+ nodeType = 0x00100, //!< node attribute m_vType
+ nodeColor = 0x00200, //!< node attribute m_nodeColor, m_nodeLine
+ nodeId = 0x00400, //!< node attribute m_nodeId
+ edgeArrow = 0x00800, //!< edge attribute m_edgeArrow
+ edgeColor = 0x01000, //!< edge attribute m_edgeColor
+ edgeStyle = 0x02000, //!< edge attribute m_edgeStyle, m_edgeWidth
+ nodeStyle = 0x04000, //!< node attributes m_nodePattern, m_nodeStyle, m_nodeLineWidth;
+ //!< experimental: m_imageUri, m_imageStyle, m_imageAlign,
+ //!< m_imageDrawLine, m_imageWidth, m_imageHeight
+ nodeTemplate = 0x08000, //!< node attribute m_nodeTemplate
+ edgeSubGraph = 0x10000, //!< edge attribute m_subGraph
+ nodeWeight = 0x20000
+ //!< node attribute m_nodeIntWeight
+ };
+
+ //! Bits for specifying node shapes.
+ enum {
+ oval = 0x8001, rectangle = 0x8002
+ };
+
+ //! Constructs graph attributes for no associated graph (default constructor).
+ /**
+ * The associated graph can be set later with the init() function.
+ */
+ GraphAttributes();
+
+ //! Constructs graph attributes associated with the graph \a G.
+ /**
+ * @param G is the associated graph.
+ * @param initAttributes specifies the set of attributes that can be accessed.
+ */
+ GraphAttributes(const Graph &G, long initAttributes = nodeGraphics | edgeGraphics);
+
+ virtual ~GraphAttributes() {
+ }
+
+ //! Initializes the graph attributes for graph \a G.
+ /**
+ * @param G is the new associated graph.
+ * @param initAttr specifies the set of attributes that can be accessed.
+ *
+ * \warning All attributes that were allocated before are destroyed by this function!
+ * If you wish to extend the set of allocated attributes, use initAttributes().
+ */
+ virtual void init(const Graph &G, long initAttr);
+
+ //! Returns currently accessible attributes.
+ long attributes() const {
+ return m_attributes;
+ }
+
+ //! Initializes attributes in \a attr for usage.
+ void initAttributes(long attr);
+
+ //! Destroys attributes in attr.
+ void destroyAttributes(long attr);
+
+ //! Returns a reference to the associated graph
+ const Graph& constGraph() const {
+ return *m_pGraph;
+ }
+
+ //! Returns if the graph is directed.
+ bool directed() {
+ return m_directed;
+ }
+
+ //! Sets if the graph is directed to \a directed.
+ void directed(bool directed) {
+ m_directed = directed;
+ }
+
+ //! Returns the template name of node \a v.
+ const String &templateNode(node v) const {
+ return m_nodeTemplate[v];
+ }
+ //! Returns the template name of node \a v.
+ String &templateNode(node v) {
+ return m_nodeTemplate[v];
+ }
+
+ //! Returns the x-coordinate of node \a v.
+ const double &x(node v) const {
+ return m_x[v];
+ }
+ //! Returns the x-coordinate of node \a v.
+ double &x(node v) {
+ return m_x[v];
+ }
+
+ //! Returns the y-coordinate of node \a v.
+ const double &y(node v) const {
+ return m_y[v];
+ }
+ //! Returns the y-coordinate of node \a v.
+ double &y(node v) {
+ return m_y[v];
+ }
+
+ //! Returns a reference to the NodeArray \a m_width.
+ const NodeArray<double> &width() const {
+ return m_width;
+ }
+ //! Returns a refeence to the NodeArray \a m_width.
+ NodeArray<double> &width() {
+ return m_width;
+ }
+
+ //! Returns the width of the bounding box of node \a v.
+ const double &width(node v) const {
+ return m_width[v];
+ }
+ //! Returns the width of the bounding box of node \a v.
+ double &width(node v) {
+ return m_width[v];
+ }
+
+ //! Returns a reference to the NodeArray \a m_height.
+ const NodeArray<double> &height() const {
+ return m_height;
+ }
+ //! Returns a refeence to the NodeArray \a m_height.
+ NodeArray<double> &height() {
+ return m_height;
+ }
+
+ //! Returns the height of the bounding box of node \a v.
+ const double &height(node v) const {
+ return m_height[v];
+ }
+ //! Returns the height of the bounding box of node \a v.
+ double &height(node v) {
+ return m_height[v];
+ }
+
+ //! Returns the level of node \a v.
+ const int &level(node v) const {
+ return m_level[v];
+ }
+ //! Returns the level of node \a v.
+ int &level(node v) {
+ return m_level[v];
+ }
+
+ //! Returns the weight of node \a v.
+ const int &weight(node v) const {
+ return m_nodeIntWeight[v];
+ }
+ //! Returns the weight of node \a v.
+ int &weight(node v) {
+ return m_nodeIntWeight[v];
+ }
+
+ //! Returns the brush pattern of node \a v.
+ const BrushPattern &nodePattern(node v) const {
+ return m_nodePattern[v];
+ }
+ //! Returns the brush pattern of node \a v.
+ BrushPattern &nodePattern(node v) {
+ return m_nodePattern[v];
+ }
+
+ //! Returns the line style of node \ v.
+ const EdgeStyle &styleNode(node v) const {
+ return m_nodeStyle[v];
+ }
+ //! Returns the line style of node \ v.
+ EdgeStyle &styleNode(node v) {
+ return m_nodeStyle[v];
+ }
+
+ //! Returns the line width of node \a v.
+ const double &lineWidthNode(node v) const {
+ return m_nodeLineWidth[v];
+ }
+ //! Returns the line width of node \a v.
+ double &lineWidthNode(node v) {
+ return m_nodeLineWidth[v];
+ }
+
+ //! Returns the line color of node \a v.
+ const String &nodeLine(node v) const {
+ return m_nodeLine[v];
+ }
+ //! Returns the line color of node \a v.
+ String &nodeLine(node v) {
+ return m_nodeLine[v];
+ }
+
+ //! Returns the list of bend points of edge \a e.
+ const DPolyline &bends(edge e) const {
+ return m_bends[e];
+ }
+ //! Returns the list of bend points of edge \a e.
+ DPolyline &bends(edge e) {
+ return m_bends[e];
+ }
+
+ //! Returns the (integer) weight of edge \a e.
+ const int &intWeight(edge e) const {
+ return m_intWeight[e];
+ }
+ //! Returns the (integer) weight of edge \a e.
+ int &intWeight(edge e) {
+ return m_intWeight[e];
+ }
+
+ //! Returns the (real number) weight of edge \a e.
+ const double &doubleWeight(edge e) const {
+ return m_doubleWeight[e];
+ }
+ //! Returns the (real number) weight of edge \a e.
+ double &doubleWeight(edge e) {
+ return m_doubleWeight[e];
+ }
+
+ //! Returns the line width of edge \a e.
+ const double &edgeWidth(edge e) const {
+ return m_edgeWidth[e];
+ }
+ //! Returns the line width of edge \a e.
+ double &edgeWidth(edge e) {
+ return m_edgeWidth[e];
+ }
+
+ //! Returns the color of node \a v.
+ const String &colorNode(node v) const {
+ return m_nodeColor[v];
+ }
+ //! Returns the color of node \a v.
+ String &colorNode(node v) {
+ return m_nodeColor[v];
+ }
+
+ //! Returns the shape type of node \a v.
+ int shapeNode(node v) const {
+ return m_nodeShape[v];
+ }
+ //! Returns the shape type of node \a v.
+ int &shapeNode(node v) {
+ return m_nodeShape[v];
+ }
+
+ //! Returns the label of node \ v.
+ const String &labelNode(node v) const {
+ return m_nodeLabel[v];
+ }
+ //! Returns the label of node \ v.
+ String &labelNode(node v) {
+ return m_nodeLabel[v];
+ }
+
+ //! Returns the label of edge \a e.
+ const String &labelEdge(edge e) const {
+ return m_edgeLabel[e];
+ }
+ //! Returns the label of edge \a e.
+ String &labelEdge(edge e) {
+ return m_edgeLabel[e];
+ }
+
+ //! Returns the type of edge \a e.
+ Graph::EdgeType type(edge e) const {
+ return m_eType.valid() ? m_eType[e] : Graph::association;
+ }
+ //! Returns the type of edge \a e.
+ Graph::EdgeType &type(edge e) {
+ return m_eType[e];
+ }
+
+ //! Returns the type of node \a v.
+ Graph::NodeType type(node v) const {
+ return m_vType.valid() ? m_vType[v] : Graph::vertex;
+ }
+ //! Returns the type of node \a v.
+ Graph::NodeType &type(node v) {
+ return m_vType[v];
+ }
+
+ //! Returns the user ID of node \a v.
+ const int &idNode(node v) const {
+ return m_nodeId[v];
+ }
+ //! Returns the user ID of node \a v.
+ int &idNode(node v) {
+ return m_nodeId[v];
+ }
+
+ //! Returns the arrow type of edge \a e.
+ const EdgeArrow &arrowEdge(edge e) const {
+ return m_edgeArrow[e];
+ }
+ //! Returns the arrow type of edge \a e.
+ EdgeArrow &arrowEdge(edge e) {
+ return m_edgeArrow[e];
+ }
+
+ //! Returns the line style of an edge \a e.
+ const EdgeStyle &styleEdge(edge e) const {
+ return m_edgeStyle[e];
+ }
+ //! Returns the line style of an edge \a e.
+ EdgeStyle &styleEdge(edge e) {
+ return m_edgeStyle[e];
+ }
+
+ //! Returns the color of node \a v.
+ const String &colorEdge(edge e) const {
+ return m_edgeColor[e];
+ }
+ //! Returns the color of node \a v.
+ String &colorEdge(edge e) {
+ return m_edgeColor[e];
+ }
+
+ // Images:
+ //! Returns image uri of node v.
+ const String &imageUriNode(node v) const {
+ return m_imageUri[v];
+ }
+ //! Returns image uri of node v.
+ String &imageUriNode(node v) {
+ return m_imageUri[v];
+ }
+ //! Returns image style of node v.
+ const ImageStyle &imageStyleNode(node v) const {
+ return m_imageStyle[v];
+ }
+ //! Returns image style of node v.
+ ImageStyle &imageStyleNode(node v) {
+ return m_imageStyle[v];
+ }
+ // Returns image alignment of node v.
+ const ImageAlignment &imageAlignmentNode(node v) const {
+ return m_imageAlign[v];
+ }
+ // Returns image alignment of node v.
+ ImageAlignment &imageAlignmentNode(node v) {
+ return m_imageAlign[v];
+ }
+ //! Returns bool value drawLine of node v.
+ const bool &imageDrawLineNode(node v) const {
+ return m_imageDrawLine[v];
+ }
+ //! Returns bool value drawLine of node v.
+ bool &imageDrawLineNode(node v) {
+ return m_imageDrawLine[v];
+ }
+ //! Returns image width of node v.
+ const double &imageWidthNode(node v) const {
+ return m_imageWidth[v];
+ }
+ //! Returns image width of node v.
+ double &imageWidthNode(node v) {
+ return m_imageWidth[v];
+ }
+ // Returns image height of node v.
+ const double &imageHeightNode(node v) const {
+ return m_imageHeight[v];
+ }
+ // Returns image height of node v.
+ double &imageHeightNode(node v) {
+ return m_imageHeight[v];
+ }
+
+ //! Returns the edgesubgraph value of an edge \a e.
+ const unsigned int &subGraphBits(edge e) const {
+ return m_subGraph[e];
+ }
+ //! Returns the edgesubgraph value of an edge \a e.
+ unsigned int &subGraphBits(edge e) {
+ return m_subGraph[e];
+ }
+
+ //! Checks whether edge \a e belongs to basic graph \a n.
+ bool inSubGraph(edge e, int n) const {
+ OGDF_ASSERT( n>=0 && n<32 );
+ return (m_subGraph[e] & (1 << n)) != 0;
+ }
+ //! Addes edge \a e to basic graph \a n.
+ void addSubGraph(edge e, int n) {
+ OGDF_ASSERT( n>=0 && n<32 );
+ m_subGraph[e] |= (1 << n);
+ }
+ //! Removes edge \a e from basic graph \a n.
+ void removeSubGraph(edge e, int n) {
+ OGDF_ASSERT( n>=0 && n<32 );
+ m_subGraph[e] &= ~(1 << n);
+ }
+
+ //! Returns the bounding box of the graph.
+ const DRect boundingBox() const;
+
+ /**
+ * We hide the internal representation of semantic node types from
+ * the user to be able to change this later (semantic node type member array).
+ * We are not allowed to set association classes manually, only by calling
+ * createAssociationClass().
+ */
+ bool isAssociationClass(node v) const {
+ return (type(v) == Graph::associationClass);
+ }
+
+ /**
+ * According to the \a mode switch add either the node center points to
+ * the bends or the anchor point on the node boundary
+ * - \a mode = 0: only add node center
+ * - \a mode = 1: compute intersection with the line segment to the center
+ * and the boundary of the rectangular node
+ * - \a mode = 2: compute intersection with the first/last line segment
+ * and the boundary of the rectangular node
+ */
+ void addNodeCenter2Bends(int mode = 1);
+
+ void clearAllBends();
+
+ //! Returns a list of all inheritance hierarchies in the graph.
+ /**
+ * Inheritance hierarchies are identified by edges with type Graph::generalization.
+ *
+ * @param list is a list of all hierarchies; each hierarchie is itself a list
+ * of all nodes in this hierarchy.
+ *
+ * \return Returns the number of generalization hierarchies.
+ */
+ int hierarchyList(List<List<node>*> &list) const;
+
+ //! Returns a list of all inheritance hierarchies in the graph.
+ /**
+ * Inheritance hierarchies are identified by edges with type Graph::generalization.
+ *
+ * @param list is a list of all hierarchies; each hierarchie is itself a list
+ * of all edges in this hierarchy.
+ *
+ * \return Returns the number of generalization hierarchies.
+ */
+ int hierarchyList(List<List<edge>*> &list) const;
+
+ //! Sets the width of all nodes to \a w.
+ void setAllWidth(double w);
+ //! Sets the height of all nodes to \a h.
+ void setAllHeight(double h);
+
+ //! Reads the graph from a GML file \a fileName.
+ bool readGML(Graph &G, const String &fileName);
+
+ //! Reads the graph from a GML input stream \a is.
+ bool readGML(Graph &G, istream &is);
+
+ //! Writes the graph with its attributes in GML format to file \a fileName.
+ void writeGML(const String &fileName) const;
+
+ //! Writes the graph with its attributes in GML format to output stream \a os.
+ void writeGML(ostream &os) const;
+
+ //! Writes the graph with its attributes in SVG format to file \a fileName.
+ /**
+ * @param fileName filename of the SVG
+ * @param fontSize size of node label (default = 3)
+ * @param fontColor color of node label (default = #000000)
+ */
+ void writeSVG(const String &fileName, int fontSize = 3, const String &fontColor = "#000000") const;
+
+ //! Writes the graph with its attributes in SVG format to output stream \a os.
+ /**
+ * @param os output stream for SVG
+ * @param fontSize size of node label
+ * @param fontColor color of node label
+ */
+ void writeSVG(ostream &os, int fontSize, const String &fontColor) const;
+
+ //! Reads the graph and attributes from the XML file \a fileName.
+ bool readXML(Graph &G, const String &fileName);
+
+ //! Reads the graph and attributes from the XML input stream \a is.
+ bool readXML(Graph &G, istream &is);
+
+ //! Writes the graph to the XML file \a fileName.
+ void writeXML(const String &fileName, const char* delimiter = "", const char* offset = "") const;
+
+ //! Writes the graph to XML output stream \a os.
+ virtual void writeXML(ostream &os, const char* delimiter = "", const char* offset = "") const;
+
+ //! Reads a graph in Rudy format from file \a fileName.
+ bool readRudy(Graph &G, const String &fileName);
+
+ //! Reads a graph in Rudy format from input stream \a is.
+ bool readRudy(Graph &G, istream &is);
+
+ //! Writes the graph in Rudy format to file \a fileName.
+ void writeRudy(const String &fileName) const;
+
+ //! Writes the graph in Rudy format to output stream \a os.
+ void writeRudy(ostream &os) const;
+
+ //! Removes unnecessary bend points in orthogonal segements.
+ /**
+ * Processes all edges and removes unnecessary bend points in the bend point list
+ * of the edge, i.e., bend points such that the preceding and succeeding bend point
+ * form a horizontal or vertical segement containing this bend point. This function
+ * is useful to remove redundant bend points in an orthogonal layout.
+ */
+ void removeUnnecessaryBendsHV();
+};
+
+} // end namespace ogdf
+
+
+#endif
diff --git a/ogdf/basic/GraphCopy.cpp b/ogdf/basic/GraphCopy.cpp
new file mode 100644
index 0000000..6d76e0a
--- /dev/null
+++ b/ogdf/basic/GraphCopy.cpp
@@ -0,0 +1,678 @@
+/*
+ * $Revision: 2565 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-07 17:14:54 +0200 (Sa, 07. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of GraphCopySimple and GraphCopy classes
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "GraphCopy.h"
+#include "FaceSet.h"
+
+
+namespace ogdf {
+
+
+//---------------------------------------------------------
+// GraphCopySimple
+// simple graph copies (no support for edge splitting)
+//---------------------------------------------------------
+
+GraphCopySimple::GraphCopySimple(const Graph &G) : m_pGraph(&G)
+{
+ Graph::construct(G,m_vCopy,m_eCopy);
+
+ m_vOrig.init(*this,0);
+ m_eOrig.init(*this,0);
+
+ node v;
+ forall_nodes(v,G)
+ m_vOrig[m_vCopy[v]] = v;
+
+ edge e;
+ forall_edges(e,G)
+ m_eOrig[m_eCopy[e]] = e;
+}
+
+
+GraphCopySimple::GraphCopySimple(const GraphCopySimple &GC) : Graph()
+
+{
+ NodeArray<node> vCopy;
+ EdgeArray<edge> eCopy;
+
+ Graph::construct(GC,vCopy,eCopy);
+ initGC(GC,vCopy,eCopy);
+}
+
+
+GraphCopySimple &GraphCopySimple::operator=(const GraphCopySimple &GC)
+{
+ NodeArray<node> vCopy;
+ EdgeArray<edge> eCopy;
+
+ Graph::assign(GC,vCopy,eCopy);
+ initGC(GC,vCopy,eCopy);
+
+ return *this;
+}
+
+
+void GraphCopySimple::initGC(const GraphCopySimple &GC,
+ NodeArray<node> &vCopy,
+ EdgeArray<edge> &eCopy)
+{
+ m_pGraph = GC.m_pGraph;
+
+ m_vOrig.init(*this,0); m_eOrig.init(*this,0);
+ m_vCopy.init(*m_pGraph,0); m_eCopy.init(*m_pGraph,0);
+
+ node v;
+ forall_nodes(v,GC)
+ m_vCopy[m_vOrig[vCopy[v]] = GC.m_vOrig[v]] = vCopy[v];
+
+ edge e;
+ forall_edges(e,GC) {
+ edge eOrig = GC.m_eOrig[e];
+ m_eOrig[eCopy[e]] = eOrig;
+ if (eOrig)
+ m_eCopy[eOrig] = eCopy[e];
+ }
+}
+
+
+//---------------------------------------------------------
+// GraphCopy
+// graph copies (support for edge splitting)
+//---------------------------------------------------------
+
+GraphCopy::GraphCopy(const Graph &G) : m_pGraph(&G)
+{
+ EdgeArray<edge> eCopy;
+ Graph::construct(G,m_vCopy,eCopy);
+
+ m_vOrig.init(*this,0); m_eOrig.init(*this,0);
+ m_eCopy.init(*m_pGraph);
+ m_eIterator.init(*this,0);
+
+ node v;
+ forall_nodes(v,G)
+ m_vOrig[m_vCopy[v]] = v;
+
+ edge e;
+ forall_edges(e,G) {
+ m_eIterator[eCopy[e]] = m_eCopy[e].pushBack(eCopy[e]);
+ m_eOrig[eCopy[e]] = e;
+ }
+}
+
+
+GraphCopy::GraphCopy(const GraphCopy &GC) : Graph()
+{
+ NodeArray<node> vCopy;
+ EdgeArray<edge> eCopy;
+
+ Graph::construct(GC,vCopy,eCopy);
+ initGC(GC,vCopy,eCopy);
+}
+
+
+void GraphCopy::initGC(const GraphCopy &GC,
+ NodeArray<node> &vCopy,
+ EdgeArray<edge> &eCopy)
+{
+ m_pGraph = GC.m_pGraph;
+
+ m_vOrig.init(*this,0); m_eOrig.init(*this,0);
+ m_vCopy.init(*m_pGraph,0); m_eCopy.init(*m_pGraph);
+ m_eIterator.init(*this,0);
+
+ node v, w;
+ forall_nodes(v,GC)
+ m_vOrig[vCopy[v]] = GC.original(v);
+
+ edge e;
+ forall_edges(e,GC)
+ m_eOrig[eCopy[e]] = GC.original(e);
+
+ forall_nodes(v,*this)
+ if ((w = m_vOrig[v]) != 0) m_vCopy[w] = v;
+
+ forall_edges(e,*m_pGraph) {
+ ListConstIterator<edge> it;
+ for (it = GC.m_eCopy[e].begin(); it.valid(); ++it)
+ m_eIterator[eCopy[*it]] = m_eCopy[e].pushBack(eCopy[*it]);
+ }
+}
+
+
+void GraphCopy::createEmpty(const Graph &G)
+{
+ m_pGraph = &G;
+
+ m_vCopy.init(G,0);
+ m_eCopy.init(G);
+ m_vOrig.init(*this,0);
+ m_eOrig.init(*this,0);
+ m_eIterator.init(*this,0);
+}
+
+
+void GraphCopy::initByNodes(const List<node> &nodes, EdgeArray<edge> &eCopy)
+{
+ Graph::constructInitByNodes(*m_pGraph,nodes,m_vCopy,eCopy);
+
+ ListConstIterator<node> itV;
+ for(itV = nodes.begin(); itV.valid(); ++itV)
+ {
+ node v = *itV;
+
+ m_vOrig[m_vCopy[v]] = v;
+
+ adjEntry adj;
+ forall_adj(adj,v) {
+ if ((adj->index() & 1) == 0) {
+ edge e = adj->theEdge();
+ //
+ // edge ec = eCopy[e];
+ //
+ m_eIterator[eCopy[e]] = m_eCopy[e].pushBack(eCopy[e]);
+ m_eOrig[eCopy[e]] = e;
+ }
+ }
+ }
+
+}
+
+void GraphCopy::initByActiveNodes(
+ const List<node> &nodes,
+ const NodeArray<bool> &activeNodes,
+ EdgeArray<edge> &eCopy)
+{
+ Graph::constructInitByActiveNodes(nodes, activeNodes, m_vCopy, eCopy);
+
+ ListConstIterator<node> itV;
+ for(itV = nodes.begin(); itV.valid(); ++itV)
+ {
+ node v = *itV;
+
+ m_vOrig[m_vCopy[v]] = v;
+
+ adjEntry adj;
+ forall_adj(adj,v) {
+ if ((adj->index() & 1) == 0) {
+ edge e = adj->theEdge();
+ //
+ // edge ec = eCopy[e];
+ //
+ OGDF_ASSERT(m_eCopy[e].size() == 0)
+ if (activeNodes[e->opposite(v)])
+ {
+ m_eIterator[eCopy[e]] = m_eCopy[e].pushBack(eCopy[e]);
+ m_eOrig[eCopy[e]] = e;
+ }
+ }
+ }
+ }
+
+}
+
+
+GraphCopy &GraphCopy::operator=(const GraphCopy &GC)
+{
+ NodeArray<node> vCopy;
+ EdgeArray<edge> eCopy;
+
+ Graph::assign(GC,vCopy,eCopy);
+ initGC(GC,vCopy,eCopy);
+
+ return *this;
+}
+
+
+void GraphCopy::setOriginalEmbedding()
+{
+ node v;
+ forall_nodes(v, *m_pGraph)
+ {
+ if (m_vCopy[v] != 0)
+ {
+ adjEntry adjOr;
+ List<adjEntry> newAdjOrder;
+ newAdjOrder.clear();
+
+ forall_adj(adjOr, v)
+ {
+ if (m_eCopy[adjOr->theEdge()].size() > 0){
+ //we have outgoing adjEntries for all
+ //incoming and outgoing edges, check the direction
+ //to find the correct copy adjEntry
+ bool outEdge = (adjOr == (adjOr->theEdge()->adjSource()));
+
+ OGDF_ASSERT(chain(adjOr->theEdge()).size() == 1);
+ edge cEdge = chain(adjOr->theEdge()).front();
+ adjEntry cAdj = (outEdge ? cEdge->adjSource() : cEdge->adjTarget());
+ newAdjOrder.pushBack(cAdj);
+ }
+ }//foralladj
+ sort(copy(v), newAdjOrder);
+ }
+ }//forallnodes
+}
+
+
+edge GraphCopy::split(edge e)
+{
+ edge eNew = Graph::split(e);
+ edge eOrig = m_eOrig[e];
+
+ if ((m_eOrig[eNew] = eOrig) != 0) {
+ m_eIterator[eNew] = m_eCopy[eOrig].insert(eNew,m_eIterator[e],after);
+ }
+
+ return eNew;
+}
+
+
+void GraphCopy::unsplit(edge eIn, edge eOut)
+{
+ edge eOrig = m_eOrig[eOut];
+
+ // update chain of eOrig if eOrig exists
+ if (eOrig != 0) {
+ m_eCopy[eOrig].del(m_eIterator[eOut]);
+ }
+
+ Graph::unsplit(eIn,eOut);
+}
+
+
+edge GraphCopy::newEdge(edge eOrig)
+{
+ OGDF_ASSERT(eOrig != 0 && eOrig->graphOf() == m_pGraph);
+ OGDF_ASSERT(m_eCopy[eOrig].empty()); // no support for edge splitting!
+
+ edge e = Graph::newEdge(m_vCopy[eOrig->source()], m_vCopy[eOrig->target()]);
+ m_eCopy[m_eOrig[e] = eOrig].pushBack(e);
+
+ return e;
+}
+
+edge GraphCopy::newEdge(edge eOrig, adjEntry adjSrc, node w)
+{
+ OGDF_ASSERT(eOrig != 0 && eOrig->graphOf() == m_pGraph);
+ OGDF_ASSERT(m_eCopy[eOrig].empty()); // no support for edge splitting!
+ OGDF_ASSERT(w == m_vCopy[eOrig->target()]);
+
+ edge e = Graph::newEdge(adjSrc, w);
+ m_eCopy[m_eOrig[e] = eOrig].pushBack(e);
+
+ return e;
+}
+
+edge GraphCopy::newEdge(edge eOrig, node v, adjEntry adjTgt)
+{
+ OGDF_ASSERT(eOrig != 0 && eOrig->graphOf() == m_pGraph);
+ OGDF_ASSERT(m_eCopy[eOrig].empty()); // no support for edge splitting!
+ OGDF_ASSERT(v == m_vCopy[eOrig->source()]);
+
+ edge e = Graph::newEdge(v, adjTgt);
+ m_eCopy[m_eOrig[e] = eOrig].pushBack(e);
+
+ return e;
+}
+
+
+//inserts edge preserving the embedding
+//todo: rename adjEnd to show the symmetric character
+edge GraphCopy::newEdge(node v, adjEntry adjEnd, edge eOrig, CombinatorialEmbedding &E)
+{
+ OGDF_ASSERT(v != 0 && adjEnd != 0)
+ OGDF_ASSERT(v->graphOf() == this && adjEnd->graphOf() == this);
+ OGDF_ASSERT(&(E.getGraph()) == this)
+ OGDF_ASSERT(m_eCopy[eOrig].size() == 0)
+
+ //check which direction is correct
+ edge e;
+ if (original(v) == eOrig->source())
+ e = E.splitFace(v, adjEnd);
+ else
+ e = E.splitFace(adjEnd, v);
+ m_eIterator[e] = m_eCopy[eOrig].pushBack(e);
+ m_eOrig[e] = eOrig;
+
+ return e;
+}//newedge
+
+
+void GraphCopy::setEdge(edge eOrig, edge eCopy){
+ OGDF_ASSERT(eOrig != 0 && eOrig->graphOf() == m_pGraph);
+ OGDF_ASSERT(eCopy != 0 && eCopy->graphOf() == this);
+ OGDF_ASSERT(eCopy->target() == m_vCopy[eOrig->target()]);
+ OGDF_ASSERT(eCopy->source() == m_vCopy[eOrig->source()]);
+ OGDF_ASSERT(m_eCopy[eOrig].empty());
+
+ m_eCopy[m_eOrig[eCopy] = eOrig].pushBack(eCopy);
+}
+
+
+void GraphCopy::insertEdgePathEmbedded(
+ edge eOrig,
+ CombinatorialEmbedding &E,
+ const SList<adjEntry> &crossedEdges)
+{
+ m_eCopy[eOrig].clear();
+
+ adjEntry adjSrc, adjTgt;
+ SListConstIterator<adjEntry> it = crossedEdges.begin();
+ SListConstIterator<adjEntry> itLast = crossedEdges.rbegin();
+
+ // iterate over all adjacency entries in crossedEdges except for first
+ // and last
+ adjSrc = *it;
+ for(++it; it != itLast; ++it)
+ {
+ adjEntry adj = *it;
+ // split edge
+ node u = E.split(adj->theEdge())->source();
+
+ // determine target adjacency entry and source adjacency entry
+ // in the next iteration step
+ adjTgt = u->firstAdj();
+ adjEntry adjSrcNext = adjTgt->succ();
+
+ if (adjTgt != adj->twin())
+ swap(adjTgt,adjSrcNext);
+
+ // insert a new edge into the face
+ edge eNew = E.splitFace(adjSrc,adjTgt);
+ m_eIterator[eNew] = m_eCopy[eOrig].pushBack(eNew);
+ m_eOrig[eNew] = eOrig;
+
+ adjSrc = adjSrcNext;
+ }
+
+ // insert last edge
+ edge eNew = E.splitFace(adjSrc,*it);
+ m_eIterator[eNew] = m_eCopy[eOrig].pushBack(eNew);
+ m_eOrig[eNew] = eOrig;
+}
+
+
+void GraphCopy::insertEdgePath(edge eOrig, const SList<adjEntry> &crossedEdges)
+{
+ node v = copy(eOrig->source());
+
+ SListConstIterator<adjEntry> it;
+ for(it = crossedEdges.begin(); it.valid(); ++it)
+ {
+ node u = split((*it)->theEdge())->source();
+
+ edge eNew = newEdge(v,u);
+ m_eIterator[eNew] = m_eCopy[eOrig].pushBack(eNew);
+ m_eOrig[eNew] = eOrig;
+
+ v = u;
+ }
+
+ edge eNew = newEdge(v,copy(eOrig->target()));
+ m_eIterator[eNew] = m_eCopy[eOrig].pushBack(eNew);
+ m_eOrig[eNew] = eOrig;
+}
+
+void GraphCopy::insertEdgePath(node srcOrig, node tgtOrig, const SList<adjEntry> &crossedEdges)
+{
+ node v = copy(srcOrig);
+
+ SListConstIterator<adjEntry> it;
+ for(it = crossedEdges.begin(); it.valid(); ++it)
+ {
+ node u = split((*it)->theEdge())->source();
+
+ edge eNew = newEdge(v,u);
+ // m_eIterator[eNew] = m_eCopy[eOrig].pushBack(eNew);
+ m_eOrig[eNew] = 0;
+
+ v = u;
+ }
+
+ edge eNew = newEdge(v,copy(tgtOrig));
+ //m_eIterator[eNew] = m_eCopy[eOrig].pushBack(eNew);
+ m_eOrig[eNew] = 0;
+}
+
+//inserts crossing between two copy edges already in PlanRep
+//returns newly introduced copy edge of crossed edge
+//the crossing edge parameter is changed to allow iteration
+//over an edge's crossings in the edge direction
+//the parameter topDown describes he following:
+// if the crossingEdge is running horizontally from left to right,
+// is the crossedEdge direction top->down?
+edge GraphCopy::insertCrossing(
+ edge& crossingEdge,
+ edge crossedEdge,
+ bool topDown)
+ //const SList<edge> &crossedCopies)
+{
+ //we first split the crossed edge
+ edge e = split(crossedEdge);
+ edge eOrig = original(crossingEdge);
+ adjEntry adSource = crossingEdge->adjSource();
+
+ //now we delete the crossing copy edge and replace it
+ //by two edges adjacent to the crossing vertex
+ //we have to consider the copy ordering of the
+ //original edge
+ //we have to keep the correct order of the adjacency entries
+ //because even without a combinatorial embedding, the
+ //ordering of the edges may already be fixed
+ //Problem: wie erkennt man die Reihenfolge am split?
+ //Man muss die Richtung der gekreuzten Kante kennen
+ //=>Parameter, und hier adjSource und adjTarget trennen
+ edge eNew1, eNew2;
+ if (topDown)
+ {
+ //case 1: crossingEdge runs top-down
+ eNew1 = newEdge(adSource, e->adjSource());
+ eNew2 = newEdge(e->adjSource()->cyclicPred(),
+ crossingEdge->adjTarget()->cyclicPred());
+ }
+ else
+ {
+ //case 2: crossingEdge runs bottom-up
+ eNew1 = newEdge(adSource, e->adjSource()->cyclicPred());
+ eNew2 = newEdge(e->adjSource(), crossingEdge->adjTarget()->cyclicPred());
+ }//else bottom up
+ //insert new edge after old entry
+ m_eIterator[eNew1] = m_eCopy[eOrig].insert(eNew1, m_eIterator[crossingEdge]);
+ m_eOrig[eNew1] = eOrig;
+ m_eIterator[eNew2] = m_eCopy[eOrig].insert(eNew2, m_eIterator[eNew1]);
+ m_eOrig[eNew2] = eOrig;
+ //now we delete the input copy edge
+ m_eCopy[eOrig].del(m_eIterator[crossingEdge]);
+ delEdge(crossingEdge);
+ crossingEdge = eNew2;
+
+ return e;//eNew2;
+}
+
+void GraphCopy::delCopy(edge e)
+{
+ edge eOrig = m_eOrig[e];
+
+ delEdge(e);
+ if (eOrig == 0) return;
+
+ OGDF_ASSERT(m_eCopy[eOrig].size() == 1);
+ m_eCopy[eOrig].clear();
+}
+
+
+void GraphCopy::delCopy(node v)
+{
+ node w = m_vOrig[v];
+ if (w != 0) m_vCopy[w] = 0;
+
+ adjEntry adj;
+ forall_adj(adj,v)
+ {
+ edge eo = m_eOrig[adj->theEdge()];
+ if (eo != 0)
+ m_eCopy[eo].clear();
+ }
+
+ delNode(v);
+}
+
+
+void GraphCopy::removeEdgePathEmbedded(
+ CombinatorialEmbedding &E,
+ edge eOrig,
+ FaceSetPure &newFaces)
+{
+ const List<edge> &path = m_eCopy[eOrig];
+ ListConstIterator<edge> it = path.begin();
+
+ newFaces.insert(E.joinFaces(*it));
+
+ for(++it; it.valid(); ++it)
+ {
+ edge e = *it;
+ node u = e->source();
+
+ newFaces.remove(E.rightFace(e->adjSource()));
+ newFaces.remove(E.rightFace(e->adjTarget()));
+
+ newFaces.insert(E.joinFaces(e));
+
+ edge eIn = u->firstAdj()->theEdge();
+ edge eOut = u->lastAdj()->theEdge();
+ if (eIn->target() != u)
+ swap(eIn,eOut);
+
+ E.unsplit(eIn,eOut);
+ }
+
+ m_eCopy[eOrig].clear();
+}
+
+
+void GraphCopy::removeEdgePath(edge eOrig)
+{
+ const List<edge> &path = m_eCopy[eOrig];
+ ListConstIterator<edge> it = path.begin();
+
+ delEdge(*it);
+
+ for(++it; it.valid(); ++it)
+ {
+ edge e = *it;
+ node u = e->source();
+
+ delEdge(e);
+
+ edge eIn = u->firstAdj()->theEdge();
+ edge eOut = u->lastAdj()->theEdge();
+ if (eIn->target() != u)
+ swap(eIn,eOut);
+
+ unsplit(eIn,eOut);
+ }
+
+ m_eCopy[eOrig].clear();
+}
+
+
+
+bool GraphCopy::consistencyCheck() const
+{
+ if (Graph::consistencyCheck() == false)
+ return false;
+
+ const Graph &G = *m_pGraph;
+
+ node v, vG;
+ forall_nodes(vG,G) {
+ v = m_vCopy[vG];
+#ifdef OGDF_DEBUG
+ if (v && v->graphOf() != this)
+ return false;
+#endif
+ if (v && m_vOrig[v] != vG)
+ return false;
+ }
+
+ forall_nodes(v,*this) {
+ vG = m_vOrig[v];
+#ifdef OGDF_DEBUG
+ if(vG && vG->graphOf() != &G)
+ return false;
+#endif
+ if (vG && m_vCopy[vG] != v)
+ return false;
+ }
+
+ edge e, eG;
+ forall_edges(eG,G) {
+ const List<edge> &path = m_eCopy[eG];
+ ListConstIterator<edge> it;
+ for(it = path.begin(); it.valid(); ++it) {
+ e = *it;
+#ifdef OGDF_DEBUG
+ if (e->graphOf() != this)
+ return false;
+#endif
+ if (m_eOrig[e] != eG)
+ return false;
+ }
+ }
+
+ forall_edges(e,*this) {
+ eG = m_eOrig[e];
+#ifdef OGDF_DEBUG
+ if(eG && eG->graphOf() != &G)
+ return false;
+#endif
+ }
+
+ return true;
+}
+
+
+
+} // end namespace ogdf
diff --git a/ogdf/basic/GraphCopy.h b/ogdf/basic/GraphCopy.h
new file mode 100644
index 0000000..ff035bc
--- /dev/null
+++ b/ogdf/basic/GraphCopy.h
@@ -0,0 +1,645 @@
+/*
+ * $Revision: 2583 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-12 01:02:21 +0200 (Do, 12. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of graph copy classes.
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_GRAPH_COPY_H
+#define OGDF_GRAPH_COPY_H
+
+
+#include "NodeArray.h"
+#include "EdgeArray.h"
+#include "SList.h"
+#include "CombinatorialEmbedding.h"
+
+
+namespace ogdf {
+
+class FaceSetPure;
+
+
+//---------------------------------------------------------
+// GraphCopySimple
+// simple graph copies (no support for edge splitting)
+//---------------------------------------------------------
+/**
+ * \brief Copies of graphs with mapping between nodes and edges
+ *
+ * The class GraphCopySimple represents a copy of a graph and
+ * maintains a mapping between the nodes and edges of the original
+ * graph to the copy and vice versa.
+ *
+ * New nodes and edges can be added to the copy; the counterpart
+ * of those nodes and edges is 0 indicating that there is no counterpart.
+ * This class <b>does not</b> support splitting of edges in such a way
+ * that both edges resulting from the split are mapped to the same
+ * original edge; this feature is provided by GraphCopy.
+ */
+class OGDF_EXPORT GraphCopySimple : public Graph
+{
+ const Graph *m_pGraph; //!< The original graph.
+ NodeArray<node> m_vOrig; //!< The corresponding node in the original graph.
+ NodeArray<node> m_vCopy; //!< The corresponding node in the graph copy.
+ EdgeArray<edge> m_eOrig; //!< The corresponding edge in the original graph.
+ EdgeArray<edge> m_eCopy; //!< The corresponding edge in the graph copy.
+
+public:
+ // construction
+
+ //! Constructs a copy of graph \a G.
+ GraphCopySimple(const Graph &G);
+
+ //! Copy constructor.
+ GraphCopySimple(const GraphCopySimple &GC);
+
+ virtual ~GraphCopySimple() { }
+
+ //! Returns a reference to the original graph.
+ const Graph &original() const { return *m_pGraph; }
+
+ /**
+ * \brief Returns the node in the original graph corresponding to \a v.
+ * @param v is a node in the graph copy.
+ * \return the corresponding node in the original graph, or 0 if no
+ * such node exists.
+ */
+ node original(node v) const { return m_vOrig[v]; }
+
+ /**
+ * \brief Returns the edge in the original graph corresponding to \a e.
+ * @param e is an edge in the graph copy.
+ * \return the corresponding edge in the original graph, or 0 if no
+ * such edge exists.
+ */
+ edge original(edge e) const { return m_eOrig[e]; }
+
+ /**
+ * \brief Returns the node in the graph copy corresponding to \a v.
+ * @param v is a node in the original graph.
+ * \return the corresponding node in the graph copy.
+ */
+ node copy(node v) const { return m_vCopy[v]; }
+
+ /**
+ * \brief Returns the edge in the graph copy corresponding to \a e.
+ * @param e is an edge in the original graph.
+ * \return the corresponding edge in the graph copy.
+ */
+ edge copy(edge e) const { return m_eCopy[e]; }
+
+ /**
+ * \brief Returns true iff \a v has no corresponding node in the original graph.
+ * @param v is a node in the graph copy.
+ */
+ bool isDummy(node v) const { return (m_vOrig[v] == 0); }
+
+ /**
+ * \brief Returns true iff \a e has no corresponding edge in the original graph.
+ * @param e is an edge in the graph copy.
+ */
+ bool isDummy(edge e) const { return (m_eOrig[e] == 0); }
+
+ //! Assignment operator.
+ GraphCopySimple &operator=(const GraphCopySimple &GC);
+
+
+ //! Creates a new node in the graph copy.
+ node newNode() {
+ return Graph::newNode();
+ }
+
+ /**
+ * \brief Creates a new node in the graph copy with original node \a vOrig.
+ * \warning You have to make sure that the original node makes sense, in
+ * particular that \a vOrig is not the original node of another node in the copy.
+ */
+ node newNode(node vOrig) {
+ OGDF_ASSERT(vOrig != 0 && vOrig->graphOf() == m_pGraph);
+ node v = Graph::newNode();
+ m_vCopy[m_vOrig[v] = vOrig] = v;
+ return v;
+ }
+
+ //! Creates a new edge from \a v to \a w in the graph copy.
+ edge newEdge(node v, node w) {
+ return Graph::newEdge(v,w);
+ }
+
+ /**
+ * \brief Creates a new edge in the graph copy with original edge \a eOrig.
+ * \warning You have to make sure that the original edge makes sense, in
+ * particular that \a eOrig is not the original edge of another edge in the copy.
+ */
+ edge newEdge(edge eOrig) {
+ OGDF_ASSERT(eOrig != 0 && eOrig->graphOf() == m_pGraph);
+ edge e = Graph::newEdge(m_vCopy[eOrig->source()], m_vCopy[eOrig->target()]);
+ m_eCopy[m_eOrig[e] = eOrig] = e;
+ return e;
+ }
+
+private:
+ void initGC(const GraphCopySimple &GC, NodeArray<node> &vCopy,
+ EdgeArray<edge> &eCopy);
+}; // class GraphCopySimple
+
+
+//---------------------------------------------------------
+// GraphCopy
+// graph copies (support for edge splitting)
+//---------------------------------------------------------
+/**
+ * \brief Copies of graphs supporting edge splitting
+ *
+ * The class GraphCopy represents a copy of a graph and
+ * maintains a mapping between the nodes and edges of the original
+ * graph to the copy and vice versa.
+ *
+ * New nodes and edges can be added to the copy; the counterpart
+ * of those nodes and edges is 0 indicating that there is no counterpart.
+ * GraphCopy also support splitting of edges in such a way
+ * that both edges resulting from the split are mapped to the same
+ * original edge, and each edge of the original graph is mapped to a list
+ * of edges. Furthermore, it is allowed to reverse edges in the graph copy.
+ *
+ * <h3>Do's and Dont's</h3>
+ * Here is a short summary, what can be done with GraphCopy, and what should not
+ * be done. The following operations are safely supported:
+ * - Splitting of edges such that an original edge is represented by a path
+ * in the copy (split(), unsplit()).
+ * - Reversing edges in the copy (Graph::reverseEdge(), Graph::reverseAllEdges()).
+ * - Reinsertion of original edges such that they are represented by a path
+ * in the copy (insertEdgePath(), insertEdgePathEmbedded(), removeEdgePath(),
+ * removeEdgePathEmbedded()).
+ * - Inserting and removing dummy edges in the copy which are not associated
+ * with edges in the original graph.
+ *
+ * The following operations are <b>not supported</b> and are thus dangerous:
+ * - Any modifications on the original graph, since the copy will not be
+ * notified.
+ * - Moving the source or target node of an edge in the copy to a different node.
+ * - Removing edges in the graph copy that belong to a path representing an
+ * original edge.
+ * - ... (better think first!)
+ */
+class OGDF_EXPORT GraphCopy : public Graph {
+protected:
+
+ const Graph *m_pGraph; //!< The original graph.
+ NodeArray<node> m_vOrig; //!< The corresponding node in the original graph.
+ EdgeArray<edge> m_eOrig; //!< The corresponding edge in the original graph.
+ EdgeArray<ListIterator<edge> > m_eIterator; //!< The position of copy edge in the list.
+
+ NodeArray<node> m_vCopy; //!< The corresponding node in the graph copy.
+ EdgeArray<List<edge> > m_eCopy; //!< The corresponding list of edges in the graph copy.
+
+public:
+ //! Creates a graph copy of \a G.
+ /**
+ * The constructor assures that the adjacency lists of nodes in the
+ * constructed copy are in the same order as the adjacency lists in \a G.
+ * This is in particular important when dealing with embedded graphs.
+ */
+ GraphCopy(const Graph &G);
+
+ //! Default constructor (does nothing!).
+ GraphCopy() : Graph() { }
+
+ //! Copy constructor.
+ /**
+ * Creates a graph copy that is a copy of \a GC and represents a graph
+ * copy of the original graph of \a GC.
+ */
+ GraphCopy(const GraphCopy &GC);
+
+ virtual ~GraphCopy() { }
+
+
+ /**
+ * @name Mapping between original graph and copy
+ */
+ //@{
+
+ //! Returns a reference to the original graph.
+ const Graph &original() const { return *m_pGraph; }
+
+ /**
+ * \brief Returns the node in the original graph corresponding to \a v.
+ * @param v is a node in the graph copy.
+ * \return the corresponding node in the original graph, or 0 if no
+ * such node exists.
+ */
+ node original(node v) const { return m_vOrig[v]; }
+
+ /**
+ * \brief Returns the edge in the original graph corresponding to \a e.
+ * @param e is an edge in the graph copy.
+ * \return the corresponding edge in the original graph, or 0 if no
+ * such edge exists.
+ */
+ edge original(edge e) const { return m_eOrig[e]; }
+
+ /**
+ * \brief Returns the node in the graph copy corresponding to \a v.
+ * @param v is a node in the original graph.
+ * \return the corresponding node in the graph copy.
+ */
+ node copy(node v) const { return m_vCopy[v]; }
+
+ /**
+ * \brief Returns the list of edges coresponding to edge \a e.
+ * \param e is an edge in the original graph.
+ * \return the corresponding list of edges in the graph copy.
+ */
+ const List<edge> &chain(edge e) const { return m_eCopy[e]; }
+
+ // returns first edge in chain(e)
+ /**
+ * \brief Returns the first edge in the list of edges coresponding to edge \a e.
+ * @param e is an edge in the original graph.
+ * \return the first edge in the corresponding list of edges in
+ * the graph copy.
+ */
+ edge copy(edge e) const { return m_eCopy[e].front(); }
+
+ /**
+ * \brief Returns true iff \a v has no corresponding node in the original graph.
+ * @param v is a node in the graph copy.
+ */
+ bool isDummy(node v) const { return (m_vOrig[v] == 0); }
+
+ /**
+ * \brief Returns true iff \a e has no corresponding edge in the original graph.
+ * @param e is an edge in the graph copy.
+ */
+ bool isDummy(edge e) const { return (m_eOrig[e] == 0); }
+
+ /**
+ * \brief Returns true iff edge \a e has been reversed.
+ * @param e is an edge in the original graph.
+ */
+ bool isReversed (edge e) const {
+ return e->source() != original(copy(e)->source());
+ }
+
+
+ /**
+ * @name Creation and deletion of nodes and edges
+ */
+ //@{
+
+ //! Creates a new node in the graph copy.
+ node newNode() {
+ return Graph::newNode();
+ }
+
+ /**
+ * \brief Creates a new node in the graph copy with original node \a vOrig.
+ * \warning You have to make sure that the original node makes sense, in
+ * particular that \a vOrig is not the original node of another node in the copy.
+ */
+ node newNode(node vOrig) {
+ OGDF_ASSERT(vOrig != 0 && vOrig->graphOf() == m_pGraph);
+ node v = Graph::newNode();
+ m_vCopy[m_vOrig[v] = vOrig] = v;
+ return v;
+ }
+
+ /**
+ * \brief Removes node \a v and all its adjacent edges cleaning-up their corresponding lists of original edges.
+ *
+ * \pre The corresponding lists oforiginal edges contain each only one edge.
+ * \param v is a node in the graph copy.
+ */
+ void delCopy(node v);
+
+ /**
+ * \brief Removes edge e and clears the list of edges corresponding to \a e's original edge.
+ *
+ * \pre The list of edges corresponding to \a e's original edge contains only \a e.
+ * \param e is an edge in the graph copy.
+ */
+ void delCopy(edge e);
+
+
+ /**
+ * \brief Splits edge \a e.
+ * @param e is an edge in the graph copy.
+ */
+ virtual edge split(edge e);
+
+
+ /**
+ * \brief Undoes a previous split operation.
+ * The two edges \a eIn and \a eOut are merged to a single edge \a eIn.
+ * \pre The vertex \a u that was created by the previous split operation has
+ * exactly one incoming edge \a eIn and one outgoing edge \a eOut.
+ * @param eIn is an edge (*,\a u) in the graph copy.
+ * @param eOut is an edge (\a u,*) in the graph copy.
+ */
+ void unsplit(edge eIn, edge eOut);
+
+ //! Creates a new edge (\a v,\a w) with original edge \a eOrig.
+ edge newEdge(edge eOrig);
+
+ //! Creates a new edge with original edge \a eOrig at predefined positions in the adjacency lists.
+ /**
+ * Let \a v be the node whose adjacency list contains \a adjSrc. Then,
+ * the created edge is (\a v,\a w).
+ * @param eOrig is the original edge.
+ * @param adjSrc is the adjacency entry after which the new edge is inserted
+ * in the adjacency list of \a v.
+ * @param w is the source node of the new edge; the edge is added at the end
+ * of the adjacency list of \a w.
+ * @return the created edge.
+ */
+ edge newEdge(edge eOrig, adjEntry adjSrc, node w);
+
+ //! Creates a new edge with original edge \a eOrig at predefined positions in the adjacency lists.
+ /**
+ * Let \a w be the node whose adjacency list contains \a adjTgt. Then,
+ * the created edge is (\a v,\a w).
+ * @param eOrig is the original edge.
+ * @param v is the source node of the new edge; the edge is added at the end
+ * of the adjacency list of \a v.
+ * @param adjTgt is the adjacency entry after which the new edge is inserted
+ * in the adjacency list of \a w.
+ * @return the created edge.
+ */
+ edge newEdge(edge eOrig, node v, adjEntry adjTgt);
+
+ edge newEdge(node v, node w) { return Graph::newEdge(v, w); }
+ edge newEdge(adjEntry adjSrc, adjEntry adjTgt) { return Graph::newEdge(adjSrc, adjTgt); }
+ edge newEdge(node v, adjEntry adjTgt) { return Graph::newEdge(v, adjTgt); }
+ edge newEdge(adjEntry adjSrc, node w) { return Graph::newEdge(adjSrc, w); }
+
+ //! sets eOrig to be the corresponding original edge of eCopy and vice versa
+ /**
+ * @param eOrig is the original edge
+ * @param eCopy is the edge copy
+ */
+ void setEdge(edge eOrig, edge eCopy);
+
+ //! Re-inserts edge \a eOrig by "crossing" the edges in \a crossedEdges.
+ /**
+ * Let \a v and \a w be the copies of the source and target nodes of \a eOrig.
+ * Each edge in \a crossedEdges is split creating a sequence
+ * \f$u_1,\ldots,u_k\f$ of new nodes, and additional edges are inserted creating
+ * a path \f$v,u_1,\ldots,u_k,w\f$.
+ * @param eOrig is an edge in the original graph and becomes the original edge of
+ * all edges in the path \f$v,u_1,\ldots,u_k,w\f$.
+ * @param crossedEdges are edges in the graph copy.
+ */
+ void insertEdgePath(edge eOrig, const SList<adjEntry> &crossedEdges);
+
+ //for FixedEmbeddingUpwardEdgeInserter only
+ void insertEdgePath(node srcOrig, node tgtOrig, const SList<adjEntry> &crossedEdges);
+
+
+ //! Removes the complete edge path for edge \a eOrig.
+ /**
+ * \@param eOrig is an edge in the original graph.
+ */
+ void removeEdgePath(edge eOrig);
+
+ //! Inserts crossings between two copy edges.
+ /**
+ * This method is used in TopologyModule.
+ *
+ * Let \a crossingEdge = (\a a, \a b) and \a crossedEdge = (\a v, \a w).
+ * Then \a crossedEdge is split creating two edges \a crossedEdge = (\a v, \a u)
+ * and (\a u, \a w), \a crossingEdge is removed and replaced by two new edges
+ * \a e1 = (\a a, \a u) and \a e1 = (\a u, \a b).
+ * Finally it sets \a crossingEdge to \a e2 and returns (\a u, \a w).
+ *
+ * @param crossingEdge is the edge that gets split.
+ * @param crossedEdge is the edge that is replaced by two new edges.
+ * @param topDown is used as follows: If set to true, \a crossingEdge will cross
+ * \a crossedEdge from right to left, otherwise from left to right.
+ */
+ edge insertCrossing(
+ edge& crossingEdge,
+ edge crossedEdge,
+ bool topDown);
+
+
+ /**
+ * @name Combinatorial Embeddings
+ */
+ //@{
+
+ //! Creates a new edge with original edge \a eOrig in an embedding \a E.
+ /**
+ * Let \a w be the node whose adjacency list contains \a adjTgt. The original
+ * edge \a eOrig must connect the original nodes of \a v and \a w. If \a eOrig =
+ * (original(\a v),original(\a w)), then the created edge is (\a v,\a w), otherwise
+ * it is (\a w,\a v). The new edge \a e must split a face in \a E, such that \a e
+ * comes after \a adj in the adjacency list of \a v and at the end of the adjacency
+ * list of \a v.
+ *
+ * @param v is a node in the graph copy.
+ * @param adj is an adjacency entry in the graph copy.
+ * @param eOrig is an edge in the original graph.
+ * @param E is an embedding of the graph copy.
+ * @return the created edge.
+ */
+ edge newEdge(node v, adjEntry adj, edge eOrig, CombinatorialEmbedding &E);
+
+ /**
+ * \brief Sets the embedding of the graph copy to the embedding of the original graph.
+ * \pre The graph copy has not been changed after construction, i.e., no new nodes
+ * or edges have been added and no edges have been split.
+ */
+ void setOriginalEmbedding();
+
+ //! Re-inserts edge \a eOrig by "crossing" the edges in \a crossedEdges in embedding \a E.
+ /**
+ * Let \a v and \a w be the copies of the source and target nodes of \a eOrig,
+ * and let \f$e_0,e_1,\ldots,e_k,e_{k+1}\f$ be the sequence of edges corresponding
+ * to the adjacency entries in \a crossedEdges. The first edge needs to be incident
+ * to \a v and the last to \a w; the edges \f$e_1,\ldots,e_k\f$ are each split
+ * creating a sequence \f$u_1,\ldots,u_k\f$ of new nodes, and additional edges
+ * are inserted creating a path \f$v,u_1,\ldots,u_k,w\f$.
+ *
+ * The following figure illustrates, which adjacency entries need to be in the list
+ * \a crossedEdges. It inserts an edge connecting \a v and \a w by passing through
+ * the faces \f$f_0,f_1,f_2\f$; in this case, the list \a crossedEdges must contain
+ * the adjacency entries \f$adj_0,\ldots,adj_3\f$ (in this order).
+ * \image html insertEdgePathEmbedded.png
+ *
+ * @param eOrig is an edge in the original graph and becomes the original edge of
+ * all edges in the path \f$v,u_1,\ldots,u_k,w\f$.
+ * @param E is an embedding of the graph copy.
+ * @param crossedEdges are a list of adjacency entries in the graph copy.
+ */
+ void insertEdgePathEmbedded(
+ edge eOrig,
+ CombinatorialEmbedding &E,
+ const SList<adjEntry> &crossedEdges);
+
+ /**
+ * Removes the complete edge path for edge \a eOrig while preserving the embedding.
+ * @param E is an embedding of the graph copy.
+ * @param eOrig is an edge in the original graph.
+ * @param newFaces is assigned the set of new faces resulting from joining faces
+ * when removing edges.
+ */
+ void removeEdgePathEmbedded(
+ CombinatorialEmbedding &E,
+ edge eOrig,
+ FaceSetPure &newFaces);
+
+
+ //@}
+ /**
+ * @name Miscellaneous
+ */
+ //@{
+
+ //! Checks the consistency of the data structure (for debugging only).
+ bool consistencyCheck() const;
+
+ //! Associates the graph copy with \a G, but does not create any nodes or edges.
+ /**
+ * This method is used for a special creation of the graph copy.
+ * The graph copy needs to be constructed with the default constructor,
+ * gets associated with \a G using this method, and then is initialized
+ * using either initByNodes() or initByActiveNodes().
+ *
+ * The following code snippet shows a typical application of this functionality:
+ * \code
+ * GraphCopy GC;
+ * GC.createEmpty(G);
+ *
+ * // compute connected components of G
+ * NodeArray<int> component(G);
+ * int numCC = connectedComponents(G,component);
+ *
+ * // intialize the array of lists of nodes contained in a CC
+ * Array<List<node> > nodesInCC(numCC);
+ *
+ * node v;
+ * forall_nodes(v,G)
+ * nodesInCC[component[v]].pushBack(v);
+ *
+ * EdgeArray<edge> auxCopy(G);
+ * Array<DPoint> boundingBox(numCC);
+ *
+ * for(int i = 0; i < numCC; ++i) {
+ * GC.initByNodes(nodesInCC[i],auxCopy);
+ * ...
+ * }
+ * \endcode
+ * @param G is the graph of which this graph copy shall be a copy.
+ */
+ void createEmpty(const Graph &G);
+
+ //! Initializes the graph copy for the nodes in a component.
+ /**
+ * Creates copies of all nodes in \a nodes and their incident edges.
+ * Any nodes and edges allocated before are removed.
+ *
+ * The order of entries in the adjacency lists is preserved, i.e., if
+ * the original graph is embedded, its embedding induces the embedding
+ * of the created copy.
+ *
+ * It is important that \a nodes is the complete list of nodes in
+ * a connected component. If you wish to initialize the graph copy for an
+ * arbitrary set of nodes, use the method initByActiveNodes().
+ * \see createEmpty() for an example.
+ * @param nodes is the list of nodes in the original graph for which
+ * copies are created in the graph copy.
+ * @param eCopy is assigned the copy of each original edge.
+ */
+ void initByNodes(const List<node> &nodes, EdgeArray<edge> &eCopy);
+
+ //! Initializes the graph copy for the nodes in \a nodes.
+ /**
+ * Creates copies of all nodes in \a nodes and edges between two nodes
+ * which are both contained in \a nodes.
+ * Any nodes and edges allocated before are destroyed.
+ *
+ * \see createEmpty()
+ * @param nodes is the list of nodes in the original graph for which
+ * copies are created in the graph copy.
+ * @param activeNodes must be true for every node in \a nodes, false
+ * otherwise.
+ * @param eCopy is assigned the copy of each original edge.
+ */
+ void initByActiveNodes(const List<node> &nodes,
+ const NodeArray<bool> &activeNodes, EdgeArray<edge> &eCopy);
+
+ //@}
+ /**
+ * @name Operators
+ */
+ //@{
+
+ //! Assignment operator.
+ /**
+ * Creates a graph copy that is a copy of \a GC and represents a graph
+ * copy of the original graph of \a GC.
+ *
+ * The constructor assures that the adjacency lists of nodes in the
+ * constructed graph are in the same order as the adjacency lists in \a G.
+ * This is in particular important when dealing with embedded graphs.
+ */
+ GraphCopy &operator=(const GraphCopy &GC);
+
+
+ //@}
+
+private:
+ void initGC(const GraphCopy &GC,
+ NodeArray<node> &vCopy, EdgeArray<edge> &eCopy);
+
+}; // class GraphCopy
+
+
+} // end namespace ogdf
+
+#endif
diff --git a/ogdf/basic/GraphObserver.h b/ogdf/basic/GraphObserver.h
new file mode 100644
index 0000000..cad4eb7
--- /dev/null
+++ b/ogdf/basic/GraphObserver.h
@@ -0,0 +1,147 @@
+/*
+ * $Revision: 2615 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-16 14:23:36 +0200 (Mo, 16. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Abstract base class for structures on graphs, that need
+ * to be informed about graph changes (e.g. cluster graphs).
+ *
+ * Follows the observer pattern: graphs are observable
+ * objects that can inform observers on changes made to their
+ * structure.
+ *
+ * \author Karsten Klein
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_GRAPH_STRUCTURE_H
+#define OGDF_GRAPH_STRUCTURE_H
+
+
+#include "List.h"
+#include "Graph.h"
+
+namespace ogdf {
+
+//
+// in embedded graphs, adjacency lists are given in clockwise order.
+//
+
+
+//----------------------------------------------------------
+// GraphObserver
+//----------------------------------------------------------
+/**
+ * \brief Abstract Base class for classes that need to keep track
+ * of changes in the graph like addition/deletion of nodes
+ * or edges.
+ * derived classes have to overload nodeDeleted, nodeAdded
+ * edgeDeleted, edgeAdded
+ * these functions should be called by Graph before (delete)
+ *
+ */
+
+class OGDF_EXPORT GraphObserver {
+ friend class Graph;
+
+public:
+ //! Constructs instance of GraphObserver class
+ GraphObserver() : m_pGraph(0) { }
+
+ /**
+ *\brief Constructs instance of GraphObserver class
+ * \param G is the graph to be watched
+ */
+ GraphObserver(const Graph* G) : m_pGraph(G)
+ {
+ m_itGList = G->registerStructure(this);
+ }//constructor
+
+ //! Destroys the instance, unregisters it from watched graph
+ virtual ~GraphObserver()
+ {
+ if (m_pGraph) m_pGraph->unregisterStructure(m_itGList);
+ }//destructor
+
+ //! Associates observer instance with graph \a G
+ void reregister(const Graph *pG) {
+ //small speedup: check if == m_pGraph
+ if (m_pGraph) m_pGraph->unregisterStructure(m_itGList);
+ if ((m_pGraph = pG) != 0) m_itGList = pG->registerStructure(this);
+ }
+
+ //! Called by watched graph when a node is deleted
+ //! Has to be implemented by derived classes
+ virtual void nodeDeleted(node v) = 0;
+
+ //! Called by watched graph when a node is added
+ //! Has to be implemented by derived classes
+ virtual void nodeAdded(node v) = 0;
+
+ //! Called by watched graph when an edge is deleted
+ //! Has to be implemented by derived classes
+ virtual void edgeDeleted(edge e) = 0;
+
+ //! Called by watched graph when an edge is added
+ //! Has to be implemented by derived classes
+ virtual void edgeAdded(edge e) = 0;
+
+ //! Called by watched graph when it is reinitialized
+ //! Has to be implemented by derived classes
+ virtual void reInit() = 0;
+
+ //! Called by watched graph when its clear function is called
+ //! Has to be implemented by derived classes
+ virtual void cleared() = 0;
+
+ const Graph* getGraph() const { return m_pGraph; }
+
+protected:
+ const Graph* m_pGraph; //! watched graph
+ ListIterator<GraphObserver*> m_itGList; //! List entry in graphs list of all registered graphobservers
+
+
+};
+
+} //end namespace ogdf
+
+#endif
diff --git a/ogdf/basic/Graph_d.h b/ogdf/basic/Graph_d.h
new file mode 100644
index 0000000..64a8834
--- /dev/null
+++ b/ogdf/basic/Graph_d.h
@@ -0,0 +1,1560 @@
+/*
+ * $Revision: 2615 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-16 14:23:36 +0200 (Mo, 16. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Pure declaration header, find template implementation in
+ * Graph.h
+ *
+ * Declaration of NodeElement, EdgeElement, and Graph classes.
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_GRAPH_D_H
+#define OGDF_GRAPH_D_H
+
+
+#include "List.h"
+
+
+namespace ogdf {
+
+//
+// in embedded graphs, adjacency lists are given in clockwise order.
+//
+
+
+class OGDF_EXPORT Graph;
+class OGDF_EXPORT NodeElement;
+class OGDF_EXPORT EdgeElement;
+class OGDF_EXPORT AdjElement;
+class OGDF_EXPORT FaceElement;
+class OGDF_EXPORT GraphListBase;
+class OGDF_EXPORT ClusterElement;
+
+
+//! The base class for objects used by graphs like nodes, edges, etc.
+/**
+ * Such graph objects are maintained in list (see GraphList<T>),
+ * and \a GraphElement basically provides a next and previous pointer
+ * for these objects.
+ */
+class OGDF_EXPORT GraphElement {
+ friend class Graph;
+ friend class GraphListBase;
+
+protected:
+ GraphElement *m_next; //!< The successor in the list.
+ GraphElement *m_prev; //!< The predecessor in the list.
+
+ OGDF_NEW_DELETE
+}; // class GraphElement
+
+
+//! Base class for GraphElement lists.
+class OGDF_EXPORT GraphListBase {
+protected:
+ GraphElement *m_head; //!< Pointer to the first element in the list.
+ GraphElement *m_tail; //!< Pointer to the last element in the list.
+
+public:
+ //! Constructs an empty list.
+ GraphListBase() { m_head = m_tail = 0; }
+ // destruction
+ ~GraphListBase() { }
+
+ //! Adds element \a pX at the end of the list.
+ void pushBack(GraphElement *pX) {
+ pX->m_next = 0;
+ pX->m_prev = m_tail;
+ if (m_head)
+ m_tail = m_tail->m_next = pX;
+ else
+ m_tail = m_head = pX;
+ }
+
+ //! Inserts element \a pX after element \a pY.
+ void insertAfter(GraphElement *pX, GraphElement *pY) {
+ pX->m_prev = pY;
+ GraphElement *pYnext = pX->m_next = pY->m_next;
+ pY->m_next = pX;
+ if (pYnext) pYnext->m_prev = pX;
+ else m_tail = pX;
+ }
+
+ //! Inserts element \a pX before element \a pY.
+ void insertBefore(GraphElement *pX, GraphElement *pY) {
+ pX->m_next = pY;
+ GraphElement *pYprev = pX->m_prev = pY->m_prev;
+ pY->m_prev = pX;
+ if (pYprev) pYprev->m_next = pX;
+ else m_head = pX;
+ }
+
+ //! Removes element \a pX from the list.
+ void del(GraphElement *pX) {
+ GraphElement *pxPrev = pX->m_prev, *pxNext = pX->m_next;
+
+ if (pxPrev)
+ pxPrev->m_next = pxNext;
+ else
+ m_head = pxNext;
+ if (pxNext)
+ pxNext->m_prev = pxPrev;
+ else
+ m_tail = pxPrev;
+ }
+
+ //! Sorts the list according to \a newOrder.
+ template<class LIST>
+ void sort(const LIST &newOrder) {
+ GraphElement *pPred = 0;
+ typename LIST::const_iterator it = newOrder.begin();
+ if (!it.valid()) return;
+
+ m_head = *it;
+ for(; it.valid(); ++it) {
+ GraphElement *p = *it;
+ if ((p->m_prev = pPred) != 0) pPred->m_next = p;
+ pPred = p;
+ }
+
+ (m_tail = pPred)->m_next = 0;
+ }
+
+ //! Reverses the order of the list elements.
+ void reverse() {
+ GraphElement *pX = m_head;
+ m_head = m_tail;
+ m_tail = pX;
+ while(pX) {
+ GraphElement *pY = pX->m_next;
+ pX->m_next = pX->m_prev;
+ pX = pX->m_prev = pY;
+ }
+ }
+
+ //! Exchanges the positions of \a pX and \a pY in the list.
+ void swap(GraphElement *pX, GraphElement *pY) {
+ if (pX->m_next == pY) {
+ pX->m_next = pY->m_next;
+ pY->m_prev = pX->m_prev;
+ pY->m_next = pX;
+ pX->m_prev = pY;
+
+ } else if(pY->m_next == pX) {
+ pY->m_next = pX->m_next;
+ pX->m_prev = pY->m_prev;
+ pX->m_next = pY;
+ pY->m_prev = pX;
+
+ } else {
+ ::swap(pX->m_next,pY->m_next);
+ ::swap(pX->m_prev,pY->m_prev);
+ }
+
+ if(pX->m_prev)
+ pX->m_prev->m_next = pX;
+ else
+ m_head = pX;
+ if(pX->m_next)
+ pX->m_next->m_prev = pX;
+ else
+ m_tail = pX;
+
+ if(pY->m_prev)
+ pY->m_prev->m_next = pY;
+ else
+ m_head = pY;
+ if(pY->m_next)
+ pY->m_next->m_prev = pY;
+ else
+ m_tail = pY;
+
+ OGDF_ASSERT(consistencyCheck());
+ }
+
+
+ //! Checks consistency of graph list.
+ bool consistencyCheck() {
+ if (m_head == 0) {
+ return (m_tail == 0);
+
+ } else if (m_tail == 0) {
+ return false;
+
+ } else {
+ if (m_head->m_prev != 0)
+ return false;
+ if (m_tail->m_next != 0)
+ return false;
+
+ GraphElement *pX = m_head;
+ for(; pX; pX = pX->m_next) {
+ if (pX->m_prev) {
+ if (pX->m_prev->m_next != pX)
+ return false;
+ } else if(pX != m_head)
+ return false;
+
+ if (pX->m_next) {
+ if (pX->m_next->m_prev != pX)
+ return false;
+ } else if (pX != m_tail)
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ OGDF_NEW_DELETE
+}; // class GraphListBase
+
+
+//! Lists of graph objects (like nodes, edges, etc.).
+/**
+ * The template type \a T must be a class derived from GraphElement.
+ */
+template<class T> class GraphList : protected GraphListBase {
+public:
+ //! Constructs an empty list.
+ GraphList() { }
+ // destruction (deletes all elements)
+ ~GraphList() {
+ if (m_head)
+ OGDF_ALLOCATOR::deallocateList(sizeof(T), m_head,m_tail);
+ }
+
+ //! Returns the first element in the list.
+ T *begin () const { return (T *)m_head; }
+ //! Returns the last element in the list.
+ T *rbegin() const { return (T *)m_tail; }
+
+ //! Returns true iff the list is empty.
+ bool empty() { return m_head; }
+
+ //! Adds element \a pX at the end of the list.
+ void pushBack(T *pX) {
+ GraphListBase::pushBack(pX);
+ }
+
+ //! Inserts element \a pX after element \a pY.
+ void insertAfter(T *pX, T *pY) {
+ GraphListBase::insertAfter(pX,pY);
+ }
+
+ //! Inserts element \a pX before element \a pY.
+ void insertBefore(T *pX, T *pY) {
+ GraphListBase::insertBefore(pX,pY);
+ }
+
+ //! Moves element \a pX to list \a L and inserts it before or after \a pY.
+ void move(T *pX, GraphList<T> &L, T *pY, Direction dir) {
+ GraphListBase::del(pX);
+ if (dir == after)
+ L.insertAfter(pX,pY);
+ else
+ L.insertBefore(pX,pY);
+ }
+
+ //! Moves element \a pX to list \a L and inserts it at the end.
+ void move(T *pX, GraphList<T> &L) {
+ GraphListBase::del(pX);
+ L.pushBack(pX);
+ }
+
+ //! Moves element \a pX from its current position to a position after \a pY.
+ void moveAfter(T *pX, T *pY){
+ GraphListBase::del(pX);
+ insertAfter(pX,pY);
+ }
+
+ //! Moves element \a pX from its current position to a position before \a pY.
+ void moveBefore(T *pX, T *pY){
+ GraphListBase::del(pX);
+ insertBefore(pX,pY);
+ }
+
+ //! Removes element \a pX from the list and deletes it.
+ void del(T *pX) {
+ GraphListBase::del(pX);
+ delete pX;
+ }
+
+ //! Only removes element \a pX from the list; does not delete it.
+ void delPure(T *pX) {
+ GraphListBase::del(pX);
+ }
+
+ //! Removes all elements from the list and deletes them.
+ void clear() {
+ if (m_head) {
+ OGDF_ALLOCATOR::deallocateList(sizeof(T),m_head,m_tail);
+ m_head = m_tail = 0;
+ }
+ }
+
+ //! Sorts all elements according to \a newOrder.
+ template<class T_LIST>
+ void sort(const T_LIST &newOrder) {
+ GraphListBase::sort(newOrder);
+ }
+
+
+ //! Reverses the order of the list elements.
+ void reverse() {
+ GraphListBase::reverse();
+ }
+
+ //! Exchanges the positions of \a pX and \a pY in the list.
+ void swap(T *pX, T *pY) {
+ GraphListBase::swap(pX,pY);
+ }
+
+
+ //! Checks consistency of graph list; returns true if ok.
+ bool consistencyCheck() {
+ return GraphListBase::consistencyCheck();
+ }
+
+
+ OGDF_NEW_DELETE
+}; // class GraphList<T>
+
+
+typedef NodeElement *node; //!< The type of nodes.
+typedef EdgeElement *edge; //!< The type of edges.
+typedef AdjElement *adjEntry; //!< The type of adjacency entries.
+
+
+
+//! Class for adjacency list elements.
+/**
+ * Adjacency list elements represent the occurrence of an edges in
+ * the adjacency list of a node.
+ */
+class OGDF_EXPORT AdjElement : private GraphElement {
+ friend class Graph;
+ friend class GraphListBase;
+ friend class GraphList<AdjElement>;
+
+ AdjElement *m_twin; //!< The corresponding adjacency entry (same edge)
+ edge m_edge; //!< The associated edge.
+ node m_node; //!< The node whose adjacency list contains this entry.
+ int m_id; //!< The (unique) index of the adjacency entry.
+
+ //! Constructs an adjacency element for a given node.
+ AdjElement(node v) : m_node(v) { }
+ //! Constructs an adjacency entry for a given edge and index.
+ AdjElement(edge e, int id) : m_edge(e), m_id(id) { }
+
+public:
+ //! Returns the edge associated with this adjacency entry.
+ edge theEdge() const { return m_edge; }
+ //! Conversion to edge.
+ operator edge() const { return m_edge; }
+ //! Returns the node whose adjacency list contains this element.
+ node theNode() const { return m_node; }
+
+ //! Returns the corresponding adjacency element associated with the same edge.
+ adjEntry twin() const { return m_twin; }
+
+ //! Returns the associated node of the corresponding adjacency entry (shorthand for twin()->theNode()).
+ node twinNode() const { return m_twin->m_node; }
+
+ //! Returns the index of this adjacency element.
+ int index() const { return m_id; }
+
+ // traversing faces in clockwise (resp. counter-clockwise) order
+ // (if face is an interior face)
+
+ //! Returns the clockwise successor in face. Use faceCycleSucc instead!
+ adjEntry clockwiseFaceSucc() const { return m_twin->cyclicPred(); }
+ //! Returns the clockwise predecessor in face. Use faceCycleSucc instead!
+ adjEntry clockwiseFacePred() const { return cyclicSucc()->m_twin; }
+ //! Returns the counter-clockwise successor in face.
+ adjEntry counterClockwiseFaceSucc() const { return m_twin->cyclicSucc(); }
+ //! Returns the counter-clockwise predecessor in face.
+ adjEntry counterClockwiseFacePred() const { return cyclicPred()->m_twin; }
+
+ // default is traversing faces in clockwise order
+ //! Returns the cyclic successor in face.
+ adjEntry faceCycleSucc() const { return clockwiseFaceSucc(); }
+ //! Returns the cyclic predecessor in face.
+ adjEntry faceCyclePred() const { return clockwiseFacePred(); }
+
+
+ //! Returns the successor in the adjacency list.
+ adjEntry succ() const { return (adjEntry)m_next; }
+ //! Returns the predecessor in the adjacency list.
+ adjEntry pred() const { return (adjEntry)m_prev; }
+
+ //! Returns the cyclic successor in the adjacency list.
+ adjEntry cyclicSucc() const;
+ //! Returns the cyclic predecessor in the adjacency list.
+ adjEntry cyclicPred() const;
+
+#ifdef OGDF_DEBUG
+ const Graph *graphOf() const;
+#endif
+
+ OGDF_NEW_DELETE
+}; // class AdjElement
+
+
+//! Class for the representation of nodes.
+class OGDF_EXPORT NodeElement : private GraphElement {
+ friend class Graph;
+ friend class GraphList<NodeElement>;
+
+ GraphList<AdjElement> m_adjEdges; //!< The adjacency list of the node.
+ int m_indeg; //!< The indegree of the node.
+ int m_outdeg; //!< The outdegree of the node.
+ int m_id; //!< The (unique) index of the node.
+
+#ifdef OGDF_DEBUG
+ // we store the graph containing this node for debugging purposes
+ const Graph *m_pGraph; //!< The graph containg this node (debug only).
+#endif
+
+
+ // construction
+#ifdef OGDF_DEBUG
+ //! Constructs a node element with index \a id.
+ /**
+ * \remarks The parameter \a pGraph is only passed in a debug build.
+ * It is used, e.g., by NodeArray for checking if a node belongs to
+ * the correct graph.
+ */
+ NodeElement(const Graph *pGraph, int id) :
+ m_indeg(0), m_outdeg(0), m_id(id), m_pGraph(pGraph) { }
+#else
+ NodeElement(int id) : m_indeg(0), m_outdeg(0), m_id(id) { }
+#endif
+
+
+public:
+ //! Returns the (unique) node index.
+ int index() const { return m_id; }
+
+ //! Returns the indegree of the node.
+ int indeg() const { return m_indeg; }
+ //! Returns the outdegree of the node.
+ int outdeg() const { return m_outdeg; }
+ //! Returns the degree of the node (indegree + outdegree).
+ int degree() const { return m_indeg + m_outdeg; }
+
+ //! Returns the first entry in the adjaceny list.
+ adjEntry firstAdj() const { return m_adjEdges.begin(); }
+ //! Returns the last entry in the adjacency list.
+ adjEntry lastAdj () const { return m_adjEdges.rbegin(); }
+
+ //! Returns the successor in the list of all nodes.
+ node succ() const { return (node)m_next; }
+ //! Returns the predecessor in the list of all nodes.
+ node pred() const { return (node)m_prev; }
+
+#ifdef OGDF_DEBUG
+ //! Returns the graph containing this node (debug only).
+ const Graph *graphOf() const { return m_pGraph; }
+#endif
+
+ OGDF_NEW_DELETE
+}; // class NodeElement
+
+
+inline adjEntry AdjElement::cyclicSucc() const
+{
+ return (m_next) ? (adjEntry)m_next : m_node->firstAdj();
+}
+
+inline adjEntry AdjElement::cyclicPred() const
+{
+ return (m_prev) ? (adjEntry)m_prev : m_node->lastAdj();
+}
+
+inline bool test_forall_adj_edges(adjEntry &adj, edge &e)
+{
+ if (adj) { e = adj->theEdge(); return true; }
+ else return false;
+}
+
+
+
+//! Class for the representation of edges.
+class OGDF_EXPORT EdgeElement : private GraphElement {
+ friend class Graph;
+ friend class GraphList<EdgeElement>;
+
+ node m_src; //!< The source node of the edge.
+ node m_tgt; //!< The target node of the edge.
+ AdjElement *m_adjSrc; //!< Corresponding adjacancy entry at source node.
+ AdjElement *m_adjTgt; //!< Corresponding adjacancy entry at target node.
+ int m_id; // The (unique) index of the node.
+
+ //! Constructs an edge element (\a src,\a tgt).
+ /**
+ * @param src is the source node of the edge.
+ * @param tgt is the target node of the edge.
+ * @param adjSrc is the corresponding adjacency entry at source node.
+ * @param adjTgt is the corresponding adjacency entry at target node.
+ * @param id is the index of the edge.
+ */
+ EdgeElement(node src, node tgt, AdjElement *adjSrc, AdjElement *adjTgt, int id) :
+ m_src(src), m_tgt(tgt), m_adjSrc(adjSrc), m_adjTgt(adjTgt), m_id(id) { }
+
+ //! Constructs an edge element (\a src,\a tgt).
+ /**
+ * @param src is the source node of the edge.
+ * @param tgt is the target node of the edge.
+ * @param id is the index of the edge.
+ */
+ EdgeElement(node src, node tgt, int id) :
+ m_src(src), m_tgt(tgt), m_id(id) { }
+
+public:
+ //! Returns the index of the edge.
+ int index() const { return m_id; }
+ //! Returns the source node of the edge.
+ node source() const { return m_src; }
+ //! Returns the target node of the edge.
+ node target() const { return m_tgt; }
+
+ //! Returns the corresponding adjacancy entry at source node.
+ adjEntry adjSource() const { return m_adjSrc; }
+ //! Returns the corresponding adjacancy entry at target node.
+ adjEntry adjTarget() const { return m_adjTgt; }
+
+ //! Returns the adjacent node different from \a v.
+ node opposite(node v) const { return (v == m_src) ? m_tgt : m_src; }
+ // Returns true iff the edge is a self-loop (source node = target node).
+ bool isSelfLoop() const { return m_src == m_tgt; }
+
+ //! Returns the successor in the list of all edges.
+ edge succ() const { return (edge)m_next; }
+ //! Returns the predecessor in the list of all edges.
+ edge pred() const { return (edge)m_prev; }
+
+#ifdef OGDF_DEBUG
+ //! Returns the graph containing this node (debug only).
+ const Graph *graphOf() const { return m_src->graphOf(); }
+#endif
+
+ //! Returns true iff \a v is incident to the edge.
+ bool isIncident(node v) const { return v == m_src || v == m_tgt; }
+
+ //! Returns the common node of the edge and \a e. Returns NULL if the two edges are not adjacent.
+ node commonNode(edge e) const { return (m_src==e->m_src || m_src==e->m_tgt) ? m_src : ((m_tgt==e->m_src || m_tgt==e->m_tgt) ? m_tgt: 0); }
+
+ OGDF_NEW_DELETE
+}; // class EdgeElement
+
+
+#ifdef OGDF_DEBUG
+inline const Graph *AdjElement::graphOf() const {
+ return m_node->graphOf();
+}
+#endif
+
+
+template<>inline bool doDestruction<node>(const node *) { return false; }
+template<>inline bool doDestruction<edge>(const edge *) { return false; }
+template<>inline bool doDestruction<adjEntry>(const adjEntry *) { return false; }
+
+class NodeArrayBase;
+class EdgeArrayBase;
+class AdjEntryArrayBase;
+template<class T> class NodeArray;
+template<class T> class EdgeArray;
+template<class T> class AdjEntryArray;
+class OGDF_EXPORT GraphObserver;
+
+
+//---------------------------------------------------------
+// iteration macros
+//---------------------------------------------------------
+
+//! Iteration over all nodes \a v of graph \a G.
+#define forall_nodes(v,G) for((v)=(G).firstNode(); (v); (v)=(v)->succ())
+//! Iteration over all nodes \a v of graph \a G in reverse order.
+#define forall_rev_nodes(v,G) for((v)=(G).lastNode(); (v); (v)=(v)->pred())
+
+//! Iteration over all edges \a e of graph \a G.
+#define forall_edges(e,G) for((e)=(G).firstEdge(); (e); (e)=(e)->succ())
+//! Iteration over all edges \a e of graph \a G in reverse order.
+#define forall_rev_edges(e,G) for((e)=(G).lastEdge(); (e); (e)=(e)->pred())
+
+//! Iteration over all adjacency list entries \a adj of node \a v.
+#define forall_adj(adj,v) for((adj)=(v)->firstAdj(); (adj); (adj)=(adj)->succ())
+//! Iteration over all adjacency list entries \a adj of node \a v in reverse order.
+#define forall_rev_adj(adj,v) for((adj)=(v)->lastAdj(); (adj); (adj)=(adj)->pred())
+
+//! Iteration over all adjacent edges \a e of node \a v.
+#define forall_adj_edges(e,v)\
+for(ogdf::adjEntry ogdf_loop_var=(v)->firstAdj();\
+ ogdf::test_forall_adj_edges(ogdf_loop_var,(e));\
+ ogdf_loop_var=ogdf_loop_var->succ())
+
+
+//! Data type for general directed graphs (adjacency list representation).
+/**
+ * <H3>Iteration</H3>
+ * Besides the usage of iteration macros defined in Graph_d.h, the following
+ * code is recommended for further iteration tasks.
+ * <ul>
+ * <li> Iteration over all outgoing edges \a e of node \a v:
+ * \code
+ * forall_adj_edges(e,v)
+ * if(e->source() != v) continue;
+ * \endcode
+ *
+ * <li> Iteration over all ingoing edges \a e of node \a v:
+ * \code
+ * forall_adj_edges(e,v)
+ * if(e->target() != v) continue;
+ * \endcode
+ *
+ * <li> Iteration over all nodes \a x reachable by an outgoing edge \a e
+ * of node \a v (without self-loops):
+ * \code
+ * forall_adj_edges(e,v)
+ * if ((x = e->target()) == v) continue;
+ * \endcode
+ *
+ * <li> Iteration over all nodes \a x reachable by an outgoing edge \a e
+ * of node \a v (with self-loops):
+ * \code
+ * forall_adj_edges(e,v) {
+ * if (e->source() != v) continue;
+ * x = e->target();
+ * }
+ * \endcode
+ *
+ * <li> Iteration over all nodes \a x reachable by an ingoing edge \a e
+ * of node \a v (without self-loops):
+ * \code
+ * forall_adj_edges(e,v)
+ * if ((x = e->source()) == v) continue;
+ * \endcode
+ *
+ * <li> Iteration over all nodes \a x reachable by an ingoing edge \a e
+ * of node \a v (with self-loops):
+ * \code
+ * forall_adj_edges(e,v) {
+ * if (e->target() != v) continue;
+ * x = e->source();
+ * }
+ * \endcode
+ * </ul>
+ */
+
+class OGDF_EXPORT Graph
+{
+ GraphList<NodeElement> m_nodes; //!< The list of all nodes.
+ GraphList<EdgeElement> m_edges; //!< The list of all edges.
+ int m_nNodes; //!< The number of nodes in the graph.
+ int m_nEdges; //!< The number of edges in the graph.
+
+ int m_nodeIdCount; //!< The Index that will be assigned to the next created node.
+ int m_edgeIdCount; //!< The Index that will be assigned to the next created edge.
+
+ int m_nodeArrayTableSize; //!< The current table size of node arrays associated with this graph.
+ int m_edgeArrayTableSize; //!< The current table size of edge arrays associated with this graph.
+
+ mutable ListPure<NodeArrayBase*> m_regNodeArrays; //!< The registered node arrays.
+ mutable ListPure<EdgeArrayBase*> m_regEdgeArrays; //!< The registered edge arrays.
+ mutable ListPure<AdjEntryArrayBase*> m_regAdjArrays; //!< The registered adjEntry arrays.
+ mutable ListPure<GraphObserver*> m_regStructures; //!< The registered graph structures.
+
+ GraphList<EdgeElement> m_hiddenEdges; //!< The list of hidden edges.
+
+public:
+ //
+ // enumerations
+ //
+
+ //! The type of edges (only used in derived classes).
+ enum EdgeType {
+ association = 0,
+ generalization = 1,
+ dependency = 2
+ }; // should be more flexible, standard, dissect, expand
+
+ //! The type of nodes.
+ enum NodeType {
+ vertex,
+ dummy,
+ generalizationMerger,
+ generalizationExpander,
+ highDegreeExpander,
+ lowDegreeExpander,
+ associationClass
+ };
+
+
+ //! Constructs an empty graph.
+ Graph();
+
+ //! Constructs a graph that is a copy of \a G.
+ /**
+ * The constructor assures that the adjacency lists of nodes in the
+ * constructed graph are in the same order as the adjacency lists in \a G.
+ * This is in particular important when dealing with embedded graphs.
+ *
+ * @param G is the graph that will be copied.
+ */
+ Graph(const Graph &G);
+
+ //! Destructor.
+ virtual ~Graph();
+
+
+ /**
+ * @name Access methods
+ */
+ //@{
+
+ //! Returns true iff the graph is empty, i.e., contains no nodes.
+ bool empty() const { return m_nNodes == 0; }
+
+ //! Returns the number of nodes in the graph.
+ int numberOfNodes() const { return m_nNodes; }
+
+ //! Returns the number of edges in the graph.
+ int numberOfEdges() const { return m_nEdges; }
+
+ //! Returns the largest used node index.
+ int maxNodeIndex() const { return m_nodeIdCount-1; }
+ //! Returns the largest used edge index.
+ int maxEdgeIndex() const { return m_edgeIdCount-1; }
+ //! Returns the largest used adjEntry index.
+ int maxAdjEntryIndex() const { return (m_edgeIdCount<<1)-1; }
+
+ //! Returns the table size of node arrays associated with this graph.
+ int nodeArrayTableSize() const { return m_nodeArrayTableSize; }
+ //! Returns the table size of edge arrays associated with this graph.
+ int edgeArrayTableSize() const { return m_edgeArrayTableSize; }
+ //! Returns the table size of adjEntry arrays associated with this graph.
+ int adjEntryArrayTableSize() const { return m_edgeArrayTableSize << 1; }
+
+ //! Returns the first node in the list of all nodes.
+ node firstNode() const { return m_nodes.begin (); }
+ //! Returns the last node in the list of all nodes.
+ node lastNode () const { return m_nodes.rbegin(); }
+
+ //! Returns the first edge in the list of all edges.
+ edge firstEdge() const { return m_edges.begin (); }
+ //! Returns the last edge in the list of all edges.
+ edge lastEdge () const { return m_edges.rbegin(); }
+
+ //! Returns a randomly chosen node.
+ node chooseNode() const;
+ //! Returns a randomly chosen edge.
+ edge chooseEdge() const;
+
+ //! Returns a list with all nodes of the graph.
+ /**
+ * @tparam NODELIST is the type of node list, which is returned.
+ * @param nodes is assigned the list of all nodes.
+ */
+ template<class NODELIST>
+ void allNodes(NODELIST &nodes) const {
+ nodes.clear();
+ for (node v = m_nodes.begin(); v; v = v->succ())
+ nodes.pushBack(v);
+ }
+
+ //! Returns a list with all edges of the graph.
+ /**
+ * @tparam EDGELIST is the type of edge list, which is returned.
+ * @param edges is assigned the list of all edges.
+ */
+ template<class EDGELIST>
+ void allEdges(EDGELIST &edges) const {
+ edges.clear();
+ for (edge e = m_edges.begin(); e; e = e->succ())
+ edges.pushBack(e);
+ }
+
+ //! Returns a list with all edges adjacent to node \a v.
+ /**
+ * @tparam EDGELIST is the type of edge list, which is returned.
+ * @param v is the node whose incident edges are queried.
+ * @param edges is assigned the list of all edges incident to \a v
+ * (including incoming and outcoming edges).
+ */
+ template<class EDGELIST>
+ void adjEdges(node v, EDGELIST &edges) const {
+ edges.clear();
+ edge e;
+ forall_adj_edges(e,v)
+ edges.pushBack(e);
+ }
+
+ //! Returns a list with all entries in the adjacency list of node \a v.
+ /**
+ * @tparam ADJLIST is the type of adjacency entry list, which is returned.
+ * @param v is the node whose adjacency entries are queried.
+ * @param entries is assigned the list of all adjacency entries in the adjacency list of \a v.
+ */
+ template<class ADJLIST>
+ void adjEntries(node v, ADJLIST &entries) const {
+ entries.clear();
+ adjEntry adj;
+ forall_adj(adj,v)
+ entries.pushBack(adj);
+ }
+
+ //! Returns a list with all incoming edges of node \a v.
+ /**
+ * @tparam EDGELIST is the type of edge list, which is returned.
+ * @param v is the node whose incident edges are queried.
+ * @param edges is assigned the list of all incoming edges incident to \a v.
+ */
+ template<class EDGELIST>
+ void inEdges(node v, EDGELIST &edges) const {
+ edges.clear();
+ edge e;
+ forall_adj_edges(e,v)
+ if (e->target() == v) edges.pushBack(e);
+ }
+
+ //! Returns a list with all outgoing edges of node \a v.
+ /**
+ * @tparam EDGELIST is the type of edge list, which is returned.
+ * @param v is the node whose incident edges are queried.
+ * @param edges is assigned the list of all outgoing edges incident to \a v.
+ */
+ template<class EDGELIST>
+ void outEdges(node v, EDGELIST &edges) const {
+ edges.clear();
+ edge e;
+ forall_adj_edges(e,v)
+ if (e->source() == v) edges.pushBack(e);
+ }
+
+
+ //@}
+ /**
+ * @name Creation of new nodes and edges
+ */
+ //@{
+
+ //! Creates a new node and returns it.
+ node newNode();
+
+ //! Creates a new node with predefined index and returns it.
+ /**
+ * \pre \a index is currently not the index of any other node in the graph.
+ *
+ * \attention Passing a node index that is already in use results in an inconsistent
+ * data structure. Only use this method if you know what you're doing!
+ *
+ * @param index is the index that will be assigned to the newly created node.
+ * @return the newly created node.
+ */
+ node newNode(int index);
+
+ //! Creates a new edge (\a v,\a w) and returns it.
+ /**
+ * @param v is the source node of the newly created edge.
+ * @param w is the target node of the newly created edge.
+ * @return the newly created edge.
+ */
+ edge newEdge(node v, node w);
+
+ //! Creates a new edge (\a v,\a w) with predefined index and returns it.
+ /**
+ * \pre \a index is currently not the index of any other edge in the graph.
+ *
+ * \attention Passing an edge index that is already in use results in an inconsistent
+ * data structure. Only use this method if you know what you're doing!
+ *
+ * @param v is the source node of the newly created edge.
+ * @param w is the target node of the newly created edge.
+ * @param index is the index that will be assigned to the newly created edge.
+ * @return the newly created edge.
+ */
+ edge newEdge(node v, node w, int index);
+
+ //! Creates a new edge at predefined positions in the adjacency lists.
+ /**
+ * Let \a v be the node whose adjacency list contains \a adjSrc,
+ * and \a w the node whose adjacency list contains \a adjTgt. Then,
+ * the created edge is (\a v,\a w).
+ *
+ * @param adjSrc is the adjacency entry after which the new edge is inserted
+ * in the adjacency list of \a v.
+ * @param adjTgt is the adjacency entry after which the new edge is inserted
+ * in the adjacency list of \a w.
+ * @param dir specifies if the edge is inserted before or after the given
+ * adjacency entries.
+ * @return the newly created edge.
+ */
+ edge newEdge(adjEntry adjSrc, adjEntry adjTgt, Direction dir = ogdf::after);
+
+ //! Creates a new edge at predefined positions in the adjacency lists.
+ /**
+ * Let \a w be the node whose adjacency list contains \a adjTgt. Then,
+ * the created edge is (\a v,\a w).
+ *
+ * @param v is the source node of the new edge; the edge is added at the end
+ * of the adjacency list of \a v.
+ * @param adjTgt is the adjacency entry after which the new edge is inserted
+ * in the adjacency list of \a w.
+ * @return the newly created edge.
+ */
+ edge newEdge(node v, adjEntry adjTgt);
+
+ //! Creates a new edge at predefined positions in the adjacency lists.
+ /**
+ * Let \a v be the node whose adjacency list contains \a adjSrc. Then,
+ * the created edge is (\a v,\a w).
+ *
+ * @param adjSrc is the adjacency entry after which the new edge is inserted
+ * in the adjacency list of \a v.
+ * @param w is the source node of the new edge; the edge is added at the end
+ * of the adjacency list of \a w.
+ * @return the newly created edge.
+ */
+ edge newEdge(adjEntry adjSrc, node w);
+
+
+ //@}
+ /**
+ * @name Removing nodes and edges
+ */
+ //@{
+
+ //! Removes node \a v and all incident edges from the graph.
+ /**
+ * @param v is the node that will be deleted.
+ */
+ void delNode(node v);
+
+ //! Removes edge \a e from the graph.
+ /**
+ * @param e is the egde that will be deleted.
+ */
+ void delEdge(edge e);
+
+ //! Removes all nodes and all edges from the graph.
+ void clear();
+
+
+ //@}
+ /**
+ * @name Hiding edges
+ * These methods are used for temporarily hiding edges. Edges are removed from the
+ * list of all edges and their corresponding adfjacency entries from the repsective
+ * adjacency lists, but the edge objects themselves are not destroyed; hiddenedges
+ * can later be reactivated with restoreEdge().
+ */
+ //@{
+
+ //! Hides the edge \a e.
+ /**
+ * The edge \a e is removed from the list of all edges and adjacency lists of nodes, but
+ * not deleted; \a e can be restored by calling restoreEdge(e).
+ *
+ * \attention If an edge is hidden, its source and target node may not be deleted!
+ *
+ * @param e is the edge that will be hidden.
+ */
+ void hideEdge(edge e);
+
+ //! Restores a hidden edge \a e.
+ /**
+ * \pre \a e is currently hidden and its source and target have not been removed!
+ *
+ * @param e is the hidden edge that will be restored.
+ */
+ void restoreEdge(edge e);
+
+ //! Restores all hidden edges.
+ void restoreAllEdges();
+
+
+ /**
+ * @name Advanced modification methods
+ */
+ //@{
+
+ //! Splits edge \a e into two edges introducing a new node.
+ /**
+ * Let \a e=(\a v,\a w). Then, the resulting two edges are \a e=(\a v,\a u)
+ * and \a e'=(\a u,\a w), where \a u is a new node.
+ *
+ * \note The edge \a e is modified by this operation.
+ *
+ * @param e is the edge to be split.
+ * @return The edge \a e'.
+ */
+ virtual edge split(edge e);
+
+ //! Undoes a split operation.
+ /**
+ * Removes node \a u by joining the two edges adjacent to \a u. The
+ * outgoing edge of \a u is removed and the incoming edge \a e is reused
+ *
+ * \pre \a u has exactly one incoming and one outgoing edge, and
+ * none of them is a self-loop.
+ *
+ * @param u is the node to be unsplit.
+ * @return The edge \a e.
+ */
+ void unsplit(node u);
+
+ //! Undoes a split operation.
+ /**
+ * For two edges \a eIn = (\a x,\a u) and \a eOut = (\a u,\a y), removes
+ * node \a u by joining \a eIn and \a eOut. Edge \a eOut is removed and
+ * \a eIn is reused.
+ *
+ * \pre \a eIn and \a eOut are the only edges incident with \a u and
+ * none of them is a self-loop.
+ *
+ * @param eIn is the (only) incoming edge of \a u.
+ * @param eOut is the (only) outgoing edge of \a u.
+ */
+ virtual void unsplit(edge eIn, edge eOut);
+
+ //! Splits a node while preserving the order of adjacency entries.
+ /**
+ * This method splits a node \a v into two nodes \a vl and \a vr. Node
+ * \a vl receives all adjacent edges of \a v from \a adjStartLeft until
+ * the edge preceding \a adjStartRight, and \a vr the remaining nodes
+ * (thus \a adjStartRight is the first edge that goes to \a vr). The
+ * order of adjacency entries is preserved. Additionally, a new edge
+ * (\a vl,\a vr) is created, such that this edge is inserted before
+ * \a adjStartLeft and \a adjStartRight in the the adjacency lists of
+ * \a vl and \a vr.
+ *
+ * Node \a v is modified to become node \a vl, and node \a vr is returned.
+ * This method is useful when modifying combinatorial embeddings.
+ *
+ * @param adjStartLeft is the first entry that goes to the left node.
+ * @param adjStartRight is the first entry that goes to the right node.
+ * @return the newly created node.
+ */
+ node splitNode(adjEntry adjStartLeft, adjEntry adjStartRight);
+
+ //! Contracts edge \a e while preserving the order of adjacency entries.
+ /**
+ * @param e is the edge to be contracted.
+ * @return the endpoint of \a e to which all edges have been moved.
+ */
+ node contract(edge e);
+
+ //! Moves edge \a e to a different adjacency list.
+ /**
+ * The source adjacency entry of \a e is moved to the adjacency list containing
+ * \a adjSrc and is inserted before or after \a adjSrc, and its target adjacency entry
+ * to the adjacency list containing \a adjTgt and is inserted before or after
+ * \a adjTgt; e is afterwards an edge from owner(\a adjSrc) to owner(\a adjTgt).
+ *
+ * @param e is the edge to be moved.
+ * @param adjSrc is the adjaceny entry before or after which the source adjacency entry
+ * of \a e will be inserted.
+ * @param dirSrc specifies if the source adjacency entry of \a e will be inserted before or after \a adjSrc.
+ * @param adjTgt is the adjaceny entry before or after which the target adjacency entry
+ * of \a e will be inserted.
+ * @param dirTgt specifies if the target adjacency entry of \a e will be inserted before or after \a adjTgt.
+ */
+ void move(edge e, adjEntry adjSrc, Direction dirSrc,
+ adjEntry adjTgt, Direction dirTgt);
+
+ //! Moves the target node of edge \a e to node \a w.
+ /**
+ * If \a e=(\a v,\a u) before, then \a e=(\a v,\a w) afterwards.
+ *
+ * @param e is the edge whose target node is moved.
+ * @param w is the new target node of \a e.
+ */
+ void moveTarget(edge e, node w);
+
+ //! Moves the target node of edge \a e to a specific position in an adjacency list.
+ /**
+ * Let \a w be the node containing \a adjTgt. If \a e=(\a v,\a u) before, then \a e=(\a v,\a w) afterwards.
+ * Inserts the adjacency entry before or after \a adjTgt according to \a dir.
+ *
+ * @param e is the edge whose target node is moved.
+ * @param adjTgt is the adjacency entry before or after which the target adjacency entry of \a e is inserted.
+ * @param dir specifies if the target adjacency entry of \a e is inserted before or after \a adjTgt.
+ */
+ void moveTarget(edge e, adjEntry adjTgt, Direction dir);
+
+ //! Moves the source node of edge \a e to node \a w.
+ /**
+ * If \a e=(\a v,\a u) before, then \a e=(\a w,\a u) afterwards.
+ *
+ * @param e is the edge whose source node is moved.
+ * @param w is the new source node of \a e.
+ */
+ void moveSource(edge e, node w);
+
+ //! Moves the source node of edge \a e to a specific position in an adjacency list.
+ /**
+ * Let \a w be the node containing \a adjSrc. If \a e=(\a v,\a u) before, then \a e=(\a w,\a u) afterwards.
+ * Inserts the adjacency entry before or after \a adjSrc according to \a dir.
+ *
+ * @param e is the edge whose source node is moved.
+ * @param adjSrc is the adjacency entry before or after which the source adjacency entry of \a e is inserted.
+ * @param dir specifies if the source adjacency entry of \a e is inserted before or after \a adjSrc.
+ */
+ void moveSource(edge e, adjEntry adjSrc, Direction dir);
+
+ //! Searches and returns an edge connecting nodes \a v and \a w.
+ /**
+ * @param v is the source node of the edge to be searched.
+ * @param w is the target node of the edge to be searched.
+ * @return an edge (\ v,\a w) if such an edge exists, 0 otherwise.
+ */
+ edge searchEdge (node v, node w) const;
+
+ //! Reverses the edge \a e, i.e., exchanges source and target node.
+ /**
+ * @param e is the edge to be reveresed.
+ */
+ void reverseEdge(edge e);
+
+ //! Reverses all edges in the graph.
+ void reverseAllEdges();
+
+ //! Collapses all nodes in the list \a nodes to the first node in the list.
+ /**
+ * Parallel edges are removed.
+ *
+ * @tparam NODELIST is the type of input node list.
+ * @param nodes is the list of nodes that will be collapsed. This list will be empty after the call.
+ */
+ template<class NODELIST>
+ void collaps(NODELIST &nodes){
+ node v = nodes.popFrontRet();
+ while (!nodes.empty())
+ {
+ node w = nodes.popFrontRet();
+ adjEntry adj = w->firstAdj();
+ while (adj !=0)
+ {
+ adjEntry succ = adj->succ();
+ edge e = adj->theEdge();
+ if (e->source() == v || e->target() == v)
+ delEdge(e);
+ else if (e->source() == w)
+ moveSource(e,v);
+ else
+ moveTarget(e,v);
+ adj = succ;
+ }
+ delNode(w);
+ }
+ }
+
+ //! Sorts the adjacency list of node \a v according to \a newOrder.
+ /**
+ * \pre \a newOrder contains exactly the adjacency entries of \a v!
+ *
+ * @tparam ADJ_ENTRY_LIST is the type of the input adjacency entry list.
+ * @param v is the node whose adjacency list will be sorted.
+ * @param newOrder is the list of adjacency entries of \a v in the new order.
+ */
+ template<class ADJ_ENTRY_LIST>
+ void sort(node v, const ADJ_ENTRY_LIST &newOrder) {
+#ifdef OGDF_DEBUG
+ typename ADJ_ENTRY_LIST::const_iterator it;
+ for(it = newOrder.begin(); it.valid() ; ++it) {
+ OGDF_ASSERT((*it)->theNode() == v);
+ }
+#endif
+ v->m_adjEdges.sort(newOrder);
+ }
+
+ //! Reverses the adjacency list of \a v.
+ /**
+ * @param v is the node whose adjacency list will be reveresed.
+ */
+ void reverseAdjEdges(node v) {
+ v->m_adjEdges.reverse();
+ }
+
+ //! Moves adjacency entry \a adjMove before or after \a adjPos.
+ /**
+ * \pre \a adjMove and adjAfter are distinct entries in the same adjacency list.
+ *
+ * @param adjMove is an entry in the adjacency list of a node in this graph.
+ * @param adjPos is an entry in the same adjacency list as \a adjMove.
+ * @param dir specifies if \a adjMove is moved before or after \a adjPos.
+ */
+ void moveAdj(adjEntry adjMove, Direction dir, adjEntry adjPos) {
+ OGDF_ASSERT(adjMove->graphOf() == this && adjPos->graphOf() == this);
+ OGDF_ASSERT(adjMove != 0 && adjPos != 0);
+ GraphList<AdjElement> &adjList = adjMove->m_node->m_adjEdges;
+ adjList.move(adjMove, adjList, adjPos, dir);
+ }
+
+ //! Moves adjacency entry \a adjMove after \a adjAfter.
+ /**
+ * \pre \a adjMove and \a adjAfter are distinct entries in the same adjacency list.
+ *
+ * @param adjMove is an entry in the adjacency list of a node in this graph.
+ * @param adjAfter is an entry in the same adjacency list as \a adjMove.
+ */
+ void moveAdjAfter(adjEntry adjMove, adjEntry adjAfter) {
+ OGDF_ASSERT(adjMove->graphOf() == this && adjAfter->graphOf() == this);
+ OGDF_ASSERT(adjMove != 0 && adjAfter != 0);
+ adjMove->m_node->m_adjEdges.moveAfter(adjMove,adjAfter);
+ }
+
+ //! Moves adjacency entry \a adjMove before \a adjBefore.
+ /**
+ * \pre \a adjMove and \a adjBefore are distinct entries in the same adjacency list.
+ *
+ * @param adjMove is an entry in the adjacency list of a node in this graph.
+ * @param adjBefore is an entry in the same adjacency list as \a adjMove.
+ */
+ void moveAdjBefore(adjEntry adjMove, adjEntry adjBefore) {
+ OGDF_ASSERT(adjMove->graphOf() == this && adjBefore->graphOf() == this);
+ OGDF_ASSERT(adjMove != 0 && adjBefore != 0);
+ adjMove->m_node->m_adjEdges.moveBefore(adjMove,adjBefore);
+ }
+
+ //! Reverses all adjacency lists.
+ void reverseAdjEdges();
+
+ //! Exchanges two entries in an adjacency list.
+ /**
+ * \pre \a adj1 and \a adj2 must be belong to the same adjacency list.
+ *
+ * @param adj1 the first adjacency entry to be swapped.
+ * @param adj2 the secomd adjacency entry to be swapped.
+ */
+ void swapAdjEdges(adjEntry adj1, adjEntry adj2) {
+ OGDF_ASSERT(adj1->theNode() == adj2->theNode());
+ OGDF_ASSERT(adj1->graphOf() == this);
+
+ adj1->theNode()->m_adjEdges.swap(adj1,adj2);
+ }
+
+
+ //@}
+ /**
+ * @name Input and output
+ */
+ //@{
+
+ //! Reads a graph in GML format from file \a fileName.
+ /**
+ * @param fileName is the name of the input file.
+ * @return true if successful, false otherwise.
+ */
+ bool readGML(const char *fileName);
+
+ //! Reads a graph in GML format from input stream \a is.
+ /**
+ * @param is is the input file stream.
+ * @return true if successful, false otherwise.
+ */
+ bool readGML(istream &is);
+
+ //! Writes the graph in GML format to file \a fileName.
+ /**
+ * @param fileName is the name of the output file.
+ */
+ void writeGML(const char *fileName) const;
+
+ //! Writes the graph in GML format to output stream \a os.
+ /**
+ * @param os is the output file stream.
+ * @return true if successful, false otherwise.
+ */
+ void writeGML(ostream &os) const;
+
+ //! Reads a graph in LEDA format from file \a fileName.
+ /**
+ * @param fileName is the name of the input file.
+ * @return true if successful, false otherwise.
+ */
+ bool readLEDAGraph(const char *fileName);
+
+ //! Read a graph in LEDA format from input stream \a is.
+ /**
+ * @param is is the input file stream.
+ * @return true if successful, false otherwise.
+ */
+ bool readLEDAGraph(istream &is);
+
+
+ //@}
+ /**
+ * @name Miscellaneous
+ */
+ //@{
+
+ //! Returns the genus of the graph's embedding.
+ /**
+ * The genus of a graph is defined as follows. Let \f$G\f$ be a graph
+ * with \f$m\f$ edges, \f$n\f$ nodes, \f$c\f$ connected components, \f$nz\f$
+ * isolated vertices, and \f$fc\f$ face cycles. Then,
+ * \f[
+ * genus(G) = (m/2 + 2c - n -nz -fc)/2
+ * \f]
+ *
+ * @return the genus of the graph's current embedding; if this is 0, then the graph is planarly embedded.
+ */
+ int genus() const;
+
+ //! Returns true iff the graph represents a combinatorial embedding.
+ /**
+ * @return true if the current embedding (given by the adjacency lists) represents a combinatorial embedding, false otherwise.
+ */
+ bool representsCombEmbedding() const {
+ return (genus() == 0);
+ }
+
+ //! Checks the consistency of the data structure.
+ /**
+ * \remark This method is meant for debugging purposes only.
+ *
+ * @return true if everything is ok, false if the data structure is inconsistent.
+ */
+ bool consistencyCheck() const;
+
+
+ //@}
+ /**
+ * @name Registering arrays and observers
+ * These methods are used by various graph array types like NodeArray or EdgeArray.
+ * There should be no need to use them directly in user code.
+ */
+ //@{
+
+ //! Registers a node array.
+ /**
+ * \remark This method is automatically called by node arrays; it should not be called manually.
+ *
+ * @param pNodeArray is a pointer to the node array's base; this node array must be associated with this graph.
+ * @return an iterator pointing to the entry for the registered node array in the list of registered node arrays.
+ * This iterator is required for unregistering the node array again.
+ */
+ ListIterator<NodeArrayBase*> registerArray(NodeArrayBase *pNodeArray) const;
+
+ //! Registers an edge array.
+ /**
+ * \remark This method is automatically called by edge arrays; it should not be called manually.
+ *
+ * @param pEdgeArray is a pointer to the edge array's base; this edge array must be associated with this graph.
+ * @return an iterator pointing to the entry for the registered edge array in the list of registered edge arrays.
+ * This iterator is required for unregistering the edge array again.
+ */
+ ListIterator<EdgeArrayBase*> registerArray(EdgeArrayBase *pEdgeArray) const;
+
+ //! Registers an adjEntry array.
+ /**
+ * \remark This method is automatically called by adjacency entry arrays; it should not be called manually.
+ *
+ * @param pAdjArray is a pointer to the adjacency entry array's base; this adjacency entry array must be
+ * associated with this graph.
+ * @return an iterator pointing to the entry for the registered adjacency entry array in the list of registered
+ * adjacency entry arrays. This iterator is required for unregistering the adjacency entry array again.
+ */
+ ListIterator<AdjEntryArrayBase*> registerArray(AdjEntryArrayBase *pAdjArray) const;
+
+ //! Registers a graph observer (e.g. a ClusterGraph).
+ /**
+ * @param pStructure is a pointer to the graph observer that shall be registered; this graph observer must be
+ * associated with this graph.
+ * @return an iterator pointing to the entry for the registered graph observer in the list of registered
+ * graph observers. This iterator is required for unregistering the graph observer again.
+ */
+ ListIterator<GraphObserver*> registerStructure(GraphObserver *pStructure) const;
+
+ //! Unregisters a node array.
+ /**
+ * @param it is an iterator pointing to the entry in the list of registered node arrays for the node array to
+ * be unregistered.
+ */
+ void unregisterArray(ListIterator<NodeArrayBase*> it) const;
+
+ //! Unregisters an edge array.
+ /**
+ * @param it is an iterator pointing to the entry in the list of registered edge arrays for the edge array to
+ * be unregistered.
+ */
+ void unregisterArray(ListIterator<EdgeArrayBase*> it) const;
+
+ //! unregisters an adjEntry array.
+ /**
+ * @param it is an iterator pointing to the entry in the list of registered adjacency entry arrays for the
+ * adjacency entry array to be unregistered.
+ */
+ void unregisterArray(ListIterator<AdjEntryArrayBase*> it) const;
+
+ //! Unregisters a graph observer.
+ /**
+ * @param it is an iterator pointing to the entry in the list of registered graph observers for the graph
+ * observer to be unregistered.
+ */
+ void unregisterStructure(ListIterator<GraphObserver*> it) const;
+
+
+ //! Resets the edge id count to \a maxId.
+ /**
+ * The next edge will get edge id \a maxId+1. Use this function with caution!
+ * It is provided as an efficient way to reduce the edge id count. The Graph class
+ * increments the edge id count whenever an edge is created; free edge ids resulting
+ * from removing edges are not reused (there is not something like a freelist).
+ *
+ * This function is , e.g., useful, when a lot of edges has been added and
+ * <em>all</em> these edges are removed again (without creating other new edges
+ * meanwile). Then, it is safe to reduce the edge id count to the value it had
+ * before, cf. the following code snippet:
+ * \code
+ * int oldIdCount = G.maxEdgeIndex();
+ * Create some edges
+ * ...
+ * Remove all these edges again
+ * G.resetEdgeIdCount(oldIdCount);
+ * \endcode
+ *
+ * Reducing the edge id count will reduce the memory consumption of edge arrays
+ * associated with the graph.
+ *
+ * \pre -1 \f$\leq\f$ \a maxId \f$\leq\f$ maximal edge id in the graph.
+ *
+ * @param maxId is an upper bound of the edge ids in the graph.
+ */
+ void resetEdgeIdCount(int maxId);
+
+
+ //@}
+ /**
+ * @name Operators
+ */
+ //@{
+ //! Assignment operator.
+ /**
+ * The assignment operature assures that the adjacency lists of nodes in the
+ * constructed graph are in the same order as the adjacency lists in \a G.
+ * This is in particular important when dealing with embedded graphs.
+ *
+ * @param G is the graph to be copied.
+ * @return this graph.
+ */
+ Graph &operator=(const Graph &G);
+
+ OGDF_MALLOC_NEW_DELETE
+
+ //@}
+
+public:
+
+ //! Returns the smallest power of 2 which is >= 2^\a start and > \a idCount.
+ static int nextPower2(int start, int idCount);
+
+
+protected:
+ void construct(const Graph &G, NodeArray<node> &mapNode,
+ EdgeArray<edge> &mapEdge);
+
+ void assign(const Graph &G, NodeArray<node> &mapNode,
+ EdgeArray<edge> &mapEdge);
+
+ //! Constructs a copy of the subgraph of \a G induced by \a nodes.
+ /**
+ * This method preserves the order in the adjacency lists, i.e., if
+ * \a G is embedded, its embedding induces the embedding of the copy.
+ */
+ void constructInitByNodes(
+ const Graph &G,
+ const List<node> &nodes,
+ NodeArray<node> &mapNode,
+ EdgeArray<edge> &mapEdge);
+
+ void constructInitByActiveNodes(
+ const List<node> &nodes,
+ const NodeArray<bool> &activeNodes,
+ NodeArray<node> &mapNode,
+ EdgeArray<edge> &mapEdge);
+
+private:
+ void copy(const Graph &G, NodeArray<node> &mapNode,
+ EdgeArray<edge> &mapEdge);
+ void copy(const Graph &G);
+
+ edge createEdgeElement(node v, node w, adjEntry adjSrc, adjEntry adjTgt);
+ node pureNewNode();
+
+ // moves adjacency entry to node w
+ void moveAdj(adjEntry adj, node w);
+
+ void reinitArrays();
+ void reinitStructures();
+ void resetAdjEntryIndex(int newIndex, int oldIndex);
+
+ bool readToEndOfLine(istream &is);
+}; // class Graph
+
+
+
+//! Bucket function using the index of an edge's source node as bucket.
+class OGDF_EXPORT BucketSourceIndex : public BucketFunc<edge> {
+public:
+ //! Returns source index of \a e.
+ int getBucket(const edge &e) { return e->source()->index(); }
+};
+
+//! Bucket function using the index of an edge's target node as bucket.
+class OGDF_EXPORT BucketTargetIndex : public BucketFunc<edge> {
+public:
+ //! Returns target index of \a e.
+ int getBucket(const edge &e) { return e->target()->index(); }
+};
+
+
+} //namespace
+
+#endif
+
diff --git a/ogdf/basic/HashArray.h b/ogdf/basic/HashArray.h
new file mode 100644
index 0000000..794069b
--- /dev/null
+++ b/ogdf/basic/HashArray.h
@@ -0,0 +1,179 @@
+/*
+ * $Revision: 2615 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-16 14:23:36 +0200 (Mo, 16. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration and implementation of HashArray class.
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_HASH_ARRAY_H
+#define OGDF_HASH_ARRAY_H
+
+
+#include "Hashing.h"
+
+
+namespace ogdf {
+
+
+//! Indexed arrays using hashing for element access.
+/**
+ * @tparam I is the index type.
+ * @tparam E is the element type.
+ * @tparam H is the hash function type. Optional; its default uses the class DefHashFunc.
+ *
+ * A hashing array can be used like a usual array but has a general
+ * index type.
+ *
+ * The hashing array is only defined for a subset <I>I<SUB>def</SUB></I> of the
+ * index set (set of all elements of the index type). At construction, this set
+ * is empty. Whenever an index is assigned an element, this index is added
+ * to <I>I<SUB>def</SUB></I>. There are also method for testing if an index
+ * is defined (is in <I>I<SUB>def</SUB></I>).
+ *
+ * <H3>Example</H3>
+ * The following code snippet demonstrates how to use a hashing array. First,
+ * the example inserts elements into a hashing array simulating a tiny
+ * German–English dictionary, then it prints some elements via array
+ * access, and finally it iterates over all defined indices and prints the
+ * dictionary entries. We use a the const reference \a Hc, since we want to
+ * avoid that array access for undefined indices creates these elements.
+ *
+ * \code
+ * HashArray<String,String> H("[undefined]");
+ * const HashArray<String,String> &Hc = H;
+ *
+ * H["Hund"] = "dog";
+ * H["Katze"] = "cat";
+ * H["Maus"] = "mouse";
+ *
+ * cout << "Katze: " << Hc["Katze"] << endl;
+ * cout << "Hamster: " << Hc["Hamster"] << endl;
+ *
+ * cout << "\nAll elements:" << endl;
+ * HashConstIterator<String,String> it;
+ * for(it = Hc.begin(); it.valid(); ++it)
+ * cout << it.key() << " -> " << it.info() << endl;
+ * \endcode
+ *
+ * The produced output is as follows:
+ * \code
+ * Katze: cat
+ * Hamster: [undefined]
+ *
+ * All elements:
+ * Hund -> dog
+ * Maus -> mouse
+ * Katze -> cat
+ * \endcode
+ */
+template<class I, class E, class H = DefHashFunc<I> >
+class HashArray : private Hashing<I,E,H>
+{
+ E m_defaultValue; //! The default value for elements.
+
+public:
+ //! The type of const-iterators for hash arrays.
+ typedef HashConstIterator<I,E,H> const_iterator;
+
+ //! Creates a hashing array; the default value is the default value of the element type.
+ HashArray() : Hashing<I,E,H>() { }
+
+ //! Creates a hashing array with default value \a defaultValue.
+ HashArray(const E &defaultValue, const H &hashFunc = H())
+ : Hashing<I,E,H>(256, hashFunc), m_defaultValue(defaultValue) { }
+
+ //! Copy constructor.
+ HashArray(const HashArray<I,E,H> &A) : Hashing<I,E,H>(A), m_defaultValue(A.m_defaultValue) { }
+
+ //! Returns an iterator to the first element in the list of all elements.
+ HashConstIterator<I,E,H> begin() const { return Hashing<I,E,H>::begin(); }
+
+ //! Returns the number of defined indices (= number of elements in hash table).
+ int size() const { return Hashing<I,E,H>::size(); }
+
+ //! Returns if any indices are defined (= if the hash table is empty)
+ int empty() const { return Hashing<I,E,H>::empty(); }
+
+
+ //! Returns the element with index \a i.
+ const E &operator[](const I &i) const {
+ HashElement<I,E> *pElement = Hashing<I,E,H>::lookup(i);
+ if (pElement) return pElement->info();
+ else return m_defaultValue;
+ }
+
+ //! Returns a reference to the element with index \a i.
+ E &operator[](const I &i) {
+ HashElement<I,E> *pElement = Hashing<I,E,H>::lookup(i);
+ if (!pElement) pElement = Hashing<I,E,H>::fastInsert(i,m_defaultValue);
+ return pElement->info();
+ }
+
+ //! Returns true iff index \a i is defined.
+ bool isDefined(const I &i) const {
+ return Hashing<I,E,H>::member(i);
+ }
+
+ //! Undefines index \a i.
+ void undefine(const I &i) {
+ Hashing<I,E,H>::del(i);
+ }
+
+ //! Assignment operator.
+ HashArray<I,E,H> &operator=(const HashArray<I,E,H> &A) {
+ m_defaultValue = A.m_defaultValue;
+ Hashing<I,E,H>::operator =(A);
+ return *this;
+ }
+
+ //! Undefines all indices.
+ void clear() { Hashing<I,E,H>::clear(); }
+};
+
+
+} // end namespace ogdf
+
+#endif
diff --git a/ogdf/basic/Hashing.cpp b/ogdf/basic/Hashing.cpp
new file mode 100644
index 0000000..ab70a9d
--- /dev/null
+++ b/ogdf/basic/Hashing.cpp
@@ -0,0 +1,207 @@
+/*
+ * $Revision: 2549 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-04 23:09:19 +0200 (Mi, 04. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of Hashing (class HashingBase)
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+#include "Hashing.h"
+
+
+namespace ogdf {
+
+HashingBase::HashingBase(int minTableSize)
+{
+ m_count = 0;
+ init(m_minTableSize = minTableSize);
+}
+
+
+HashingBase::HashingBase(const HashingBase &H)
+{
+ copyAll(H);
+}
+
+
+HashingBase::~HashingBase()
+{
+ free(m_table);
+}
+
+
+void HashingBase::init(int tableSize)
+{
+ OGDF_ASSERT(tableSize >= m_minTableSize)
+
+ m_tableSize = tableSize;
+ m_hashMask = tableSize-1;
+ m_tableSizeHigh = tableSize << 1;
+ m_tableSizeLow = (tableSize > m_minTableSize) ? (tableSize >> 1) : -1;
+
+ m_table = (HashElementBase **)calloc(tableSize,sizeof(HashElementBase *));
+}
+
+
+void HashingBase::destroyAll()
+{
+ HashElementBase **pList = m_table, **pListStop = m_table+m_tableSize;
+
+ for(; pList != pListStop; ++pList) {
+ HashElementBase *pElement = *pList, *pNext;
+ for (; pElement; pElement = pNext) {
+ pNext = pElement->next();
+ destroy(pElement);
+ }
+ }
+}
+
+
+void HashingBase::copyAll(const HashingBase &H)
+{
+ m_count = 0;
+ init(H.m_tableSize);
+
+ HashElementBase **pList = H.m_table;
+ HashElementBase **pListStop = H.m_table+m_tableSize;
+
+ for(; pList != pListStop; ++pList) {
+ HashElementBase *pElement = *pList;
+ for (; pElement; pElement = pElement->next())
+ insert(H.copy(pElement));
+ }
+}
+
+
+void HashingBase::clear()
+{
+ destroyAll();
+ free(m_table);
+
+ m_count = 0;
+ init(m_minTableSize);
+}
+
+
+HashingBase &HashingBase::operator=(const HashingBase &H)
+{
+ destroyAll();
+ free(m_table);
+ copyAll(H);
+ return *this;
+}
+
+
+void HashingBase::resize(int newTableSize)
+{
+ HashElementBase **oldTable = m_table;
+ HashElementBase **oldTableStop = oldTable + m_tableSize;
+
+ init(newTableSize);
+
+ for(HashElementBase **pOldList = oldTable;
+ pOldList != oldTableStop; ++pOldList)
+ {
+ HashElementBase *pElement = *pOldList, *pNext;
+ for(; pElement; pElement = pNext) {
+ pNext = pElement->m_next;
+
+ HashElementBase **pList = m_table +
+ (pElement->m_hashValue & m_hashMask);
+ pElement->m_next = *pList;
+ *pList = pElement;
+ }
+ }
+
+ free(oldTable);
+}
+
+
+void HashingBase::insert(HashElementBase *pElement)
+{
+ if (++m_count == m_tableSizeHigh)
+ resize(m_tableSizeHigh);
+
+ HashElementBase **pList = m_table + (pElement->m_hashValue & m_hashMask);
+ pElement->m_next = *pList;
+ *pList = pElement;
+}
+
+
+void HashingBase::del(HashElementBase *pElement)
+{
+ HashElementBase **pList = m_table + (pElement->m_hashValue & m_hashMask);
+ HashElementBase *pPrev = *pList;
+
+ if (pPrev == pElement) {
+ *pList = pElement->m_next;
+
+ } else {
+ while (pPrev->m_next != pElement) pPrev = pPrev->m_next;
+ pPrev->m_next = pElement->m_next;
+ }
+
+ if (--m_count == m_tableSizeLow)
+ resize(m_tableSizeLow);
+}
+
+
+HashElementBase *HashingBase::firstElement(HashElementBase ***pList) const
+{
+ HashElementBase **pStop = m_table + m_tableSize;
+ for(*pList = m_table; *pList != pStop; ++(*pList))
+ if (**pList) return **pList;
+
+ return 0;
+}
+
+
+HashElementBase *HashingBase::nextElement(HashElementBase ***pList,
+ HashElementBase *pElement) const
+{
+ if ((pElement = pElement->next()) != 0) return pElement;
+
+ HashElementBase **pStop = m_table + m_tableSize;
+ for(++(*pList); *pList != pStop; ++(*pList))
+ if (**pList) return **pList;
+
+ return 0;
+}
+
+
+
+} // end namespace ogdf
diff --git a/ogdf/basic/Hashing.h b/ogdf/basic/Hashing.h
new file mode 100644
index 0000000..36bcaef
--- /dev/null
+++ b/ogdf/basic/Hashing.h
@@ -0,0 +1,520 @@
+/*
+ * $Revision: 2523 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-02 20:59:27 +0200 (Mon, 02 Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of classes used for hashing.
+ *
+ * Declares HashingBase and HashElementBase, and declares and implements
+ * classes Hashing, HashElement, HashConstIterator.
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_HASHING_H
+#define OGDF_HASHING_H
+
+#include "basic.h"
+#include <math.h>
+#include <limits.h>
+
+
+namespace ogdf {
+
+class HashingBase;
+
+/**
+ * \brief Base class for elements within a hash table.
+ *
+ * This class realizes only chaining of elements and maintianing hash values
+ * for rehashing.
+ */
+class HashElementBase {
+ friend class HashingBase;
+
+ HashElementBase *m_next; //!< The successor in the list.
+ size_t m_hashValue; //!< The hash value.
+
+public:
+ //! Creates a hash element with hash value \a hashValue.
+ HashElementBase(size_t hashValue) : m_hashValue(hashValue) { }
+
+ //! Returns the successor to this element in the list.
+ HashElementBase *next() const { return m_next; }
+
+ //! Returns the hash value of this element.
+ size_t hashValue() const { return m_hashValue; }
+
+ OGDF_NEW_DELETE
+};
+
+
+/**
+ * \brief Base class for hashing with chaining and table doubling.
+ *
+ * The actual hashing is provided by the parameterized class Hashing<K,I>
+ * which derives from HashingBase.
+ */
+class HashingBase {
+protected:
+ int m_tableSize; //!< The current table size.
+ int m_hashMask; //!< The current table size minus one.
+ int m_minTableSize; //!< The minimal table size.
+ int m_tableSizeLow; //!< The minimal number of elements at this table size.
+ int m_tableSizeHigh; //!< The maximal number of elements at this table size.
+ int m_count; //!< The current number of elements.
+ HashElementBase **m_table; //!< The hash table (an array of lists).
+
+public:
+ //! Creates a hash table with minimum table size \a minTableSize.
+ HashingBase(int minTableSize);
+
+ //! Copy constructor.
+ HashingBase(const HashingBase &H);
+
+ // destruction
+ virtual ~HashingBase();
+
+ //! Resizes the hash table to \a newTableSize.
+ void resize(int newTableSize);
+
+ //! Inserts a new element \a pElement into the hash table.
+ void insert(HashElementBase *pElement);
+
+ //! Removes the element \a pElement from the hash table.
+ void del(HashElementBase *pElement);
+
+ //! Removes all elements from the hash table.
+ void clear();
+
+ //! Assignment operator.
+ HashingBase &operator=(const HashingBase &H);
+
+ //! Returns the number of elements in the hash table.
+ int size() const { return m_count; }
+
+ //! Returns if the hash table is empty
+ int empty() const { return (m_count==0); }
+
+ /**
+ * \brief Returns the first element in the list for elements with hash value \a hashValue.
+ *
+ * This is the list m_table[hashValue & m_hashMask].
+ */
+ HashElementBase *firstListElement(size_t hashValue) const {
+ return *(m_table + (hashValue & m_hashMask));
+ }
+
+ /**
+ * \brief Returns the first element in the list of all elements in the hash table.
+ *
+ * This function is used by hash iterators for iterating over all elements
+ * in the hash table.
+ * @param pList is assigned the list containing the first element.
+ * \return a pointer to the first element or 0 if hash table is empty.
+ */
+ HashElementBase *firstElement(HashElementBase ***pList) const;
+
+ /**
+ * \brief Returns the successor of \a pElement in the list of all elements in the hash table.
+ *
+ * This function is used by hash iterators for iterating over all elements
+ * in the hash table.
+ * @param pList is assigned the list containing the first element.
+ * @param pElement points to an element in the has table.
+ * \return a pointer to the first element or 0 if hash table is empty.
+ */
+ HashElementBase *nextElement(HashElementBase ***pList,
+ HashElementBase *pElement) const;
+
+protected:
+ //! Deletes all elements in hash table (but does not free m_table!).
+ void destroyAll();
+
+ /**
+ * \brief Called to delete hash element.
+ *
+ * This must be done in Hashing<K,I> since only this class knows the actual
+ * element type; alternatively, HashElementBase could have a virtual destructor.
+ */
+ virtual void destroy(HashElementBase *pElement) = 0;
+
+ //! Called to create a copy of the element \a pElement.
+ virtual HashElementBase *copy(HashElementBase *pElement) const = 0;
+
+private:
+ //! Initializes the table for given table size.
+ void init(int tableSize);
+
+ //! Copies all elements from \a H to this hash table.
+ void copyAll(const HashingBase &H);
+};
+
+
+template<class K, class I, class H> class Hashing;
+template<class K, class I, class H> class HashArray;
+
+
+/**
+ * \brief Representation of elements in a hash table.
+ *
+ * This class adds key and information members to HashElementBase. The two
+ * template parameters are \a K for the type of keys and \a I for the type
+ * of information.
+ */
+template<class K, class I>
+class HashElement : public HashElementBase
+{
+ K m_key; //!< The key value.
+ I m_info; //!< The information value.
+
+public:
+ //! Creates a hash element with given hash value, key, and information.
+ HashElement(size_t hashValue, const K &key, const I &info) :
+ HashElementBase(hashValue), m_key(key), m_info(info) { }
+
+ //! Returns the successor element in the list.
+ HashElement<K,I> *next() const {
+ return (HashElement<K,I> *)HashElementBase::next();
+ }
+
+ //! Returns the key value.
+ const K &key() const { return m_key; }
+
+ //! Returns the information value.
+ const I &info() const { return m_info; }
+
+ //! Returns a refeence to the information value.
+ I &info() { return m_info; }
+
+ OGDF_NEW_DELETE
+};
+
+
+template<class K, class I, class H> class HashConstIterator;
+
+//--------------------------------------------------------------------
+// Hash function classes have to define
+// int hash(const E &key)
+//
+// "const E &" can be replaced by "E"
+//--------------------------------------------------------------------
+
+/**
+ * \brief Default hash functions.
+ *
+ * This class implements a default hash function for various
+ * basic data types.
+ *
+ * \see Hashing, HashArray, HashArray2D
+ */
+template<class K> class DefHashFunc {
+ //! Returns the hash value of \a key.
+ public: size_t hash(const K &key) const { return size_t(key); }
+};
+
+//! Specialized default hash function for pointer types.
+template<> class DefHashFunc<void *> {
+ public: size_t hash(const void * &key) const { return size_t(key && 0xffffffff); }
+};
+
+//! Specialized default hash function for double.
+template<> class DefHashFunc<double> {
+ public: size_t hash(const double &key) const {
+ int dummy;
+ return size_t(SIZE_MAX*frexp(key,&dummy));
+ }
+};
+
+
+/**
+ * \brief %Hashing with chaining and table doubling.
+ *
+ * The class Hashing<K,I> implements a hashing table which realizes a
+ * mapping from a key type \a K to an information type \a I.
+ *
+ * The class requires three template parameters:
+ * - \a K is the type of keys.
+ * - \a I is the type of information.
+ * - \a H is the hash function type.
+ * The hash function type argument is optional; its default uses the class
+ * DefHashFunc.
+ */
+template<class K, class I, class H = DefHashFunc<K> >
+class Hashing : private HashingBase
+{
+ friend class HashConstIterator<K,I,H>;
+ H m_hashFunc; //!< The hash function.
+
+public:
+ //! The type of const-iterators for hash tables.
+ typedef HashConstIterator<K,I,H> const_iterator;
+
+ //! Creates a hash table for given initial table size \a minTableSize.
+ explicit Hashing(int minTableSize = 256, const H &hashFunc = H())
+ : HashingBase(minTableSize), m_hashFunc(hashFunc) { }
+
+ //! Copy constructor.
+ Hashing(const Hashing<K,I> &h) : HashingBase(h) { }
+
+ // destruction
+ ~Hashing() { HashingBase::destroyAll(); }
+
+ //! Returns the number of elements in the hash table.
+ int size() const { return HashingBase::size(); }
+
+ //! Returns true iff the table is empty, i.e., contains no elements.
+ bool empty() const { return (HashingBase::size() == 0); }
+
+ //! Returns true iff the hash table contains an element with key \a key.
+ bool member(const K &key) const { return (lookup(key) != 0); }
+
+ //! Returns an hash iterator to the first element in the list of all elements.
+ HashConstIterator<K,I,H> begin() const;
+
+ //! Returns the hash element with key \a key in the hash table; returns 0 if no such element.
+ HashElement<K,I> *lookup(const K &key) const {
+ HashElement<K,I> *pElement =
+ (HashElement<K,I> *)firstListElement(m_hashFunc.hash(key));
+ for (; pElement; pElement = pElement->next())
+ if (pElement->key() == key) return pElement;
+
+ return 0;
+ }
+
+ //! Assignment operator.
+ Hashing<K,I> &operator=(const Hashing<K,I> &hashing) {
+ HashingBase::operator =(hashing);
+ m_hashFunc = hashing.m_hashFunc;
+ return *this;
+ }
+
+ /**
+ * \brief Inserts a new element with key \a key and information \a info into the hash table.
+ *
+ * The new element will only be inserted if no element with key \a key is
+ * already contained; if such an element already exists the information of
+ * this element will be changed to \a info.
+ */
+ HashElement<K,I> *insert(const K &key, const I &info) {
+ HashElement<K,I> *pElement = lookup(key);
+
+ if (pElement)
+ pElement->info() = info;
+ else
+ HashingBase::insert(pElement =
+ OGDF_NEW HashElement<K,I>(m_hashFunc.hash(key),key,info));
+
+ return pElement;
+ }
+
+ /**
+ * \brief Inserts a new element with key \a key and information \a info into the hash table.
+ *
+ * The new element will only be inserted if no element with key \a key is
+ * already contained; if such an element already exists the information of
+ * this element remains unchanged.
+ */
+ HashElement<K,I> *insertByNeed(const K &key, const I &info) {
+ HashElement<K,I> *pElement = lookup(key);
+
+ if (!pElement)
+ HashingBase::insert(pElement = OGDF_NEW HashElement<K,I>(m_hashFunc.hash(key),key,info));
+
+ return pElement;
+ }
+
+ /**
+ * \brief Inserts a new element with key \a key and information \a info into the hash table.
+ *
+ * This is a faster version of insert() that assumes that no element with key
+ * \a key is already contained in the hash table.
+ */
+ HashElement<K,I> *fastInsert(const K &key, const I &info) {
+ HashElement<K,I> *pElement = OGDF_NEW HashElement<K,I>(m_hashFunc.hash(key),key,info);
+ HashingBase::insert(pElement);
+ return pElement;
+ }
+
+ //! Removes the element with key \a key from the hash table (does nothing if no such element).
+ void del(const K &key) {
+ HashElement<K,I> *pElement = lookup(key);
+ if (pElement) {
+ HashingBase::del(pElement);
+ delete pElement;
+ }
+ }
+
+ //! Removes all elements from the hash table.
+ void clear() { HashingBase::clear(); }
+
+protected:
+ /**
+ * \brief Returns the first element in the list of all elements in the hash table.
+ *
+ * This function is used by hash iterators for iterating over all elements
+ * in the hash table.
+ * @param pList is assigned the list containing the first element.
+ * \return a pointer to the first element or 0 if hash table is empty.
+ */
+ HashElement<K,I> *firstElement(HashElement<K,I> ***pList) const {
+ return (HashElement<K,I> *)(HashingBase::firstElement((HashElementBase ***)pList));
+ }
+
+ /**
+ * \brief Returns the successor of \a pElement in the list of all elements in the hash table.
+ *
+ * This function is used by hash iterators for iterating over all elements
+ * in the hash table.
+ * @param pList is assigned the list containing the first element.
+ * @param pElement points to an element in the has table.
+ * \return a pointer to the first element or 0 if hash table is empty.
+ */
+ HashElement<K,I> *nextElement(HashElement<K,I> ***pList,
+ HashElement<K,I> *pElement) const
+ {
+ return (HashElement<K,I> *)(HashingBase::nextElement(
+ (HashElementBase ***)pList,pElement));
+ }
+
+private:
+ //! Deletes hash element \a pElement.
+ virtual void destroy(HashElementBase *pElement) {
+ delete (HashElement<K,I> *)(pElement);
+ }
+
+ //! Returns a copy of hash element \a pElement.
+ virtual HashElementBase *copy(HashElementBase *pElement) const {
+ HashElement<K,I> *pX = (HashElement<K,I> *)(pElement);
+ return OGDF_NEW HashElement<K,I>(pX->hashValue(),pX->key(),pX->info());
+ }
+};
+
+
+/**
+ * \brief Iterators for hash tables.
+ *
+ * This class implements an iterator for iterating over all elements in
+ * a hash table. Hash iterators are provided by Hashing<K,I>::begin().
+ *
+ * <H3>Example</H3>
+ * The following code snippet demonstrates how to iterate over all elements
+ * of a hash table. First, the example fills a hash table with a tiny
+ * German–English dictionary, and then it iterates over the elements
+ * and prints the entries.
+ * \code
+ * Hashing<String,String> H;
+ *
+ * H.fastInsert("Hund","dog");
+ * H.fastInsert("Katze","cat");
+ * H.fastInsert("Maus","mouse");
+ *
+ * HashConstIterator<String,String> it;
+ * for(it = H.begin(); it.valid(); ++it)
+ * cout << it.key() << " -> " << it.info() << endl;
+ * \endcode
+ */
+template<class K, class I, class H = DefHashFunc<K> >
+class HashConstIterator {
+ HashElement<K,I> *m_pElement; //!< The hash element to which the iterator points.
+ HashElement<K,I> **m_pList; //!< The list containg the hash element.
+ const Hashing<K,I,H> *m_pHashing; //!< The associated hash table.
+
+public:
+ //! Creates a hash iterator pointing to no element.
+ HashConstIterator() : m_pElement(0), m_pList(0), m_pHashing(0) { }
+
+ //! Creates a hash iterator pointing to element \a pElement in list \a pList of hash table \a pHashing.
+ HashConstIterator(HashElement<K,I> *pElement, HashElement<K,I> **pList,
+ const Hashing<K,I,H> *pHashing) : m_pElement(pElement), m_pList(pList),
+ m_pHashing(pHashing) { }
+
+ //! Copy constructor.
+ HashConstIterator(const HashConstIterator<K,I,H> &it) : m_pElement(it.m_pElement),
+ m_pList(it.m_pList), m_pHashing(it.m_pHashing) { }
+
+ //! Assignment operator.
+ HashConstIterator &operator=(const HashConstIterator<K,I,H> &it) {
+ m_pElement = it.m_pElement;
+ m_pList = it.m_pList;
+ m_pHashing = it.m_pHashing;
+ return *this;
+ }
+
+ //! Returns true if the hash iterator points to an element.
+ bool valid() const { return (m_pElement != 0); }
+
+ //! Returns the key of the hash element pointed to.
+ const K &key() const { return m_pElement->key(); }
+
+ //! Returns the information of the hash element pointed to.
+ const I &info() const { return m_pElement->info(); }
+
+ //! Equality operator.
+ friend bool operator==(const HashConstIterator<K,I,H> &it1,
+ const HashConstIterator<K,I,H> &it2) { return (it1.m_pElement == it2.m_pElement); }
+
+ //! Inequality operator.
+ friend bool operator!=(const HashConstIterator<K,I,H> &it1,
+ const HashConstIterator<K,I,H> &it2) { return (it1.m_pElement != it2.m_pElement); }
+
+ //! Moves this hash iterator to the next element (iterator gets invalid if no more elements).
+ HashConstIterator<K,I,H> &operator++() {
+ m_pElement = m_pHashing->nextElement(&m_pList,m_pElement);
+ return *this;
+ }
+};
+
+
+template<class K, class I, class H>
+inline HashConstIterator<K,I,H> Hashing<K,I,H>::begin() const
+{
+ HashElement<K,I> *pElement, **pList;
+ pElement = firstElement(&pList);
+ return HashConstIterator<K,I,H>(pElement,pList,this);
+}
+
+
+} // end namespace ogdf
+
+#endif
diff --git a/ogdf/basic/List.h b/ogdf/basic/List.h
new file mode 100644
index 0000000..d31050e
--- /dev/null
+++ b/ogdf/basic/List.h
@@ -0,0 +1,1634 @@
+/*
+ * $Revision: 2632 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-17 21:04:24 +0200 (Di, 17. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of doubly linked lists and iterators
+ *
+ * \author Carsten Gutwenger and Sebastian Leipert
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_LIST_H
+#define OGDF_LIST_H
+
+
+#include "../internal/basic/list_templates.h"
+
+
+namespace ogdf {
+
+
+template<class E> class List;
+template<class E> class ListPure;
+template<class E> class ListIterator;
+template<class E> class ListConstIterator;
+
+
+//! The parameterized class \a ListElement<E> represents the structure for elements of doubly linked lists.
+template<class E>
+class ListElement {
+ friend class ListPure<E>;
+ friend class List<E>;
+ friend class ListIterator<E>;
+ friend class ListConstIterator<E>;
+
+ ListElement<E> *m_next; //!< Pointer to successor element.
+ ListElement<E> *m_prev; //!< Pointer to predecessor element.
+ E m_x; //!< Stores the content.
+
+ //! Constructs a ListElement.
+ ListElement() : m_next(0), m_prev(0) { }
+ //! Constructs a ListElement.
+ ListElement(const E &x) : m_next(0), m_prev(0), m_x(x) { }
+ //! Constructs a ListElement.
+ ListElement(const E &x, ListElement<E> *next, ListElement<E> *prev) :
+ m_next(next), m_prev(prev), m_x(x) { }
+
+ OGDF_NEW_DELETE
+}; // class ListElement
+
+
+
+//! The parameterized class \a ListIterator<E> encapsulates a pointer to a dlist element.
+/**
+ * It is used in order to iterate over doubly linked lists,
+ * and to specify a position in a doubly linked list. It is possible that
+ * an iterator encapsulates a null pointer.
+ */
+
+template<class E> class ListIterator {
+ ListElement<E> *m_pX; // pointer to associated list element
+
+ friend class ListConstIterator<E>;
+ friend class ListPure<E>;
+
+ //! Conversion to pointer to list element.
+ operator ListElement<E> *() { return m_pX; }
+ //! Conversion to pointer to list element.
+ operator const ListElement<E> *() const { return m_pX; }
+
+public:
+ //! Constructs an iterator pointing to no element.
+ ListIterator() : m_pX(0) { }
+ //! Constructs an iterator pointing to \a pX.
+ ListIterator(ListElement<E> *pX) : m_pX(pX) { }
+ //! Constructs an iterator that is a copy of \a it.
+ ListIterator(const ListIterator<E> &it) : m_pX(it.m_pX) { }
+
+ //! Returns true iff the iterator points to an element.
+ bool valid() const { return m_pX != 0; }
+
+ //! Equality operator.
+ bool operator==(const ListIterator<E> &it) const {
+ return m_pX == it.m_pX;
+ }
+
+ //! Inequality operator.
+ bool operator!=(const ListIterator<E> &it) const {
+ return m_pX != it.m_pX;
+ }
+
+ //! Returns successor iterator.
+ ListIterator<E> succ() const { return m_pX->m_next; }
+
+ //! Returns predecessor iterator.
+ ListIterator<E> pred() const { return m_pX->m_prev; }
+
+ //! Returns a reference to the element content.
+ E &operator*() const { return m_pX->m_x; }
+
+ //! Assignment operator.
+ ListIterator<E> &operator=(const ListIterator<E> &it) {
+ m_pX = it.m_pX;
+ return *this;
+ }
+
+ //! Increment operator (prefix).
+ ListIterator<E> &operator++() {
+ m_pX = m_pX->m_next;
+ return *this;
+ }
+
+ //! Increment operator (postfix).
+ ListIterator<E> operator++(int) {
+ ListIterator<E> it = *this;
+ m_pX = m_pX->m_next;
+ return it;
+ }
+
+ //! Decrement operator (prefix).
+ ListIterator<E> &operator--() {
+ m_pX = m_pX->m_prev;
+ return *this;
+ }
+
+ //! Decrement operator (postfix).
+ ListIterator<E> operator--(int) {
+ ListIterator<E> it = *this;
+ m_pX = m_pX->m_prev;
+ return it;
+ }
+
+ OGDF_NEW_DELETE
+}; // class ListIterator
+
+
+
+//---------------------------------------------------------
+// ListConstIterator<E>
+// const iterator for doubly linked lists
+//---------------------------------------------------------
+//! The parameterized class \a ListIterator<E> encapsulates a constant pointer to a list element.
+/**
+ * It is used in order to iterate over doubly linked lists,
+ * and to specify a position in a doubly linked list. It is possible that
+ * an iterator encapsulates a null pointer. In contrast to ListIterator,
+ * it is not possible to change the list element pointed to.
+ */
+
+template<class E> class ListConstIterator {
+ const ListElement<E> *m_pX; // pointer to list element
+
+ friend class ListPure<E>;
+
+ //! Conversion to pointer to list element.
+ operator const ListElement<E> *() { return m_pX; }
+
+public:
+ //! Constructs an iterator pointing to no element.
+ ListConstIterator() : m_pX(0) { }
+
+ //! Constructs an iterator pointing to \a pX.
+ ListConstIterator(const ListElement<E> *pX) : m_pX(pX) { }
+
+ //! Constructs an iterator that is a copy of \a it.
+ ListConstIterator(const ListIterator<E> &it) : m_pX((const ListElement<E> *)it) { }
+ //! Constructs an iterator that is a copy of \a it.
+ ListConstIterator(const ListConstIterator &it) : m_pX(it.m_pX) { }
+
+ //! Returns true iff the iterator points to an element.
+ bool valid() const { return m_pX != 0; }
+
+ //! Equality operator.
+ bool operator==(const ListConstIterator<E> &it) const {
+ return m_pX == it.m_pX;
+ }
+
+ //! Inequality operator.
+ bool operator!=(const ListConstIterator<E> &it) const {
+ return m_pX != it.m_pX;
+ }
+
+ //! Returns successor iterator.
+ ListConstIterator<E> succ() const { return m_pX->m_next; }
+
+ //! Returns predecessor iterator.
+ ListConstIterator<E> pred() const { return m_pX->m_prev; }
+
+ //! Returns a reference to the element content.
+ const E &operator*() const { return m_pX->m_x; }
+
+ //! Assignment operator.
+ ListConstIterator<E> &operator=(const ListConstIterator<E> &it) {
+ m_pX = it.m_pX;
+ return *this;
+ }
+
+ //! Increment operator (prefix).
+ ListConstIterator<E> &operator++() {
+ m_pX = m_pX->m_next;
+ return *this;
+ }
+
+ //! Increment operator (postfix).
+ ListConstIterator<E> operator++(int) {
+ ListConstIterator<E> it = *this;
+ m_pX = m_pX->m_next;
+ return it;
+ }
+
+ //! Decrement operator (prefix).
+ ListConstIterator<E> &operator--() {
+ m_pX = m_pX->m_prev;
+ return *this;
+ }
+
+ //! Decrement operator (postfix).
+ ListConstIterator<E> operator--(int) {
+ ListConstIterator<E> it = *this;
+ m_pX = m_pX->m_prev;
+ return it;
+ }
+
+ OGDF_NEW_DELETE
+}; // class ListConstIterator
+
+
+
+//! The parameterized class \a ListPure<E> represents doubly linked lists with content type \a E.
+/**
+ * Elements of the list are instances of type ListElement<E>.
+ * Use ListConstIterator<E> or ListIterator<E> in order to iterate over the list.
+ *
+ * In contrast to List<E>, instances of \a ListPure<E> do not store the length of the list.
+ *
+ * @tparam E is the data type stored in list elements.
+ */
+
+template<class E> class ListPure {
+protected:
+
+ ListElement<E> *m_head; //!< Pointer to first element.
+ ListElement<E> *m_tail; //!< Pointer to last element.
+
+public:
+ //! Constructs an empty doubly linked list.
+ ListPure() : m_head(0), m_tail(0) { }
+
+ //! Constructs a doubly linked list that is a copy of \a L.
+ ListPure(const ListPure<E> &L) : m_head(0), m_tail(0) {
+ copy(L);
+ }
+
+ // destruction
+ ~ListPure() { clear(); }
+
+ typedef E value_type;
+ typedef ListElement<E> element_type;
+ typedef ListConstIterator<E> const_iterator;
+ typedef ListIterator<E> iterator;
+
+ //! Returns true iff the list is empty.
+ bool empty() const { return m_head == 0; }
+
+ //! Returns the length of the list
+ /**
+ * Notice that this method requires to run through the whole list and takes linear running time!
+ */
+ int size() const {
+ int count = 0;
+ for (ListElement<E> *pX = m_head; pX; pX = pX->m_next)
+ ++count;
+ return count;
+ }
+
+ //! Returns an iterator to the first element of the list.
+ /**
+ * If the list is empty, a null pointer iterator is returned.
+ */
+ const ListConstIterator<E> begin() const { return m_head; }
+ //! Returns an iterator to the first element of the list.
+ /**
+ * If the list is empty, a null pointer iterator is returned.
+ */
+ ListIterator<E> begin() { return m_head; }
+
+ //! Returns an iterator to one-past-last element of the list.
+ /**
+ * This is always a null pointer iterator.
+ */
+ ListConstIterator<E> end() const { return ListConstIterator<E>(); }
+ //! Returns an iterator to one-past-last element of the list.
+ /**
+ * This is always a null pointer iterator.
+ */
+ ListIterator<E> end() { return ListIterator<E>(); }
+
+ //! Returns an iterator to the last element of the list.
+ /**
+ * If the list is empty, a null pointer iterator is returned.
+ */
+ const ListConstIterator<E> rbegin() const { return m_tail; }
+ //! Returns an iterator to the last element of the list.
+ /**
+ * If the list is empty, a null pointer iterator is returned.
+ */
+ ListIterator<E> rbegin() { return m_tail; }
+
+ //! Returns an iterator to one-before-first element of the list.
+ /**
+ * This is always a null pointer iterator.
+ */
+ ListConstIterator<E> rend() const { return ListConstIterator<E>(); }
+ //! Returns an iterator to one-before-first element of the list.
+ /**
+ * This is always a null pointer iterator.
+ */
+ ListIterator<E> rend() { return ListIterator<E>(); }
+
+ //! Returns a reference to the first element.
+ /**
+ * \pre The list is not empty!
+ */
+ const E &front() const {
+ OGDF_ASSERT(m_head != 0)
+ return m_head->m_x;
+ }
+
+ //! Returns a reference to the first element.
+ /**
+ * \pre The list is not empty!
+ */
+ E &front() {
+ OGDF_ASSERT(m_head != 0)
+ return m_head->m_x;
+ }
+
+ //! Returns a reference to the last element.
+ /**
+ * \pre The list is not empty!
+ */
+ const E &back() const {
+ OGDF_ASSERT(m_tail != 0)
+ return m_tail->m_x;
+ }
+
+ //! Returns a reference to the last element.
+ /**
+ * \pre The list is not empty!
+ */
+ E &back() {
+ OGDF_ASSERT(m_tail != 0)
+ return m_tail->m_x;
+ }
+
+ //! Returns an iterator to the cyclic successor of \a it.
+ /**
+ * \pre \a it points to an element in this list!
+ */
+ ListConstIterator<E> cyclicSucc(ListConstIterator<E> it) const {
+ const ListElement<E> *pX = it;
+ return (pX->m_next) ? pX->m_next : m_head;
+ }
+
+ //! Returns an iterator to the cyclic successor of \a it.
+ /**
+ * \pre \a it points to an element in this list!
+ */
+ ListIterator<E> cyclicSucc(ListIterator<E> it) {
+ OGDF_ASSERT(it.valid())
+ ListElement<E> *pX = it;
+ return (pX->m_next) ? pX->m_next : m_head;
+ }
+
+ //! Returns an iterator to the cyclic predecessor of \a it.
+ /**
+ * \pre \a it points to an element in this list!
+ */
+ ListConstIterator<E> cyclicPred(ListConstIterator<E> it) const {
+ OGDF_ASSERT(it.valid())
+ const ListElement<E> *pX = it;
+ return (pX->m_prev) ? pX->m_prev : m_tail;
+ }
+
+ //! Returns an iterator to the cyclic predecessor of \a it.
+ /**
+ * \pre \a it points to an element in this list!
+ */
+ ListIterator<E> cyclicPred(ListIterator<E> it) {
+ OGDF_ASSERT(it.valid())
+ ListElement<E> *pX = it;
+ return (pX->m_prev) ? pX->m_prev : m_tail;
+ }
+
+ //! Returns an iterator pointing to the element at position \a pos.
+ /**
+ * The running time of this method is linear in \a pos.
+ */
+ ListConstIterator<E> get(int pos) const {
+ ListElement<E> *pX;
+ for(pX = m_head; pX != 0; pX = pX->m_next)
+ if (pos-- == 0) break;
+ return pX;
+ }
+
+ //! Returns an iterator pointing to the element at position \a pos.
+ /**
+ * The running time of this method is linear in \a pos.
+ */
+ ListIterator<E> get(int pos) {
+ ListElement<E> *pX;
+ for(pX = m_head; pX != 0; pX = pX->m_next)
+ if (pos-- == 0) break;
+ return pX;
+ }
+
+ //! Returns the position (starting with 0) of iterator \a it in the list.
+ /**
+ * \pre \a it is a valid iterator pointing to an element in this list!
+ */
+ int pos(ListConstIterator<E> it) const {
+ OGDF_ASSERT(it.valid())
+ int p = 0;
+ for(ListElement<E> *pX = m_head; pX != 0; pX = pX->m_next, ++p)
+ if (pX == it) break;
+ return p;
+ }
+
+ //! Returns an iterator to a random element in the list (or an invalid iterator if the list is empty)
+ /**
+ * This method takes linear time.
+ */
+ ListConstIterator<E> chooseIterator() const {
+ return empty() ? ListConstIterator<E>() : get(randomNumber(0,size()-1));
+ }
+
+ //! Returns an iterator to a random element in the list (or an invalid iterator if the list is empty)
+ /**
+ * This method takes linear time.
+ */
+ ListIterator<E> chooseIterator() {
+ return empty() ? ListIterator<E>() : get(randomNumber(0,size()-1));
+ }
+
+ //! Returns a random element from the list.
+ /**
+ * \pre The list is not empty!
+ *
+ * This method takes linear time.
+ */
+ const E chooseElement() const {
+ OGDF_ASSERT(m_head != 0)
+ return *chooseIterator();
+ }
+
+ //! Returns a random element from the list.
+ /**
+ * \pre The list is not empty!
+ *
+ * This method takes linear time.
+ */
+ E chooseElement() {
+ return *chooseIterator();
+ }
+
+ //! Assignment operator.
+ ListPure<E> &operator=(const ListPure<E> &L) {
+ clear(); copy(L);
+ return *this;
+ }
+
+ //! Equality operator.
+ bool operator==(const ListPure<E> &L) const {
+ ListElement<E> *pX = m_head, *pY = L.m_head;
+ while(pX != 0 && pY != 0) {
+ if(pX->m_x != pY->m_x)
+ return false;
+ pX = pX->m_next;
+ pY = pY->m_next;
+ }
+ return (pX == 0 && pY == 0);
+ }
+
+ //! Inequality operator.
+ bool operator!=(const ListPure<E> &L) const {
+ return !operator==(L);
+ }
+
+ //! Adds element \a x at the begin of the list.
+ ListIterator<E> pushFront(const E &x) {
+ ListElement<E> *pX = OGDF_NEW ListElement<E>(x,m_head,0);
+ if (m_head)
+ m_head = m_head->m_prev = pX;
+ else
+ m_head = m_tail = pX;
+ return m_head;
+ }
+
+ //! Adds element \a x at the end of the list.
+ ListIterator<E> pushBack(const E &x) {
+ ListElement<E> *pX = OGDF_NEW ListElement<E>(x,0,m_tail);
+ if (m_head)
+ m_tail = m_tail->m_next = pX;
+ else
+ m_tail = m_head = pX;
+ return m_tail;
+ }
+
+ //! Inserts element \a x before or after \a it.
+ /**
+ * @param x is the element to be inserted.
+ * @param it is a list iterator in this list.
+ * @param dir determines if \a x is inserted before or after \a it.
+ * Possible values are \c ogdf::before and \c ogdf::after.
+ * \pre \a it points to an element in this list.
+ */
+ ListIterator<E> insert(const E &x, ListIterator<E> it, Direction dir = after) {
+ OGDF_ASSERT(it.valid())
+ OGDF_ASSERT(dir == after || dir == before)
+ ListElement<E> *pY = it, *pX;
+ if (dir == after) {
+ ListElement<E> *pYnext = pY->m_next;
+ pY->m_next = pX = OGDF_NEW ListElement<E>(x,pYnext,pY);
+ if (pYnext) pYnext->m_prev = pX;
+ else m_tail = pX;
+ } else {
+ ListElement<E> *pYprev = pY->m_prev;
+ pY->m_prev = pX = OGDF_NEW ListElement<E>(x,pY,pYprev);
+ if (pYprev) pYprev->m_next = pX;
+ else m_head = pX;
+ }
+ return pX;
+ }
+
+ //! Inserts element \a x before \a it.
+ /**
+ * \pre \a it points to an element in this list.
+ */
+ ListIterator<E> insertBefore(const E &x, ListIterator<E> it) {
+ OGDF_ASSERT(it.valid())
+ ListElement<E> *pY = it, *pX;
+ ListElement<E> *pYprev = pY->m_prev;
+ pY->m_prev = pX = OGDF_NEW ListElement<E>(x,pY,pYprev);
+ if (pYprev) pYprev->m_next = pX;
+ else m_head = pX;
+ return pX;
+ }
+
+ //! Inserts element \a x after \a it.
+ /**
+ * \pre \a it points to an element in this list.
+ */
+ ListIterator<E> insertAfter(const E &x, ListIterator<E> it) {
+ OGDF_ASSERT(it.valid())
+ ListElement<E> *pY = it, *pX;
+ ListElement<E> *pYnext = pY->m_next;
+ pY->m_next = pX = OGDF_NEW ListElement<E>(x,pYnext,pY);
+ if (pYnext) pYnext->m_prev = pX;
+ else m_tail = pX;
+ return pX;
+ }
+
+ //! Removes the first element from the list.
+ /**
+ * \pre The list is not empty!
+ */
+ void popFront() {
+ OGDF_ASSERT(m_head != 0)
+ ListElement<E> *pX = m_head;
+ m_head = m_head->m_next;
+ delete pX;
+ if (m_head) m_head->m_prev = 0;
+ else m_tail = 0;
+ }
+
+ //! Removes the first element from the list and returns it.
+ /**
+ * \pre The list is not empty!
+ */
+ E popFrontRet() {
+ E el = front();
+ popFront();
+ return el;
+ }
+
+ //! Removes the last element from the list.
+ /**
+ * \pre The list is not empty!
+ */
+ void popBack() {
+ OGDF_ASSERT(m_tail != 0)
+ ListElement<E> *pX = m_tail;
+ m_tail = m_tail->m_prev;
+ delete pX;
+ if (m_tail) m_tail->m_next = 0;
+ else m_head = 0;
+ }
+
+ //! Removes the last element from the list and returns it.
+ /**
+ * \pre The list is not empty!
+ */
+ E popBackRet() {
+ E el = back();
+ popBack();
+ return el;
+ }
+
+ //! Removes \a it from the list.
+ /**
+ * \pre \a it points to an element in this list.
+ */
+ void del(ListIterator<E> it) {
+ OGDF_ASSERT(it.valid())
+ ListElement<E> *pX = it, *pPrev = pX->m_prev, *pNext = pX->m_next;
+ delete pX;
+ if (pPrev) pPrev->m_next = pNext;
+ else m_head = pNext;
+ if (pNext) pNext->m_prev = pPrev;
+ else m_tail = pPrev;
+ }
+
+ //! Exchanges the positions of \a it1 and \a it2 in the list.
+ /**
+ * \pre \a it1 and \a it2 point to elements in this list.
+ */
+ void exchange(ListIterator<E> it1, ListIterator<E> it2) {
+ OGDF_ASSERT(it1.valid() && it2.valid() && it1 != it2)
+ ListElement<E> *pX = it1, *pY = it2;
+
+ std::swap(pX->m_next,pY->m_next);
+ std::swap(pX->m_prev,pY->m_prev);
+
+ if(pX->m_next == pX) {
+ pX->m_next = pY; pY->m_prev = pX;
+ }
+ if(pX->m_prev == pX) {
+ pX->m_prev = pY; pY->m_next = pX;
+ }
+
+ if(pX->m_prev) pX->m_prev->m_next = pX;
+ else m_head = pX;
+
+ if(pY->m_prev) pY->m_prev->m_next = pY;
+ else m_head = pY;
+
+ if(pX->m_next) pX->m_next->m_prev = pX;
+ else m_tail = pX;
+
+ if(pY->m_next) pY->m_next->m_prev = pY;
+ else m_tail = pY;
+ }
+
+ //! Moves \a it to the begin of the list.
+ /**
+ * \pre \a it points to an element in this list.
+ */
+ void moveToFront(ListIterator<E> it) {
+ OGDF_ASSERT(it.valid())
+ // remove it
+ ListElement<E> *pX = it, *pPrev = pX->m_prev, *pNext = pX->m_next;
+ //already at front
+ if (!pPrev) return;
+
+ //update old position
+ if (pPrev) pPrev->m_next = pNext;
+ if (pNext) pNext->m_prev = pPrev;
+ else m_tail = pPrev;
+ // insert it at front
+ pX->m_prev = 0;
+ pX->m_next = m_head;
+ m_head = m_head->m_prev = pX;
+ }//move
+
+ //! Moves \a it to the end of the list.
+ /**
+ * \pre \a it points to an element in this list.
+ */
+ void moveToBack(ListIterator<E> it) {
+ OGDF_ASSERT(it.valid())
+ // remove it
+ ListElement<E> *pX = it, *pPrev = pX->m_prev, *pNext = pX->m_next;
+ //already at back
+ if (!pNext) return;
+
+ //update old position
+ if (pPrev) pPrev->m_next = pNext;
+ else m_head = pNext;
+ if (pNext) pNext->m_prev = pPrev;
+ // insert it at back
+ pX->m_prev = m_tail;
+ pX->m_next = 0;
+ m_tail = m_tail->m_next = pX;
+ }//move
+
+ //! Moves \a it after \a itBefore.
+ /**
+ * \pre \a it and \a itBefore point to elements in this list.
+ */
+ void moveToSucc(ListIterator<E> it, ListIterator<E> itBefore) {
+ OGDF_ASSERT(it.valid() && itBefore.valid())
+ // move it
+ ListElement<E> *pX = it, *pPrev = pX->m_prev, *pNext = pX->m_next;
+ //the same of already in place
+ ListElement<E> *pY = itBefore;
+ if(pX == pY || pPrev == pY) return;
+
+ // update old position
+ if (pPrev) pPrev->m_next = pNext;
+ else m_head = pNext;
+ if (pNext) pNext->m_prev = pPrev;
+ else m_tail = pPrev;
+ // move it after itBefore
+ ListElement<E> *pYnext = pX->m_next = pY->m_next;
+ (pX->m_prev = pY)->m_next = pX;
+ if (pYnext) pYnext->m_prev = pX;
+ else m_tail = pX;
+ }//move
+
+ //! Moves \a it before \a itAfter.
+ /**
+ * \pre \a it and \a itAfter point to elements in this list.
+ */
+ void moveToPrec(ListIterator<E> it, ListIterator<E> itAfter) {
+ OGDF_ASSERT(it.valid() && itAfter.valid())
+ // move it
+ ListElement<E> *pX = it, *pPrev = pX->m_prev, *pNext = pX->m_next;
+ //the same of already in place
+ ListElement<E> *pY = itAfter;
+ if(pX == pY || pNext == pY) return;
+
+ // update old position
+ if (pPrev) pPrev->m_next = pNext;
+ else m_head = pNext;
+ if (pNext) pNext->m_prev = pPrev;
+ else m_tail = pPrev;
+ // move it before itAfter
+ ListElement<E> *pYprev = pX->m_prev = pY->m_prev;
+ (pX->m_next = pY)->m_prev = pX;
+ if (pYprev) pYprev->m_next = pX;
+ else m_head = pX;
+ }//move
+
+ //! Moves \a it to the begin of \a L2.
+ /**
+ * \pre \a it points to an element in this list.
+ */
+ void moveToFront(ListIterator<E> it, ListPure<E> &L2) {
+ OGDF_ASSERT(it.valid())
+ OGDF_ASSERT(this != &L2)
+ // remove it
+ ListElement<E> *pX = it, *pPrev = pX->m_prev, *pNext = pX->m_next;
+ if (pPrev) pPrev->m_next = pNext;
+ else m_head = pNext;
+ if (pNext) pNext->m_prev = pPrev;
+ else m_tail = pPrev;
+ // insert it at front of L2
+ pX->m_prev = 0;
+ if ((pX->m_next = L2.m_head) != 0)
+ L2.m_head = L2.m_head->m_prev = pX;
+ else
+ L2.m_head = L2.m_tail = pX;
+ }
+
+ //! Moves \a it to the end of \a L2.
+ /**
+ * \pre \a it points to an element in this list.
+ */
+ void moveToBack(ListIterator<E> it, ListPure<E> &L2) {
+ OGDF_ASSERT(it.valid())
+ OGDF_ASSERT(this != &L2)
+ // remove it
+ ListElement<E> *pX = it, *pPrev = pX->m_prev, *pNext = pX->m_next;
+ if (pPrev) pPrev->m_next = pNext;
+ else m_head = pNext;
+ if (pNext) pNext->m_prev = pPrev;
+ else m_tail = pPrev;
+ // insert it at back of L2
+ pX->m_next = 0;
+ if ((pX->m_prev = L2.m_tail) != 0)
+ L2.m_tail = L2.m_tail->m_next = pX;
+ else
+ L2.m_head = L2.m_tail = pX;
+ }
+
+ //! Moves \a it to list \a L2 and inserts it after \a itBefore.
+ /**
+ * \pre \a it points to an element in this list, and \a itBefore
+ * points to an element in \a L2.
+ */
+ void moveToSucc(ListIterator<E> it, ListPure<E> &L2, ListIterator<E> itBefore) {
+ OGDF_ASSERT(it.valid() && itBefore.valid())
+ OGDF_ASSERT(this != &L2)
+ // remove it
+ ListElement<E> *pX = it, *pPrev = pX->m_prev, *pNext = pX->m_next;
+ if (pPrev) pPrev->m_next = pNext;
+ else m_head = pNext;
+ if (pNext) pNext->m_prev = pPrev;
+ else m_tail = pPrev;
+ // insert it in list L2 after itBefore
+ ListElement<E> *pY = itBefore;
+ ListElement<E> *pYnext = pX->m_next = pY->m_next;
+ (pX->m_prev = pY)->m_next = pX;
+ if (pYnext) pYnext->m_prev = pX;
+ else L2.m_tail = pX;
+ }
+
+ //! Moves \a it to list \a L2 and inserts it before \a itAfter.
+ /**
+ * \pre \a it points to an element in this list, and \a itAfter
+ * points to an element in \a L2.
+ */
+ void moveToPrec(ListIterator<E> it, ListPure<E> &L2, ListIterator<E> itAfter) {
+ OGDF_ASSERT(it.valid() && itAfter.valid())
+ OGDF_ASSERT(this != &L2)
+ // remove it
+ ListElement<E> *pX = it, *pPrev = pX->m_prev, *pNext = pX->m_next;
+ if (pPrev) pPrev->m_next = pNext;
+ else m_head = pNext;
+ if (pNext) pNext->m_prev = pPrev;
+ else m_tail = pPrev;
+ // insert it in list L2 after itBefore
+ ListElement<E> *pY = itAfter;
+ ListElement<E> *pYprev = pX->m_prev = pY->m_prev;
+ (pX->m_next = pY)->m_prev = pX;
+ if (pYprev) pYprev->m_next = pX;
+ else L2.m_head = pX;
+ }
+
+ //! Appends \a L2 to this list and makes \a L2 empty.
+ void conc(ListPure<E> &L2) {
+ OGDF_ASSERT(this != &L2)
+ if (m_head)
+ m_tail->m_next = L2.m_head;
+ else
+ m_head = L2.m_head;
+ if (L2.m_head) {
+ L2.m_head->m_prev = m_tail;
+ m_tail = L2.m_tail;
+ }
+ L2.m_head = L2.m_tail = 0;
+ }
+
+ //! Prepends \a L2 to this list and makes \a L2 empty.
+ void concFront(ListPure<E> &L2) {
+ OGDF_ASSERT(this != &L2)
+ if (m_head)
+ m_head->m_prev = L2.m_tail;
+ else
+ m_tail = L2.m_tail;
+ if (L2.m_head) {
+ L2.m_tail->m_next = m_head;
+ m_head = L2.m_head;
+ }
+ L2.m_head = L2.m_tail = 0;
+ }
+
+ //! Exchanges too complete lists in O(1).
+ /**
+ * The list's content is moved to L2 and vice versa.
+ */
+ void exchange(ListPure<E>& L2) {
+ ListElement<E>* t;
+ t = this->m_head;
+ this->m_head = L2.m_head;
+ L2.m_head = t;
+ t = this->m_tail;
+ this->m_tail = L2.m_tail;
+ L2.m_tail = t;
+ }
+
+ //! Splits the list at element \a it into lists \a L1 and \a L2.
+ /**
+ * If \a it is not a null pointer and \a L = x1,...,x{k-1}, \a it,x_{k+1},xn, then
+ * \a L1 = x1,...,x{k-1} and \a L2 = \a it,x{k+1},...,xn if \a dir = \c before.
+ * If \a it is a null pointer, then \a L1 is made empty and \a L2 = \a L. Finally
+ * \a L is made empty if it is not identical to \a L1 or \a L2.
+ *
+ * \pre \a it points to an element in this list.
+ */
+
+ void split(ListIterator<E> it,ListPure<E> &L1,ListPure<E> &L2,Direction dir = before) {
+ if (&L1 != this) L1.clear();
+ if (&L2 != this) L2.clear();
+
+ if (it.valid()){
+ L1.m_head = m_head;
+ L2.m_tail = m_tail;
+ if (dir == before){
+ L2.m_head = it;
+ L1.m_tail = L2.m_head->m_prev;
+ }
+ else {
+ L1.m_tail = it;
+ L2.m_head = L1.m_tail->m_next;
+ }
+ L2.m_head->m_prev = L1.m_tail->m_next = 0;
+
+ } else {
+ L1.m_head = L1.m_tail = 0;
+ L2.m_head = m_head;
+ L2.m_tail = m_tail;
+ }
+
+ if (this != &L1 && this != &L2) {
+ m_head = m_tail = 0;
+ }
+ }
+
+ //! Splits the list after \a it.
+ void splitAfter(ListIterator<E> it, ListPure<E> &L2) {
+ OGDF_ASSERT(it.valid())
+ OGDF_ASSERT(this != &L2)
+ L2.clear();
+ ListElement<E> *pX = it;
+ if (pX != m_tail) {
+ (L2.m_head = pX->m_next)->m_prev = 0;
+ pX->m_next = 0;
+ L2.m_tail = m_tail;
+ m_tail = pX;
+ }
+ }
+
+ //! Splits the list before \a it.
+ void splitBefore(ListIterator<E> it, ListPure<E> &L2) {
+ OGDF_ASSERT(it.valid())
+ OGDF_ASSERT(this != &L2)
+ L2.clear();
+ ListElement<E> *pX = it;
+ L2.m_head = pX; L2.m_tail = m_tail;
+ if ((m_tail = pX->m_prev) == 0)
+ m_head = 0;
+ else
+ m_tail->m_next = 0;
+ pX->m_prev = 0;
+ }
+
+ //! Reverses the order of the list elements.
+ void reverse() {
+ ListElement<E> *pX = m_head;
+ m_head = m_tail;
+ m_tail = pX;
+ while(pX) {
+ ListElement<E> *pY = pX->m_next;
+ pX->m_next = pX->m_prev;
+ pX = pX->m_prev = pY;
+ }
+ }
+
+ //! Removes all elements from the list.
+ void clear() {
+ if (m_head == 0) return;
+
+#if (_MSC_VER == 1100)
+// workaround for bug in Visual Studio 5.0
+
+ while (!empty())
+ popFront();
+
+#else
+
+ if (doDestruction((E*)0)) {
+ for(ListElement<E> *pX = m_head; pX != 0; pX = pX->m_next)
+ pX->m_x.~E();
+ }
+ OGDF_ALLOCATOR::deallocateList(sizeof(ListElement<E>),m_head,m_tail);
+
+#endif
+
+ m_head = m_tail = 0;
+ }
+
+ //! Sorts the list using Quicksort.
+ void quicksort() {
+ ogdf::quicksortTemplate(*this);
+ }
+
+ //! Sorts the list using Quicksort and comparer \a comp.
+ template<class COMPARER>
+ void quicksort(const COMPARER &comp) {
+ ogdf::quicksortTemplate(*this,comp);
+ }
+
+ //! Sorts the list using bucket sort.
+ /**
+ * @param l is the lowest bucket that will occur.
+ * @param h is the highest bucket that will occur.
+ * @param f returns the bucket for each element.
+ * \pre The bucket function \a f will only return bucket values between \a l
+ * and \a h for this list.
+ */
+ void bucketSort(int l, int h, BucketFunc<E> &f);
+
+ //! Randomly permutes the elements in the list.
+ void permute() {
+ permute(size());
+ }
+
+ //! Scans the list for the specified element and returns its position in the list, or -1 if not found.
+ int search (const E& e) const {
+ int x = 0;
+ for(ListConstIterator<E> i = begin(); i.valid(); ++i, ++x)
+ if(*i == e) return x;
+ return -1;
+ }
+
+ //! Scans the list for the specified element (using the user-defined comparer) and returns its position in the list, or -1 if not found.
+ template<class COMPARER>
+ int search (const E& e, const COMPARER &comp) const {
+ int x = 0;
+ for(ListConstIterator<E> i = begin(); i.valid(); ++i, ++x)
+ if(comp.equal(*i,e)) return x;
+ return -1;
+ }
+
+protected:
+ void copy(const ListPure<E> &L) {
+ for(ListElement<E> *pX = L.m_head; pX != 0; pX = pX->m_next)
+ pushBack(pX->m_x);
+ }
+
+ void permute(const int n);
+
+ OGDF_NEW_DELETE
+}; // class ListPure
+
+
+
+//! Iteration over all iterators \a it of a list \a L, where L is of Type \c List<\a type>.
+/**
+ * Automagically creates a \c ListConstIterator<\a type> named \a it, and runs through the List \a L.
+ *
+ * <h3>Example</h3>
+ *
+ * The following code runs through the list \a L, and prints each item
+ * \code
+ * List<double> L;
+ * ...
+ * forall_listiterators(double, it, L) {
+ * cout << *it << endl;
+ * }
+ * \endcode
+ *
+ * Note that this code is equivalent to the following tedious long version
+ *
+ * \code
+ * List<double> L;
+ * ...
+ * for( ListConstIterator<double> it = L.begin(); it.valid(); ++it) {
+ * cout << *it << endl;
+ * }
+ * \endcode
+ */
+#define forall_listiterators(type, it, L) \
+ for(ListConstIterator< type > it = (L).begin(); it.valid(); ++it)
+
+//! Iteration over all iterators \a it of a list \a L, where L is of Type \c List<\a type>, in reverse order.
+/**
+ * Automagically creates a \c ListConstIterator<\a type> named \a it, and runs through the List \a L, in reverse order.
+ * See \c #forall_listiterators for an example.
+ */
+#define forall_rev_listiterators(type, it, L) \
+ for(ListConstIterator< type > it = (L).rbegin(); it.valid(); --it)
+
+//! Iteration over all non-const iterators \a it of a list \a L, where L is of Type \c List<\a type>.
+/**
+ * Automagically creates a \c ListIterator<\a type> named \a it, and runs through the List \a L.
+ * See \c #forall_listiterators for an example.
+ */
+#define forall_nonconst_listiterators(type, it, L) \
+ for(ListIterator< type > it = (L).begin(); it.valid(); ++it)
+
+//! Iteration over all non-const iterators \a it of a list \a L, where L is of Type \c List<\a type>, in reverse order.
+/**
+ * Automagically creates a \c ListIterator<\a type> named \a it, and runs through the List \a L, in reverse order.
+ * See \c #forall_listiterators for an example.
+ */
+#define forall_rev_nonconst_listiterators(type, it, L) \
+ for(ListIterator< type > it = (L).rbegin(); it.valid(); --it)
+
+//! Iteration over all iterators \a it of a list \a L, where L is of Type \c SList<\a type>.
+/**
+ * Automagically creates a \c SListConstIterator<\a type> named \a it, and runs through the SList \a L.
+ * See \c #forall_listiterators for an example.
+ */
+#define forall_slistiterators(type, it, L) \
+ for(SListConstIterator< type > it = (L).begin(); it.valid(); ++it)
+
+//! Iteration over all non-const iterators \a it of a list \a L, where L is of Type \c SList<\a type>.
+/**
+ * Automagically creates a \c SListIterator<\a type> named \a it, and runs through the SList \a L.
+ * See \c #forall_listiterators for an example.
+ */
+#define forall_nonconst_slistiterators(type, it, L) \
+ for(SListIterator< type > it = (L).begin(); it.valid(); ++it)
+
+
+
+
+//! The parameterized class \a ListPure<E> represents doubly linked lists with content type \a E.
+/**
+ * Elements of the list are instances of type ListElement<E>.
+ * Use ListConstIterator<E> or ListIterator<E> in order to iterate over the list.
+ *
+ * In contrast to ListPure<E>, instances of \a List<E> store the length of the list.
+ *
+ * See the \c #forall_listiterators macros for the recommended way how to easily iterate through a
+ * list.
+ *
+ * @tparam E is the data type stored in list elements.
+ */
+template<class E>
+class List : private ListPure<E> {
+
+ int m_count; //!< The length of the list.
+
+public:
+ //! Constructs an empty doubly linked list.
+ List() : m_count(0) { }
+
+ //! Constructs a doubly linked list that is a copy of \a L.
+ List(const List<E> &L) : ListPure<E>(L), m_count(L.m_count) { }
+
+ // destruction
+ ~List() { }
+
+ typedef E value_type;
+ typedef ListElement<E> element_type;
+ typedef ListConstIterator<E> const_iterator;
+ typedef ListIterator<E> iterator;
+
+ //! Returns true iff the list is empty.
+ bool empty() const { return ListPure<E>::empty(); }
+
+ // returns length of list
+ int size() const { return m_count; }
+
+ // returns first element of list (0 if empty)
+ const ListConstIterator<E> begin() const { return ListPure<E>::begin(); }
+ // returns first element of list (0 if empty)
+ ListIterator<E> begin() { return ListPure<E>::begin(); }
+
+ // returns iterator to one-past-last element of list
+ ListConstIterator<E> end() const { return ListConstIterator<E>(); }
+ // returns iterator to one-past-last element of list
+ ListIterator<E> end() { return ListIterator<E>(); }
+
+ // returns last element of list (0 if empty)
+ const ListConstIterator<E> rbegin() const { return ListPure<E>::rbegin(); }
+ // returns last element of list (0 if empty)
+ ListIterator<E> rbegin() { return ListPure<E>::rbegin(); }
+
+ // returns iterator to one-before-first element of list
+ ListConstIterator<E> rend() const { return ListConstIterator<E>(); }
+ // returns iterator to one-before-first element of list
+ ListIterator<E> rend() { return ListIterator<E>(); }
+
+ // returns reference to first element
+ const E &front() const { return ListPure<E>::front(); }
+ // returns reference to first element
+ E &front() { return ListPure<E>::front(); }
+
+ // returns reference to last element
+ const E &back() const { return ListPure<E>::back(); }
+ // returns reference to last element
+ E &back() { return ListPure<E>::back(); }
+
+ // returns cyclic successor
+ ListConstIterator<E> cyclicSucc(ListConstIterator<E> it) const {
+ return ListPure<E>::cyclicSucc(it);
+ }
+
+ // returns cyclic successor
+ ListIterator<E> cyclicSucc(ListIterator<E> it) {
+ return ListPure<E>::cyclicSucc(it);
+ }
+
+ // returns cyclic predecessor
+ ListConstIterator<E> cyclicPred(ListConstIterator<E> it) const {
+ return ListPure<E>::cyclicPred(it);
+ }
+
+ // returns cyclic predecessor
+ ListIterator<E> cyclicPred(ListIterator<E> it) {
+ return ListPure<E>::cyclicPred(it);
+ }
+
+ // returns the iterator at position pos. Note that this takes time linear in pos.
+ ListConstIterator<E> get(int pos) const {
+ OGDF_ASSERT(0 <= pos && pos < m_count)
+ return ListPure<E>::get(pos);
+ }
+
+ // returns the iterator at position pos. Note that this takes time linear in pos.
+ ListIterator<E> get(int pos) {
+ OGDF_ASSERT(0 <= pos && pos < m_count)
+ return ListPure<E>::get(pos);
+ }
+
+ //! Returns the position (starting with 0) of iterator \a it in the list.
+ /**
+ * \pre \a it is a valid iterator pointing to an element in this list!
+ */
+ int pos(ListConstIterator<E> it) const {
+ OGDF_ASSERT(it.valid())
+ return ListPure<E>::pos(it);
+ }
+
+ //! Returns an iterator to a random element in the list (or an invalid iterator if the list is empty)
+ /**
+ * This method takes linear time.
+ */
+ ListConstIterator<E> chooseIterator() const {
+ return (m_count > 0) ? get(randomNumber(0,m_count-1)) : ListConstIterator<E>();
+ }
+
+ //! Returns an iterator to a random element in the list (or an invalid iterator if the list is empty)
+ /**
+ * This method takes linear time.
+ */
+ ListIterator<E> chooseIterator() {
+ return (m_count > 0) ? get(randomNumber(0,m_count-1)) : ListIterator<E>();
+ }
+
+ //! Returns a random element from the list.
+ /**
+ * \pre The list is not empty!
+ *
+ * This method takes linear time.
+ */
+ const E chooseElement() const {
+ OGDF_ASSERT(!empty());
+ return *chooseIterator();
+ }
+
+ //! Returns a random element from the list.
+ /**
+ * \pre The list is not empty!
+ *
+ * This method takes linear time.
+ */
+ E chooseElement() {
+ OGDF_ASSERT(!empty());
+ return *chooseIterator();
+ }
+
+ // assignment
+ List<E> &operator=(const List<E> &L) {
+ ListPure<E>::operator=(L);
+ m_count = L.m_count;
+ return *this;
+ }
+
+ //! Equality operator.
+ bool operator==(const List<E> &L) const {
+ if(m_count != L.m_count)
+ return false;
+
+ ListElement<E> *pX = ListPure<E>::m_head, *pY = L.m_head;
+ while(pX != 0) {
+ if(pX->m_x != pY->m_x)
+ return false;
+ pX = pX->m_next;
+ pY = pY->m_next;
+ }
+ return true;
+ }
+
+ //! Inequality operator.
+ bool operator!=(const List<E> &L) const {
+ return !operator==(L);
+ }
+
+ // adds element x at beginning
+ ListIterator<E> pushFront(const E &x) {
+ ++m_count;
+ return ListPure<E>::pushFront(x);
+ }
+
+ // adds element x at end
+ ListIterator<E> pushBack(const E &x) {
+ ++m_count;
+ return ListPure<E>::pushBack(x);
+ }
+
+ // inserts x before or after it
+ ListIterator<E> insert(const E &x, ListIterator<E> it, Direction dir = after) {
+ ++m_count;
+ return ListPure<E>::insert(x,it,dir);
+ }
+
+ // inserts x before it
+ ListIterator<E> insertBefore(const E &x, ListIterator<E> it) {
+ ++m_count;
+ return ListPure<E>::insertBefore(x,it);
+ }
+
+ // inserts x after it
+ ListIterator<E> insertAfter(const E &x, ListIterator<E> it) {
+ ++m_count;
+ return ListPure<E>::insertAfter(x,it);
+ }
+
+ // removes first element
+ void popFront() {
+ --m_count;
+ ListPure<E>::popFront();
+ }
+
+ // removes first element and returns it
+ E popFrontRet() {
+ E el = front();
+ popFront();
+ return el;
+ }
+
+ // removes last element
+ void popBack() {
+ --m_count;
+ ListPure<E>::popBack();
+ }
+
+ // removes last element and returns it
+ E popBackRet() {
+ E el = back();
+ popBack();
+ return el;
+ }
+
+ void exchange(ListIterator<E> it1, ListIterator<E> it2) {
+ ListPure<E>::exchange(it1,it2);
+ }
+
+ //! Moves \a it to the beginning of the list
+ /**
+ * \pre \a it points to an element in the list.
+ */
+ void moveToFront(ListIterator<E> it) {
+ ListPure<E>::moveToFront(it);
+ }
+ //! Moves \a it to the end of the list
+ /**
+ * \pre \a it points to an element in the list.
+ */
+ void moveToBack(ListIterator<E> it) {
+ ListPure<E>::moveToBack(it);
+ }
+ //! Moves \a it after \a itBefore.
+ /**
+ * \pre \a it and \a itBefore point to elements in this list.
+ */
+ void moveToSucc(ListIterator<E> it, ListIterator<E> itBefore) {
+ ListPure<E>::moveToSucc(it,itBefore);
+ }
+ //! Moves \a it before \a itAfter.
+ /**
+ * \pre \a it and \a itAfter point to elements in this list.
+ */
+ void moveToPrec(ListIterator<E> it, ListIterator<E> itAfter) {
+ ListPure<E>::moveToPrec(it,itAfter);
+ }
+
+ //! Moves \a it to the beginning of \a L2.
+ /**
+ * \pre \a it points to an element in this list.
+ */
+ void moveToFront(ListIterator<E> it, List<E> &L2) {
+ ListPure<E>::moveToFront(it,L2);
+ --m_count; ++L2.m_count;
+ }
+ //! Moves \a it to the end of \a L2.
+ /**
+ * \pre \a it points to an element in this list.
+ */
+ void moveToBack(ListIterator<E> it, List<E> &L2) {
+ ListPure<E>::moveToBack(it,L2);
+ --m_count; ++L2.m_count;
+ }
+
+ //! Moves \a it to list \a L2 and inserts it after \a itBefore.
+ /**
+ * \pre \a it points to an element in this list, and \a itBefore
+ * points to an element in \a L2.
+ */
+ void moveToSucc(ListIterator<E> it, List<E> &L2, ListIterator<E> itBefore) {
+ ListPure<E>::moveToSucc(it,L2,itBefore);
+ --m_count; ++L2.m_count;
+ }
+ //! Moves \a it to list \a L2 and inserts it after \a itBefore.
+ /**
+ * \pre \a it points to an element in this list, and \a itBefore
+ * points to an element in \a L2.
+ */
+ void moveToPrec(ListIterator<E> it, List<E> &L2, ListIterator<E> itAfter) {
+ ListPure<E>::moveToPrec(it,L2,itAfter);
+ --m_count; ++L2.m_count;
+ }
+
+ // removes it and frees memory
+ void del(ListIterator<E> it) {
+ --m_count;
+ ListPure<E>::del(it);
+ }
+
+ //! Appends \a L2 to this list and makes \a L2 empty.
+ void conc(List<E> &L2) {
+ ListPure<E>::conc(L2);
+ m_count += L2.m_count;
+ L2.m_count = 0;
+ }
+
+ //! Prepends \a L2 to this list and makes \a L2 empty.
+ void concFront(List<E> &L2) {
+ ListPure<E>::concFront(L2);
+ m_count += L2.m_count;
+ L2.m_count = 0;
+ }
+
+ //! Exchanges too complete lists in O(1).
+ /**
+ * The list's content is moved to L2 and vice versa.
+ */
+ void exchange(List<E>& L2) {
+ ListPure<E>::exchange(L2);
+ int t = this->m_count;
+ this->m_count = L2.m_count;
+ L2.m_count = t;
+ }
+
+ //! Splits the list at element \a it into lists \a L1 and \a L2.
+ /**
+ * If \a it is not a null pointer and \a L = x1,...,x{k-1}, \a it,x_{k+1},xn, then
+ * \a L1 = x1,...,x{k-1} and \a L2 = \a it,x{k+1},...,xn if \a dir = \c before.
+ * If \a it is a null pointer, then \a L1 is made empty and \a L2 = \a L. Finally
+ * \a L is made empty if it is not identical to \a L1 or \a L2.
+ *
+ * \pre \a it points to an element in this list.
+ */
+ void split(ListIterator<E> it,List<E> &L1,List<E> &L2,Direction dir = before) {
+ ListPure<E>::split(it,L1,L2,dir);
+ int countL = m_count, countL1 = 0;
+ for(ListElement<E> *pX = L1.m_head; pX != 0; pX = pX->m_next)
+ ++countL1;
+
+ L1.m_count = countL1;
+ L2.m_count = countL - countL1;
+ if (this->m_head == 0) m_count = 0;
+ }
+
+ // reverses the order of the list elements
+ void reverse() { ListPure<E>::reverse(); }
+
+ // removes all elements from list
+ void clear() {
+ m_count = 0;
+ ListPure<E>::clear();
+ }
+
+ //! Conversion to const SListPure.
+ const ListPure<E> &getListPure() const { return *this; }
+
+ // sorts list using quicksort
+ void quicksort() {
+ ogdf::quicksortTemplate(*this);
+ }
+
+ // sorts list using quicksort and parameterized compare element comp
+ template<class COMPARER>
+ void quicksort(const COMPARER &comp) {
+ ogdf::quicksortTemplate(*this,comp);
+ }
+
+ // sorts list using bucket sort
+ void bucketSort(int l, int h, BucketFunc<E> &f) {
+ ListPure<E>::bucketSort(l,h,f);
+ }
+
+ // permutes elements in list randomly
+ void permute() {
+ ListPure<E>::permute(m_count);
+ }
+
+ //! Scans the list for the specified element and returns its position in the list, or -1 if not found.
+ int search (const E& e) const {
+ return ListPure<E>::search(e);
+ }
+
+ //! Scans the list for the specified element (using the user-defined comparer) and returns its position in the list, or -1 if not found.
+ template<class COMPARER>
+ int search (const E& e, const COMPARER &comp) const {
+ return ListPure<E>::search(e, comp);
+ }
+
+
+ OGDF_NEW_DELETE
+}; // class List
+
+
+
+template<class E>
+void ListPure<E>::bucketSort(int l, int h, BucketFunc<E> &f)
+{
+ if (m_head == m_tail) return;
+
+ Array<ListElement<E> *> head(l,h,0), tail(l,h);
+
+ ListElement<E> *pX;
+ for (pX = m_head; pX; pX = pX->m_next) {
+ int i = f.getBucket(pX->m_x);
+ if (head[i])
+ tail[i] = ((pX->m_prev = tail[i])->m_next = pX);
+ else
+ head[i] = tail[i] = pX;
+ }
+
+ ListElement<E> *pY = 0;
+ for (int i = l; i <= h; i++) {
+ pX = head[i];
+ if (pX) {
+ if (pY) {
+ (pY->m_next = pX)->m_prev = pY;
+ } else
+ (m_head = pX)->m_prev = 0;
+ pY = tail[i];
+ }
+ }
+
+ m_tail = pY;
+ pY->m_next = 0;
+}
+
+
+// permutes elements in list randomly; n is the length of the list
+template<class E>
+void ListPure<E>::permute(const int n)
+{
+ Array<ListElement<E> *> A(n+2);
+ A[0] = A[n+1] = 0;
+
+ int i = 1;
+ ListElement<E> *pX;
+ for (pX = m_head; pX; pX = pX->m_next)
+ A[i++] = pX;
+
+ A.permute(1,n);
+
+ for (i = 1; i <= n; i++) {
+ pX = A[i];
+ pX->m_next = A[i+1];
+ pX->m_prev = A[i-1];
+ }
+
+ m_head = A[1];
+ m_tail = A[n];
+}
+
+
+// prints list L to output stream os using delimiter delim
+template<class E>
+void print(ostream &os, const ListPure<E> &L, char delim = ' ')
+{
+ ListConstIterator<E> pX = L.begin();
+ if (pX.valid()) {
+ os << *pX;
+ for(++pX; pX.valid(); ++pX)
+ os << delim << *pX;
+ }
+}
+
+// prints list L to output stream os using delimiter delim
+template<class E>
+void print(ostream &os, const List<E> &L, char delim = ' ')
+{
+ print(os, L.getListPure(), delim);
+}
+
+// prints list L to output stream os
+template<class E>
+ostream &operator<<(ostream &os, const ListPure<E> &L)
+{
+ print(os,L);
+ return os;
+}
+
+// prints list L to output stream os
+template<class E>
+ostream &operator<<(ostream &os, const List<E> &L)
+{
+ return os << L.getListPure();
+}
+
+
+} // end namespace ogdf
+
+
+#endif
diff --git a/ogdf/basic/Math.cpp b/ogdf/basic/Math.cpp
new file mode 100644
index 0000000..f4a189c
--- /dev/null
+++ b/ogdf/basic/Math.cpp
@@ -0,0 +1,112 @@
+/*
+ * $Revision: 2549 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-04 23:09:19 +0200 (Mi, 04. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of mathematical constants, functions.
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "Math.h"
+#include <limits.h>
+
+
+namespace ogdf {
+
+
+ const double Math::pi = 3.14159265358979323846;
+ const double Math::pi_2 = 1.57079632679489661923;
+ const double Math::pi_4 = 0.785398163397448309616;
+ const double Math::two_pi = 2*3.14159265358979323846;
+
+ const double Math::e = 2.71828182845904523536;
+
+ const double Math::log_of_2 = log(2.0);
+ const double Math::log_of_4 = log(4.0);
+
+ int factorials[13] = {
+ 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880,
+ 3628800, 39916800, 479001600
+ };
+
+ double factorials_d[20] = {
+ 1.0, 1.0, 2.0, 6.0, 24.0, 120.0, 720.0, 5040.0, 40320.0, 362880.0,
+ 3628800.0, 39916800.0, 479001600.0, 6227020800.0, 87178291200.0,
+ 1307674368000.0, 20922789888000.0, 355687428096000.0,
+ 6402373705728000.0, 121645100408832000.0
+ };
+
+ int Math::binomial(int n, int k)
+ {
+ if(k>n/2) k = n-k;
+ if(k == 0) return 1;
+ int r = n;
+ for(int i = 2; i<=k; ++i)
+ r = (r * (n+1-i))/i;
+ return r;
+ }
+
+ double Math::binomial_d(int n, int k)
+ {
+ if(k>n/2) k = n-k;
+ if(k == 0) return 1.0;
+ double r = n;
+ for(int i = 2; i<=k; ++i)
+ r = (r * (n+1-i))/i;
+ return r;
+ }
+
+ int Math::factorial(int n)
+ {
+ if(n < 0) return 1;
+ if(n > 12) return INT_MAX; // not representable by int
+
+ return factorials[n];
+ }
+
+ double Math::factorial_d(int n)
+ {
+ if(n < 0) return 1.0;
+
+ double f = 1.0;
+ for(; n > 19; --n)
+ f *= n;
+
+ return f * factorials_d[n];
+ }
+
+} // namespace ogdf
diff --git a/ogdf/basic/Math.h b/ogdf/basic/Math.h
new file mode 100644
index 0000000..463ce5c
--- /dev/null
+++ b/ogdf/basic/Math.h
@@ -0,0 +1,150 @@
+/*
+ * $Revision: 2523 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-02 20:59:27 +0200 (Mon, 02 Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Mathematical Helpers
+ *
+ * \author Markus Chimani
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+#ifndef OGDF_MATH_H
+#define OGDF_MATH_H
+
+#include "basic.h"
+#include <math.h>
+
+namespace ogdf {
+
+
+//#define DOUBLE_EPS 0.000001
+
+
+class OGDF_EXPORT Math {
+
+public:
+ //! The constant \f$\pi\f$.
+ static const double pi;
+
+ //! The constant \f$\frac{\pi}{2}\f$.
+ static const double pi_2;
+
+ //! The constant \f$\frac{\pi}{4}\f$.
+ static const double pi_4;
+
+ //! The constant \f$2\pi\f$.
+ static const double two_pi;
+
+ //! Euler's number.
+ static const double e;
+
+ //! The constant log(2.0).
+ static const double log_of_2;
+
+ //! The constant log(4.0).
+ static const double log_of_4;
+
+ //! Returns the logarithm of \a x to the base 2.
+ static double log2(double x) {
+ OGDF_ASSERT(x >= 0)
+ return log(x) / log_of_2;
+ }
+
+ //! Returns the logarithm of \a x to the base 4.
+ static double log4(double x) {
+ OGDF_ASSERT(x >= 0)
+ return log(x) / log_of_4;
+ }
+
+ //! Returns \f$n \choose k\f$.
+ static int binomial(int n, int k);
+
+ //! Returns \f$n \choose k\f$.
+ static double binomial_d(int n, int k);
+
+ //! Returns \a n!.
+ static int factorial(int n);
+
+ //! Returns \a n!.
+ static double factorial_d(int n);
+
+ //static bool equald(double a, double b) {
+ // double d = a-b;
+ // return d < DOUBLE_EPS && d > -DOUBLE_EPS;
+ //}
+
+ /*!
+ * \brief A fast method to obtain the rounded down binary logarithm of an 32-bit integer
+ *
+ * This is based on http://en.wikipedia.org/wiki/Binary_logarithm
+ * @param v The number of which the binary logarithm is to be determined
+ * @return The rounded down logarithm base 2 if v is positive, -1 otherwise
+ */
+ static int floorLog2(int v) {
+ if (v <= 0) {
+ return -1;
+ } else {
+ int result = 0;
+ if (v >= (1 << 16)) {
+ v >>= 16;
+ result += 16;
+ }
+ if (v >= (1 << 8)) {
+ v >>= 8;
+ result += 8;
+ }
+ if (v >= (1 << 4)) {
+ v >>= 4;
+ result += 4;
+ }
+ if (v >= (1 << 2)) {
+ v >>= 2;
+ result += 2;
+ }
+ if (v >= (1 << 1)) {
+ result += 1;
+ }
+ return result;
+ }
+ }
+};
+
+
+}
+
+#endif // OGDF_MATH_H
diff --git a/ogdf/basic/NodeArray.h b/ogdf/basic/NodeArray.h
new file mode 100644
index 0000000..98510ad
--- /dev/null
+++ b/ogdf/basic/NodeArray.h
@@ -0,0 +1,227 @@
+/*
+ * $Revision: 2615 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-16 14:23:36 +0200 (Mo, 16. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration and implementation of NodeArray class
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_NODE_ARRAY_H
+#define OGDF_NODE_ARRAY_H
+
+
+#include "Graph_d.h"
+
+
+namespace ogdf {
+
+
+//! Abstract base class for node arrays.
+/**
+ * Defines the interface for event handling used by the Graph class.
+ * Use the parameterized class NodeArray for creating node arrays.
+ */
+class NodeArrayBase {
+ /**
+ * Pointer to list element in the list of all registered node
+ * arrays which references this array.
+ */
+ ListIterator<NodeArrayBase*> m_it;
+
+public:
+ const Graph *m_pGraph; //!< The associated graph.
+
+ //! Initializes an node array not associated with a graph.
+ NodeArrayBase() : m_pGraph(0) { }
+ //! Initializes an node array associated with \a pG.
+ NodeArrayBase(const Graph *pG) : m_pGraph(pG) {
+ if(pG) m_it = pG->registerArray(this);
+ }
+
+ // destructor, unregisters the array
+ virtual ~NodeArrayBase() {
+ if (m_pGraph) m_pGraph->unregisterArray(m_it);
+ }
+
+ // event interface used by Graph
+ //! Virtual function called when table size has to be enlarged.
+ virtual void enlargeTable(int newTableSize) = 0;
+ //! Virtual function called when table has to be reinitialized.
+ virtual void reinit(int initTableSize) = 0;
+ //! Virtual function called when array is disconnected from the graph.
+ virtual void disconnect() = 0;
+
+ //! Associates the array with a new graph.
+ void reregister(const Graph *pG) {
+ if (m_pGraph) m_pGraph->unregisterArray(m_it);
+ if ((m_pGraph = pG) != 0) m_it = pG->registerArray(this);
+ }
+}; // class NodeArrayBase
+
+
+//! Dynamic arrays indexed with nodes.
+/**
+ * Node arrays represent a mapping from nodes to data of type \a T.
+ * They adjust their table size automatically when the graph grows.
+ *
+ * @tparam T is the element type.
+ */
+template<class T> class NodeArray : private Array<T>, protected NodeArrayBase {
+ T m_x; //!< The default value for array elements.
+
+public:
+ //! Constructs an empty node array associated with no graph.
+ NodeArray() : Array<T>(), NodeArrayBase() { }
+ //! Constructs a node array associated with \a G.
+ NodeArray(const Graph &G) : Array<T>(G.nodeArrayTableSize()), NodeArrayBase(&G) { }
+ //! Constructs a node array associated with \a G.
+ /**
+ * @param G is the associated graph.
+ * @param x is the default value for all array elements.
+ */
+ NodeArray(const Graph &G, const T &x) :
+ Array<T>(0,G.nodeArrayTableSize()-1,x), NodeArrayBase(&G), m_x(x) { }
+ //! Constructs a node array that is a copy of \a A.
+ /**
+ * Associates the array with the same graph as \a A and copies all elements.
+ */
+ NodeArray(const NodeArray<T> &A) : Array<T>(A), NodeArrayBase(A.m_pGraph), m_x(A.m_x) { }
+
+ //! Returns true iff the array is associated with a graph.
+ bool valid() const { return (Array<T>::low() <= Array<T>::high()); }
+
+ //! Returns a pointer to the associated graph.
+ const Graph *graphOf() const {
+ return m_pGraph;
+ }
+
+ //! Returns a reference to the element with index \a v.
+ const T &operator[](node v) const {
+ OGDF_ASSERT(v != 0 && v->graphOf() == m_pGraph)
+ return Array<T>::operator [](v->index());
+ }
+
+ //! Returns a reference to the element with index \a v.
+ T &operator[](node v) {
+ OGDF_ASSERT(v != 0 && v->graphOf() == m_pGraph)
+ return Array<T>::operator [](v->index());
+ }
+
+ //! Returns a reference to the element with index \a index.
+ /**
+ * \attention Make sure that \a index is a valid index for a node
+ * in the associated graph!
+ */
+ const T &operator[](int index) const {
+ return Array<T>::operator [](index);
+ }
+
+ //! Returns a reference to the element with index \a index.
+ /**
+ * \attention Make sure that \a index is a valid index for a node
+ * in the associated graph!
+ */
+ T &operator[](int index) {
+ return Array<T>::operator [](index);
+ }
+
+ //! Assignment operator.
+ NodeArray<T> &operator=(const NodeArray<T> &a) {
+ Array<T>::operator =(a);
+ m_x = a.m_x;
+ reregister(a.m_pGraph);
+ return *this;
+ }
+
+ //! Reinitializes the array. Associates the array with no graph.
+ void init() {
+ Array<T>::init(); reregister(0);
+ }
+
+ //! Reinitializes the array. Associates the array with \a G.
+ void init(const Graph &G) {
+ Array<T>::init(G.nodeArrayTableSize()); reregister(&G);
+ }
+
+ //! Reinitializes the array. Associates the array with \a G.
+ /**
+ * @param G is the associated graph.
+ * @param x is the default value.
+ */
+ void init(const Graph &G, const T &x) {
+ Array<T>::init(0,G.nodeArrayTableSize()-1, m_x = x); reregister(&G);
+ }
+
+ //! Sets all array elements to \a x.
+ void fill(const T &x) {
+ int high = m_pGraph->maxNodeIndex();
+ if(high >= 0)
+ Array<T>::fill(0,high,x);
+ }
+
+private:
+ virtual void enlargeTable(int newTableSize) {
+ Array<T>::grow(newTableSize-Array<T>::size(),m_x);
+ }
+
+ virtual void reinit(int initTableSize) {
+ Array<T>::init(0,initTableSize-1,m_x);
+ }
+
+ virtual void disconnect() {
+ Array<T>::init();
+ m_pGraph = 0;
+ }
+
+ OGDF_NEW_DELETE
+
+}; // class NodeArray<T>
+
+
+} // end namespace ogdf
+
+#include "Graph.h"
+
+#endif
diff --git a/ogdf/basic/SList.h b/ogdf/basic/SList.h
new file mode 100644
index 0000000..c018df8
--- /dev/null
+++ b/ogdf/basic/SList.h
@@ -0,0 +1,1047 @@
+/*
+ * $Revision: 2615 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-16 14:23:36 +0200 (Mo, 16. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration and implementation of singly linked lists
+ * (SListPure<E> and SList<E>) and iterators (SListConstIterator<E>
+ * and SListIterator<E>).
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_SLIST_H
+#define OGDF_SLIST_H
+
+
+#include "../internal/basic/list_templates.h"
+
+
+namespace ogdf {
+
+
+template<class E> class SListPure;
+template<class E> class StackPure;
+template<class E> class SListIterator;
+template<class E> class SListConstIterator;
+
+
+//! The parameterized class \a SListElement<E> represents the structure for elements of singly linked lists.
+template<class E>
+class SListElement {
+ friend class SListPure<E>;
+ friend class StackPure<E>;
+ friend class SListIterator<E>;
+ friend class SListConstIterator<E>;
+
+ SListElement<E> *m_next; //!< Pointer to successor element.
+ E m_x; //!< Stores the content.
+
+ //! Constructs an SListElement.
+ SListElement() : m_next(0) { }
+ //! Constructs an SListElement.
+ SListElement(const E &x) : m_next(0), m_x(x) { }
+ //! Constructs an SListElement.
+ SListElement(const E &x, SListElement<E> *next) :
+ m_next(next), m_x(x) { }
+
+ OGDF_NEW_DELETE
+}; // class SListElement
+
+
+
+//! The parameterized class \a SListIterator<E> encapsulates a pointer to an slist element.
+/**
+ * It is used in order to iterate over singly linked lists,
+ * and to specify a position in a singly linked list. It is possible that
+ * an iterator encapsulates a null pointer.
+ */
+
+template<class E> class SListIterator {
+ SListElement<E> *m_pX; //!< Pointer to slist element.
+
+ friend class SListConstIterator<E>;
+ friend class SListPure<E>;
+
+ //! Conversion to pointer to slist element.
+ operator SListElement<E> *() { return m_pX; }
+ //! Conversion to pointer to slist element.
+ operator const SListElement<E> *() const { return m_pX; }
+
+public:
+ //! Constructs an iterator pointing to no element.
+ SListIterator() : m_pX(0) { }
+ //! Constructs an iterator pointing to \a pX.
+ SListIterator(SListElement<E> *pX) : m_pX(pX) { }
+ //! Constructs an iterator that is a copy of \a it.
+ SListIterator(const SListIterator<E> &it) : m_pX(it.m_pX) { }
+
+ //! Returns true iff the iterator points to an element.
+ bool valid() const { return m_pX != 0; }
+
+ //! Equality operator.
+ bool operator==(const SListIterator<E> &it) const {
+ return m_pX == it.m_pX;
+ }
+
+ //! Inequality operator.
+ bool operator!=(const SListIterator<E> &it) const {
+ return m_pX != it.m_pX;
+ }
+
+ //! Returns successor iterator.
+ SListIterator<E> succ() const { return m_pX->m_next; }
+
+ //! Returns a reference to the element content.
+ E &operator*() const { return m_pX->m_x; }
+
+ //! Assignment operator.
+ SListIterator<E> &operator=(const SListIterator<E> &it) {
+ m_pX = it.m_pX;
+ return *this;
+ }
+
+ //! Increment operator (prefix).
+ SListIterator<E> &operator++() {
+ m_pX = m_pX->m_next;
+ return *this;
+ }
+
+ //! Increment operator (postfix).
+ SListIterator<E> operator++(int) {
+ SListIterator<E> it = *this;
+ m_pX = m_pX->m_next;
+ return it;
+ }
+
+ OGDF_NEW_DELETE
+}; // class SListIterator
+
+
+
+//! The parameterized class \a SListIterator<E> encapsulates a constant pointer to an slist element.
+/**
+ * It is used in order to iterate over singly linked lists,
+ * and to specify a position in a singly linked list. It is possible that
+ * an iterator encapsulates a null pointer. In contrast to SListIterator,
+ * it is not possible to change the slist element pointed to.
+ */
+
+template<class E> class SListConstIterator {
+ const SListElement<E> *m_pX; //!< Pointer to slist element.
+
+ friend class SListPure<E>;
+
+ //! Conversion to pointer to slist element.
+ operator const SListElement<E> *() { return m_pX; }
+
+public:
+ //! Constructs an iterator pointing to no element.
+ SListConstIterator() : m_pX(0) { }
+
+ //! Constructs an iterator pointing to \a pX.
+ SListConstIterator(const SListElement<E> *pX) : m_pX(pX) { }
+
+ //! Constructs an iterator that is a copy of \a it.
+ SListConstIterator(const SListIterator<E> &it) : m_pX((const SListElement<E> *)it) { }
+ //! Constructs an iterator that is a copy of \a it.
+ SListConstIterator(const SListConstIterator &it) : m_pX(it.m_pX) { }
+
+ //! Returns true iff the iterator points to an element.
+ bool valid() const { return m_pX != 0; }
+
+ //! Equality operator.
+ bool operator==(const SListConstIterator<E> &it) const {
+ return m_pX == it.m_pX;
+ }
+
+ //! Inequality operator.
+ bool operator!=(const SListConstIterator<E> &it) const {
+ return m_pX != it.m_pX;
+ }
+
+ //! Returns successor iterator.
+ SListConstIterator<E> succ() const { return m_pX->m_next; }
+
+ //! Returns a reference to the element content.
+ const E &operator*() const { return m_pX->m_x; }
+
+ //! Assignment operator.
+ SListConstIterator<E> &operator=(const SListConstIterator<E> &it) {
+ m_pX = it.m_pX;
+ return *this;
+ }
+
+
+ //! Increment operator (prefix).
+ SListConstIterator<E> &operator++() {
+ m_pX = m_pX->m_next;
+ return *this;
+ }
+
+ //! Increment operator (postfix).
+ SListConstIterator<E> operator++(int) {
+ SListConstIterator<E> it = *this;
+ m_pX = m_pX->m_next;
+ return it;
+ }
+
+ OGDF_NEW_DELETE
+}; // class SListConstIterator
+
+
+//! The parameterized class \a SListPure<E> represents singly linked lists with content type \a E.
+/**
+ * Elements of the list are instances of type SListElement<E>.
+ * Use SListConstIterator<E> or SListIterator<E> in order to iterate over the list.
+ *
+ * In contrast to SList<E>, instances of \a SListPure<E> do not store the length of the list.
+ *
+ * @tparam E is the data type stored in list elements.
+ */
+
+template<class E> class SListPure {
+ SListElement<E> *m_head; //!< Pointer to first element.
+ SListElement<E> *m_tail; //!< Pointer to last element.
+
+public:
+ //! Constructs an empty singly linked list.
+ SListPure() : m_head(0), m_tail(0) { }
+
+ //! Constructs a singly linked list that is a copy of \a L.
+ SListPure(const SListPure<E> &L) : m_head(0), m_tail(0) {
+ copy(L);
+ }
+
+ // destruction
+ ~SListPure() { clear(); }
+
+ typedef E value_type;
+ typedef SListElement<E> element_type;
+ typedef SListConstIterator<E> const_iterator;
+ typedef SListIterator<E> iterator;
+
+ //! Returns true iff the list is empty.
+ bool empty() const { return m_head == 0; }
+
+ //! Returns the length of the list
+ /**
+ * Notice that this method requires to run through the whole list and takes linear running time!
+ */
+ int size() const {
+ int count = 0;
+ for (SListElement<E> *pX = m_head; pX; pX = pX->m_next)
+ ++count;
+ return count;
+ }
+
+ //! Returns an iterator to the first element of the list.
+ /**
+ * If the list is empty, a null pointer iterator is returned.
+ */
+ SListConstIterator<E> begin() const { return m_head; }
+
+ //! Returns an iterator to the first element of the list.
+ /**
+ * If the list is empty, a null pointer iterator is returned.
+ */
+ SListIterator<E> begin() { return m_head; }
+
+ //! Returns an iterator to one-past-last element of the list.
+ /**
+ * This is always a null pointer iterator.
+ */
+ SListConstIterator<E> end() const { return SListConstIterator<E>(); }
+
+ //! Returns an iterator to one-past-last element of the list.
+ /**
+ * This is always a null pointer iterator.
+ */
+ SListIterator<E> end() { return SListIterator<E>(); }
+
+ //! Returns an iterator to the last element of the list.
+ /**
+ * If the list is empty, a null pointer iterator is returned.
+ */
+ SListConstIterator<E> rbegin() const { return m_tail; }
+
+ //! Returns an iterator to the last element of the list.
+ /**
+ * If the list is empty, a null pointer iterator is returned.
+ */
+ SListIterator<E> rbegin() { return m_tail; }
+
+
+ //! Returns an iterator pointing to the element at position \a pos.
+ /**
+ * The running time of this method is linear in \a pos.
+ */
+ SListConstIterator<E> get(int pos) const {
+ SListElement<E> *pX;
+ for(pX = m_head; pX != 0; pX = pX->m_next)
+ if (pos-- == 0) break;
+ return pX;
+ }
+
+ //! Returns an iterator pointing to the element at position \a pos.
+ /**
+ * The running time of this method is linear in \a pos.
+ */
+ SListIterator<E> get(int pos) {
+ SListElement<E> *pX;
+ for(pX = m_head; pX != 0; pX = pX->m_next)
+ if (pos-- == 0) break;
+ return pX;
+ }
+
+ //! Returns the position (starting with 0) of \a it in the list.
+ /**
+ * Positions are numbered 0,1,...
+ * \pre \a it is an iterator pointing to an element in this list.
+ */
+ int pos(SListConstIterator<E> it) const {
+ OGDF_ASSERT(it.valid())
+ int p = 0;
+ for(SListElement<E> *pX = m_head; pX != 0; pX = pX->m_next, ++p)
+ if (pX == it) break;
+ return p;
+ }
+
+
+ //! Returns a reference to the first element.
+ /**
+ * \pre The list is not empty!
+ */
+ const E &front() const {
+ OGDF_ASSERT(m_head != 0)
+ return m_head->m_x;
+ }
+
+ //! Returns a reference to the first element.
+ /**
+ * \pre The list is not empty!
+ */
+ E &front() {
+ OGDF_ASSERT(m_head != 0)
+ return m_head->m_x;
+ }
+
+ //! Returns a reference to the last element.
+ /**
+ * \pre The list is not empty!
+ */
+ const E &back() const {
+ OGDF_ASSERT(m_tail != 0)
+ return m_tail->m_x;
+ }
+
+ //! Returns a reference to the last element.
+ /**
+ * \pre The list is not empty!
+ */
+ E &back() {
+ OGDF_ASSERT(m_tail != 0)
+ return m_tail->m_x;
+ }
+
+ //! Returns an iterator to the cyclic successor of \a it.
+ /**
+ * \pre \a it points to an element in this list!
+ */
+ SListConstIterator<E> cyclicSucc(SListConstIterator<E> it) const {
+ const SListElement<E> *pX = it;
+ return (pX->m_next) ? pX->m_next : m_head;
+ }
+
+ //! Returns an iterator to the cyclic successor of \a it.
+ /**
+ * \pre \a it points to an element in this list!
+ */
+ SListIterator<E> cyclicSucc(SListIterator<E> it) {
+ SListElement<E> *pX = it;
+ return (pX->m_next) ? pX->m_next : m_head;
+ }
+
+ //! Assignment operator.
+ SListPure<E> &operator=(const SListPure<E> &L) {
+ clear(); copy(L);
+ return *this;
+ }
+
+ //! Adds element \a x at the begin of the list.
+ SListIterator<E> pushFront(const E &x) {
+ m_head = OGDF_NEW SListElement<E>(x,m_head);
+ if (m_tail == 0) m_tail = m_head;
+ return m_head;
+ }
+
+ //! Adds element \a x at the end of the list.
+ SListIterator<E> pushBack(const E &x) {
+ SListElement<E> *pNew = OGDF_NEW SListElement<E>(x);
+ if (m_head == 0)
+ m_head = m_tail = pNew;
+ else
+ m_tail = m_tail->m_next = pNew;
+ return m_tail;
+ }
+
+ //! Inserts element \a x after \a pBefore.
+ /**
+ * \pre \a pBefore points to an element in this list.
+ */
+ SListIterator<E> insertAfter(const E &x, SListIterator<E> itBefore) {
+ SListElement<E> *pBefore = itBefore;
+ OGDF_ASSERT(pBefore != 0)
+ SListElement<E> *pNew = OGDF_NEW SListElement<E>(x,pBefore->m_next);
+ if (pBefore == m_tail) m_tail = pNew;
+ return (pBefore->m_next = pNew);
+ }
+
+ //! Removes the first element from the list.
+ /**
+ * \pre The list is not empty!
+ */
+ void popFront() {
+ OGDF_ASSERT(m_head != 0)
+ SListElement<E> *pX = m_head;
+ if ((m_head = m_head->m_next) == 0) m_tail = 0;
+ delete pX;
+ }
+
+ //! Removes the first element from the list and returns it.
+ /**
+ * \pre The list is not empty!
+ */
+ E popFrontRet() {
+ E el = front();
+ popFront();
+ return el;
+ }
+
+ //! Removes the succesor of \a pBefore.
+ /**
+ * \pre \a pBefore points to an element in this list.
+ */
+ void delSucc(SListIterator<E> itBefore) {
+ SListElement<E> *pBefore = itBefore;
+ OGDF_ASSERT(pBefore != 0)
+ SListElement<E> *pDel = pBefore->m_next;
+ OGDF_ASSERT(pDel != 0)
+ if ((pBefore->m_next = pDel->m_next) == 0) m_tail = pBefore;
+ delete pDel;
+ }
+
+ //! Moves the first element of this list to the begin of list \a L2.
+ void moveFrontToFront(SListPure<E> &L2) {
+ OGDF_ASSERT(m_head != 0)
+ OGDF_ASSERT(this != &L2)
+ SListElement<E> *pX = m_head;
+ if ((m_head = m_head->m_next) == 0) m_tail = 0;
+ pX->m_next = L2.m_head;
+ L2.m_head = pX;
+ if (L2.m_tail == 0) L2.m_tail = L2.m_head;
+ }
+
+ //! Moves the first element of this list to the end of list \a L2.
+ void moveFrontToBack(SListPure<E> &L2) {
+ OGDF_ASSERT(m_head != 0)
+ OGDF_ASSERT(this != &L2)
+ SListElement<E> *pX = m_head;
+ if ((m_head = m_head->m_next) == 0) m_tail = 0;
+ pX->m_next = 0;
+ if (L2.m_head == 0)
+ L2.m_head = L2.m_tail = pX;
+ else
+ L2.m_tail = L2.m_tail->m_next = pX;
+ }
+
+ //! Moves the first element of this list to list \a L2 inserted after \a itBefore.
+ /**
+ * \pre \a itBefore points to an element in \a L2.
+ */
+ void moveFrontToSucc(SListPure<E> &L2, SListIterator<E> itBefore) {
+ OGDF_ASSERT(m_head != 0)
+ OGDF_ASSERT(this != &L2)
+ SListElement<E> *pBefore = itBefore;
+ SListElement<E> *pX = m_head;
+ if ((m_head = m_head->m_next) == 0) m_tail = 0;
+ pX->m_next = pBefore->m_next;
+ pBefore->m_next = pX;
+ if (pBefore == L2.m_tail) L2.m_tail = pX;
+ }
+
+ //! Removes all elements from the list.
+ void clear() {
+ if (m_head == 0) return;
+
+#if (_MSC_VER == 1100)
+// workaround for bug in Visual Studio 5.0
+
+ while (!empty())
+ popFront();
+
+#else
+
+ if (doDestruction((E*)0)) {
+ for(SListElement<E> *pX = m_head; pX != 0; pX = pX->m_next)
+ pX->m_x.~E();
+ }
+ OGDF_ALLOCATOR::deallocateList(sizeof(SListElement<E>),m_head,m_tail);
+
+#endif
+
+ m_head = m_tail = 0;
+ }
+
+ //! Appends \a L2 to this list and makes \a L2 empty.
+ void conc(SListPure<E> &L2) {
+ if (m_head)
+ m_tail->m_next = L2.m_head;
+ else
+ m_head = L2.m_head;
+ if (L2.m_tail != 0) m_tail = L2.m_tail;
+ L2.m_head = L2.m_tail = 0;
+ }
+
+ //! Reverses the order of the list elements.
+ void reverse() {
+ SListElement<E> *p, *pNext, *pPred = 0;
+ for(p = m_head; p; p = pNext) {
+ pNext = p->m_next;
+ p->m_next = pPred;
+ pPred = p;
+ }
+ swap(m_head,m_tail);
+ }
+
+ //! Conversion to const SListPure.
+ const SListPure<E> &getListPure() const { return *this; }
+
+ //! Sorts the list using Quicksort.
+ void quicksort() {
+ ogdf::quicksortTemplate(*this);
+ }
+
+ //! Sorts the list using Quicksort and comparer \a comp.
+ template<class COMPARER>
+ void quicksort(const COMPARER &comp) {
+ ogdf::quicksortTemplate(*this,comp);
+ }
+
+ //! Sorts the list using bucket sort.
+ /**
+ * @param l is the lowest bucket that will occur.
+ * @param h is the highest bucket that will occur.
+ * @param f returns the bucket for each element.
+ * \pre The bucket function \a f will only return bucket values between \a l
+ * and \a h for this list.
+ */
+ void bucketSort(int l, int h, BucketFunc<E> &f);
+
+ //! Sorts the list using bucket sort.
+ void bucketSort(BucketFunc<E> &f);
+
+ //! Randomly permutes the elements in the list.
+ void permute() {
+ permute(size());
+ }
+
+ //! Scans the list for the specified element and returns its position in the list, or -1 if not found.
+ int search (const E& e) const {
+ int x = 0;
+ for(SListConstIterator<E> i = begin(); i.valid(); ++i, ++x)
+ if(*i == e) return x;
+ return -1;
+ }
+
+ //! Scans the list for the specified element (using the user-defined comparer) and returns its position in the list, or -1 if not found.
+ template<class COMPARER>
+ int search (const E& e, const COMPARER &comp) const {
+ int x = 0;
+ for(SListConstIterator<E> i = begin(); i.valid(); ++i, ++x)
+ if(comp.equal(*i,e)) return x;
+ return -1;
+ }
+
+protected:
+ void copy(const SListPure<E> &L) {
+ for(SListElement<E> *pX = L.m_head; pX != 0; pX = pX->m_next)
+ pushBack(pX->m_x);
+ }
+
+ void permute(const int n);
+
+ OGDF_NEW_DELETE
+}; // class SListPure
+
+
+
+//! The parameterized class \a SList<E> represents singly linked lists with content type \a E.
+/**
+ * Elements of the list are instances of type SListElement<E>.
+ * Use SListConstIterator<E> or SListIterator<E> in order to iterate over the list.
+ * In contrast to SListPure<E>, instances of \a SList<E> store the length of the list
+ * and thus allow constant time access to the length.
+ *
+ * @tparam E is the data type stored in list elements.
+ */
+
+template<class E>
+class SList : private SListPure<E> {
+
+ int m_count; //!< The length of the list.
+
+public:
+ //! Constructs an empty singly linked list.
+ SList() : m_count(0) { }
+
+ //! Constructs a singly linked list that is a copy of \a L.
+ SList(const SList<E> &L) : SListPure<E>(L), m_count(L.m_count) { }
+
+ // destruction
+ ~SList() { }
+
+ typedef E value_type;
+ typedef SListElement<E> element_type;
+ typedef SListConstIterator<E> const_iterator;
+ typedef SListIterator<E> iterator;
+
+ //! Returns true iff the list is empty.
+ bool empty() const { return SListPure<E>::empty(); }
+
+ //! Returns the length of the list.
+ int size() const { return m_count; }
+
+ //! Returns an iterator to the first element of the list.
+ /**
+ * If the list is empty, a null pointer iterator is returned.
+ */
+ const SListConstIterator<E> begin() const { return SListPure<E>::begin(); }
+
+ //! Returns an iterator to the first element of the list.
+ /**
+ * If the list is empty, a null pointer iterator is returned.
+ */
+ SListIterator<E> begin() { return SListPure<E>::begin(); }
+
+ //! Returns an iterator to one-past-last element of the list.
+ /**
+ * This is always a null pointer iterator.
+ */
+ SListConstIterator<E> end() const { return SListConstIterator<E>(); }
+
+ //! Returns an iterator to one-past-last element of the list.
+ /**
+ * This is always a null pointer iterator.
+ */
+ SListIterator<E> end() { return SListIterator<E>(); }
+
+ //! Returns an iterator to the last element of the list.
+ /**
+ * If the list is empty, a null pointer iterator is returned.
+ */
+ const SListConstIterator<E> rbegin() const { return SListPure<E>::rbegin(); }
+
+ //! Returns an iterator to the last element of the list.
+ /**
+ * If the list is empty, a null pointer iterator is returned.
+ */
+ SListIterator<E> rbegin() { return SListPure<E>::rbegin(); }
+
+
+ //! Returns an iterator pointing to the element at position \a pos.
+ /**
+ * The running time of this method is linear in \a pos.
+ */
+ SListConstIterator<E> get(int pos) const {
+ return SListPure<E>::get(pos);
+ }
+
+ //! Returns an iterator pointing to the element at position \a pos.
+ /**
+ * The running time of this method is linear in \a pos.
+ */
+ SListIterator<E> get(int pos) {
+ return SListPure<E>::get(pos);
+ }
+
+ //! Returns the position (starting with 0) of \a it in the list.
+ /**
+ * Positions are numbered 0,1,...
+ * \pre \a it is an iterator pointing to an element in this list.
+ */
+ int pos(SListConstIterator<E> it) const {
+ return SListPure<E>::pos(it);;
+ }
+
+
+ //! Returns a reference to the first element.
+ /**
+ * \pre The list is not empty!
+ */
+ const E &front() const { return SListPure<E>::front(); }
+
+ //! Returns a reference to the first element.
+ /**
+ * \pre The list is not empty!
+ */
+ E &front() { return SListPure<E>::front(); }
+
+ //! Returns a reference to the last element.
+ /**
+ * \pre The list is not empty!
+ */
+ const E &back() const { return SListPure<E>::back(); }
+
+ //! Returns a reference to the last element.
+ /**
+ * \pre The list is not empty!
+ */
+ E &back() { return SListPure<E>::back(); }
+
+ //! Returns an iterator to the cyclic successor of \a it.
+ /**
+ * \pre \a it points to an element in this list!
+ */
+ SListConstIterator<E> cyclicSucc(SListConstIterator<E> it) const {
+ return SListPure<E>::cyclicSucc(it);
+ }
+
+ //! Returns an iterator to the cyclic successor of \a it.
+ /**
+ * \pre \a it points to an element in this list!
+ */
+ SListIterator<E> cyclicSucc(SListIterator<E> it) {
+ return SListPure<E>::cyclicSucc(it);
+ }
+
+ //! Assignment operator.
+ SList<E> &operator=(const SList<E> &L) {
+ SListPure<E>::operator=(L);
+ m_count = L.m_count;
+ return *this;
+ }
+
+ //! Adds element \a x at the begin of the list.
+ SListIterator<E> pushFront(const E &x) {
+ ++m_count;
+ return SListPure<E>::pushFront(x);
+ }
+
+ //! Adds element \a x at the end of the list.
+ SListIterator<E> pushBack(const E &x) {
+ ++m_count;
+ return SListPure<E>::pushBack(x);
+ }
+
+ //! Inserts element \a x after \a pBefore.
+ /**
+ * \pre \a pBefore points to an element in this list.
+ */
+ SListIterator<E> insertAfter(const E &x, SListIterator<E> itBefore) {
+ ++m_count;
+ return SListPure<E>::insertAfter(x, itBefore);
+ }
+
+ //! Removes the first element from the list.
+ /**
+ * \pre The list is not empty!
+ */
+ void popFront() {
+ --m_count;
+ SListPure<E>::popFront();
+ }
+
+ //! Removes the first element from the list and returns it.
+ /**
+ * \pre The list is not empty!
+ */
+ E popFrontRet() {
+ E el = front();
+ popFront();
+ return el;
+ }
+
+ //! Removes the succesor of \a pBefore.
+ /**
+ * \pre \a pBefore points to an element in this list.
+ */
+ void delSucc(SListIterator<E> itBefore) {
+ --m_count;
+ SListPure<E>::delSucc(itBefore);
+ }
+
+ //! Moves the first element of this list to the begin of list \a L2.
+ void moveFrontToFront(SList<E> &L2) {
+ SListPure<E>::moveFrontToFront(L2);
+ --m_count; ++L2.m_count;
+ }
+
+ //! Moves the first element of this list to the end of list \a L2.
+ void moveFrontToBack(SList<E> &L2) {
+ SListPure<E>::moveFrontToBack(L2);
+ --m_count; ++L2.m_count;
+ }
+
+ //! Moves the first element of this list to list \a L2 inserted after \a itBefore.
+ /**
+ * \pre \a itBefore points to an element in \a L2.
+ */
+ void moveFrontToSucc(SList<E> &L2, SListIterator<E> itBefore) {
+ SListPure<E>::moveFrontToSucc(L2,itBefore);
+ --m_count; ++L2.m_count;
+ }
+
+ //! Removes all elements from the list.
+ void clear() {
+ m_count = 0;
+ SListPure<E>::clear();
+ }
+
+ //! Appends \a L2 to this list and makes \a L2 empty.
+ void conc(SList<E> &L2) {
+ SListPure<E>::conc(L2);
+ m_count += L2.m_count;
+ L2.m_count = 0;
+ }
+
+ //! Reverses the order of the list elements.
+ void reverse() {
+ SListPure<E>::reverse();
+ }
+
+ //! Conversion to const SListPure.
+ const SListPure<E> &getListPure() const { return *this; }
+
+ //! Sorts the list using Quicksort.
+ void quicksort() {
+ ogdf::quicksortTemplate(*this);
+ }
+
+ //! Sorts the list using Quicksort and comparer \a comp.
+ template<class COMPARER>
+ void quicksort(const COMPARER &comp) {
+ ogdf::quicksortTemplate(*this,comp);
+ }
+
+ //! Sorts the list using bucket sort.
+ /**
+ * @param l is the lowest bucket that will occur.
+ * @param h is the highest bucket that will occur.
+ * @param f returns the bucket for each element.
+ * \pre The bucket function \a f will only return bucket values between \a l
+ * and \a h for this list.
+ */
+ void bucketSort(int l, int h, BucketFunc<E> &f) {
+ SListPure<E>::bucketSort(l,h,f);
+ }
+
+ //! Sorts the list using bucket sort.
+ void bucketSort(BucketFunc<E> &f) {
+ SListPure<E>::bucketSort(f);
+ }
+
+ //! Randomly permutes the elements in the list.
+ void permute() {
+ SListPure<E>::permute(m_count);
+ }
+
+ //! Scans the list for the specified element and returns its position in the list, or -1 if not found.
+ int search (const E& e) const {
+ return SListPure<E>::search(e);
+ }
+
+ //! Scans the list for the specified element (using the user-defined comparer) and returns its position in the list, or -1 if not found.
+ template<class COMPARER>
+ int search (const E& e, const COMPARER &comp) const {
+ return SListPure<E>::search(e, comp);
+ }
+
+ OGDF_NEW_DELETE
+}; // class SList
+
+
+
+
+// sorts list L using bucket sort
+// computes l and h value
+template<class E>
+void SListPure<E>::bucketSort(BucketFunc<E> &f)
+{
+ // if less than two elements, nothing to do
+ if (m_head == m_tail) return;
+
+ int l, h;
+ l = h = f.getBucket(m_head->m_x);
+
+ SListElement<E> *pX;
+ for(pX = m_head->m_next; pX; pX = pX->m_next)
+ {
+ int i = f.getBucket(pX->m_x);
+ if (i < l) l = i;
+ if (i > h) h = i;
+ }
+
+ bucketSort(l,h,f);
+}
+
+
+// sorts list L using bucket sort
+template<class E>
+void SListPure<E>::bucketSort(int l, int h, BucketFunc<E> &f)
+{
+ // if less than two elements, nothing to do
+ if (m_head == m_tail) return;
+
+ Array<SListElement<E> *> head(l,h,0), tail(l,h);
+
+ SListElement<E> *pX;
+ for (pX = m_head; pX; pX = pX->m_next) {
+ int i = f.getBucket(pX->m_x);
+ if (head[i])
+ tail[i] = (tail[i]->m_next = pX);
+ else
+ head[i] = tail[i] = pX;
+ }
+
+ SListElement<E> *pY = 0;
+ for (int i = l; i <= h; i++) {
+ pX = head[i];
+ if (pX) {
+ if (pY)
+ pY->m_next = pX;
+ else
+ m_head = pX;
+ pY = tail[i];
+ }
+ }
+
+ m_tail = pY;
+ pY->m_next = 0;
+}
+
+
+// permutes elements in list randomly; n is the length of the list
+template<class E>
+void SListPure<E>::permute(const int n)
+{
+ Array<SListElement<E> *> A(n+1);
+ A[n] = 0;
+
+ int i = 0;
+ SListElement<E> *pX;
+ for (pX = m_head; pX; pX = pX->m_next)
+ A[i++] = pX;
+
+ A.permute(0,n-1);
+
+ for (i = 0; i < n; i++) {
+ A[i]->m_next = A[i+1];
+ }
+
+ m_head = A[0];
+ m_tail = A[n-1];
+}
+
+// prints list to output stream os using delimiter delim
+template<class E>
+void print(ostream &os, const SListPure<E> &L, char delim = ' ')
+{
+ SListConstIterator<E> pX = L.begin();
+ if (pX.valid()) {
+ os << *pX;
+ for(++pX; pX.valid(); ++pX)
+ os << delim << *pX;
+ }
+}
+
+// prints list to output stream os using delimiter delim
+template<class E>
+void print(ostream &/*os*/, const SList<E> &L, char delim = ' ')
+{
+ print(L.getListPure(), delim);
+}
+
+// output operator
+template<class E>
+ostream &operator<<(ostream &os, const SListPure<E> &L)
+{
+ print(os,L);
+ return os;
+}
+
+template<class E>
+ostream &operator<<(ostream &os, const SList<E> &L)
+{
+ return operator<<(os,L.getListPure());
+}
+
+
+// sort array using bucket sort and bucket object f;
+// the values of f must be in the interval [min,max]
+template<class E>
+void bucketSort(Array<E> &a, int min, int max, BucketFunc<E> &f)
+{
+ if (a.low() >= a.high()) return;
+
+ Array<SListPure<E> > bucket(min,max);
+
+ int i;
+ for(i = a.low(); i <= a.high(); ++i)
+ bucket[f.getBucket(a[i])].pushBack(a[i]);
+
+ i = a.low();
+ for(int j = min; j <= max; ++j) {
+ SListConstIterator<E> it = bucket[j].begin();
+ for(; it.valid(); ++it)
+ a[i++] = *it;
+ }
+}
+
+
+
+
+} // namespace ogdf
+
+
+#endif
diff --git a/ogdf/basic/Stack.h b/ogdf/basic/Stack.h
new file mode 100644
index 0000000..c3e4170
--- /dev/null
+++ b/ogdf/basic/Stack.h
@@ -0,0 +1,252 @@
+/*
+ * $Revision: 2615 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-16 14:23:36 +0200 (Mo, 16. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration and implementation of list-based stacks
+ * (StackPure<E> and Stack<E>).
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_STACK_H
+#define OGDF_STACK_H
+
+
+#include "SList.h"
+
+
+namespace ogdf {
+
+
+//! List-based stacks.
+/**
+ * In contrast to Stack<E>, instances of \a StackPure<E> do not store the
+ * number of elements contained in the stack.
+ *
+ * @tparam E is the element type.
+ */
+template<class E> class StackPure
+{
+ struct Element {
+ Element(const E &x, Element *pNext) : m_next(pNext), m_x(x) { }
+ Element *m_next;
+ E m_x;
+ OGDF_NEW_DELETE
+ };
+
+ Element *m_head;
+
+public:
+ //! Constructs an empty stack.
+ StackPure() { m_head = 0; }
+
+ //! Constructs a stack that is a copy of \a S.
+ StackPure(const StackPure<E> &S) {
+ m_head = 0;
+ copy(S);
+ }
+
+ // destruction
+ ~StackPure() {
+ clear();
+ }
+
+ //! Returns true iff the stack is empty.
+ bool empty() const { return m_head == 0; }
+
+ //! Returns a reference to the top element.
+ const E &top() const {
+ return m_head->m_x;
+ }
+
+ //! Returns a reference to the top element.
+ E &top() {
+ return m_head->m_x;
+ }
+
+ //! Assignment operator.
+ StackPure<E> &operator=(const StackPure<E> &S) {
+ clear();
+ copy(S);
+ return *this;
+ }
+
+ //! Adds element \a x as top-most element to the stack.
+ void push(const E &x) {
+ m_head = OGDF_NEW Element(x,m_head);
+ }
+
+ //! Removes the top-most element from the stack and returns it.
+ E pop() {
+ OGDF_ASSERT(m_head != 0)
+ Element *pX = m_head;
+ m_head = m_head->m_next;
+ E x = pX->m_x;
+ delete pX;
+ return x;
+ }
+
+ //! Makes the stack empty.
+ void clear() {
+ while(m_head) {
+ Element *pX = m_head;
+ m_head = m_head->m_next;
+ delete pX;
+ }
+ }
+
+ void print(ostream &os, char delim = ' ') const
+ {
+ Element *pX = m_head;
+ if (pX != 0) {
+ os << pX->m_x;
+ for(pX = pX->m_next; pX != 0; pX = pX->m_next)
+ os << delim << pX->m_x;
+ }
+ }
+
+private:
+ void copy(const StackPure<E> &S) {
+ Element **p = &m_head;
+
+ for(Element *q = S.m_head; q != 0; q = q->m_next) {
+ *p = OGDF_NEW Element(q->m_x,0);
+ p = &(*p)->m_next;
+ }
+ }
+
+ OGDF_NEW_DELETE
+}; // class StackPure
+
+
+//! The parameterized class \a Stack<E> implements list-based stacks
+/**
+ * In contrast to StackPure<E>, instances of \a Stack<E> store the
+ * number of elements contained in the stack.
+ *
+ * @tparam E is the element type.
+ */
+template<class E> class Stack : private StackPure<E>
+{
+ int m_count; //! The number of elements in the list.
+
+public:
+ //! Constructs an empty stack.
+ Stack() { m_count = 0; }
+
+ //! Constructs a stack that is a copy of \a S.
+ Stack(const Stack<E> &S) : StackPure<E>(S) { m_count = S.m_count; }
+
+ // destruction
+ ~Stack() { }
+
+ //! Returns true iff the stack is empty.
+ bool empty() const { return StackPure<E>::empty(); }
+
+ //! Returns the number of elements contained in the stack.
+ int size() const { return m_count; }
+
+ //! Returns a reference to the top element.
+ const E &top() const {
+ return StackPure<E>::top();
+ }
+
+ //! Returns a reference to the top element.
+ E &top() {
+ return StackPure<E>::top();
+ }
+
+ //! Assignment operator.
+ Stack<E> &operator=(const Stack<E> &S) {
+ StackPure<E>::operator=(S);
+ m_count = S.m_count;
+ return *this;
+ }
+
+ //! Adds element \a x as top-most element to the stack.
+ void push(const E &x) {
+ ++m_count;
+ return StackPure<E>::push(x);
+ }
+
+ //! Removes the top-most element from the stack and returns it.
+ E pop() {
+ --m_count;
+ return StackPure<E>::pop();
+ }
+
+ //! Makes the stack empty.
+ void clear() {
+ StackPure<E>::clear();
+ m_count = 0;
+ }
+
+ void print(ostream &os, char delim = ' ') const {
+ StackPure<E>::print(os,delim);
+ }
+
+ OGDF_NEW_DELETE
+}; // class Stack
+
+
+
+template<class E>
+ostream &operator<<(ostream &os, const StackPure<E> &S)
+{
+ S.print(os);
+ return os;
+}
+
+
+template<class E>
+ostream &operator<<(ostream &os, const Stack<E> &S)
+{
+ S.print(os);
+ return os;
+}
+
+} // end namespace ogdf
+
+
+#endif
diff --git a/ogdf/basic/String.cpp b/ogdf/basic/String.cpp
new file mode 100644
index 0000000..67e84ab
--- /dev/null
+++ b/ogdf/basic/String.cpp
@@ -0,0 +1,219 @@
+/*
+ * $Revision: 2565 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-07 17:14:54 +0200 (Sa, 07. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of class String
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+#include "String.h"
+#include "Hashing.h"
+#include <stdarg.h>
+#include <string.h>
+
+
+namespace ogdf {
+
+
+char String::s_pBuffer[OGDF_STRING_BUFFER_SIZE];
+
+
+String::String()
+{
+ m_pChar = new char[1];
+ if (m_pChar == 0) OGDF_THROW(InsufficientMemoryException);
+
+ m_pChar[0] = 0;
+ m_length = 0;
+}
+
+
+String::String(const char c)
+{
+ m_length = 1;
+ m_pChar = new char[2];
+ if (m_pChar == 0) OGDF_THROW(InsufficientMemoryException);
+
+ m_pChar[0] = c;
+ m_pChar[1] = '\0';
+}
+
+
+String::String(const char *str)
+{
+ m_length = strlen(str);
+ m_pChar = new char[m_length+1];
+ if (m_pChar == 0) OGDF_THROW(InsufficientMemoryException);
+
+ ogdf::strcpy(m_pChar,m_length+1,str);
+}
+
+
+String::String(size_t maxLen, const char *str)
+{
+ m_length = maxLen;
+ m_pChar = new char[m_length+1];
+ if (m_pChar == 0) OGDF_THROW(InsufficientMemoryException);
+
+ ogdf::strncpy(m_pChar, m_length+1, str, m_length);
+ m_pChar[m_length] = '\0';
+}
+
+/*
+String::String(const char *format, ...)
+{
+ va_list argList;
+ va_start(argList,format);
+
+ m_length = vsprintf(s_pBuffer,format,argList);
+ m_pChar = new char[m_length+1];
+ if (m_pChar == 0) OGDF_THROW(InsufficientMemoryException);
+
+ strcpy(m_pChar,s_pBuffer);
+}
+*/
+
+String::String(const String &str)
+{
+ m_length = str.m_length;
+ m_pChar = new char[m_length+1];
+ if (m_pChar == 0) OGDF_THROW(InsufficientMemoryException);
+
+ ogdf::strcpy(m_pChar,m_length+1,str.m_pChar);
+}
+
+
+String::~String()
+{
+ delete [] m_pChar;
+}
+
+
+String &String::operator =(const String &str)
+{
+ if (&str == this) return *this;
+
+ delete [] m_pChar;
+
+ m_length = str.m_length;
+ m_pChar = new char[m_length+1];
+ if (m_pChar == 0) OGDF_THROW(InsufficientMemoryException);
+
+ ogdf::strcpy(m_pChar,m_length+1,str.m_pChar);
+
+ return *this;
+}
+
+
+String &String::operator =(const char *str)
+{
+ delete [] m_pChar;
+
+ m_length = strlen(str);
+ m_pChar = new char[m_length+1];
+ if (m_pChar == 0) OGDF_THROW(InsufficientMemoryException);
+
+ ogdf::strcpy(m_pChar,m_length+1,str);
+
+ return *this;
+}
+
+
+String &String::operator +=(const String &str)
+{
+ size_t oldLength = m_length;
+ char *pOldChar = m_pChar;
+
+ m_length += str.m_length;
+ m_pChar = new char[m_length+1];
+ if (m_pChar == 0) {
+ delete [] pOldChar;
+ OGDF_THROW(InsufficientMemoryException);
+ }
+
+ ogdf::strcpy(m_pChar,m_length+1,pOldChar);
+ ogdf::strcpy(m_pChar+oldLength,m_length+1-oldLength,str.m_pChar);
+
+ delete [] pOldChar;
+
+ return *this;
+}
+
+
+void String::sprintf(const char *format, ...)
+{
+ delete [] m_pChar;
+
+ va_list argList;
+ va_start(argList,format);
+
+ m_length = ogdf::vsprintf(s_pBuffer,OGDF_STRING_BUFFER_SIZE,format,argList);
+ m_pChar = new char[m_length+1];
+ if (m_pChar == 0) OGDF_THROW(InsufficientMemoryException);
+
+ ogdf::strcpy(m_pChar,m_length+1,s_pBuffer);
+}
+
+
+int String::compare (const String &x, const String &y)
+{
+ return strcmp(x.m_pChar, y.m_pChar);
+}
+
+
+istream& operator>>(istream& is, String &str)
+{
+ is >> String::s_pBuffer;
+ str = String::s_pBuffer;
+ return is;
+}
+
+int DefHashFunc<String>::hash(const String &key) const
+{
+ int hashValue = 0;
+ const char *pChar = key.cstr();
+
+ while (*pChar)
+ hashValue += int(*pChar++);
+
+ return hashValue;
+}
+
+
+} // end namespace ogdf
diff --git a/ogdf/basic/String.h b/ogdf/basic/String.h
new file mode 100644
index 0000000..ada0753
--- /dev/null
+++ b/ogdf/basic/String.h
@@ -0,0 +1,232 @@
+/*
+ * $Revision: 2619 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-16 16:05:39 +0200 (Mo, 16. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of class String.
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_STRING_H
+#define OGDF_STRING_H
+
+
+#include "basic.h"
+#include "Hashing.h"
+
+
+#define OGDF_STRING_BUFFER_SIZE 1024
+
+
+namespace ogdf {
+
+
+//! Representation of character strings.
+/**
+ * Strings are internally stored as an Ascii character array. The positions
+ * within a string a numbered 0,1,...
+ */
+class OGDF_EXPORT String {
+
+ char *m_pChar; //!< Pointer to characters.
+ size_t m_length; //!< The length of the string (number of characters).
+
+ static char s_pBuffer[OGDF_STRING_BUFFER_SIZE]; //!< Temporary buffer used by sprintf().
+
+public:
+ //! Constructs an empty string, i.e., a string with length 0.
+ String();
+ //! Constructs a string consisting of a single character \a c.
+ String(const char c);
+ //! Constructs a string that is a copy of \a str.
+ String(const char *str);
+ //String(const char *format, ...);
+ //! Constructs a string consisting of the first \a maxLen characters of \a str.
+ /**
+ * @param maxLen is the number of characters to be copied from the begin of \a str.
+ * If \a str is shorter than \a maxLen, then the complete string is copied.
+ * @param str is the string to be copied.
+ */
+ String(size_t maxLen, const char *str);
+ //! Constructs a string that is a copy of \a str.
+ String(const String &str);
+
+ ~String();
+
+ //! Cast a string into a 0-terminated C++ string.
+ //operator const char *() const { return m_pChar; }
+ const char *cstr() const { return m_pChar; }
+
+ //! Returns the length of the string.
+ size_t length() const { return m_length; }
+
+ //! Returns a reference to the character at position \a i.
+ char &operator[](size_t i) {
+ OGDF_ASSERT(i < m_length)
+ return m_pChar[i];
+ }
+
+ //! Returns a reference to the character at position \a i.
+ const char &operator[](size_t i) const {
+ OGDF_ASSERT(i < m_length)
+ return m_pChar[i];
+ }
+
+ //! Equality operator.
+ friend bool operator==(const String &x, const String &y) {
+ return (compare(x,y) == 0);
+ }
+ //! Equality operator.
+ friend bool operator==(const char *x, const String &y) {
+ return (compare(x,y) == 0);
+ }
+ //! Equality operator.
+ friend bool operator==(const String &x, const char *y) {
+ return (compare(x,y) == 0);
+ }
+
+ //! Inequality operator.
+ friend bool operator!=(const String &x, const String &y) {
+ return (compare(x,y) != 0);
+ }
+ //! Inequality operator.
+ friend bool operator!=(const char *x, const String &y) {
+ return (compare(x,y) != 0);
+ }
+ //! Inequality operator.
+ friend bool operator!=(const String &x, const char *y) {
+ return (compare(x,y) != 0);
+ }
+
+ //! Less than operator.
+ friend bool operator<(const String &x, const String &y) {
+ return (compare(x,y) < 0);
+ }
+ //! Less than operator.
+ friend bool operator<(const char *x, const String &y) {
+ return (compare(x,y) < 0);
+ }
+ //! Less than operator.
+ friend bool operator<(const String &x, const char *y) {
+ return (compare(x,y) < 0);
+ }
+
+ //! Less or equal than operator.
+ friend bool operator<=(const String &x, const String &y) {
+ return (compare(x,y) <= 0);
+ }
+ //! Less or equal than operator.
+ friend bool operator<=(const char *x, const String &y) {
+ return (compare(x,y) <= 0);
+ }
+ //! Less or equal than operator.
+ friend bool operator<=(const String &x, const char *y) {
+ return (compare(x,y) <= 0);
+ }
+
+ //! Greater than operator.
+ friend bool operator>(const String &x, const String &y) {
+ return (compare(x,y) > 0);
+ }
+ //! Greater than operator.
+ friend bool operator>(const char *x, const String &y) {
+ return (compare(x,y) > 0);
+ }
+ //! Greater than operator.
+ friend bool operator>(const String &x, const char *y) {
+ return (compare(x,y) > 0);
+ }
+
+ //! Greater or equal than operator.
+ friend bool operator>=(const String &x, const String &y) {
+ return (compare(x,y) >= 0);
+ }
+ //! Greater or equal than operator.
+ friend bool operator>=(const char *x, const String &y) {
+ return (compare(x,y) >= 0);
+ }
+ //! Greater or equal than operator.
+ friend bool operator>=(const String &x, const char *y) {
+ return (compare(x,y) >= 0);
+ }
+
+ //! Assignment operator.
+ String &operator=(const String &str);
+ //! Assignment operator.
+ String &operator=(const char *str);
+
+ //! Appends string \a str to this string.
+ String &operator+=(const String &str);
+
+ //! Formatted assignment operator.
+ /**
+ * Behaves essentially like the C function \c printf().
+ */
+ void sprintf(const char *format, ...);
+
+ //! Compare function for strings.
+ static int compare (const String &x, const String &y);
+
+ //! Input operator.
+ friend istream& operator>>(istream& is, String &str);
+
+ OGDF_NEW_DELETE
+};
+
+//! Output operator for strings.
+inline ostream &operator<<(ostream &os, const String &str) {
+ os << str.cstr();
+ return os;
+}
+
+template<> class DefHashFunc<String> {
+public:
+ int hash(const String &key) const;
+};
+
+
+} // end namespace ogdf
+
+
+#endif
diff --git a/ogdf/basic/System.cpp b/ogdf/basic/System.cpp
new file mode 100644
index 0000000..2c8891a
--- /dev/null
+++ b/ogdf/basic/System.cpp
@@ -0,0 +1,444 @@
+/*
+ * $Revision: 2633 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-18 09:09:28 +0200 (Mi, 18. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of System class.
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "basic.h"
+
+#ifdef __APPLE__
+#include <stdlib.h>
+#include <malloc/malloc.h>
+#include <sys/types.h>
+#include <sys/sysctl.h>
+#include <sys/utsname.h>
+#include <mach/vm_statistics.h>
+#include <mach/mach.h>
+#include <mach/machine.h>
+#elif defined(OGDF_SYSTEM_UNIX)
+#include <malloc.h>
+#endif
+
+#if defined(OGDF_SYSTEM_WINDOWS) || defined(__CYGWIN__)
+#include <Psapi.h>
+#endif
+
+#ifdef _MSC_VER
+#include <intrin.h>
+
+#elif defined(OGDF_SYSTEM_UNIX) || (defined(__MINGW32__) && !defined(__MINGW64__))
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/time.h>
+
+static void __cpuid(int CPUInfo[4], int infoType)
+{
+ uint32_t a = CPUInfo[0];
+ uint32_t b = CPUInfo[1];
+ uint32_t c = CPUInfo[2];
+ uint32_t d = CPUInfo[3];
+
+#if defined(__i386__) || defined(__x86_64__) && !defined(__APPLE__)
+ __asm__ __volatile__ ("xchgl %%ebx,%0\n\t"
+ "cpuid \n\t"
+ "xchgl %%ebx,%0\n\t"
+ : "+r" (b), "=a" (a), "=c" (c), "=d" (d)
+ : "1" (infoType), "2" (c));
+#else
+ // not supported on other systems!
+ a = b = c = d = 0;
+ infoType = 0;
+#endif
+
+ CPUInfo[0] = a;
+ CPUInfo[1] = b;
+ CPUInfo[2] = c;
+ CPUInfo[3] = d;
+}
+#endif
+
+
+namespace ogdf {
+
+unsigned int System::s_cpuFeatures;
+int System::s_cacheSize;
+int System::s_cacheLine;
+int System::s_pageSize;
+int System::s_numberOfProcessors;
+
+
+#if defined(OGDF_SYSTEM_WINDOWS) || defined(__CYGWIN__)
+LARGE_INTEGER System::s_HPCounterFrequency;
+#endif
+
+
+void System::init()
+{
+ s_cpuFeatures = 0;
+ s_cacheSize = 0;
+ s_cacheLine = 0;
+
+ // currently not working for shared libs on Linux
+#if !defined(OGDF_DLL) || !defined(OGDF_SYSTEM_UNIX)
+
+ int CPUInfo[4] = {-1};
+ __cpuid(CPUInfo, 0);
+
+ unsigned int nIds = CPUInfo[0];
+ if(nIds >= 1)
+ {
+ __cpuid(CPUInfo, 1);
+
+ int featureInfoECX = CPUInfo[2];
+ int featureInfoEDX = CPUInfo[3];
+
+ if(featureInfoEDX & (1 << 23)) s_cpuFeatures |= cpufmMMX;
+ if(featureInfoEDX & (1 << 25)) s_cpuFeatures |= cpufmSSE;
+ if(featureInfoEDX & (1 << 26)) s_cpuFeatures |= cpufmSSE2;
+ if(featureInfoECX & (1 << 0)) s_cpuFeatures |= cpufmSSE3;
+ if(featureInfoECX & (1 << 9)) s_cpuFeatures |= cpufmSSSE3;
+ if(featureInfoECX & (1 << 19)) s_cpuFeatures |= cpufmSSE4_1;
+ if(featureInfoECX & (1 << 20)) s_cpuFeatures |= cpufmSSE4_2;
+ if(featureInfoECX & (1 << 5)) s_cpuFeatures |= cpufmVMX;
+ if(featureInfoECX & (1 << 6)) s_cpuFeatures |= cpufmSMX;
+ if(featureInfoECX & (1 << 7)) s_cpuFeatures |= cpufmEST;
+ if(featureInfoECX & (1 << 3)) s_cpuFeatures |= cpufmMONITOR;
+ }
+
+ __cpuid(CPUInfo, 0x80000000);
+ unsigned int nExIds = CPUInfo[0];
+
+ if(nExIds >= 0x80000006) {
+ __cpuid(CPUInfo, 0x80000006);
+ s_cacheLine = CPUInfo[2] & 0xff;
+ s_cacheSize = (CPUInfo[2] >> 16) & 0xffff;
+ }
+
+#if defined(OGDF_SYSTEM_WINDOWS) || defined(__CYGWIN__)
+ QueryPerformanceFrequency(&s_HPCounterFrequency);
+
+ SYSTEM_INFO siSysInfo;
+ GetSystemInfo(&siSysInfo);
+ s_pageSize = siSysInfo.dwPageSize;
+ s_numberOfProcessors = siSysInfo.dwNumberOfProcessors;
+
+#elif defined(OGDF_SYSTEM_UNIX) && defined(__APPLE__)
+ unsigned long long value;
+ size_t size = sizeof( value );
+ if (sysctlbyname("hw.pagesize", &value, &size, NULL, 0) !=-1)
+ s_pageSize = (int)value;
+ else
+ s_pageSize = 0;
+
+ if (sysctlbyname("hw.ncpu", &value, &size, NULL, 0) !=-1)
+ s_numberOfProcessors = (int)value;
+ else
+ s_numberOfProcessors = 1;
+
+#elif defined(OGDF_SYSTEM_UNIX)
+ s_pageSize = sysconf(_SC_PAGESIZE);
+ s_numberOfProcessors = (int)sysconf(_SC_NPROCESSORS_CONF);
+
+#else
+ s_pageSize = 0; // just a placeholder!!!
+ s_numberOfProcessors = 1; // just a placeholder!!!
+#endif
+
+#endif
+}
+
+
+#if defined(OGDF_SYSTEM_WINDOWS) || defined(__CYGWIN__)
+void System::getHPCounter(LARGE_INTEGER &counter)
+{
+ QueryPerformanceCounter(&counter);
+}
+
+
+double System::elapsedSeconds(
+ const LARGE_INTEGER &startCounter,
+ const LARGE_INTEGER &endCounter)
+{
+ return double(endCounter.QuadPart - startCounter.QuadPart)
+ / s_HPCounterFrequency.QuadPart;
+}
+
+
+__int64 System::usedRealTime(__int64 &t)
+{
+ __int64 tStart = t;
+ t = GetTickCount();
+ return t - tStart;
+}
+
+
+long long System::physicalMemory()
+{
+#if !defined(__CYGWIN__) || (_WIN32_WINNT >= 0x0500)
+ MEMORYSTATUSEX statex;
+ statex.dwLength = sizeof (statex);
+
+ GlobalMemoryStatusEx (&statex);
+ return statex.ullTotalPhys;
+#else
+ MEMORYSTATUS stat;
+ stat.dwLength = sizeof (stat);
+
+ GlobalMemoryStatus (&stat);
+ return stat.dwTotalPhys;
+#endif
+}
+
+long long System::availablePhysicalMemory()
+{
+#if !defined(__CYGWIN__) || (_WIN32_WINNT >= 0x0500)
+ MEMORYSTATUSEX statex;
+ statex.dwLength = sizeof (statex);
+
+ GlobalMemoryStatusEx (&statex);
+ return statex.ullAvailPhys;
+#else
+ MEMORYSTATUS stat;
+ stat.dwLength = sizeof (stat);
+
+ GlobalMemoryStatus (&stat);
+ return stat.dwAvailPhys;
+#endif
+}
+
+size_t System::memoryUsedByProcess()
+{
+ PROCESS_MEMORY_COUNTERS pmc;
+ GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));
+
+ return pmc.WorkingSetSize;
+}
+
+size_t System::peakMemoryUsedByProcess()
+{
+ PROCESS_MEMORY_COUNTERS pmc;
+ GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc));
+
+ return pmc.PeakWorkingSetSize;
+}
+
+#elif __APPLE__
+
+long long System::physicalMemory()
+{
+ unsigned long long value;
+ size_t size = sizeof( value );
+ if (sysctlbyname("hw.memsize", &value, &size, NULL, 0) !=-1)
+ return value;
+ else
+ return 0;
+}
+
+long long System::availablePhysicalMemory()
+{
+ unsigned long long pageSize;
+ long long result;
+ size_t size = sizeof( pageSize );
+ sysctlbyname("hw.pagesize", &pageSize, &size, NULL, 0);
+
+ vm_statistics_data_t vm_stat;
+ int count = ((mach_msg_type_number_t) (sizeof(vm_statistics_data_t)/sizeof(integer_t)));
+ host_statistics(mach_host_self(), HOST_VM_INFO, (integer_t*)&vm_stat, (mach_msg_type_number_t*)&count);
+ result = (unsigned long long)(vm_stat.free_count + vm_stat.inactive_count) * pageSize;
+ return result;
+}
+
+
+size_t System::memoryUsedByProcess()
+{
+ /*int pid = getpid();
+ static char filename[32];
+ sprintf(filename, 32, "/proc/%d/statm", pid);
+
+ int fd = open(filename, O_RDONLY, 0);
+ if(fd==-1) OGDF_THROW(Exception);
+
+ static char sbuf[256];
+ sbuf[read(fd, sbuf, sizeof(sbuf) - 1)] = 0;
+ close(fd);
+
+ long size, resident, share, trs, lrs, drs, dt;
+ sscanf(sbuf, "%ld %ld %ld %ld %ld %ld %ld",
+ &size, // total program size (in pages)
+ &resident, // number of resident set (non-swapped) pages (4k)
+ &share, // number of pages of shared (mmap'd) memory
+ &trs, // text resident set size
+ &lrs, // shared-lib resident set size
+ &drs, // data resident set size
+ &dt); // dirty pages
+
+ return resident*4*1024;*/
+ return 0;
+}
+
+#else
+// LINUX, NOT MAC OS
+long long System::physicalMemory()
+{
+ return (long long)(sysconf(_SC_PHYS_PAGES)) * sysconf(_SC_PAGESIZE);
+}
+
+long long System::availablePhysicalMemory()
+{
+ return (long long)(sysconf(_SC_AVPHYS_PAGES)) * sysconf(_SC_PAGESIZE);
+}
+
+size_t System::memoryUsedByProcess()
+{
+ int pid = getpid();
+ static char filename[32];
+ sprintf(filename, 32, "/proc/%d/statm", pid);
+
+ int fd = open(filename, O_RDONLY, 0);
+ if(fd==-1) OGDF_THROW(Exception);
+
+ static char sbuf[256];
+ sbuf[read(fd, sbuf, sizeof(sbuf) - 1)] = 0;
+ close(fd);
+
+ long size, resident, share, trs, lrs, drs, dt;
+ sscanf(sbuf, "%ld %ld %ld %ld %ld %ld %ld",
+ &size, // total program size (in pages)
+ &resident, // number of resident set (non-swapped) pages (4k)
+ &share, // number of pages of shared (mmap'd) memory
+ &trs, // text resident set size
+ &lrs, // shared-lib resident set size
+ &drs, // data resident set size
+ &dt); // dirty pages
+
+ return resident*4*1024;
+}
+
+#endif
+
+
+#ifdef OGDF_SYSTEM_WINDOWS
+
+size_t System::memoryAllocatedByMalloc()
+{
+ _HEAPINFO hinfo;
+ int heapstatus;
+ hinfo._pentry = NULL;
+
+ size_t allocMem = 0;
+ while((heapstatus = _heapwalk(&hinfo)) == _HEAPOK)
+ {
+ if(hinfo._useflag == _USEDENTRY)
+ allocMem += hinfo._size;
+ }
+
+ return allocMem;
+}
+
+size_t System::memoryInFreelistOfMalloc()
+{
+ _HEAPINFO hinfo;
+ int heapstatus;
+ hinfo._pentry = NULL;
+
+ size_t allocMem = 0;
+ while((heapstatus = _heapwalk(&hinfo)) == _HEAPOK)
+ {
+ if(hinfo._useflag == _FREEENTRY)
+ allocMem += hinfo._size;
+ }
+
+ return allocMem;
+}
+
+#elif __APPLE__
+
+size_t System::memoryAllocatedByMalloc()
+{
+ return mstats().chunks_used;
+}
+
+size_t System::memoryInFreelistOfMalloc()
+{
+ return mstats().chunks_free;
+}
+#else
+
+size_t System::memoryAllocatedByMalloc()
+{
+ return mallinfo().uordblks;
+}
+
+size_t System::memoryInFreelistOfMalloc()
+{
+ return mallinfo().fordblks;
+}
+
+#endif
+
+#if !defined(OGDF_SYSTEM_WINDOWS) && !defined(__CYGWIN__)
+__int64 System::usedRealTime(__int64 &t)
+{
+ __int64 tStart = t;
+ timeval tv;
+ gettimeofday(&tv, 0);
+ t = __int64(tv.tv_sec) * 1000 + tv.tv_usec/1000;
+ return t - tStart;
+}
+#endif
+
+
+size_t System::memoryAllocatedByMemoryManager()
+{
+ return PoolMemoryAllocator::memoryAllocatedInBlocks();
+}
+
+size_t System::memoryInGlobalFreeListOfMemoryManager()
+{
+ return PoolMemoryAllocator::memoryInGlobalFreeList();
+}
+
+size_t System::memoryInThreadFreeListOfMemoryManager()
+{
+ return PoolMemoryAllocator::memoryInThreadFreeList();
+}
+
+
+} // namespace ogdf
diff --git a/ogdf/basic/System.h b/ogdf/basic/System.h
new file mode 100644
index 0000000..696bed7
--- /dev/null
+++ b/ogdf/basic/System.h
@@ -0,0 +1,328 @@
+/*
+ * $Revision: 2523 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-02 20:59:27 +0200 (Mon, 02 Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Decalration of System class which provides unified
+ * access to system information.
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_SYSTEM_H
+#define OGDF_SYSTEM_H
+
+
+#include "basic.h"
+#if defined(OGDF_SYSTEM_OSX)
+#include <stdlib.h>
+#elif defined(OGDF_SYSTEM_UNIX) || defined(__MINGW32__)
+#include <malloc.h>
+#endif
+
+// detect processor architecture we're compiling for
+//
+// OGDF_ARCH_X86 Intel / AMD x86 32-bit processors
+// OGDF_ARCH_X64 Intel / AMD x86 64-bit processors
+// OGDF_ARCH_IA64 Intel Itanium
+// OGDF_ARCH_PPC PowerPC
+// OGDF_ARCH_SPARC SUN SPARC
+// OGDF_ARCH_SPARC_V9 SUN SPARC V9
+
+#if defined(_M_X64) || defined(__x86_64__)
+#define OGDF_ARCH_X64
+#elif defined(_M_IX86) || defined(__i386__)
+#define OGDF_ARCH_X86
+#elif defined(_M_IA64) || defined(__ia64__)
+#define OGDF_ARCH_IA64
+#elif defined(_M_MPPC) || defined(_M_PPC) || defined(__powerpc__)
+#define OGDF_ARCH_PPC
+#elif defined(__sparc__)
+#define OGDF_ARCH_SPARC
+#elif defined(__sparc_v9__)
+#define OGDF_ARCH_SPARC_V9
+#endif
+
+// use SSE2 always if x64-platform or compiler option is set
+#ifndef OGDF_USE_SSE2
+#if defined(OGDF_ARCH_X64)
+#define OGDF_USE_SSE2
+#elif defined(_MSC_VER)
+#if _M_IX86_FP >= 2
+#define OGDF_USE_SSE2
+#endif
+#endif
+#endif
+
+// macros to check for using special cpu features
+//
+// OGDF_CHECK_SSE2 returns true if SSE2 can be used
+
+#ifdef OGDF_USE_SSE2
+#define OGDF_CHECK_SSE2 true
+#elif defined(OGDF_ARCH_X86)
+#define OGDF_CHECK_SSE2 ogdf::System::cpuSupports(ogdf::cpufSSE2)
+#else
+#define OGDF_USE_SSE2 false
+#endif
+
+// work-around for MinGW-w64
+#ifdef __MINGW64__
+#ifndef _aligned_free
+#define _aligned_free(a) __mingw_aligned_free(a)
+#endif
+#ifndef _aligned_malloc
+#define _aligned_malloc(a,b) __mingw_aligned_malloc(a,b)
+#endif
+#endif
+
+
+namespace ogdf {
+
+//! Special features supported by a x86/x64 CPU.
+/**
+ * This enumeration is used to specify spcial additional features that
+ * are supported by the CPU, in particular extended instruction sets
+ * such as SSE.
+ */
+enum CPUFeature {
+ cpufMMX, //!< Intel MMX Technology
+ cpufSSE, //!< Streaming SIMD Extensions (SSE)
+ cpufSSE2, //!< Streaming SIMD Extensions 2 (SSE2)
+ cpufSSE3, //!< Streaming SIMD Extensions 3 (SSE3)
+ cpufSSSE3, //!< Supplemental Streaming SIMD Extensions 3 (SSSE3)
+ cpufSSE4_1, //!< Streaming SIMD Extensions 4.1 (SSE4.1)
+ cpufSSE4_2, //!< Streaming SIMD Extensions 4.2 (SSE4.2)
+ cpufVMX, //!< Virtual Machine Extensions
+ cpufSMX, //!< Safer Mode Extensions
+ cpufEST, //!< Enhanced Intel SpeedStep Technology
+ cpufMONITOR //!< Processor supports MONITOR/MWAIT instructions
+};
+
+//! Bit mask for CPU features.
+enum CPUFeatureMask {
+ cpufmMMX = 1 << cpufMMX, //!< Intel MMX Technology
+ cpufmSSE = 1 << cpufSSE, //!< Streaming SIMD Extensions (SSE)
+ cpufmSSE2 = 1 << cpufSSE2, //!< Streaming SIMD Extensions 2 (SSE2)
+ cpufmSSE3 = 1 << cpufSSE3, //!< Streaming SIMD Extensions 3 (SSE3)
+ cpufmSSSE3 = 1 << cpufSSSE3, //!< Supplemental Streaming SIMD Extensions 3 (SSSE3)
+ cpufmSSE4_1 = 1 << cpufSSE4_1, //!< Streaming SIMD Extensions 4.1 (SSE4.1)
+ cpufmSSE4_2 = 1 << cpufSSE4_2, //!< Streaming SIMD Extensions 4.2 (SSE4.2)
+ cpufmVMX = 1 << cpufVMX, //!< Virtual Machine Extensions
+ cpufmSMX = 1 << cpufSMX, //!< Safer Mode Extensions
+ cpufmEST = 1 << cpufEST, //!< Enhanced Intel SpeedStep Technology
+ cpufmMONITOR = 1 << cpufMONITOR //!< Processor supports MONITOR/MWAIT instructions
+};
+
+
+//! %System specific functionality.
+/**
+ * The class System encapsulates system specific functions
+ * providing unified access across different operating systems.
+ * The provided functionality includes:
+ * - Access to file system functionality (listing directories etc.).
+ * - Query memory usage.
+ * - Access to high-perfomance counter under Windows and Cygwin.
+ * - Query CPU specific information.
+ */
+class OGDF_EXPORT System {
+
+ //friend class ::OgdfInitialization;
+
+public:
+ /**
+ * @name Memory usage
+ * These methods allow to query the amount of physical memory, as well as the
+ * current memory usage by both the process and OGDF's internal memory manager.
+ */
+ //@{
+
+ static void *alignedMemoryAlloc16(size_t size) {
+#ifdef OGDF_SYSTEM_WINDOWS
+ size_t alignment = 16;
+ return _aligned_malloc(size,alignment);
+#elif defined(OGDF_SYSTEM_OSX)
+ // malloc returns 16 byte aligned memory on OS X.
+ return malloc(size);
+#else
+ size_t alignment = 16;
+ return memalign(alignment,size);
+#endif
+ }
+
+ static void alignedMemoryFree(void *p) {
+#ifdef OGDF_SYSTEM_WINDOWS
+ _aligned_free(p);
+#else
+ free(p);
+#endif
+ }
+
+ //! Returns the page size of virtual memory (in bytes).
+ static int pageSize() { return s_pageSize; }
+
+ //! Returns the total size of physical memory (in bytes).
+ static long long physicalMemory();
+
+ //! Returns the size of available (free) physical memory (in bytes).
+ static long long availablePhysicalMemory();
+
+ //! Returns the amount of memory (in bytes) allocated by the process.
+ static size_t memoryUsedByProcess();
+
+#if defined(OGDF_SYSTEM_WINDOWS) || defined(__CYGWIN__)
+ //! Returns the maximal amount of memory (in bytes) used by the process (Windows/Cygwin only).
+ static size_t peakMemoryUsedByProcess();
+#endif
+
+ //! Returns the amount of memory (in bytes) allocated by OGDF's memory manager.
+ /**
+ * The memory manager allocates blocks of a fixed size from the system (via malloc())
+ * and makes it available in its free lists (for allocating small pieces of memory.
+ * The returned value is the total amount of memory allocated from the system;
+ * the amount of memory currently allocated from the user is
+ * memoryAllocatedByMemoryManager() - memoryInFreelistOfMemoryManager().
+ *
+ * Keep in mind that the memory manager never releases memory to the system before
+ * its destruction.
+ */
+ static size_t memoryAllocatedByMemoryManager();
+
+ //! Returns the amount of memory (in bytes) contained in the global free list of OGDF's memory manager.
+ static size_t memoryInGlobalFreeListOfMemoryManager();
+
+ //! Returns the amount of memory (in bytes) contained in the thread's free list of OGDF's memory manager.
+ static size_t memoryInThreadFreeListOfMemoryManager();
+
+ //! Returns the amount of memory (in bytes) allocated on the heap (e.g., with malloc).
+ /**
+ * This refers to dynamically allocated memory, e.g., memory allocated with malloc()
+ * or new.
+ */
+ static size_t memoryAllocatedByMalloc();
+
+ //! Returns the amount of memory (in bytes) contained in free chunks on the heap.
+ /**
+ * This refers to memory that has been deallocated with free() or delete, but has not
+ * yet been returned to the operating system.
+ */
+ static size_t memoryInFreelistOfMalloc();
+
+#if defined(OGDF_SYSTEM_WINDOWS) || defined(__CYGWIN__)
+ //@}
+ /**
+ * @name Measuring time
+ * These methods provide various ways to measure time. The high-performance
+ * counter (Windows and Cygwin only) can be used to measure real time
+ * periods with a better resolution than the standard system time function.
+ */
+ //@{
+
+ //! Returns the current value of the high-performance counter in \a counter.
+ static void getHPCounter(LARGE_INTEGER &counter);
+
+ //! Returns the elapsed time (in seconds) between \a startCounter and \a endCounter.
+ static double elapsedSeconds(
+ const LARGE_INTEGER &startCounter,
+ const LARGE_INTEGER &endCounter);
+#endif
+
+ //! Returns the elapsed time (in milliseconds) between \a t and now.
+ /**
+ * The functions sets \a t to to the current time. Usually, you first call
+ * usedRealTime(t) to query the start time \a t, and determine the elapsed time
+ * after performing some computation by calling usedRealTime(t) again; this time
+ * the return value gives you the elapsed time in milliseconds.
+ */
+ static __int64 usedRealTime(__int64 &t);
+
+
+ //@}
+ /**
+ * @name Processor information
+ * These methods allow to query information about the current processor such as
+ * supported instruction sets (e.g., SSE extensions), cache size, and number of
+ * installed processors.
+ */
+ //@{
+
+ //! Returns the bit vector describing the CPU features supported on current system.
+ static int cpuFeatures() { return s_cpuFeatures; }
+
+ //! Returns true if the CPU supports \a feature.
+ static bool cpuSupports(CPUFeature feature) {
+ return (s_cpuFeatures & (1 << feature)) != 0;
+ }
+
+ //! Returns the L2-cache size (in KBytes).
+ static int cacheSizeKBytes() { return s_cacheSize; }
+
+ //! Returns the number of bytes in a cache line.
+ static int cacheLineBytes() { return s_cacheLine; }
+
+ //! Returns the number of processors (cores) available on the current system.
+ static int numberOfProcessors() { return s_numberOfProcessors; }
+
+ //@}
+
+private:
+ static unsigned int s_cpuFeatures; //!< Supported CPU features.
+ static int s_cacheSize; //!< Cache size in KBytes.
+ static int s_cacheLine; //!< Bytes in a cache line.
+ static int s_numberOfProcessors; //!< Number of processors (cores) available.
+ static int s_pageSize; //!< The page size of virtual memory.
+
+#if defined(OGDF_SYSTEM_WINDOWS) || defined(__CYGWIN__)
+ static LARGE_INTEGER s_HPCounterFrequency; //!< Frequency of high-performance counter.
+#endif
+
+public:
+ //! Static initilization routine (automatically called).
+ static void init();
+};
+
+
+} // end namespace ogdf
+
+
+#endif
diff --git a/ogdf/basic/basic.cpp b/ogdf/basic/basic.cpp
new file mode 100644
index 0000000..8838493
--- /dev/null
+++ b/ogdf/basic/basic.cpp
@@ -0,0 +1,357 @@
+/*
+ * $Revision: 2626 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-17 12:10:52 +0200 (Di, 17. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of basic functionality (incl. file and
+ * directory handling)
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "basic.h"
+#include "List.h"
+#include "String.h"
+#include <time.h>
+
+// Windows includes
+#ifdef OGDF_SYSTEM_WINDOWS
+#include <direct.h>
+#if defined(_MSC_VER) && defined(UNICODE)
+#undef GetFileAttributes
+#undef FindFirstFile
+#undef FindNextFile
+#define GetFileAttributes GetFileAttributesA
+#define FindFirstFile FindFirstFileA
+#define WIN32_FIND_DATA WIN32_FIND_DATAA
+#define FindNextFile FindNextFileA
+#endif
+#endif
+
+#ifdef __BORLANDC__
+#define _chdir chdir
+#endif
+
+// Unix includes
+#ifdef OGDF_SYSTEM_UNIX
+#include <unistd.h>
+#include <dirent.h>
+#include <sys/types.h>
+#include <sys/times.h>
+#include <sys/stat.h>
+#include <fnmatch.h>
+
+double OGDF_clk_tck = sysconf(_SC_CLK_TCK); //is long. but definig it here avoids casts...
+#endif
+
+
+#ifdef OGDF_DLL
+
+#ifdef OGDF_SYSTEM_WINDOWS
+
+#ifdef __MINGW32__
+extern "C"
+#endif
+BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
+{
+ switch (ul_reason_for_call)
+ {
+ case DLL_PROCESS_ATTACH:
+ ogdf::PoolMemoryAllocator::init();
+ ogdf::System::init();
+ break;
+
+ case DLL_THREAD_ATTACH:
+ case DLL_THREAD_DETACH:
+ break;
+
+ case DLL_PROCESS_DETACH:
+ ogdf::PoolMemoryAllocator::cleanup();
+ break;
+ }
+ return TRUE;
+}
+
+#else
+
+void __attribute__ ((constructor)) my_load(void)
+{
+ ogdf::PoolMemoryAllocator::init();
+ ogdf::System::init();
+}
+
+void __attribute__ ((destructor)) my_unload(void)
+{
+ ogdf::PoolMemoryAllocator::cleanup();
+}
+
+#endif
+
+#else
+
+namespace ogdf {
+
+//static int variables are automatically initialized with 0
+int Initialization::s_count;
+
+Initialization::Initialization()
+{
+ if (s_count++ == 0) {
+ ogdf::PoolMemoryAllocator::init();
+ ogdf::System::init();
+ }
+}
+
+Initialization::~Initialization()
+{
+ if (--s_count == 0) {
+ ogdf::PoolMemoryAllocator::cleanup();
+ }
+}
+
+} // namespace ogdf
+
+#endif
+
+
+namespace ogdf {
+
+ // debug level (in debug build only)
+#ifdef OGDF_DEBUG
+ DebugLevel debugLevel;
+#endif
+
+
+double usedTime(double& T)
+{
+ double t = T;
+#ifdef OGDF_SYSTEM_WINDOWS
+ T = double(clock())/CLOCKS_PER_SEC;
+#endif
+#ifdef OGDF_SYSTEM_UNIX
+ struct tms now;
+ times (&now);
+ T = now.tms_utime/OGDF_clk_tck;
+#endif
+ return T-t;
+}
+
+
+#ifdef OGDF_SYSTEM_WINDOWS
+
+bool isFile(const char *fileName)
+{
+ DWORD att = GetFileAttributes(fileName);
+
+ if (att == 0xffffffff) return false;
+ return (att & FILE_ATTRIBUTE_DIRECTORY) == 0;
+}
+
+
+bool isDirectory(const char *fileName)
+{
+ DWORD att = GetFileAttributes(fileName);
+
+ if (att == 0xffffffff) return false;
+ return (att & FILE_ATTRIBUTE_DIRECTORY) != 0;
+}
+
+
+bool changeDir(const char *dirName)
+{
+ return (_chdir(dirName) == 0);
+}
+
+
+void getEntriesAppend(const char *dirName,
+ FileType t,
+ List<String> &entries,
+ const char *pattern)
+{
+ OGDF_ASSERT(isDirectory(dirName));
+
+ String filePattern;
+ filePattern.sprintf("%s\\%s", dirName, pattern);
+
+ WIN32_FIND_DATA findData;
+ HANDLE handle = FindFirstFile(filePattern.cstr(), &findData);
+
+ if (handle != INVALID_HANDLE_VALUE)
+ {
+ do {
+ DWORD isDir = (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
+ if(isDir && (
+ strcmp(findData.cFileName,".") == 0 ||
+ strcmp(findData.cFileName,"..") == 0)
+ )
+ continue;
+
+ if (t == ftEntry || (t == ftFile && !isDir) ||
+ (t == ftDirectory && isDir))
+ {
+ entries.pushBack(findData.cFileName);
+ }
+ } while(FindNextFile(handle, &findData));
+
+ FindClose(handle);
+ }
+}
+#endif
+
+#ifdef OGDF_SYSTEM_UNIX
+
+bool isDirectory(const char *fname)
+{
+ struct stat stat_buf;
+
+ if (stat(fname,&stat_buf) != 0)
+ return false;
+ return (stat_buf.st_mode & S_IFMT) == S_IFDIR;
+}
+
+bool isFile(const char *fname)
+{
+ struct stat stat_buf;
+
+ if (stat(fname,&stat_buf) != 0)
+ return false;
+ return (stat_buf.st_mode & S_IFMT) == S_IFREG;
+}
+
+bool changeDir(const char *dirName)
+{
+ return (chdir(dirName) == 0);
+}
+
+void getEntriesAppend(const char *dirName,
+ FileType t,
+ List<String> &entries,
+ const char *pattern)
+{
+ OGDF_ASSERT(isDirectory(dirName));
+
+ DIR* dir_p = opendir(dirName);
+
+ dirent* dir_e;
+ while ( (dir_e = readdir(dir_p)) != NULL )
+ {
+ const char *fname = dir_e->d_name;
+ if (pattern != 0 && fnmatch(pattern,fname,0)) continue;
+
+ String fullName;
+ fullName.sprintf("%s/%s", dirName, fname);
+
+ bool isDir = isDirectory(fullName.cstr());
+ if(isDir && (
+ strcmp(fname,".") == 0 ||
+ strcmp(fname,"..") == 0)
+ )
+ continue;
+
+ if (t == ftEntry || (t == ftFile && !isDir) ||
+ (t == ftDirectory && isDir))
+ {
+ entries.pushBack(fname);
+ }
+ }
+
+ closedir(dir_p);
+}
+#endif
+
+
+void getEntries(const char *dirName,
+ FileType t,
+ List<String> &entries,
+ const char *pattern)
+{
+ entries.clear();
+ getEntriesAppend(dirName, t, entries, pattern);
+}
+
+
+void getFiles(const char *dirName,
+ List<String> &files,
+ const char *pattern)
+{
+ getEntries(dirName, ftFile, files, pattern);
+}
+
+
+void getSubdirs(const char *dirName,
+ List<String> &subdirs,
+ const char *pattern)
+{
+ getEntries(dirName, ftDirectory, subdirs, pattern);
+}
+
+
+void getEntries(const char *dirName,
+ List<String> &entries,
+ const char *pattern)
+{
+ getEntries(dirName, ftEntry, entries, pattern);
+}
+
+
+void getFilesAppend(const char *dirName,
+ List<String> &files,
+ const char *pattern)
+{
+ getEntriesAppend(dirName, ftFile, files, pattern);
+}
+
+
+void getSubdirsAppend(const char *dirName,
+ List<String> &subdirs,
+ const char *pattern)
+{
+ getEntriesAppend(dirName, ftDirectory, subdirs, pattern);
+}
+
+
+void getEntriesAppend(const char *dirName,
+ List<String> &entries,
+ const char *pattern)
+{
+ getEntriesAppend(dirName, ftEntry, entries, pattern);
+}
+
+
+
+
+
+} // end namespace ogdf
diff --git a/ogdf/basic/basic.h b/ogdf/basic/basic.h
new file mode 100644
index 0000000..480ba9b
--- /dev/null
+++ b/ogdf/basic/basic.h
@@ -0,0 +1,639 @@
+/*
+ * $Revision: 2618 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-16 15:59:09 +0200 (Mo, 16. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Basic declarations, included by all source files.
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_BASIC_H
+#define OGDF_BASIC_H
+
+
+/**
+ * \mainpage The Open Graph Drawing Framework
+ *
+ * \section sec_intro Introduction
+ * The Open Graph Drawing Framework (OGDF) is a C++ library containing
+ * implementations of various graph drawing algorithms. The library is self
+ * contained; optionally, additional packages like LP-solvers are required
+ * for some implementations.
+ *
+ * Here, you find the library's code documentation. For more general information
+ * on OGDF see http://www.ogdf.net. There, you can also find further explanations,
+ * how-tos, and example code.
+ *
+ * The OGDF project is a cooperation between
+ * - [Chair of Algorithm Engineering](http://ls11-www.cs.uni-dortmund.de/), Faculty of Computer Science, TU Dortmund, Germany
+ * - [Juniorprofessorship of Algorithm Engineering](http://www.ae.uni-jena.de/), Faculty of Mathematics and Computer Science, Friedrich-Schiller-University Jena, Germany
+ * - [Chair of Prof. Jünger](http://www.informatik.uni-koeln.de/ls_juenger/), Department of Computer Science, University of Cologne, Germany
+ * - [University of Sydney](http://sydney.edu.au/engineering/it/), Australia
+ * - [oreas GmbH](http://www.oreas.com/), Cologne, Germany
+ */
+
+
+
+
+//---------------------------------------------------------
+// detection of the system
+//---------------------------------------------------------
+
+#if defined(unix) || defined(__unix__) || defined(__unix) || defined(_AIX) || defined(__APPLE__)
+#define OGDF_SYSTEM_UNIX
+#endif
+
+#if defined(__WIN32__) || defined(_WIN32) || defined(__NT__)
+#define OGDF_SYSTEM_WINDOWS
+#endif
+
+// Note: Apple OS X machines will be both OGDF_SYSTEM_UNIX and OGDF_SYSTEM_OSX
+#if defined(__APPLE__)
+#define OGDF_SYSTEM_OSX
+#endif
+
+
+#if defined(USE_COIN) || defined(OGDF_OWN_LPSOLVER)
+#define OGDF_LP_SOLVER
+#endif
+
+#if defined(USE_COIN) && !defined(COIN_OSI_CPX) && !defined(COIN_OSI_SYM) && !defined(COIN_OSI_CLP)
+#error "Compiler-flag USE_COIN requires an additional COIN_OSI_xxx-flag to choose the LP solver backend."
+#endif
+
+
+// define minimal MS runtime version for mingw32
+#if defined(__MINGW32__) && !defined(__MINGW64__)
+#ifndef __MSVCRT_VERSION__
+#define __MSVCRT_VERSION__ 0x0700
+#endif
+#endif
+
+// include windows.h on Windows systems
+#if defined(OGDF_SYSTEM_WINDOWS) || defined(__CYGWIN__)
+#define WIN32_EXTRA_LEAN
+#define WIN32_LEAN_AND_MEAN
+#undef NOMINMAX
+#define NOMINMAX
+#ifndef _WIN32_WINNT
+#define _WIN32_WINNT 0x0500
+#endif
+#include <windows.h>
+#endif
+
+
+//---------------------------------------------------------
+// assertions
+//---------------------------------------------------------
+
+#ifdef OGDF_DEBUG
+#include <assert.h>
+#define OGDF_ASSERT(expr) assert(expr);
+#define OGDF_ASSERT_IF(minLevel,expr) \
+ if (int(ogdf::debugLevel) >= int(minLevel)) { assert(expr); } else { }
+#define OGDF_SET_DEBUG_LEVEL(level) ogdf::debugLevel = level;
+
+#else
+#define OGDF_ASSERT(expr)
+#define OGDF_ASSERT_IF(minLevel,expr)
+#define OGDF_SET_DEBUG_LEVEL(level)
+#endif
+
+
+//---------------------------------------------------------
+// macros for optimization
+//---------------------------------------------------------
+
+// Visual C++ compiler
+#ifdef _MSC_VER
+
+#define OGDF_LIKELY(x) (x)
+#define OGDF_UNLIKELY(x) (x)
+
+#ifdef OGDF_DEBUG
+#define OGDF_NODEFAULT default: assert(0);
+#else
+#define OGDF_NODEFAULT default: __assume(0);
+#endif
+
+#define OGDF_DECL_ALIGN(b) __declspec(align(b))
+#define OGDF_DECL_THREAD __declspec(thread)
+
+
+// GNU gcc compiler (also Intel compiler)
+#elif defined(__GNUC__)
+//// make sure that SIZE_MAX gets defined
+//#define __STDC_LIMIT_MACROS
+//#include <stdint.h>
+
+#define OGDF_LIKELY(x) __builtin_expect((x),1)
+#define OGDF_UNLIKELY(x) __builtin_expect((x),0)
+#define OGDF_NODEFAULT default: ;
+
+#define OGDF_DECL_ALIGN(b) __attribute__ ((aligned(b)))
+#define OGDF_DECL_THREAD __thread
+
+
+// other compiler
+#else
+#define OGDF_LIKELY(x) (x)
+#define OGDF_UNLIKELY(x) (x)
+#define OGDF_NODEFAULT
+
+#define OGDF_DECL_ALIGN(b)
+#endif
+
+#ifndef __SIZEOF_POINTER__
+#ifdef _M_X64
+#define __SIZEOF_POINTER__ 8
+#else
+#define __SIZEOF_POINTER__ 4
+#endif
+#endif
+
+
+#if defined(__CYGWIN__) || defined(__APPLE__) || defined(__sparc__)
+#define OGDF_NO_COMPILER_TLS
+#elif defined(__GNUC__)
+#if __GNUC__ < 4
+#define OGDF_NO_COMPILER_TLS
+#endif
+#endif
+
+
+//---------------------------------------------------------
+// macros for compiling OGDF as DLL
+//---------------------------------------------------------
+
+#ifdef OGDF_SYSTEM_WINDOWS
+#ifdef OGDF_DLL
+
+#ifdef OGDF_INSTALL
+#define OGDF_EXPORT __declspec(dllexport)
+#else
+#define OGDF_EXPORT __declspec(dllimport)
+#endif
+
+#else
+#define OGDF_EXPORT
+#endif
+
+#else
+#define OGDF_EXPORT
+#endif
+
+
+//---------------------------------------------------------
+// define data types with known size
+//---------------------------------------------------------
+
+#if defined(_MSC_VER)
+
+typedef unsigned __int8 __uint8;
+typedef unsigned __int16 __uint16;
+typedef unsigned __int32 __uint32;
+typedef unsigned __int64 __uint64;
+
+#else
+
+#undef __int8
+#undef __int16
+#undef __int32
+#undef __int64
+
+typedef signed char __int8;
+typedef short __int16;
+typedef int __int32;
+typedef long long __int64;
+typedef unsigned char __uint8;
+typedef unsigned short __uint16;
+typedef unsigned int __uint32;
+typedef unsigned long long __uint64;
+#endif
+
+
+//---------------------------------------------------------
+// common includes
+//---------------------------------------------------------
+
+#include <iostream>
+#include <fstream>
+#include <algorithm>
+
+using std::ios;
+using std::istream;
+using std::ifstream;
+using std::ostream;
+using std::ofstream;
+using std::cin;
+using std::cout;
+using std::cerr;
+using std::endl;
+using std::flush;
+using std::swap;
+using std::min;
+using std::max;
+
+#include <stdio.h>
+#include <stdarg.h>
+#include <time.h>
+#include <string.h>
+#include <math.h>
+
+#ifdef OGDF_SYSTEM_UNIX
+#include <stdint.h>
+#endif
+// make sure that SIZE_MAX gets defined
+#ifndef SIZE_MAX
+#define SIZE_MAX ((size_t)-1)
+#endif
+
+
+#include "exceptions.h"
+#include "memory.h"
+#include "comparer.h"
+
+
+
+//---------------------------------------------------------
+// compiler adaptions
+//---------------------------------------------------------
+
+#ifdef _MSC_VER
+
+// disable useless warnings
+
+// missing dll-interface
+#pragma warning(disable:4251)
+#pragma warning(disable:4275)
+
+#endif
+
+
+//! The namespace for all OGDF objects.
+namespace ogdf {
+
+#ifndef OGDF_DLL
+
+/**
+ * The class Initialization is used for initializing global variables.
+ * You should never create instances of it!
+*/
+class Initialization {
+ static int s_count;
+
+public:
+ Initialization();
+ ~Initialization();
+};
+
+static Initialization s_ogdfInitializer;
+
+#endif
+
+
+//---------------------------------------------------------
+// global basic functions
+//---------------------------------------------------------
+
+ // forward declarations
+ template<class E> class List;
+ class OGDF_EXPORT String;
+
+
+ enum Direction { before, after };
+
+ //! Returns random integer between low and high (including).
+ inline int randomNumber(int low, int high) {
+#if RAND_MAX == 32767
+ // We get only 15 random bits on some systems (Windows, Solaris)!
+ int r1 = (rand() & ((1 << 16) - 1));
+ int r2 = (rand() & ((1 << 16) - 1));
+ int r = (r1 << 15) | r2;
+#else
+ int r = rand();
+#endif
+ return low + (r % (high-low+1));
+ }
+
+ //! Returns random double value between low and high.
+ inline double randomDouble(double low, double high) {
+ double val = low +(rand()*(high-low))/RAND_MAX;
+ OGDF_ASSERT(val >= low && val <= high);
+ return val;
+ }
+
+ //! Returns a random double value from the normal distribution
+ //! with mean m and standard deviation sd
+ inline double randomDoubleNormal(double m, double sd)
+ {
+ double x1, x2, y1, w, rndVal;
+
+ do {
+ rndVal = randomDouble(0,1);
+ x1 = 2.0 * rndVal - 1.0;
+ rndVal = randomDouble(0,1);
+ x2 = 2.0 * rndVal - 1.0;
+ w = x1*x1 + x2*x2;
+ } while (w >= 1.0);
+
+ w = sqrt((-2.0 * log(w))/w) ;
+ y1 = x1*w;
+
+ return(m + y1*sd);
+ }
+
+
+
+ //! Returns used CPU time from T to current time and assigns
+ //! current time to T.
+ OGDF_EXPORT double usedTime(double& T);
+
+ //! \a doDestruction() returns false if a data type does not require to
+ //! call its destructor (e.g. build-in data types).
+ template<class E>inline bool doDestruction(const E *) { return true; }
+
+ // specializations
+ template<>inline bool doDestruction(const char *) { return false; }
+ template<>inline bool doDestruction<int>(const int *) { return false; }
+ template<>inline bool doDestruction<double>(const double *) { return false; }
+
+
+ //---------------------------------------------------------
+ // handling files and directories
+ //---------------------------------------------------------
+
+ //! The type of an entry in a directory.
+ enum FileType {
+ ftEntry, /**< file or directory */
+ ftFile, /**< file */
+ ftDirectory /**< directory */
+ };
+
+ //! Returns true iff \a fileName is a regular file (not a directory).
+ OGDF_EXPORT bool isFile(const char *fileName);
+
+ //! Returns true iff \a fileName is a directory.
+ OGDF_EXPORT bool isDirectory(const char *fileName);
+
+ //! Changes current directory to \a dirName; returns true if successful.
+ OGDF_EXPORT bool changeDir(const char *dirName);
+
+ //! Returns in \a files the list of files in directory \a dirName.
+ /** The optional argument \a pattern can be used to filter files.
+ *
+ * \pre \a dirName is a directory
+ */
+ OGDF_EXPORT void getFiles(const char *dirName,
+ List<String> &files,
+ const char *pattern = "*");
+
+ //! Appends to \a files the list of files in directory \a dirName.
+ /** The optional argument \a pattern can be used to filter files.
+ *
+ * \pre \a dirName is a directory
+ */
+ OGDF_EXPORT void getFilesAppend(const char *dirName,
+ List<String> &files,
+ const char *pattern = "*");
+
+
+ //! Returns in \a subdirs the list of directories contained in directory \a dirName.
+ /** The optional argument \a pattern can be used to filter files.
+ *
+ * \pre \a dirName is a directory
+ */
+ OGDF_EXPORT void getSubdirs(const char *dirName,
+ List<String> &subdirs,
+ const char *pattern = "*");
+
+ //! Appends to \a subdirs the list of directories contained in directory \a dirName.
+ /** The optional argument \a pattern can be used to filter files.
+ *
+ * \pre \a dirName is a directory
+ */
+ OGDF_EXPORT void getSubdirsAppend(const char *dirName,
+ List<String> &subdirs,
+ const char *pattern = "*");
+
+
+ //! Returns in \a entries the list of all entries contained in directory \a dirName.
+ /** Entries may be files or directories. The optional argument \a pattern
+ * can be used to filter files.
+ *
+ * \pre \a dirName is a directory
+ */
+ OGDF_EXPORT void getEntries(const char *dirName,
+ List<String> &entries,
+ const char *pattern = "*");
+
+ //! Appends to \a entries the list of all entries contained in directory \a dirName.
+ /** Entries may be files or directories. The optional argument \a pattern
+ * can be used to filter files.
+ *
+ * \pre \a dirName is a directory
+ */
+ OGDF_EXPORT void getEntriesAppend(const char *dirName,
+ List<String> &entries,
+ const char *pattern = "*");
+
+
+ //! Returns in \a entries the list of all entries of type \a t contained in directory \a dirName.
+ /** The optional argument \a pattern can be used to filter files.
+ *
+ * \pre \a dirName is a directory
+ */
+ OGDF_EXPORT void getEntries(const char *dirName,
+ FileType t,
+ List<String> &entries,
+ const char *pattern = "*");
+
+ //! Appends to \a entries the list of all entries of type \a t contained in directory \a dirName.
+ /** The optional argument \a pattern can be used to filter files.
+ *
+ * \pre \a dirName is a directory
+ */
+ OGDF_EXPORT void getEntriesAppend(const char *dirName,
+ FileType t,
+ List<String> &entries,
+ const char *pattern = "*");
+
+ //---------------------------------------------------------
+ // handling markup formatting
+ //---------------------------------------------------------
+
+#ifdef OGDF_DEBUG
+ /** We maintain a debug level in debug versions indicating how many
+ * internal checks (usually assertions) are done.
+ * Usage: Set the variable ogdf::debugLevel using the macro
+ * OGDF_SET_DEBUG_LEVEL(level) to the desired level
+ * in the calling code (e.g. main()). The debugLevel can be set
+ * to a higher level for critical parts (e.g., where you assume a bug)
+ * ensuring that other parts are not too slow.
+ */
+ enum DebugLevel {
+ dlMinimal, dlExtendedChecking, dlConsistencyChecks, dlHeavyChecks
+ };
+ extern DebugLevel debugLevel;
+#endif
+
+
+//! Abstract base class for bucket functions.
+/**
+ * The parameterized class \a BucketFunc<E> is an abstract base class
+ * for bucket functions. Derived classes have to implement \a getBucket().
+ * Bucket functions are used by bucket sort functions for container types.
+ */
+template<class E> class BucketFunc
+{
+public:
+ virtual ~BucketFunc() { }
+
+ //! Returns the bucket of \a x.
+ virtual int getBucket(const E &x) = 0;
+};
+
+
+
+#if _MSC_VER >= 1400
+
+inline int sprintf(char *buffer, size_t sizeOfBuffer, const char *format, ...)
+{
+ va_list args;
+ va_start(args, format);
+
+ return vsprintf_s(buffer, sizeOfBuffer, format, args);
+}
+
+inline int vsprintf(char *buffer, size_t sizeInBytes, const char *format, va_list argptr)
+{
+ return vsprintf_s(buffer, sizeInBytes, format, argptr);
+}
+
+inline int strcat(char *strDest, size_t sizeOfDest, const char *strSource)
+{
+ return (int)strcat_s(strDest, sizeOfDest, strSource);
+}
+
+inline int strcpy(char *strDest, size_t sizeOfDest, const char *strSource)
+{
+ return (int)strcpy_s(strDest, sizeOfDest, strSource);
+}
+
+inline int strncpy(char *strDest, size_t sizeOfDest, const char *strSource, size_t count)
+{
+ return (int)strncpy_s(strDest, sizeOfDest, strSource, count);
+}
+
+inline char *strtok(char *strToken, const char *strDelimit)
+{
+ //provide a persistent context pointer for strtok_s
+ static char *context;
+ return strtok_s(strToken, strDelimit, &context);
+}
+
+#define scanf scanf_s
+#define fscanf fscanf_s
+#define sscanf sscanf_s
+
+inline FILE *fopen(const char *filename, const char *mode)
+{
+ FILE *stream;
+ if(fopen_s(&stream, filename, mode)) stream = 0;
+ return stream;
+}
+
+inline int localtime(struct tm *ptm, const time_t *timer)
+{
+ return (int)localtime_s(ptm,timer);
+}
+
+#else ///////////////////////////////////////////////////////////////////////////////
+
+inline int sprintf(char *buffer, size_t, const char *format, ...)
+{
+ va_list args;
+ va_start(args, format);
+
+ return ::vsprintf(buffer, format, args);
+}
+
+
+inline int vsprintf(char *buffer, size_t, const char *format, va_list argptr)
+{
+ return ::vsprintf(buffer, format, argptr);
+}
+
+
+inline int strcat(char *strDest, size_t, const char *strSource)
+{
+ ::strcat(strDest, strSource);
+ return 0;
+}
+
+inline int strcpy(char *strDest, size_t, const char *strSource)
+{
+ ::strcpy(strDest, strSource);
+ return 0;
+}
+
+inline int strncpy(char *strDest, size_t, const char *strSource, size_t count)
+{
+ ::strncpy(strDest, strSource, count);
+ return 0;
+}
+
+inline int localtime(struct tm *ptm, const time_t *timer)
+{
+ struct tm *newtime = ::localtime(timer);
+ if(newtime) {
+ *ptm = *newtime;
+ return 0;
+ }
+ return 1; // indicates error
+}
+
+#endif
+
+} // end namespace ogdf
+
+
+#endif
diff --git a/ogdf/basic/comparer.h b/ogdf/basic/comparer.h
new file mode 100644
index 0000000..41ffbe8
--- /dev/null
+++ b/ogdf/basic/comparer.h
@@ -0,0 +1,287 @@
+/*
+ * $Revision: 2564 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-07 00:03:48 +0200 (Sa, 07. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declarations for Comparer objects.
+ *
+ * \author Markus Chimani, Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_COMPARER_H
+#define OGDF_COMPARER_H
+
+namespace ogdf {
+
+//--------------------------------------------------------------------
+// A comparer interface is has to define
+// bool less (const E &x, const E &y);
+// bool leq (const E &x, const E &y);
+// bool equal(const E &x, const E &y);
+// bool geq (const E &x, const E &y);
+// bool greater (const E &x, const E &y);
+//
+// "const E &" can be replaced by "E"
+//--------------------------------------------------------------------
+
+//! Standard comparer (valid as a static comparer).
+/**
+ * Standard comparers are used by some sorting and searching methods.
+ * The implementation of the generic class only provides dummies that
+ * always throw a NoStdComparerException.
+ *
+ * The compare operations are static, hence the StdComparer cannot
+ * only be used as a comparer object, but also as a static comparer
+ * when required.
+ *
+ * You need to specialize this class for types you want to use with
+ * sorting and searching methods like quicksort and binary search. There
+ * already exist specializations for several standard types. If your type
+ * already provides compare operators, you can use the macro #OGDF_STD_COMPARER
+ * to automatically generate the specialization based on these operators.
+ */
+template<typename E> class StdComparer
+{
+public:
+ static bool less(const E &/*x*/, const E &/*y*/) { OGDF_THROW(NoStdComparerException); }
+ static bool leq(const E &/*x*/, const E &/*y*/) { OGDF_THROW(NoStdComparerException); }
+ static bool greater(const E &/*x*/, const E &/*y*/) { OGDF_THROW(NoStdComparerException); }
+ static bool geq(const E &/*x*/, const E &/*y*/) { OGDF_THROW(NoStdComparerException); }
+ static bool equal(const E &/*x*/, const E &/*y*/) { OGDF_THROW(NoStdComparerException); }
+};
+
+//! Generates a specialization of the standard static comparer for \a type based on compare operators.
+#define OGDF_STD_COMPARER(type) \
+ template<> class StdComparer<type> \
+ { \
+ public: \
+ static bool less (const type &x, const type &y) { return x < y; } \
+ static bool leq (const type &x, const type &y) { return x <= y; } \
+ static bool greater(const type &x, const type &y) { return x > y; } \
+ static bool geq (const type &x, const type &y) { return x >= y; } \
+ static bool equal (const type &x, const type &y) { return x == y; } \
+ };
+
+OGDF_STD_COMPARER(int)
+OGDF_STD_COMPARER(float)
+OGDF_STD_COMPARER(double)
+
+//! Generates a specialization of the standard static comparer for booleans.
+template<> class StdComparer<bool> {
+public:
+ static bool less (const bool &x, const bool &y) { return !x && y; }
+ static bool leq (const bool &x, const bool &y) { return !x || y; }
+ static bool greater(const bool &x, const bool &y) { return x && !y; }
+ static bool geq (const bool &x, const bool &y) { return x || !y; }
+ static bool equal (const bool &x, const bool &y) { return x == y; }
+};
+
+
+//! A static comparer which compares the target of pointers ("content"), instead of the pointer's adresses.
+/**
+ * For the comparison of the contents, you may give your own static comparer
+ */
+template<class CONTENTTYPE, class STATICCONTENTCOMPARER = StdComparer<CONTENTTYPE> >
+class TargetComparer {
+ typedef CONTENTTYPE* CONTENTPOINTER;
+public:
+ static bool less (const CONTENTPOINTER &x, const CONTENTPOINTER &y) { return STATICCONTENTCOMPARER::less (*x,*y); }
+ static bool leq (const CONTENTPOINTER &x, const CONTENTPOINTER &y) { return STATICCONTENTCOMPARER::leq (*x,*y); }
+ static bool greater(const CONTENTPOINTER &x, const CONTENTPOINTER &y) { return STATICCONTENTCOMPARER::greater(*x,*y); }
+ static bool geq (const CONTENTPOINTER &x, const CONTENTPOINTER &y) { return STATICCONTENTCOMPARER::geq (*x,*y); }
+ static bool equal (const CONTENTPOINTER &x, const CONTENTPOINTER &y) { return STATICCONTENTCOMPARER::equal (*x,*y); }
+};
+
+
+//! Add this macro to your class to turn it into a full comparer.
+/**
+ * It is assumed that your class has a method "compare(const type &x, const type &y)", which
+ * returns 0 if the two elements are equal, a negative value if \a x is smaller, and a positive
+ * value if \a x is greater.
+ *
+ * Note: If the compare function of your class requires no additional data other than the
+ * two elements to compare, your should usually use the more general #OGDF_AUGMENT_STATICCOMPARER:
+ * A static comparer is also always valid as a normal comparer.
+ *
+ * Usage in Definition:
+ * \code
+ * class MyComparer {
+ * private:
+ * Oracle oracle;
+ * public:
+ * MyComparer(Oracle o) : oracle(o) {}
+ * int compare(const MyStuff& x1, const MyStuff& x2) const {
+ * return ... //compare x1 with x2, using oracle
+ * }
+ * OGDF_AUGMENT_COMPARER(MyStuff)
+ * }
+ * \endcode
+ *
+ * Use the Comparer:
+ * \code
+ * MyStuff a=...;
+ * MyStuff b=...;
+ * Oracle or;
+ * MyComparer comp(or);
+ * if( comp.less(a,b) )
+ * ... // do something
+ * ...
+ * Array<MyStuff> ay(10);
+ * ... // fill array
+ * ay.quicksort(comp); // sort the array using the MyComparer comp
+ * \endcode
+ */
+#define OGDF_AUGMENT_COMPARER(type) \
+ public: \
+ bool less(const type &x, const type &y) const { return compare(x,y) < 0; } \
+ bool leq(const type &x, const type &y) const { return compare(x,y) <= 0; } \
+ bool greater(const type &x, const type &y) const { return compare(x,y) > 0; } \
+ bool geq(const type &x, const type &y) const { return compare(x,y) >= 0; } \
+ bool equal(const type &x, const type &y) const { return compare(x,y) == 0; }
+
+//! Add this macro to your class to turn it into a full static comparer.
+/**
+ * It is assumed that your class has a *static* method "compare(const type &x, const type &y)", which
+ * returns 0 if the two elements are equal, a negative value if \a x is smaller, and a positive
+ * value if \a x is greater.
+ *
+ * Note: You should use this macro instead of #OGDF_AUGMENT_COMPARER whenever your compare function
+ * requires no additional data stored in the object, other than the two elements to compare.
+ * A static comparer is also always valid as a normal comparer.
+ *
+ * Usage in Definition:
+ * \code
+ * class MyComparer {
+ * public:
+ * static int comparer(const MyStuff& x1, const MyStuff& x2) {
+ * return ... //compare x1 with x2
+ * }
+ * OGDF_AUGMENT_STATICCOMPARER(MyStuff)
+ * }
+ * \endcode
+ *
+ * Use the Comparer:
+ * \code
+ * MyStuff a=...;
+ * MyStuff b=...;
+ * MyComparer comp;
+ * if( MyComparer.less(a,b) ) // use it statically on the class
+ * ... // do something
+ * if( comp.less(a,b) ) // use it on the object
+ * ... // do something
+ * ...
+ * Array<MyStuff> ay(10);
+ * ... // fill array
+ * ay.quicksort(comp); // sort the array using the MyComparer comp
+ * \endcode
+ */
+#define OGDF_AUGMENT_STATICCOMPARER(type) \
+ public: \
+ static bool less(const type &x, const type &y) { return compare(x,y) < 0; } \
+ static bool leq(const type &x, const type &y) { return compare(x,y) <= 0; } \
+ static bool greater(const type &x, const type &y) { return compare(x,y) > 0; } \
+ static bool geq(const type &x, const type &y) { return compare(x,y) >= 0; } \
+ static bool equal(const type &x, const type &y) { return compare(x,y) == 0; }
+
+
+//! Abstract base class for comparer classes.
+/**
+ * The parameterized class \a VComparer<E> is an abstract base class for
+ * encapsulating compare functions for type \a E. Implementations derive
+ * from this class and implement at least the compare() method.
+ *
+ * The methods of this class are all \a virtual, which comes with a
+ * certain performance penalty. Its advantage is that if you require
+ * multiple Comparers for the same class \a E, functions using
+ * compareres on \a E are not generated multiple times, which means
+ * smaller code.
+ *
+ * If size is not an issue, but speed is, use a Comparer with
+ * non-virtual functions. You may want to use the convenience classes
+ * StdComparer and TargetComparer, or the convenience macros
+ * #OGDF_AUGMENT_COMPARER, #OGDF_AUGMENT_STATICCOMPARER, #OGDF_STD_COMPARER to
+ * obtain non-virtual classes with few effort.
+ */
+template<class E> class VComparer {
+public:
+ //! Initializes a comparer.
+ VComparer() { }
+
+ virtual ~VComparer() { }
+
+ //! Compares \a x and \a y and returns the result as an integer.
+ /** The returns value is
+ * - < 0 iff x < y,
+ * - = 0 iff x = y,
+ * - > 0 iff x > y
+ */
+ virtual int compare(const E &x, const E &y) const = 0;
+
+ //! Returns true iff \a x < \a y
+ virtual bool less(const E &x, const E &y) const {
+ return compare(x,y) < 0;
+ }
+
+ //! Returns true iff \a x <= \a y
+ virtual bool leq(const E &x, const E &y) const {
+ return compare(x,y) <= 0;
+ }
+
+ //! Returns true iff \a x > \a y
+ virtual bool greater(const E &x, const E &y) const {
+ return compare(x,y) > 0;
+ }
+
+ //! Returns true iff \a x >= \a y
+ virtual bool geq(const E &x, const E &y) const {
+ return compare(x,y) >= 0;
+ }
+
+ //! Returns true iff \a x = \a y
+ virtual bool equal(const E &x, const E &y) const {
+ return compare(x,y) == 0;
+ }
+}; // class VComparer
+
+} //namespace
+
+#endif /*OGF_COMPARER_H*/
diff --git a/ogdf/basic/exceptions.h b/ogdf/basic/exceptions.h
new file mode 100644
index 0000000..e79d658
--- /dev/null
+++ b/ogdf/basic/exceptions.h
@@ -0,0 +1,307 @@
+/*
+ * $Revision: 2564 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-07 00:03:48 +0200 (Sa, 07. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Definition of exception classes
+ *
+ * \author Carsten Gutwenger, Markus Chimani
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#include <stdio.h>
+#include "basic.h"
+
+
+#ifndef OGDF_EXCEPTIONS_H
+#define OGDF_EXCEPTIONS_H
+
+
+namespace ogdf {
+
+#ifdef OGDF_DEBUG
+/**
+ * If this flag is set the #OGDF_THROW macros pass the location where the
+ * exception is thrown (file name and line number) to the exception
+ * constructor, otherwise not.
+ */
+#define OGDF_THROW_WITH_INFO
+#endif
+
+#ifdef OGDF_THROW
+#undef OGDF_THROW
+#endif
+
+#ifndef OGDF_THROW_WITH_INFO
+#define OGDF_THROW_PARAM(CLASS, PARAM) throw CLASS ( PARAM )
+#define OGDF_THROW(CLASS) throw CLASS ( )
+#else
+//! Replacement for \c throw.
+/**
+ * This macro is used to throw an exception and pass the file name
+ * and line number of the location in the source file.
+ * @param CLASS is the name of the exception class.
+ * @param PARAM is an additional parameter (like the error code) required
+ * by the exception calls.
+ */
+#define OGDF_THROW_PARAM(CLASS, PARAM) throw CLASS ( PARAM , __FILE__ , __LINE__ )
+//! Replacement for \c throw.
+/**
+ * This macro is used to throw an exception and pass the file name
+ * and line number of the location in the source file.
+ * @param CLASS is the name of the exception class.
+ */
+#define OGDF_THROW(CLASS) throw CLASS ( __FILE__ , __LINE__ )
+#endif
+
+
+ //! Error code for a violated precondition.
+ /**
+ * \see PreconditionViolatedException
+ */
+ enum PreconditionViolatedCode {
+ pvcUnknown,
+ pvcSelfLoop, //!< graph contains a self-loop
+ pvcTreeHierarchies, //!< hierarchies are not only trees
+ pvcAcyclicHierarchies,//!< hierarchies are not acyclic
+ pvcSingleSource, //!< graph has not a single source
+ pvcUpwardPlanar, //!< graph is not upward planar
+ pvcTree, //!< graph is not a rooted tree
+ pvcForest, //!< graph is not a rooted forest
+ pvcOrthogonal, //!< layout is not orthogonal
+ pvcPlanar, //!< graph is not planar
+ pvcClusterPlanar, //!< graph is not c-planar
+ pvcNoCopy, //!< graph is not a copy of the corresponding graph
+ pvcConnected, //!< graph is not connected
+ pvcBiconnected, //!< graph is not twoconnected
+ pvcSTOP // INSERT NEW CODES BEFORE pvcSTOP!
+ }; // enum PreconditionViolatedCode
+
+
+ //! Code for an internal failure condition
+ /**
+ * \see AlgorithmFailureException
+ */
+ enum AlgorithmFailureCode {
+ afcUnknown,
+ afcIllegalParameter, //!< function parameter is illegal
+ afcNoFlow, //!< min-cost flow could not find a legal flow
+ afcSort, //!< sequence not sorted
+ afcLabel, //!< labelling failed
+ afcExternalFace, //!< external face not correct
+ afcForbiddenCrossing,//!< crossing forbidden but necessary
+ afcTimelimitExceeded,//!< it took too long
+ afcNoSolutionFound, //!< couldn't solve the problem
+ afcSTOP // INSERT NEW CODES BEFORE afcSTOP!
+ }; // enum AlgorithmFailureCode
+
+
+
+ //! Code for the library which was intended to get used, but its use is not supported.
+ /**
+ * \see LibraryNotSupportedException
+ */
+ enum LibraryNotSupportedCode {
+ lnscUnknown,
+ lnscCoin, //!< COIN not supported
+ lnscAbacus, //!< ABACUS not supported
+ lnscFunctionNotImplemented, //!< the used library doesn't support that function
+ lnscMissingCallbackImplementation, //
+ lnscSTOP // INSERT NEW CODES BEFORE nscSTOP!
+ }; // enum AlgorithmFailureCode
+
+
+
+ //! Base class of all ogdf exceptions.
+ class OGDF_EXPORT Exception {
+
+ private:
+
+ const char *m_file; //!< Source file where exception occurred.
+ int m_line; //!< Line number where exception occurred.
+
+ public:
+ //! Constructs an exception.
+ /**
+ * @param file is the name of the source file where exception was thrown.
+ * @param line is the line number in the source file where the exception was thrown.
+ */
+ Exception(const char *file = NULL, int line = -1) :
+ m_file(file),
+ m_line(line)
+ { }
+
+ //! Returns the name of the source file where exception was thrown.
+ /**
+ * Returns a null pointer if the name of the source file is unknown.
+ */
+ const char *file() { return m_file; }
+
+ //! Returns the line number where the exception was thrown.
+ /**
+ * Returns -1 if the line number is unknown.
+ */
+ int line() { return m_line; }
+ };
+
+
+ //! %Exception thrown when result of cast is 0.
+ class OGDF_EXPORT DynamicCastFailedException : public Exception {
+
+ public:
+ //! Constructs a dynamic cast failed exception.
+ DynamicCastFailedException(const char *file = NULL, int line = -1) : Exception(file, line) {}
+ };
+
+
+ //! %Exception thrown when not enough memory is available to execute an algorithm.
+ class OGDF_EXPORT InsufficientMemoryException : public Exception {
+
+ public:
+ //! Constructs an insufficient memory exception.
+ InsufficientMemoryException(const char *file = NULL, int line = -1) : Exception(file, line) {}
+ };
+
+
+ //! %Exception thrown when a required standard comparer has not been specialized.
+ /**
+ * The default implementation of StdComparer<E> throws this exception, since it
+ * provides no meaningful implementation of comparer methods. You need to specialize
+ * this class for the types you want to use with sorting and searching methods (like
+ * quicksort and binary search).
+ */
+ class OGDF_EXPORT NoStdComparerException : public Exception {
+
+ public:
+ //! Constructs a no standard comparer available exception.
+ NoStdComparerException(const char *file = NULL, int line = -1) : Exception(file, line) {}
+ };
+
+
+ //! %Exception thrown when preconditions are violated.
+ class OGDF_EXPORT PreconditionViolatedException : public Exception
+ {
+ public:
+ //! Constructs a precondition violated exception.
+ PreconditionViolatedException(PreconditionViolatedCode code,
+ const char *file = NULL,
+ int line = -1) :
+ Exception(file, line),
+ m_exceptionCode(code)
+ {}
+
+ //! Constructs a precondition violated exception.
+ PreconditionViolatedException(
+ const char *file = NULL,
+ int line = -1) :
+ Exception(file, line),
+ m_exceptionCode(pvcUnknown)
+ {}
+
+ //! Returns the error code of the exception.
+ PreconditionViolatedCode exceptionCode() const { return m_exceptionCode; }
+
+ private:
+ PreconditionViolatedCode m_exceptionCode; //!< The error code specifying the exception.
+ }; // class PreconditionViolatedException
+
+
+
+ //! %Exception thrown when an algorithm realizes an internal bug that prevents it from continuing.
+ class OGDF_EXPORT AlgorithmFailureException : public Exception
+ {
+ public:
+
+ //! Constructs an algorithm failure exception.
+ AlgorithmFailureException(AlgorithmFailureCode code,
+ const char *file = NULL,
+ int line = -1) :
+ Exception(file, line),
+ m_exceptionCode(code)
+ {}
+
+ //! Constructs an algorithm failure exception.
+ AlgorithmFailureException(
+ const char *file = NULL,
+ int line = -1) :
+ Exception(file, line),
+ m_exceptionCode(afcUnknown)
+ {}
+
+ //! Returns the error code of the exception.
+ AlgorithmFailureCode exceptionCode() const { return m_exceptionCode; }
+
+ private:
+ AlgorithmFailureCode m_exceptionCode; //!< The error code specifying the exception.
+ }; // class AlgorithmFailureException
+
+
+
+ //! %Exception thrown when an external library shall be used which is not supported.
+ class OGDF_EXPORT LibraryNotSupportedException : public Exception {
+ public:
+ //! Constructs a library not supported exception.
+ LibraryNotSupportedException(LibraryNotSupportedCode code,
+ const char *file = NULL,
+ int line = -1) :
+ Exception(file, line),
+ m_exceptionCode(code)
+ {}
+
+ //! Constructs a library not supported exception.
+ LibraryNotSupportedException(
+ const char *file = NULL,
+ int line = -1) :
+ Exception(file, line),
+ m_exceptionCode(lnscUnknown)
+ {}
+
+ //! Returns the error code of the exception.
+ LibraryNotSupportedCode exceptionCode() const { return m_exceptionCode; }
+
+ private:
+ LibraryNotSupportedCode m_exceptionCode; //!< The error code specifying the exception.
+ }; // class LibraryNotSupportedException
+
+} // end namespace ogdf
+
+
+#endif
diff --git a/ogdf/basic/geometry.cpp b/ogdf/basic/geometry.cpp
new file mode 100644
index 0000000..c3c92e2
--- /dev/null
+++ b/ogdf/basic/geometry.cpp
@@ -0,0 +1,804 @@
+/*
+ * $Revision: 2565 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-07 17:14:54 +0200 (Sa, 07. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Geometric-classes like DPoint, DPolyline, DRect, DLine,
+ * DScaler
+ *
+ * \author Joachim Kupke
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "ogdf/basic/geometry.h"
+#include "ogdf/basic/GraphAttributes.h"
+#include "ogdf/basic/Math.h"
+#include <math.h>
+
+
+namespace ogdf {
+
+//---------------------------------------------------------
+// IPoint
+//---------------------------------------------------------
+
+ostream &operator<<(ostream &os, const IPoint &ip)
+{
+ os << "(" << ip.m_x << "," << ip.m_y << ")";
+ return os;
+}
+
+
+//---------------------------------------------------------
+// DPoint
+//---------------------------------------------------------
+
+// gives the euclidean distance between p and *this
+double IPoint::distance(const IPoint &p) const
+{
+ double dx = p.m_x - m_x;
+ double dy = p.m_y - m_y;
+ return sqrt( (dx*dx) + (dy*dy) );
+}
+
+
+//---------------------------------------------------------
+// IPolyline
+//---------------------------------------------------------
+
+// calculates the total length of a polyline
+double IPolyline::length() const
+{
+ OGDF_ASSERT(!empty());
+
+ double len = 0.0;
+ ListConstIterator<IPoint> pred, iter;
+
+ pred = iter = begin();
+ ++iter;
+
+ while (iter.valid()) {
+ len += (*iter).distance(*pred);
+ ++pred;
+ ++iter;
+ }
+
+ return len;
+}
+
+
+//---------------------------------------------------------
+// DPoint
+//---------------------------------------------------------
+
+// gives the euclidean distance between p and *this
+double DPoint::distance(const DPoint &p) const
+{
+ double dx = p.m_x - m_x;
+ double dy = p.m_y - m_y;
+ return sqrt( (dx*dx) + (dy*dy) );
+}
+
+// adds p to *this
+DPoint DPoint::operator+(const DPoint &p) const
+{
+ return DPoint(m_x + p.m_x, m_y + p.m_y);
+}
+
+// subtracts p from *this
+DPoint DPoint::operator-(const DPoint &p) const
+{
+ return DPoint(m_x - p.m_x, m_y - p.m_y);
+}
+
+// outputs dp
+ostream &operator<<(ostream &os, const DPoint &dp)
+{
+ os << "(" << dp.m_x << "," << dp.m_y << ")";
+ return os;
+}
+
+
+//---------------------------------------------------------
+// DVector
+//---------------------------------------------------------
+DVector DVector::operator*(const double val) const
+{
+ DVector ret(m_x*val, m_y*val);
+ return ret;
+}
+
+DVector DVector::operator/(const double val) const
+{
+ DVector ret(m_x/val, m_y/val);
+ return ret;
+}
+
+// length
+double DVector::length() const
+{
+ return sqrt((m_x * m_x) + (m_y * m_y));
+}
+
+// determinante
+double DVector::operator^(const DVector &dv) const
+{
+ return ((m_x * dv.m_y) - (m_y * dv.m_x));
+}
+
+// s-product
+double DVector::operator*(const DVector &dv) const
+{
+ return ((m_x * dv.m_x) + (m_y * dv.m_y));
+}
+
+// ortho left
+DVector DVector::operator++() const
+{
+ DVector ret;
+ if (m_x != 0.0) {
+ ret.m_y = 1.0;
+ ret.m_x = - m_y / m_x;
+ }
+ else {
+ ret.m_x = 1.0;
+ ret.m_y = 0.0;
+
+ }
+ return ret;
+}
+
+// ortho right
+DVector DVector::operator--() const
+{
+ return (++(*this)) * (-1.0);
+}
+
+
+
+//---------------------------------------------------------
+// DPolyline
+//---------------------------------------------------------
+
+const double DPolyline::s_prec = 10000.0;
+
+// calculates the total length of a polyline
+double DPolyline::length() const
+{
+ OGDF_ASSERT(!empty());
+
+ double len = 0.0;
+ ListConstIterator<DPoint> pred, iter;
+
+ pred = iter = begin();
+ ++iter;
+
+ while (iter.valid()) {
+ len += (*iter).distance(*pred);
+ ++pred;
+ ++iter;
+ }
+
+ return len;
+}
+
+
+// gives the point on a polyline, which is fraction*len away from the start
+DPoint DPolyline::position(const double fraction, double len) const
+{
+ OGDF_ASSERT(!empty());
+ OGDF_ASSERT(fraction >= 0.0 && fraction <= 1.0);
+ if (len < 0.0)
+ len = length();
+ OGDF_ASSERT(len >= 0.0);
+
+ DPoint p = (*begin());
+ double liter = 0.0;
+ double pos = len * fraction;
+ double seglen = 0.0;
+ ListConstIterator<DPoint> pred, iter;
+
+ pred = iter = begin();
+ ++iter;
+
+ // search the segment, which contains the desired point
+ double DX = 0, DY = 0; // for further use
+ while (iter.valid()) {
+ DX = (*iter).m_x - (*pred).m_x;
+ DY = (*iter).m_y - (*pred).m_y;
+ seglen = sqrt( (DX*DX) + (DY*DY) );
+ liter += seglen;
+ if (liter >= pos)
+ break;
+ ++pred;
+ ++iter;
+ }
+
+ if (!iter.valid()) // position not inside the polyline, return last point!
+ p = (*rbegin());
+ else {
+ if (seglen == 0.0) // *pred == *iter and pos is inbetween
+ return (*pred);
+
+ double segpos = seglen + pos - liter;
+
+ double dx = DX * segpos / seglen;
+ double dy = DY * segpos / seglen;
+
+ p = (*pred);
+ p.m_x += dx;
+ p.m_y += dy;
+ }
+
+ return p;
+}
+
+
+//
+void DPolyline::writeGML(ostream &stream) const
+{
+ Graph g;
+ GraphAttributes ag(g);
+
+ node u = NULL;
+ node v = NULL;
+
+ ListConstIterator<DPoint> iter;
+ for (iter = begin(); iter.valid(); ++iter) {
+ v = g.newNode();
+ if (u != NULL)
+ g.newEdge(u, v);
+ u = v;
+
+ ag.x(v) = (*iter).m_x;
+ ag.y(v) = (*iter).m_y;
+ }
+ ag.writeGML(stream);
+}
+
+
+// outputs the GML-file, which illustrates the Polyline as Graph
+void DPolyline::writeGML(const char *filename) const
+{
+ ofstream file(filename);
+ writeGML(file);
+}
+
+
+// delete all consecutive double-points
+void DPolyline::unify()
+{
+ if (empty()) return;
+ ListIterator<DPoint> iter, next;
+ for (iter = next = begin(), ++next; next.valid() && (size() > 2); ++next) {
+ if (*iter == *next) {
+ del(next);
+ next = iter;
+ } else
+ iter = next;
+ }
+}
+
+
+// deletes all points, which are not facets
+void DPolyline::normalize()
+{
+ unify();
+
+ ListIterator<DPoint> iter, next, onext;
+ for (iter = begin(); iter.valid(); ++iter) {
+ for( ; ; ) {
+ next = iter; next++;
+ if (!next.valid()) break;
+ onext = next, onext++;
+ if (!onext.valid()) break;
+
+ DSegment s1((*iter), (*next));
+ DSegment s2((*next), (*onext));
+ DRect r ((*iter), (*onext));
+
+ // is *next on the way from *iter to *onext?
+ if (s1.slope() == s2.slope() && r.contains(*next))
+ del(next);
+ else
+ break; /* while */
+ }
+ }
+}
+
+
+void DPolyline::normalize(DPoint src, DPoint tgt)
+{
+ if (empty())
+ return;
+
+ unify();
+ ListIterator<DPoint> iter, next, onext;
+ DPoint pCur = src;
+ DPoint pNext;
+ DPoint pNextNext;
+ for (iter = begin(); iter.valid(); ++iter) {
+ for( ; ; ) {
+
+ if (!iter.valid())
+ break;
+
+ next = iter;
+ pNext = *next;
+ next++;
+
+ if (!next.valid()) {
+ pNextNext = tgt;
+ }
+ else
+ pNextNext = *next;
+
+
+ DSegment s1(pCur, pNext);
+ DSegment s2(pNext, pNextNext);
+ DRect r (pCur, pNextNext);
+
+ // is *next on the way from *iter to *onext?
+ if (s1.slope() == s2.slope() && r.contains(pNext)) {
+ del(iter);
+ iter = next;
+ }
+ else
+ break; /* while */
+ }
+ if (iter.valid())
+ pCur = *iter;
+ else
+ break;
+ }
+}
+
+
+//
+void DPolyline::convertToInt()
+{
+ ListIterator<DPoint> iter;
+ for (iter = begin(); iter.valid(); ++iter) {
+ DPoint &p = *iter;
+ p.m_x = DRound(p.m_x * s_prec);
+ p.m_y = DRound(p.m_y * s_prec);
+ }
+}
+
+// Removed since I do not see that this makes sense... (CG)
+//void DPolyline::reConvertToDouble()
+//{
+// ListIterator<DPoint> iter;
+// for (iter = begin(); iter.valid(); ++iter) {
+// DPoint &p = *iter;
+// p.m_x = p.m_x / s_prec;
+// p.m_y = p.m_y / s_prec;
+// }
+//}
+
+//---------------------------------------------------------
+// DLine
+//---------------------------------------------------------
+
+// gives the intersection-point between two lines, returns true, if any
+// computes the crossing point between the (infinite) lines
+// defined by the endpoints of the DLines, then checks if it
+// lies within the two rectangles defined by the DLines endpoints
+bool DLine::intersection(
+ const DLine &line,
+ DPoint &inter,
+ bool endpoints) const
+{
+ double ix, iy;
+
+ //do not return true if parallel edges are encountered
+ if (slope() == line.slope()) return false;
+
+ //two possible checks:
+ // only check for overlap on endpoints if option parameter set,
+ // compute crossing otherwise
+ // or skip computation if endpoints overlap (can't have "real" crossing)
+ // (currently implemented)
+ //if (endpoints) {
+
+ if (m_start == line.m_start || m_start == line.m_end) {
+ inter = m_start;
+ if (endpoints) return true;
+ else return false;
+ }
+
+ if (m_end == line.m_start || m_end == line.m_end) {
+ inter = m_end;
+ if (endpoints) return true;
+ else return false;
+ }
+
+ //}//if endpoints
+
+ //if the edge is vertical, we cannot compute the slope
+ if (isVertical())
+ ix = m_start.m_x;
+ else
+ if (line.isVertical())
+ ix = line.m_start.m_x;
+ else
+ ix = (line.yAbs() - yAbs())/(slope() - line.slope());
+
+ //set iy to the value of the infinite line at xvalue ix
+ //use a non-vertical line (can't be both, otherwise they're parallel)
+ if (isVertical())
+ iy = line.slope() * ix + line.yAbs();
+ else
+ iy = slope() * ix + yAbs();
+
+ inter = DPoint(ix, iy); //the (infinite) lines cross point
+
+ DRect tRect(line);
+ DRect mRect(*this);
+
+ return (tRect.contains(inter) && mRect.contains(inter));
+}
+
+
+// returns true, if line contains p
+bool DLine::contains(const DPoint &p) const
+{
+ if (p == start() || p == end())
+ return true;
+
+ // check, if outside rect
+ DRect r(start(), end());
+ if (!r.contains(p))
+ return false;
+
+ if (dx() == 0.0) { // first check, if line is vertical
+ if (DIsEqual (p.m_x, start().m_x) &&
+ DIsLessEqual (p.m_y, (max(start().m_y, end().m_y))) &&
+ DIsGreaterEqual(p.m_y, (min(start().m_y, end().m_y))))
+ return true;
+ return false;
+ }
+
+ double dx2p = p.m_x - start().m_x;
+ double dy2p = p.m_y - start().m_y;
+
+ if (dx2p == 0.0) // dx() != 0.0, already checked
+ return false;
+
+ if (DIsEqual(slope(), (dy2p/dx2p)))
+ return true;
+ return false;
+}
+
+
+// gives the intersection with the horizontal axis 'horAxis', returns the number of intersections
+// 0 = no, 1 = one, 2 = infinity or both end-points, e.g. parallel on this axis
+int DLine::horIntersection(const double horAxis, double &crossing) const
+{
+ if (dy() == 0.0) {
+ crossing = 0.0;
+ if (m_start.m_y == horAxis)
+ return 2;
+ else
+ return 0;
+ }
+ if (min(m_start.m_y, m_end.m_y) <= horAxis && max(m_start.m_y, m_end.m_y) >= horAxis) {
+ crossing = (m_start.m_x * (m_end.m_y - horAxis) -
+ m_end.m_x * (m_start.m_y - horAxis) ) / dy();
+ return 1;
+ }
+ else {
+ crossing = 0.0;
+ return 0;
+ }
+}
+
+
+// gives the intersection with the vertical axis 'verAxis', returns the number of intersections
+// 0 = no, 1 = one, 2 = infinity or both end-points, e.g. parallel on this axis
+int DLine::verIntersection(const double verAxis, double &crossing) const
+{
+ if (dx() == 0.0) {
+ crossing = 0.0;
+ if (m_start.m_x == verAxis)
+ return 2;
+ else
+ return 0;
+ }
+ if (min(m_start.m_x, m_end.m_x) <= verAxis && max(m_start.m_x, m_end.m_x) >= verAxis) {
+ crossing = (m_start.m_y * (m_end.m_x - verAxis) -
+ m_end.m_y * (m_start.m_x - verAxis) ) / dx();
+ return 1;
+ }
+ else {
+ crossing = 0.0;
+ return 0;
+ }
+}
+
+// output the line
+ostream &operator<<(ostream &os, const DLine &dl)
+{
+ os << "Line-Start: " << dl.start() << ", Line-End: " << dl.end();
+ return os;
+}
+
+
+//---------------------------------------------------------
+// DRect
+//---------------------------------------------------------
+
+// output the rect
+ostream &operator<<(ostream &os, const DRect &dr)
+{
+ os << "Rect-LowerLeftPoint: " << dr.p1() << ", Rect-UpperRightPoint: " << dr.p2();
+ return os;
+}
+
+
+//---------------------------------------------------------
+// DScaler
+//---------------------------------------------------------
+
+// output the two rects in the scaler
+ostream &operator<<(ostream &os, const DScaler &ds)
+{
+ os << "Scale from " << ds.from() << " to " << ds.to();
+ return os;
+}
+
+
+
+//----------------------------------------------------------------
+// DPolygon
+//----------------------------------------------------------------
+
+// gives the segment starting at point 'it'
+DSegment DPolygon::segment(ListConstIterator<DPoint> it) const
+{
+ OGDF_ASSERT(!empty() && size() != 1);
+ return DSegment(*it, *cyclicSucc(it));
+}
+
+
+
+// Assignment operator (for assigning from a rectangle).
+DPolygon &DPolygon::operator=(const DRect &rect)
+{
+ clear();
+ DRect r1(rect);
+ DRect r2(rect);
+ if (m_counterclock)
+ r2.xInvert();
+ else
+ r2.yInvert();
+
+ pushBack(r1.p1());
+ pushBack(r2.p1());
+ pushBack(r1.p2());
+ pushBack(r2.p2());
+
+ unify();
+ return *this;
+}
+
+
+// inserts the point p, which must ly on the boarder of the polygon, between the two points p1 and p2
+// returns the index to that point, which is inserted only once
+ListIterator<DPoint> DPolygon::insertPoint(
+ const DPoint &p,
+ ListIterator<DPoint> p1,
+ ListIterator<DPoint> p2)
+{
+ ListIterator<DPoint> i = p1;
+
+ do {
+ DSegment seg = segment(i);
+ if (seg.contains(p)) {
+ if (seg.start() == p)
+ return i;
+ else if (seg.end() == p) {
+ i = cyclicSucc(i);
+ return i;
+ }
+ else
+ return insertAfter(p, i);
+ }
+
+ i = cyclicSucc(i);
+ } while (i != p2);
+
+ OGDF_ASSERT(false); // Point not in polygon, should not be reached!
+ return i;
+}
+
+
+// inserts 'p' on every segment (a,b) with p in the open range ]a, b[
+void DPolygon::insertCrossPoint(const DPoint &p)
+{
+ ListIterator<DPoint> i = begin();
+
+ do {
+ DSegment seg = segment(i);
+ if (seg.contains(p))
+ if (seg.start() != p && seg.end() != p)
+ i = insertAfter(p, i);
+
+ i = cyclicSucc(i);
+ } while (i != begin());
+}
+
+
+//
+int DPolygon::getCrossPoints(const DPolygon &p, List<DPoint> &crossPoints) const
+{
+ crossPoints.clear();
+
+ ListConstIterator<DPoint> i, j;
+ for (i = begin(); i.valid(); ++i) {
+ DSegment s1 = segment(i);
+ for (j = p.begin(); j.valid(); ++j) {
+ DSegment s2 = p.segment(j);
+
+ DPoint intersec;
+
+ if (s1.intersection(s2, intersec))
+ crossPoints.pushBack(intersec);
+ }
+ }
+ // unify the list
+ ListIterator<DPoint> k, l;
+ for (k = crossPoints.begin(); k.valid(); ++k)
+ for (l = k, ++l; l.valid(); ++l)
+ if (*k == *l) {
+ --l;
+ crossPoints.del(crossPoints.cyclicSucc(l));
+ }
+
+ return crossPoints.size();
+}
+
+
+
+// delete all consecutive double-points
+void DPolygon::unify()
+{
+ ListIterator<DPoint> iter, next;
+ for (iter = begin(); iter.valid(); ++iter) {
+ next = cyclicSucc(iter);
+ while (*iter == *next) {
+ del(next);
+ next = cyclicSucc(iter);
+ if (iter == next)
+ break;
+ }
+ }
+}
+
+
+// deletes all points, which are not facets
+void DPolygon::normalize()
+{
+ unify();
+
+ ListIterator<DPoint> iter, next;
+ for (iter = begin(); iter.valid(); ++iter) {
+ for( ; ; ) {
+ next = cyclicSucc(iter);
+ DSegment s1 = segment(iter);
+ DSegment s2 = segment(next);
+ DRect r (*iter, *cyclicSucc(next));
+ if (s1.slope() == s2.slope() && r.contains(*next))
+ del(next);
+ else
+ break; // while
+ }
+ }
+}
+
+
+//
+void DPolygon::writeGML(ostream &stream) const
+{
+ Graph g;
+ GraphAttributes ag(g);
+
+ node u = NULL;
+ node v = NULL;
+ node first = 0;
+
+ ListConstIterator<DPoint> iter;
+ for (iter = begin(); iter.valid(); ++iter) {
+ v = g.newNode();
+ if (u != NULL)
+ g.newEdge(u, v);
+ else
+ first = v;
+ u = v;
+
+ ag.x(v) = (*iter).m_x;
+ ag.y(v) = (*iter).m_y;
+ }
+ g.newEdge(v, first);
+
+ ag.writeGML(stream);
+}
+
+
+// outputs the GML-file, which illustrates the Polygon as Graph
+void DPolygon::writeGML(const char *filename) const
+{
+ ofstream file(filename);
+ writeGML(file);
+}
+
+
+// Checks wether a Point /a p is inside the Poylgon or not.
+bool DPolygon::containsPoint(DPoint &p) const
+{
+ if (size() < 3) {
+ return false;
+ }
+
+ double angle = 0.0;
+ DPolygon::const_iterator i = cyclicPred(begin());
+ double lastangle = atan2((*i).m_y - p.m_y, (*i).m_x - p.m_x);
+ double tempangle = 0.0;
+ for (i = begin(); i != end(); i++)
+ {
+ tempangle = atan2((*i).m_y - p.m_y, (*i).m_x - p.m_x);
+ double step = lastangle - tempangle;
+ while (step > Math::pi) step -= 2.0*Math::pi;
+ while (step < -Math::pi) step += 2.0*Math::pi;
+ angle += step;
+ lastangle = tempangle;
+ }
+
+ double d = angle / (2.0 * Math::pi);
+ int rounds = static_cast<int>(d<0?d-.5:d+.5);
+
+ return ((rounds % 2) != 0);
+}
+
+
+// outputs the polygon
+ostream &operator<<(ostream &os, const DPolygon &dop)
+{
+ print(os, dop, ' ');
+ return os;
+}
+
+
+} // end namespace ogdf
diff --git a/ogdf/basic/geometry.h b/ogdf/basic/geometry.h
new file mode 100644
index 0000000..a5f885a
--- /dev/null
+++ b/ogdf/basic/geometry.h
@@ -0,0 +1,794 @@
+/*
+ * $Revision: 2564 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-07 00:03:48 +0200 (Sa, 07. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of classes DPoint, DPolyline, DLine, DRect, DScaler.
+ *
+ * \author Joachim Kupke
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_GEOMETRY_H
+#define OGDF_GEOMETRY_H
+
+#include "List.h"
+#include "Hashing.h"
+#include <float.h>
+#include <math.h>
+
+#define OGDF_GEOM_EPS 1e-06
+
+
+namespace ogdf {
+
+//! Determines the orientation in hierarchical layouts.
+enum Orientation {
+ topToBottom, //!< Edges are oriented from top to bottom.
+ bottomToTop, //!< Edges are oriented from bottom to top.
+ leftToRight, //!< Edges are oriented from left to right.
+ rightToLeft //!< Edges are oriented from right to left.
+};
+
+
+// Important: be careful, if compared values are (+/-)DBL_MAX !!!
+inline
+ bool DIsEqual(const double &a, const double &b, const double eps = OGDF_GEOM_EPS)
+{
+ return (a < (b + eps) && a > (b - eps));
+}
+
+inline
+ bool DIsGreaterEqual(const double &a, const double &b, const double eps = OGDF_GEOM_EPS)
+{
+ return (a > (b - eps));
+}
+
+inline
+ bool DIsGreater(const double &a, const double &b, const double eps = OGDF_GEOM_EPS)
+{
+ return (a > (b + eps));
+}
+
+inline
+ bool DIsLessEqual(const double &a, const double &b, const double eps = OGDF_GEOM_EPS)
+{
+ return (a < (b + eps));
+}
+
+inline
+ bool DIsLess(const double &a, const double &b, const double eps = OGDF_GEOM_EPS)
+{
+ return (a < (b - eps));
+}
+
+inline
+ double DRound(const double &d, int prec = 0)
+{
+ if (prec == 0)
+ return floor(d + 0.5);
+ double factor = pow(10.0, ((double) prec));
+ return DRound(d * factor, 0) / factor;
+}
+
+/**
+ * \brief Parameterized base class for points.
+ *
+ * This class serves as base class for two-dimensional points with specific
+ * coordinate types like integer points (IPoint) and real points (DPoint).
+ * The template parameter NUMBER is the type for the coordinates of the point
+ * and has to support assignment and equality/inequality operators.
+ */
+template <class NUMBER>
+class GenericPoint
+{
+public:
+ //! The type for coordinates of the point.
+ typedef NUMBER numberType;
+
+ NUMBER m_x; //!< The x-coordinate.
+ NUMBER m_y; //!< The y-coordinate.
+
+ //! Creates a generic point.
+ /**
+ * \warning Does not assign something like zero to the coordinates,
+ * since we do not require that 0 can be casted to a NUMBER.
+ */
+ GenericPoint() { }
+
+ //! Creates a generic point (\a x,\a y).
+ GenericPoint(NUMBER x, NUMBER y) : m_x(x), m_y(y) { }
+
+ //! Copy constructor.
+ GenericPoint(const GenericPoint &ip) : m_x(ip.m_x), m_y(ip.m_y) { }
+
+ //! Assignment operator.
+ GenericPoint operator=(const GenericPoint &ip) {
+ m_x = ip.m_x;
+ m_y = ip.m_y;
+ return *this;
+ }
+
+ //! Equality operator.
+ bool operator==(const GenericPoint &ip) const {
+ return m_x == ip.m_x && m_y == ip.m_y;
+ }
+
+ //! Inequality operator.
+ bool operator!=(const GenericPoint &ip) const {
+ return m_x != ip.m_x || m_y != ip.m_y;
+ }
+
+};//class GenericPoint
+
+
+/**
+ * \brief Integer points.
+ *
+ * This class represent a two-dimensional point with integer coordinates.
+ */
+class OGDF_EXPORT IPoint : public GenericPoint<int>
+{
+public:
+ //! Creates an integer point (0,0).
+ IPoint() : GenericPoint<int>(0,0) { }
+
+ //! Creates an integer point (\a x,\a y).
+ IPoint(int x, int y) : GenericPoint<int>(x,y) { }
+
+ //! Copy constructor.
+ IPoint(const IPoint &ip) : GenericPoint<int>(ip) { }
+
+ //! Returns the euclidean distance between \a p and this point.
+ double distance(const IPoint &p) const;
+};//class IPoint
+
+
+//! Output operator for integer points.
+OGDF_EXPORT ostream &operator<<(ostream &os, const IPoint &ip);
+
+
+template<> class DefHashFunc<IPoint>
+{
+public:
+ int hash(const IPoint &ip) const {
+ return 7*ip.m_x + 23*ip.m_y;
+ }
+};
+
+
+/**
+ * \brief Polylines with integer coordinates.
+ *
+ * This class represents integer polylines by a list of integer points.
+ * Such polylines are, e.g., used in layouts for representing bend
+ * point lists. Note that in this case, only the bend points are in the
+ * list and neither the start nor the end point.
+ */
+class OGDF_EXPORT IPolyline : public List<IPoint> {
+public:
+ //! Creates an empty integer polyline.
+ IPolyline() { }
+
+ //! Copy constructor.
+ IPolyline(const IPolyline &ipl) : List<IPoint>(ipl) { }
+
+ //! Assignment operator.
+ IPolyline &operator=(const IPolyline &ipl) {
+ List<IPoint>::operator =(ipl);
+ return *this;
+ }
+
+ //! Returns the euclidean length of the polyline.
+ double length() const;
+};
+
+
+
+/**
+ * \brief Real points.
+ *
+ * This class represent a two-dimensional point with real coordinates.
+ */
+class OGDF_EXPORT DPoint : public GenericPoint<double>
+{
+public:
+ //! Creates a real point (0,0).
+ DPoint() : GenericPoint<double>(0,0) { }
+
+ //! Creates a real point (\a x,\a y).
+ DPoint(double x, double y) : GenericPoint<double>(x,y) { }
+
+ //! Copy constructor.
+ DPoint(const DPoint &dp) : GenericPoint<double>(dp) { }
+
+ //! Relaxed equality operator.
+ bool operator==(const DPoint &dp) const {
+ return DIsEqual(m_x, dp.m_x) && DIsEqual(m_y,dp.m_y);
+ }
+
+ //! Returns the norm of the point.
+ double norm() const {
+ return sqrt(m_x*m_x + m_y*m_y);
+ }
+
+ //! Addition of real points.
+ DPoint operator+(const DPoint &p) const;
+
+ //! Subtraction of real points.
+ DPoint operator-(const DPoint &p) const;
+
+ //! Returns the euclidean distance between \a p and this point.
+ double distance(const DPoint &p) const;
+};
+
+//! Output operator for real points.
+OGDF_EXPORT ostream &operator<<(ostream &os, const DPoint &dp);
+
+
+/**
+ * \brief Vectors with real coordinates.
+ */
+class OGDF_EXPORT DVector : public DPoint {
+public:
+
+ //! Creates a vector (0,0).
+ DVector() : DPoint() { }
+
+ //! Creates a vector (\a x,\a y).
+ DVector(double x, double y) : DPoint(x, y) { }
+
+ //! Copy constructor.
+ DVector(const DVector &dv) : DPoint(dv) { }
+
+ //! Assignment operator.
+ DVector operator=(const DPoint &ip) {
+ if (this != &ip)
+ {
+ m_x = ip.m_x;
+ m_y = ip.m_y;
+ }
+ return *this;
+ }
+
+ //! Multiplies all coordinates with \a val.
+ DVector operator*(const double val) const;
+
+ //! Divides all coordinates by \a val.
+ DVector operator/(const double val) const;
+
+ //! Returns the length of the vector.
+ double length() const;
+
+ //! Returns the determinante of the vector.
+ double operator^(const DVector &dv) const;
+
+ //! Returns the scalar product of this vecor and \a dv.
+ double operator*(const DVector &dv) const;
+
+ /**
+ * \brief Returns a vector that is orthogonal to this vector.
+ *
+ * Returns the vector \f$(y/x,1)\f$ if \f$x\neq 0\f$, or \f$(1,0)\f$
+ * otherwise, where \f$(x,y)\f$ is this vector.
+ */
+ DVector operator++() const;
+
+ /**
+ * \brief Returns a vector that is orthogonal to this vector.
+ *
+ * Returns the vector \f$(-y/x,-1)\f$ if \f$x\neq 0\f$, or \f$(-1,0)\f$
+ * otherwise, where \f$(x,y)\f$ is this vector.
+ */
+ DVector operator--() const;
+};
+
+
+
+/**
+ * \brief Polylines with real coordinates.
+ *
+ * This class represents real polylines by a list of real points.
+ * Such polylines are, e.g., used in layouts for representing bend
+ * point lists.
+ */
+class OGDF_EXPORT DPolyline : public List<DPoint> {
+ static const double s_prec; //!< The conversion-precision.
+public:
+ //! Creates an empty integer polyline.
+ DPolyline() { }
+
+ //! Copy constructor.
+ DPolyline(const DPolyline &dpl) : List<DPoint>(dpl) { }
+
+ //! Assignment operator.
+ DPolyline &operator=(const DPolyline &dpl) {
+ List<DPoint>::operator =(dpl);
+ return *this;
+ }
+
+ //! Returns the euclidean length of the polyline.
+ double length() const;
+
+ /**
+ * \brief Returns a point on the polyline which is \a fraction * \a len
+ * away from the start point.
+ *
+ * @param fraction defines the fraction of \a lento be considered.
+ * @param len is the given length, or the length of the polyline if \a len < 0.
+ */
+ DPoint position(const double fraction, double len = -1.0) const;
+
+ //! Writes the polyline as graph in gml-format to file \a filename.
+ void writeGML(const char* filename) const;
+
+ //! Writes the polyline as graph in gml-format to output stream \a stream.
+ void writeGML(ostream &stream) const;
+
+ //! Deletes all successive points with equal coordinates.
+ void unify();
+
+ //! Deletes all redundant points on the polyline that lie on a straight line given by their adajcent points.
+ void normalize();
+
+ //! Deletes all redundant points on the polyline that lie on a straight line given by their adajcent points.
+ void normalize(DPoint src, //start point of the edge
+ DPoint tgt); //end point of the edge
+
+ //! Converts all coordinates rounded to \a s_prec decimal digits.
+ void convertToInt();
+
+ //void reConvertToDouble();
+};
+
+
+/**
+ * \brief Lines with real coordinates.
+ */
+class OGDF_EXPORT DLine {
+
+protected:
+ DPoint m_start; //!< The start point of the line.
+ DPoint m_end; //!< The end point of the line.
+
+public:
+
+ //! Creates an empty line.
+ DLine() : m_start(), m_end() {}
+
+ //! Creates a line with start point \a p1 and end point \a p2.
+ DLine(const DPoint &p1, const DPoint &p2) : m_start(p1), m_end(p2) {}
+
+ //! Copy constructor.
+ DLine(const DLine &dl) : m_start(dl.m_start), m_end(dl.m_end) {}
+
+ //! Creates a line with start point (\a x1,\a y1) and end point (\a x2,\a y2).
+ DLine(double x1, double y1, double x2, double y2) {
+ m_start.m_x = x1; m_start.m_y = y1; m_end.m_x = x2; m_end.m_y = y2;
+ }
+
+ //! Equality operator.
+ bool operator==(const DLine &dl) const {
+ return m_start == dl.m_start && m_end == dl.m_end;
+ }
+
+ //! Inequality operator.
+ bool operator!=(const DLine &dl) const {
+ return !(*this == dl);
+ }
+
+ //! Assignment operator.
+ DLine &operator= (const DLine &dl) {
+ if (this != &dl) { // don't assign myself
+ m_start = dl.m_start;
+ m_end = dl.m_end;
+ }
+ return *this;
+ }
+
+ //! Returns the start point of the line.
+ const DPoint &start() const { return m_start; }
+
+ //! Returns the end point of the line.
+ const DPoint &end() const { return m_end; }
+
+ //! Returns the x-coordinate of the difference (end point - start point).
+ double dx() const { return m_end.m_x - m_start.m_x; }
+
+ //! Returns the y-coordinate of the difference (end point - start point).
+ double dy() const { return m_end.m_y - m_start.m_y; }
+
+ //! Returns the slope of the line.
+ double slope() const { return (dx() == 0) ? DBL_MAX : dy()/dx(); }
+
+ //! Returns the value y' such that (0,y') lies on the unlimited straight-line define dby this line.
+ double yAbs() const { return (dx() == 0) ? DBL_MAX : m_start.m_y - (slope() * m_start.m_x); }
+
+ //! Returns true iff this line runs vertically.
+ bool isVertical() const { return (DIsEqual(dx(), 0.0)); }
+
+ //! Returns true iff this line runs horizontally.
+ bool isHorizontal() const { return (DIsEqual(dy(), 0.0)); }
+
+ /**
+ * \brief Returns true iff \a line and this line intersect.
+ *
+ * @param line is the second line.
+ * @param inter is assigned the intersection point if true is returned.
+ * @param endpoints determines if common endpoints are treated as intersection.
+ */
+ bool intersection(const DLine &line, DPoint &inter, bool endpoints = true) const;
+
+ //! Returns true iff \a p lie on this line.
+ bool contains(const DPoint &p) const;
+
+ //! Returns the length (euclidean distance between start and edn point) of this line.
+ double length() const {
+ return m_start.distance(m_end);
+ }
+
+ /**
+ * \brief Computes the intersection between this line and the horizontal line through y = \a horAxis.
+ *
+ * @param horAxis defines the horizontal line.
+ * @param crossing is assigned the x-coordinate of the intersection point.
+ *
+ * \return the number of intersection points (0 = none, 1 = one, 2 = this
+ * line lies on the horizontal line through y = \a horAxis).
+ */
+ int horIntersection(const double horAxis, double &crossing) const;
+
+ // gives the intersection with the vertical axis 'verAxis', returns the number of intersections
+ // 0 = no, 1 = one, 2 = infinity or both end-points, e.g. parallel on this axis
+ /**
+ * \brief Computes the intersection between this line and the vertical line through x = \a verAxis.
+ *
+ * @param verAxis defines the vertical line.
+ * @param crossing is assigned the y-coordinate of the intersection point.
+ *
+ * \return the number of intersection points (0 = none, 1 = one, 2 = this
+ * line lies on the vertical line through x = \a verAxis).
+ */
+ int verIntersection(const double verAxis, double &crossing) const;
+};
+
+//! Output operator for lines.
+ostream &operator<<(ostream &os, const DLine &dl);
+
+
+/**
+ * \brief Rectangles with real coordinates.
+ */
+class OGDF_EXPORT DRect {
+
+private:
+ DPoint m_p1; //!< The lower left point of the rectangle.
+ DPoint m_p2; //!< The upper right point of the rectangle.
+
+public:
+ //! Creates a rectangle with lower left and upper right point (0,0).
+ DRect() : m_p1(), m_p2() {}
+
+ //! Creates a rectangle with lower left point \a p1 and upper right point \a p2.
+ DRect(const DPoint &p1, const DPoint &p2) : m_p1(p1), m_p2(p2)
+ { normalize(); }
+
+ //! Creates a rectangle with lower left point (\a x1,\a y1) and upper right point (\a x1,\a y2).
+ DRect(double x1, double y1, double x2, double y2) {
+ m_p1.m_x = x1; m_p1.m_y = y1; m_p2.m_x = x2; m_p2.m_y = y2;
+ normalize();
+ }
+
+ //! Creates a rectangle defined by the end points of line \a dl.
+ DRect(const DLine &dl) : m_p1(dl.start()), m_p2(dl.end())
+ { normalize(); }
+
+ //! Copy constructor.
+ DRect(const DRect &dr) : m_p1(dr.m_p1), m_p2(dr.m_p2)
+ { normalize(); }
+
+ //! Equality operator.
+ bool operator==(const DRect &dr) const {
+ return m_p1 == dr.m_p1 && m_p2 == dr.m_p2;
+ }
+
+ //! Inequality operator.
+ bool operator!=(const DRect &dr) const {
+ return !(*this == dr);
+ }
+
+ //! Assignment operator.
+ DRect &operator= (const DRect &dr) {
+ if (this != &dr) { // don't assign myself
+ m_p1 = dr.m_p1;
+ m_p2 = dr.m_p2;
+ }
+ return *this;
+ }
+
+ //! Returns the width of the rectangle.
+ double width() const {
+ return m_p2.m_x - m_p1.m_x;
+ }
+
+ //! Returns the height of the rectangle.
+ double height() const {
+ return m_p2.m_y - m_p1.m_y;
+ }
+
+ /**
+ * \brief Normalizes the rectangle.
+ *
+ * Makes sure that the lower left point lies below and left of the upper
+ * right point.
+ */
+ void normalize() {
+ if (width() < 0) swap(m_p2.m_x, m_p1.m_x);
+ if (height() < 0) swap(m_p2.m_y, m_p1.m_y);
+ }
+
+ //! Returns the lower left point of the rectangle.
+ const DPoint &p1() const { return m_p1; }
+
+ //! Returns the upper right point of the rectangle.
+ const DPoint &p2() const { return m_p2; }
+
+ //! Returns the top side of the rectangle.
+ const DLine topLine() const {
+ return DLine( DPoint(m_p1.m_x, m_p2.m_y), DPoint(m_p2.m_x, m_p2.m_y));
+ }
+
+ //! Returns the right side of the rectangle.
+ const DLine rightLine() const {
+ return DLine( DPoint(m_p2.m_x, m_p2.m_y), DPoint(m_p2.m_x, m_p1.m_y));
+ }
+
+ //! Returns the left side of the rectangle.
+ const DLine leftLine() const {
+ return DLine( DPoint(m_p1.m_x, m_p1.m_y), DPoint(m_p1.m_x, m_p2.m_y));
+ }
+
+ //! Returns the bottom side of the rectangle.
+ const DLine bottomLine() const {
+ return DLine( DPoint(m_p2.m_x, m_p1.m_y), DPoint(m_p1.m_x, m_p1.m_y));
+ }
+
+ //! Swaps the y-coordinates of the two points.
+ void yInvert() { swap(m_p1.m_y, m_p2.m_y); }
+
+ //! Swaps the x-coordinates of the two points.
+ void xInvert() { swap(m_p1.m_x, m_p2.m_x); }
+
+ //! Returns true iff \a p lies within this rectangle.
+ bool contains(const DPoint &p) const {
+ if (DIsLess (p.m_x, m_p1.m_x) ||
+ DIsGreater(p.m_x, m_p2.m_x) ||
+ DIsLess (p.m_y, m_p1.m_y) ||
+ DIsGreater(p.m_y, m_p2.m_y))
+ return false;
+ return true;
+ }
+};
+
+//! Output operator for rectangles.
+OGDF_EXPORT ostream &operator<<(ostream &os, const DRect &dr);
+
+
+/**
+* \brief Scaling between coordinate systems.
+*/
+class OGDF_EXPORT DScaler {
+
+private:
+
+ const DRect *m_from; //!< Rectangluar area in source coordinate system.
+ const DRect *m_to; //!< Rectangluar area in target coordinate system.
+
+ double m_factorX; //!< The scaling factor for the x-coordinates.
+ double m_factorY; //!< The scaling factor for the y-coordinates.
+ double m_offsetX; //!< The offset for the x-coordinates.
+ double m_offsetY; //!< The offset for the y-coordinates.
+
+public:
+ //! Creates a scaler for scaling from area \a from to area \a to.
+ DScaler(const DRect &from, const DRect &to) :
+ m_from(&from),
+ m_to(&to),
+ m_factorX(to.width()/from.width()),
+ m_factorY(to.height()/from.height()),
+ m_offsetX(to.p1().m_x - from.p1().m_x * m_factorX),
+ m_offsetY(to.p1().m_y - from.p1().m_y * m_factorY) { }
+
+ ~DScaler() {}
+
+ //! Returns the rectangle in the source coordinate system.
+ const DRect &from() const { return *m_from; }
+
+ //! Returns the rectangle in the target coordinate system.
+ const DRect &to() const { return *m_to; }
+
+ //! Transforms x-coordinates from source to target coordinate system.
+ double scaleToX(double x) { return x * m_factorX + m_offsetX; }
+
+ //! Transforms y-coordinates from source to target coordinate system.
+ double scaleToY(double y) { return y * m_factorY + m_offsetY; }
+
+ //! Scales a horizontal length from source to target coordinate system.
+ double scaleWidth(double width) { return width * m_to->width() /m_from->width(); }
+
+ //! Scales a vertical length from source to target coordinate system.
+ double scaleHeight(double height) { return height * m_to->height()/m_from->height(); }
+};
+
+
+//! Output operator for scalers.
+OGDF_EXPORT ostream &operator<<(ostream &os, const DScaler &ds);
+
+
+/**
+ * \brief Line segments with real coordinates.
+ */
+class OGDF_EXPORT DSegment : public DLine {
+
+protected:
+
+public:
+
+ //! Creates an empty line segment.
+ DSegment() : DLine() {}
+
+ //! Creates a line segment from \a p1 to \a p2.
+ DSegment(const DPoint &p1, const DPoint &p2) : DLine(p1, p2) {}
+
+ //! Creates a line segment defined by the start and end point of line \a dl.
+ DSegment(const DLine &dl) : DLine(dl) {}
+
+ //! Creates a line segment from (\a x1,\a y1) to (\a x2,\a y2).
+ DSegment(double x1, double y1, double x2, double y2) : DLine(x1, y1, x2, y2) {}
+
+ //! Copy constructor.
+ DSegment(const DSegment &ds) : DLine(ds) {}
+
+
+ /**
+ * \brief Determines if \a segment is left or right of this segment.
+ *
+ * \return a positve number if \a segment is left of this segment, and a
+ * a negative number if \a segment is right of this segment.
+ */
+ double det(const DSegment &segment) const {
+ return (dx() * segment.dy() - dy() * segment.dx());
+ }
+};
+
+
+/**
+ * \brief Polygons with real coordinates.
+ */
+class OGDF_EXPORT DPolygon : public DPolyline {
+
+protected:
+
+ bool m_counterclock; //!< If true points are given in conter-clockwise order.
+
+public:
+ /**
+ * \brief Creates an empty polygon.
+ *
+ * @param cc determines in which order the points will be given; true means
+ * counter-clockwise, false means clockwise.
+ */
+ DPolygon(bool cc = true) : m_counterclock(cc) { }
+
+ //! Creates a polgon from a rectangle.
+ DPolygon(const DRect &rect, bool cc = true) : m_counterclock(cc) {
+ operator=(rect);
+ }
+
+ //! Copy constructor.
+ DPolygon(const DPolygon &dop) : DPolyline(dop), m_counterclock(dop.m_counterclock) { }
+
+ //! Returns true iff points are given in counter-clockwise order.
+ bool counterclock() { return m_counterclock; }
+
+ //! Assignment operator.
+ DPolygon &operator=(const DPolygon &dop) {
+ List<DPoint>::operator =(dop);
+ m_counterclock = dop.m_counterclock;
+ return *this;
+ }
+
+ //! Assignment operator (for assigning from a rectangle).
+ DPolygon &operator=(const DRect &rect);
+
+ //! Returns the line segment that starts at position \a it.
+ DSegment segment(ListConstIterator<DPoint> it) const;
+
+
+ //! Inserts point \a p, that must lie on a polygon segment.
+ ListIterator<DPoint> insertPoint(const DPoint &p) {
+ return insertPoint(p, begin(), begin());
+ }
+
+ /**
+ * \brief Inserts point \a p, but just searching from point \a p1 to \a p2.
+ *
+ * That is, from the segment starting at \a p1 to the segment ending at \a p2.
+ */
+ ListIterator<DPoint> insertPoint(const DPoint &p,
+ ListIterator<DPoint> p1,
+ ListIterator<DPoint> p2);
+
+ //! Inserts point p on every segment (a,b) with \a p in the open range ]a, b[.
+ void insertCrossPoint(const DPoint &p);
+
+ //! Returns the list of intersection points of this polygon with \a p.
+ int getCrossPoints(const DPolygon &p, List<DPoint> &crossPoints) const;
+
+ //! Deletes all consecutive points that are equal.
+ void unify();
+
+ //! Deletes all points, which are not facets.
+ void normalize();
+
+ //! Writes the polygon as graph in gml-format to file \a filename.
+ void writeGML(const char* filename) const;
+
+ //! Writes the polygon as graph in gml-format to output stream \a stream.
+ void writeGML(ostream &stream) const;
+
+ /**
+ * \brief Checks wether a Point /a p is inside the Poylgon or not.
+ * \note Polygons with crossings have inner areas that count as outside!
+ * \par p the Point to check.
+ * return true if Point is inside.
+ */
+ bool containsPoint(DPoint &p) const;
+};
+
+//! Output operator for polygons.
+OGDF_EXPORT ostream &operator<<(ostream &os, const DPolygon &dop);
+
+
+
+} // end namespace ogdf
+
+#endif
diff --git a/ogdf/basic/memory.h b/ogdf/basic/memory.h
new file mode 100644
index 0000000..3ec848f
--- /dev/null
+++ b/ogdf/basic/memory.h
@@ -0,0 +1,126 @@
+/*
+ * $Revision: 2523 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-02 20:59:27 +0200 (Mon, 02 Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of memory manager for allocating small
+ * pieces of memory
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_MEMORY_H
+#define OGDF_MEMORY_H
+
+
+#include <stdlib.h>
+#include <new>
+
+
+//---------------------------------------------------------------------
+// configuration of memory-manager (can also be set by compiler flag)
+//
+// the good old pool allocator (not thread-safe)
+//#define OGDF_MEMORY_POOL_NTS
+//
+// just using malloc/free (thread-safe)
+#define OGDF_MEMORY_MALLOC_TS
+//
+// new buffered-pool allocator per thread pool (thread-safe)
+//#define OGDF_MEMORY_POOL_TS
+//
+// default (nothing defined): depending on system / compiler
+//---------------------------------------------------------------------
+
+// By default, we use the non-thread safe variant on cygwin and g++ 3.x
+// since thread-local storage is not working there, and a thread-safe
+// pool allocator otherwise.
+#if !defined(OGDF_MEMORY_POOL_NTS) && !defined(OGDF_MEMORY_MALLOC_TS) && !defined(OGDF_MEMORY_POOL_TS)
+#define OGDF_MEMORY_POOL_TS
+#endif
+
+#include "../internal/basic/PoolMemoryAllocator.h"
+#include "../internal/basic/MallocMemoryAllocator.h"
+
+
+namespace ogdf {
+
+#define OGDF_MM(Alloc) \
+public: \
+static void *operator new(size_t nBytes) { \
+ if(OGDF_LIKELY(Alloc::checkSize(nBytes))) \
+ return Alloc::allocate(nBytes); \
+ else \
+ return MallocMemoryAllocator::allocate(nBytes); \
+} \
+\
+static void operator delete(void *p, size_t nBytes) { \
+ if(OGDF_LIKELY(p != 0)) { \
+ if(OGDF_LIKELY(Alloc::checkSize(nBytes))) \
+ Alloc::deallocate(nBytes, p); \
+ else \
+ MallocMemoryAllocator::deallocate(nBytes, p); \
+ } \
+} \
+static void *operator new(size_t, void *p) { return p; } \
+static void operator delete(void *, void *) { }
+
+
+#define OGDF_NEW new
+
+#ifdef OGDF_MEMORY_MALLOC_TS
+#define OGDF_ALLOCATOR ogdf::MallocMemoryAllocator
+#else
+#define OGDF_ALLOCATOR ogdf::PoolMemoryAllocator
+#endif
+
+//! Creates new and delete operators in a class using ogdf's memory allocator.
+#define OGDF_NEW_DELETE OGDF_MM(OGDF_ALLOCATOR)
+
+//! Creates new and delete operators in a class using the malloc memory allocator.
+#define OGDF_MALLOC_NEW_DELETE OGDF_MM(MallocMemoryAllocator)
+
+} // namespace ogdf
+
+
+#endif
diff --git a/ogdf/basic/simple_graph_alg.cpp b/ogdf/basic/simple_graph_alg.cpp
new file mode 100644
index 0000000..dd36aef
--- /dev/null
+++ b/ogdf/basic/simple_graph_alg.cpp
@@ -0,0 +1,1056 @@
+/*
+ * $Revision: 2594 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-15 15:35:29 +0200 (So, 15. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of simple graph algorithms
+ *
+ * \author Carsten Gutwenger, Sebastian Leipert
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "simple_graph_alg.h"
+#include "SList.h"
+#include "Stack.h"
+#include "GraphCopy.h"
+#include "tuples.h"
+#include "BoundedStack.h"
+
+
+namespace ogdf {
+
+
+//---------------------------------------------------------
+// isLoopFree(), makeLoopFree()
+// testing for self-loops, removing self-loops
+//---------------------------------------------------------
+bool isLoopFree(const Graph &G)
+{
+ edge e;
+ forall_edges(e,G)
+ if(e->isSelfLoop()) return false;
+
+ return true;
+}
+
+
+void makeLoopFree(Graph &G)
+{
+ edge e, eNext;
+ for (e = G.firstEdge(); e; e = eNext) {
+ eNext = e->succ();
+ if (e->isSelfLoop()) G.delEdge(e);
+ }
+}
+
+
+//---------------------------------------------------------
+// isParallelFree(), makeParallelFree()
+// testing for multi-edges, removing multi-edges
+//---------------------------------------------------------
+
+void parallelFreeSort(const Graph &G, SListPure<edge> &edges)
+{
+ G.allEdges(edges);
+
+ BucketSourceIndex bucketSrc;
+ edges.bucketSort(0,G.maxNodeIndex(),bucketSrc);
+
+ BucketTargetIndex bucketTgt;
+ edges.bucketSort(0,G.maxNodeIndex(),bucketTgt);
+}
+
+
+bool isParallelFree(const Graph &G)
+{
+ if (G.numberOfEdges() <= 1) return true;
+
+ SListPure<edge> edges;
+ parallelFreeSort(G,edges);
+
+ SListConstIterator<edge> it = edges.begin();
+ edge ePrev = *it, e;
+ for(it = ++it; it.valid(); ++it, ePrev = e) {
+ e = *it;
+ if (ePrev->source() == e->source() && ePrev->target() == e->target())
+ return false;
+ }
+
+ return true;
+}
+
+
+int numParallelEdges(const Graph &G)
+{
+ if (G.numberOfEdges() <= 1) return 0;
+
+ SListPure<edge> edges;
+ parallelFreeSort(G,edges);
+
+ int num = 0;
+ SListConstIterator<edge> it = edges.begin();
+ edge ePrev = *it, e;
+ for(it = ++it; it.valid(); ++it, ePrev = e) {
+ e = *it;
+ if (ePrev->source() == e->source() && ePrev->target() == e->target())
+ ++num;
+ }
+
+ return num;
+}
+
+
+
+//---------------------------------------------------------
+// isParallelFreeUndirected(), makeParallelFreeUndirected()
+// testing for (undirected) multi-edges, removing (undirected) multi-edges
+//---------------------------------------------------------
+
+void parallelFreeSortUndirected(const Graph &G,
+ SListPure<edge> &edges,
+ EdgeArray<int> &minIndex,
+ EdgeArray<int> &maxIndex)
+{
+ G.allEdges(edges);
+
+ edge e;
+ forall_edges(e,G) {
+ int srcIndex = e->source()->index(), tgtIndex = e->target()->index();
+ if (srcIndex <= tgtIndex) {
+ minIndex[e] = srcIndex; maxIndex[e] = tgtIndex;
+ } else {
+ minIndex[e] = tgtIndex; maxIndex[e] = srcIndex;
+ }
+ }
+
+ BucketEdgeArray bucketMin(minIndex), bucketMax(maxIndex);
+ edges.bucketSort(0,G.maxNodeIndex(),bucketMin);
+ edges.bucketSort(0,G.maxNodeIndex(),bucketMax);
+}
+
+
+bool isParallelFreeUndirected(const Graph &G)
+{
+ if (G.numberOfEdges() <= 1) return true;
+
+ SListPure<edge> edges;
+ EdgeArray<int> minIndex(G), maxIndex(G);
+ parallelFreeSortUndirected(G,edges,minIndex,maxIndex);
+
+ SListConstIterator<edge> it = edges.begin();
+ edge ePrev = *it, e;
+ for(it = ++it; it.valid(); ++it, ePrev = e) {
+ e = *it;
+ if (minIndex[ePrev] == minIndex[e] && maxIndex[ePrev] == maxIndex[e])
+ return false;
+ }
+
+ return true;
+}
+
+
+int numParallelEdgesUndirected(const Graph &G)
+{
+ if (G.numberOfEdges() <= 1) return 0;
+
+ SListPure<edge> edges;
+ EdgeArray<int> minIndex(G), maxIndex(G);
+ parallelFreeSortUndirected(G,edges,minIndex,maxIndex);
+
+ int num = 0;
+ SListConstIterator<edge> it = edges.begin();
+ edge ePrev = *it, e;
+ for(it = ++it; it.valid(); ++it, ePrev = e) {
+ e = *it;
+ if (minIndex[ePrev] == minIndex[e] && maxIndex[ePrev] == maxIndex[e])
+ ++num;
+ }
+
+ return num;
+}
+
+
+
+//---------------------------------------------------------
+// isConnected(), makeConnected()
+// testing connectivity, establishing connectivity
+//---------------------------------------------------------
+
+bool isConnected(const Graph &G)
+{
+ node v = G.firstNode();
+ if (v == 0) return true;
+
+ int count = 0;
+ NodeArray<bool> visited(G,false);
+ BoundedStack<node> S(G.numberOfNodes());
+
+ S.push(v);
+ visited[v] = true;
+ while(!S.empty()) {
+ v = S.pop();
+ ++count;
+
+ adjEntry adj;
+ forall_adj(adj,v) {
+ node w = adj->twinNode();
+ if(!visited[w]) {
+ visited[w] = true;
+ S.push(w);
+ }
+ }
+ }
+
+ return (count == G.numberOfNodes());
+}
+
+
+void makeConnected(Graph &G, List<edge> &added)
+{
+ added.clear();
+ if (G.numberOfNodes() == 0) return;
+ NodeArray<bool> visited(G,false);
+ BoundedStack<node> S(G.numberOfNodes());
+
+ node pred = 0, u;
+ forall_nodes(u,G)
+ {
+ if (visited[u]) continue;
+
+ node vMinDeg = u;
+ int minDeg = u->degree();
+
+ S.push(u);
+ visited[u] = true;
+
+ while(!S.empty())
+ {
+ node v = S.pop();
+
+ adjEntry adj;
+ forall_adj(adj,v) {
+ node w = adj->twinNode();
+ if(!visited[w]) {
+ visited[w] = true;
+ S.push(w);
+
+ int wDeg = w->degree();
+ if (wDeg < minDeg) {
+ vMinDeg = w;
+ minDeg = wDeg;
+ }
+ }
+ }
+ }
+
+ if (pred)
+ added.pushBack(G.newEdge(pred,vMinDeg));
+ pred = vMinDeg;
+ }
+}
+
+
+int connectedComponents(const Graph &G, NodeArray<int> &component)
+{
+ int nComponent = 0;
+ component.fill(-1);
+
+ StackPure<node> S;
+
+ node v;
+ forall_nodes(v,G) {
+ if (component[v] != -1) continue;
+
+ S.push(v);
+ component[v] = nComponent;
+
+ while(!S.empty()) {
+ node w = S.pop();
+ edge e;
+ forall_adj_edges(e,w) {
+ node x = e->opposite(w);
+ if (component[x] == -1) {
+ component[x] = nComponent;
+ S.push(x);
+ }
+ }
+ }
+
+ ++nComponent;
+ }
+
+ return nComponent;
+}
+
+//return the isolated nodes too, is used in incremental layout
+int connectedIsolatedComponents(const Graph &G, List<node> &isolated,
+ NodeArray<int> &component)
+{
+ int nComponent = 0;
+ component.fill(-1);
+
+ StackPure<node> S;
+
+ node v;
+ forall_nodes(v,G) {
+ if (component[v] != -1) continue;
+
+ S.push(v);
+ component[v] = nComponent;
+
+ while(!S.empty()) {
+ node w = S.pop();
+ if (w->degree() == 0) isolated.pushBack(w);
+ edge e;
+ forall_adj_edges(e,w) {
+ node x = e->opposite(w);
+ if (component[x] == -1) {
+ component[x] = nComponent;
+ S.push(x);
+ }
+ }
+ }
+
+ ++nComponent;
+ }
+
+ return nComponent;
+}//connectedIsolated
+
+
+//---------------------------------------------------------
+// isBiconnected(), makeBiconnected()
+// testing biconnectivity, establishing biconnectivity
+//---------------------------------------------------------
+static node dfsIsBicon (const Graph &G, node v, node father,
+ NodeArray<int> &number, NodeArray<int> &lowpt, int &numCount)
+{
+ node first_son = 0;
+
+ lowpt[v] = number[v] = ++numCount;
+
+ edge e;
+ forall_adj_edges(e,v) {
+ node w = e->opposite(v);
+ if (v == w) continue; // ignore self-loops
+
+ if (number[w] == 0) {
+ if (first_son == 0) first_son = w;
+
+ node cutVertex = dfsIsBicon(G,w,v,number,lowpt,numCount);
+ if (cutVertex) return cutVertex;
+
+ // is v cut vertex ?
+ if (lowpt[w] >= number[v] && (w != first_son || father != 0))
+ return v;
+
+ if (lowpt[w] < lowpt[v]) lowpt[v] = lowpt[w];
+
+ } else {
+
+ if (number[w] < lowpt[v]) lowpt[v] = number[w];
+ }
+ }
+
+ return 0;
+}
+
+
+bool isBiconnected(const Graph &G, node &cutVertex)
+{
+ if (G.empty()) return true;
+
+ NodeArray<int> number(G,0);
+ NodeArray<int> lowpt(G);
+ int numCount = 0;
+
+ cutVertex = dfsIsBicon(G,G.firstNode(),0,number,lowpt,numCount);
+
+ return (numCount == G.numberOfNodes() && cutVertex == 0);
+}
+
+
+static void dfsMakeBicon (Graph &G,
+ node v, node father,
+ NodeArray<int> &number,
+ NodeArray<int> &lowpt,
+ int &numCount,
+ List<edge> &added)
+{
+ node predSon = 0;
+
+ lowpt[v] = number[v] = ++numCount;
+
+ edge e;
+ forall_adj_edges(e,v) {
+ node w = e->opposite(v);
+ if (v == w) continue; // ignore self-loops
+
+ if (number[w] == 0) {
+
+ dfsMakeBicon(G,w,v,number,lowpt,numCount,added);
+
+ // is v cut vertex ?
+ if (lowpt[w] >= number[v]) {
+ if (predSon == 0 && father != 0)
+ added .pushBack(G.newEdge(w,father));
+
+ else if (predSon != 0)
+ added.pushBack(G.newEdge(w,predSon));
+ }
+
+ if (lowpt[w] < lowpt[v]) lowpt[v] = lowpt[w];
+ predSon = w;
+
+ } else {
+
+ if (number[w] < lowpt[v]) lowpt[v] = number[w];
+ }
+ }
+}
+
+
+void makeBiconnected(Graph &G, List<edge> &added)
+{
+ if (G.empty()) return;
+
+ makeConnected(G,added);
+
+ NodeArray<int> number(G,0);
+ NodeArray<int> lowpt(G);
+ int numCount = 0;
+
+ dfsMakeBicon(G,G.firstNode(),0,number,lowpt,numCount,added);
+}
+
+
+//---------------------------------------------------------
+// biconnectedComponents()
+// computing biconnected components
+//---------------------------------------------------------
+static void dfsBiconComp (const Graph &G,
+ node v,
+ node father,
+ NodeArray<int> &number,
+ NodeArray<int> &lowpt,
+ StackPure<node> &called,
+ EdgeArray<int> &component,
+ int &nNumber,
+ int &nComponent)
+{
+ lowpt[v] = number[v] = ++nNumber;
+ called.push(v);
+
+ edge e;
+ forall_adj_edges(e,v) {
+ node w = e->opposite(v);
+ if (v == w) continue; // ignore self-loops
+
+ if (number[w] == 0) {
+
+ dfsBiconComp(G,w,v,number,lowpt,called,component,
+ nNumber,nComponent);
+
+ if (lowpt[w] < lowpt[v]) lowpt[v] = lowpt[w];
+
+ } else {
+
+ if (number[w] < lowpt[v]) lowpt[v] = number[w];
+ }
+ }
+
+ if (father && (lowpt[v] == number[father])) {
+ node w;
+ do {
+ w = called.top(); called.pop();
+
+ forall_adj_edges(e,w) {
+ if (number[w] > number[e->opposite(w)])
+ component[e] = nComponent;
+ }
+ } while (w != v);
+
+ ++nComponent;
+ }
+}
+
+
+int biconnectedComponents(const Graph &G, EdgeArray<int> &component)
+{
+ if (G.empty()) return 0;
+
+ StackPure<node> called;
+ NodeArray<int> number(G,0);
+ NodeArray<int> lowpt(G);
+ int nNumber = 0, nComponent = 0, nIsolated = 0;
+
+ node v;
+ forall_nodes(v,G) {
+ if (number[v] == 0) {
+ bool isolated = true;
+ edge e;
+ forall_adj_edges(e,v)
+ if (!e->isSelfLoop()) {
+ isolated = false; break;
+ }
+
+ if (isolated)
+ ++nIsolated;
+ else
+ dfsBiconComp(G,v,0,number,lowpt,called,component,
+ nNumber,nComponent);
+ }
+ }
+
+ return nComponent + nIsolated;
+}
+
+
+//---------------------------------------------------------
+// isTriconnected()
+// testing triconnectivity
+//---------------------------------------------------------
+bool isTriconnectedPrimitive(const Graph &G, node &s1, node &s2)
+{
+ s1 = s2 = 0;
+
+ if (isConnected(G) == false)
+ return false;
+
+ if (isBiconnected(G,s1) == false)
+ return false;
+
+ if (G.numberOfNodes() <= 3)
+ return true;
+
+ // make a copy of G
+ GraphCopySimple GC(G);
+
+ // for each node v in G, we test if G \ v is biconnected
+ node v;
+ forall_nodes(v,G)
+ {
+ node vC = GC.copy(v), wC;
+
+ // store adjacent nodes
+ SListPure<node> adjacentNodes;
+ edge eC;
+ forall_adj_edges(eC,vC) {
+ wC = eC->opposite(vC);
+ // forget self-loops (vC would no longer be in GC!)
+ if (wC != vC)
+ adjacentNodes.pushBack(wC);
+ }
+
+ GC.delNode(vC);
+
+ // test for biconnectivity
+ if(isBiconnected(GC,wC) == false) {
+ s1 = v; s2 = GC.original(wC);
+ return false;
+ }
+
+ // restore deleted node with adjacent edges
+ vC = GC.newNode(v);
+ SListConstIterator<node> it;
+ for(it = adjacentNodes.begin(); it.valid(); ++it)
+ GC.newEdge(vC,*it);
+ }
+
+ return true;
+}
+
+
+//--------------------------------------------------------------------------
+// triangulate()
+//--------------------------------------------------------------------------
+void triangulate(Graph &G)
+{
+ OGDF_ASSERT(isSimple(G));
+
+ CombinatorialEmbedding E(G);
+
+ OGDF_ASSERT(E.consistencyCheck());
+
+ node v;
+ edge e;
+ adjEntry adj, succ, succ2, succ3;
+ NodeArray<int> marked(E.getGraph(), 0);
+
+ forall_nodes(v,E.getGraph()) {
+ marked.init(E.getGraph(), 0);
+
+ forall_adj(adj,v) {
+ marked[adj->twinNode()] = 1;
+ }
+
+ // forall faces adj to v
+ forall_adj(adj,v) {
+ succ = adj->faceCycleSucc();
+ succ2 = succ->faceCycleSucc();
+
+ if (succ->twinNode() != v && adj->twinNode() != v) {
+ while (succ2->twinNode() != v) {
+ if (marked[succ2->theNode()] == 1) {
+ // edge e=(x2,x4)
+ succ3 = succ2->faceCycleSucc();
+ E.splitFace(succ, succ3);
+ }
+ else {
+ // edge e=(v=x1,x3)
+ e = E.splitFace(adj, succ2);
+ marked[succ2->theNode()] = 1;
+
+ // old adj is in wrong face
+ adj = e->adjSource();
+ }
+ succ = adj->faceCycleSucc();
+ succ2 = succ->faceCycleSucc();
+ }
+ }
+ }
+ }
+}
+
+
+//--------------------------------------------------------------------------
+// isAcyclic(), isAcyclicUndirected(), makeAcyclic(), makeAcyclicByReverse()
+// testing acyclicity, establishing acyclicity
+//--------------------------------------------------------------------------
+void dfsIsAcyclic(const Graph &G,
+ node v,
+ NodeArray<int> &number,
+ NodeArray<int> &completion,
+ int &nNumber,
+ int &nCompletion)
+{
+ number[v] = ++nNumber;
+
+ edge e;
+ forall_adj_edges(e,v) {
+ node w = e->target();
+
+ if (number[w] == 0)
+ dfsIsAcyclic(G,w,number,completion,nNumber,nCompletion);
+ }
+
+ completion[v] = ++nCompletion;
+}
+
+
+void dfsIsAcyclicUndirected(const Graph &G,
+ node v,
+ NodeArray<int> &number,
+ int &nNumber,
+ List<edge> &backedges)
+{
+ number[v] = ++nNumber;
+
+ adjEntry adj;
+ node w;
+ forall_adj(adj,v) {
+ w = adj->twinNode();
+ if (number[w] == 0) {
+ dfsIsAcyclicUndirected(G,w,number,nNumber,backedges);
+ } else {
+ if (number[w] > number[v]) {
+ backedges.pushBack(adj->theEdge());
+ }
+ }
+ }
+}
+
+
+bool isAcyclic(const Graph &G, List<edge> &backedges)
+{
+ backedges.clear();
+
+ NodeArray<int> number(G,0), completion(G);
+ int nNumber = 0, nCompletion = 0;
+
+ node v;
+ forall_nodes(v,G)
+ if (number[v] == 0)
+ dfsIsAcyclic(G,v,number,completion,nNumber,nCompletion);
+
+ edge e;
+ forall_edges(e,G) {
+ node src = e->source(), tgt = e->target();
+
+ if (number[src] >= number[tgt] && completion[src] <= completion[tgt])
+ backedges.pushBack(e);
+ }
+
+ return backedges.empty();
+}
+
+
+bool isAcyclicUndirected(const Graph &G, List<edge> &backedges)
+{
+ backedges.clear();
+ int nNumber = 0;
+ NodeArray<int> number(G,0);
+
+ node v;
+ forall_nodes(v,G) {
+ if (number[v] == 0) {
+ dfsIsAcyclicUndirected(G,v,number,nNumber,backedges);
+ }
+ }
+ return backedges.empty();
+}
+
+
+void makeAcyclic(Graph &G)
+{
+ List<edge> backedges;
+ isAcyclic(G,backedges);
+
+ ListIterator<edge> it;
+ for(it = backedges.begin(); it.valid(); ++it)
+ G.delEdge(*it);
+}
+
+
+void makeAcyclicByReverse(Graph &G)
+{
+ List<edge> backedges;
+ isAcyclic(G,backedges);
+
+ ListIterator<edge> it;
+ for(it = backedges.begin(); it.valid(); ++it)
+ if (!(*it)->isSelfLoop()) G.reverseEdge(*it);
+}
+
+
+//---------------------------------------------------------
+// hasSingleSource(), hasSingleSink()
+// testing for single source/sink
+//---------------------------------------------------------
+bool hasSingleSource(const Graph& G, node &s)
+{
+ node v;
+ s = 0;
+
+ forall_nodes(v,G) {
+ if (v->indeg() == 0) {
+ if (s != 0) {
+ s = 0;
+ return false;
+ } else s = v;
+ }
+ }
+ return (G.empty() || s != 0);
+}
+
+
+bool hasSingleSink(const Graph& G, node &t)
+{
+ node v;
+ t = 0;
+
+ forall_nodes(v,G) {
+ if (v->outdeg() == 0) {
+ if (t != 0) {
+ t = 0;
+ return false;
+ } else t = v;
+ }
+ }
+ return (G.empty() || t != 0);
+}
+
+
+//---------------------------------------------------------
+// isStGraph()
+// true <=> G is st-graph, i.e., is acyclic, contains exactly one source s
+// and one sink t, and the edge (s,t); returns single source s and single
+// sink t if contained (otherwise they are set to 0), and edge st if
+// contained (otherwise 0)
+//---------------------------------------------------------
+bool isStGraph(const Graph &G, node &s, node &t, edge &st)
+{
+ st = 0;
+
+ hasSingleSource(G,s);
+ hasSingleSink (G,t);
+
+ if (s == 0 || t == 0 || isAcyclic(G) == false) {
+ s = t = 0;
+ return false;
+ }
+
+ edge e;
+ forall_adj_edges(e,s) {
+ if (e->target() == t) {
+ st = e;
+ break;
+ }
+ }
+
+ return (st != 0);
+}
+
+
+//---------------------------------------------------------
+// topologicalNumbering()
+// computes a topological numbering of an acyclic graph
+//---------------------------------------------------------
+
+void topologicalNumbering(const Graph &G, NodeArray<int> &num)
+{
+ BoundedStack<node> S(G.numberOfNodes());
+ NodeArray<int> indeg(G);
+
+ node v;
+ forall_nodes(v,G)
+ if((indeg[v] = v->indeg()) == 0)
+ S.push(v);
+
+ int count = 0;
+ while(!S.empty()) {
+ node v = S.pop();
+ num[v] = count++;
+
+ edge e;
+ forall_adj_edges(e,v) {
+ node u = e->target();
+ if(u != v) {
+ if(--indeg[u] == 0)
+ S.push(u);
+ }
+ }
+ }
+}
+
+
+//---------------------------------------------------------
+// strongComponents()
+// computes the strongly connected components
+//---------------------------------------------------------
+
+//! Computes the strongly connected components with the algorithm of Tarjan.
+/**
+ * @param G is the input graph.
+ * @param w is the current node.
+ * @param S is the stack containing all vertices of the current
+ * component during the algorithm
+ * @param pre is the preorder number.
+ * @param low is the lowest reachable preorder number (lowpoint).
+ * @param cnt is the counter for the dfs-number.
+ * @param scnt is the counter for the components.
+ * @param component is assigned a mapping from nodes to component numbers.
+ */
+void dfsStrongComponents(
+ const Graph& G,
+ node w,
+ BoundedStack<node>& S,
+ NodeArray<int>& pre,
+ NodeArray<int>& low,
+ int& cnt,
+ int& scnt,
+ NodeArray<int>& component)
+{
+ S.push(w);
+ int min = cnt;
+ low[w] = cnt;
+ pre[w] = cnt;
+ cnt++;
+ node t;
+ edge e;
+ forall_adj_edges(e, w) {
+ if (e->source() == w) {
+ t = e->target();
+ if(pre[t] == -1) {
+ dfsStrongComponents(G, t, S, pre, low, cnt, scnt, component);
+ }
+ if (low[t] < low[w])
+ min = low[t];
+ }
+ }
+ if (min < low[w]) {
+ low[w] = min;
+ return;
+ }
+ do {
+ t = S.pop();
+ component[t] = scnt;
+ low[t] = G.numberOfNodes();
+ } while (t != w);
+ scnt++;
+}
+
+int strongComponents(const Graph& G, NodeArray<int>& component)
+{
+ if (G.numberOfNodes() == 0)
+ return 0;
+ if (G.numberOfNodes() == 1){
+ component[G.firstNode()] = 0;
+ return 1;
+ }
+ NodeArray<int> pre(G, -1);
+ NodeArray<int> low(G, G.numberOfNodes());
+ BoundedStack<node> S(G.numberOfNodes());
+ int cnt = 0;
+ int scnt = 0;
+ node v;
+ forall_nodes(v, G){
+ if (pre[v] == -1){
+ dfsStrongComponents(G, v, S, pre, low, cnt, scnt, component);
+ }
+ }
+ return scnt;
+}
+
+
+//---------------------------------------------------------
+// isFreeForest()
+// testing if graph represents a free forest
+//---------------------------------------------------------
+
+bool isFreeForest(const Graph &G)
+{
+ NodeArray<bool> visited(G,false);
+
+ node vFirst;
+ forall_nodes(vFirst,G)
+ {
+ if(visited[vFirst]) continue;
+
+ StackPure<Tuple2<node,node> > S;
+ S.push(Tuple2<node,node>(vFirst,0));
+
+ while(!S.empty())
+ {
+ Tuple2<node,node> t = S.pop();
+ node v = t.x1();
+ node parent = t.x2();
+
+ visited[v] = true;
+
+ adjEntry adj;
+ forall_adj(adj,v)
+ {
+ node w = adj->twinNode();
+
+ // skip edge to parent, but only once!
+ if(w == parent) {
+ parent = 0;
+ continue;
+ }
+
+ if(visited[w] == true)
+ return false;
+
+ S.push(Tuple2<node,node>(w,v));
+ }
+ }
+ }
+
+ return true;
+}
+
+
+//---------------------------------------------------------
+// isForest(), isTree()
+// testing if graph represents a forest/tree
+//---------------------------------------------------------
+static bool dfsIsForest (node v,
+ NodeArray<bool> &visited,
+ NodeArray<bool> &mark)
+{
+ SListPure<node> sons;
+
+ visited[v] = true;
+
+ edge e;
+ forall_adj_edges(e,v) {
+ node w = e->target();
+ if (w != v && !mark[w]) {
+ mark[w] = true;
+ sons.pushBack(w);
+ }
+ }
+
+ SListIterator<node> it;
+ for(it = sons.begin(); it.valid(); ++it)
+ mark[*it] = false;
+
+ while(!sons.empty()) {
+ node w = sons.front();
+ sons.popFront();
+
+ if (visited [w] || dfsIsForest(w,visited,mark) == false)
+ return false;
+ }
+
+ return true;
+}
+
+bool isForest(const Graph& G, List<node> &roots)
+{
+ roots.clear();
+ if (G.empty()) return true;
+
+ NodeArray<bool> visited(G,false), mark(G,false);
+
+ node v;
+ forall_nodes(v,G)
+ if (v->indeg() == 0) {
+ roots.pushBack(v);
+ if (dfsIsForest(v,visited,mark) == false)
+ return false;
+ }
+
+ forall_nodes(v,G)
+ if (!visited[v]) return false;
+
+ return true;
+}
+
+
+bool isTree (const Graph& G, node &root)
+{
+ List<node> roots;
+
+ if (isForest(G,roots) && roots.size() == 1) {
+ root = roots.front(); return true;
+ }
+ return false;
+}
+
+
+
+} // end namespace ogdf
diff --git a/ogdf/basic/simple_graph_alg.h b/ogdf/basic/simple_graph_alg.h
new file mode 100644
index 0000000..c4263a2
--- /dev/null
+++ b/ogdf/basic/simple_graph_alg.h
@@ -0,0 +1,803 @@
+/*
+ * $Revision: 2593 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-15 15:33:53 +0200 (So, 15. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of simple graph algorithms.
+ *
+ * \author Carsten Gutwenger and Sebastian Leipert
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_SIMPLE_GRAPH_ALG_H
+#define OGDF_SIMPLE_GRAPH_ALG_H
+
+
+#include "EdgeArray.h"
+#include "SList.h"
+#include "BoundedStack.h"
+
+namespace ogdf {
+
+
+//---------------------------------------------------------
+// Methods for loops
+//---------------------------------------------------------
+
+//! Returns true iff \a G contains no self-loop.
+/**
+ * @param G is the input graph.
+ * @return true if \a G contains no self-loops (edges whose two endpoints are the same), false otherwise.
+ */
+OGDF_EXPORT bool isLoopFree(const Graph &G);
+
+//! Removes all self-loops from \a G and returns all nodes with self-loops in \a L.
+/**
+ * @tparam NODELIST is the type of the node list for returning the nodes with self-loops.
+ * @param G is the input graph.
+ * @param L is assigned the list of nodes with self-loops.
+ */
+template<class NODELIST>
+void makeLoopFree(Graph &G, NODELIST &L)
+{
+ L.clear();
+
+ edge e, eNext;
+ for (e = G.firstEdge(); e; e = eNext) {
+ eNext = e->succ();
+ if (e->isSelfLoop()) {
+ L.pushBack(e->source());
+ G.delEdge(e);
+ }
+ }
+}
+
+
+//! Removes all self-loops from \a G.
+/**
+ * @param G is the input graph.
+ */
+OGDF_EXPORT void makeLoopFree(Graph &G);
+
+
+//---------------------------------------------------------
+// Methods for parallel edges
+//---------------------------------------------------------
+
+//! Sorts the edges of \a G such that parallel edges come after each other in the list.
+/**
+ * @param G is the input graph.
+ * @param edges is assigned the list of sorted edges.
+ */
+OGDF_EXPORT void parallelFreeSort(const Graph &G, SListPure<edge> &edges);
+
+
+//! Returns true iff \a G contains no paralle edges.
+/**
+ * A parallel edge is an edge e1=(v,w) such that there exists another edge e2=(v,w) in
+ * the graph. Reversal edges (e.g. (v,w) and (w,v)) are not parallel edges. If you want to
+ * test if a graph contains no undirected parallel edges, use isParallelFreeUndirected().
+ *
+ * @param G is the input graph.
+ * @return true if \a G contains no multi-edges (edges with the same source and target).
+ */
+OGDF_EXPORT bool isParallelFree(const Graph &G);
+
+
+//! Returns the number of parallel edges in \a G.
+/**
+ * A parallel edge is an edge e1=(v,w) such that there exists another edge e2=(v,w) in
+ * the graph. Reversal edges (e.g. (v,w) and (w,v)) are not parallel edges. If you want to
+ * also take reversal edges into account, use numParallelEdgesUndirected().
+ *
+ * @param G is the input graph.
+ * @return is the number of parallel edges: for each bundle of parallel edges between two nodes
+ * v and w, all but one are counted.
+ */
+OGDF_EXPORT int numParallelEdges(const Graph &G);
+
+
+//! Removes all but one of each bundle of parallel edges.
+/**
+ * A parallel edge is an edge e1=(v,w) such that there exists another edge e2=(v,w) in
+ * the graph. Reversal edges (e.g. (v,w) and (w,v)) are not multi-edges. If you want to
+ * remove parallel and reversal edges, use makeParallelFreeUndirected(Graph&,EDGELIST&).
+ *
+ * @tparam EDGELIST is the type of edge list that will be assigned the list of parallel edges.
+ * @param G is the input graph.
+ * @param parallelEdges is assigned the list of remaining edges in \a G that were part of a
+ * bundle of parallel edges in the input graph.
+ */
+template <class EDGELIST>
+void makeParallelFree(Graph &G, EDGELIST ¶llelEdges)
+{
+ parallelEdges.clear();
+ if (G.numberOfEdges() <= 1) return;
+
+ SListPure<edge> edges;
+ parallelFreeSort(G,edges);
+
+ SListConstIterator<edge> it = edges.begin();
+ edge ePrev = *it++, e;
+ bool bAppend = true;
+ while(it.valid()) {
+ e = *it++;
+ if (ePrev->source() == e->source() && ePrev->target() == e->target()) {
+ G.delEdge(e);
+ if (bAppend) { parallelEdges.pushBack(ePrev); bAppend = false; }
+ } else {
+ ePrev = e; bAppend = true;
+ }
+ }
+}
+
+
+//! Removes all but one edge of each bundle of parallel edges in \a G.
+/**
+ * A parallel edge is an edge e1=(v,w) such that there exists another edge e2=(v,w) in
+ * the graph. Reversal edges (e.g. (v,w) and (w,v)) are not parallel edges. If you want to
+ * remove parallel and reversal edges, use makeParallelFreeUndirected(Graph&).
+ *
+ * @param G is the input graph.
+ */
+inline void makeParallelFree(Graph &G) {
+ List<edge> parallelEdges;
+ makeParallelFree(G,parallelEdges);
+}
+
+
+
+//! Sorts the edges of \a G such that undirected parallel edges come after each other in the list.
+/**
+ * An undirected parallel edges is an edge e1=(v,w) such that there exists another edge e2=(v,w) or (w,v)
+ * in the graph.
+ *
+ * @param G is the input graph.
+ * @param edges is assigned the list of sorted edges.
+ * @param minIndex is assigned for each edge (v,w) the index min(index(v),index(w)).
+ * @param maxIndex is assigned for each edge (v,w) the index max(index(v),index(w)).
+ */
+OGDF_EXPORT void parallelFreeSortUndirected(
+ const Graph &G,
+ SListPure<edge> &edges,
+ EdgeArray<int> &minIndex,
+ EdgeArray<int> &maxIndex);
+
+
+//! Returns true iff \a G contains no undirected parallel edges.
+/**
+ * An undirected parallel edges is an edge e1=(v,w) such that there exists another edge e2=(v,w) or (w,v)
+ * in the graph.
+ *
+ * @param G is the input graph.
+ * @return true if \a G contains no undirected parallel edges.
+ */
+OGDF_EXPORT bool isParallelFreeUndirected(const Graph &G);
+
+
+//! Returns the number of undirected parallel edges in \a G.
+/**
+ * An undirected parallel edges is an edge e1=(v,w) such that there exists another edge e2=(v,w) or (w,v)
+ * in the graph.
+ *
+ * @param G is the input graph.
+ * @return the number of undirected parallel edges; for each unordered pair {v,w} of nodes, all
+ * but one of the edges with endpoints v and w (in any order) are counted.
+ */
+OGDF_EXPORT int numParallelEdgesUndirected(const Graph &G);
+
+
+//! Removes all but one of each bundle of undirected parallel edges.
+/**
+ * An undirected parallel edges is an edge e1=(v,w) such that there exists another edge e2=(v,w) or (w,v)
+ * in the graph. The function removes unordered pair {v,w} of nodes all but one of the edges with
+ * endpoints v and w (in any order).
+ *
+ * @tparam EDGELIST is the type of edge list that will be assigned the list of edges.
+ * @param G is the input graph.
+ * @param parallelEdges is assigned the list of remaining edges that were part of a bundle
+ * of undirected parallel edges in the input graph.
+ */
+template <class EDGELIST>
+void makeParallelFreeUndirected(Graph &G, EDGELIST ¶llelEdges)
+{
+ parallelEdges.clear();
+ if (G.numberOfEdges() <= 1) return;
+
+ SListPure<edge> edges;
+ EdgeArray<int> minIndex(G), maxIndex(G);
+ parallelFreeSortUndirected(G,edges,minIndex,maxIndex);
+
+ SListConstIterator<edge> it = edges.begin();
+ edge ePrev = *it++, e;
+ bool bAppend = true;
+ while(it.valid()) {
+ e = *it++;
+ if (minIndex[ePrev] == minIndex[e] && maxIndex[ePrev] == maxIndex[e]) {
+ G.delEdge(e);
+ if (bAppend) { parallelEdges.pushBack(ePrev); bAppend = false; }
+ } else {
+ ePrev = e; bAppend = true;
+ }
+ }
+}
+
+
+//! Removes all but one of each bundle of undirected parallel edges.
+/**
+ * An undirected parallel edges is an edge e1=(v,w) such that there exists another edge e2=(v,w) or (w,v)
+ * in the graph. The function removes unordered pair {v,w} of nodes all but one of the edges with
+ * endpoints v and w (in any order).
+ *
+ * @param G is the input graph.
+ */
+inline void makeParallelFreeUndirected(Graph &G) {
+ List<edge> parallelEdges;
+ makeParallelFreeUndirected(G,parallelEdges);
+}
+
+
+//! Removes all but one of each bundle of undirected parallel edges.
+/**
+ * An undirected parallel edges is an edge e1=(v,w) such that there exists another edge e2=(v,w) or (w,v)
+ * in the graph. The function removes unordered pair {v,w} of nodes all but one of the edges with
+ * endpoints v and w (in any order).
+ *
+ * @tparam EDGELIST is the type of edge list that is assigned the list of edges.
+ * @param G is the input graph.
+ * @param parallelEdges is assigned the list of remaining edges that were
+ * part of a bundle of undirected parallel edges in the input graph.
+ * @param cardPositive contains for each edge the number of removed undirected parallel edges
+ * pointing in the same direction.
+ * @param cardNegative contains for each edge the number of removed undirected parallel edges
+ * pointing in the opposite direction.
+ */
+template <class EDGELIST>
+void makeParallelFreeUndirected(
+ Graph &G,
+ EDGELIST ¶llelEdges,
+ EdgeArray<int> &cardPositive,
+ EdgeArray<int> &cardNegative)
+{
+ parallelEdges.clear();
+ cardPositive.fill(0);
+ cardNegative.fill(0);
+ if (G.numberOfEdges() <= 1) return;
+
+ SListPure<edge> edges;
+ EdgeArray<int> minIndex(G), maxIndex(G);
+ parallelFreeSortUndirected(G,edges,minIndex,maxIndex);
+
+ SListConstIterator<edge> it = edges.begin();
+ edge ePrev = *it++, e;
+ bool bAppend = true;
+// int counter = 0;
+ while(it.valid())
+ {
+ e = *it++;
+ if (minIndex[ePrev] == minIndex[e] && maxIndex[ePrev] == maxIndex[e])
+ {
+ if (ePrev->source() == e->source() && ePrev->target() == e->target())
+ cardPositive[ePrev]++;
+ else if (ePrev->source() == e->target() && ePrev->target() == e->source())
+ cardNegative[ePrev]++;
+ G.delEdge(e);
+ if (bAppend)
+ {
+ parallelEdges.pushBack(ePrev);
+ bAppend = false;
+ }
+ }
+ else
+ {
+ ePrev = e; bAppend = true;
+ }
+ }
+}
+
+
+//! Computes the bundles of undirected parallel edges in \a G.
+/**
+ * Stores for one (arbitrarily chosen) reference edge all edges belonging to the same bundle of
+ * undirected parallel edges; no edge is removed from the graph.
+ *
+ * @tparam EDGELIST is the type of edge list that is assigned the list of edges.
+ * @param G is the input graph.
+ * @param parallelEdges is assigned for each reference edge the list of edges belonging to the
+ * bundle of undirected parallel edges.
+ */
+template <class EDGELIST>
+void getParallelFreeUndirected(const Graph &G, EdgeArray<EDGELIST> ¶llelEdges)
+{
+ if (G.numberOfEdges() <= 1) return;
+
+ SListPure<edge> edges;
+ EdgeArray<int> minIndex(G), maxIndex(G);
+ parallelFreeSortUndirected(G,edges,minIndex,maxIndex);
+
+ SListConstIterator<edge> it = edges.begin();
+ edge ePrev = *it++, e;
+ while(it.valid())
+ {
+ e = *it++;
+ if (minIndex[ePrev] == minIndex[e] && maxIndex[ePrev] == maxIndex[e])
+ parallelEdges[ePrev].pushBack(e);
+ else
+ ePrev = e;
+ }
+}
+
+
+//---------------------------------------------------------
+// Methods for simple graphs
+//---------------------------------------------------------
+
+
+//! Returns true iff \a G contains neither self-loops nor parallel edges.
+/**
+ * @param G is the input graph.
+ * @return true if \a G is simple, i.e. contains neither self-loops nor parallel edges, false otherwise.
+ */
+inline bool isSimple(const Graph &G) {
+ return isLoopFree(G) && isParallelFree(G);
+}
+
+
+//! Removes all self-loops and all but one edge of each bundle of parallel edges.
+/**
+ * @param G is the input graph.
+ */
+inline void makeSimple(Graph &G) {
+ makeLoopFree(G);
+ makeParallelFree(G);
+}
+
+
+//! Returns true iff \a G contains neither self-loops nor undirected parallel edges.
+/**
+ * @param G is the input graph.
+ * @return true if \a G is (undirected) simple, i.e. contains neither self-loops
+ * nor undirected parallel edges, false otherwise.
+ */
+inline bool isSimpleUndirected(const Graph &G) {
+ return isLoopFree(G) && isParallelFreeUndirected(G);
+}
+
+
+//! Removes all self-loops and all but one edge of each bundle of undirected parallel edges.
+/**
+ * @param G is the input graph.
+ */
+inline void makeSimpleUndirected(Graph &G) {
+ makeLoopFree(G);
+ makeParallelFreeUndirected(G);
+}
+
+
+
+//---------------------------------------------------------
+// Methods for connectivity
+//---------------------------------------------------------
+
+//! Returns true iff \a G is connected.
+/**
+ * @param G is the input graph.
+ * @return true if \a G is connected, false otherwise.
+ */
+OGDF_EXPORT bool isConnected(const Graph &G);
+
+
+//! Makes \a G connected by adding a minimum number of edges.
+/**
+ * @param G is the input graph.
+ * @param added is assigned the added edges.
+ */
+OGDF_EXPORT void makeConnected(Graph &G, List<edge> &added);
+
+
+//! makes \a G connected by adding a minimum number of edges.
+/**
+ * @param G is the input graph.
+ */
+inline void makeConnected(Graph &G) {
+ List<edge> added;
+ makeConnected(G,added);
+}
+
+
+//! Computes the connected components of \a G.
+/**
+ * Assigns component numbers (0, 1, ...) to the nodes of \a G. The component number of each
+ * node is stored in the node array \a component.
+ *
+ * @param G is the input graph.
+ * @param component is assigned a mapping from nodes to component numbers.
+ * @return the number of connected components.
+ */
+OGDF_EXPORT int connectedComponents(const Graph &G, NodeArray<int> &component);
+
+
+//! Computes the connected components of \a G and returns the list of isolated nodes.
+/**
+ * Assigns component numbers (0, 1, ...) to the nodes of \a G. The component number of each
+ * node is stored in the node array \a component.
+ *
+ * @param G is the input graph.
+ * @param isolated is assigned the list of isolated nodes. An isolated
+ * node is a node without incident edges.
+ * @param component is assigned a mapping from nodes to component numbers.
+ * @return the number of connected components.
+ */
+OGDF_EXPORT int connectedIsolatedComponents(
+ const Graph &G,
+ List<node> &isolated,
+ NodeArray<int> &component);
+
+
+//! Returns true iff \a G is biconnected.
+/**
+ * @param G is the input graph.
+ * @param cutVertex If false is returned, \a cutVertex is assigned either 0 if \a G is not connected,
+ * or a cut vertex in \a G.
+ */
+OGDF_EXPORT bool isBiconnected(const Graph &G, node &cutVertex);
+
+
+//! Returns true iff \a G is biconnected.
+/**
+ * @param G is the input graph.
+ */
+inline bool isBiconnected(const Graph &G) {
+ node cutVertex;
+ return isBiconnected(G,cutVertex);
+}
+
+
+//! Makes \a G biconnected by adding edges.
+/**
+ * @param G is the input graph.
+ * @param added is assigned the list of inserted edges.
+ */
+OGDF_EXPORT void makeBiconnected(Graph &G, List<edge> &added);
+
+
+//! Makes \a G biconnected by adding edges.
+/**
+ * @param G is the input graph.
+ */
+inline void makeBiconnected(Graph &G) {
+ List<edge> added;
+ makeBiconnected(G,added);
+}
+
+
+//! Computes the biconnected components of \a G.
+/**
+ * Assigns component numbers (0, 1, ...) to the edges of \ G. The component number of each edge
+ * is stored in the edge array \a component.
+ *
+ * @param G is the input graph.
+ * @param component is assigned a mapping from edges to component numbers.
+ * @return the number of biconnected components (including isolated nodes).
+ */
+OGDF_EXPORT int biconnectedComponents(const Graph &G, EdgeArray<int> &component);
+
+
+//! Returns true iff \a G is triconnected.
+/**
+ * If true is returned, then either
+ * - \a s1 and \a s2 are either both 0 if \a G is not connected; or
+ * - \a s1 is a cut vertex and \a s2 = 0 if \a G is not biconnected; or
+ * - \a s1 and \a s2 are a separation pair otherwise.
+ *
+ * @param G is the input graph.
+ * @param s1 is assigned a cut vertex of one node of a separation pair, if \a G is not triconnected (see above).
+ * @param s2 is assigned one node of a separation pair, if \a G is not triconnected (see above).
+ * @return true if \a G is triconnected, false otherwise.
+ */
+OGDF_EXPORT bool isTriconnected(const Graph &G, node &s1, node &s2);
+
+
+//! Returns true iff \a G is triconnected.
+/**
+ * @param G is the input graph.
+ * @return true if \a G is triconnected, false otherwise.
+ */
+inline bool isTriconnected(const Graph &G) {
+ node s1, s2;
+ return isTriconnected(G,s1,s2);
+}
+
+
+//! Returns true iff \a G is triconnected (using a quadratic time algorithm!).
+/**
+ * If true is returned, then either
+ * - \a s1 and \a s2 are either both 0 if \a G is not connected; or
+ * - \a s1 is a cut vertex and \a s2 = 0 if \a G is not biconnected; or
+ * - \a s1 and \a s2 are a separation pair otherwise.
+ *
+ * \warning This method has quadratic running time. An efficient linear time
+ * version is provided by isTriconnected().
+ *
+ * @param G is the input graph.
+ * @param s1 is assigned a cut vertex of one node of a separation pair, if \a G is not triconnected (see above).
+ * @param s2 is assigned one node of a separation pair, if \a G is not triconnected (see above).
+ * @return true if \a G is triconnected, false otherwise.
+ */
+OGDF_EXPORT bool isTriconnectedPrimitive(const Graph &G, node &s1, node &s2);
+
+
+//! Returns true iff \a G is triconnected (using a quadratic time algorithm!).
+/**
+ * \warning This method has quadratic running time. An efficient linear time
+ * version is provided by isTriconnected().
+ *
+ * @param G is the input graph.
+ * @return true if \a G is triconnected, false otherwise.
+ */
+inline bool isTriconnectedPrimitive(const Graph &G) {
+ node s1, s2;
+ return isTriconnectedPrimitive(G,s1,s2);
+}
+
+
+//! Triangulates a planarly embedded graph \a G by adding edges.
+/**
+ * The result of this function is that \a G is made maximally planar by adding new edges.
+ * \a G will also be planarly embedded such that each face is a triangle.
+ *
+ * \pre \a G is planar, simple and represents a combinatorial embedding (i.e. \a G is planarly embedded).
+ *
+ * @param G is the input graph to which edges will be added.
+ */
+void triangulate(Graph &G);
+
+
+//---------------------------------------------------------
+// Methods for directed graphs
+//---------------------------------------------------------
+
+//! Returns true iff the digraph \a G is acyclic.
+/**
+ * @param G is the input graph
+ * @param backedges is assigned the backedges of a DFS-tree.
+ * @return true if \a G contains no directed cycle, false otherwise.
+ */
+OGDF_EXPORT bool isAcyclic(const Graph &G, List<edge> &backedges);
+
+
+//! Returns true iff the digraph \a G is acyclic.
+/**
+ * @param G is the input graph
+ * @return true if \a G contains no directed cycle, false otherwise.
+ */
+inline bool isAcyclic(const Graph &G) {
+ List<edge> backedges;
+ return isAcyclic(G,backedges);
+}
+
+
+//! Returns true iff the undirected graph \a G is acyclic.
+/**
+ * @param G is the input graph
+ * @param backedges is assigned the backedges of a DFS-tree.
+ * @return true if \a G contains no undirected cycle, false otherwise.
+ */
+OGDF_EXPORT bool isAcyclicUndirected(const Graph &G, List<edge> &backedges);
+
+
+//! Returns true iff the undirected graph \a G is acyclic.
+/**
+ * @param G is the input graph
+ * @return true if \a G contains no undirected cycle, false otherwise.
+ */
+inline bool isAcyclicUndirected(const Graph &G) {
+ List<edge> backedges;
+ return isAcyclicUndirected(G,backedges);
+}
+
+
+//! Makes the digraph \a G acyclic by removing edges.
+/**
+ * The implementation removes all backedges of a DFS tree.
+ *
+ * @param G is the input graph
+ */
+OGDF_EXPORT void makeAcyclic(Graph &G);
+
+
+//! Makes the digraph G acyclic by reversing edges.
+/**
+ * \remark The implementation ignores self-loops and reverses
+ * the backedges of a DFS-tree.
+ *
+ * @param G is the input graph
+ */
+OGDF_EXPORT void makeAcyclicByReverse(Graph &G);
+
+
+//! Returns true iff the digraph \a G contains exactly one source node (or is empty).
+/**
+ * @param G is the input graph.
+ * @param source is assigned the single source if true is returned, or 0 otherwise.
+ * @return true if \a G has a single source, false otherwise.
+ */
+OGDF_EXPORT bool hasSingleSource(const Graph &G, node &source);
+
+
+//! Returns true iff the digraph \a G contains exactly one source node (or is empty).
+/**
+ * @param G is the input graph.
+ * @return true if \a G has a single source, false otherwise.
+ */
+inline bool hasSingleSource(const Graph &G) {
+ node source;
+ return hasSingleSource(G,source);
+}
+
+
+//! Returns true iff the digraph \a G contains exactly one sink node (or is empty).
+/**
+ * @param G is the input graph.
+ * @param sink is assigned the single sink if true is returned, or 0 otherwise.
+ * @return true if \a G has a single sink, false otherwise.
+ */
+OGDF_EXPORT bool hasSingleSink(const Graph &G, node &sink);
+
+
+//! Returns true iff the digraph \a G contains exactly one sink node (or is empty).
+/**
+ * @param G is the input graph.
+ * @return true if \a G has a single sink, false otherwise.
+ */
+inline bool hasSingleSink(const Graph &G) {
+ node sink;
+ return hasSingleSink(G,sink);
+}
+
+
+//! Returns true iff \a G is an st-digraph.
+/**
+ * A directed graph is an st-digraph if it is acyclic, contains exactly one source s
+ * and one sink t, and the edge (s,t).
+ *
+ * @param G is the input graph.
+ * @param s is assigned the single source (if true is returned).
+ * @param t is assigned the single sink (if true is returned).
+ * @param st is assigned the edge (s,t) (if true is returned).
+ * @return true if \a G is an st-digraph, false otherwise.
+ */
+OGDF_EXPORT bool isStGraph(const Graph &G, node &s, node &t, edge &st);
+
+
+//! Returns true if \a G is an st-digraph.
+/**
+ * A directed graph is an st-digraph if it is acyclic, contains exactly one source s
+ * and one sink t, and the edge (s,t).
+ * @param G is the input graph.
+ * @return true if \a G is an st-digraph, false otherwise.
+ */
+inline bool isStGraph(const Graph &G) {
+ node s, t;
+ edge st;
+ return isStGraph(G,s,t,st);
+}
+
+
+//! Computes a topological numbering of an acyclic digraph \a G.
+/**
+ * \pre \a G is an acyclic directed graph.
+ *
+ * @param G is the input graph.
+ * @param num is assigned the topological numbering (0, 1, ...).
+ */
+OGDF_EXPORT void topologicalNumbering(const Graph &G, NodeArray<int> &num);
+
+
+//! Computes the strongly connected components of the digraph \a G.
+/**
+ * The function implements the algorithm by Tarjan.
+ *
+ * @param G is the input graph.
+ * @param component is assigned a mapping from nodes to component numbers (0, 1, ...).
+ * @return the number of strongly connected components.
+ */
+OGDF_EXPORT int strongComponents(const Graph& G, NodeArray<int>& component);
+
+
+
+//---------------------------------------------------------
+// Methods for trees and forests
+//---------------------------------------------------------
+
+//! Returns true iff \a G is a free forest, i.e. contains no undirected cycle.
+/**
+ * @param G is the input graph.
+ * @return true if \ G is contains no undirected cycle, false otherwise.
+ */
+OGDF_EXPORT bool isFreeForest(const Graph &G);
+
+
+//! Returns true iff \a G represents a forest, i.e., a collection of rooted trees.
+/**
+ * @param G is the input graph.
+ * @param roots is assigned the list of root nodes of the trees in the forest.
+ * @return true if \a G represents a forest, false otherwise.
+ */
+OGDF_EXPORT bool isForest(const Graph& G, List<node> &roots);
+
+
+//! Returns true iff \a G represents a forest, i.e. a collection of rooted trees.
+/**
+ * @param G is the input graph.
+ * @return true if \a G represents a forest, false otherwise.
+ */
+inline bool isForest(const Graph &G)
+{
+ List<node> roots;
+ return isForest(G,roots);
+}
+
+
+//! Returns true iff \a G represents a tree
+/**
+ * @param G is the input graph.
+ * @param root is assigned the root node (if true is returned).
+ * @return true if \a G represents a tree, false otherwise.
+ */
+OGDF_EXPORT bool isTree (const Graph& G, node &root);
+
+
+//! Returns true iff \a G represents a tree
+/**
+ * @param G is the input graph.
+ * @return true if \a G represents a tree, false otherwise.
+ */
+inline bool isTree(const Graph &G) {
+ node root;
+ return isTree(G,root);
+}
+
+
+} // end namespace ogdf
+
+#endif
diff --git a/ogdf/basic/tuples.h b/ogdf/basic/tuples.h
new file mode 100644
index 0000000..407c356
--- /dev/null
+++ b/ogdf/basic/tuples.h
@@ -0,0 +1,274 @@
+/*
+ * $Revision: 2615 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-16 14:23:36 +0200 (Mo, 16. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration and implementation of class Tuple2, Tuple3
+ * and Tuple4.
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_TUPLE_H
+#define OGDF_TUPLE_H
+
+
+#include "basic.h"
+#include "Hashing.h"
+
+
+namespace ogdf {
+
+//! Tuples of two elements (2-tuples).
+/**
+ * @tparam E1 is the data type for the first element.
+ * @tparam E2 is the data type for the second element.
+ */
+template<class E1, class E2> class Tuple2 {
+public:
+ E1 m_x1; //!< The first element.
+ E2 m_x2; //!< The second element.
+
+ //! Constructs a 2-tuple using default constructors.
+ Tuple2() { }
+ //! Constructs a 2-tuple for given values.
+ Tuple2(const E1 &y1, const E2 &y2) : m_x1(y1), m_x2(y2) { }
+ //! Constructs a 2-tuple that is a copy of \a t2.
+ Tuple2(const Tuple2<E1,E2> &t2) : m_x1(t2.m_x1), m_x2(t2.m_x2) { }
+
+ //! Returns a reference the first element.
+ const E1 &x1() const { return m_x1; }
+ //! Returns a reference the second element.
+ const E2 &x2() const { return m_x2; }
+
+ //! Returns a reference the first element.
+ E1 &x1() { return m_x1; }
+ //! Returns a reference the second element.
+ E2 &x2() { return m_x2; }
+
+ // default assignment operator
+
+ OGDF_NEW_DELETE
+};
+
+//! Equality operator for 2-tuples
+template<class E1, class E2>
+bool operator==(const Tuple2<E1,E2> &t1, const Tuple2<E1,E2> &t2)
+{
+ return t1.x1() == t2.x1() && t1.x2() == t2.x2();
+}
+
+//! Inequality operator for 2-tuples
+template<class E1, class E2>
+bool operator!=(const Tuple2<E1,E2> &t1, const Tuple2<E1,E2> &t2)
+{
+ return t1.x1() != t2.x1() || t1.x2() != t2.x2();
+}
+
+//! Output operator for 2-tuples.
+template<class E1, class E2>
+ostream &operator<<(ostream &os, const Tuple2<E1,E2> &t2)
+{
+ os << "(" << t2.x1() << " " << t2.x2() << ")";
+ return os;
+}
+
+
+//! Tuples of three elements (3-tuples).
+/**
+ * @tparam E1 is the data type for the first element.
+ * @tparam E2 is the data type for the second element.
+ * @tparam E3 is the data type for the third element.
+ */
+template<class E1, class E2, class E3> class Tuple3 {
+public:
+ E1 m_x1; //!< The first element.
+ E2 m_x2; //!< The second element.
+ E3 m_x3; //!< The third element.
+
+ //! Constructs a 3-tuple using default constructors.
+ Tuple3() { }
+ //! Constructs a 3-tuple for given values.
+ Tuple3(const E1 &y1, const E2 &y2, const E3 &y3) :
+ m_x1(y1), m_x2(y2), m_x3(y3) { }
+ //! Constructs a 3-tuple that is a copy of \a t3.
+ Tuple3(const Tuple3<E1,E2,E3> &t3) :
+ m_x1(t3.m_x1), m_x2(t3.m_x2), m_x3(t3.m_x3) { }
+
+ //! Returns a reference the first element.
+ const E1 &x1() const { return m_x1; }
+ //! Returns a reference the second element.
+ const E2 &x2() const { return m_x2; }
+ //! Returns a reference the third element.
+ const E3 &x3() const { return m_x3; }
+
+ //! Returns a reference the first element.
+ E1 &x1() { return m_x1; }
+ //! Returns a reference the second element.
+ E2 &x2() { return m_x2; }
+ //! Returns a reference the third element.
+ E3 &x3() { return m_x3; }
+
+ // default assignment operator
+
+ OGDF_NEW_DELETE
+};
+
+//! Equality operator for 3-tuples
+template<class E1, class E2, class E3>
+bool operator==(const Tuple3<E1,E2,E3> &t1, const Tuple3<E1,E2,E3> &t2)
+{
+ return t1.x1() == t2.x1() && t1.x2() == t2.x2() && t1.x3() == t2.x3();
+}
+
+//! Inequality operator for 3-tuples
+template<class E1, class E2, class E3>
+bool operator!=(const Tuple3<E1,E2,E3> &t1, const Tuple3<E1,E2,E3> &t2)
+{
+ return t1.x1() != t2.x1() || t1.x2() != t2.x2() || t1.x3() != t2.x3();
+}
+
+//! Output operator for 3-tuples
+template<class E1, class E2, class E3>
+ostream &operator<<(ostream &os, const Tuple3<E1,E2,E3> &t3)
+{
+ os << "(" << t3.x1() << " " << t3.x2() << " " << t3.x3() << ")";
+ return os;
+}
+
+
+//! Tuples of four elements (4-tuples).
+/**
+ * @tparam E1 is the data type for the first element.
+ * @tparam E2 is the data type for the second element.
+ * @tparam E3 is the data type for the third element.
+ * @tparam E4 is the data type for the fourth element.
+ */
+template<class E1, class E2, class E3, class E4> class Tuple4 {
+public:
+ E1 m_x1; //!< The first element.
+ E2 m_x2; //!< The second element.
+ E3 m_x3; //!< The third element.
+ E4 m_x4; //!< The fourth element.
+
+ //! Constructs a 4-tuple using default constructors.
+ Tuple4() { }
+ //! Constructs a 4-tuple for given values.
+ Tuple4(const E1 &y1, const E2 &y2, const E3 &y3, const E4 &y4) :
+ m_x1(y1), m_x2(y2), m_x3(y3), m_x4(y4) { }
+ //! Constructs a 4-tuple that is a copy of \a t4.
+ Tuple4(const Tuple4<E1,E2,E3,E4> &t4) :
+ m_x1(t4.m_x1), m_x2(t4.m_x2), m_x3(t4.m_x3), m_x4(t4.m_x4) { }
+
+ //! Returns a reference the first element.
+ const E1 &x1() const { return m_x1; }
+ //! Returns a reference the second element.
+ const E2 &x2() const { return m_x2; }
+ //! Returns a reference the third element.
+ const E3 &x3() const { return m_x3; }
+ //! Returns a reference the fourth element.
+ const E4 &x4() const { return m_x4; }
+
+ //! Returns a reference the first element.
+ E1 &x1() { return m_x1; }
+ //! Returns a reference the second element.
+ E2 &x2() { return m_x2; }
+ //! Returns a reference the third element.
+ E3 &x3() { return m_x3; }
+ //! Returns a reference the fourth element.
+ E4 &x4() { return m_x4; }
+
+ // default assignment operator
+
+ OGDF_NEW_DELETE
+};
+
+//! Equality operator for 4-tuples
+template<class E1, class E2, class E3, class E4>
+bool operator==(const Tuple4<E1,E2,E3,E4> &t1, const Tuple4<E1,E2,E3,E4> &t2)
+{
+ return t1.x1() == t2.x1() && t1.x2() == t2.x2() &&
+ t1.x3() == t2.x3() && t1.x4() == t2.x4();
+}
+
+//! Inequality operator for 4-tuples
+template<class E1, class E2, class E3, class E4>
+bool operator!=(const Tuple4<E1,E2,E3,E4> &t1, const Tuple4<E1,E2,E3,E4> &t2)
+{
+ return t1.x1() != t2.x1() || t1.x2() != t2.x2() ||
+ t1.x3() != t2.x3() || t1.x4() != t2.x4();
+}
+
+//! Output operator for 4-tuples
+template<class E1, class E2, class E3, class E4>
+ostream &operator<<(ostream &os, const Tuple4<E1,E2,E3,E4> &t4)
+{
+ os << "(" << t4.x1() << " " << t4.x2() << " " <<
+ t4.x3() << " " << t4.x4() << ")";
+ return os;
+}
+
+template<typename K1_, typename K2_,
+ typename Hash1_ = DefHashFunc<K1_>,
+ typename Hash2_ = DefHashFunc<K2_> >
+class HashFuncTuple
+{
+public:
+ HashFuncTuple() { }
+
+ HashFuncTuple(const Hash1_ &hash1, const Hash2_ &hash2)
+ : m_hash1(hash1), m_hash2(hash2) { }
+
+ size_t hash(const Tuple2<K1_,K2_> &key) const {
+ return 23*m_hash1.hash(key.x1()) + 443*m_hash2.hash(key.x2());
+ }
+
+private:
+ Hash1_ m_hash1;
+ Hash2_ m_hash2;
+};
+
+} // namespace ogdf
+
+
+#endif
diff --git a/ogdf/cluster/ClusterArray.h b/ogdf/cluster/ClusterArray.h
new file mode 100644
index 0000000..e3cc654
--- /dev/null
+++ b/ogdf/cluster/ClusterArray.h
@@ -0,0 +1,245 @@
+/*
+ * $Revision: 2584 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-12 02:38:07 +0200 (Do, 12. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration and implementation of ClusterArray class.
+ *
+ * \author Sebastian Leipert
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_CLUSTER_ARRAY_H
+#define OGDF_CLUSTER_ARRAY_H
+
+
+#include "../basic/Array.h"
+#include "ClusterGraph.h"
+
+
+namespace ogdf {
+
+
+//---------------------------------------------------------
+// ClusterArrayBase
+// base class for ClusterArray<T>, defines interface for event handling
+// used by Graph
+//---------------------------------------------------------
+//! Abstract base class for cluster arrays.
+/**
+ * Defines the interface for event handling used by the ClusterGraph class.
+ * Use the paramiterized class ClusterArray for creating edge arrays.
+ */
+class ClusterArrayBase {
+ /**
+ * Pointer to list element in the list of all registered cluster
+ * arrays which references this array.
+ */
+ ListIterator<ClusterArrayBase*> m_it;
+
+public:
+ const ClusterGraph *m_pClusterGraph; //!< The associated cluster graph.
+
+ //! Initializes a cluster array not associated with a cluster graph.
+ ClusterArrayBase() : m_pClusterGraph(0) { }
+ //! Initializes a cluster array associated with \a pC.
+ ClusterArrayBase(const ClusterGraph *pC) : m_pClusterGraph(pC) {
+ if(pC) m_it = pC->registerArray(this);
+ }
+
+ // destructor, unregisters the array
+ virtual ~ClusterArrayBase() {
+ if (m_pClusterGraph) m_pClusterGraph->unregisterArray(m_it);
+ }
+
+ // event interface used by Graph
+ //! Virtual function called when table size has to be enlarged.
+ virtual void enlargeTable(int newTableSize) = 0;
+ //! Virtual function called when table has to be reinitialized.
+ virtual void reinit(int initTableSize) = 0;
+ //! Virtual function called when array is disconnected from the cluster graph.
+ virtual void disconnect() = 0;
+
+ //! Associates the array with a new cluster graph.
+ void reregister(const ClusterGraph *pC) {
+ if (m_pClusterGraph) m_pClusterGraph->unregisterArray(m_it);
+ if ((m_pClusterGraph = pC) != 0) m_it = pC->registerArray(this);
+ }
+}; // class ClusterArrayBase
+
+
+//! Dynamic arrays indexed with clusters.
+/**
+ * Cluster arrays adjust their table size automatically
+ * when the cluster graph grows.
+ */
+template<class T> class ClusterArray : private Array<T>, protected ClusterArrayBase {
+ T m_x; //!< The default value for array elements.
+
+public:
+ //! Constructs an empty cluster array associated with no graph.
+ ClusterArray() : Array<T>(), ClusterArrayBase() { }
+ //! Constructs a cluster array associated with \a C.
+ ClusterArray(const ClusterGraph &C) :
+ Array<T>(C.clusterArrayTableSize()),
+ ClusterArrayBase(&C) { }
+ //! Constructs a cluster array associated with \a C.
+ /**
+ * @param C is the associated cluster graph.
+ * @param x is the default value for all array elements.
+ */
+ ClusterArray(const ClusterGraph &C, const T &x) :
+ Array<T>(0,C.clusterArrayTableSize()-1,x),
+ ClusterArrayBase(&C), m_x(x) { }
+ //! Constructs a cluster array associated with \a C and a given
+ //! size (for static use).
+ /**
+ * @param C is the associated cluster graph.
+ * @param x is the default value for all array elements.
+ * @param size is the size of the array.
+ */
+ ClusterArray(const ClusterGraph &C, const T &x, int size) :
+ Array<T>(0,size-1,x),
+ ClusterArrayBase(&C), m_x(x) { }
+
+ //! Constructs a cluster array that is a copy of \a A.
+ /**
+ * Associates the array with the same cluster graph as \a A and copies all elements.
+ */
+ ClusterArray(const ClusterArray<T> &A) :
+ Array<T>(A),
+ ClusterArrayBase(A.m_pClusterGraph), m_x(A.m_x) { }
+
+ //! Returns true iff the array is associated with a graph.
+ bool valid() const { return (Array<T>::low() <= Array<T>::high()); }
+
+ //! Returns a pointer to the associated cluster graph.
+ const ClusterGraph *graphOf() const {
+ return m_pClusterGraph;
+ }
+
+ //! Returns a reference to the element with index \a c.
+ const T &operator[](cluster c) const {
+ OGDF_ASSERT(c != 0 && c->graphOf() == m_pClusterGraph)
+ return Array<T>::operator [](c->index());
+ }
+
+ //! Returns a reference to the element with index \a c.
+ T &operator[](cluster c) {
+ OGDF_ASSERT(c != 0 && c->graphOf() == m_pClusterGraph)
+ return Array<T>::operator [](c->index());
+ }
+
+ //! Returns a reference to the element with index \a index.
+ /**
+ * \attention Make sure that \a index is a valid index for a cluster
+ * in the associated cluster graph!
+ */
+ const T &operator[](int index) const {
+ return Array<T>::operator [](index);
+ }
+
+ //! Returns a reference to the element with index \a index.
+ /**
+ * \attention Make sure that \a index is a valid index for a cluster
+ * in the associated cluster graph!
+ */
+ T &operator[](int index) {
+ return Array<T>::operator [](index);
+ }
+
+ //! Assignment operator.
+ ClusterArray<T> &operator=(const ClusterArray<T> &a) {
+ Array<T>::operator =(a);
+ m_x = a.m_x;
+ reregister(a.m_pClusterGraph);
+ return *this;
+ }
+
+ //! Reinitializes the array. Associates the array with no cluster graph.
+ void init() {
+ Array<T>::init(); reregister(0);
+ }
+
+ //! Reinitializes the array. Associates the array with \a C.
+ void init(const ClusterGraph &C) {
+ Array<T>::init( C.clusterArrayTableSize() ); reregister(&C);
+ }
+
+ //! Reinitializes the array. Associates the array with \a C.
+ /**
+ * @param C is the associated cluster graph.
+ * @param x is the default value.
+ */
+ void init(const ClusterGraph &C, const T &x) {
+ Array<T>::init(0,C.clusterArrayTableSize()-1, m_x = x); reregister(&C);
+ }
+
+ //! Sets all array elements to \a x.
+ void fill(const T &x) {
+ int high = m_pClusterGraph->maxClusterIndex();
+ if(high >= 0)
+ Array<T>::fill(0,high,x);
+ }
+
+private:
+ virtual void enlargeTable(int newTableSize) {
+ Array<T>::grow(newTableSize-Array<T>::size(),m_x);
+ }
+
+ virtual void reinit(int initTableSize) {
+ Array<T>::init(0,initTableSize-1,m_x);
+ }
+
+ virtual void disconnect() {
+ Array<T>::init();
+ m_pClusterGraph = 0;
+ }
+
+ OGDF_NEW_DELETE
+
+}; // class ClusterArray<T>
+
+
+} // end namespace ogdf
+
+
+#endif
diff --git a/ogdf/cluster/ClusterGraph.cpp b/ogdf/cluster/ClusterGraph.cpp
new file mode 100644
index 0000000..0bdb5c3
--- /dev/null
+++ b/ogdf/cluster/ClusterGraph.cpp
@@ -0,0 +1,1775 @@
+/*
+ * $Revision: 2573 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-10 18:48:33 +0200 (Di, 10. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implements the class ClusterGraph, providing
+ * extra functionality for clustered graphs.
+ * A clustered graph C=(G,T) consists of an undirected graph G
+ * and a rooted tree T in which the leaves of T correspond
+ * to the vertices of G=(V,E).
+ *
+ * \author Sebastian Leipert, Karsten Klein
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "ClusterGraph.h"
+#include "ClusterArray.h"
+#include "ClusterGraphObserver.h"
+
+#include <limits.h>
+#include <ctype.h>
+#include <string.h>
+
+#include "../basic/String.h"
+#include "../basic/AdjEntryArray.h"
+
+#include "../fileformats/GmlParser.h"
+
+
+namespace ogdf {
+
+#define MIN_CLUSTER_TABLE_SIZE (1 << 4)
+
+//---------------------------------------------------------
+//node search in cluster hierarchy
+//---------------------------------------------------------
+void ClusterElement::getClusterInducedNodes(List<node> &clusterNodes) {
+
+ ListConstIterator<node> nit;
+ for (nit=m_entries.begin(); nit.valid(); ++nit) {
+ clusterNodes.pushBack(*nit);
+ }
+ ListConstIterator<cluster> cit;
+ for (cit=m_children.begin(); cit.valid(); ++cit) {
+ (*cit)->getClusterInducedNodes(clusterNodes);
+ }
+}
+
+void ClusterElement::getClusterNodes(List<node> &clusterNodes) {
+
+ clusterNodes.clear();
+ getClusterInducedNodes(clusterNodes);
+}
+
+void ClusterElement::getClusterInducedNodes(NodeArray<bool> &clusterNode, int& num) {
+
+ ListConstIterator<node> nit;
+ for (nit=m_entries.begin(); nit.valid(); ++nit) {
+ clusterNode[*nit] = true;
+ num++;
+ }
+ ListConstIterator<cluster> cit;
+ for (cit=m_children.begin(); cit.valid(); ++cit) {
+ (*cit)->getClusterInducedNodes(clusterNode, num);
+ }
+}
+
+int ClusterElement::getClusterNodes(NodeArray<bool> &clusterNode)
+{
+ int num = 0;
+ getClusterInducedNodes(clusterNode, num);
+
+ return num;
+}
+
+
+//---------------------------------------------------------
+// Construction
+//---------------------------------------------------------
+
+ClusterGraph::ClusterGraph()
+{
+ m_clusterIdCount = 0;
+ m_postOrderStart = 0;
+ m_rootCluster = 0;
+
+ m_allowEmptyClusters = true;
+ m_updateDepth = false;
+ m_depthUpToDate = false;
+
+ m_nClusters = 0;
+ m_lcaNumber = 0;
+ m_clusterArrayTableSize = MIN_CLUSTER_TABLE_SIZE;
+ m_adjAvailable = false;
+ m_lcaNumber = 0;
+ m_lcaSearch = 0;
+ m_vAncestor = 0;
+ m_wAncestor = 0;
+ //m_clusterDepth.init(*this, 0);
+}
+
+
+
+// Construction of a new cluster graph. All nodes
+// are children of the root cluster
+ClusterGraph::ClusterGraph(const Graph &G) : GraphObserver(&G), m_pGraph(&G)
+{
+ m_clusterIdCount = 0;
+ m_postOrderStart = 0;
+ m_rootCluster = 0;
+
+ m_allowEmptyClusters = true;
+ m_updateDepth = false;
+ m_depthUpToDate = false;
+
+ m_nClusters = 0;
+ m_lcaNumber = 0;
+ m_clusterArrayTableSize = G.nextPower2(MIN_CLUSTER_TABLE_SIZE, G.nodeArrayTableSize());
+ //m_clusterDepth.init(*this, 0);
+ initGraph(G);
+}
+
+
+ClusterGraph::ClusterGraph(const ClusterGraph &C) :
+ GraphObserver(&(C.getGraph())),
+ m_lcaSearch(0),
+ m_vAncestor(0),
+ m_wAncestor(0)
+{
+ m_clusterIdCount = 0;
+ m_postOrderStart = 0;
+ m_rootCluster = 0;
+
+ m_allowEmptyClusters = true;
+ m_updateDepth = false;
+ m_depthUpToDate = false;
+
+ m_nClusters = 0;
+ m_lcaNumber = 0;
+
+ m_clusterArrayTableSize = C.m_clusterArrayTableSize;
+ shallowCopy(C);
+}
+
+
+ClusterGraph::ClusterGraph(
+ const ClusterGraph &C,
+ Graph &G,
+ ClusterArray<cluster> &originalClusterTable,
+ NodeArray<node> &originalNodeTable)
+:
+ GraphObserver(&G),
+ m_lcaSearch(0),
+ m_vAncestor(0),
+ m_wAncestor(0)
+{
+ m_clusterIdCount = 0;
+ m_postOrderStart = 0;
+ m_rootCluster = 0;
+
+ m_allowEmptyClusters = true;
+ m_updateDepth = false;
+ m_depthUpToDate = false;
+
+ m_nClusters = 0;
+ m_lcaNumber = 0;
+
+ m_clusterArrayTableSize = C.m_clusterArrayTableSize;
+ deepCopy(C,G,originalClusterTable,originalNodeTable);
+}
+
+
+ClusterGraph::ClusterGraph(
+ const ClusterGraph &C,
+ Graph &G,
+ ClusterArray<cluster> &originalClusterTable,
+ NodeArray<node> &originalNodeTable,
+ EdgeArray<edge> &edgeCopy)
+:
+ GraphObserver(&G),
+ m_lcaSearch(0),
+ m_vAncestor(0),
+ m_wAncestor(0)
+{
+ m_clusterIdCount = 0;
+ m_postOrderStart = 0;
+ m_rootCluster = 0;
+
+ m_allowEmptyClusters = true;
+ m_updateDepth = false;
+ m_depthUpToDate = false;
+
+ m_nClusters = 0;
+ m_lcaNumber = 0;
+
+ m_clusterArrayTableSize = C.m_clusterArrayTableSize;
+ deepCopy(C, G, originalClusterTable, originalNodeTable, edgeCopy);
+}
+
+
+ClusterGraph::ClusterGraph(const ClusterGraph &C,Graph &G) :
+ GraphObserver(&G),
+ m_lcaSearch(0),
+ m_vAncestor(0),
+ m_wAncestor(0)
+{
+ m_clusterIdCount = 0;
+ m_postOrderStart = 0;
+ m_rootCluster = 0;
+
+ m_allowEmptyClusters = true;
+ m_updateDepth = false;
+ m_depthUpToDate = false;
+
+ m_nClusters = 0;
+ m_lcaNumber = 0;
+
+ m_clusterArrayTableSize = C.m_clusterArrayTableSize;
+ deepCopy(C,G);
+}
+
+
+ClusterGraph::~ClusterGraph()
+{
+ for(ListIterator<ClusterArrayBase*> it = m_regClusterArrays.begin();
+ it.valid(); ++it)
+ {
+ (*it)->disconnect();
+ }
+
+ clear();
+}
+
+
+// Construction of a new cluster graph. All nodes
+// are children of the root cluster
+void ClusterGraph::init(const Graph &G)
+{
+ clear();
+ m_clusterIdCount = 0;
+ m_postOrderStart = 0;
+ m_pGraph = &G;
+
+ m_nClusters = 0;
+ m_lcaNumber = 0;
+ m_clusterArrayTableSize = G.nextPower2(MIN_CLUSTER_TABLE_SIZE, G.nodeArrayTableSize());
+ //m_clusterDepth.init(*this, 0);
+ initGraph(G);
+}
+
+
+
+//---------------------------------------------------------
+// =
+//---------------------------------------------------------
+
+ClusterGraph &ClusterGraph::operator=(const ClusterGraph &C)
+{
+ clear(); shallowCopy(C);
+ m_clusterArrayTableSize = C.m_clusterArrayTableSize;
+ reinitArrays();
+
+ OGDF_ASSERT_IF(dlConsistencyChecks, consistencyCheck());
+ return *this;
+}
+
+
+//---------------------------------------------------------
+// copy,initGraph
+//---------------------------------------------------------
+
+// Copy Function
+void ClusterGraph::shallowCopy(const ClusterGraph &C)
+{
+ const Graph &G = C;
+ m_pGraph = &G;
+
+ m_nClusters = 0;
+
+ //m_clusterDepth.init(*this, 0);
+
+ initGraph(G);
+
+ m_updateDepth = C.m_updateDepth;
+ m_depthUpToDate = C.m_depthUpToDate;
+
+ // Construct cluster tree
+ ClusterArray<cluster> originalClusterTable(C);
+ cluster c = 0;
+ forall_clusters(c,C)
+ {
+ if (c == C.m_rootCluster)
+ {
+ originalClusterTable[c] = m_rootCluster;
+ //does not really need to be assigned HERE in for
+ m_rootCluster->depth() = 1;
+ OGDF_ASSERT(C.rootCluster()->depth() == 1)
+ continue;
+ }
+ originalClusterTable[c] = newCluster();
+ originalClusterTable[c]->depth() = c->depth();
+ }
+ forall_clusters(c,C)
+ {
+
+ if (c == C.m_rootCluster)
+ continue;
+ originalClusterTable[c]->m_parent = originalClusterTable[c->m_parent];
+ originalClusterTable[c->m_parent]->m_children.pushBack(originalClusterTable[c]);
+ originalClusterTable[c]->m_it = originalClusterTable[c->m_parent]->m_children.rbegin();
+ }
+
+ node v;
+ forall_nodes(v,G)
+ reassignNode(v,originalClusterTable[C.clusterOf(v)]);
+
+ copyLCA(C);
+}
+
+
+
+// Initialize the graph
+void ClusterGraph::initGraph(const Graph &G)
+{
+
+ reregister(&G); //will in some constructors cause double registration
+
+ m_lcaNumber = 0;
+ m_lcaSearch = 0;
+ m_vAncestor = 0;
+ m_wAncestor = 0;
+
+ //if (G.empty())
+ // return;
+
+ m_adjAvailable = false;
+
+ //assign already existing nodes, new nodes are assigned
+ //over nodeadded
+ List<node> allNodes;
+ G.allNodes(allNodes);
+
+ //clusterIdcount may be zero in case of constructor call,
+ //but can be != zero if readgraphwin is used
+ //root cluster should always get id 0
+ #ifdef OGDF_DEBUG
+ m_rootCluster = OGDF_NEW ClusterElement(this, 0);//m_clusterIdCount++);
+ #else
+ m_rootCluster = OGDF_NEW ClusterElement(0);//m_clusterIdCount++);
+ #endif
+
+ OGDF_ASSERT(m_nClusters == 0)
+
+ m_clusterIdCount++;
+ m_rootCluster->depth() = 1;
+ m_rootCluster->init(allNodes);
+ m_nodeMap.init(G,m_rootCluster);
+ m_itMap.init(G,0);
+ ListIterator<node> it;
+ for (it = m_rootCluster->m_entries.begin(); it.valid(); it++)
+ m_itMap[*it] = it;
+
+ m_nClusters++;
+ m_clusters.pushBack(m_rootCluster);
+}
+
+
+void ClusterGraph::reinitGraph(const Graph &G)
+ {
+ m_pGraph = &G;
+
+ OGDF_ASSERT_IF(dlConsistencyChecks, G.consistencyCheck());
+
+ m_clusterArrayTableSize = G.nextPower2(MIN_CLUSTER_TABLE_SIZE, G.nodeArrayTableSize());
+
+ if (numberOfClusters() != 0)
+ {
+ clear();
+ }//if
+ initGraph(G); //already constructs root cluster, reassign
+ }
+
+
+void ClusterGraph::reinitArrays()
+{
+ ListIterator<ClusterArrayBase*> itCluster = m_regClusterArrays.begin();
+ for(; itCluster.valid(); ++itCluster)
+ (*itCluster)->reinit(m_clusterArrayTableSize);
+}
+
+
+
+// Copy Function
+void ClusterGraph::deepCopy(const ClusterGraph &C,Graph &G)
+{
+
+ const Graph &cG = C; // original graph
+
+ ClusterArray<cluster> originalClusterTable(C);
+ NodeArray<node> originalNodeTable(cG);
+ EdgeArray<edge> edgeCopy(cG);
+
+ deepCopy(C,G,originalClusterTable, originalNodeTable, edgeCopy);
+}
+
+void ClusterGraph::deepCopy(const ClusterGraph &C,Graph &G,
+ ClusterArray<cluster> &originalClusterTable,
+ NodeArray<node> &originalNodeTable)
+{
+
+ const Graph &cG = C; // original graph
+
+ EdgeArray<edge> edgeCopy(cG);
+
+ deepCopy(C,G,originalClusterTable, originalNodeTable, edgeCopy);
+}
+
+void ClusterGraph::deepCopy(const ClusterGraph &C,Graph &G,
+ ClusterArray<cluster> &originalClusterTable,
+ NodeArray<node> &originalNodeTable,
+ EdgeArray<edge> &edgeCopy)
+{
+ G.clear();
+
+ const Graph &cG = C; // original graph
+
+ m_pGraph = &G;
+
+ m_nClusters = 0;
+
+ initGraph(G); //arrays have already to be initialized for newnode
+
+ m_updateDepth = C.m_updateDepth;
+ m_depthUpToDate = C.m_depthUpToDate;
+
+ NodeArray<node> orig(G);
+ node v;
+ edge e;
+
+ forall_nodes(v,cG)
+ {
+ node w = G.newNode();
+ orig[w] = v;
+ originalNodeTable[v] = w;
+ }
+ forall_edges(e,cG)
+ {
+ edge eNew = G.newEdge(originalNodeTable[e->adjSource()->theNode()],
+ originalNodeTable[e->adjTarget()->theNode()]);
+ edgeCopy[e] = eNew;
+ }//foralledges
+
+ //m_clusterDepth.init(*this, 0);
+
+
+ // Construct cluster tree
+ cluster c = 0;
+ forall_clusters(c,C)
+ {
+ if (c == C.m_rootCluster)
+ {
+ originalClusterTable[c] = m_rootCluster;
+ //does not really need to be assigned HERE in for
+ m_rootCluster->depth() = 1;
+ OGDF_ASSERT(c->depth() == 1)
+ continue;
+ }
+ originalClusterTable[c] = newCluster();
+ originalClusterTable[c]->depth() = c->depth();
+ }
+ forall_clusters(c,C)
+ {
+
+ if (c == C.m_rootCluster)
+ continue;
+ originalClusterTable[c]->m_parent = originalClusterTable[c->m_parent];
+ originalClusterTable[c->m_parent]->m_children.pushBack(originalClusterTable[c]);
+ originalClusterTable[c]->m_it = originalClusterTable[c->m_parent]->m_children.rbegin();
+ }
+
+ forall_nodes(v,G)
+ reassignNode(v,originalClusterTable[C.clusterOf(orig[v])]);
+
+ //ClusterArray<cluster>* ca = ;
+ copyLCA(C, &originalClusterTable);
+}
+
+//*********************************************************
+//cluster search
+
+//We search for the lowest common cluster of a set of nodes.
+//We first compute the common path of two nodes, then update path if root
+//path from other nodes hits it .
+//We always stop if we encounter root cluster.
+cluster ClusterGraph::commonCluster(SList<node>& nodes)
+{
+ //worst case running time #nodes x clustertreeheight-1
+ //always <= complete tree run
+ //we could even use pathcompression...
+ //at any time, we stop if root is encountered as lowest
+ //common cluster of a node subset
+
+
+ if (nodes.empty()) return 0;
+
+ //For simplicity, we use cluster arrays
+ ClusterArray<int> commonPathHit(*this, 0); //count for clusters path hits
+ int runs = 0; //number of nodes already considered
+ cluster pathCluster;
+ SListIterator<node> sIt = nodes.begin();
+ node v1 = (*sIt);
+ if (nodes.size() == 1) return clusterOf(v1);
+ sIt++;
+ node v2 = (*sIt);
+
+ cluster lowestCommon = commonCluster(v1, v2);
+ commonPathHit[lowestCommon] = 2;
+ pathCluster = lowestCommon;
+ while (pathCluster->parent())
+ {
+ pathCluster = pathCluster->parent();
+ commonPathHit[pathCluster] = 2;
+ }
+ runs = 2;
+ //we save direct lca access, it also lies on a runs hit path from root
+ while ((runs < nodes.size()) && (lowestCommon != m_rootCluster))
+ {
+ sIt++;
+ node v = (*sIt);
+ pathCluster = clusterOf(v);
+ while (commonPathHit[pathCluster] == 0)
+ {
+ if (pathCluster->parent()) pathCluster = pathCluster->parent();
+ else return m_rootCluster; //can never happen
+ }//while
+ //assign new (maybe same) lowest common
+ if (commonPathHit[pathCluster] == runs) lowestCommon = pathCluster;
+ commonPathHit[pathCluster] = commonPathHit[pathCluster]+1;
+ if (pathCluster == m_rootCluster) return m_rootCluster;
+ //update hits in path to root
+ while (pathCluster->parent())
+ {
+ pathCluster = pathCluster->parent();
+ commonPathHit[pathCluster] = commonPathHit[pathCluster]+1;
+ }
+
+ runs++;
+ }
+ return lowestCommon;
+
+
+}//commoncluster
+
+//lowest common cluster of v,w
+cluster ClusterGraph::commonCluster(node v, node w) const
+{
+ cluster c1, c2;
+ return commonClusterLastAncestors(v, w, c1, c2);
+}//commonCluster
+
+//lowest common cluster of v,w and its ancestors
+cluster ClusterGraph::commonClusterLastAncestors(node v,
+ node w,
+ cluster& c1,
+ cluster& c2) const
+{
+ List<cluster> e;
+ return commonClusterAncestorsPath(v, w, c1, c2, e);
+}//commonClusterLastAncestors
+//lowest common cluster and path between v and w containing it
+//note that eL is directed from v to w
+cluster ClusterGraph::commonClusterPath(node v,
+ node w,
+ List<cluster>& eL) const
+{
+ cluster c1, c2;
+ return commonClusterAncestorsPath(v, w, c1, c2, eL);
+}//commonClusterLastAncestors
+
+//note that eL is directed from v to w
+cluster ClusterGraph::commonClusterAncestorsPath(node v,
+ node w,
+ cluster& c1,
+ cluster& c2,
+ List<cluster>& eL) const
+{
+ OGDF_ASSERT(v->graphOf() == m_pGraph)
+ OGDF_ASSERT(w->graphOf() == m_pGraph)
+
+ cluster cv = clusterOf(v);
+ cluster cw = clusterOf(w);
+
+
+ //clusters from v and w to common
+ List<cluster> vList;
+ List<cluster> wList;
+
+ //CASE1 no search necessary
+ //if both nodes are in the same cluster, we return this cluster
+ //and have to check if c1 == c2 to have a (v,w) representation edge
+ if (cv == cw)
+ {
+ c1 = c2 = cv;
+ eL.pushBack(c1);
+ return cv;
+ }
+
+ if (m_lcaNumber == INT_MAX - 1) m_lcaNumber = 0;
+ else m_lcaNumber++;
+ if (!m_lcaSearch)
+ {
+ m_lcaSearch = OGDF_NEW ClusterArray<int>(*this, -1);
+ m_vAncestor = OGDF_NEW ClusterArray<cluster>(*this, 0);
+ m_wAncestor = OGDF_NEW ClusterArray<cluster>(*this, 0);
+ }
+
+ //CASE2: one of the nodes hangs at root: save root as ancestor
+ //any other case: save cluster of node as ancestor, too, to check this
+ //case:: common = xCluster != yCluster
+ //(*m_vAncestor)[rootCluster()] = rootCluster();
+ //(*m_wAncestor)[rootCluster()] = rootCluster();
+ (*m_vAncestor)[cv] = 0;
+ (*m_wAncestor)[cw] = 0;
+
+ //we rely on the fact all nodes are in the rootcluster or
+ //that parent is initialized to zero to terminate
+
+ //we start with different clusters due to CASE1
+ //save the ancestor information
+ (*m_lcaSearch)[cw] = m_lcaNumber; //not really necessary, we won't return
+ (*m_lcaSearch)[cv] = m_lcaNumber;
+ vList.pushBack(cv);
+ wList.pushBack(cw);
+
+ //we break and return if we find a common node
+ //before we reach the rootcluster
+ do
+ {
+ if (cv->parent()) //root reached?
+ {
+ (*m_vAncestor)[cv->parent()] = cv;
+ cv = cv->parent();
+ //was cv visited on path from w
+ if ((*m_lcaSearch)[cv] == m_lcaNumber)
+ {
+ c1 = (*m_vAncestor)[cv];
+ c2 = (*m_wAncestor)[cv];
+ //setup list
+ ListIterator<cluster> itC = vList.begin();
+
+ while (itC.valid())
+ {
+ eL.pushBack(*itC);
+ itC++;
+ }
+ itC = wList.rbegin();
+ while (itC.valid() && ((*itC) != cv))
+ itC--;
+ while (itC.valid())
+ {
+ eL.pushBack(*itC);
+ itC--;
+ }
+
+ return cv;
+ }
+ vList.pushBack(cv);
+ (*m_lcaSearch)[cv] = m_lcaNumber;
+ }//if not root reached on cvpath
+
+ if (cw->parent())
+ {
+ (*m_wAncestor)[cw->parent()] = cw;
+ cw = cw->parent();
+ //was cw visited on path from v
+ if ((*m_lcaSearch)[cw] == m_lcaNumber)
+ {
+ c1 = (*m_vAncestor)[cw];
+ c2 = (*m_wAncestor)[cw];
+ //setup list
+ ListIterator<cluster> itC = vList.begin();
+ while (itC.valid() && ((*itC) != cw))
+ {
+ eL.pushBack(*itC);
+ itC++;
+ }
+
+ eL.pushBack(cw);
+
+ itC = wList.rbegin();
+ while (itC.valid())
+ {
+ eL.pushBack(*itC);
+ itC--;
+ }
+
+ return cw;
+ }
+ wList.pushBack(cw);
+ (*m_lcaSearch)[cw] = m_lcaNumber;
+
+ }//if not root reached on cwpath
+ } while ( cv->parent() || cw->parent() );
+
+ //v,w should be at least together in the rootcluster
+ c1 = (*m_vAncestor)[rootCluster()];
+ c2 = (*m_wAncestor)[rootCluster()];
+ return rootCluster();
+
+}//commonclusterlastAncestors
+
+void ClusterGraph::copyLCA(
+ const ClusterGraph &C,
+ ClusterArray<cluster>* /*clusterCopy*/)
+{
+ if (m_lcaSearch)
+ {
+ delete m_lcaSearch;
+ delete m_vAncestor;
+ delete m_wAncestor;
+ }//if
+ if (C.m_lcaSearch)
+ {
+ //otherwise, initialization won't work
+ m_clusterArrayTableSize = C.m_clusterArrayTableSize;
+
+ m_lcaSearch = OGDF_NEW ClusterArray<int>(*this, -1);//(*C.m_lcaSearch);
+
+ m_vAncestor = OGDF_NEW ClusterArray<cluster>(*this, 0); //*C.m_vAncestor);
+ //m_vAncestor->init(*this, 0),
+ m_wAncestor = OGDF_NEW ClusterArray<cluster>(*this, 0);//*C.m_wAncestor);
+ //setting of clusters is not necessary!
+ //(*m_v/wAncestor)[(*clusterCopy)[c]]= (*(C.m_v/wAncestor))[c];
+ }//if
+}//copylca
+
+//---------------------------------------------------------
+// check the graph for empty clusters
+//---------------------------------------------------------
+//we never set rootcluster to be one of the empty clusters!!
+void ClusterGraph::emptyClusters(SList<cluster>& emptyCluster,
+ SList<cluster>* checkCluster)
+{
+ emptyCluster.clear();
+ cluster cc;
+ //for all nodes = #nodes
+ if (checkCluster)
+ {
+ SListIterator<cluster> it = checkCluster->begin();
+
+ while (it.valid())
+ {
+ if ((*it)->cCount() + (*it)->nCount() == 0)
+ if ((*it) != rootCluster()) //we dont add rootcluster
+ emptyCluster.pushBack((*it));
+ it++;
+ }//while
+ }//if checkcluster given
+ else
+ {
+ forall_clusters(cc, *this)
+ {
+ if (cc->cCount() + cc->nCount() == 0)
+ if (cc != rootCluster()) //we dont add rootcluster
+ emptyCluster.pushBack(cc);
+ }//forallclusters
+ }//else checkcluster
+ //other clusters can get empty, too, if we delete these
+ ClusterArray<int> delCount(*this, 0);
+ SList<cluster> emptyParent;
+ SListIterator<cluster> itC = emptyCluster.begin();
+ while (itC.valid())
+ {
+ //count deleted children
+ cluster runc = (*itC)->parent();
+ if (runc) //is always the case as long as root was not inserted to list
+ {
+ delCount[runc]++;
+ while ((runc->nCount() == 0) && (runc->cCount() == delCount[runc]))
+ {
+ if (runc == rootCluster()) break;
+ emptyParent.pushBack(runc);
+ runc = runc->parent();
+ delCount[runc]++;
+ }//while parent emptied
+ }//if not runc = root->parent
+
+ itC++;
+ }//while empty leaves
+
+ emptyCluster.conc(emptyParent);
+ //for reinsertion, start at emptycluster's back
+
+}//emptyClusters
+
+//---------------------------------------------------------
+// newCluster, delCluster, createCluster
+//---------------------------------------------------------
+
+// Inserts a new cluster prescribing its parent
+cluster ClusterGraph::newCluster(cluster parent, int id)
+{
+ OGDF_ASSERT(parent);
+ cluster c;
+ if (id > 0)
+ c = newCluster(id);
+ else
+ c = newCluster();
+ parent->m_children.pushBack(c);
+ c->m_it = parent->m_children.rbegin();
+ c->m_parent = parent;
+ c->depth() = parent->depth() + 1;
+
+ return c;
+}
+
+//Insert a new cluster with given ID, precondition: id not used
+//has to be updated in the same way as newcluster()
+cluster ClusterGraph::newCluster(int id)
+{
+ m_nClusters++;
+ m_adjAvailable = false;
+ m_postOrderStart = 0;
+ if (id >= m_clusterIdCount) m_clusterIdCount = id+1;
+ if (m_clusterIdCount >= m_clusterArrayTableSize)
+ {
+ m_clusterArrayTableSize =
+ m_pGraph->nextPower2(m_clusterArrayTableSize, id);
+ for(ListIterator<ClusterArrayBase*> it = m_regClusterArrays.begin();
+ it.valid(); ++it)
+ {
+ (*it)->enlargeTable(m_clusterArrayTableSize);
+ }
+ }
+ #ifdef OGDF_DEBUG
+ cluster c = OGDF_NEW ClusterElement(this,id);
+ #else
+ cluster c = OGDF_NEW ClusterElement(id);
+ #endif
+ m_clusters.pushBack(c);
+ // notify observers
+ for(ListIterator<ClusterGraphObserver*> it = m_regObservers.begin();
+ it.valid(); ++it) (*it)->clusterAdded(c);
+ return c;
+}
+
+// Inserts a new cluster
+//has to be updated in the same way as newcluster(id)
+cluster ClusterGraph::newCluster()
+{
+ m_nClusters++;
+ m_adjAvailable = false;
+ m_postOrderStart = 0;
+ if (m_clusterIdCount == m_clusterArrayTableSize)
+ {
+ m_clusterArrayTableSize <<= 1;
+ for(ListIterator<ClusterArrayBase*> it = m_regClusterArrays.begin();
+ it.valid(); ++it)
+ {
+ (*it)->enlargeTable(m_clusterArrayTableSize);
+ }
+ }
+ #ifdef OGDF_DEBUG
+ cluster c = OGDF_NEW ClusterElement(this,m_clusterIdCount++);
+ #else
+ cluster c = OGDF_NEW ClusterElement(m_clusterIdCount++);
+ #endif
+ m_clusters.pushBack(c);
+ // notify observers
+ for(ListIterator<ClusterGraphObserver*> it = m_regObservers.begin();
+ it.valid(); ++it) (*it)->clusterAdded(c);
+ return c;
+}
+
+cluster ClusterGraph::createEmptyCluster(const cluster parent, int clusterId)
+{
+ //if no id given, use next free id
+ if (clusterId < 0) clusterId = m_clusterIdCount;
+ //create the new cluster
+ cluster cnew;
+ if (parent)
+ cnew = newCluster(parent, clusterId);
+ else
+ cnew = newCluster(m_rootCluster, clusterId);
+ return cnew;
+}//createemptycluster
+
+cluster ClusterGraph::createCluster(SList<node>& nodes, const cluster parent)
+{
+ cluster c;
+ if (m_allowEmptyClusters)
+ {
+ c = doCreateCluster(nodes, parent);
+ return c;
+ }
+ else
+ {
+ SList<cluster> emptyCluster;
+
+ c = doCreateCluster(nodes, emptyCluster, parent);
+
+ SListIterator<cluster> sIt = emptyCluster.begin();
+ while (sIt.valid())
+ {
+ delCluster((*sIt));
+
+ //root cluster can never be empty, as we deleted a node
+ sIt++;
+ }//While
+ }
+ return c;
+}
+
+cluster ClusterGraph::doCreateCluster(SList<node>& nodes,
+ const cluster parent,
+ int clusterId)
+{
+
+ if (nodes.empty()) return 0;
+
+ //if no id given, use next free id
+ if (clusterId < 0) clusterId = m_clusterIdCount;
+ //create the new cluster
+ cluster cnew;
+ if (parent)
+ cnew = newCluster(parent, clusterId);
+ else
+ cnew = newCluster(m_rootCluster, clusterId);
+
+ //insert nodes in new cluster
+ SListIterator<node> it = nodes.begin();
+ while (it.valid())
+ {
+ reassignNode((*it), cnew);
+ it++;
+ }//while
+
+ return cnew;
+}//createcluster
+
+cluster ClusterGraph::doCreateCluster(SList<node>& nodes,
+ SList<cluster>& emptyCluster,
+ const cluster parent,
+ int clusterId)
+{
+ // Even if m_allowEmptyClusters is set we check if a cluster
+ // looses all of its nodes and has
+ // no more entries and childs. This can be used for special cluster
+ // object handling or for deletion if m_allowEmptyClusters is not set
+ // if it is not the new parent, it can be deleted
+ // running time max(#cluster, length(nodelist))
+ // TODO: Parameter, der dies auslaesst, da hohe Laufzeit
+ // hier macht das nur Sinn, wenn es schneller ist als forallclusters,
+ // sonst koennte man es ja auch aussen testen, aber bisher ist es nicht
+ // schneller implementiert
+ // Vorgehen: hash auf cluster index, falls nicht gesetzt, in liste einfuegen
+ // und als checkcluster an emptycluster uebergeben
+
+ if (nodes.empty()) return 0;
+
+ //if no id given, use next free id
+ if (clusterId < 0) clusterId = m_clusterIdCount;
+ //create the new cluster
+ cluster cnew;
+ if (parent)
+ cnew = newCluster(parent, clusterId);
+ else
+ cnew = newCluster(m_rootCluster, clusterId);
+
+ //insert nodes in new cluster
+ SListIterator<node> it = nodes.begin();
+ while (it.valid())
+ {
+ reassignNode((*it), cnew);
+ it++;
+ }//while
+
+ //should be: only for changed clusters (see comment above)
+ //it is important to save the cluster in an order
+ //that allows deletion as well as reinsertion
+ emptyClusters(emptyCluster);
+ //for reinsertion, start at emptycluster's back
+
+ return cnew;
+}//createcluster
+
+// Deletes cluster c
+// All subclusters become children of parent cluster
+// Precondition: c is not the root cluster
+// updating of cluster depth information pumps running time
+// up to worst case O(#C)
+void ClusterGraph::delCluster(cluster c)
+{
+ OGDF_ASSERT(c != 0 && c->graphOf() == this && c != m_rootCluster)
+
+ // notify observers
+ for(ListIterator<ClusterGraphObserver*> it = m_regObservers.begin();
+ it.valid(); ++it) (*it)->clusterDeleted(c);
+
+ --m_nClusters;
+ m_adjAvailable = false;
+
+ c->m_parent->m_children.del(c->m_it);
+ c->m_it = 0;
+
+ while (!c->m_children.empty())
+ {
+ cluster trace = c->m_children.popFrontRet();
+ trace->m_parent = c->m_parent;
+ trace->m_parent->m_children.pushBack(trace);
+ trace->m_it = trace->m_parent->m_children.rbegin();
+
+ //only recompute depth if option set and it makes sense
+ if (m_updateDepth && m_depthUpToDate)
+ {
+ //update depth for all children in subtree
+ OGDF_ASSERT(trace->depth() == trace->parent()->depth()+2)
+ pullUpSubTree(trace);
+ //could just set depth-1 here
+ //trace->depth() = trace->parent()->depth()+1;
+
+ }///if depth update
+ else m_depthUpToDate = false;
+ }
+ while (!c->m_entries.empty())
+ {
+ node v = c->m_entries.popFrontRet();
+ m_nodeMap[v] = 0;
+ reassignNode(v,c->m_parent);
+ }
+
+ m_clusters.del(c);
+}
+
+//pulls up depth of subtree located at c by one
+//precondition: depth is consistent
+//we dont ask for depthuptodate since the caller needs
+//to know for himself if he wants the tree to be pulled
+//for any special purpose
+void ClusterGraph::pullUpSubTree(cluster c)
+{
+ c->depth() = c->depth() - 1;
+ ListConstIterator<cluster> it = c->getChildren().begin();
+ while (it.valid())
+ {
+ pullUpSubTree(*it);
+ it++;
+ }
+
+}
+
+//---------------------------------------------------------
+// clear, clearClusterTree
+//---------------------------------------------------------
+
+void ClusterGraph::clear()
+{
+ //split condition
+ if (m_lcaSearch)
+ {
+ delete m_lcaSearch;
+ delete m_vAncestor;
+ delete m_wAncestor;
+ }
+ if (m_nClusters != 0)
+ {
+ clearClusterTree(m_rootCluster);
+ m_clusters.del(m_rootCluster);
+ }
+ //no clusters, so we can restart at 0
+ m_clusterIdCount = 0;
+ m_nClusters = 0;
+}
+
+
+// Removes the Clustering of a Tree and frees the allocated memory
+void ClusterGraph::clearClusterTree(cluster c)
+{
+ cluster trace = 0;
+ cluster parent = c->parent();
+ m_postOrderStart = 0;
+ m_adjAvailable = false;
+
+ List<cluster> children = c->getChildren();
+ List<node> attached;
+
+ while (!children.empty())
+ {
+ trace = children.popFrontRet();
+ clearClusterTree(trace,attached);
+ }
+
+ if (parent != 0)
+ {
+ ListIterator<node> it;
+ for (it = attached.begin();it.valid();it++)
+ {
+ m_nodeMap[(*it)] = parent;
+ parent->m_entries.pushBack((*it));
+ m_itMap[(*it)] = parent->m_entries.rbegin();
+ }
+ m_clusters.del(c);
+ }
+ else if (c == m_rootCluster)
+ {
+ ListIterator<node> it;
+ for (it = attached.begin();it.valid();it++)
+ {
+ m_nodeMap[(*it)] = m_rootCluster;
+ m_rootCluster->m_entries.pushBack((*it));
+ m_itMap[(*it)] = m_rootCluster->m_entries.rbegin();
+ }
+ m_rootCluster->m_children.clear();
+ }
+}
+
+void ClusterGraph::clearClusterTree(cluster c,List<node> &attached)
+{
+ cluster trace;
+ List<cluster> children = c->getChildren();
+ attached.conc(c->m_entries);
+ m_adjAvailable = false;
+
+ while (!children.empty())
+ {
+ trace = children.popFrontRet();
+ clearClusterTree(trace,attached);
+ }
+ m_clusters.del(c);
+}
+
+//don't delete root cluster
+void ClusterGraph::semiClear()
+{
+ //split condition
+ if (m_lcaSearch)
+ {
+ delete m_lcaSearch;
+ delete m_vAncestor;
+ delete m_wAncestor;
+ }
+ if (m_nClusters != 0)
+ {
+ //clear the cluster structure under root cluster
+ clearClusterTree(m_rootCluster);
+ //now delete all rootcluster entries
+ while (!m_rootCluster->m_entries.empty())
+ {
+ node v = m_rootCluster->m_entries.popFrontRet();
+ m_nodeMap[v] = 0;
+ }
+ }
+ //no child clusters, so we can restart at 1
+ m_clusterIdCount = 1;
+ m_nClusters = 1;
+}
+
+//reassign cluster depth for clusters in subtree rooted at c
+void ClusterGraph::computeSubTreeDepth(cluster c) const
+{
+ if (c == rootCluster()) m_depthUpToDate = true;
+ if (!(c->parent())) c->depth() = 1;
+ else c->depth() = c->parent()->depth() + 1;
+ ListConstIterator<cluster> it = c->getChildren().begin();
+ while (it.valid())
+ {
+ computeSubTreeDepth(*it);
+ it++;
+ }
+
+}
+
+//move cluster from old parent to an other
+void ClusterGraph::moveCluster(cluster c, cluster newParent)
+{
+ if (c == rootCluster()) return;
+ if ((c == 0) || (newParent == 0)) return; //no cheap tricks
+ if (c->parent() == newParent) return; //no work to do
+
+ cluster oldParent = c->parent();
+ //we dont move root
+ OGDF_ASSERT(oldParent)
+
+ //check if we move to a descendant
+ cluster crun = newParent->parent();
+ bool descendant = false;
+ while (crun)
+ {
+ if (crun == c)
+ {
+ descendant = true;
+ break;
+ }
+ crun = crun->parent();
+ }//while running upwards
+
+ //do not allow to move empty clusters to descendants
+ if (descendant && (c->nCount() == 0))
+ return;
+
+ // save postorder for old parent
+ bool newOrder = false;
+ if (!m_postOrderStart)
+ {
+ newOrder = true;
+ }
+
+ //temporarily only recompute postorder for all clusters
+
+ oldParent->m_children.del(c->m_it);
+ newParent->m_children.pushBack(c);
+ c->m_it = newParent->m_children.rbegin();
+ c->m_parent = newParent;
+
+ //update the cluster depth information in the subtree
+ //If moved to descendant, recompute
+ //depth for parent (including all brother trees)
+ if (descendant)
+ {
+ //how do we move:
+ //only entries with c? => may be empty
+ //we currently dont allow this, because it makes
+ //no sense, you could just delete the cluster or move
+ //the children
+ //move all children to oldparent
+
+ while (!c->m_children.empty())
+ {
+ cluster child = c->m_children.popFrontRet();
+ child->m_parent = oldParent;
+ child->m_parent->m_children.pushBack(child);
+ child->m_it = child->m_parent->m_children.rbegin();
+ //child++;
+ }
+
+ //recompute depth only if option set AND it makes sense at that point
+ if (m_updateDepth && m_depthUpToDate)
+ computeSubTreeDepth(oldParent);
+ else m_depthUpToDate = false;
+ }//moved to descendant
+ else
+ {
+ if (m_updateDepth && m_depthUpToDate)
+ computeSubTreeDepth(c);
+ else m_depthUpToDate = false;
+ }
+
+ // update postorder for new parent
+ // we only recompute postorder for all clusters
+ // because of special cases like move to descendant...
+ if (newOrder) postOrder();
+ else postOrder();
+
+ m_adjAvailable = false;
+
+ //checkPostOrder();
+}//move cluster
+
+
+//*****************
+//postorder updates
+
+//leftmostcluster in subtree rooted at c, has postorderpred for subtree
+cluster ClusterGraph::leftMostCluster(cluster c) const
+{
+ cluster result = c;
+ if (!c) return 0;
+ while (!result->m_children.empty())
+ {
+ result = result->m_children.front();
+ }
+ return result;
+}//leftMostCluster
+
+//searches for predecessor of SUBTREE at c
+cluster ClusterGraph::postOrderPredecessor(cluster c) const
+{
+ //all clusters on a path from root to leftmost cluster in tree
+ //have no predecessor for their subtree
+ cluster run = c;
+ ListConstIterator<cluster> it;
+ do
+ {
+ //predecessor of clustertree is 0
+ if (run == m_rootCluster) return 0;
+ it = run->m_it;
+ //a child to the left is the immediate predecessor,
+ //otherwise we go one level up
+ if (it == (run->m_parent)->m_children.begin())
+ run = run->parent();
+ else return (*(it.pred()));
+
+ } while (run);
+
+ return 0;
+}//postorderpredecessor
+
+//***************
+//node assignment
+//Assigns a node to a new cluster
+void ClusterGraph::assignNode(node v, cluster c)
+{
+ m_adjAvailable = false;
+ m_postOrderStart = 0;
+ m_nodeMap[v] = c;
+ c->m_entries.pushBack(v);
+ m_itMap[v] = c->m_entries.rbegin();
+}
+
+
+//Reassigns a node to a new cluster
+void ClusterGraph::reassignNode(node v, cluster c)
+{
+ OGDF_ASSERT(v->graphOf() == m_pGraph);
+ OGDF_ASSERT(c->graphOf() == this);
+
+ unassignNode(v);
+ m_nodeMap[v] = c;
+ c->m_entries.pushBack(v);
+ m_itMap[v] = c->m_entries.rbegin();
+}
+
+
+//Unassigns a node of cluster
+//Note: Nodes can already be unassigned by the nodeDeleted function.
+void ClusterGraph::unassignNode(node v)
+{
+ m_adjAvailable = false;
+ m_postOrderStart = 0;
+
+ removeNodeAssignment(v);
+}
+
+
+//---------------------------------------------------------
+// Sort clusters in post order
+//---------------------------------------------------------
+
+// Start function for post order
+void ClusterGraph::postOrder() const
+{
+ SListPure<cluster> L;
+ postOrder(m_rootCluster,L);
+ cluster c = 0;
+ cluster prev = L.popFrontRet();
+ prev->m_pPrev = 0;
+ m_postOrderStart = prev;
+ while (!L.empty())
+ {
+ c = L.popFrontRet();
+ prev->m_pNext = c;
+ c->m_pPrev = prev;
+ prev = c;
+ }
+ if (c != 0)
+ c->m_pNext = 0;
+ else
+ m_postOrderStart->m_pNext = 0;
+#ifdef OGDF_DEBUG
+ forall_clusters(c, *this)
+ {
+ cluster cp = leftMostCluster(c);
+ OGDF_ASSERT(cp->pPred() == postOrderPredecessor(c))
+ }
+#endif
+}
+
+//void ClusterGraph::checkPostOrder() const
+//{
+// SListPure<cluster> L;
+// postOrder(m_rootCluster,L);
+// cluster c = 0;
+// cluster prev = L.popFrontRet();
+// OGDF_ASSERT(prev->m_pPrev == 0);
+
+// while (!L.empty())
+// {
+// c = L.popFrontRet();
+// OGDF_ASSERT(prev->m_pNext == c)
+// OGDF_ASSERT(c->m_pPrev == prev)
+// prev = c;
+// }
+// if (c != 0)
+// {
+// OGDF_ASSERT(c->m_pNext == 0)
+// }
+// else
+// {
+// OGDF_ASSERT(m_postOrderStart->m_pNext == 0);
+// }
+//}
+// Recursive function for post order
+void ClusterGraph::postOrder(cluster c,SListPure<cluster> &L) const
+{
+ ListIterator<cluster> it;
+ for (it = c->m_children.begin(); it.valid(); it++)
+ postOrder((*it),L);
+ L.pushBack(c);
+}
+
+
+
+
+//---------------------------------------------------------
+// Methods for debugging
+//---------------------------------------------------------
+
+
+// checks the consistency of the data structure
+// (for debugging only)
+bool ClusterGraph::consistencyCheck()
+{
+
+ ClusterArray<bool> visitedClusters((*this),false);
+ NodeArray<bool> visitedNodes((*m_pGraph),false);
+
+
+ cluster c = 0;
+ forall_postOrderClusters(c,(*this))
+ {
+ visitedClusters[c] = true;
+ ListIterator<node> itn;
+ for (itn = c->m_entries.begin(); itn.valid(); itn++)
+ {
+ node v = *itn;
+ if (m_nodeMap[v] != c)
+ return false;
+ visitedNodes[v] = true;
+ }
+ }
+ forall_clusters(c,(*this))
+ if (!visitedClusters[c])
+ return false;
+ node v;
+ forall_nodes(v,(*m_pGraph))
+ if (!visitedNodes[v])
+ return false;
+ return true;
+}
+
+
+
+bool ClusterGraph::representsCombEmbedding()
+{
+
+ if (!m_adjAvailable)
+ return false;
+
+ if (!consistencyCheck())
+ return false;
+
+
+ cluster c = 0;
+ forall_postOrderClusters(c,(*this))
+ {
+
+ #ifdef OGDF_DEBUG
+ if (int(ogdf::debugLevel) >= int(dlHeavyChecks)){
+ cout << "__________________________________________________________________"
+ << endl << endl
+ << "Testing cluster " << c << endl
+ << "Check on AdjList of c" << endl;
+ adjEntry adjDD;
+ forall_cluster_adj(adjDD,c)
+ cout << adjDD << "; ";
+ cout << endl;
+ }
+ #endif
+
+ if (c != m_rootCluster)
+ {
+
+ ListIterator<adjEntry> it;
+ it = c->firstAdj();
+ adjEntry start = *it;
+
+ #ifdef OGDF_DEBUG
+ if (int(ogdf::debugLevel) >= int(dlHeavyChecks)){
+ cout << "firstAdj " << start << endl; }
+ #endif
+
+ while (it.valid())
+ {
+ AdjEntryArray<bool> visitedAdjEntries((*m_pGraph),false);
+
+ ListIterator<adjEntry> succ = it.succ();
+ adjEntry adj = *it;
+ adjEntry succAdj;
+
+ if (succ.valid())
+ succAdj = *succ;
+ else
+ succAdj = start; // reached the last outgoing edge
+
+ #ifdef OGDF_DEBUG
+ if (int(ogdf::debugLevel) >= int(dlHeavyChecks)){
+ cout << "Check next " << endl;
+ cout << "current in adj list of" << adj << endl;
+ cout << "succ in adj list of c " << succAdj << endl;
+ cout << "cyclic succ in outer face " << adj->cyclicSucc() << endl;
+ }
+ #endif
+
+
+
+ if (adj->cyclicSucc() != succAdj)
+ // run along the outer face of the cluster
+ // until you find the next outgoing edge
+ {
+ adjEntry next = adj->cyclicSucc();
+ adjEntry twin = next->twin();
+
+ #ifdef OGDF_DEBUG
+ if (int(ogdf::debugLevel) >= int(dlHeavyChecks)){
+ cout << "Running along the outer face ... " << endl;
+ cout << "next adj " << next << endl;
+ cout << "twin adj " << twin << endl;
+ }
+ #endif
+
+ if (visitedAdjEntries[twin])
+ return false;
+ visitedAdjEntries[twin] = true;
+ while ( next != succAdj)
+ {
+ next = twin->cyclicSucc();
+ twin = next->twin();
+ #ifdef OGDF_DEBUG
+ if (int(ogdf::debugLevel) >= int(dlHeavyChecks)){
+ cout << "Running along the outer face ... " << endl;
+ cout << "next adj " << next << endl;
+ cout << "twin adj " << twin << endl;
+ }
+ #endif
+ if (visitedAdjEntries[twin])
+ return false;
+ visitedAdjEntries[twin] = true;
+ }
+
+ }
+ // else
+ // next edge is also outgoing
+
+ it = succ;
+ }
+ }
+ }
+
+
+ return true;
+
+}
+
+
+
+
+// registers a cluster array
+ListIterator<ClusterArrayBase*> ClusterGraph::registerArray(
+ ClusterArrayBase *pClusterArray) const
+{
+ return m_regClusterArrays.pushBack(pClusterArray);
+}
+
+// unregisters a cluster array
+void ClusterGraph::unregisterArray(ListIterator<ClusterArrayBase*> it) const
+{
+ m_regClusterArrays.del(it);
+}
+
+//! Registers a ClusterGraphObserver.
+ListIterator<ClusterGraphObserver*> ClusterGraph::registerObserver(ClusterGraphObserver *pObserver) const
+{
+ return m_regObservers.pushBack(pObserver);
+}
+
+//! Unregisters a ClusterGraphObserver.
+void ClusterGraph::unregisterObserver(ListIterator<ClusterGraphObserver*> it) const
+{
+ m_regObservers.del(it);
+}
+//---------------------------------------------------------
+// Methods for printing
+//---------------------------------------------------------
+
+
+// writes graph in GML format to file fileName
+void ClusterGraph::writeGML(const char *fileName)
+{
+ ofstream os(fileName);
+ writeGML(os);
+}
+
+// writes graph in GML format to output stream os
+void ClusterGraph::writeGML(ostream &os)
+{
+ NodeArray<int> nId(*m_pGraph);
+ ClusterArray<int> cId(*this);
+ int nextId = 0;
+
+ os << "Creator \"ogdf::ClusterGraph::writeGML\"\n";
+ os << "graph [\n";
+ os << " directed 1\n";
+
+ node v;
+ forall_nodes(v,*m_pGraph) {
+ os << " node [\n";
+ os << " id " << (nId[v] = nextId++) << "\n";
+ os << " ]\n"; // node
+ }
+
+ edge e;
+ forall_edges(e,*m_pGraph) {
+ os << " edge [\n";
+ os << " source " << nId[e->source()] << "\n";
+ os << " target " << nId[e->target()] << "\n";
+ os << " ]\n"; // edge
+ }
+
+ String scip = " ";
+ nextId = 0;
+ writeCluster(os,nId,cId,nextId,m_rootCluster,scip);
+
+ os << "]\n"; // graph
+}
+
+
+// recursively write the cluster structure in GML
+void ClusterGraph::writeCluster(ostream &os,
+ NodeArray<int> &nId,
+ ClusterArray<int> & cId,
+ int &nextId,
+ cluster c,
+ String scip)
+{
+ String newScip = scip;
+ newScip+=" ";
+ os << scip << "cluster [\n";
+ os << scip << " id " << (cId[c] = nextId++) << "\n";
+ ListIterator<cluster> it;
+ for (it = c->m_children.begin(); it.valid(); it++)
+ writeCluster(os,nId,cId,nextId,*it,newScip);
+ ListIterator<node> itn;
+ for (itn = c->m_entries.begin(); itn.valid(); itn++)
+ os << scip << " node " << nId[*itn] << "\n";
+ os << scip << "]\n"; // cluster
+}
+
+
+// recursively write the cluster structure in GraphWin GML
+void ClusterGraph::writeGraphWinCluster(ostream &os,
+ NodeArray<int> &nId,
+ NodeArray<String> &nStr,
+ ClusterArray<int> & cId,
+ ClusterArray<String> & cStr,
+ int &nextId,
+ cluster c,
+ String scip)
+{
+ String newScip = scip;
+ newScip+=" ";
+ if (c == m_rootCluster)
+ os << scip << "rootcluster [\n";
+ else
+ {
+ os << scip << "cluster [\n";
+// os << scip << " id " << (cId[c] = nextId++) << "\n";
+ os << scip << " id " << c->index() << "\n";
+ char newLabel[124];
+// sprintf(newLabel,"C%d",cId[c]);
+ ogdf::sprintf(newLabel,124,"C%d",c->index());
+ cStr[c] = newLabel;
+ os << scip << " label \"" << cStr[c] << "\"\n";
+
+ }
+ ListIterator<cluster> it;
+ for (it = c->m_children.begin(); it.valid(); it++)
+ writeGraphWinCluster(os,nId,nStr,cId,cStr,nextId,*it,newScip);
+ ListIterator<node> itn;
+ for (itn = c->m_entries.begin(); itn.valid(); itn++)
+ os << scip << " vertex \"v" << nId[*itn] << "\"\n";
+ os << scip << "]\n"; // cluster
+}
+
+
+//++++++++++++++++++++++++++++++++++++++++++++
+//reading graph, cluster structure
+bool ClusterGraph::readClusterGML(const char* fileName,
+ Graph& G)
+{
+ ifstream is(fileName);
+ if (!is)
+ return false; // couldn't open file
+
+ return readClusterGML(is, G);
+}
+
+bool ClusterGraph::readClusterGML(istream& is,
+ Graph& G)
+{
+ bool result;
+ GmlParser gml(is);
+ if (gml.error())
+ return false;
+
+ result = gml.read(G);
+
+ if (!result) return false;
+
+ return gml.readCluster(G, *this);
+}
+
+
+// read Cluster Graph from OGML file
+//bool ClusterGraph::readClusterGraphOGML(const char* fileName,
+// ClusterGraph& CG,
+// Graph& G)
+//{
+// ifstream is(fileName);
+// // not able to open file
+// if (!is) return false;
+//
+// OgmlParser *op = new OgmlParser();
+// // build graph
+// // method read contains the validation
+// if (!op->read(fileName, G, CG, *this)){
+// delete(op);
+// cerr << "ERROR occured while reading. Aborting." << endl << flush;
+// return false;
+// }
+//
+// delete(op);
+// return true;
+//};
+
+
+} // end namespace ogdf
+
+//****************************************************************
+ostream &operator<<(ostream &os, ogdf::cluster c)
+{
+ if (c) os << c->index(); else os << "nil";
+ return os;
+}
diff --git a/ogdf/cluster/ClusterGraph.h b/ogdf/cluster/ClusterGraph.h
new file mode 100644
index 0000000..7f9cd7a
--- /dev/null
+++ b/ogdf/cluster/ClusterGraph.h
@@ -0,0 +1,825 @@
+/*
+ * $Revision: 2564 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-07 00:03:48 +0200 (Sa, 07. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Derived class of GraphObserver providing additional functionality
+ * to handle clustered graphs.
+ *
+ * \author Sebastian Leipert, Karsten Klein
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+
+#ifndef OGDF_CLUSTER_GRAPH_H
+#define OGDF_CLUSTER_GRAPH_H
+
+#include "../basic/NodeArray.h"
+#include "../basic/Stack.h"
+#include "../basic/GraphObserver.h"
+
+
+namespace ogdf {
+
+class OGDF_EXPORT ClusterGraph;
+class OGDF_EXPORT ClusterGraphObserver;
+
+//! Representation of clusters in a clustered graph.
+/**
+ * \see ClusterGraph
+ */
+class OGDF_EXPORT ClusterElement : private GraphElement {
+
+ friend class OGDF_EXPORT ClusterGraph;
+ friend class GraphList<ClusterElement>;
+
+ int m_id; //!< The index of this cluster.
+ int m_depth; //!< The depth of this cluster in the cluster tree.
+ List<node> m_entries; //!< The nodes in this cluster.
+ List<ClusterElement*> m_children; //!< The child clusters of this cluster.
+ ClusterElement *m_parent; //!< The parent of this cluster.
+ ClusterElement *m_pPrev; //!< The postorder predecessor of this cluster.
+ ClusterElement *m_pNext; //!< The postorder successor of this cluster.
+ ListIterator<ClusterElement*> m_it; //!< The position of this cluster within children list of its parent.
+
+ List<adjEntry> m_adjEntries; //!< The adjacency list.
+ // Don't use a GraphList !
+ // This messes with the adjacency
+ // list of the underlying graph
+
+ #ifdef OGDF_DEBUG
+ // we store the graph containing this cluster for debugging purposes
+ const ClusterGraph *m_pClusterGraph;
+ #endif
+
+
+ void init(List<node> &nodes) {
+ while (!nodes.empty())
+ m_entries.pushBack(nodes.popFrontRet());
+ }
+
+ List<ClusterElement*> &getChildren(){
+ return m_children;
+ }
+
+ List<node> &getNodes(){
+ return m_entries;
+ }
+
+ //! Traverses the inclusion tree and adds nodes to \a clusterNodes.
+ /**
+ * Invoked by public function getClusterNodes(List<node> &clusterNodes).
+ */
+ void getClusterInducedNodes(List<node> &clusterNodes);
+ void getClusterInducedNodes(NodeArray<bool> &clusterNode, int& num);
+
+
+public:
+
+ //! Creates a new cluster element.
+ #ifdef OGDF_DEBUG
+ ClusterElement(const ClusterGraph *pClusterGraph,int id):
+ m_id(id),m_depth(0),m_parent(0),m_pPrev(0),m_pNext(0),m_it(0),
+ m_pClusterGraph(pClusterGraph) { }
+ #else
+ ClusterElement(int id):
+ m_id(id), m_depth(0),m_parent(0),m_pPrev(0),m_pNext(0),m_it(0) { }
+ #endif
+
+
+ #ifdef OGDF_DEBUG
+ const ClusterGraph *graphOf() const { return m_pClusterGraph; }
+ #endif
+
+
+ //! Returns the (unique) index of the cluster.
+ int index() const { return m_id; }
+ //! Returns the depth of the cluster in the cluster tree.
+ int depth() const { return m_depth; }
+ int& depth() { return m_depth; }
+ //! Returns the successor of the cluster in the list of all clusters.
+ ClusterElement* succ() const { return (ClusterElement*)m_next; }
+ //! Returns the predecessor of the cluster in the list of all clusters.
+ ClusterElement* pred() const { return (ClusterElement*)m_prev; }
+
+ //! Returns the postorder successor of the cluster in the list of all clusters.
+ ClusterElement* pSucc() const { return m_pNext; }
+ //! Returns the postorder predecessor of the cluster in the list of all clusters.
+ ClusterElement* pPred() const { return m_pPrev; }
+
+ // Iteration over tree structures.
+
+ //! Returns the first element in the list of child clusters.
+ ListConstIterator<ClusterElement*> cBegin() const{ return m_children.begin();}
+ //! Returns the last element in the list of child clusters.
+ ListConstIterator<ClusterElement*> crBegin() const{ return m_children.rbegin();}
+ //! Returns the number of child clusters.
+ int cCount(){ return m_children.size();}
+ //! Returns the first element in list of child nodes.
+ ListIterator<node> nBegin(){ return m_entries.begin();}
+ //! Returns the first element in list of child nodes.
+ ListConstIterator<node> nBegin() const{ return m_entries.begin();}
+ //! Returns the number of child nodes.
+ int nCount(){ return m_entries.size();}
+
+ //! Returns the parent of the cluster.
+ ClusterElement* parent(){return m_parent;}
+
+
+ //! Returns the first adjacency entry in the list of outgoing edges.
+ ListConstIterator<adjEntry> firstAdj() const { return m_adjEntries.begin(); }
+ //! Returns the first adjacency entry in the list of outgoing edges.
+ ListIterator<adjEntry> firstAdj() { return m_adjEntries.begin(); }
+ //! Returns the last adjacency entry in the list of outgoing edges.
+ ListConstIterator<adjEntry> lastAdj () const { return m_adjEntries.rbegin(); }
+ //! Returns the last adjacency entry in the list of outgoing edges.
+ ListIterator<adjEntry> lastAdj () { return m_adjEntries.rbegin(); }
+
+ //! Returns the list of nodes in the cluster, i.e., all nodes in the subtree rooted at this cluster.
+ /**
+ * Recursively traverses the cluster tree starting at this cluster.
+ */
+ void getClusterNodes(List<node> &clusterNodes);
+ //! Sets the entry for each node v to true if v is a member of
+ //! the subgraph induced by the ClusterElement.
+ //! All other entries remain unchanged!
+ //! Returns the number of entries set to true.
+ //! Precondition: clusterNode is a NodeArray initialized on the clustergraph
+ //! the ClusterElement belongs to.
+ int getClusterNodes(NodeArray<bool> &clusterNode);
+
+ OGDF_NEW_DELETE
+
+};// class ClusterElement
+
+
+
+
+typedef ClusterElement *cluster; //!< The type of clusters.
+
+
+#define forall_cluster_adj(adj,c)\
+for(ogdf::ListIterator<adjEntry> ogdf_loop_var=(c)->firstAdj();\
+ ogdf::test_forall_adj_entries_of_cluster(ogdf_loop_var,(adj));\
+ ogdf_loop_var=ogdf_loop_var.succ())
+
+#define forall_cluster_rev_adj(adj,c)\
+for(ogdf::ListIterator<adjEntry> ogdf_loop_var=(c)->lastAdj();\
+ ogdf::test_forall_adj_entries_of_cluster(ogdf_loop_var,(adj));\
+ ogdf_loop_var=ogdf_loop_var.pred())
+
+#define forall_cluster_adj_edges(e,c)\
+for(ogdf::ListIterator<adjEntry> ogdf_loop_var=(c)->firstAdj();\
+ ogdf::test_forall_adj_edges_of_cluster(ogdf_loop_var,(e));\
+ ogdf_loop_var=ogdf_loop_var.succ())
+
+
+
+inline bool test_forall_adj_entries_of_cluster(ListIterator<adjEntry> &it, adjEntry &adj)
+{
+ if (it.valid()) { adj = (*it);return true; }
+ else return false;
+}
+
+inline bool test_forall_adj_edges_of_cluster(ListIterator<adjEntry> &it, edge &e)
+{
+ adjEntry adj = (*it);
+ if (adj) { e = adj->theEdge(); return true; }
+ else return false;
+}
+
+inline bool test_forall_adj_edges_of_cluster(adjEntry &adj, edge &e)
+{
+ if (adj) { e = adj->theEdge(); return true; }
+ else return false;
+}
+
+
+class ClusterArrayBase;
+template<class T>class ClusterArray;
+
+//---------------------------------------------------------
+// iteration macros
+//---------------------------------------------------------
+
+//! Iteration over all clusters \a c of cluster graph \a C.
+#define forall_clusters(c,C) for((c)=(C).firstCluster(); (c); (c)=(c)->succ())
+//! Iteration over all clusters \a c of cluster graph \a C (in postorder).
+#define forall_postOrderClusters(c,C)\
+for((c)=(C).firstPostOrderCluster(); (c); (c)=(c)->pSucc())
+
+
+
+
+//! Representation of clustered graphs.
+/**
+ * This class is derived from GraphObserver and handles hierarchical
+ * clustering of the nodes in a graph, providing additional functionality.
+ */
+class OGDF_EXPORT ClusterGraph : public GraphObserver
+{
+ GraphList<ClusterElement> m_clusters; //!< The list of all clusters.
+
+ const Graph *m_pGraph; //!< The associated graph.
+
+ int m_nClusters; //!< The number of clusters.
+ int m_clusterIdCount; //!< The index assigned to the next created cluster.
+ int m_clusterArrayTableSize; //!< The current table size of cluster arrays.
+
+ mutable cluster m_postOrderStart; //!< The first cluster in postorder.
+ cluster m_rootCluster; //!< The root cluster.
+
+ bool m_adjAvailable; //! True if the adjacency list for each cluster is available.
+ bool m_allowEmptyClusters; //! Defines if empty clusters are deleted immediately if generated by operations.
+
+ NodeArray<cluster> m_nodeMap; //!< Stores the cluster of each node.
+ //! Stories for every node its position within the children list of its cluster.
+ NodeArray<ListIterator<node> > m_itMap;
+
+ mutable ListPure<ClusterArrayBase*> m_regClusterArrays; //!< The registered cluster arrays.
+ mutable ListPure<ClusterGraphObserver*> m_regObservers; //!< The registered graph observers.
+
+public:
+
+ //! Creates a cluster graph associated with no graph.
+ ClusterGraph();
+
+ //! Creates a cluster graph associated with graph \a G.
+ /**
+ * All nodes in \a G are assigned to the root cluster.
+ */
+ ClusterGraph(const Graph &G);
+
+ //! Copy constructor.
+ ClusterGraph(const ClusterGraph &C);
+
+ //! Constructs a clustered graph that is a copy of clustered graph C.
+ /**
+ * The underlying graph \a G is made a copy of C.getGraph().
+ */
+ ClusterGraph(const ClusterGraph &C,Graph &G);
+
+ //! Constructs a clustered graph that is a copy of clustered graph C.
+ /**
+ * The underlying graph \a G is made a copy of C.getGraph(). Stores the
+ * new copies of the original nodes and clusters in the arrays
+ * \a originalNodeTable and \a originalClusterTable.
+ */
+ ClusterGraph(
+ const ClusterGraph &C,
+ Graph &G,
+ ClusterArray<cluster> &originalClusterTable,
+ NodeArray<node> &originalNodeTable);
+
+ //! Constructs a clustered graph that is a copy of clustered graph C.
+ /**
+ * The underlying graph \a G is made a copy of C.getGraph(). Stores the
+ * new copies of the original nodes, edges, and clusters in the arrays
+ * \a originalNodeTable, \a edgeCopy, and \a originalClusterTable.
+ */
+ ClusterGraph(
+ const ClusterGraph &C,
+ Graph &G,
+ ClusterArray<cluster> &originalClusterTable,
+ NodeArray<node> &originalNodeTable,
+ EdgeArray<edge> &edgeCopy);
+
+ virtual ~ClusterGraph();
+
+ //! Returns the maximal used cluster index.
+ int maxClusterIndex() const { return m_clusterIdCount-1; }
+
+ //! Clears all cluster data.
+ void clear();
+
+ //! Clears all data but does not delete root cluster.
+ void semiClear();
+
+ //! Clears all cluster data and then reinitializes the instance with underlying graph \a G.
+ void init(const Graph &G);
+
+ //! Conversion to const Graph reference.
+ operator const Graph &() const { return *m_pGraph; }
+
+ //! Assignment operator.
+ ClusterGraph &operator=(const ClusterGraph &C);
+
+ //! Removes all clusters from the cluster subtree rooted at cluster C except for cluster C itself.
+ void clearClusterTree(cluster C);
+
+ //! Returns a reference to the underlying graph.
+ //TODO should be named getConstGraph
+ const Graph & getGraph() const {return *m_pGraph;}
+
+ //! Inserts a new cluster; makes it a child of the cluster \a parent.
+ cluster newCluster(cluster parent, int id = -1);
+
+ //! Creates an empty cluster with index \a clusterId and parent \a parent.
+ cluster createEmptyCluster(const cluster parent = 0, int clusterId = -1);
+
+ //! Creates a new cluster containing the nodes given by \a nodes; makes it a child of the cluster \a parent.
+ /**
+ * The nodes are reassigned to the new cluster. If you turn off
+ * \a m_allowEmptyclusters, an emptied cluster is deleted except if all
+ * nodes are put into the same cluster.
+ * @param nodes are the nodes that will be reassigned to the new cluster.
+ * @param parent is the parent of the new cluster.
+ * \return the created cluster.
+ */
+ cluster createCluster(SList<node>& nodes, const cluster parent = 0);
+
+ //! Deletes cluster \a c.
+ /**
+ * All subclusters become children of parent cluster of \a c.
+ * \pre \a c is not the root cluster.
+ */
+ void delCluster(cluster c);
+
+ //! Returns the root cluster.
+ cluster rootCluster() const { return m_rootCluster; }
+
+ //! Returns the cluster to which a node belongs.
+ inline cluster clusterOf(node v) const{
+ OGDF_ASSERT(v->graphOf() == m_pGraph)
+ return m_nodeMap[v];
+ }
+
+ //! Returns number of clusters.
+ int numberOfClusters() const { return m_nClusters; }
+ //! Returns upper bound for cluster indices.
+ int clusterIdCount() const { return m_clusterIdCount;}
+
+ //! Returns table size of cluster arrays associated with this graph.
+ int clusterArrayTableSize() const { return m_clusterArrayTableSize; }
+
+ //! Moves cluster \a c to a new parent \a newParent.
+ void moveCluster(cluster c, cluster newParent);
+
+
+ //! Reassigns node \a v to cluster \ c.
+ void reassignNode(node v, cluster c);
+
+ //! Clear cluster info structure, reinitializes with underlying graph \a G.
+ //inserted mainly for use in gmlparser.
+ void reInit(Graph& G)
+ {
+ reinitGraph(G);
+ }
+
+ //---------------------------
+ //tree queries / depth issues
+
+ //! Turns automatic update of node depth values on or off.
+ void setUpdateDepth(bool b) const
+ {
+ m_updateDepth = b;
+ //make sure that depth cant be used anymore
+ //(even if it may still be valid a little while)
+ if (!b) m_depthUpToDate = false;
+ }
+
+ //! Updates depth information in subtree after delCluster.
+ void pullUpSubTree(cluster c);
+
+ //! Computes depth of cluster tree, running time O(C).
+ //maybe later we should provide a permanent depth member update
+ int treeDepth() const
+ {
+ //initialize depth at first call
+ if (m_updateDepth && !m_depthUpToDate)
+ computeSubTreeDepth(rootCluster());
+ if (!m_updateDepth) OGDF_THROW(AlgorithmFailureException);
+ int l_depth = 1;
+ cluster c;
+ forall_clusters(c, *this)
+ {
+ if (c->depth() > l_depth) l_depth = c->depth();
+ }
+
+ return l_depth;
+ }
+ //! Computes depth of cluster tree hanging at \a c.
+ void computeSubTreeDepth(cluster c) const;
+ //! Returns depth of cluster c in cluster tree, starting with root depth 1.
+ //should be called instead of direct c->depth call to assure
+ //valid depth
+ int& clusterDepth(cluster c) const
+ {
+ // updateDepth must be set to true if depth info shall be used
+ OGDF_ASSERT(m_updateDepth);
+
+ //initialize depth at first call
+ if (!m_depthUpToDate)
+ computeSubTreeDepth(rootCluster());
+ OGDF_ASSERT(c->depth() != 0)
+ return c->depth();
+ }
+
+ //! Returns lowest common cluster of nodes in list \a nodes.
+ cluster commonCluster(SList<node>& nodes);
+
+ //! Returns the lowest common cluster of \a v and \a w in the cluster tree
+ /**
+ * \pre \a v and \a w are nodes in the graph.
+ */
+ cluster commonCluster(node v, node w) const;
+
+ //! Returns the lowest common cluster lca and the highest ancestors on the path to lca.
+ cluster commonClusterLastAncestors(
+ node v,
+ node w,
+ cluster& c1,
+ cluster& c2) const;
+ //! Returns lca of \a v and \a w and stores corresponding path in \a eL.
+
+ cluster commonClusterPath(
+ node v,
+ node w,
+ List<cluster>& eL) const;
+
+ //! Returns lca of \a v and \a w, stores corresponding path in \a eL and ancestors in \a c1, \a c2.
+ cluster commonClusterAncestorsPath(
+ node v,
+ node w,
+ cluster& c1,
+ cluster& c2,
+ List<cluster>& eL) const;
+
+ //! Registers a cluster array.
+ ListIterator<ClusterArrayBase*> registerArray(ClusterArrayBase *pClusterArray) const;
+
+ //! Unregisters a cluster array.
+ void unregisterArray(ListIterator<ClusterArrayBase*> it) const;
+
+ //! Registers a ClusterGraphObserver.
+ ListIterator<ClusterGraphObserver*> registerObserver(ClusterGraphObserver *pObserver) const;
+
+ //! Unregisters a ClusterGraphObserver.
+ void unregisterObserver(ListIterator<ClusterGraphObserver*> it) const;
+
+ //! Returns the list of clusters that are empty or only contain empty clusters.
+ /**
+ * The list is constructed in an order that allows deletion and reinsertion.
+ * We never set rootcluster to be one of the empty clusters!!
+ * if checkClusters is given, only list elements are checked
+ * to allow efficient checking in the case
+ * that you know which clusters were recently changed (e.g. node reass.)
+ */
+ void emptyClusters(SList<cluster>& emptyCluster, SList<cluster>* checkCluster = 0);
+
+ //! Returns true if cluster \a c has only one node and no children.
+ inline bool emptyOnNodeDelete(cluster c) //virtual?
+ {
+ //if (!c) return false; //Allows easy use in loops
+ return (c->nCount() == 1) && (c->cCount() == 0);
+ }
+
+ //! Returns true if cluster \a c has only one child and no nodes.
+ inline bool emptyOnClusterDelete(cluster c) //virtual?
+ {
+ //if (!c) return false; //Allows easy use in loops
+ return (c->nCount() == 0) && (c->cCount() == 1);
+ }
+
+ //! Returns the first cluster in the list of all clusters.
+ cluster firstCluster() const { return m_clusters.begin (); }
+ //! Returns the last cluster in the list of all cluster.
+ cluster lastCluster () const { return m_clusters.rbegin(); }
+ //! Returns the first cluster in the list of post ordered clusters.
+ cluster firstPostOrderCluster() const {
+ if (!m_postOrderStart) postOrder();
+ return m_postOrderStart;
+ }
+
+ //! Returns the list of all clusters in \a clusters.
+ template<class CLUSTERLIST>
+ void allClusters(CLUSTERLIST &clusters) const {
+ clusters.clear();
+ for (cluster c = m_clusters.begin(); c; c = c->succ())
+ clusters.pushBack(c);
+ }
+
+ //! Collapses all nodes in the list \a nodes to the first node; multi-edges are removed.
+ template<class NODELIST>
+ void collaps(NODELIST &nodes,Graph &G){
+ OGDF_ASSERT(&G == m_pGraph);
+ m_adjAvailable = false;
+
+ m_postOrderStart = 0;
+ node v = nodes.popFrontRet();
+ while (!nodes.empty())
+ {
+ node w = nodes.popFrontRet();
+ adjEntry adj = w->firstAdj();
+ while (adj !=0)
+ {
+ adjEntry succ = adj->succ();
+ edge e = adj->theEdge();
+ if (e->source() == v || e->target() == v)
+ G.delEdge(e);
+ else if (e->source() == w)
+ G.moveSource(e,v);
+ else
+ G.moveTarget(e,v);
+ adj = succ;
+ }
+ //because nodes can already be unassigned (they are always
+ //unassigned if deleted), we have to check this
+ /*
+ if (m_nodeMap[w])
+ {
+ cluster c = m_nodeMap[w];
+ c->m_entries.del(m_itMap[w]);
+ }
+ */
+ //removeNodeAssignment(w);
+ G.delNode(w);
+ }
+ }
+
+ //! Returns the list of all edges adjacent to cluster \a c in \a edges.
+ template<class EDGELIST>
+ void adjEdges(cluster c, EDGELIST &edges) const {
+ edges.clear();
+ edge e;
+ if (m_adjAvailable)
+ {
+ forall_cluster_adj_edges(e,c)
+ edges.pushBack(e);
+ }
+ }
+
+ //! Returns the list of all adjacency entries adjacent to cluster \a c in \a entries.
+ template<class ADJLIST>
+ void adjEntries(cluster c, ADJLIST &entries) const {
+ entries.clear();
+ adjEntry adj;
+ if (m_adjAvailable)
+ {
+ forall_cluster_adj(adj,c)
+ entries.pushBack(adj);
+ }
+ }
+
+ //! Computes the adjacency entry list for cluster \a c.
+ template<class LISTITERATOR>
+ void makeAdjEntries(cluster c,LISTITERATOR start){
+ adjEntry adj;
+ c->m_adjEntries.clear();
+ LISTITERATOR its;
+ for (its = start; its.valid(); its++)
+ {
+ adj = (*its);
+ c->m_adjEntries.pushBack(adj);
+ }
+ }
+
+ //**************************
+ //file output
+
+ //! Writes the cluster graph in GML format to file \a fileName.
+ void writeGML(const char *fileName);
+
+ //! Writes the cluster graph in GML format to output stream \a os.
+ void writeGML(ostream &os);
+
+
+ //**************************
+ //file input
+ //! reading graph, attributes, cluster structure from file
+ bool readClusterGML(const char* fileName, Graph& G);
+ //! reading graph, attributes, cluster structure from stream
+ bool readClusterGML(istream& is, Graph& G);
+
+ // read Cluster Graph from OGML file
+ //bool readClusterGraphOGML(const char* fileName, ClusterGraph& CG, Graph& G);
+
+ //! Checks the consistency of the data structure.
+ // (for debugging purposes only)
+ bool consistencyCheck();
+
+ //! Checks the combinatorial cluster planar embedding.
+ // (for debugging purposes only)
+ bool representsCombEmbedding();
+
+ //! Sets the availability status of the adjacency entries.
+ void adjAvailable(bool val){ m_adjAvailable = val; }
+
+protected:
+ //! Creates new cluster containing nodes in parameter list
+ //! with index \a clusterid.
+ cluster doCreateCluster(SList<node>& nodes,
+ const cluster parent, int clusterId = -1);
+ //! Creates new cluster containing nodes in parameter list and
+ //! stores resulting empty clusters in list, cluster has index \a clusterid.
+ cluster doCreateCluster(SList<node>& nodes,
+ SList<cluster>& emptyCluster,
+ const cluster parent, int clusterId = -1);
+
+ mutable ClusterArray<int>* m_lcaSearch; //!< Used to save last search run number for commoncluster.
+ mutable int m_lcaNumber;//!< Used to save last search run number for commoncluster.
+ mutable ClusterArray<cluster>* m_vAncestor;//!< Used to save last search run number for commoncluster.
+ mutable ClusterArray<cluster>* m_wAncestor;//!< Used to save last search run number for commoncluster.
+
+ //! Copies lowest common ancestor info to copy of clustered graph.
+ void copyLCA(const ClusterGraph &C, ClusterArray<cluster>* clusterCopy=0);
+ //int m_treeDepth; //should be implemented and updated in operations?
+
+ mutable bool m_updateDepth; //!< Depth of clusters is always updated if set to true.
+ mutable bool m_depthUpToDate; //!< Status of cluster depth information.
+
+ //! Adjusts the post order structure for moved clusters.
+ //we assume that c is inserted via pushback in newparent->children
+ void updatePostOrder(cluster c, cluster oldParent, cluster newParent);
+
+ //! Computes new predecessor for SUBTREE at moved cluster c.
+ //0 if c==root
+ cluster postOrderPredecessor(cluster c) const;
+ //! Leftmost cluster in subtree rooted at c, gets predecessor of subtree.
+ cluster leftMostCluster(cluster c) const;
+
+ //---------------------------------------
+ //functions inherited from GraphObserver:
+ //define how to cope with graph changes
+
+ //! Implementation of inherited method: Updates data if node deleted.
+ virtual void nodeDeleted(node v)
+ {
+ bool cRemove = false;
+ cluster c = clusterOf(v);
+ if (!c) return;
+ //never allow totally empty cluster
+ //if ((emptyOnNodeDelete(c)) &&
+ // (c != rootCluster()) ) cRemove = true;
+ unassignNode(v);
+ if (cRemove && !m_allowEmptyClusters) //parent exists
+ {
+ cluster nonEmpty = c->parent();
+ cluster cRun = nonEmpty;
+ delCluster(c);
+ while ((cRun != rootCluster()) && (cRun->nCount() + cRun->cCount() == 0))
+ {
+ nonEmpty = cRun->parent();
+ delCluster(cRun);
+ cRun = nonEmpty;
+ }
+
+ }
+ }
+ //! Implementation of inherited method: Updates data if node added.
+ virtual void nodeAdded(node v)
+ {
+ assignNode(v, rootCluster());
+ }
+ //! Implementation of inherited method: Updates data if edge deleted.
+ virtual void edgeDeleted(edge /* e */) { }
+ //! Implementation of inherited method: Updates data if edge added.
+ virtual void edgeAdded(edge /* e */) { }
+ //! Currently does nothing.
+ virtual void reInit() { }
+ //! Clears cluster data without deleting root when underlying graphs' clear method is called.
+ virtual void cleared()
+ {
+ //we don't want a complete clear, as the graph still exists
+ //and can be updated from input stream
+ semiClear();
+ }//Graph cleared
+
+private:
+ //! Assigns node \a v to cluster \a c (\a v not yet assigned!).
+ void assignNode(node v, cluster C);
+
+ //! Unassigns node \a v from its cluster.
+ void unassignNode(node v);
+
+ //! Remove the assignment entries for nodes.
+ //! Checks if node is currently not assigned.
+ void removeNodeAssignment(node v)
+ {
+ if (m_nodeMap[v]) //iff == 0, itmap == 0 !!?
+ {
+ cluster C2 = m_nodeMap[v];
+ C2->m_entries.del(m_itMap[v]);
+ m_nodeMap[v] = 0;
+ m_itMap[v] = 0;
+ }
+ }
+
+ //! Performs a copy of the cluster structure of C,
+ //! the underlying graph stays the same.
+ void shallowCopy(const ClusterGraph &C);
+
+ //! Perform a deep copy on C, C's underlying
+ //! graph is copied into G.
+ void deepCopy(const ClusterGraph &C,Graph &G);
+
+ //! Perform a deep copy on C, C's underlying
+ //! graph is copied into G. Stores associated nodes in \a originalNodeTable.
+
+ void deepCopy(
+ const ClusterGraph &C,Graph &G,
+ ClusterArray<cluster> &originalClusterTable,
+ NodeArray<node> &originalNodeTable);
+
+ //! Perform a deep copy on C, C's underlying
+ //! graph is copied into G. Stores associated nodes in \a originalNodeTable
+ //! and edges in \a edgeCopy.
+ void deepCopy(
+ const ClusterGraph &C,Graph &G,
+ ClusterArray<cluster> &originalClusterTable,
+ NodeArray<node> &originalNodeTable,
+ EdgeArray<edge> &edgeCopy);
+
+
+ void clearClusterTree(cluster c,List<node> &attached);
+
+ void initGraph(const Graph &G);
+
+ //! Reinitializes instance with graph \a G.
+ void reinitGraph(const Graph &G);
+
+ //! Creates new cluster with given id, precondition: id not used
+ cluster newCluster(int id);
+ //! Creates new cluster.
+ cluster newCluster();
+
+ //! Create postorder information in cluster tree.
+ void postOrder() const;
+ //! Check postorder information in cluster tree.
+// void checkPostOrder() const;
+
+ void postOrder(cluster c,SListPure<cluster> &S) const;
+
+ void reinitArrays();
+
+
+ //! Recursively write the cluster structure in GML.
+ void writeCluster(
+ ostream &os,
+ NodeArray<int> &nId,
+ ClusterArray<int> & cId,
+ int &nextId,
+ cluster c,
+ String ttt);
+
+ //! Recursively write the cluster structure in GraphWin GML.
+ void writeGraphWinCluster(
+ ostream &os,
+ NodeArray<int> &nId,
+ NodeArray<String> &nStr,
+ ClusterArray<int> &cId,
+ ClusterArray<String> &cStr,
+ int &nextId,
+ cluster c,
+ String ttt);
+
+};
+
+
+
+
+
+ostream &operator<<(ostream &os, ogdf::cluster c);
+
+
+} // end namespace ogdf
+
+#endif
diff --git a/ogdf/cluster/ClusterGraphAttributes.cpp b/ogdf/cluster/ClusterGraphAttributes.cpp
new file mode 100644
index 0000000..c041fe4
--- /dev/null
+++ b/ogdf/cluster/ClusterGraphAttributes.cpp
@@ -0,0 +1,740 @@
+/*
+ * $Revision: 2616 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-16 15:34:43 +0200 (Mo, 16. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implement class ClusterGraphAttributes
+ *
+ * \author Karsten Klein
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "ClusterGraphAttributes.h"
+#include "ClusterArray.h"
+#include "../fileformats/GmlParser.h"
+#include "../fileformats/OgmlParser.h"
+#include <sstream>
+
+
+namespace ogdf {
+
+
+ClusterGraphAttributes::ClusterGraphAttributes(
+ ClusterGraph& cg,
+ long initAttributes)
+: GraphAttributes(cg.getGraph(), initAttributes | edgeType | nodeType |
+ nodeGraphics | edgeGraphics), m_clusterTemplate(cg), m_pClusterGraph(&cg)
+//we should initialize m__clusterinfo here
+{
+ //should we always fill the cluster infos here?
+}//constructor
+
+
+//reinitialize graph
+void ClusterGraphAttributes::init(ClusterGraph &cg, long initAttributes)
+{
+ m_pClusterGraph = &cg;
+ m_clusterInfo.clear();
+
+ //need to initialize GraphAttributes with getGraph()
+ //we only use parameter initAttributes here in constrast
+ //to the initialization in the constructor
+ GraphAttributes::init(cg.getGraph(), initAttributes );
+}
+
+
+//
+// calculates the bounding box of the graph including clusters
+const DRect ClusterGraphAttributes::boundingBox() const
+{
+ DRect bb = GraphAttributes::boundingBox();
+ double minx = bb.p1().m_x;
+ double miny = bb.p1().m_y;
+ double maxx = bb.p2().m_x;
+ double maxy = bb.p2().m_y;
+
+ cluster c;
+ forall_clusters(c,*m_pClusterGraph)
+ {
+ if(c == m_pClusterGraph->rootCluster())
+ continue;
+
+ double x1 = clusterXPos(c);
+ double y1 = clusterYPos(c);
+ double x2 = x1 + clusterWidth(c);
+ double y2 = y1 + clusterHeight(c);
+
+ if (x1 < minx) minx = x1;
+ if (x2 > maxx) maxx = x2;
+ if (y1 < miny) miny = y1;
+ if (y2 > maxy) maxy = y2;
+ }
+
+ return DRect(minx, miny, maxx, maxy);
+}
+
+
+void ClusterGraphAttributes::updateClusterPositions(double boundaryDist)
+{
+ cluster c;
+ //run through children and nodes and update size accordingly
+ //we use width, height temporarily to store max values
+ forall_postOrderClusters(c,*m_pClusterGraph)
+ {
+ ListIterator<node> nit = c->nBegin();
+ ListConstIterator<ClusterElement*> cit = c->cBegin();
+ //Initialize with first element
+ if (nit.valid())
+ {
+ clusterXPos(c->index()) = m_x[*nit] - m_width[*nit]/2;
+ clusterYPos(c->index()) = m_y[*nit] - m_height[*nit]/2;
+ clusterWidth(c->index()) = m_x[*nit] + m_width[*nit]/2;
+ clusterHeight(c->index()) = m_y[*nit] + m_height[*nit]/2;
+ nit++;
+ }
+ else
+ {
+ if (cit.valid())
+ {
+ clusterXPos(c->index()) = clusterXPos(*cit);
+ clusterYPos(c->index()) = clusterYPos(*cit);
+ clusterWidth(c->index()) = clusterXPos(*cit) + clusterWidth(*cit);
+ clusterHeight(c->index()) = clusterYPos(*cit) + clusterHeight(*cit);
+ cit++;
+ }
+ else
+ {
+ clusterXPos(c->index()) = 0.0;
+ clusterYPos(c->index()) = 0.0;
+ clusterWidth(c->index()) = 1.0;
+ clusterHeight(c->index()) = 1.0;
+ }
+ }
+ //run through elements and update
+ while (nit.valid())
+ {
+ if (clusterXPos(c->index()) > m_x[*nit] - m_width[*nit]/2)
+ clusterXPos(c->index()) = m_x[*nit] - m_width[*nit]/2;
+ if (clusterYPos(c->index()) > m_y[*nit] - m_height[*nit]/2)
+ clusterYPos(c->index()) = m_y[*nit] - m_height[*nit]/2;
+ if (clusterWidth(c->index()) < m_x[*nit] + m_width[*nit]/2)
+ clusterWidth(c->index()) = m_x[*nit] + m_width[*nit]/2;
+ if (clusterHeight(c->index()) < m_y[*nit] + m_height[*nit]/2)
+ clusterHeight(c->index()) = m_y[*nit] + m_height[*nit]/2;
+ nit++;
+ }
+ while (cit.valid())
+ {
+ if (clusterXPos(c->index()) > clusterXPos((*cit)->index()))
+ clusterXPos(c->index()) = clusterXPos((*cit)->index());
+ if (clusterYPos(c->index()) > clusterYPos((*cit)->index()))
+ clusterYPos(c->index()) = clusterYPos((*cit)->index());
+ if (clusterWidth(c->index()) < clusterXPos((*cit)->index()) + clusterWidth((*cit)->index()))
+ clusterWidth(c->index()) = clusterXPos((*cit)->index()) + clusterWidth((*cit)->index());
+ if (clusterHeight(c->index()) < clusterYPos((*cit)->index()) + clusterHeight((*cit)->index()))
+ clusterHeight(c->index()) = clusterYPos((*cit)->index()) + clusterHeight((*cit)->index());
+ cit++;
+ }
+ clusterXPos(c->index()) -= boundaryDist;
+ clusterYPos(c->index()) -= boundaryDist;
+ clusterWidth(c->index()) = clusterWidth(c->index()) - clusterXPos(c->index()) + boundaryDist;
+ clusterHeight(c->index()) = clusterHeight(c->index()) - clusterYPos(c->index()) + boundaryDist;
+ }
+}
+
+
+void ClusterGraphAttributes::writeGML(const char *fileName)
+{
+ ofstream os(fileName);
+ writeGML(os);
+}
+
+
+void ClusterGraphAttributes::writeGML(ostream &os)
+{
+ NodeArray<int> nId(*m_pGraph);
+
+ int nextId = 0;
+
+ os.setf(ios::showpoint);
+
+ GraphAttributes::writeGML(os);
+
+ // set index string for cluster entries
+ node v;
+ forall_nodes(v,*m_pGraph)
+ {
+ nId[v] = nextId++;
+ }
+
+ // output the cluster information
+ String indent = "\0";
+ nextId = 1;
+ writeGraphWinCluster(os, nId, nextId,
+ m_pClusterGraph->rootCluster(), indent);
+}
+
+
+// recursively write the cluster structure in GML
+void ClusterGraphAttributes::writeCluster(
+ ostream &os,
+ NodeArray<int> &nId,
+ ClusterArray<int> & cId,
+ int &nextId,
+ cluster c,
+ String indent)
+{
+ String newindent = indent;
+ newindent += " ";
+ os << indent << "cluster [\n";
+ os << indent << " id " << (cId[c] = nextId++) << "\n";
+ ListConstIterator<cluster> it;
+ for (it = c->cBegin(); it.valid(); it++)
+ writeCluster(os,nId,cId,nextId,*it,newindent);
+ ListConstIterator<node> itn;
+ for (itn = c->nBegin(); itn.valid(); itn++)
+ os << indent << " node " << nId[*itn] << "\n";
+ os << indent << "]\n"; // cluster
+}
+
+
+// recursively write the cluster structure in GraphWin GML
+void ClusterGraphAttributes::writeGraphWinCluster(
+ ostream &os,
+ NodeArray<int> &nId,
+ int &nextId,
+ cluster c,
+ String indent
+ )
+{
+ String newindent = indent;
+ newindent += " ";
+
+ if (c == m_pClusterGraph->rootCluster())
+ os << indent << "rootcluster [\n";
+ else
+ {
+ os << indent << "cluster [\n";
+ os << indent << " id " << c->index() << "\n";
+
+ const String &templStr = m_clusterTemplate[c];
+ if(templStr.length() > 0) {
+ // GDE extension: Write cluster template and custom attribute
+ os << " template ";
+ writeLongString(os, templStr);
+ os << "\n";
+
+ os << " label ";
+ writeLongString(os, clusterLabel(c));
+ os << "\n";
+
+ } else {
+ os << indent << " label \"" << clusterLabel(c) << "\"\n";
+ }
+
+ os << indent << " graphics [\n";
+
+ double shiftPos;
+ shiftPos = clusterYPos(c->index());
+
+ os << indent << " x " << clusterXPos(c->index()) << "\n";
+ os << indent << " y " << shiftPos/*clusterYPos(c->index())*/ << "\n";
+
+ os << indent << " width " << clusterWidth(c->index()) << "\n";
+ os << indent << " height " << clusterHeight(c->index()) << "\n";
+ os << indent << " fill \"" << clusterFillColor(c->index()) << "\"\n";
+ os << indent << " pattern " << clusterFillPattern(c->index()) << "\n";
+
+ //border line styles
+ os << indent << " color \"" << clusterColor(c) << "\"\n";
+ os << indent << " lineWidth " << clusterLineWidth(c) << "\n";
+ //save space by defaulting
+ if (clusterLineStyle(c) != esSolid)
+ os << indent << " stipple " << clusterLineStyle(c) << "\n";
+
+ os << indent << " style \"rectangle\"\n";
+
+ os << indent << " ]\n"; //graphics
+ }
+
+ // write contained clusters
+ ListConstIterator<cluster> it;
+ for (it = c->cBegin(); it.valid(); it++)
+ writeGraphWinCluster(os, nId, nextId, *it, newindent);
+
+ // write contained nodes
+ ListConstIterator<node> itn;
+ for (itn = c->nBegin(); itn.valid(); itn++)
+ os << indent << "vertex \"" << nId[*itn] << "\"\n";
+
+ os << indent << "]\n"; // cluster
+}
+
+
+const char NEWLINE('\n'); // newline character
+const char INDENTCHAR(' '); // indent character
+const int INDENTSIZE(2); // indent size
+
+
+class omani
+{
+ int m_n;
+ ostream& (*m_f)(ostream&, int);
+
+public:
+ omani(ostream& (*f)(ostream&, int), int n) : m_n(n), m_f(f) { }
+
+ friend ostream& operator<<(ostream& os, omani man) {
+ return man.m_f(os, man.m_n);
+ }
+};
+
+ostream& padN(ostream& os, int depth)
+{
+ int n = INDENTSIZE * depth;
+ for( ; n > 0; --n)
+ os.put(INDENTCHAR);
+
+ return os;
+}
+
+omani ind(int depth)
+{
+ return omani(&padN, depth);
+}
+
+
+ostream &ind(ostream &os, int depth)
+{
+ int n = INDENTSIZE * depth;
+ for( ; n > 0; --n)
+ os.put(INDENTCHAR);
+
+ return os;
+}
+
+void ClusterGraphAttributes::writeOGML(const char *fileName)//, GraphConstraints &GC)
+{
+ ofstream os(fileName);
+ writeOGML(os);//, GC);
+}
+
+
+void ClusterGraphAttributes::writeOGML(ostream & os) //, GraphConstraints & GC)
+{
+ int labelId = 0; // new ID of current label
+ int pointId = 0; // new ID of current point
+
+ int indentDepth = 0; // main indent depth
+ int indentDepthS = 4; // indent depth for styles block
+ std::ostringstream osS; // string output stream for buffering the styles of the handled elements
+ std::ostringstream osC; // string output stream for buffering constraints
+
+ // CONFIGURING OUTPUT STREAMS
+ os.setf(ios::showpoint);
+ os.precision(10);
+ osS.setf(ios::showpoint);
+ osS.precision(10);
+ osC.setf(ios::showpoint);
+ osC.precision(10);
+
+ // XML DECLARATION AND OGML TAG
+ os << "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>" << NEWLINE; // Latin-1
+ // Simple version
+ os << "<ogml>" << NEWLINE;
+ // Strict version
+ // os << "<ogml xmlns=\"http://www.ogdf.org\"";
+ // os << " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"";
+ // os << " xsi:schemaLocation=\"http://www.ogdf.org http://www.ogdf.org/ogml.xsd\">" << NEWLINE;
+
+ // WRITING GRAPH BLOCK
+ os << ind(++indentDepth) << "<graph>" << NEWLINE;
+
+ // WRITING STRUCTURE BLOCK
+ os << ind(++indentDepth) << "<structure>" << NEWLINE;
+
+ // recursive handling of clusters
+ writeClusterOGML(os, osS, labelId, m_pClusterGraph->rootCluster(), ++indentDepth, indentDepthS);
+
+ // handling of edges
+ edge e;
+ forall_edges(e, *m_pGraph)
+ {
+ // EDGE STRUCTURE
+ os << ind(indentDepth) << "<edge id=\"e" << e->index() << "\">" << NEWLINE;
+ ++indentDepth;
+
+ // handling of label (if exists)
+ if (attributes() & edgeLabel) {
+ os << ind(indentDepth) << "<label id=\"l" << labelId++ << "\">" << NEWLINE;
+ os << ind(indentDepth+1) << "<content>" << formatLabel(labelEdge(e)) << "</content>" << NEWLINE;
+ os << ind(indentDepth) << "</label>" << NEWLINE;
+ }
+
+ os << ind(indentDepth) << "<source idRef=\"n" << e->source()->index() << "\"/>" << NEWLINE;
+ os << ind(indentDepth) << "<target idRef=\"n" << e->target()->index() << "\"/>" << NEWLINE;
+
+ /*
+ * TODO find solution for handling the edge types (app specific data?)
+ *
+ * os << "GENERALIZATION=\"" << (m_eType[e]==Graph::generalization?1:0) << "\">" << delimiter;
+ */
+
+ os << ind(--indentDepth) << "</edge>" << NEWLINE; // edge
+
+ // EDGE LAYOUT
+ if (attributes() & edgeGraphics || attributes() & edgeColor || attributes() & edgeStyle)
+ {
+ osS << ind(indentDepthS) << "<edgeStyle idRef=\"e" << e->index() << "\">" << NEWLINE;
+
+ // handling of style information
+ if(attributes() & edgeStyle || attributes() & edgeColor)
+ {
+ osS << ind(indentDepthS+1) << "<line ";
+ if (attributes() & edgeStyle) {
+ osS << "type=\"" << edgeStyleToOGML(styleEdge(e)) << "\" width=\"" << m_edgeWidth[e] << "\" ";
+ }
+ if (attributes() & edgeColor) {
+ osS << "color=\"" << colorEdge(e) << "\" />" << NEWLINE;
+ } else {
+ osS << "/>" << NEWLINE;
+ }
+ }
+
+ // TODO review the handling of edge arrows
+ if(attributes() & edgeArrow)
+ {
+ ++indentDepthS;
+ switch(arrowEdge(e)) {
+ case GraphAttributes::none:
+ osS << ind(indentDepthS) << "<sourceStyle type=\"none\" color=\"#000000\" size=\"1\" />" << NEWLINE;
+ osS << ind(indentDepthS) << "<targetStyle type=\"none\" color=\"#000000\" size=\"1\" />" << NEWLINE;
+ break;
+ case GraphAttributes::last:
+ osS << ind(indentDepthS) << "<sourceStyle type=\"none\" color=\"#000000\" size=\"1\" />" << NEWLINE;
+ osS << ind(indentDepthS) << "<targetStyle type=\"arrow\" color=\"#000000\" size=\"1\" />" << NEWLINE;
+ break;
+ case GraphAttributes::first:
+ osS << ind(indentDepthS) << "<sourceStyle type=\"arrow\" color=\"#000000\" size=\"1\" />" << NEWLINE;
+ osS << ind(indentDepthS) << "<targetStyle type=\"none\" color=\"#000000\" size=\"1\" />" << NEWLINE;
+ break;
+ case GraphAttributes::both:
+ osS << ind(indentDepthS) << "<sourceStyle type=\"arrow\" color=\"#000000\" size=\"1\" />" << NEWLINE;
+ osS << ind(indentDepthS) << "<targetStyle type=\"arrow\" color=\"#000000\" size=\"1\" />" << NEWLINE;
+ break;
+ case GraphAttributes::undefined:
+ // do nothing
+ break;
+ default:
+ // do nothing
+ break;
+ }
+ --indentDepthS;
+ }
+
+ // handling of points
+ const DPolyline &dpl = m_bends[e];
+ if (!dpl.empty()) {
+ ++indentDepthS;
+ // handle source
+ node v = e->source();
+ if(dpl.front().m_x < m_x[v] - m_width[v]/2 ||
+ dpl.front().m_x > m_x[v] + m_width[v]/2 ||
+ dpl.front().m_y < m_y[v] - m_height[v]/2 ||
+ dpl.front().m_y > m_y[v] + m_height[v]/2) {
+ osS << ind(indentDepthS) << "<point id=\"p" << pointId++ << "\" x=\"" << m_x[e->source()] << "\" y=\"" << m_y[e->source()] << "\"/>" << NEWLINE;
+ }
+ // handle points
+ ListConstIterator<DPoint> it;
+ for(it = dpl.begin(); it.valid(); ++it) {
+ osS << ind(indentDepthS) << "<point id=\"p" << pointId++ << "\" x=\"" << (*it).m_x << "\" y=\"" << (*it).m_y << "\"/>" << NEWLINE;
+ }
+ // handle target
+ v = e->target();
+ if(dpl.back().m_x < m_x[v] - m_width[v]/2 ||
+ dpl.back().m_x > m_x[v] + m_width[v]/2 ||
+ dpl.back().m_y < m_y[v] - m_height[v]/2 ||
+ dpl.back().m_y > m_y[v] + m_height[v]/2) {
+ osS << ind(indentDepthS) << "<point id=\"p" << pointId++ << "\" x=\"" << m_x[e->target()] << "\" y=\"" << m_y[e->target()] << "\"/>" << NEWLINE;
+ }
+ --indentDepthS;
+ }
+
+ osS << ind(indentDepthS) << "</edgeStyle>" << NEWLINE;
+ }
+ }
+
+ --indentDepth;
+ os << ind(indentDepth) << "</structure>" << NEWLINE;
+
+ // WRITING LAYOUT BLOCK
+ os << ind(indentDepth) << "<layout>" << NEWLINE;
+
+ // WRITING STYLES
+ ++indentDepth;
+ os << ind(indentDepth) << "<styles>" << NEWLINE;
+ os << osS.str();
+ os << ind(indentDepth) << "</styles>" << NEWLINE;
+
+ // 2.2.2) WRITING CONSTRAINTS
+ // No constraint handling so far in OGDF
+ /*
+ List<Constraint *> * csList = GC.getConstraints();
+ ListConstIterator<Constraint *> it;
+ int constID = 0;
+ if (csList->size() > 0) {
+ os << indent << "<constraints>" << NEWLINE;
+ for (it = csList->begin(); it.valid(); ++it) {
+ (*it)->storeToOgml(constID++, os, indentDepth + indentDepthS + 1);
+ }
+ os << indent << "</constraints>" << NEWLINE;
+ cout << "Constraints written...\n" << flush;
+ }
+ */
+
+ --indentDepth;
+ os << ind(indentDepth) << "</layout>" << NEWLINE;
+
+ --indentDepth;
+ os << ind(indentDepth) << "</graph>" << NEWLINE;
+
+ os << "</ogml>";
+}
+
+
+// recursively write the cluster structure in OGML
+void ClusterGraphAttributes::writeClusterOGML(
+ ostream & os,
+ std::ostringstream & osS,
+ int & nextLabelId,
+ cluster clust,
+ int & indentDepth,
+ int indentDepthS)
+{
+ // we handle all cluster except the root cluster
+ if (clust != m_pClusterGraph->rootCluster()) {
+ /* cluster structure infos */
+ os << ind(indentDepth) << "<node id=\"c" << clust->index() << "\">" << NEWLINE;
+
+ /*
+ * TODO What are cluster templates and how can/should they be handled?
+ *
+ const String &templStr = m_clusterTemplate[cluster];
+ if(templStr.length() > 0) {
+ // GDE extension: Write cluster template and custom attribute
+ os << "template ";
+ writeLongString(os, templStr);
+ os << "\n";
+ os << "label ";
+ writeLongString(os, clusterLabel(cluster));
+ os << "\n";
+ } else {
+ */
+
+ ++indentDepth;
+ os << ind(indentDepth) << "<label id=\"l" << nextLabelId++ << "\">" << NEWLINE;
+ os << ind(indentDepth+1) << "<content>" << formatLabel(clusterLabel(clust)) << "</content>" << NEWLINE;
+ os << ind(indentDepth) << "</label>" << NEWLINE;
+ }
+
+ // we handle the contained nodes first
+ ListConstIterator<node> itn;
+ for (itn = clust->nBegin(); itn.valid(); ++itn)
+ {
+ node v = *itn;
+
+ // node structure infos
+ os << ind(indentDepth) << "<node id=\"n" << v->index() << "\">" << NEWLINE;
+
+ // handling of label (if exists)
+ if (attributes() & nodeLabel) {
+ os << ind(indentDepth+1) << "<label id=\"l" << nextLabelId++ << "\">" << NEWLINE;
+ os << ind(indentDepth+2) << "<content>" << formatLabel(labelNode(v)) << "</content>" << NEWLINE;
+ os << ind(indentDepth+1) << "</label>" << NEWLINE;
+ }
+
+ os << ind(indentDepth) << "</node>" << NEWLINE;
+
+ // node layout infos
+ osS << ind(indentDepthS) << "<nodeStyle idRef=\"n" << v->index() << "\">" << NEWLINE;
+ ++indentDepthS;
+ osS << ind(indentDepthS) << "<location x=\"" << x(v)-0.5*width(v) << "\" y=\""<< y(v)-0.5*height(v) << "\"/>" << NEWLINE;
+ osS << ind(indentDepthS) << "<shape type=\"";
+ switch (m_nodeShape[v]) {
+ case rectangle:
+ osS << "rect";
+ break;
+ case oval:
+ osS << "ellipse";
+ break;
+ }
+ osS << "\" width=\"" << m_width[v] << "\" height=\"" << m_height[v] << "\"/>" << NEWLINE;
+ if(attributes() & nodeColor || attributes() & nodeStyle) {
+ // fill-tag
+ osS << ind(indentDepthS) << "<fill";
+ // color-attribute of fill-tag
+ if (attributes() & nodeColor) {
+ if (m_nodeColor[v].length() > 0) {
+ osS << " color=\"" << m_nodeColor[v] << "\"";
+ }
+ }
+ if (attributes() & nodeStyle) {
+ // pattern- and patternColor-attribute of fill-tag (closing)
+ osS << " pattern=\"" << brushPatternToOGML(m_nodePattern[v]) << "\" patternColor=\"#000000\"/>" << NEWLINE;
+ // line-tag
+ osS << ind(indentDepthS) << "<line type=\"" << edgeStyleToOGML(m_nodeStyle[v]) << "\" width=\"" << m_nodeLineWidth[v] << "\" color=\"" << m_nodeLine[v] << "\"/>" << NEWLINE;
+ } else {
+ // closing fill-tag
+ osS << "/>" << NEWLINE;
+ }
+ }
+
+ --indentDepthS;
+ osS << ind(indentDepthS) << "</nodeStyle>" << NEWLINE;
+ }//for clusters
+
+ // now we recursively handle the contained clusters
+ ListConstIterator<cluster> it;
+ for (it = clust->cBegin(); it.valid(); ++it) {
+ writeClusterOGML(os, osS, nextLabelId, *it, indentDepth, indentDepthS);
+ }
+
+ // we handle all clusters except the root cluster
+ if (clust != m_pClusterGraph->rootCluster()) {
+ --indentDepth;
+ os << ind(indentDepth) << "</node>" << NEWLINE;
+
+ // cluster layout infos
+ osS << ind(indentDepthS) << "<nodeStyle idRef=\"c" << clust->index() << "\">" << NEWLINE;
+
+ ++indentDepthS;
+ osS << ind(indentDepthS) << "<location x=\"" << clusterXPos(clust) << "\" y=\"" << clusterYPos(clust) << "\"/>" << NEWLINE;
+ osS << ind(indentDepthS) << "<shape type=\"rect\" width=\"" << clusterWidth(clust) << "\" height=\"" << clusterHeight(clust) << "\"/>" << NEWLINE;
+ if(clusterFillColor(clust).length() > 0) {
+ osS << ind(indentDepthS) << "<fill color=\"" << clusterFillColor(clust) << "\"";
+ osS << " pattern=\"" << brushPatternToOGML(clusterFillPattern(clust)) << "\" patternColor=\"#000000\"/>" << NEWLINE;
+ }
+ osS << ind(indentDepthS) << "<line type=\"" << edgeStyleToOGML(clusterLineStyle(clust)) << "\" width=\"" << clusterLineWidth(clust) << "\" color=\"" << clusterColor(clust) << "\"/>" << NEWLINE;
+ --indentDepthS;
+
+ osS << ind(indentDepthS) << "</nodeStyle>" << NEWLINE;
+ }
+}
+
+
+//++++++++++++++++++++++++++++++++++++++++++++
+//reading graph, attributes, cluster structure
+bool ClusterGraphAttributes::readClusterGML(
+ const char* fileName,
+ ClusterGraph& CG,
+ Graph& G)
+{
+
+ ifstream is(fileName);
+ if (!is)
+ return false; // couldn't open file
+
+ return readClusterGML(is, CG, G);
+}
+
+
+bool ClusterGraphAttributes::readClusterGML(
+ istream& is,
+ ClusterGraph& CG,
+ Graph& G)
+{
+
+ bool result;
+ GmlParser gml(is);
+ if (gml.error())
+ return false;
+
+ result = gml.read(G,*this);
+
+ if (!result) return false;
+
+ return readClusterGraphGML(CG, G, gml);
+}
+
+
+//read Cluster Graph with Attributes, base graph G, from fileName
+bool ClusterGraphAttributes::readClusterGraphGML(
+ const char* fileName,
+ ClusterGraph& CG,
+ Graph& G,
+ GmlParser& gml)
+{
+ ifstream is(fileName);
+ if (!is)
+ return false; // couldn't open file
+
+ return readClusterGraphGML(CG, G, gml);
+}
+
+
+//read from input stream
+bool ClusterGraphAttributes::readClusterGraphGML(
+ ClusterGraph& CG,
+ Graph& G,
+ GmlParser& gml)
+{
+ return gml.readAttributedCluster(G, CG, *this);
+}
+
+
+// read Cluster Graph from OGML file
+bool ClusterGraphAttributes::readClusterGraphOGML(
+ const char* fileName,
+ ClusterGraph& CG,
+ Graph& G)
+{
+ ifstream is(fileName);
+ if (!is)
+ return false;
+
+ OgmlParser op;
+ return op.read(fileName, G, CG, *this);
+};
+
+
+ostream &operator<<(ostream &os, ogdf::cluster c)
+{
+ if (c) os << c->index(); else os << "nil";
+ return os;
+}
+
+
+} // end namespace ogdf
+
diff --git a/ogdf/cluster/ClusterGraphAttributes.h b/ogdf/cluster/ClusterGraphAttributes.h
new file mode 100644
index 0000000..5cfc83e
--- /dev/null
+++ b/ogdf/cluster/ClusterGraphAttributes.h
@@ -0,0 +1,439 @@
+/*
+ * $Revision: 2564 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-07 00:03:48 +0200 (Sa, 07. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declares ClusterGraphAttributes, an extension of class
+ * GraphAttributes, to store clustergraph layout informations
+ * like cluster cage positions and sizes that can be accessed
+ * over the cluster/cluster ID
+ *
+ * \author Karsten Klein
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_CLUSTER_GRAPH_ATTRIBUTES_H
+#define OGDF_CLUSTER_GRAPH_ATTRIBUTES_H
+
+#include "../basic/HashArray.h"
+#include "ClusterArray.h"
+
+#include "ClusterGraph.h"
+#include "../basic/GraphAttributes.h"
+
+
+namespace ogdf {
+
+ class GmlParser;
+
+ /**
+ * \brief Stores information associated with a cluster.
+ *
+ */
+ class OGDF_EXPORT ClusterInfo
+ {
+ public:
+ ClusterInfo()
+ {
+ //&m_fillPattern = GraphAttributes::bpNone; //NoBrush
+ m_lineStyle = GraphAttributes::esSolid;
+ }
+
+ double m_x, m_y; //position of lower left corner
+ double m_w, m_h; //width and height
+
+ double m_lineWidth; //width of rectangle border line
+
+ String m_color; //color of rectangle
+ String m_fillColor; //color of fill area
+ String m_backColor; //background color
+ GraphAttributes::EdgeStyle m_lineStyle; //rectangle line style
+ GraphAttributes::BrushPattern m_fillPattern; //brush pattern of fill area
+ String m_label; //name label
+
+ int m_clusterID; //the ID of the cluster of which the info is stored
+ };
+
+
+ /**
+ * \brief Stores additional attributes of a clustered graph (like layout information).
+ *
+ * Attributes are simply stored in node or edge arrays; for memory consumption
+ * reasons, only a subset of these arrays is in fact initialized for the graph;
+ * non-initialized arrays require only a few bytes of extra memory.
+ *
+ * Which arrays are initialized is specified by a bit vector; each bit in this
+ * bit vector corresponds to one or more attributes. E.g., \a #nodeGraphics
+ * corresponds to the attributes \a #m_x, \a #m_y, \a #m_width, and \a #m_height;
+ * whereas \a #edgeDoubleWeight only corresponds to the attribute \a #m_doubleWeight.
+ *
+ */
+ class OGDF_EXPORT ClusterGraphAttributes : public GraphAttributes
+ {
+ private:
+ ClusterArray<String> m_clusterTemplate; //!< Name of cluster template.
+
+ public:
+ //! Initializes new instance of class ClusterGraphAttributes.
+ ClusterGraphAttributes() : GraphAttributes(), m_pClusterGraph(0) { }
+
+ //! Initializes new instance of class ClusterGraphAttributes.
+ //! Uses \a initAttributes, which are enriched by node and edge
+ //! graphics.
+ ClusterGraphAttributes(ClusterGraph& cg, long initAttributes = 0);
+
+ virtual ~ClusterGraphAttributes() { }
+
+ //! Initializes the instance with ClusterGraph \a cg.
+ //! Sets the attributes to \a initAttributes
+ using GraphAttributes::init;
+ virtual void init(ClusterGraph &cg, long initAttributes = 0);
+
+ //! Initializes the attributes according to \a initAttributes.
+ virtual void initAtt(long initAttributes = 0) {
+ GraphAttributes::initAttributes(initAttributes);
+ }
+
+// operator const ClusterGraph& () const {return *m_pClusterGraph;}
+// operator const Graph& () const {return m_pClusterGraph->getGraph();}
+
+ //! Returns the ClusterGraph.
+ const ClusterGraph& constClusterGraph() const { return *m_pClusterGraph; }
+
+ //! Returns the index of the parent cluster of node \a v.
+ int clusterID(node v) { return m_pClusterGraph->clusterOf(v)->index(); }
+
+ //! Returns the parent cluster of node \a v.
+ cluster clusterOf(node v) { return m_pClusterGraph->clusterOf(v); }
+
+ //! Returns the maximum cluster index used.
+ int maxClusterID() const { return m_pClusterGraph->clusterIdCount()-1; }
+
+ //! Updates positions of cluster boundaries wrt to children and child clusters
+ void updateClusterPositions(double boundaryDist = 1.0);
+
+ //*****************************************************************
+ //data access by ID
+
+ //! Returns x position of the cluster cages lower left corner.
+ double clusterXPos(int clusterID) const { return m_clusterInfo[clusterID].m_x; }
+
+ //! Returns x position of the cluster cages lower left corner.
+ double& clusterXPos(int clusterID) { return m_clusterInfo[clusterID].m_x; }
+
+ //! Returns y position of the cluster cages lower left corner.
+ double clusterYPos(int clusterID) const { return m_clusterInfo[clusterID].m_y; }
+
+ //! Returns y position of the cluster cages lower left corner.
+ double& clusterYPos(int clusterID) { return m_clusterInfo[clusterID].m_y; }
+
+ //! Returns cluster cage height.
+ double clusterHeight(int clusterID) const { return m_clusterInfo[clusterID].m_h; }
+
+ //! Returns cluster cage height.
+ double& clusterHeight(int clusterID) { return m_clusterInfo[clusterID].m_h; }
+
+ //! Returns cluster cage width.
+ double clusterWidth(int clusterID) const { return m_clusterInfo[clusterID].m_w; }
+
+ //! Returns cluster cage width.
+ double& clusterWidth(int clusterID) { return m_clusterInfo[clusterID].m_w; }
+
+ //! Returns cluster line width.
+ double clusterLineWidth(int clusterID) const {
+ return m_clusterInfo[clusterID].m_lineWidth;
+ }
+
+ //! Returns cluster line width.
+ double& clusterLineWidth(int clusterID) {
+ return m_clusterInfo[clusterID].m_lineWidth;
+ }
+
+ //! Returns cluster fill color.
+ const String &clusterFillColor(int clusterID) const {
+ return m_clusterInfo[clusterID].m_fillColor;
+ }
+
+ //! Returns cluster fill color.
+ String& clusterFillColor(int clusterID) {
+ return m_clusterInfo[clusterID].m_fillColor;
+ }
+
+ //! Returns cluster fill pattern.
+ GraphAttributes::BrushPattern clusterFillPattern(int clusterID) const {
+ return m_clusterInfo[clusterID].m_fillPattern;
+ }
+
+ //! Returns cluster fill pattern.
+ GraphAttributes::BrushPattern& clusterFillPattern(int clusterID) {
+ return m_clusterInfo[clusterID].m_fillPattern;
+ }
+
+ //! Returns label of cluster c.
+ const String &clusterLabel(int clusterID) const {
+ return m_clusterInfo[clusterID].m_label;
+ }
+
+ //! Returns label of cluster c.
+ String &clusterLabel(int clusterID) {
+ return m_clusterInfo[clusterID].m_label;
+ }
+
+ //! Returns structure containing information on cluster with ID \a clusterID.
+ const ClusterInfo& clusterInfo(int clusterID) const {
+ return m_clusterInfo[clusterID];
+ }
+
+ //! Returns structure containing information on cluster with ID \a clusterID.
+ ClusterInfo& clusterInfo(int clusterID) { return m_clusterInfo[clusterID]; }
+
+
+ //*****************************************************************
+ //data access by cluster
+
+ //! Returns x position of the cluster cages lower left corner.
+ double clusterXPos(cluster c) const { return m_clusterInfo[c->index()].m_x; }
+
+ //! Returns x position of the cluster cages lower left corner.
+ double& clusterXPos(cluster c) { return m_clusterInfo[c->index()].m_x; }
+
+ //! Returns y position of the cluster cages lower left corner.
+ double clusterYPos(cluster c) const { return m_clusterInfo[c->index()].m_y; }
+
+ //! Returns y position of the cluster cages lower left corner.
+ double& clusterYPos(cluster c) { return m_clusterInfo[c->index()].m_y; }
+
+ //! Returns cluster cage height.
+ double clusterHeight(cluster c) const { return m_clusterInfo[c->index()].m_h; }
+
+ //! Returns cluster cage height.
+ double& clusterHeight(cluster c) { return m_clusterInfo[c->index()].m_h; }
+
+ //! Returns cluster cage width.
+ double clusterWidth(cluster c) const { return m_clusterInfo[c->index()].m_w; }
+
+ //! Returns cluster cage width.
+ double& clusterWidth(cluster c) { return m_clusterInfo[c->index()].m_w; }
+
+ //! Returns label of cluster c.
+ const String &clusterLabel(cluster c) const {
+ return m_clusterInfo[c->index()].m_label;
+ }
+
+ //! Returns label of cluster c.
+ String &clusterLabel(cluster c) {
+ return m_clusterInfo[c->index()].m_label;
+ }
+
+ //! Returns const reference to template of cluster c.
+ const String &templateCluster(cluster c) const { return m_clusterTemplate[c]; }
+
+ //! Returns reference to template of cluster c.
+ String &templateCluster(cluster c) { return m_clusterTemplate[c]; }
+
+ //! Returns const reference to structure containing information on cluster \a c.
+ const ClusterInfo& clusterInfo(cluster c) const { return m_clusterInfo[c->index()]; }
+
+ //! Returns reference to structure containing information on cluster \a c.
+ ClusterInfo& clusterInfo(cluster c) { return m_clusterInfo[c->index()]; }
+
+ //! Returns line color stored for cluster \a c in string format.
+ const String &clusterColor(cluster c) const {
+ return m_clusterInfo[c->index()].m_color;
+ }
+
+ //! Returns line color of cluster \a c in string format.
+ String &clusterColor(cluster c) {
+ return m_clusterInfo[c->index()].m_color;
+ }
+
+ //Returns const reference to fill color of cluster \a c.
+ const String &clusterFillColor(cluster c) const {
+ return m_clusterInfo[c->index()].m_fillColor;
+ }
+
+ //Returns reference to fill color of cluster \a c.
+ String &clusterFillColor(cluster c) {
+ return m_clusterInfo[c->index()].m_fillColor;
+ }
+
+ //Returns const reference to background color of cluster \a c.
+ const String &clusterBackColor(cluster c) const {
+ return m_clusterInfo[c->index()].m_backColor;
+ }
+
+ //Returns reference to background color of cluster \a c.
+ String &clusterBackColor(cluster c) {
+ return m_clusterInfo[c->index()].m_backColor;
+ }
+
+
+ //pen and brush styles
+
+ //! Returns edge style of cluster \a c.
+ const GraphAttributes::EdgeStyle &clusterLineStyle(cluster c) const {
+ return m_clusterInfo[c->index()].m_lineStyle;
+ }
+
+ //! Returns line style of cluster \a c.
+ GraphAttributes::EdgeStyle &clusterLineStyle(cluster c) {
+ return m_clusterInfo[c->index()].m_lineStyle;
+ }
+
+ //! Returns brush pattern of cluster \a c.
+ const GraphAttributes::BrushPattern &clusterFillPattern(cluster c) const {
+ return m_clusterInfo[c->index()].m_fillPattern;
+ }
+
+ //! Returns brush pattern of cluster c.
+ GraphAttributes::BrushPattern &clusterFillPattern(cluster c) {
+ return m_clusterInfo[c->index()].m_fillPattern;
+ }
+
+ //! Returns line width of cluster \a c.
+ const double &clusterLineWidth(cluster c) const {
+ return m_clusterInfo[c->index()].m_lineWidth;
+ }
+
+ //! Returns line width of cluster c.
+ double &clusterLineWidth(cluster c) {
+ return m_clusterInfo[c->index()].m_lineWidth;
+ }
+
+ //! Set fill pattern \a i for cluster \a c.
+ void setClusterFillPattern(cluster c, int i) {
+ m_clusterInfo[c->index()].m_fillPattern = intToPattern(i);
+ }
+
+ //! Set style \a i for cluster \a c.
+ void setClusterLineStyle(cluster c, int i) {
+ m_clusterInfo[c->index()].m_lineStyle = intToStyle(i);
+ }
+
+ //! Returns bounding box.
+ const DRect boundingBox() const;
+
+ //! Writes attributed clustergraph in GML format to file fileName.
+ void writeGML(const char *fileName);
+
+ //! Writes attributed clustergraph in GML format to output stream \a os.
+ void writeGML(ostream& os);
+
+ //we don't have GraphConstraints yet
+ //! Writes attributed clustergraph in OGML format to file fileName
+ void writeOGML(const char * fileName);//, GraphConstraints & GC);
+
+ //! Writes attributed clustergraph in OGML format to output stream \a os.
+ void writeOGML(ostream & os);//, GraphConstraints & GC);
+
+ //! Reads attributed clustergraph in GML format from file fileName.
+ bool readClusterGML(
+ const char* fileName,
+ ClusterGraph& CG,
+ Graph& G);
+
+ //! Reads attributed clustergraph in GML format from input stream \a is.
+ bool readClusterGML(
+ istream& is,
+ ClusterGraph& CG,
+ Graph& G);
+
+ //! Reads clustered graph from OGML-file.
+ bool readClusterGraphOGML(
+ const char* fileName,
+ ClusterGraph& CG,
+ Graph& G);
+
+ protected:
+ const ClusterGraph* m_pClusterGraph;//!< Only points to existing graphs.
+
+ private:
+ //! Information on the cluster positions, index is cluster ID.
+ HashArray<int, ClusterInfo> m_clusterInfo;
+
+ //! Reads Cluster Graph with Attributes, base graph \a G, from \a fileName
+ //! with a given gmlparser \a gml (has objecttree).
+ //! Input stream given by parser.
+ bool readClusterGraphGML(
+ const char* fileName,
+ ClusterGraph& CG,
+ Graph& G,
+ GmlParser& gml);
+
+ //! Reads clustered graph from input stream of GmlParser.
+ bool readClusterGraphGML(
+ ClusterGraph& CG,
+ Graph& G,
+ GmlParser& gml);
+
+ //! Recursively writes the cluster structure in GML format into output stream \a os.
+ void writeCluster(
+ ostream &os,
+ NodeArray<int> &nId,
+ ClusterArray<int> & cId,
+ int &nextId,
+ cluster c,
+ String indent);
+
+ //! Recursively writes the cluster structure in GraphWin GML format.
+ void writeGraphWinCluster(
+ ostream &os,
+ NodeArray<int> &nId,
+ int &nextId,
+ cluster c,
+ String indent);
+
+ //! Recursively writes the cluster structure in OGML.
+ void writeClusterOGML(
+ ostream &os,
+ std::ostringstream & osS, // string stream for styles block
+ int & nextLabelId,
+ cluster cluster,
+ int & indentDepth, // indent depth for structure block
+ int indentDepthS); // indent depth for styles block
+
+ };
+
+
+} // end namespace ogdf
+
+
+#endif
diff --git a/ogdf/cluster/ClusterGraphObserver.h b/ogdf/cluster/ClusterGraphObserver.h
new file mode 100644
index 0000000..8f2a148
--- /dev/null
+++ b/ogdf/cluster/ClusterGraphObserver.h
@@ -0,0 +1,113 @@
+/*
+ * $Revision: 2523 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-02 20:59:27 +0200 (Mon, 02 Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Abstract base class for structures on graphs, that need
+ * to be informed about cluster graph changes.
+ *
+ * Follows the observer pattern: cluster graphs are observable
+ * objects that can inform observers on changes made to their
+ * structure.
+ *
+ * \author Martin Gronemann
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_CLUSTER_GRAPH_OBSERVER_H
+#define OGDF_CLUSTER_GRAPH_OBSERVER_H
+
+
+#include "../basic/List.h"
+#include "ClusterGraph.h"
+
+namespace ogdf {
+
+
+//----------------------------------------------------------
+// GraphObserver
+// abstract base class
+// derived classes have to overload nodeDeleted, nodeAdded
+// edgeDeleted, edgeAdded
+// these functions should be called by Graph before (delete)
+// and after (add) its structure
+//----------------------------------------------------------
+class OGDF_EXPORT ClusterGraphObserver {
+ friend class ClusterGraph;
+
+public:
+ ClusterGraphObserver() : m_pClusterGraph(0) {}
+
+ ClusterGraphObserver(const ClusterGraph* CG) : m_pClusterGraph(CG)
+ {
+ m_itCGList = CG->registerObserver(this);
+ }//constructor
+
+ virtual ~ClusterGraphObserver()
+ {
+ if (m_pClusterGraph) m_pClusterGraph->unregisterObserver(m_itCGList);
+ }//destructor
+
+ // associates structure with different graph
+ void reregister(const ClusterGraph *pCG) {
+ //small speedup: check if == m_pGraph
+ if (m_pClusterGraph) m_pClusterGraph->unregisterObserver(m_itCGList);
+ if ((m_pClusterGraph = pCG) != 0) m_itCGList = pCG->registerObserver(this);
+ }
+
+ virtual void clusterDeleted(cluster v) = 0;
+ virtual void clusterAdded(cluster v) = 0;
+ //virtual void reInit() = 0;
+ //virtual void cleared() = 0;//Graph cleared
+
+ const ClusterGraph* getGraph() const { return m_pClusterGraph;}
+
+protected:
+ const ClusterGraph* m_pClusterGraph; //underlying clustergraph
+
+ //List entry in cluster graphs list of all registered observers
+ ListIterator<ClusterGraphObserver*> m_itCGList;
+};
+
+} // end of namespace
+
+#endif
diff --git a/ogdf/energybased/Edge.h b/ogdf/energybased/Edge.h
new file mode 100644
index 0000000..f4fa845
--- /dev/null
+++ b/ogdf/energybased/Edge.h
@@ -0,0 +1,159 @@
+/*
+ * $Revision: 2559 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-06 15:04:28 +0200 (Fr, 06. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of class Edge.
+ *
+ * \author Stefan Hachul
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_EDGE_H
+#define OGDF_EDGE_H
+
+
+#include "../basic/Graph.h"
+
+
+namespace ogdf {
+
+class Edge
+{
+ //helping data structure for deleting parallel edges in class FMMMLayout and
+ //Multilevel (needed for the bucket sort algorithm)
+
+ //outputstream for Edge
+ friend ostream &operator<< (ostream & output, const Edge & E)
+ {
+ output <<"edge_index " << E.e->index() << " Graph_ptr " << E.Graph_ptr << " angle"
+ << E.angle << " cut vertex " << E.cut_vertex->index();
+ return output;
+ }
+
+ //inputstream for Edge
+ friend istream &operator>> (istream & input, Edge & E)
+ {
+ int c = input.peek();
+ if (c != EOF)
+ input >> E;//.e>>E.Graph_ptr;
+ return input;
+ }
+
+public:
+ //constructor
+ Edge() {
+ e = NULL;
+ Graph_ptr = NULL;
+ angle = 0;
+ cut_vertex = NULL;
+ }
+
+ ~Edge() { } //destructor
+
+ void set_Edge (edge f,Graph* g_ptr) {
+ Graph_ptr = g_ptr;
+ e = f;
+ }
+
+ void set_Edge(edge f,double i,node c) {
+ angle = i;
+ e = f;
+ cut_vertex = c;
+ }
+
+ Graph* get_Graph_ptr() const { return Graph_ptr; }
+ edge get_edge() const { return e; }
+ double get_angle() const { return angle; }
+ node get_cut_vertex() const { return cut_vertex; }
+
+private:
+ edge e;
+ Graph* Graph_ptr;
+ double angle;
+ node cut_vertex;
+};
+
+
+class EdgeMaxBucketFunc : public BucketFunc<Edge>
+{
+public:
+ EdgeMaxBucketFunc() {};
+
+ int getBucket(const Edge& E) { return get_max_index(E); }
+
+private:
+ //returns the maximum index of e
+ int get_max_index(const Edge& E) {
+ int source_index = E.get_edge()->source()->index();
+ int target_index = E.get_edge()->target()->index();
+ OGDF_ASSERT(source_index != target_index);
+ if(source_index < target_index) return target_index;
+ else /*if (source_index > target_index)*/ return source_index;
+ //else cout<<"Error Edge::get_max_index() The Graph has a self loop"<<endl;
+ }
+};
+
+
+class EdgeMinBucketFunc : public BucketFunc<Edge>
+{
+public:
+ EdgeMinBucketFunc() { }
+
+ int getBucket(const Edge& E) { return get_min_index(E); }
+
+private:
+
+ //returns the minimum index of e
+ int get_min_index(const Edge& E)
+ {
+ int source_index = E.get_edge()->source()->index();
+ int target_index = E.get_edge()->target()->index();
+ OGDF_ASSERT(source_index != target_index);
+ if(source_index < target_index) return source_index;
+ else /*if (source_index > target_index)*/ return target_index;
+ //else cout<<"Error Edge::get_min_index() The Graph has a self loop"<<endl;
+ }
+};
+
+}//namespace ogdf
+#endif
+
diff --git a/ogdf/energybased/FMMMLayout.cpp b/ogdf/energybased/FMMMLayout.cpp
new file mode 100644
index 0000000..9819acf
--- /dev/null
+++ b/ogdf/energybased/FMMMLayout.cpp
@@ -0,0 +1,1749 @@
+/*
+ * $Revision: 2565 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-07 17:14:54 +0200 (Sa, 07. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of Fast Multipole Multilevel Method (FM^3).
+ *
+ * \author Stefan Hachul
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+#include "FMMMLayout.h"
+#include "../basic/Math.h"
+#include "numexcept.h"
+#include "MAARPacking.h"
+#include "Multilevel.h"
+#include "Edge.h"
+#include "../basic/simple_graph_alg.h"
+#include "../basic/basic.h"
+
+#include "../internal/energybased/NodeAttributes.h"
+#include "../internal/energybased/EdgeAttributes.h"
+#include "Rectangle.h"
+#include <time.h>
+
+#include <QPointF>
+#include <QLineF>
+
+namespace ogdf {
+
+
+FMMMLayout::FMMMLayout()
+{
+ initialize_all_options();
+}
+
+
+//--------------------------- most important functions --------------------------------
+
+void FMMMLayout::call(GraphAttributes &GA)
+{
+ const Graph &G = GA.constGraph();
+ EdgeArray<double> edgelength(G,1.0);
+ call(GA,edgelength);
+}
+
+void FMMMLayout::call(ClusterGraphAttributes &GA)
+{
+ const Graph &G = GA.constGraph();
+ //compute depth of cluster tree, also sets cluster depth values
+ const ClusterGraph &CG = GA.constClusterGraph();
+ int cdepth = CG.treeDepth();
+ EdgeArray<double> edgeLength(G);
+ //compute lca of end vertices for each edge
+ edge e;
+ forall_edges(e, G)
+ {
+ edgeLength[e] = cdepth - CG.clusterDepth(CG.commonCluster(e->source(),e->target())) + 1;
+ OGDF_ASSERT(edgeLength[e] > 0)
+ }
+ call(GA,edgeLength);
+ GA.updateClusterPositions();
+}
+
+
+void FMMMLayout::call(GraphAttributes &GA, const EdgeArray<double> &edgeLength)
+{
+ const Graph &G = GA.constGraph();
+ NodeArray<NodeAttributes> A(G); //stores the attributes of the nodes (given by L)
+ EdgeArray<EdgeAttributes> E(G); //stores the edge attributes of G
+ Graph G_reduced; //stores a undirected simple and loopfree copy
+ //of G
+ EdgeArray<EdgeAttributes> E_reduced; //stores the edge attributes of G_reduced
+ NodeArray<NodeAttributes> A_reduced; //stores the node attributes of G_reduced
+
+ if(G.numberOfNodes() > 1)
+ {
+ GA.clearAllBends();//all edges are straight-line
+ if(useHighLevelOptions())
+ update_low_level_options_due_to_high_level_options_settings();
+ import_NodeAttributes(G,GA,A);
+ import_EdgeAttributes(G,edgeLength,E);
+
+ double t_total;
+ usedTime(t_total);
+ max_integer_position = pow(2.0,maxIntPosExponent());
+ init_ind_ideal_edgelength(G,A,E);
+ make_simple_loopfree(G,A,E,G_reduced,A_reduced,E_reduced);
+ call_DIVIDE_ET_IMPERA_step(G_reduced,A_reduced,E_reduced);
+ if(allowedPositions() != apAll)
+ make_positions_integer(G_reduced,A_reduced);
+ time_total = usedTime(t_total);
+
+ export_NodeAttributes(G_reduced,A_reduced,GA);
+ }
+ else //trivial cases
+ {
+ if(G.numberOfNodes() == 1 )
+ {
+ node v = G.firstNode();
+ GA.x(v) = 0;
+ GA.y(v) = 0;
+ }
+ }
+}
+
+
+void FMMMLayout::call(GraphAttributes &AG, char* ps_file)
+{
+ call(AG);
+ create_postscript_drawing(AG,ps_file);
+}
+
+
+void FMMMLayout::call(
+ GraphAttributes &AG,
+ const EdgeArray<double> &edgeLength,
+ char* ps_file)
+{
+ call(AG,edgeLength);
+ create_postscript_drawing(AG,ps_file);
+}
+
+
+void FMMMLayout::call_DIVIDE_ET_IMPERA_step(
+ Graph& G,
+ NodeArray<NodeAttributes>& A,
+ EdgeArray<EdgeAttributes>& E)
+{
+ NodeArray<int> component(G); //holds for each node the index of its component
+ number_of_components = connectedComponents(G,component);//calculate components of G
+ Graph* G_sub = new Graph[number_of_components];
+ NodeArray<NodeAttributes>* A_sub = new NodeArray<NodeAttributes>[number_of_components];
+ EdgeArray<EdgeAttributes>* E_sub = new EdgeArray<EdgeAttributes>[number_of_components];
+ create_maximum_connected_subGraphs(G,A,E,G_sub,A_sub,E_sub,component);
+
+ if(number_of_components == 1)
+ call_MULTILEVEL_step_for_subGraph(G_sub[0],A_sub[0],E_sub[0],-1);
+ else
+ for(int i = 0; i < number_of_components;i++)
+ call_MULTILEVEL_step_for_subGraph(G_sub[i],A_sub[i],E_sub[i],i);
+
+ pack_subGraph_drawings (A,G_sub,A_sub);
+ delete_all_subGraphs(G_sub,A_sub,E_sub);
+}
+
+
+void FMMMLayout::call_MULTILEVEL_step_for_subGraph(
+ Graph& G,
+ NodeArray<NodeAttributes>& A,
+ EdgeArray<EdgeAttributes>& E,
+ int /*comp_index*/)
+{
+ Multilevel Mult;
+
+ int max_level = 30;//sufficient for all graphs with upto pow(2,30) nodes!
+ //adapt mingraphsize such that no levels are created beyond input graph.
+ if (m_singleLevel) m_minGraphSize = G.numberOfNodes();
+ Array<Graph*> G_mult_ptr(max_level+1);
+ Array<NodeArray<NodeAttributes>*> A_mult_ptr (max_level+1);
+ Array<EdgeArray<EdgeAttributes>*> E_mult_ptr (max_level+1);
+
+ Mult.create_multilevel_representations(G,A,E,randSeed(),
+ galaxyChoice(),minGraphSize(),
+ randomTries(),G_mult_ptr,A_mult_ptr,
+ E_mult_ptr,max_level);
+
+ for(int i = max_level;i >= 0;i--)
+ {
+ if(i == max_level)
+ create_initial_placement(*G_mult_ptr[i],*A_mult_ptr[i]);
+ else
+ {
+ Mult.find_initial_placement_for_level(i,initialPlacementMult(),G_mult_ptr, A_mult_ptr,E_mult_ptr);
+ update_boxlength_and_cornercoordinate(*G_mult_ptr[i],*A_mult_ptr[i]);
+ }
+ call_FORCE_CALCULATION_step(*G_mult_ptr[i],*A_mult_ptr[i],*E_mult_ptr[i],
+ i,max_level);
+ }
+ Mult.delete_multilevel_representations(G_mult_ptr,A_mult_ptr,E_mult_ptr,max_level);
+}
+
+
+void FMMMLayout::call_FORCE_CALCULATION_step(
+ Graph& G,
+ NodeArray<NodeAttributes>&A,
+ EdgeArray<EdgeAttributes>& E,
+ int act_level,
+ int max_level)
+{
+ const int ITERBOUND = 10000;//needed to guarantee termination if
+ //stopCriterion() == scThreshold
+ if(G.numberOfNodes() > 1)
+ {
+ int iter = 1;
+ int max_mult_iter = get_max_mult_iter(act_level,max_level,G.numberOfNodes());
+ double actforcevectorlength = threshold() + 1;
+
+ NodeArray<DPoint> F_rep(G); //stores rep. forces
+ NodeArray<DPoint> F_attr(G); //stores attr. forces
+ NodeArray<DPoint> F (G); //stores resulting forces
+ NodeArray<DPoint> last_node_movement(G);//stores the force vectors F of the last
+ //iterations (needed to avoid oscillations)
+
+ set_average_ideal_edgelength(G,E);//needed for easy scaling of the forces
+ make_initialisations_for_rep_calc_classes(G);
+
+ while( ((stopCriterion() == scFixedIterations)&&(iter <= max_mult_iter)) ||
+ ((stopCriterion() == scThreshold)&&(actforcevectorlength >= threshold())&&
+ (iter <= ITERBOUND)) ||
+ ((stopCriterion() == scFixedIterationsOrThreshold)&&(iter <= max_mult_iter) &&
+ (actforcevectorlength >= threshold())) )
+ {//while
+ calculate_forces(G,A,E,F,F_attr,F_rep,last_node_movement,iter,0);
+ if(stopCriterion() != scFixedIterations)
+ actforcevectorlength = get_average_forcevector_length(G,F);
+ iter++;
+ }//while
+
+ if(act_level == 0) {
+ fixTwistedSplits(G, A);
+ call_POSTPROCESSING_step(G,A,E,F,F_attr,F_rep,last_node_movement);
+ }
+
+ deallocate_memory_for_rep_calc_classes();
+ }
+}
+
+
+void FMMMLayout::call_POSTPROCESSING_step(
+ Graph& G,
+ NodeArray<NodeAttributes>& A,
+ EdgeArray<EdgeAttributes>& E,
+ NodeArray<DPoint>& F,
+ NodeArray<DPoint>& F_attr,
+ NodeArray<DPoint>& F_rep,
+ NodeArray<DPoint>& last_node_movement)
+{
+ for(int i = 1; i<= 10; i++)
+ calculate_forces(G,A,E,F,F_attr,F_rep,last_node_movement,i,1);
+
+ if((resizeDrawing() == true))
+ {
+ adapt_drawing_to_ideal_average_edgelength(G,A,E);
+ update_boxlength_and_cornercoordinate(G,A);
+ }
+
+ for(int i = 1; i<= fineTuningIterations(); i++)
+ calculate_forces(G,A,E,F,F_attr,F_rep,last_node_movement,i,2);
+
+ if((resizeDrawing() == true))
+ adapt_drawing_to_ideal_average_edgelength(G,A,E);
+}
+
+
+//------------------------- functions for pre/post-processing -------------------------
+
+void FMMMLayout::initialize_all_options()
+{
+ //setting high level options
+ useHighLevelOptions(false); pageFormat(pfSquare); unitEdgeLength(100);
+ newInitialPlacement(false); qualityVersusSpeed(qvsBeautifulAndFast);
+
+ //setting low level options
+ //setting general options
+ randSeed(100);edgeLengthMeasurement(elmBoundingCircle);
+ allowedPositions(apInteger);maxIntPosExponent(40);
+
+ //setting options for the divide et impera step
+ pageRatio(1.0);stepsForRotatingComponents(10);
+ tipOverCCs(toNone);minDistCC(100);
+ presortCCs(psDecreasingArea);
+
+ //setting options for the multilevel step
+ minGraphSize(50);galaxyChoice(gcNonUniformProbLowerMass);randomTries(20);
+ maxIterChange(micLinearlyDecreasing);maxIterFactor(10);
+ initialPlacementMult(ipmAdvanced);
+ m_singleLevel = false;
+
+ //setting options for the force calculation step
+ forceModel(fmNew);springStrength(1);repForcesStrength(1);
+ repulsiveForcesCalculation(rfcNMM);stopCriterion(scFixedIterationsOrThreshold);
+ threshold(0.01);fixedIterations(30);forceScalingFactor(0.05);
+ coolTemperature(false);coolValue(0.99);initialPlacementForces(ipfRandomRandIterNr);
+
+ //setting options for postprocessing
+ resizeDrawing(true);resizingScalar(1);fineTuningIterations(20);
+ fineTuneScalar(0.2);adjustPostRepStrengthDynamically(true);
+ postSpringStrength(2.0);postStrengthOfRepForces(0.01);
+
+ //setting options for different repulsive force calculation methods
+ frGridQuotient(2);
+ nmTreeConstruction(rtcSubtreeBySubtree);nmSmallCell(scfIteratively);
+ nmParticlesInLeaves(25); nmPrecision(4);
+}
+
+
+void FMMMLayout::update_low_level_options_due_to_high_level_options_settings()
+{
+ PageFormatType pf = pageFormat();
+ double uel = unitEdgeLength();
+ bool nip = newInitialPlacement();
+ QualityVsSpeed qvs = qualityVersusSpeed();
+
+ //update
+ initialize_all_options();
+ useHighLevelOptions(true);
+ pageFormat(pf);
+ unitEdgeLength(uel);
+ newInitialPlacement(nip);
+ qualityVersusSpeed(qvs);
+
+ if(pageFormat() == pfSquare)
+ pageRatio(1.0);
+ else if(pageFormat() ==pfLandscape)
+ pageRatio(1.4142);
+ else //pageFormat() == pfPortrait
+ pageRatio(0.7071);
+
+ if(newInitialPlacement())
+ initialPlacementForces(ipfRandomTime);
+ else
+ initialPlacementForces(ipfRandomRandIterNr);
+
+ if(qualityVersusSpeed() == qvsGorgeousAndEfficient)
+ {
+ fixedIterations(60);
+ fineTuningIterations(40);
+ nmPrecision(6);
+ }
+ else if(qualityVersusSpeed() == qvsBeautifulAndFast)
+ {
+ fixedIterations(30);
+ fineTuningIterations(20);
+ nmPrecision(4);
+ }
+ else //qualityVersusSpeed() == qvsNiceAndIncredibleSpeed
+ {
+ fixedIterations(15);
+ fineTuningIterations(10);
+ nmPrecision(2);
+ }
+}
+
+
+void FMMMLayout::import_NodeAttributes(
+ const Graph& G,
+ GraphAttributes& GA,
+ NodeArray<NodeAttributes>& A)
+{
+ node v;
+ DPoint position;
+
+ forall_nodes(v,G)
+ {
+ position.m_x = GA.x(v);
+ position.m_y = GA.y(v);
+ A[v].set_NodeAttributes(GA.width(v),GA.height(v),position,NULL,NULL);
+ }
+}
+
+
+void FMMMLayout::import_EdgeAttributes(
+ const Graph& G,
+ const EdgeArray<double>& edgeLength,
+ EdgeArray<EdgeAttributes>& E)
+{
+ edge e;
+ double length;
+
+ forall_edges(e,G)
+ {
+ if(edgeLength[e] > 0) //no negative edgelength allowed
+ length = edgeLength[e];
+ else
+ length = 1;
+
+ E[e].set_EdgeAttributes(length,NULL,NULL);
+ }
+}
+
+
+void FMMMLayout::init_ind_ideal_edgelength(
+ const Graph& G,
+ NodeArray<NodeAttributes>& A,
+ EdgeArray<EdgeAttributes>& E)
+{
+ edge e;
+
+ if (edgeLengthMeasurement() == elmMidpoint)
+ forall_edges(e,G)
+ E[e].set_length(E[e].get_length() * unitEdgeLength());
+
+ else //(edgeLengthMeasurement() == elmBoundingCircle)
+ {
+ set_radii(G,A);
+ forall_edges(e,G)
+ E[e].set_length(E[e].get_length() * unitEdgeLength() + radius[e->source()]
+ + radius[e->target()]);
+ }
+}
+
+
+void FMMMLayout::set_radii(const Graph& G, NodeArray<NodeAttributes>& A)
+{
+ node v;
+ radius.init(G);
+ double w,h;
+ forall_nodes(v,G)
+ {
+ w = A[v].get_width()/2;
+ h = A[v].get_height()/2;
+ radius[v] = sqrt(w*w+ h*h);
+ }
+}
+
+
+void FMMMLayout::export_NodeAttributes(
+ Graph& G_reduced,
+ NodeArray<NodeAttributes>& A_reduced,
+ GraphAttributes& GA)
+{
+ node v_copy;
+ forall_nodes(v_copy,G_reduced)
+ {
+ GA.x(A_reduced[v_copy].get_original_node()) = A_reduced[v_copy].get_position().m_x;
+ GA.y(A_reduced[v_copy].get_original_node()) = A_reduced[v_copy].get_position().m_y;
+ }
+}
+
+
+void FMMMLayout::make_simple_loopfree(
+ const Graph& G,
+ NodeArray<NodeAttributes>& A,
+ EdgeArray<EdgeAttributes>E,
+ Graph& G_reduced,
+ NodeArray<NodeAttributes>& A_reduced,
+ EdgeArray<EdgeAttributes>& E_reduced)
+{
+ node u_orig,v_orig,v_reduced;
+ edge e_reduced,e_orig;
+
+ //create the reduced Graph G_reduced and save in A/E links to node/edges of G_reduced
+ //create G_reduced as a copy of G without selfloops!
+
+ G_reduced.clear();
+ forall_nodes(v_orig,G)
+ A[v_orig].set_copy_node(G_reduced.newNode());
+ forall_edges(e_orig,G)
+ {
+ u_orig = e_orig->source();
+ v_orig = e_orig->target();
+ if(u_orig != v_orig)
+ E[e_orig].set_copy_edge(G_reduced.newEdge (A[u_orig].get_copy_node(),
+ A[v_orig].get_copy_node()));
+ else
+ E[e_orig].set_copy_edge(NULL);//mark this edge as deleted
+ }
+
+ //remove parallel (and reversed) edges from G_reduced
+ EdgeArray<double> new_edgelength(G_reduced);
+ List<edge> S;
+ S.clear();
+ delete_parallel_edges(G,E,G_reduced,S,new_edgelength);
+
+ //make A_reduced, E_reduced valid for G_reduced
+ A_reduced.init(G_reduced);
+ E_reduced.init(G_reduced);
+
+ //import information for A_reduced, E_reduced and links to the original nodes/edges
+ //of the copy nodes/edges
+ forall_nodes(v_orig,G)
+ {
+ v_reduced = A[v_orig].get_copy_node();
+ A_reduced[v_reduced].set_NodeAttributes(A[v_orig].get_width(), A[v_orig].
+ get_height(),A[v_orig].get_position(),
+ v_orig,NULL);
+ }
+ forall_edges(e_orig,G)
+ {
+ e_reduced = E[e_orig].get_copy_edge();
+ if(e_reduced != NULL)
+ E_reduced[e_reduced].set_EdgeAttributes(E[e_orig].get_length(),e_orig,NULL);
+ }
+
+ //update edgelength of copy edges in G_reduced associated with a set of parallel
+ //edges in G
+ update_edgelength(S,new_edgelength,E_reduced);
+}
+
+
+void FMMMLayout::delete_parallel_edges(
+ const Graph& G,
+ EdgeArray<EdgeAttributes>& E,
+ Graph& G_reduced,
+ List<edge>& S,
+ EdgeArray<double>& new_edgelength)
+{
+ EdgeMaxBucketFunc MaxSort;
+ EdgeMinBucketFunc MinSort;
+ ListIterator<Edge> EdgeIterator;
+ edge e_act = 0, e_save = 0;
+ Edge f_act;
+ List<Edge> sorted_edges;
+ EdgeArray<edge> original_edge (G_reduced); //helping array
+ int save_s_index = 0, save_t_index = 0, act_s_index, act_t_index;
+ int counter = 1;
+ Graph* Graph_ptr = &G_reduced;
+
+ //save the original edges for each edge in G_reduced
+ forall_edges(e_act,G)
+ if(E[e_act].get_copy_edge() != NULL) //e_act is no self_loops
+ original_edge[E[e_act].get_copy_edge()] = e_act;
+
+ forall_edges(e_act,G_reduced)
+ {
+ f_act.set_Edge(e_act,Graph_ptr);
+ sorted_edges.pushBack(f_act);
+ }
+
+ sorted_edges.bucketSort(0,G_reduced.numberOfNodes()-1,MaxSort);
+ sorted_edges.bucketSort(0,G_reduced.numberOfNodes()-1,MinSort);
+
+ //now parallel edges are consecutive in sorted_edges
+ for(EdgeIterator = sorted_edges.begin();EdgeIterator.valid();++EdgeIterator)
+ {//for
+ e_act = (*EdgeIterator).get_edge();
+ act_s_index = e_act->source()->index();
+ act_t_index = e_act->target()->index();
+
+ if(EdgeIterator != sorted_edges.begin())
+ {//if
+ if( (act_s_index == save_s_index && act_t_index == save_t_index) ||
+ (act_s_index == save_t_index && act_t_index == save_s_index) )
+ {
+ if(counter == 1) //first parallel edge
+ {
+ S.pushBack(e_save);
+ new_edgelength[e_save] = E[original_edge[e_save]].get_length() +
+ E[original_edge[e_act]].get_length();
+ }
+ else //more then two parallel edges
+ new_edgelength[e_save] +=E[original_edge[e_act]].get_length();
+
+ E[original_edge[e_act]].set_copy_edge(NULL); //mark copy of edge as deleted
+ G_reduced.delEdge(e_act); //delete copy edge in G_reduced
+ counter++;
+ }
+ else
+ {
+ if (counter > 1)
+ {
+ new_edgelength[e_save]/=counter;
+ counter = 1;
+ }
+ save_s_index = act_s_index;
+ save_t_index = act_t_index;
+ e_save = e_act;
+ }
+ }//if
+ else //first edge
+ {
+ save_s_index = act_s_index;
+ save_t_index = act_t_index;
+ e_save = e_act;
+ }
+ }//for
+
+ //treat special case (last edges were multiple edges)
+ if(counter >1)
+ new_edgelength[e_save]/=counter;
+}
+
+
+void FMMMLayout::update_edgelength(
+ List<edge>& S,
+ EdgeArray<double>& new_edgelength,
+ EdgeArray<EdgeAttributes>& E_reduced)
+{
+ edge e;
+ while (!S.empty())
+ {
+ e = S.popFrontRet();
+ E_reduced[e].set_length(new_edgelength[e]);
+ }
+}
+
+
+//inline double FMMMLayout::get_post_rep_force_strength(int n)
+//{
+// return min(0.2,400.0/double(n));
+//}
+
+
+void FMMMLayout::make_positions_integer(Graph& G, NodeArray<NodeAttributes>& A)
+{
+ node v;
+ double new_x,new_y;
+
+ if(allowedPositions() == apInteger)
+ {//if
+ //calculate value of max_integer_position
+ max_integer_position = 100 * average_ideal_edgelength * G.numberOfNodes() *
+ G.numberOfNodes();
+ }//if
+
+ //restrict positions to lie in [-max_integer_position,max_integer_position]
+ //X [-max_integer_position,max_integer_position]
+ forall_nodes(v,G)
+ if( (A[v].get_x() > max_integer_position) ||
+ (A[v].get_y() > max_integer_position) ||
+ (A[v].get_x() < max_integer_position * (-1.0)) ||
+ (A[v].get_y() < max_integer_position * (-1.0)) )
+ {
+ DPoint cross_point;
+ DPoint nullpoint (0,0);
+ DPoint old_pos (A[v].get_x(),A[v].get_y());
+ DPoint lt ( max_integer_position * (-1.0),max_integer_position);
+ DPoint rt ( max_integer_position,max_integer_position);
+ DPoint lb ( max_integer_position * (-1.0),max_integer_position * (-1.0));
+ DPoint rb ( max_integer_position,max_integer_position * (-1.0));
+ DLine s (nullpoint,old_pos);
+ DLine left_bound (lb,lt);
+ DLine right_bound (rb,rt);
+ DLine top_bound (lt,rt);
+ DLine bottom_bound (lb,rb);
+
+ if(s.intersection(left_bound,cross_point))
+ {
+ A[v].set_x(cross_point.m_x);
+ A[v].set_y(cross_point.m_y);
+ }
+ else if(s.intersection(right_bound,cross_point))
+ {
+ A[v].set_x(cross_point.m_x);
+ A[v].set_y(cross_point.m_y);
+ }
+ else if(s.intersection(top_bound,cross_point))
+ {
+ A[v].set_x(cross_point.m_x);
+ A[v].set_y(cross_point.m_y);
+ }
+ else if(s.intersection(bottom_bound,cross_point))
+ {
+ A[v].set_x(cross_point.m_x);
+ A[v].set_y(cross_point.m_y);
+ }
+ else cout<<"Error FMMMLayout:: make_positions_integer()"<<endl;
+ }
+
+ //make positions integer
+ forall_nodes(v,G)
+ {
+ new_x = floor(A[v].get_x());
+ new_y = floor(A[v].get_y());
+ if(new_x < down_left_corner.m_x)
+ {
+ boxlength += 2;
+ down_left_corner.m_x = down_left_corner.m_x-2;
+ }
+ if(new_y < down_left_corner.m_y)
+ {
+ boxlength += 2;
+ down_left_corner.m_y = down_left_corner.m_y-2;
+ }
+ A[v].set_x(new_x);
+ A[v].set_y(new_y);
+ }
+}
+
+
+void FMMMLayout::create_postscript_drawing(GraphAttributes& AG, char* ps_file)
+{
+ ofstream out_fmmm (ps_file,ios::out);
+ if (!ps_file) cout<<ps_file<<" could not be opened !"<<endl;
+ const Graph& G = AG.constGraph();
+ node v;
+ edge e;
+ double x_min = AG.x(G.firstNode());
+ double x_max = x_min;
+ double y_min = AG.y(G.firstNode());
+ double y_max = y_min;
+ double max_dist;
+ double scale_factor;
+
+ forall_nodes(v,G)
+ {
+ if(AG.x(v) < x_min)
+ x_min = AG.x(v);
+ else if(AG.x(v) > x_max)
+ x_max = AG.x(v);
+ if(AG.y(v) < y_min)
+ y_min = AG.y(v);
+ else if(AG.y(v) > y_max)
+ y_max = AG.y(v);
+ }
+ max_dist = max(x_max -x_min,y_max-y_min);
+ scale_factor = 500.0/max_dist;
+
+ out_fmmm<<"%!PS-Adobe-2.0 "<<endl;
+ out_fmmm<<"%%Pages: 1 "<<endl;
+ out_fmmm<<"% %BoundingBox: "<<x_min<<" "<<x_max<<" "<<y_min<<" "<<y_max<<endl;
+ out_fmmm<<"%%EndComments "<<endl;
+ out_fmmm<<"%%"<<endl;
+ out_fmmm<<"%% Circle"<<endl;
+ out_fmmm<<"/ellipse_dict 4 dict def"<<endl;
+ out_fmmm<<"/ellipse {"<<endl;
+ out_fmmm<<" ellipse_dict"<<endl;
+ out_fmmm<<" begin"<<endl;
+ out_fmmm<<" newpath"<<endl;
+ out_fmmm<<" /yrad exch def /xrad exch def /ypos exch def /xpos exch def"<<endl;
+ out_fmmm<<" matrix currentmatrix"<<endl;
+ out_fmmm<<" xpos ypos translate"<<endl;
+ out_fmmm<<" xrad yrad scale"<<endl;
+ out_fmmm<<" 0 0 1 0 360 arc"<<endl;
+ out_fmmm<<" setmatrix"<<endl;
+ out_fmmm<<" closepath"<<endl;
+ out_fmmm<<" end"<<endl;
+ out_fmmm<<"} def"<<endl;
+ out_fmmm<<"%% Nodes"<<endl;
+ out_fmmm<<"/v { "<<endl;
+ out_fmmm<<" /y exch def"<<endl;
+ out_fmmm<<" /x exch def"<<endl;
+ out_fmmm<<"1.000 1.000 0.894 setrgbcolor"<<endl;
+ out_fmmm<<"x y 10.0 10.0 ellipse fill"<<endl;
+ out_fmmm<<"0.000 0.000 0.000 setrgbcolor"<<endl;
+ out_fmmm<<"x y 10.0 10.0 ellipse stroke"<<endl;
+ out_fmmm<<"} def"<<endl;
+ out_fmmm<<"%% Edges"<<endl;
+ out_fmmm<<"/e { "<<endl;
+ out_fmmm<<" /b exch def"<<endl;
+ out_fmmm<<" /a exch def"<<endl;
+ out_fmmm<<" /y exch def"<<endl;
+ out_fmmm<<" /x exch def"<<endl;
+ out_fmmm<<"x y moveto a b lineto stroke"<<endl;
+ out_fmmm<<"} def"<<endl;
+ out_fmmm<<"%% "<<endl;
+ out_fmmm<<"%% INIT "<<endl;
+ out_fmmm<<"20 200 translate"<<endl;
+ out_fmmm<<scale_factor<<" "<<scale_factor<<" scale "<<endl;
+ out_fmmm<<"1 setlinewidth "<<endl;
+ out_fmmm<<"%%BeginProgram "<<endl;
+ forall_edges(e,G)
+ out_fmmm<<AG.x(e->source())<<" "<<AG.y(e->source())<<" "
+ <<AG.x(e->target())<<" "<<AG.y(e->target())<<" e"<<endl;
+ forall_nodes(v,G)
+ out_fmmm<<AG.x(v)<<" "<<AG.y(v) <<" v"<<endl;
+ out_fmmm<<"%%EndProgram "<<endl;
+ out_fmmm<<"showpage "<<endl;
+ out_fmmm<<"%%EOF "<<endl;
+}
+
+
+//------------------------- functions for divide et impera step -----------------------
+
+void FMMMLayout::create_maximum_connected_subGraphs(
+ Graph& G,
+ NodeArray<NodeAttributes>& A,
+ EdgeArray<EdgeAttributes>&E,
+ Graph G_sub[],
+ NodeArray<NodeAttributes> A_sub[],
+ EdgeArray<EdgeAttributes> E_sub[],
+ NodeArray<int>& component)
+{
+ node u_orig,v_orig,v_sub;
+ edge e_sub,e_orig;
+ int i;
+
+ //create the subgraphs and save links to subgraph nodes/edges in A
+ forall_nodes(v_orig,G)
+ A[v_orig].set_subgraph_node(G_sub[component[v_orig]].newNode());
+ forall_edges(e_orig,G)
+ {
+ u_orig = e_orig->source();
+ v_orig = e_orig->target();
+ E[e_orig].set_subgraph_edge( G_sub[component[u_orig]].newEdge
+ (A[u_orig].get_subgraph_node(),A[v_orig].get_subgraph_node()));
+ }
+
+ //make A_sub,E_sub valid for the subgraphs
+ for(i = 0; i< number_of_components;i++)
+ {
+ A_sub[i].init(G_sub[i]);
+ E_sub[i].init(G_sub[i]);
+ }
+
+ //import information for A_sub,E_sub and links to the original nodes/edges
+ //of the subGraph nodes/edges
+
+ forall_nodes(v_orig,G)
+ {
+ v_sub = A[v_orig].get_subgraph_node();
+ A_sub[component[v_orig]][v_sub].set_NodeAttributes(A[v_orig].get_width(),
+ A[v_orig].get_height(),A[v_orig].get_position(),
+ v_orig,NULL);
+ }
+ forall_edges(e_orig,G)
+ {
+ e_sub = E[e_orig].get_subgraph_edge();
+ v_orig = e_orig->source();
+ E_sub[component[v_orig]][e_sub].set_EdgeAttributes(E[e_orig].get_length(),
+ e_orig,NULL);
+ }
+}
+
+
+void FMMMLayout::pack_subGraph_drawings(
+ NodeArray<NodeAttributes>& A,
+ Graph G_sub[],
+ NodeArray<NodeAttributes> A_sub[])
+{
+ double aspect_ratio_area, bounding_rectangles_area;
+ MAARPacking P;
+ List<Rectangle> R;
+
+ if(stepsForRotatingComponents() == 0) //no rotation
+ calculate_bounding_rectangles_of_components(R,G_sub,A_sub);
+ else
+ rotate_components_and_calculate_bounding_rectangles(R,G_sub,A_sub);
+
+ P.pack_rectangles_using_Best_Fit_strategy(R,pageRatio(),presortCCs(),
+ aspect_ratio_area,bounding_rectangles_area);
+ export_node_positions(A,R,G_sub,A_sub);
+}
+
+
+void FMMMLayout::calculate_bounding_rectangles_of_components(
+ List<Rectangle>& R,
+ Graph G_sub[],
+ NodeArray<NodeAttributes> A_sub[])
+{
+ int i;
+ Rectangle r;
+ R.clear();
+
+ for(i=0;i<number_of_components;i++)
+ {
+ r = calculate_bounding_rectangle(G_sub[i],A_sub[i],i);
+ R.pushBack(r);
+ }
+}
+
+
+Rectangle FMMMLayout::calculate_bounding_rectangle(
+ Graph& G,
+ NodeArray<NodeAttributes>& A,
+ int componenet_index)
+{
+ Rectangle r;
+ node v;
+ double x_min = 0.0, x_max = 0.0, y_min = 0.0, y_max = 0.0;
+ double act_x_min, act_x_max, act_y_min, act_y_max;
+ double max_boundary;//the maximum of half of the width and half of the height of
+ //each node; (needed to be able to tipp rectangles over without
+ //having access to the height and width of each node)
+
+ forall_nodes(v,G)
+ {
+ max_boundary = max(A[v].get_width()/2, A[v].get_height()/2);
+ if(v == G.firstNode())
+ {
+ x_min = A[v].get_x() - max_boundary;
+ x_max = A[v].get_x() + max_boundary;
+ y_min = A[v].get_y() - max_boundary;
+ y_max = A[v].get_y() + max_boundary;
+ }
+ else
+ {
+ act_x_min = A[v].get_x() - max_boundary;
+ act_x_max = A[v].get_x() + max_boundary;
+ act_y_min = A[v].get_y() - max_boundary;
+ act_y_max = A[v].get_y() + max_boundary;
+ if(act_x_min < x_min) x_min = act_x_min;
+ if(act_x_max > x_max) x_max = act_x_max;
+ if(act_y_min < y_min) y_min = act_y_min;
+ if(act_y_max > y_max) y_max = act_y_max;
+ }
+ }
+
+ //add offset
+ x_min -= minDistCC()/2;
+ x_max += minDistCC()/2;
+ y_min -= minDistCC()/2;
+ y_max += minDistCC()/2;
+
+ r.set_rectangle(x_max-x_min,y_max-y_min,x_min,y_min,componenet_index);
+ return r;
+}
+
+
+void FMMMLayout::rotate_components_and_calculate_bounding_rectangles(
+ List<Rectangle>&R,
+ Graph G_sub[],
+ NodeArray<NodeAttributes> A_sub[])
+{
+ int i,j;
+ double sin_j,cos_j;
+ double angle, act_area, best_area;
+ double ratio,new_width,new_height;
+ Array<NodeArray<DPoint> > best_coords(number_of_components);
+ Array<NodeArray<DPoint> > old_coords(number_of_components);
+ node v_sub;
+ Rectangle r_act,r_best;
+ DPoint new_pos,new_dlc;
+
+ R.clear(); //make R empty
+
+ for(i=0;i<number_of_components;i++)
+ {//allcomponents
+
+ //init r_best, best_area and best_(old)coords
+ r_best = calculate_bounding_rectangle(G_sub[i],A_sub[i],i);
+ best_area = r_best.get_width() * r_best.get_height();
+ best_coords[i].init(G_sub[i]);
+ old_coords[i].init(G_sub[i]);
+
+ forall_nodes(v_sub,G_sub[i])
+ old_coords[i][v_sub] = best_coords[i][v_sub] = A_sub[i][v_sub].get_position();
+
+ //rotate the components
+ double pi_4 = Math::pi_2 / 2.0;
+ for(j=0;j<=stepsForRotatingComponents();j++)
+ {
+ //calculate new positions for the nodes, the new rectangle and area
+ angle = Math::pi_2 * (double(j)/double(stepsForRotatingComponents()+1)) - pi_4;
+ sin_j = sin(angle);
+ cos_j = cos(angle);
+ forall_nodes(v_sub,G_sub[i])
+ {
+ new_pos.m_x = cos_j * old_coords[i][v_sub].m_x
+ - sin_j * old_coords[i][v_sub].m_y;
+ new_pos.m_y = sin_j * old_coords[i][v_sub].m_x
+ + cos_j * old_coords[i][v_sub].m_y;
+ A_sub[i][v_sub].set_position(new_pos);
+ }
+
+ r_act = calculate_bounding_rectangle(G_sub[i],A_sub[i],i);
+ act_area = r_act.get_width() * r_act.get_height();
+
+ //store placement of the nodes with minimal area
+ if(act_area < best_area)
+ {
+ r_best = r_act;
+ best_area = act_area;
+ forall_nodes(v_sub,G_sub[i])
+ best_coords[i][v_sub] = A_sub[i][v_sub].get_position();
+ }
+ }
+
+ // If a component is taller than it is wide, rotate it 90 degrees.
+ ratio = r_best.get_width()/r_best.get_height();
+ if(ratio < 1)
+ {
+ forall_nodes(v_sub,G_sub[i])
+ {
+ new_pos.m_x = best_coords[i][v_sub].m_y*(-1);
+ new_pos.m_y = best_coords[i][v_sub].m_x;
+ best_coords[i][v_sub] = new_pos;
+ }
+
+ //calculate new rectangle
+ new_dlc.m_x = r_best.get_old_dlc_position().m_y*(-1)-r_best.get_height();
+ new_dlc.m_y = r_best.get_old_dlc_position().m_x;
+ new_width = r_best.get_height();
+ new_height = r_best.get_width();
+ r_best.set_width(new_width);
+ r_best.set_height(new_height);
+ r_best.set_old_dlc_position(new_dlc);
+ }
+
+ //save the computed information in A_sub and R
+ forall_nodes(v_sub,G_sub[i])
+ A_sub[i][v_sub].set_position(best_coords[i][v_sub]);
+ R.pushBack(r_best);
+
+ }//allcomponents
+}
+
+
+void FMMMLayout::export_node_positions(
+ NodeArray<NodeAttributes>& A,
+ List<Rectangle>& R,
+ Graph G_sub[],
+ NodeArray<NodeAttributes> A_sub[])
+{
+ ListIterator<Rectangle> RectIterator;
+ Rectangle r;
+ int i;
+ node v_sub;
+ DPoint newpos,tipped_pos,tipped_dlc;
+
+ for(RectIterator = R.begin();RectIterator.valid();++RectIterator)
+ {//for
+ r = *RectIterator;
+ i = r.get_component_index();
+ if(r.is_tipped_over())
+ {//if
+ //calculate tipped coordinates of the nodes
+ forall_nodes(v_sub,G_sub[i])
+ {
+ tipped_pos.m_x = A_sub[i][v_sub].get_y()*(-1);
+ tipped_pos.m_y = A_sub[i][v_sub].get_x();
+ A_sub[i][v_sub].set_position(tipped_pos);
+ }
+ }//if
+
+ forall_nodes(v_sub,G_sub[i])
+ {
+ newpos = A_sub[i][v_sub].get_position() + r.get_new_dlc_position()
+ - r.get_old_dlc_position();
+ A[A_sub[i][v_sub].get_original_node()].set_position(newpos);
+ }
+ }//for
+}
+
+
+//----------------------- functions for multilevel step -----------------------------
+
+inline int FMMMLayout::get_max_mult_iter(int act_level, int max_level, int node_nr)
+{
+ int iter;
+ if(maxIterChange() == micConstant) //nothing to do
+ iter = fixedIterations();
+ else if (maxIterChange() == micLinearlyDecreasing) //linearly decreasing values
+ {
+ if(max_level == 0)
+ iter = fixedIterations() + ((maxIterFactor()-1) * fixedIterations());
+ else
+ iter = fixedIterations() + int((double(act_level)/double(max_level) ) *
+ ((maxIterFactor()-1)) * fixedIterations());
+ }
+ else //maxIterChange == micRapidlyDecreasing (rapidly decreasing values)
+ {
+ if(act_level == max_level)
+ iter = fixedIterations() + int( (maxIterFactor()-1) * fixedIterations());
+ else if(act_level == max_level - 1)
+ iter = fixedIterations() + int(0.5 * (maxIterFactor()-1) * fixedIterations());
+ else if(act_level == max_level - 2)
+ iter = fixedIterations() + int(0.25 * (maxIterFactor()-1) * fixedIterations());
+ else //act_level >= max_level - 3
+ iter = fixedIterations();
+ }
+
+ //helps to get good drawings for small graphs and graphs with few multilevels
+ if((node_nr <= 500) && (iter < 100))
+ return 100;
+ else
+ return iter;
+}
+
+
+//-------------------------- functions for force calculation ---------------------------
+
+inline void FMMMLayout::calculate_forces(
+ Graph& G,
+ NodeArray<NodeAttributes>& A,
+ EdgeArray<EdgeAttributes>& E,
+ NodeArray<DPoint>& F,
+ NodeArray<DPoint>& F_attr,
+ NodeArray<DPoint>& F_rep,
+ NodeArray<DPoint>& last_node_movement,
+ int iter,
+ int fine_tuning_step)
+{
+ if(allowedPositions() != apAll)
+ make_positions_integer(G,A);
+ calculate_attractive_forces(G,A,E,F_attr);
+ calculate_repulsive_forces(G,A,F_rep);
+ add_attr_rep_forces(G,F_attr,F_rep,F,iter,fine_tuning_step);
+ prevent_oscilations(G,F,last_node_movement,iter);
+ move_nodes(G,A,F);
+ update_boxlength_and_cornercoordinate(G,A);
+}
+
+
+void FMMMLayout::init_boxlength_and_cornercoordinate (
+ Graph& G,
+ NodeArray<NodeAttributes>& A)
+{
+ //boxlength is set
+
+ const double MIN_NODE_SIZE = 10;
+ const double BOX_SCALING_FACTOR = 1.1;
+ double w=0,h=0; //helping variables
+
+ node v;
+ forall_nodes(v,G)
+ {
+ w += max(A[v].get_width(),MIN_NODE_SIZE);
+ h += max(A[v].get_height(),MIN_NODE_SIZE);
+ }
+
+ boxlength = ceil(max(w,h) * BOX_SCALING_FACTOR);
+
+ //down left corner of comp. box is the origin
+ down_left_corner.m_x = 0;
+ down_left_corner.m_y = 0;
+}
+
+
+void FMMMLayout::create_initial_placement (Graph& G, NodeArray<NodeAttributes>& A)
+{
+ const int BILLION = 1000000000;
+ int i,j,k;
+ node v;
+
+ if (initialPlacementForces() == ipfKeepPositions) // don't change anything
+ {
+ init_boxlength_and_cornercoordinate(G,A);
+ }
+ else if (initialPlacementForces() == ipfUniformGrid) //set nodes to the midpoints of a grid
+ {//(uniform on a grid)
+ init_boxlength_and_cornercoordinate(G,A);
+ int level = static_cast<int>( ceil(Math::log4(G.numberOfNodes())));
+ int m = static_cast<int>(pow(2.0,level))-1;
+ bool finished = false;
+ double blall = boxlength/(m+1); //boxlength for boxes at the lowest level (depth)
+ Array<node> all_nodes(G.numberOfNodes());
+
+ k = 0;
+ forall_nodes(v,G)
+ {
+ all_nodes[k] = v;
+ k++;
+ }
+ v = all_nodes[0];
+ k = 0;
+ i = 0;
+ while ((!finished) && (i <= m))
+ {//while1
+ j = 0;
+ while((!finished) && (j <= m))
+ {//while2
+ A[v].set_x(boxlength*i/(m+1) + blall/2);
+ A[v].set_y(boxlength*j/(m+1) + blall/2);
+ if(k == G.numberOfNodes()-1)
+ finished = true;
+ else
+ {
+ k++;
+ v = all_nodes[k];
+ }
+ j++;
+ }//while2
+ i++;
+ }//while1
+ }//(uniform on a grid)
+ else //randomised distribution of the nodes;
+ {//(random)
+ init_boxlength_and_cornercoordinate(G,A);
+ if(initialPlacementForces() == ipfRandomTime)//(RANDOM based on actual CPU-time)
+ srand((unsigned int)time(0));
+ else if(initialPlacementForces() == ipfRandomRandIterNr)//(RANDOM based on seed)
+ srand(clock());
+
+ forall_nodes(v,G)
+ {
+ DPoint rndp;
+ rndp.m_x = double(randomNumber(0,BILLION))/BILLION;//rand_x in [0,1]
+ rndp.m_y = double(randomNumber(0,BILLION))/BILLION;//rand_y in [0,1]
+ A[v].set_x(rndp.m_x*(boxlength-2)+ 1);
+ A[v].set_y(rndp.m_y*(boxlength-2)+ 1);
+ }
+ }//(random)
+ update_boxlength_and_cornercoordinate(G,A);
+}
+
+
+inline void FMMMLayout::init_F(Graph& G, NodeArray<DPoint>& F)
+{
+ DPoint nullpoint (0,0);
+ node v;
+ forall_nodes(v,G)
+ F[v] = nullpoint;
+}
+
+
+inline void FMMMLayout::make_initialisations_for_rep_calc_classes(Graph& G)
+{
+ if(repulsiveForcesCalculation() == rfcExact)
+ FR.make_initialisations(boxlength,down_left_corner,frGridQuotient());
+ else if(repulsiveForcesCalculation() == rfcGridApproximation)
+ FR.make_initialisations(boxlength,down_left_corner,frGridQuotient());
+ else //(repulsiveForcesCalculation() == rfcNMM
+ NM.make_initialisations(G,boxlength,down_left_corner,
+ nmParticlesInLeaves(),nmPrecision(),
+ nmTreeConstruction(),nmSmallCell());
+}
+
+
+void FMMMLayout::calculate_attractive_forces(
+ Graph& G,
+ NodeArray<NodeAttributes> & A,
+ EdgeArray<EdgeAttributes> & E,
+ NodeArray<DPoint>& F_attr)
+{
+ numexcept N;
+ edge e;
+ node u,v;
+ double norm_v_minus_u,scalar;
+ DPoint vector_v_minus_u,f_u;
+ DPoint nullpoint (0,0);
+
+ //initialisation
+ init_F(G,F_attr);
+
+ //calculation
+ forall_edges (e,G)
+ {//for
+ u = e->source();
+ v = e->target();
+ vector_v_minus_u = A[v].get_position() - A[u].get_position();
+ norm_v_minus_u = vector_v_minus_u.norm();
+ if(vector_v_minus_u == nullpoint)
+ f_u = nullpoint;
+ else if(!N.f_near_machine_precision(norm_v_minus_u,f_u))
+ {
+ scalar = f_attr_scalar(norm_v_minus_u,E[e].get_length())/norm_v_minus_u;
+ f_u.m_x = scalar * vector_v_minus_u.m_x;
+ f_u.m_y = scalar * vector_v_minus_u.m_y;
+ }
+
+ F_attr[v] = F_attr[v] - f_u;
+ F_attr[u] = F_attr[u] + f_u;
+ }//for
+}
+
+
+double FMMMLayout::f_attr_scalar(double d, double ind_ideal_edge_length)
+{
+ double s;
+
+ if(forceModel() == fmFruchtermanReingold)
+ s = d*d/(ind_ideal_edge_length*ind_ideal_edge_length*ind_ideal_edge_length);
+ else if (forceModel() == fmEades)
+ {
+ double c = 10;
+ if (d == 0)
+ s = -1e10;
+ else
+ s = c * Math::log2(d/ind_ideal_edge_length) /(ind_ideal_edge_length);
+ }
+ else if (forceModel() == fmNew)
+ {
+ double c = Math::log2(d/ind_ideal_edge_length);
+ if (d > 0)
+ s = c * d * d /
+ (ind_ideal_edge_length * ind_ideal_edge_length * ind_ideal_edge_length);
+ else
+ s = -1e10;
+ }
+ else
+ {
+ s = -1e10;
+ cout << " Error FMMMLayout:: f_attr_scalar" << endl;
+ }
+
+ return s;
+}
+
+
+void FMMMLayout::add_attr_rep_forces(
+ Graph& G,
+ NodeArray<DPoint>& F_attr,
+ NodeArray<DPoint>& F_rep,
+ NodeArray<DPoint>& F,
+ int iter,
+ int fine_tuning_step)
+{
+ numexcept N;
+ node v;
+ DPoint f,force;
+ DPoint nullpoint (0,0);
+ double norm_f,scalar;
+ double act_spring_strength,act_rep_force_strength;
+
+ //set cool_factor
+ if(coolTemperature() == false)
+ cool_factor = 1.0;
+ else if((coolTemperature() == true) && (fine_tuning_step == 0))
+ {
+ if(iter == 1)
+ cool_factor = coolValue();
+ else
+ cool_factor *= coolValue();
+ }
+
+ if(fine_tuning_step == 1)
+ cool_factor /= 10.0; //decrease the temperature rapidly
+ else if (fine_tuning_step == 2)
+ {
+ if(iter <= fineTuningIterations() -5)
+ cool_factor = fineTuneScalar(); //decrease the temperature rapidly
+ else
+ cool_factor = (fineTuneScalar()/10.0);
+ }
+
+ //set the values for the spring strength and strength of the rep. force field
+ if(fine_tuning_step <= 1)//usual case
+ {
+ act_spring_strength = springStrength();
+ act_rep_force_strength = repForcesStrength();
+ }
+ else if(!adjustPostRepStrengthDynamically())
+ {
+ act_spring_strength = postSpringStrength();
+ act_rep_force_strength = postStrengthOfRepForces();
+ }
+ else //adjustPostRepStrengthDynamically())
+ {
+ act_spring_strength = postSpringStrength();
+ act_rep_force_strength = get_post_rep_force_strength(G.numberOfNodes());
+ }
+
+ forall_nodes(v,G)
+ {
+ f.m_x = act_spring_strength * F_attr[v].m_x + act_rep_force_strength * F_rep[v].m_x;
+ f.m_y = act_spring_strength * F_attr[v].m_y + act_rep_force_strength * F_rep[v].m_y;
+ f.m_x = average_ideal_edgelength * average_ideal_edgelength * f.m_x;
+ f.m_y = average_ideal_edgelength * average_ideal_edgelength * f.m_y;
+
+ norm_f = f.norm();
+ if(f == nullpoint)
+ force = nullpoint;
+ else if(N.f_near_machine_precision(norm_f,force))
+ restrict_force_to_comp_box(force);
+ else
+ {
+ scalar = min (norm_f * cool_factor * forceScalingFactor(),
+ max_radius(iter))/norm_f;
+ force.m_x = scalar * f.m_x;
+ force.m_y = scalar * f.m_y;
+ }
+ F[v] = force;
+ }
+}
+
+
+void FMMMLayout::move_nodes(
+ Graph& G,
+ NodeArray<NodeAttributes>& A,
+ NodeArray<DPoint>& F)
+{
+ node v;
+
+ forall_nodes(v,G)
+ A[v].set_position(A[v].get_position() + F[v]);
+}
+
+
+void FMMMLayout::update_boxlength_and_cornercoordinate(
+ Graph& G,
+ NodeArray<NodeAttributes>&A)
+{
+ node v;
+ double xmin,xmax,ymin,ymax;
+ DPoint midpoint;
+
+
+ v = G.firstNode();
+ midpoint = A[v].get_position();
+ xmin = xmax = midpoint.m_x;
+ ymin = ymax = midpoint.m_y;
+
+ forall_nodes(v,G)
+ {
+ midpoint = A[v].get_position();
+ if (midpoint.m_x < xmin )
+ xmin = midpoint.m_x;
+ if (midpoint.m_x > xmax )
+ xmax = midpoint.m_x;
+ if (midpoint.m_y < ymin )
+ ymin = midpoint.m_y;
+ if (midpoint.m_y > ymax )
+ ymax = midpoint.m_y;
+ }
+
+ //set down_left_corner and boxlength
+
+ down_left_corner.m_x = floor(xmin - 1);
+ down_left_corner.m_y = floor(ymin - 1);
+ boxlength = ceil(max(ymax-ymin, xmax-xmin) *1.01 + 2);
+
+ //exception handling: all nodes have same x and y coordinate
+ if(boxlength <= 2 )
+ {
+ boxlength = G.numberOfNodes()* 20;
+ down_left_corner.m_x = floor(xmin) - (boxlength/2);
+ down_left_corner.m_y = floor(ymin) - (boxlength/2);
+ }
+
+ //export the boxlength and down_left_corner values to the rep. calc. classes
+
+ if(repulsiveForcesCalculation() == rfcExact ||
+ repulsiveForcesCalculation() == rfcGridApproximation)
+ FR.update_boxlength_and_cornercoordinate(boxlength,down_left_corner);
+ else //repulsiveForcesCalculation() == rfcNMM
+ NM.update_boxlength_and_cornercoordinate(boxlength,down_left_corner);
+}
+
+
+void FMMMLayout::set_average_ideal_edgelength(
+ Graph& G,
+ EdgeArray<EdgeAttributes>& E)
+{
+ double averagelength = 0;
+ edge e;
+
+ if(G.numberOfEdges() > 0)
+ {
+ forall_edges(e,G)
+ averagelength += E[e].get_length();
+ average_ideal_edgelength = averagelength/G.numberOfEdges();
+ }
+ else
+ average_ideal_edgelength = 50;
+}
+
+
+double FMMMLayout::get_average_forcevector_length (Graph& G, NodeArray<DPoint>& F)
+{
+ double lengthsum = 0;
+ node v;
+ forall_nodes(v,G)
+ lengthsum += F[v].norm();
+ lengthsum /=G.numberOfNodes();
+ return lengthsum;
+}
+
+
+void FMMMLayout::prevent_oscilations(
+ Graph& G,
+ NodeArray<DPoint>& F,
+ NodeArray<DPoint>& last_node_movement,
+ int iter)
+{
+
+ const double pi_times_1_over_6 = 0.52359878;
+ const double pi_times_2_over_6 = 2 * pi_times_1_over_6;
+ const double pi_times_3_over_6 = 3 * pi_times_1_over_6;
+ const double pi_times_4_over_6 = 4 * pi_times_1_over_6;
+ const double pi_times_5_over_6 = 5 * pi_times_1_over_6;
+ const double pi_times_7_over_6 = 7 * pi_times_1_over_6;
+ const double pi_times_8_over_6 = 8 * pi_times_1_over_6;
+ const double pi_times_9_over_6 = 9 * pi_times_1_over_6;
+ const double pi_times_10_over_6 = 10 * pi_times_1_over_6;
+ const double pi_times_11_over_6 = 11 * pi_times_1_over_6;
+
+ DPoint nullpoint (0,0);
+ double fi; //angle in [0,2pi) measured counterclockwise
+ double norm_old,norm_new,quot_old_new;
+
+ if (iter > 1) //usual case
+ {//if1
+ node v;
+ forall_nodes(v,G)
+ {
+ DPoint force_new (F[v].m_x,F[v].m_y);
+ DPoint force_old (last_node_movement[v].m_x,last_node_movement[v].m_y);
+ norm_new = F[v].norm();
+ norm_old = last_node_movement[v].norm();
+ if ((norm_new > 0) && (norm_old > 0))
+ {//if2
+ quot_old_new = norm_old / norm_new;
+
+ //prevent oszilations
+ fi = angle(nullpoint,force_old,force_new);
+ if(((fi <= pi_times_1_over_6)||(fi >= pi_times_11_over_6))&&
+ ((norm_new > (norm_old*2.0))) )
+ {
+ F[v].m_x = quot_old_new * 2.0 * F[v].m_x;
+ F[v].m_y = quot_old_new * 2.0 * F[v].m_y;
+ }
+ else if ((fi >= pi_times_1_over_6)&&(fi <= pi_times_2_over_6)&&
+ (norm_new > (norm_old*1.5) ) )
+ {
+ F[v].m_x = quot_old_new * 1.5 * F[v].m_x;
+ F[v].m_y = quot_old_new * 1.5 * F[v].m_y;
+ }
+ else if ((fi >= pi_times_2_over_6)&&(fi <= pi_times_3_over_6)&&
+ (norm_new > (norm_old)) )
+ {
+ F[v].m_x = quot_old_new * F[v].m_x;
+ F[v].m_y = quot_old_new * F[v].m_y;
+ }
+ else if ((fi >= pi_times_3_over_6)&&(fi <= pi_times_4_over_6)&&
+ (norm_new > (norm_old*0.66666666)) )
+ {
+ F[v].m_x = quot_old_new * 0.66666666 * F[v].m_x;
+ F[v].m_y = quot_old_new * 0.66666666 * F[v].m_y;
+ }
+ else if ((fi >= pi_times_4_over_6)&&(fi <= pi_times_5_over_6)&&
+ (norm_new > (norm_old*0.5)) )
+ {
+ F[v].m_x = quot_old_new * 0.5 * F[v].m_x;
+ F[v].m_y = quot_old_new * 0.5 * F[v].m_y;
+ }
+ else if ((fi >= pi_times_5_over_6)&&(fi <= pi_times_7_over_6)&&
+ (norm_new > (norm_old*0.33333333)) )
+ {
+ F[v].m_x = quot_old_new * 0.33333333 * F[v].m_x;
+ F[v].m_y = quot_old_new * 0.33333333 * F[v].m_y;
+ }
+ else if ((fi >= pi_times_7_over_6)&&(fi <= pi_times_8_over_6)&&
+ (norm_new > (norm_old*0.5)) )
+ {
+ F[v].m_x = quot_old_new * 0.5 * F[v].m_x;
+ F[v].m_y = quot_old_new * 0.5 * F[v].m_y;
+ }
+ else if ((fi >= pi_times_8_over_6)&&(fi <= pi_times_9_over_6)&&
+ (norm_new > (norm_old*0.66666666)) )
+ {
+ F[v].m_x = quot_old_new * 0.66666666 * F[v].m_x;
+ F[v].m_y = quot_old_new * 0.66666666 * F[v].m_y;
+ }
+ else if ((fi >= pi_times_9_over_6)&&(fi <= pi_times_10_over_6)&&
+ (norm_new > (norm_old)) )
+ {
+ F[v].m_x = quot_old_new * F[v].m_x;
+ F[v].m_y = quot_old_new * F[v].m_y;
+ }
+ else if ((fi >= pi_times_10_over_6)&&(fi <= pi_times_11_over_6)&&
+ (norm_new > (norm_old*1.5) ) )
+ {
+ F[v].m_x = quot_old_new * 1.5 * F[v].m_x;
+ F[v].m_y = quot_old_new * 1.5 * F[v].m_y;
+ }
+ }//if2
+ last_node_movement[v]= F[v];
+ }
+ }//if1
+ else if (iter == 1)
+ init_last_node_movement(G,F,last_node_movement);
+}
+
+
+double FMMMLayout::angle(DPoint& P, DPoint& Q, DPoint& R)
+{
+ double dx1 = Q.m_x - P.m_x;
+ double dy1 = Q.m_y - P.m_y;
+ double dx2 = R.m_x - P.m_x;
+ double dy2 = R.m_y - P.m_y;
+ double fi;//the angle
+
+ if ((dx1 == 0 && dy1 == 0) || (dx2 == 0 && dy2 == 0))
+ cout<<"Multilevel::angle()"<<endl;
+
+ double norm = (dx1*dx1+dy1*dy1)*(dx2*dx2+dy2*dy2);
+ double cosfi = (dx1*dx2+dy1*dy2) / sqrt(norm);
+
+ if (cosfi >= 1.0 ) fi = 0;
+ if (cosfi <= -1.0 ) fi = Math::pi;
+ else
+ {
+ fi = acos(cosfi);
+ if (dx1*dy2 < dy1*dx2) fi = -fi;
+ if (fi < 0) fi += 2*Math::pi;
+ }
+ return fi;
+}
+
+
+void FMMMLayout::init_last_node_movement(
+ Graph& G,
+ NodeArray<DPoint>& F,
+ NodeArray<DPoint>& last_node_movement)
+{
+ node v;
+ forall_nodes(v,G)
+ last_node_movement[v]= F[v];
+}
+
+
+void FMMMLayout::adapt_drawing_to_ideal_average_edgelength(
+ Graph& G,
+ NodeArray<NodeAttributes>& A,
+ EdgeArray<EdgeAttributes>& E)
+{
+ edge e;
+ node v;
+ double sum_real_edgelength = 0;
+ double sum_ideal_edgelength = 0;
+ double area_scaling_factor;
+ DPoint new_pos;
+
+ forall_edges(e,G)
+ {
+ sum_ideal_edgelength += E[e].get_length();
+ sum_real_edgelength += (A[e->source()].get_position() - A[e->target()].get_position()).norm();
+ }
+
+ if(sum_real_edgelength == 0) //very very unlike case
+ area_scaling_factor = 1;
+ else
+ area_scaling_factor = sum_ideal_edgelength/sum_real_edgelength;
+
+ forall_nodes(v,G)
+ {
+ new_pos.m_x = resizingScalar() * area_scaling_factor * A[v].get_position().m_x;
+ new_pos.m_y = resizingScalar() * area_scaling_factor * A[v].get_position().m_y;
+ A[v].set_position(new_pos);
+ }
+}
+
+
+
+void FMMMLayout::fixTwistedSplits(Graph &G, NodeArray<NodeAttributes>& A) {
+ node v;
+ forall_nodes(v, G) {
+
+ // In order to be a simple two-way split, this node must lead to three others, two of which merge back
+ // together in the same number of steps.
+ std::vector<node> adjacentNodes = getAdjacentNodes(v);
+ if (adjacentNodes.size() == 3) {
+ node direction1Finish;
+ std::vector<node> direction1Path;
+ int direction1Steps;
+ followNodesUntilBranch(v, adjacentNodes[0], &direction1Finish, &direction1Path, &direction1Steps);
+ node direction2Finish;
+ std::vector<node> direction2Path;
+ int direction2Steps;
+ followNodesUntilBranch(v, adjacentNodes[1], &direction2Finish, &direction2Path, &direction2Steps);
+ node direction3Finish;
+ std::vector<node> direction3Path;
+ int direction3Steps;
+ followNodesUntilBranch(v, adjacentNodes[2], &direction3Finish, &direction3Path, &direction3Steps);
+
+ std::vector<node> * path1 = 0;
+ std::vector<node> * path2 = 0;
+ if (direction1Finish == direction2Finish && direction1Steps == direction2Steps && direction1Finish != direction3Finish) {
+ path1 = &direction1Path;
+ path2 = &direction1Path;
+ }
+ else if (direction1Finish == direction3Finish && direction1Steps == direction3Steps && direction1Finish != direction2Finish) {
+ path1 = &direction1Path;
+ path2 = &direction3Path;
+ }
+ else if (direction2Finish == direction3Finish && direction2Steps == direction3Steps && direction2Finish != direction1Finish) {
+ path1 = &direction2Path;
+ path2 = &direction3Path;
+ }
+ if (path1 != 0 && path2 != 0 && path1->size() > 1 && path2->size() > 1) {
+ // If we got here, that means we've found a simple split! path1 and path2 store the nodes in order, so
+ // we check if any of them cross, and if so, we swap their positions to uncross them.
+ for (size_t i = 0; i < path1->size() - 1; ++i) {
+ node path1Node1 = (*path1)[i];
+ node path1Node2 = (*path1)[i+1];
+ node path2Node1 = (*path2)[i];
+ node path2Node2 = (*path2)[i+1];
+
+ DPoint path1Node1Position = A[path1Node1].get_position();
+ DPoint path1Node2Position = A[path1Node2].get_position();
+ DPoint path2Node1Position = A[path2Node1].get_position();
+ DPoint path2Node2Position = A[path2Node2].get_position();
+
+ QPointF path1Node1Point(path1Node1Position.m_x, path1Node1Position.m_y);
+ QPointF path1Node2Point(path1Node2Position.m_x, path1Node2Position.m_y);
+ QPointF path2Node1Point(path2Node1Position.m_x, path2Node1Position.m_y);
+ QPointF path2Node2Point(path2Node2Position.m_x, path2Node2Position.m_y);
+
+ QLineF line1(path1Node1Point, path1Node2Point);
+ QLineF line2(path2Node1Point, path2Node2Point);
+ QPointF intersectionPoint;
+ if (line1.intersect(line2, &intersectionPoint) == QLineF::BoundedIntersection) {
+ A[path1Node2].set_position(path2Node2Position);
+ A[path2Node2].set_position(path1Node2Position);
+ }
+ }
+ }
+ }
+ }
+}
+
+
+std::vector<node> FMMMLayout::getAdjacentNodes(node v) {
+ std::vector<node> adjacentNodes;
+ ogdf::edge e;
+ forall_adj_edges(e, v) {
+ if (e->source() != v)
+ adjacentNodes.push_back(e->source());
+ if (e->target() != v)
+ adjacentNodes.push_back(e->target());
+ }
+ return adjacentNodes;
+}
+
+
+std::vector<node> FMMMLayout::getAdjacentNodesExcluding(node v, node ex) {
+ std::vector<node> adjacentNodes;
+ ogdf::edge e;
+ forall_adj_edges(e, v) {
+ if (e->source() != v && e->source() != ex)
+ adjacentNodes.push_back(e->source());
+ if (e->target() != v && e->source() != ex)
+ adjacentNodes.push_back(e->target());
+ }
+ return adjacentNodes;
+}
+
+void FMMMLayout::followNodesUntilBranch(node start, node first,
+ node * finish, std::vector<node> * path, int * steps) {
+ node prev = start;
+ node current = first;
+ *steps = 0;
+ while (true) {
+ std::vector<node> adjacentNodes = getAdjacentNodesExcluding(current, prev);
+ if (adjacentNodes.size() != 1)
+ break;
+ prev = current;
+ current = adjacentNodes[0];
+ *steps += 1;
+ path->push_back(prev);
+ }
+ *finish = current;
+}
+
+
+} //end namespace ogdf
diff --git a/ogdf/energybased/FMMMLayout.h b/ogdf/energybased/FMMMLayout.h
new file mode 100644
index 0000000..33acc38
--- /dev/null
+++ b/ogdf/energybased/FMMMLayout.h
@@ -0,0 +1,1382 @@
+/*
+ * $Revision: 2583 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-12 01:02:21 +0200 (Do, 12. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of Fast Multipole Multilevel Method (FM^3).
+ *
+ * \author Stefan Hachul
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_FMMMLAYOUT_H
+#define OGDF_FMMMLAYOUT_H
+
+#include "../ogdf/basic/Graph.h"
+#include "../ogdf/cluster/ClusterGraphAttributes.h"
+#include "../ogdf/module/LayoutModule.h"
+#include "../ogdf/basic/geometry.h"
+#include "../ogdf/internal/energybased/FruchtermanReingold.h"
+#include "../ogdf/internal/energybased/NMM.h"
+
+
+namespace ogdf {
+
+ class Rectangle;
+
+/**
+ * \brief The fast multipole multilevel layout algorithm.
+ *
+ * The class FMMMLayout implements a force-directed graph drawing
+ * method suited also for very large graphs. It is based on a
+ * combination of an efficient multilevel scheme and a strategy for
+ * approximating the repulsive forces in the system by rapidly
+ * evaluating potential fields.
+ *
+ * The implementation is based on the following publication:
+ *
+ * Stefan Hachul, Michael J�nger: <i>Drawing Large Graphs with a
+ * Potential-Field-Based Multilevel Algorithm</i>. 12th International
+ * Symposium on %Graph Drawing 1998, New York (GD '04), LNCS 3383,
+ * pp. 285-295, 2004.
+ *
+ * <H3>Optional parameters</H3>
+ * The following options are the most important. You can set
+ * useHighLevelOptions to true and just need to adjust a few parameters.
+ * However, you can also adjust all parameters that the implementation
+ * uses (see below), but this requires good knowledge of the algorithm.
+ *
+ * <table>
+ * <tr>
+ * <th><i>Option</i><th><i>Type</i><th><i>Default</i><th><i>Description</i>
+ * </tr><tr>
+ * <td><i>useHighLevelOptions</i><td>bool<td>false
+ * <td>Whether high-level options are used or not.
+ * </tr><tr>
+ * <td><i>pageFormat</i><td> #PageFormatType <td> #pfSquare
+ * <td>The desired aspect ratio of the layout.
+ * </tr><tr>
+ * <td><i>unitEdgeLength</i><td>double<td>100.0
+ * <td>The unit edge length.
+ * </tr><tr>
+ * <td><i>newInitialPlacement</i><td>bool<td>false
+ * <td>Specifies if initial placement of nodes is varied.
+ * </tr><tr>
+ * <td><i>qualityVersusSpeed</i><td> #QualityVsSpeed <td> #qvsBeautifulAndFast
+ * <td>Indicates if the algorithm is tuned either for best quality or best speed.
+ * </tr>
+ * </table>
+ *
+ * If you want to do more detailed fine-tuning, you can adjust all parameters
+ * used by the algorithm. Please refer to the paper cited above for better
+ * understanding of the algorithm.
+ *
+ * <table>
+ * <tr>
+ * <th colspan="4" align="center"><b>General</b>
+ * </tr><tr>
+ * <td><i>randSeed</i><td>int<td>100
+ * <td>The seed of the random number generator.
+ * </tr><tr>
+ * <td><i>edgeLengthMeasurement</i><td> #EdgeLengthMeasurement <td> #elmBoundingCircle
+ * <td>Indicates how the length of an edge is measured.
+ * </tr><tr>
+ * <td><i>allowedPositions</i><td> #AllowedPositions <td> #apInteger
+ * <td>Defines which positions for a node are allowed.
+ * </tr><tr>
+ * <td><i>maxIntPosExponent</i><td>int<td>40
+ * <td>Defines the exponent used if allowedPositions == apExponent.
+ * </tr><tr>
+ * <th colspan="4" align="center"><b>Divide et impera step</b>
+ * </tr><tr>
+ * <td><i>pageRatio</i><td>double<td>1.0
+ * <td>The desired page ratio.
+ * </tr><tr>
+ * <td><i>stepsForRotatingComponents</i><td>int<td>10
+ * <td>The number of rotations per connected component.
+ * </tr><tr>
+ * <td><i>tipOverCCs</i><td> #TipOver <td> #toNoGrowingRow
+ * <td>Specifies when it is allowed to tip over drawings.
+ * </tr><tr>
+ * <td><i>minDistCC</i><td>double<td>100
+ * <td>The minimal distance between connected components.
+ * </tr><tr>
+ * <td><i>presortCCs</i><td> #PreSort <td> #psDecreasingHeight
+ * <td>Defines if the connected components are sorted before
+ * the packing algorithm is applied.
+ * </tr><tr>
+ * <th colspan="4" align="center"><b>Multilevel step</b>
+ * </tr><tr>
+ * <td><i>minGraphSize</i><td>int<td>50
+ * <td>Determines the number of nodes of a graph for which
+ * no more collapsing of galaxies is performed.
+ * </tr><tr>
+ * <td><i>galaxyChoice</i><td> #GalaxyChoice <td> #gcNonUniformProbLowerMass
+ * <td>Defines how sun nodes of galaxies are selected.
+ * </tr><tr>
+ * <td><i>randomTries</i><td>int<td>20
+ * <td>Defines the number of tries to get a random node with
+ * minimal star mass.
+ * </tr><tr>
+ * <td><i>maxIterChange</i><td> #MaxIterChange <td> #micLinearlyDecreasing
+ * <td>Defines how MaxIterations is changed in subsequent multilevels.
+ * </tr><tr>
+ * <td><i>maxIterFactor</i><td>int<td>10
+ * <td>Defines the factor used for decreasing MaxIterations.
+ * </tr><tr>
+ * <td><i>initialPlacementMult</i><td> #InitialPlacementMult <td> #ipmAdvanced
+ * <td>Defines how the initial placement is generated.
+ * </tr><tr>
+ * <th colspan="4" align="center"><b>Force calculation step</b>
+ * </tr><tr>
+ * <td><i>forceModel</i><td> #ForceModel <td> #fmNew
+ * <td>The used force model.
+ * </tr><tr>
+ * <td><i>springStrength</i><td>double<td>1.0
+ * <td>The strength of the springs.
+ * </tr><tr>
+ * <td><i>repForcesStrength</i><td>double<td>1.0
+ * <td>The strength of the repulsive forces.
+ * </tr><tr>
+ * <td><i>repulsiveForcesCalculation</i><td> #RepulsiveForcesMethod <td> #rfcNMM
+ * <td>Defines how to calculate repulsive forces.
+ * </tr><tr>
+ * <td><i>stopCriterion</i><td> #StopCriterion <td> #scFixedIterationsOrThreshold
+ * <td>The stop criterion.
+ * </tr><tr>
+ * <td><i>threshold</i><td>double<td>0.01
+ * <td>The threshold for the stop criterion.
+ * </tr><tr>
+ * <td><i>fixedIterations</i><td>int<td>30
+ * <td>The fixed number of iterations for the stop criterion.
+ * </tr><tr>
+ * <td><i>forceScalingFactor</i><td>double<td>0.05
+ * <td>The scaling factor for the forces.
+ * </tr><tr>
+ * <td><i>coolTemperature</i><td>bool<td>false
+ * <td>Use coolValue for scaling forces.
+ * </tr><tr>
+ * <td><i>coolValue</i><td>double<td>0.99
+ * <td>The value by which forces are decreased.
+ * </tr><tr>
+ * <td><i>initialPlacementForces</i><td> #InitialPlacementForces <td> #ipfRandomRandIterNr
+ * <td>Defines how the initial placement is done.
+ * </tr><tr>
+ * <th colspan="4" align="center"><b>Force calculation step</b>
+ * </tr><tr>
+ * <td><i>resizeDrawing</i><td>bool<td>true
+ * <td>Specifies if the resulting drawing is resized.
+ * </tr><tr>
+ * <td><i>resizingScalar</i><td>double<td>1
+ * <td>Defines a parameter to scale the drawing if resizeDrawing is true.
+ * </tr><tr>
+ * <td><i>fineTuningIterations</i><td>int<td>20
+ * <td>The number of iterations for fine tuning.
+ * </tr><tr>
+ * <td><i>fineTuneScalar</i><td>double<td>0.2
+ * <td>Defines a parameter for scaling the forces in the fine-tuning iterations.
+ * </tr><tr>
+ * <td><i>adjustPostRepStrengthDynamically</i><td>bool<td>true
+ * <td>If set to true, the strength of the repulsive force field is calculated.
+ * </tr><tr>
+ * <td><i>postSpringStrength</i><td>double<td>2.0
+ * <td>The strength of the springs in the postprocessing step.
+ * </tr><tr>
+ * <td><i>postStrengthOfRepForces</i><td>double<td>0.01
+ * <td>The strength of the repulsive forces in the postprocessing step.
+ * </tr><tr>
+ * <th colspan="4" align="center"><b>Repulsive force approximation methods</b>
+ * </tr><tr>
+ * <td><i>frGridQuotient</i><td>int<td>2
+ * <td>The grid quotient.
+ * </tr><tr>
+ * <td><i>nmTreeConstruction</i><td> #ReducedTreeConstruction <td> #rtcSubtreeBySubtree
+ * <td>Defines how the reduced bucket quadtree is constructed.
+ * </tr><tr>
+ * <td><i>nmSmallCell</i><td> #SmallestCellFinding <td> #scfIteratively
+ * <td>Defines how the smallest quadratic cell that surrounds
+ * the particles of a node in the reduced bucket quadtree is calculated.
+ * </tr><tr>
+ * <td><i>nmParticlesInLeaves</i><td>int<td>25
+ * <td>The maximal number of particles that are contained in
+ * a leaf of the reduced bucket quadtree.
+ * </tr><tr>
+ * <td><i>nmPrecision</i><td>int<td>4
+ * <td>The precision \a p for the <i>p</i>-term multipole expansions.
+ * </tr>
+ * </table>
+ *
+ * <H3>Running time</H3>
+ * The running time of the algorithm is
+ * O(<i>n</i> log <i>n</i> + <i>m</i>) for graphs with \a n nodes
+ * and \a m edges. The required space is linear in the input size.
+ */
+class OGDF_EXPORT FMMMLayout : public LayoutModule
+{
+public:
+ //! Possible page formats.
+ enum PageFormatType {
+ pfPortrait, //!< A4 portrait page.
+ pfLandscape, //!< A4 landscape page.
+ pfSquare //!< Square format.
+ };
+
+ //! Trade-off between run-time and quality.
+ enum QualityVsSpeed {
+ qvsGorgeousAndEfficient, //!< Best quality.
+ qvsBeautifulAndFast, //!< Medium quality and speed.
+ qvsNiceAndIncredibleSpeed //!< Best speed.
+ };
+
+ //! Specifies how the length of an edge is measured.
+ enum EdgeLengthMeasurement {
+ elmMidpoint, //!< Measure from center point of edge end points.
+ elmBoundingCircle //!< Measure from border of circle s surrounding edge end points.
+ };
+
+ //! Specifies which positions for a node are allowed.
+ enum AllowedPositions {
+ apAll,
+ apInteger,
+ apExponent
+ };
+
+ //! Specifies in which case it is allowed to tip over drawings of connected components.
+ enum TipOver {
+ toNone,
+ toNoGrowingRow,
+ toAlways
+ };
+
+ //! Specifies how connected components are sorted before the packing algorithm is applied.
+ enum PreSort {
+ psNone, //!< Do not presort.
+ psDecreasingHeight, //!< Presort by decreasing height of components.
+ psDecreasingWidth, //!< Presort by decreasing width of components.
+ psDecreasingArea //!< Presort by decreasing area of components.
+ };
+
+ //! Specifies how sun nodes of galaxies are selected.
+ enum GalaxyChoice {
+ gcUniformProb,
+ gcNonUniformProbLowerMass,
+ gcNonUniformProbHigherMass
+ };
+
+ //! Specifies how MaxIterations is changed in subsequent multilevels.
+ enum MaxIterChange {
+ micConstant,
+ micLinearlyDecreasing,
+ micRapidlyDecreasing
+ };
+
+ //! Specifies how the initial placement is generated.
+ enum InitialPlacementMult {
+ ipmSimple,
+ ipmAdvanced
+ };
+
+ //! Specifies the force model.
+ enum ForceModel {
+ fmFruchtermanReingold, //!< The force-model by Fruchterman, Reingold.
+ fmEades, //!< The force-model by Eades.
+ fmNew //!< The new force-model.
+ };
+
+ //! Specifies how to calculate repulsive forces.
+ enum RepulsiveForcesMethod {
+ rfcExact, //!< Exact calculation.
+ rfcGridApproximation, //!< Grid approximation.
+ rfcNMM //!< Calculation as for new multipole method.
+ };
+
+ //! Specifies the stop criterion.
+ enum StopCriterion {
+ scFixedIterations, //!< Stop if fixedIterations() is reached.
+ scThreshold, //!< Stop if threshold() is reached.
+ scFixedIterationsOrThreshold //!< Stop if fixedIterations() or threshold() is reached.
+ };
+
+ //! Specifies how the initial placement is done.
+ enum InitialPlacementForces {
+ ipfUniformGrid, //!< Uniform placement on a grid.
+ ipfRandomTime, //!< Random placement (based on current time).
+ ipfRandomRandIterNr, //!< Random placement (based on randIterNr()).
+ ipfKeepPositions //!< No change in placement.
+ };
+
+ //! Specifies how the reduced bucket quadtree is constructed.
+ enum ReducedTreeConstruction {
+ rtcPathByPath, //!< Path-by-path construction.
+ rtcSubtreeBySubtree //!< Subtree-by-subtree construction.
+ };
+
+ //! Specifies how to calculate the smallest quadratic cell surrounding particles of a node in the reduced bucket quadtree.
+ enum SmallestCellFinding {
+ scfIteratively, //!< Iteratively (in constant time).
+ scfAluru //!< According to formula by Aluru et al. (in constant time).
+ };
+
+
+ //! Creates an instance of the layout algorithm.
+ FMMMLayout();
+
+ // destructor
+ virtual ~FMMMLayout() { }
+
+
+ /**
+ * @name The algorithm call
+ * @{
+ */
+
+ //! Calls the algorithm for graph \a GA and returns the layout information in \a AG.
+ void call(GraphAttributes &GA);
+
+ //! Calls the algorithm for clustered graph \a GA and returns the layout information in \a AG.
+ //! Models cluster by simple edge length adaption based on least common ancestor
+ //! cluster of end vertices.
+ using LayoutModule::call;
+ void call(ClusterGraphAttributes &GA);
+
+ //! Extended algorithm call: Allows to pass desired lengths of the edges.
+ /**
+ * @param GA represents the input graph and is assigned the computed layout.
+ * @param edgeLength is an edge array of the graph associated with \a GA
+ * of positive edge length.
+ */
+ void call(
+ GraphAttributes &GA, //graph and layout
+ const EdgeArray<double> &edgeLength); //factor for desired edge lengths
+
+ //! Extended algorithm call: Calls the algorithm for graph \a AG.
+ /**
+ * Returns layout information in \a AG and a simple drawing is saved in file \a ps_file
+ * in postscript format (Nodes are drawn as uniformly sized circles).
+ */
+ void call(GraphAttributes &AG, char* ps_file);
+
+ //! Extend algorithm call: Allows to pass desired lengths of the edges.
+ /**
+ * The EdgeArray \a edgeLength must be valid for AG.constGraph() and its values must
+ * be positive.
+ * A simple drawing is saved in file ps_file in postscript format (Nodes are drawn
+ * as uniformly sized circles).
+ */
+ void call(
+ GraphAttributes &AG, //graph and layout
+ const EdgeArray<double> &edgeLength, //factor for desired edge lengths
+ char* ps_file);
+
+ /** @}
+ * @name Further information.
+ * @{
+ */
+
+ //! Returns the runtime (=CPU-time) of the layout algorithm in seconds.
+ double getCpuTime() {
+ return time_total;
+ }
+
+
+ /** @}
+ * @name High-level options
+ * Allow to specify the most relevant parameters.
+ * @{
+ */
+
+ //! Returns the current setting of option useHighLevelOptions.
+ /**
+ * If set to true, the high-level options are used to set all low-level options.
+ * Usually, it is sufficient just to set high-level options; if you want to
+ * be more specific, set this parameter to false and set the low level options.
+ */
+ bool useHighLevelOptions() const { return m_useHighLevelOptions; }
+
+ //! Sets the option useHighLevelOptions to \a uho.
+ void useHighLevelOptions(bool uho) { m_useHighLevelOptions = uho; }
+
+ //! Sets single level option, no multilevel hierarchy is created if b == true
+ void setSingleLevel(bool b) {m_singleLevel = b;}
+
+ //! Returns the current setting of option pageFormat.
+ /**
+ * This option defines the desired aspect ratio of the drawing area.
+ * - \a pfPortrait: A4 page in portrait orientation
+ * - \a pfLandscape: A4 page in landscape orientation
+ * - \a pfSquare: square page format
+ */
+ PageFormatType pageFormat() const { return m_pageFormat; }
+
+ //! Sets the option pageRatio to \a t.
+ void pageFormat(PageFormatType t) { m_pageFormat = t; }
+
+ //! Returns the current setting of option unitEdgeLength.
+ double unitEdgeLength() const { return m_unitEdgeLength; }
+
+ //! Sets the option unitEdgeLength to \a x.
+ void unitEdgeLength(double x) {m_unitEdgeLength = (( x > 0.0) ? x : 1);}
+
+ //! Returns the current setting of option newInitialPlacement.
+ /**
+ * This option defines if the initial placement of the nodes at the
+ * coarsest multilevel is varied for each distinct call of FMMMLayout
+ * or keeps always the same.
+ */
+ bool newInitialPlacement() const { return m_newInitialPlacement; }
+
+ //! Sets the option newInitialPlacement to \a nip.
+ void newInitialPlacement(bool nip) { m_newInitialPlacement = nip; }
+
+ //! Returns the current setting of option qualityVersusSpeed.
+ /**
+ * Indicates if the algorithm is tuned either for best quality or best speed.
+ * - \a qvsGorgeousAndEfficient: gorgeous quality and efficient speed
+ * - \a qvsBeautifulAndFast: beautiful quality and fast speed
+ * - \a qvsNiceAndIncredibleSpeed: nice quality and incredible speed
+ */
+ QualityVsSpeed qualityVersusSpeed() const { return m_qualityVersusSpeed; }
+
+ //! Sets the option qualityVersusSpeed to \a qvs.
+ void qualityVersusSpeed(QualityVsSpeed qvs) {m_qualityVersusSpeed = qvs; }
+
+
+ /** @}
+ * @name General low-level options
+ * The low-level options in this and the following sections are meant for
+ * experts or interested people only.
+ * @{
+ */
+
+ //! Sets the seed of the random number generator.
+ void randSeed(int p) { m_randSeed = ((0<=p) ? p : 1);}
+
+ //! Returns the seed of the random number generator.
+ int randSeed() const {return m_randSeed;}
+
+ //! Returns the current setting of option edgeLengthMeasurement.
+ /**
+ * This option indicates how the length of an edge is measured.
+ * Possible values:
+ * - \a elmMidpoint: from center to center
+ * - \a elmBoundingCircle: the distance between the two tight circles bounding the
+ * graphics of two adjacent nodes
+ */
+ EdgeLengthMeasurement edgeLengthMeasurement() const {
+ return m_edgeLengthMeasurement;
+ }
+
+ //! Sets the option edgeLengthMeasurement to \a elm.
+ void edgeLengthMeasurement(EdgeLengthMeasurement elm) { m_edgeLengthMeasurement = elm; }
+
+ //! Returns the current setting of option allowedPositions.
+ /**
+ * This option defines which positions for a node are allowed.
+ * Possibly values:
+ * - \a apAll: every position is allowed
+ * - \a apInteger: only integer positions in the range depending on the number of
+ * nodes
+ * - \a apExponent: only integer positions in the range of -2^MaxIntPosExponent to
+ * 2^MaxIntPosExponent
+ */
+ AllowedPositions allowedPositions() const { return m_allowedPositions; }
+
+ //! Sets the option allowedPositions to \a ap.
+ void allowedPositions(AllowedPositions ap) { m_allowedPositions = ap; }
+
+ //! Returns the current setting of option maxIntPosExponent.
+ /**
+ * This option defines the exponent used if allowedPositions() == \a apExponent.
+ */
+ int maxIntPosExponent() const { return m_maxIntPosExponent; }
+
+ //! Sets the option maxIntPosExponent to \a e.
+ void maxIntPosExponent(int e) {
+ m_maxIntPosExponent = (((e >= 31)&&(e<=51))? e : 31);
+ }
+
+
+ /** @}
+ * @name Options for the divide et impera step
+ * @{
+ */
+
+ //! Returns the current setting of option pageRatio.
+ /**
+ * This option defines the desired aspect ratio of the rectangular drawing area.
+ */
+ double pageRatio() const { return m_pageRatio; }
+
+ //! Sets the option pageRatio to \a r.
+ void pageRatio(double r) {m_pageRatio = (( r > 0) ? r : 1);}
+
+ //! Returns the current setting of option stepsForRotatingComponents.
+ /**
+ * This options determines the number of times each connected component is rotated with
+ * angles between 0 and 90 degree to obtain a bounding rectangle with small area.
+ */
+ int stepsForRotatingComponents() const { return m_stepsForRotatingComponents; }
+
+ //! Sets the option stepsForRotatingComponents to \a n.
+ void stepsForRotatingComponents(int n) {
+ m_stepsForRotatingComponents = ((0<=n) ? n : 0);
+ }
+
+ //! Returns the current setting of option tipOverCCs.
+ /**
+ * Defines in which case it is allowed to tip over drawings of connected components.
+ * Possible values:
+ * - \a toNone: not allowed at all
+ * - \a toNoGrowingRow: only if the height of the packing row does not grow
+ * - \a toAlways: always allowed
+ */
+ TipOver tipOverCCs() const { return m_tipOverCCs; }
+
+ //! Sets the option tipOverCCs to \a to.
+ void tipOverCCs(TipOver to) { m_tipOverCCs = to; }
+
+ //! Returns the minimal distance between connected components.
+ double minDistCC() const { return m_minDistCC; }
+
+ //! Sets the minimal distance between connected components to \a x.
+ void minDistCC(double x) { m_minDistCC = (( x > 0) ? x : 1);}
+
+ //! Returns the current setting of option presortCCs.
+ /**
+ * This option defines if the connected components are sorted before
+ * the packing algorithm is applied.
+ * Possible values:
+ * - \a psNone: no sorting
+ * - \a psDecreasingHeight: sorted by decreasing height
+ * - \a psDecreasingWidth: sorted by decreasing width
+ * - \a psDecreasingArea: sorted by decreasing area
+ */
+ PreSort presortCCs() const { return m_presortCCs; }
+
+ //! Sets the option presortCCs to \a ps.
+ void presortCCs(PreSort ps) { m_presortCCs = ps; }
+
+
+ /** @}
+ * @name Options for the multilevel step
+ * @{
+ */
+
+ //! Returns the current setting of option minGraphSize.
+ /**
+ * This option determines the number of nodes of a graph in the
+ * multilevel representation for which no more collapsing of galaxies
+ * is performed (i.e. the graph at the highest level).
+ */
+ int minGraphSize() const { return m_minGraphSize; }
+
+ //! Sets the option minGraphSize to \a n.
+ void minGraphSize(int n) { m_minGraphSize = ((n >= 2)? n : 2);}
+
+ //! Returns the current setting of option galaxyChoice.
+ /**
+ * This option defines how sun nodes of galaxies are selected.
+ * Possible values:
+ * - \a gcUniformProb: selecting by uniform random probability
+ * - \a gcNonUniformProbLowerMass: selecting by non-uniform probability depending on
+ * the star masses (prefering nodes with lower star mass)
+ * - \a gcNonUniformProbHigherMass: as above but prefering nodes with higher star mass
+ */
+ GalaxyChoice galaxyChoice() const { return m_galaxyChoice; }
+
+ //! Sets the option galaxyChoice to \a gc.
+ void galaxyChoice(GalaxyChoice gc) { m_galaxyChoice = gc; }
+
+ //! Returns the current setting of option randomTries.
+ /**
+ * This option defines the number of tries to get a random node with
+ * minimal star mass (used in case of galaxyChoice() == gcNonUniformProbLowerMass
+ * and galaxyChoice() == gcNonUniformProbHigherMass).
+ */
+ int randomTries() const { return m_randomTries; }
+
+ //! Sets the option randomTries to \a n.
+ void randomTries(int n) {m_randomTries = ((n>=1)? n: 1);}
+
+ //! Returns the current setting of option maxIterChange.
+ /**
+ * This option defines how MaxIterations is changed in subsequent multilevels.
+ * Possible values:
+ * - \a micConstant: kept constant at the force calculation step at every level
+ * - \a micLinearlyDecreasing: linearly decreasing from MaxIterFactor*FixedIterations
+ * to FixedIterations
+ * - \a micRapidlyDecreasing: rapdily decreasing from MaxIterFactor*FixedIterations
+ * to FixedIterations
+ */
+ MaxIterChange maxIterChange() const { return m_maxIterChange; }
+
+ //! Sets the option maxIterChange to \a mic.
+ void maxIterChange(MaxIterChange mic) { m_maxIterChange = mic; }
+
+ //! Returns the current setting of option maxIterFactor.
+ /**
+ * This option defines the factor used for decrasing MaxIterations
+ * (in case of maxIterChange() == micLinearlyDecreasing or maxIterChange()
+ * == micRapidlyDecreasing).
+ */
+ int maxIterFactor() const { return m_maxIterFactor; }
+
+ //! Sets the option maxIterFactor to \a f.
+ void maxIterFactor(int f) { m_maxIterFactor = ((f>=1) ? f : 1 ); }
+
+ //! Returns the current setting of option initialPlacementMult.
+ /**
+ * This option defines how the initial placement is generated.
+ * Possible values:
+ * - \a ipmSimple: only using information about placement of nodes on higher levels
+ * - \a ipmAdvanced: using additional information about the placement of all inter
+ * - \a solar system nodes
+ */
+ InitialPlacementMult initialPlacementMult() const {
+ return m_initialPlacementMult;
+ }
+
+ //! Sets the option initialPlacementMult to \a ipm.
+ void initialPlacementMult(InitialPlacementMult ipm) {
+ m_initialPlacementMult = ipm;
+ }
+
+
+ /** @}
+ * @name Options for the force calculation step
+ * @{
+ */
+
+ //! Returns the used force model.
+ /**
+ * Possibly values:
+ * - \a fmFruchtermanReingold: model of Fruchterman and Reingold
+ * - \a fmEades: model of Eades
+ * - \a fmNew: new model
+ */
+ ForceModel forceModel() const { return m_forceModel; }
+
+ //! Sets the used force model to \a fm.
+ void forceModel(ForceModel fm) { m_forceModel = fm; }
+
+ //! Returns the strength of the springs.
+ double springStrength() const { return m_springStrength; }
+
+ //! Sets the strength of the springs to \a x.
+ void springStrength(double x) { m_springStrength = ((x > 0)? x : 1);}
+
+ //! Returns the strength of the repulsive forces.
+ double repForcesStrength() const { return m_repForcesStrength; }
+
+ //! Sets the strength of the repulsive forces to \a x.
+ void repForcesStrength(double x) { m_repForcesStrength =((x > 0)? x : 1);}
+
+ //! Returns the current setting of option repulsiveForcesCalculation.
+ /**
+ * This option defines how to calculate repulsive forces.
+ * Possible values:
+ * - \a rfcExact: exact calculation (slow)
+ * - \a rfcGridApproximation: grid approxiamtion (inaccurate)
+ * - \a rfcNMM: like in NMM (= New Multipole Method; fast and accurate)
+ */
+ RepulsiveForcesMethod repulsiveForcesCalculation() const {
+ return m_repulsiveForcesCalculation;
+ }
+
+ //! Sets the option repulsiveForcesCalculation to \a rfc.
+ void repulsiveForcesCalculation(RepulsiveForcesMethod rfc) {
+ m_repulsiveForcesCalculation = rfc;
+ }
+
+ //! Returns the stop criterion.
+ /**
+ * Possible values:
+ * - \a rscFixedIterations: stop if fixedIterations() is reached
+ * - \a rscThreshold: stop if threshold() is reached
+ * - \a rscFixedIterationsOrThreshold: stop if fixedIterations() or threshold()
+ * is reached
+ */
+ StopCriterion stopCriterion() const { return m_stopCriterion; }
+
+ //! Sets the stop criterion to \a rsc.
+ void stopCriterion(StopCriterion rsc) { m_stopCriterion = rsc; }
+
+ //! Returns the threshold for the stop criterion.
+ /**
+ * (If the average absolute value of all forces in
+ * an iteration is less then threshold() then stop.)
+ */
+ double threshold() const { return m_threshold; }
+
+ //! Sets the threshold for the stop criterion to \a x.
+ void threshold(double x) {m_threshold = ((x > 0) ? x : 0.1);}
+
+ //! Returns the fixed number of iterations for the stop criterion.
+ int fixedIterations() const { return m_fixedIterations; }
+
+ //! Sets the fixed number of iterations for the stop criterion to \a n.
+ void fixedIterations(int n) { m_fixedIterations = ((n >= 1) ? n : 1);}
+
+ //! Returns the scaling factor for the forces.
+ double forceScalingFactor() const { return m_forceScalingFactor; }
+
+ //! Sets the scaling factor for the forces to \ f.
+ void forceScalingFactor(double f) { m_forceScalingFactor = ((f > 0) ? f : 1);}
+
+ //! Returns the current setting of option coolTemperature.
+ /**
+ * If set to true, forces are scaled by coolValue()^(actual iteration) *
+ * forceScalingFactor(); otherwise forces are scaled by forceScalingFactor().
+ */
+ bool coolTemperature() const { return m_coolTemperature; }
+
+ //! Sets the option coolTemperature to \a b.
+ void coolTemperature(bool b) { m_coolTemperature = b; }
+
+ //! Returns the current setting of option coolValue.
+ /**
+ * This option defines the value by which forces are decreased
+ * if coolTemperature is true.
+ */
+ double coolValue() const { return m_coolValue; }
+
+ //! Sets the option coolValue to \a x.
+ void coolValue(double x) { m_coolValue = (((x >0 )&&(x<=1) )? x : 0.99);}
+
+
+ //! Returns the current setting of option initialPlacementForces.
+ /**
+ * This option defines how the initial placement is done.
+ * Possible values:
+ * - \a ipfUniformGrid: uniform on a grid
+ * - \a ipfRandomTime: random based on actual time
+ * - \a ipfRandomRandIterNr: random based on randIterNr()
+ * - \a ipfKeepPositions: no change in placement
+ */
+ InitialPlacementForces initialPlacementForces() const {
+ return m_initialPlacementForces;
+ }
+
+ //! Sets the option initialPlacementForces to \a ipf.
+ void initialPlacementForces(InitialPlacementForces ipf) {
+ m_initialPlacementForces = ipf;
+ }
+
+
+ /** @}
+ * @name Options for the postprocessing step
+ * @{
+ */
+
+ //! Returns the current setting of option resizeDrawing.
+ /**
+ * If set to true, the resulting drawing is resized so that the average edge
+ * length is the desired edge length times resizingScalar().
+ */
+ bool resizeDrawing() const { return m_resizeDrawing; }
+
+ //! Sets the option resizeDrawing to \a b.
+ void resizeDrawing(bool b) { m_resizeDrawing = b; }
+
+ //! Returns the current setting of option resizingScalar.
+ /**
+ * This option defines a parameter to scale the drawing if
+ * resizeDrawing() is true.
+ */
+ double resizingScalar() const { return m_resizingScalar; }
+
+ //! Sets the option resizingScalar to \a s.
+ void resizingScalar(double s) { m_resizingScalar = ((s > 0) ? s : 1);}
+
+ //! Returns the number of iterations for fine tuning.
+ int fineTuningIterations() const { return m_fineTuningIterations; }
+
+ //! Sets the number of iterations for fine tuning to \a n.
+ void fineTuningIterations(int n) { m_fineTuningIterations =((n >= 0) ? n : 0);}
+
+ //! Returns the curent setting of option fineTuneScalar.
+ /**
+ * This option defines a parameter for scaling the forces in the
+ * fine-tuning iterations.
+ */
+ double fineTuneScalar() const { return m_fineTuneScalar; }
+
+ //! Sets the option fineTuneScalar to \a s
+ void fineTuneScalar(double s) { m_fineTuneScalar = ((s >= 0) ? s : 1);}
+
+ //! Returns the current setting of option adjustPostRepStrengthDynamically.
+ /**
+ * If set to true, the strength of the repulsive force field is calculated
+ * dynamically by a formula depending on the number of nodes; otherwise the
+ * strength are scaled by PostSpringStrength and PostStrengthOfRepForces.
+ */
+ bool adjustPostRepStrengthDynamically() const {
+ return m_adjustPostRepStrengthDynamically;
+ }
+
+ //! Sets the option adjustPostRepStrengthDynamically to \a b.
+ void adjustPostRepStrengthDynamically(bool b) {
+ m_adjustPostRepStrengthDynamically = b;
+ }
+
+ //! Returns the strength of the springs in the postprocessing step.
+ double postSpringStrength() const { return m_postSpringStrength; }
+
+ //! Sets the strength of the springs in the postprocessing step to \a x.
+ void postSpringStrength(double x) { m_postSpringStrength = ((x > 0)? x : 1);}
+
+ //! Returns the strength of the repulsive forces in the postprocessing step.
+ double postStrengthOfRepForces() const { return m_postStrengthOfRepForces; }
+
+ //! Sets the strength of the repulsive forces in the postprocessing step to \a x.
+ void postStrengthOfRepForces(double x) {
+ m_postStrengthOfRepForces = ((x > 0)? x : 1);
+ }
+
+
+ /** @}
+ * @name Options for repulsive force approximation methods
+ * @{
+ */
+
+ //! Returns the current setting of option frGridQuotient.
+ /**
+ * The number k of rows and columns of the grid is sqrt(|V|) / frGridQuotient().
+ * (Note that in [Fruchterman,Reingold] frGridQuotient is 2.)
+ */
+ int frGridQuotient() const {return m_frGridQuotient;}
+
+ //! Sets the option frGridQuotient to \a p.
+ void frGridQuotient(int p) { m_frGridQuotient = ((0<=p) ? p : 2);}
+
+ //! Returns the current setting of option nmTreeConstruction.
+ /**
+ * This option defines how the reduced bucket quadtree is constructed.
+ * Possible values:
+ * - \a rtcPathByPath: path by path construction
+ * - \a rtcSubtreeBySubtree: subtree by subtree construction
+ */
+ ReducedTreeConstruction nmTreeConstruction() const { return m_NMTreeConstruction; }
+
+ //! Sets the option nmTreeConstruction to \a rtc.
+ void nmTreeConstruction(ReducedTreeConstruction rtc) { m_NMTreeConstruction = rtc; }
+
+ //! Returns the current setting of option nmSmallCell.
+ /**
+ * This option defines how the smallest quadratic cell that surrounds
+ * the particles of a node in the reduced bucket quadtree is calculated.
+ * Possible values:
+ * - \a scfIteratively: iteratively (in constant time)
+ * - \a scfAluru: by the formula by Aluru et al. (in constant time)
+ */
+ SmallestCellFinding nmSmallCell() const { return m_NMSmallCell; }
+
+ //! Sets the option nmSmallCell to \a scf.
+ void nmSmallCell(SmallestCellFinding scf) { m_NMSmallCell = scf; }
+
+ //! Returns the current setting of option nmParticlesInLeaves.
+ /**
+ * Defines the maximal number of particles that are contained in
+ * a leaf of the reduced bucket quadtree.
+ */
+ int nmParticlesInLeaves() const { return m_NMParticlesInLeaves; }
+
+ //! Sets the option nmParticlesInLeaves to \a n.
+ void nmParticlesInLeaves(int n) { m_NMParticlesInLeaves = ((n>= 1)? n : 1);}
+
+ //! Returns the precision \a p for the <i>p</i>-term multipole expansions.
+ int nmPrecision() const { return m_NMPrecision; }
+
+ //! Sets the precision for the multipole expansions to \ p.
+ void nmPrecision(int p) { m_NMPrecision = ((p >= 1 ) ? p : 1);}
+
+ //! @}
+
+private:
+
+ //high level options
+ bool m_useHighLevelOptions; //!< The option for using high-level options.
+ PageFormatType m_pageFormat; //!< The option for the page format.
+ double m_unitEdgeLength; //!< The unit edge length.
+ bool m_newInitialPlacement; //!< The option for new initial placement.
+ QualityVsSpeed m_qualityVersusSpeed; //!< The option for quality-vs-speed trade-off.
+
+ //low level options
+ //general options
+ int m_randSeed; //!< The random seed.
+ EdgeLengthMeasurement m_edgeLengthMeasurement; //!< The option for edge length measurement.
+ AllowedPositions m_allowedPositions; //!< The option for allowed positions.
+ int m_maxIntPosExponent; //!< The option for the used exponent.
+
+ //options for divide et impera step
+ double m_pageRatio; //!< The desired page ratio.
+ int m_stepsForRotatingComponents; //!< The number of rotations.
+ TipOver m_tipOverCCs; //!< Option for tip-over of connected components.
+ double m_minDistCC; //!< The separation between connected components.
+ PreSort m_presortCCs; //!< The option for presorting connected components.
+
+ //options for multilevel step
+ bool m_singleLevel; //!< Option for pure single level.
+ int m_minGraphSize; //!< The option for minimal graph size.
+ GalaxyChoice m_galaxyChoice; //!< The selection of galaxy nodes.
+ int m_randomTries; //!< The number of random tries.
+ MaxIterChange m_maxIterChange; //!< The option for how to change MaxIterations.
+ //!< If maxIterChange != micConstant, the iterations are decreased
+ //!< depending on the level, starting from
+ //!< ((maxIterFactor()-1) * fixedIterations())
+ int m_maxIterFactor; //!< The factor used for decreasing MaxIterations.
+ InitialPlacementMult m_initialPlacementMult; //!< The option for creating initial placement.
+
+ //options for force calculation step
+ ForceModel m_forceModel; //!< The used force model.
+ double m_springStrength; //!< The strengths of springs.
+ double m_repForcesStrength; //!< The strength of repulsive forces.
+ RepulsiveForcesMethod m_repulsiveForcesCalculation; //!< Option for how to calculate repulsive forces.
+ StopCriterion m_stopCriterion; //!< The stop criterion.
+ double m_threshold; //!< The threshold for the stop criterion.
+ int m_fixedIterations; //!< The fixed number of iterations for the stop criterion.
+ double m_forceScalingFactor; //!< The scaling factor for the forces.
+ bool m_coolTemperature; //!< The option for how to scale forces.
+ double m_coolValue; //!< The value by which forces are decreased.
+ InitialPlacementForces m_initialPlacementForces; //!< The option for how the initial placement is done.
+
+ //options for postprocessing step
+ bool m_resizeDrawing; //!< The option for resizing the drawing.
+ double m_resizingScalar; //!< Parameter for resizing the drawing.
+ int m_fineTuningIterations; //!< The number of iterations for fine tuning.
+ double m_fineTuneScalar; //!< Parameter for scaling forces during fine tuning.
+ bool m_adjustPostRepStrengthDynamically; //!< The option adjustPostRepStrengthDynamically.
+ double m_postSpringStrength; //!< The strength of springs during postprocessing.
+ double m_postStrengthOfRepForces; //!< The strength of repulsive forces during postprocessing.
+
+ //options for repulsive force approximation methods
+ int m_frGridQuotient; //!< The grid quotient.
+ ReducedTreeConstruction m_NMTreeConstruction; //!< The option for how to construct reduced bucket quadtree.
+ SmallestCellFinding m_NMSmallCell; //!< The option for how to calculate smallest quadtratic cells.
+ int m_NMParticlesInLeaves; //!< The maximal number of particles in a leaf.
+ int m_NMPrecision; //!< The precision for multipole expansions.
+
+ //other variables
+ double max_integer_position; //!< The maximum value for an integer position.
+ double cool_factor; //!< Needed for scaling the forces if coolTemperature is true.
+ double average_ideal_edgelength; //!< Measured from center to center.
+ double boxlength; //!< Holds the length of the quadratic comput. box.
+ int number_of_components; //!< The number of components of the graph.
+ DPoint down_left_corner; //!< Holds down left corner of the comput. box.
+ NodeArray<double> radius; //!< Holds the radius of the surrounding circle for each node.
+ double time_total; //!< The runtime (=CPU-time) of the algorithm in seconds.
+
+ FruchtermanReingold FR; //!< Class for repulsive force calculation (Fruchterman, Reingold).
+ NMM NM; //!< Class for repulsive force calculation.
+
+
+ //------------------- most important functions ----------------------------
+
+ //! Calls the divide (decomposition into connected components) and impera (drawing and packing of the componenets) step.
+ void call_DIVIDE_ET_IMPERA_step(
+ Graph& G,
+ NodeArray<NodeAttributes>& A,
+ EdgeArray<EdgeAttributes>& E);
+
+ //! Calls the multilevel step for subGraph \a G.
+ void call_MULTILEVEL_step_for_subGraph(
+ Graph& G,
+ NodeArray<NodeAttributes>& A,
+ EdgeArray<EdgeAttributes>& E,
+ int comp_index);
+
+ //! Calls the force calculation step for \a G, \a A, \a E.
+ /**
+ * If act_level is 0 and resizeDrawing is true the drawing is resized.
+ * Furthermore, the maximum number of force calc. steps is calculated
+ * depending on MaxIterChange, act_level, and max_level.
+ */
+ void call_FORCE_CALCULATION_step (
+ Graph& G,
+ NodeArray<NodeAttributes>& A,
+ EdgeArray<EdgeAttributes>& E,
+ int act_level,
+ int max_level);
+
+ //! Calls the postprocessing step.
+ void call_POSTPROCESSING_step(
+ Graph& G,
+ NodeArray<NodeAttributes>& A,
+ EdgeArray<EdgeAttributes>& E,
+ NodeArray<DPoint>& F,
+ NodeArray<DPoint>& F_attr,
+ NodeArray<DPoint>& F_rep,
+ NodeArray<DPoint>& last_node_movement);
+
+
+ //---------------- functions for pre/pos-processing -----------------------------
+
+ //! All parameter options are set to the default values.
+ void initialize_all_options();
+
+ //! Updates several low level parameter options due to the settings of the high level parameter options.
+ void update_low_level_options_due_to_high_level_options_settings();
+
+ //! Imports for each node \a v of \a G its width, height and position(given from \a GA) in \a A.
+ void import_NodeAttributes(
+ const Graph& G,
+ GraphAttributes& GA,
+ NodeArray<NodeAttributes>& A);
+
+ //! Imports for each edge e of G its desired length given via edgeLength.
+ void import_EdgeAttributes (
+ const Graph& G,
+ const EdgeArray<double>& edgeLength,
+ EdgeArray <EdgeAttributes>& E);
+
+ //! Sets the individual ideal edge length for each edge \a e.
+ void init_ind_ideal_edgelength(
+ const Graph& G,
+ NodeArray<NodeAttributes>&A,
+ EdgeArray <EdgeAttributes>& E);
+
+ //! The radii of the surrounding circles of the bounding boxes are computed.
+ void set_radii(const Graph& G,NodeArray<NodeAttributes>& A);
+
+ //! Exports for each node \a v in \a G_reduced the position of the original_node in \a G.
+ void export_NodeAttributes(
+ Graph& G_reduced,
+ NodeArray<NodeAttributes>& A_reduced,
+ GraphAttributes& GA);
+
+ //! Creates a simple and loopfree copy of \a G and stores the corresponding node / edge attributes.
+ /**
+ * The corresponding node / edge attributes are stored in \a A_reduced and
+ * \a E_reduced; the links to the copy_node and original node are stored in \a A,
+ * \a A_reduced, too.
+ */
+ void make_simple_loopfree(
+ const Graph& G,
+ NodeArray<NodeAttributes>& A,
+ EdgeArray<EdgeAttributes>E,
+ Graph& G_reduced,
+ NodeArray<NodeAttributes>& A_reduced,
+ EdgeArray<EdgeAttributes>& E_reduced);
+
+ //! Deletes parallel edges of \a G_reduced.
+ /**
+ * Saves for each set of parallel edges one representative edge in \a S and
+ * saves in \a new_edgelength the new edge length of this edge in \a G_reduced.
+ */
+ void delete_parallel_edges(
+ const Graph& G,
+ EdgeArray<EdgeAttributes>& E,
+ Graph& G_reduced,
+ List<edge>& S,
+ EdgeArray<double>& new_edgelength);
+
+ //! Sets for each edge \a e of \a G_reduced in \a S its edgelength to \a new_edgelength[\a e].
+ /**
+ * Also stores this information in \a E_reduced.
+ */
+ void update_edgelength(
+ List<edge>& S,
+ EdgeArray <double>& new_edgelength,
+ EdgeArray<EdgeAttributes>& E_reduced);
+
+ //! Returns the value for the strength of the repulsive forces.
+ /**
+ * Used in the postprocessing step; depending on \a n = G.numberOfNodes().
+ */
+ double get_post_rep_force_strength(int n) {
+ return min(0.2,400.0/double(n));
+ }
+
+ //! Makes the node positions integers.
+ /**
+ * If allowedPositions == apInteger the values are in a range depending on
+ * G.number_of_nodes() and the average_ideal_edgelength. If allowed_positions
+ * == apExponent the values are integers in a bounded integer range.
+ */
+ void make_positions_integer(Graph& G, NodeArray<NodeAttributes>& A);
+
+ //! Creates a simple drawing of \a AG in postscript format and saves it in file \a ps_file.
+ void create_postscript_drawing(GraphAttributes& AG, char* ps_file);
+
+
+ //------------------ functions for divide et impera step -----------------------
+
+ //! Constructs the list of connected components of G.
+ /**
+ * Also constructs the corresponding lists with the node / edge attributes
+ * (containing a pointer to the original node in \a G for each node in a subgraph).
+ */
+ void create_maximum_connected_subGraphs(
+ Graph& G,
+ NodeArray<NodeAttributes>&A,
+ EdgeArray<EdgeAttributes>&E,
+ Graph G_sub[],
+ NodeArray<NodeAttributes> A_sub[],
+ EdgeArray<EdgeAttributes> E_sub[],
+ NodeArray<int>& component);
+
+ //! The drawings of the subgraphs are packed.
+ /**
+ * This is done such that the subgraphs do not overlap and fit into a small
+ * box with the desired aspect ratio.
+ */
+ void pack_subGraph_drawings(
+ NodeArray<NodeAttributes>& A,
+ Graph G_sub[],
+ NodeArray<NodeAttributes> A_sub[]);
+
+ //! The bounding rectangles of all connected componenents of \a G are calculated and stored in \a R.
+ void calculate_bounding_rectangles_of_components(
+ List<Rectangle>& R,
+ Graph G_sub[],
+ NodeArray<NodeAttributes> A_sub[]);
+
+ //! The bounding rectangle of the componenet_index-th. component of G is returned.
+ Rectangle calculate_bounding_rectangle(
+ Graph& G,
+ NodeArray<NodeAttributes>& A,
+ int componenet_index);
+
+ /**
+ * If number_of_components > 1, the subgraphs \a G_sub are rotated and skipped to
+ * find bounding rectangles with minimum area. The information is saved in \a R and
+ * the node positions in \a A_sub are updated. If number_of_components == 1 a rotation
+ * with minimal aspect ratio is found instead.
+ */
+ void rotate_components_and_calculate_bounding_rectangles(
+ List<Rectangle>&R,
+ Graph G_sub[],
+ NodeArray<NodeAttributes> A_sub[]);
+
+ /**
+ * The positions of the nodes in the subgraphs are calculated by using the
+ * information stored in R and are exported to A. (The coordinates of components
+ * which surrounding rectangles have been tipped over in the packing step are
+ * tipped over here,too)
+ */
+ void export_node_positions(
+ NodeArray<NodeAttributes>& A,
+ List<Rectangle>& R,
+ Graph G_sub[],
+ NodeArray<NodeAttributes> A_sub[]);
+
+ //! Frees dynamically allocated memory for the connected component subgraphs.
+ void delete_all_subGraphs(
+ Graph G_sub[],
+ NodeArray<NodeAttributes> A_sub[],
+ EdgeArray<EdgeAttributes> E_sub[])
+ {
+ delete [] G_sub;
+ delete [] A_sub;
+ delete [] E_sub;
+ }
+
+
+
+ //------------------ functions for multilevel step --------------------------
+
+ /**
+ * Returns the maximum number of iterations for the force calc. step depending
+ * on act_level, max_level, FixedIterations, MaxIterChange, MaxIterFactor,
+ * and the number of nodes of the Graph in the actual mutilevel.
+ */
+ int get_max_mult_iter(int act_level, int max_level, int node_nr);
+
+
+ //------------------ functions for force calculation ---------------------------
+
+ //! The forces are calculated here.
+ void calculate_forces(
+ Graph& G,
+ NodeArray<NodeAttributes>& A,
+ EdgeArray<EdgeAttributes>& E,NodeArray<DPoint>& F,
+ NodeArray<DPoint>& F_attr,
+ NodeArray<DPoint>& F_rep,
+ NodeArray<DPoint>& last_node_movement,
+ int iter,
+ int fine_tuning_step);
+
+ //! The length of the computational box in the first iteration is set (down left corner is at (0,0).
+ void init_boxlength_and_cornercoordinate(Graph& G,NodeArray<NodeAttributes>& A);
+
+ //! The initial placements of the nodes are created by using initialPlacementForces().
+ void create_initial_placement (Graph& G,NodeArray<NodeAttributes>& A);
+
+ //! Sets all entries of \a F to (0,0).
+ void init_F (Graph& G, NodeArray<DPoint>& F);
+
+
+ //! Make initializations for the data structures that are used in the choosen class for rep. force calculation.
+ void make_initialisations_for_rep_calc_classes(
+ Graph& G/*,
+ NodeArray<NodeAttributes> &A,
+ NodeArray<DPoint>& F_rep*/);
+
+ //! Calculates repulsive forces for each node.
+ void calculate_repulsive_forces(
+ Graph &G,
+ NodeArray<NodeAttributes>& A,
+ NodeArray<DPoint>& F_rep)
+ {
+ if(repulsiveForcesCalculation() == rfcExact )
+ FR.calculate_exact_repulsive_forces(G,A,F_rep);
+ else if(repulsiveForcesCalculation() == rfcGridApproximation )
+ FR.calculate_approx_repulsive_forces(G,A,F_rep);
+ else //repulsiveForcesCalculation() == rfcNMM
+ NM.calculate_repulsive_forces(G,A,F_rep);
+ }
+
+
+ //! Deallocates dynamically allocated memory of the choosen rep. calculation class.
+ void deallocate_memory_for_rep_calc_classes()
+ {
+ if(repulsiveForcesCalculation() == rfcNMM)
+ NM.deallocate_memory();
+ }
+
+ //! Calculates attractive forces for each node.
+ void calculate_attractive_forces(
+ Graph& G,
+ NodeArray<NodeAttributes> & A,
+ EdgeArray<EdgeAttributes>& E,
+ NodeArray<DPoint>& F_attr);
+
+ //! Returns the attractive force scalar.
+ double f_attr_scalar (double d,double ind_ideal_edge_length);
+
+ //! Add attractive and repulsive forces for each node.
+ void add_attr_rep_forces(
+ Graph& G,
+ NodeArray<DPoint>& F_attr,
+ NodeArray<DPoint>& F_rep,
+ NodeArray<DPoint>& F,
+ int iter,
+ int fine_tuning_step);
+
+ //! Move the nodes.
+ void move_nodes(Graph& G,NodeArray<NodeAttributes>& A,NodeArray<DPoint>& F);
+
+ //! Computes a new tight computational square-box.
+ /**
+ * (Guaranteeing, that all midpoints are inside the square.)
+ */
+ void update_boxlength_and_cornercoordinate(Graph& G,NodeArray<NodeAttributes>& A);
+
+ //! Describes the max. radius of a move in one time step, depending on the number of iterations.
+ double max_radius(int iter) {
+ return (iter == 1) ? boxlength/1000 : boxlength/5;
+ }
+
+ //! The average_ideal_edgelength for all edges is computed.
+ void set_average_ideal_edgelength(Graph& G,EdgeArray<EdgeAttributes>& E);
+
+ /**
+ * Calculates the average force on each node in the actual iteration, which is
+ * needed if StopCriterion is scThreshold() or scFixedIterationsOrThreshold().
+ */
+ double get_average_forcevector_length (Graph& G, NodeArray<DPoint>& F);
+
+ /**
+ * Depending on the direction of \a last_node_movement[\a v], the length of the next
+ * displacement of node \a v is restricted.
+ */
+ void prevent_oscilations(
+ Graph& G,
+ NodeArray<DPoint>& F,
+ NodeArray<DPoint>&
+ last_node_movement,
+ int iter);
+
+ //! Calculates the angle between \a PQ and \a PS in [0,2pi).
+ double angle(DPoint& P, DPoint& Q, DPoint& R);
+
+ //! \a last_node_movement is initialized to \a F (used after first iteration).
+ void init_last_node_movement(
+ Graph& G,
+ NodeArray<DPoint>& F,
+ NodeArray<DPoint>& last_node_movement);
+
+ /**
+ * If resizeDrawing is true, the drawing is adapted to the ideal average
+ * edge length by shrinking respectively expanding the drawing area.
+ */
+ void adapt_drawing_to_ideal_average_edgelength(
+ Graph& G,
+ NodeArray<NodeAttributes>& A,
+ EdgeArray<EdgeAttributes>& E);
+
+ /**
+ * The force is restricted to have values within the comp. box (needed for
+ * exception handling, if the force is too large for further calculations).
+ */
+ void restrict_force_to_comp_box(DPoint& force) {
+ double x_min = down_left_corner.m_x;
+ double x_max = down_left_corner.m_x+boxlength;
+ double y_min = down_left_corner.m_y;
+ double y_max = down_left_corner.m_y+boxlength;
+ if (force.m_x < x_min )
+ force.m_x = x_min;
+ else if (force.m_x > x_max )
+ force.m_x = x_max;
+ if (force.m_y < y_min )
+ force.m_y = y_min;
+ else if (force.m_y > y_max )
+ force.m_y = y_max;
+ }
+
+
+ //------------------- functions for analytic information -------------------------
+
+ //! Sets time_total to zero.
+ void init_time() { time_total = 0; }
+
+ void fixTwistedSplits(Graph &G, NodeArray<NodeAttributes>& A);
+ std::vector<ogdf::node> getAdjacentNodes(ogdf::node v);
+ std::vector<ogdf::node> getAdjacentNodesExcluding(ogdf::node v, ogdf::node ex);
+ void followNodesUntilBranch(ogdf::node start, ogdf::node first,
+ ogdf::node * finish, std::vector<ogdf::node> * path, int * steps);
+};
+
+} //end namespace ogdf
+
+#endif
+
diff --git a/ogdf/energybased/MAARPacking.cpp b/ogdf/energybased/MAARPacking.cpp
new file mode 100644
index 0000000..cff4bba
--- /dev/null
+++ b/ogdf/energybased/MAARPacking.cpp
@@ -0,0 +1,473 @@
+/*
+ * $Revision: 2552 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-05 16:45:20 +0200 (Do, 05. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of class MAARPacking (used by FMMMLayout).
+ *
+ * \author Stefan Hachul
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "MAARPacking.h"
+#include "numexcept.h"
+#include "FMMMLayout.h"
+
+namespace ogdf {
+
+MAARPacking::MAARPacking()
+{
+ area_width = 0;
+ area_height = 0;
+}
+
+
+MAARPacking::~MAARPacking() { }
+
+
+void MAARPacking::pack_rectangles_using_Best_Fit_strategy(
+ List<Rectangle>& R,
+ double aspect_ratio,
+ int presort,
+ double& aspect_ratio_area,
+ double& bounding_rectangles_area)
+{
+ ListIterator<Rectangle> rect_item;
+ List<PackingRowInfo> P; //represents the packing of the rectangles
+ List<ListIterator <PackingRowInfo> > row_of_rectangle; //stores for each rectangle
+ //r at pos. i in R the ListIterator of the row in P
+ //where r is placed (at pos i in row_of_rectangle)
+ List<ListIterator<Rectangle> > rectangle_order;//holds the order in which the
+ //rectangles are touched
+ //in R and its total width
+
+ if(presort == FMMMLayout::psDecreasingHeight)
+ presort_rectangles_by_height(R);
+ else if (presort == FMMMLayout::psDecreasingWidth)
+ presort_rectangles_by_width(R);
+ else if (presort == FMMMLayout::psDecreasingArea)
+ presort_rectangles_by_area(R);
+
+ double fullWidth = 0;
+ double widestRect = 0.0;
+ for(rect_item = R.begin(); rect_item.valid(); ++rect_item) {
+ double rectWidth = (*rect_item).get_width();
+ fullWidth += rectWidth;
+ widestRect = std::max(widestRect, rectWidth);
+ }
+ double secondWidestRect = 0.0;
+ for(rect_item = R.begin(); rect_item.valid(); ++rect_item) {
+ double rectWidth = (*rect_item).get_width();
+ if (rectWidth < widestRect)
+ secondWidestRect = std::max(secondWidestRect, rectWidth);
+ }
+
+ double wrapWidth;
+
+ // If there's only one rectangle, then our job is easy: the wrap width is its width.
+ if (secondWidestRect == 0.0)
+ wrapWidth = widestRect;
+
+ // If the widest rectangle is much wider than the second widest, we again use the widest as the wrap width. This
+ // is largely for bacterial genome cases, where there will be one very large component and many small ones. In
+ // such a case, it looks weird for the rows of small ones to extend past the big one, regardless of the aspect
+ // ratio.
+ else if (widestRect / secondWidestRect > 5.0)
+ wrapWidth = widestRect;
+
+ // If neither of the above two cases apply, then we binary search our way to a wrap width which brings us closest
+ // to the desired aspect ratio.
+ else {
+ wrapWidth = fullWidth;
+ double fullWidthAspectRatio = getAspectRatio(R, fullWidth);
+ double bestAspectRatio = fullWidthAspectRatio;
+ double bestAgreement = getAspectRatioAgreement(aspect_ratio, fullWidthAspectRatio);
+
+ if (fullWidthAspectRatio > aspect_ratio) {
+ double left = 0.0;
+ double right = fullWidth;
+ while (true) {
+ double mid = (left + right) / 2.0;
+ double midAspectRatio = getAspectRatio(R, mid);
+
+ if (midAspectRatio == aspect_ratio) { // Exact match! (unlikely)
+ bestAspectRatio = midAspectRatio;
+ wrapWidth = mid;
+ break;
+ }
+ else if (midAspectRatio > aspect_ratio)
+ right = mid;
+ else // midAspectRatio < aspect_ratio
+ left = mid;
+
+ // We can't let the wrap width become less than the widest rectangle.
+ if (wrapWidth < widestRect) {
+ wrapWidth = widestRect;
+ break;
+ }
+
+ double agreement = getAspectRatioAgreement(aspect_ratio, getAspectRatio(R, mid));
+
+ // If the value hasn't changed, then it's not going to get any better.
+ if (agreement == bestAgreement)
+ break;
+
+ if (agreement > bestAgreement) {
+ bestAspectRatio = midAspectRatio;
+ bestAgreement = agreement;
+ wrapWidth = mid;
+ }
+
+ // No point in continuing too long.
+ if (right - left < 1.0)
+ break;
+ }
+ }
+ }
+
+ //init rectangle_order
+ for(rect_item = R.begin(); rect_item.valid(); ++rect_item)
+ rectangle_order.pushBack(rect_item);
+
+ // Now we know the wrapping width so we can position the rectangles in rows.
+ double widthOfCurrentRow = 0.0;
+ for(rect_item = R.begin(); rect_item.valid(); ++rect_item)
+ {
+ Rectangle r = *rect_item;
+ double rectWidth = r.get_width();
+ if (P.empty() || widthOfCurrentRow + rectWidth > wrapWidth || rectWidth > wrapWidth)
+ {
+ B_F_insert_rectangle_in_new_row(r,P,row_of_rectangle);
+ aspect_ratio_area = calculate_aspect_ratio_area(r.get_width(),r.get_height(),
+ aspect_ratio);
+ widthOfCurrentRow = rectWidth;
+ }
+ else // Insert in current row.
+ {
+ ListIterator<PackingRowInfo> B_F_item = row_of_rectangle.back();
+ B_F_insert_rectangle(r,P,row_of_rectangle,B_F_item);
+ widthOfCurrentRow += rectWidth;
+ }
+ }
+ export_new_rectangle_positions(P,row_of_rectangle,rectangle_order);
+ bounding_rectangles_area = calculate_bounding_rectangles_area(R);
+}
+
+
+double MAARPacking::getAspectRatio(List<Rectangle>& R, double wrappingWidth) {
+ double width = 0.0, height = 0.0;
+ double rowWidth = 0.0, rowHeight = 0.0;
+ for(ListIterator<Rectangle> rect_item = R.begin(); rect_item.valid(); ++rect_item) {
+ double rectWidth = (*rect_item).get_width();
+ double rectHeight = (*rect_item).get_height();
+
+ // If the rectangle fits in this row, it goes in this row.
+ if (rowWidth + rectWidth <= wrappingWidth) {
+ rowWidth += rectWidth;
+ rowHeight = std::max(rowHeight, rectHeight);
+ }
+
+ // Otherwise, it goes in a new row.
+ else {
+ width = std::max(width, rowWidth);
+ height += rowHeight;
+ rowWidth = rectWidth;
+ rowHeight = rectHeight;
+ }
+ }
+ width = std::max(width, rowWidth);
+ height += rowHeight;
+ if (height > 0.0)
+ return width / height;
+ else
+ return 1.0;
+}
+
+
+double MAARPacking::getAspectRatioAgreement(double ar1, double ar2) {
+ if (ar1 == 0.0 && ar2 == 0.0)
+ return 1.0;
+ return std::min(ar1, ar2) / std::max(ar1, ar2);
+}
+
+
+inline void MAARPacking::presort_rectangles_by_height(List<Rectangle>& R)
+{
+ RectangleComparerHeight comp_height;
+ R.quicksort(comp_height);
+}
+
+
+inline void MAARPacking::presort_rectangles_by_width(List<Rectangle>& R)
+{
+ RectangleComparerWidth comp_width;
+ R.quicksort(comp_width);
+}
+
+
+inline void MAARPacking::presort_rectangles_by_area(List<Rectangle>& R)
+{
+ RectangleComparerArea comp_area;
+ R.quicksort(comp_area);
+}
+
+
+void MAARPacking::B_F_insert_rectangle_in_new_row(
+ Rectangle r,
+ List<PackingRowInfo>& P,
+ List <ListIterator<PackingRowInfo> >&row_of_rectangle)
+{
+ PackingRowInfo p;
+
+ //create new empty row and insert r into this row of P
+ p.set_max_height(r.get_height());
+ p.set_total_width(r.get_width());
+ p.set_row_index(P.size());
+ P.pushBack(p);
+
+ //remember in which row of P r is placed by updating row_of_rectangle
+ row_of_rectangle.pushBack(P.rbegin());
+
+ //update area_height,area_width
+ area_width = max(r.get_width(),area_width);
+ area_height += r.get_height();
+}
+
+
+ListIterator<PackingRowInfo> MAARPacking::find_Best_Fit_insert_position(
+ ListIterator<Rectangle> rect_item,
+ double aspect_ratio,
+ double& aspect_ratio_area,
+ PQueue& total_width_of_row)
+{
+ numexcept N;
+ double area_2;
+ Rectangle r = *rect_item;
+
+ better_tipp_rectangle_in_new_row(r,aspect_ratio,aspect_ratio_area);
+
+ ListIterator<PackingRowInfo> B_F_item = total_width_of_row.find_min();
+ PackingRowInfo B_F_row = *B_F_item;
+ better_tipp_rectangle_in_this_row(r,aspect_ratio,B_F_row,area_2);
+
+ if((area_2 <= aspect_ratio_area) || N.nearly_equal(aspect_ratio_area,area_2))
+ {
+ aspect_ratio_area = area_2;
+ return B_F_item;
+ }
+ else
+ return NULL;
+}
+
+
+void MAARPacking::B_F_insert_rectangle(
+ Rectangle r,
+ List<PackingRowInfo>& P,
+ List<ListIterator<PackingRowInfo> >&row_of_rectangle,
+ ListIterator<PackingRowInfo> B_F_item)
+{
+ ListIterator<PackingRowInfo> null = NULL;
+ if (B_F_item == null) //insert into a new row
+ B_F_insert_rectangle_in_new_row(r,P,row_of_rectangle);
+ else //insert into an existing row
+ {
+ double old_max_height;
+
+ //update P[B_F_item]
+ PackingRowInfo p = *B_F_item;
+ old_max_height = p.get_max_height();
+ p.set_max_height(max(old_max_height,r.get_height()));
+ p.set_total_width(p.get_total_width()+r.get_width());
+ *B_F_item = p;
+
+ //updating row_of_rectangle
+ row_of_rectangle.pushBack(B_F_item);
+
+ //update area_height,area_width
+ area_width = max(area_width,p.get_total_width());
+ area_height = max(area_height,area_height-old_max_height+r.get_height());
+ }
+}
+
+
+
+void MAARPacking::export_new_rectangle_positions(
+ List<PackingRowInfo>& P,
+ List<ListIterator<PackingRowInfo> >& row_of_rectangle,
+ List<ListIterator<Rectangle> >& rectangle_order)
+{
+ int i;
+ Rectangle r;
+ PackingRowInfo p,p_pred;
+ DPoint new_dlc_pos;
+ double new_x,new_y;
+ Array<double> row_y_min (P.size()); //stores the min. y-coordinates for each row in P
+ Array<double> act_row_x_max (P.size()); //stores the actual rightmost x-coordinate
+ //for each row in P
+ //ListIterator< ListIterator<PackingRowInfo> > row_item;
+ ListIterator<PackingRowInfo> row_item;
+ ListIterator<Rectangle> R_item;
+ ListIterator<ListIterator<Rectangle> > RR_item;
+ ListIterator<ListIterator<PackingRowInfo> > Rrow_item;
+
+ //init act_row_x_max;
+ for(i = 0; i<P.size();i++)
+ act_row_x_max[i] = 0;
+
+ //calculate minimum heights of each row
+ for(row_item = P.begin(); row_item.valid(); ++row_item)
+ {
+ if (row_item == P.begin())
+ row_y_min[0] = 0;
+ else
+ {
+ p = *row_item;
+ p_pred = *(P.cyclicPred(row_item));
+ row_y_min[p.get_row_index()] = row_y_min[p.get_row_index()-1]+
+ p_pred.get_max_height();
+ }
+ }
+
+ //calculate for each rectangle its new down left corner coordinate
+ Rrow_item = row_of_rectangle.begin();
+
+ for(RR_item = rectangle_order.begin(); RR_item.valid(); ++RR_item)
+ {
+ R_item = *RR_item;
+ r = *R_item;
+ row_item = *Rrow_item;
+ p = *row_item;
+ new_x = act_row_x_max[p.get_row_index()];
+ act_row_x_max[p.get_row_index()] += r.get_width();
+ new_y = row_y_min[p.get_row_index()]+ (p.get_max_height()-r.get_height())/2;
+
+ new_dlc_pos.m_x = new_x;
+ new_dlc_pos.m_y = new_y;
+ r.set_new_dlc_position(new_dlc_pos);
+ *R_item = r;
+
+ if(Rrow_item != row_of_rectangle.rbegin())
+ Rrow_item = row_of_rectangle.cyclicSucc(Rrow_item);
+ }
+}
+
+
+inline double MAARPacking::calculate_bounding_rectangles_area(List<Rectangle>& R)
+{
+ double area = 0;
+ Rectangle r;
+
+ forall_listiterators(Rectangle,r_it,R)
+ area += (*r_it).get_width() * (*r_it).get_height();
+
+ return area;
+}
+
+
+inline double MAARPacking::calculate_aspect_ratio_area(
+ double width,
+ double height,
+ double aspect_ratio)
+{
+ double ratio = width/height;
+
+ if(ratio < aspect_ratio) //scale width
+ return ( width * height * (aspect_ratio/ratio));
+ else //scale height
+ return ( width * height * (ratio/aspect_ratio));
+}
+
+
+bool MAARPacking::better_tipp_rectangle_in_new_row(
+ Rectangle r,
+ double aspect_ratio,
+ double& best_area)
+{
+ double height,width;
+ bool rotate = false;
+
+ //first try: new row insert position
+ width = max(area_width,r.get_width());
+ height = area_height + r.get_height();
+ best_area = calculate_aspect_ratio_area(width,height,aspect_ratio);
+
+ return rotate;
+}
+
+
+bool MAARPacking::better_tipp_rectangle_in_this_row(
+ Rectangle r,
+ double aspect_ratio,
+ PackingRowInfo B_F_row,
+ double& best_area)
+{
+ double height,width;
+ bool rotate = false;
+
+ //first try: BEST_FIT insert position
+ width = max(area_width,B_F_row.get_total_width()+r.get_width());
+ height = max(area_height, area_height-B_F_row.get_max_height()+r.get_height());
+ best_area = calculate_aspect_ratio_area(width,height,aspect_ratio);
+
+ return rotate;
+}
+
+
+inline Rectangle MAARPacking::tipp_over(ListIterator<Rectangle> rect_item)
+{
+ Rectangle r = *rect_item;
+ Rectangle r_tipped_over = r;
+ DPoint tipped_dlc;
+
+ if(r.is_tipped_over() == false)
+ {//tipp old_dlc over
+ tipped_dlc.m_x = r.get_old_dlc_position().m_y*(-1)-r.get_height();
+ tipped_dlc.m_y = r.get_old_dlc_position().m_x;
+ }
+ else
+ {//tipp old_dlc back;
+ tipped_dlc.m_x = r.get_old_dlc_position().m_y;
+ tipped_dlc.m_y = r.get_old_dlc_position().m_x*(-1)-r.get_width();
+ }
+ r_tipped_over.set_old_dlc_position(tipped_dlc);
+ r_tipped_over.set_width(r.get_height());
+ r_tipped_over.set_height(r.get_width());
+ r_tipped_over.tipp_over();
+ *rect_item = r_tipped_over;
+
+ return r_tipped_over;
+}
+
+}//namespace ogdf
diff --git a/ogdf/energybased/MAARPacking.h b/ogdf/energybased/MAARPacking.h
new file mode 100644
index 0000000..6147540
--- /dev/null
+++ b/ogdf/energybased/MAARPacking.h
@@ -0,0 +1,162 @@
+/*
+ * $Revision: 2559 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-06 15:04:28 +0200 (Fr, 06. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of class MAARPacking (used by FMMMLayout).
+ *
+ * \author Stefan Hachul
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_MAAR_PACKING_H
+#define OGDF_MAAR_PACKING_H
+
+#include "PackingRowInfo.h"
+#include "Rectangle.h"
+#include "Set.h"
+#include "../basic/List.h"
+#include "PQueue.h"
+
+namespace ogdf {
+
+ class MAARPacking
+ {
+ //data structure for packing rectangles within an area of a desired aspect ratio
+ //without overlappings; optimization goal: to minimize the used aspect ratio area
+
+ public:
+
+ MAARPacking(); //constructor
+ ~MAARPacking(); //destructor
+
+ //The rectangles in R are packed using the First Fit tiling stratey (precisely the
+ //new down left corner coordinate of each rectangle is calculated and stored in R).
+ //The aspect ratio area and the area of the bounding rectangles are calculated,
+ //too.
+ void pack_rectangles_using_Best_Fit_strategy(List<Rectangle>& R, double
+ aspect_ratio, int presort, double&
+ aspect_ratio_area, double&
+ bounding_rectangles_area);
+
+ private:
+
+
+ double area_height; //total height of the packing area
+ double area_width; //total width of the packing area
+
+
+ //Sorts elemets of R with momotonously dedreasing height.
+ void presort_rectangles_by_height(List<Rectangle>& R);
+
+ //Sorts elemets of R with momotonously decreasing width.
+ void presort_rectangles_by_width(List<Rectangle>& R);
+
+ //Sorts elemets of R with momotonously decreasing area.
+ void presort_rectangles_by_area(List<Rectangle>& R);
+
+ //Creates a new empty row in P and inserts r into this row (by updating P,
+ //row_of_rectangle and total_width_of_row).
+ void B_F_insert_rectangle_in_new_row(Rectangle r, List<PackingRowInfo>& P, List
+ <ListIterator<PackingRowInfo> >&
+ row_of_rectangle);
+
+
+ //Finds the Best Fit insert positions of *rect_item and returns the
+ //corresp. ListIterator in P or NULL (indicating that a new row has
+ //to be created in P); aspect_ratio_area stores the used aspect ratio area of
+ //the drawing.
+ ListIterator<PackingRowInfo> find_Best_Fit_insert_position(
+ ListIterator<Rectangle> rect_item,
+ double aspect_ratio,
+ double& aspect_ratio_area,
+ PQueue& total_width_of_row);
+
+
+ //Inserts r into the row with corresponding ListIterator B_F_item and updates
+ //total_width_of_row.
+ void B_F_insert_rectangle(Rectangle r, List<PackingRowInfo>& P, List
+ <ListIterator
+ <PackingRowInfo> >& row_of_rectangle, ListIterator
+ <PackingRowInfo> B_F_item);
+
+
+ //The information in P and row_of_rectangle are used to generate the new down left
+ //coordinates of the rectangles in R (rectangle_order holds the order in which
+ //the rectangles of R have to be processed.
+ void export_new_rectangle_positions(List<PackingRowInfo>& P,List<ListIterator
+ <PackingRowInfo> >&
+ row_of_rectangle,List<ListIterator
+ <Rectangle> >& rectangle_order);
+
+ //Returns the area of the bounding rectangles in R.
+ double calculate_bounding_rectangles_area(List<Rectangle>&R);
+
+ //Calculate the aspect ratio area of a rectangle with width w and height h and the
+ //given aspect ratio r.
+ double calculate_aspect_ratio_area(double w,double h,double r);
+
+ //Returns true if the aspect_ratio_area of the acual packing becomes better, when
+ //tipping r over bevore inserting it into the new row. best_area holds the aspect
+ //ratio area of the best of the two insertion alternatives.
+ bool better_tipp_rectangle_in_new_row(Rectangle r,double aspect_ratio,
+ double& best_area);
+
+ //Returns true if the aspect_ratio_area of the acual packing becomes better, when
+ //tipping r over bevore inserting it into the existing row B_F_row. best_area holds
+ //the aspect ratio area of the best of the two insertion alternatives.
+ bool better_tipp_rectangle_in_this_row(Rectangle r,double aspect_ratio,
+ PackingRowInfo B_F_row,double& best_area);
+
+ //Tipps *rect_item over, by newly calculatting its width, height, and old_dlc
+ //values (Coordinates of the underlying connected subgraph are not recaculated
+ //here!!!). The new values are saved in R[rect_item] and are returned.
+ Rectangle tipp_over(ListIterator<Rectangle> rect_item);
+
+ double getAspectRatio(List<Rectangle>& R, double wrappingWidth);
+ double getAspectRatioAgreement(double ar1, double ar2);
+
+ };
+
+}//namespace ogdf
+#endif
+
+
diff --git a/ogdf/energybased/Multilevel.cpp b/ogdf/energybased/Multilevel.cpp
new file mode 100644
index 0000000..7fccbae
--- /dev/null
+++ b/ogdf/energybased/Multilevel.cpp
@@ -0,0 +1,885 @@
+/*
+ * $Revision: 2552 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-05 16:45:20 +0200 (Do, 05. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of class Multlevel (used by FMMMLayout).
+ *
+ * \author Stefan Hachul
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "Multilevel.h"
+#include "Set.h"
+#include "Node.h"
+#include "../basic/Array.h"
+#include "../basic/Math.h"
+#include "../basic/simple_graph_alg.h"
+#include "FMMMLayout.h"
+
+
+namespace ogdf {
+
+void Multilevel::create_multilevel_representations(
+ Graph& G,
+ NodeArray<NodeAttributes>& A,
+ EdgeArray<EdgeAttributes>& E,
+ int rand_seed,
+ int galaxy_choice,
+ int min_Graph_size,
+ int random_tries,
+ Array<Graph*> &G_mult_ptr,
+ Array<NodeArray <NodeAttributes>*> &A_mult_ptr,
+ Array<EdgeArray<EdgeAttributes>*> &E_mult_ptr,
+ int & max_level)
+{
+ //make initialisations;
+ srand(rand_seed);
+ G_mult_ptr[0] = &G; //init graph at level 0 to the original undirected simple
+ A_mult_ptr[0] = &A; //and loopfree connected graph G/A/E
+ E_mult_ptr[0] = &E;
+
+ int bad_edgenr_counter = 0;
+ int act_level = 0;
+ Graph* act_Graph_ptr = G_mult_ptr[0];
+
+ while( (act_Graph_ptr->numberOfNodes() > min_Graph_size) &&
+ edgenumbersum_of_all_levels_is_linear(G_mult_ptr,act_level,bad_edgenr_counter) )
+ {
+ Graph* G_new = new (Graph);
+ NodeArray<NodeAttributes>* A_new = OGDF_NEW NodeArray<NodeAttributes>;
+ EdgeArray<EdgeAttributes>* E_new = OGDF_NEW EdgeArray<EdgeAttributes>;
+ G_mult_ptr[act_level+1] = G_new;
+ A_mult_ptr[act_level+1] = A_new;
+ E_mult_ptr[act_level+1] = E_new;
+
+ init_multilevel_values(G_mult_ptr,A_mult_ptr,E_mult_ptr,act_level);
+ partition_galaxy_into_solar_systems(G_mult_ptr,A_mult_ptr,E_mult_ptr,rand_seed,
+ galaxy_choice,random_tries,act_level);
+ collaps_solar_systems(G_mult_ptr,A_mult_ptr,E_mult_ptr,act_level);
+
+ act_level++;
+ act_Graph_ptr = G_mult_ptr[act_level];
+ }
+ max_level = act_level;
+}
+
+
+bool Multilevel::edgenumbersum_of_all_levels_is_linear(
+ Array<Graph*> &G_mult_ptr,
+ int act_level,
+ int& bad_edgenr_counter)
+{
+ if(act_level == 0)
+ return true;
+ else
+ {
+ if(G_mult_ptr[act_level]->numberOfEdges()<=
+ 0.8 * double (G_mult_ptr[act_level-1]->numberOfEdges()))
+ return true;
+ else if(bad_edgenr_counter < 5)
+ {
+ bad_edgenr_counter++;
+ return true;
+ }
+ else
+ return false;
+ }
+}
+
+
+inline void Multilevel::init_multilevel_values(
+ Array<Graph*> &G_mult_ptr,
+ Array<NodeArray<NodeAttributes>*> &A_mult_ptr,
+ Array<EdgeArray<EdgeAttributes>*> &E_mult_ptr,
+ int level)
+{
+ node v;
+ forall_nodes(v,*G_mult_ptr[level])
+ (*A_mult_ptr[level])[v].init_mult_values();
+
+ edge e;
+ forall_edges(e,*G_mult_ptr[level])
+ (*E_mult_ptr[level])[e].init_mult_values();
+}
+
+
+inline void Multilevel::partition_galaxy_into_solar_systems(
+ Array<Graph*> &G_mult_ptr,
+ Array<NodeArray<NodeAttributes>*> &A_mult_ptr,
+ Array<EdgeArray<EdgeAttributes>*> &E_mult_ptr,
+ int rand_seed,
+ int galaxy_choice,
+ int random_tries,
+ int act_level)
+{
+ create_suns_and_planets(G_mult_ptr, A_mult_ptr, E_mult_ptr, rand_seed, galaxy_choice,
+ random_tries, act_level);
+ create_moon_nodes_and_pm_nodes(G_mult_ptr, A_mult_ptr, E_mult_ptr, act_level);
+}
+
+
+void Multilevel::create_suns_and_planets(
+ Array<Graph*> &G_mult_ptr,
+ Array<NodeArray<NodeAttributes>*> &A_mult_ptr,
+ Array<EdgeArray<EdgeAttributes>*> &E_mult_ptr,
+ int rand_seed,
+ int galaxy_choice,
+ int random_tries,
+ int act_level)
+{
+ Set Node_Set;
+ node v, sun_node, planet_node, newNode, pos_moon_node;
+ edge sun_edge, e;
+ double dist_to_sun;
+ List<node> planet_nodes;
+ List<node> sun_nodes;
+
+ //make initialisations
+ sun_nodes.clear();
+ Node_Set.set_seed(rand_seed); //set seed for random number generator
+ forall_nodes(v,*G_mult_ptr[act_level])
+ if(act_level == 0) (*A_mult_ptr[act_level])[v].set_mass(1);
+ if(galaxy_choice == FMMMLayout::gcUniformProb)
+ Node_Set.init_node_set(*G_mult_ptr[act_level]);
+ else //galaxy_choice != gcUniformProb in FMMMLayout
+ Node_Set.init_node_set(*G_mult_ptr[act_level],*A_mult_ptr[act_level]);
+
+
+ while (!Node_Set.empty_node_set())
+ {//while
+ //randomly select a sun node
+ planet_nodes.clear();
+ if(galaxy_choice == FMMMLayout::gcUniformProb)
+ sun_node = Node_Set.get_random_node();
+ else if (galaxy_choice == FMMMLayout::gcNonUniformProbLowerMass)
+ sun_node = Node_Set.get_random_node_with_lowest_star_mass(random_tries);
+ else //galaxy_choice == FMMMLayout::gcNonUniformProbHigherMass
+ sun_node = Node_Set.get_random_node_with_highest_star_mass(random_tries);
+ sun_nodes.pushBack(sun_node);
+
+ //create new node at higher level that represents the collapsed solar_system
+ newNode = G_mult_ptr[act_level+1]->newNode();
+
+ //update information for sun_node
+ (*A_mult_ptr[act_level])[sun_node].set_higher_level_node(newNode);
+ (*A_mult_ptr[act_level])[sun_node].set_type(1);
+ (*A_mult_ptr[act_level])[sun_node].set_dedicated_sun_node(sun_node);
+ (*A_mult_ptr[act_level])[sun_node].set_dedicated_sun_distance(0);
+
+ //update information for planet_nodes
+ forall_adj_edges(sun_edge,sun_node)
+ {
+ dist_to_sun = (*E_mult_ptr[act_level])[sun_edge].get_length();
+ if (sun_edge->source() != sun_node)
+ planet_node = sun_edge->source();
+ else
+ planet_node = sun_edge->target();
+ (*A_mult_ptr[act_level])[planet_node].set_type(2);
+ (*A_mult_ptr[act_level])[planet_node].set_dedicated_sun_node(sun_node);
+ (*A_mult_ptr[act_level])[planet_node].set_dedicated_sun_distance(dist_to_sun);
+ planet_nodes.pushBack(planet_node);
+ }
+
+ //delete all planet_nodes and possible_moon_nodes from Node_Set
+
+ ListConstIterator<node> planet_node_ptr;
+ //forall_listiterators(node,planet_node_ptr,planet_nodes)
+ for(planet_node_ptr = planet_nodes.begin(); planet_node_ptr.valid(); ++planet_node_ptr)
+ if(!Node_Set.is_deleted(*planet_node_ptr))
+ Node_Set.delete_node(*planet_node_ptr);
+
+ for(planet_node_ptr = planet_nodes.begin(); planet_node_ptr.valid(); ++planet_node_ptr)
+ //forall_listiterators(node,planet_node_ptr,planet_nodes)
+ {
+ forall_adj_edges(e,*planet_node_ptr)
+ {
+ if(e->source() == *planet_node_ptr)
+ pos_moon_node = e->target();
+ else
+ pos_moon_node = e->source();
+ if(!Node_Set.is_deleted(pos_moon_node))
+ Node_Set.delete_node(pos_moon_node);
+ }
+ }
+ }//while
+
+ //init *A_mult_ptr[act_level+1] and set NodeAttributes information for new nodes
+ A_mult_ptr[act_level+1]->init(*G_mult_ptr[act_level+1]);
+ forall_listiterators(node, sun_node_ptr, sun_nodes)
+ {
+ newNode = (*A_mult_ptr[act_level])[*sun_node_ptr].get_higher_level_node();
+ (*A_mult_ptr[act_level+1])[newNode].set_NodeAttributes((*A_mult_ptr[act_level])
+ [*sun_node_ptr].get_width(),
+ (*A_mult_ptr[act_level])
+ [*sun_node_ptr].get_height(),
+ (*A_mult_ptr[act_level])
+ [*sun_node_ptr].get_position(),
+ *sun_node_ptr,NULL);
+ (*A_mult_ptr[act_level+1])[newNode].set_mass(0);
+ }
+}
+
+
+void Multilevel::create_moon_nodes_and_pm_nodes(
+ Array<Graph*> &G_mult_ptr,
+ Array<NodeArray<NodeAttributes>*> &A_mult_ptr,
+ Array<EdgeArray<EdgeAttributes>*> &E_mult_ptr,
+ int act_level)
+{
+ edge e;
+ node v, nearest_neighbour_node = node(), neighbour_node, dedicated_sun_node;
+ double dist_to_nearest_neighbour = 0, dedicated_sun_distance;
+ bool first_adj_edge;
+ int neighbour_type;
+ edge moon_edge = edge();
+
+ forall_nodes(v,*G_mult_ptr[act_level])
+ if((*A_mult_ptr[act_level])[v].get_type() == 0) //a moon node
+ {//forall
+ //find nearest neighbour node
+ first_adj_edge = true;
+ forall_adj_edges(e,v)
+ {//forall2
+ if(v == e->source())
+ neighbour_node = e->target();
+ else
+ neighbour_node = e->source();
+ neighbour_type = (*A_mult_ptr[act_level])[neighbour_node].get_type();
+ if( (neighbour_type == 2) || (neighbour_type == 3) )
+ {//if_1
+ if(first_adj_edge)
+ {//if
+ first_adj_edge = false;
+ moon_edge = e;
+ dist_to_nearest_neighbour = (*E_mult_ptr[act_level])[e].get_length();
+ nearest_neighbour_node = neighbour_node;
+ }//if
+ else if(dist_to_nearest_neighbour >(*E_mult_ptr[act_level])[e].get_length())
+ {//else
+ moon_edge = e;
+ dist_to_nearest_neighbour = (*E_mult_ptr[act_level])[e].get_length();
+ nearest_neighbour_node = neighbour_node;
+ }//else
+ }//if_1
+ }//forall2
+ //find dedic. solar system for v and update information in *A_mult_ptr[act_level]
+ //and *E_mult_ptr[act_level]
+
+ (*E_mult_ptr[act_level])[moon_edge].make_moon_edge(); //mark this edge
+ dedicated_sun_node = (*A_mult_ptr[act_level])[nearest_neighbour_node].
+ get_dedicated_sun_node();
+ dedicated_sun_distance = dist_to_nearest_neighbour + (*A_mult_ptr[act_level])
+ [nearest_neighbour_node].get_dedicated_sun_distance();
+ (*A_mult_ptr[act_level])[v].set_type(4);
+ (*A_mult_ptr[act_level])[v].set_dedicated_sun_node(dedicated_sun_node);
+ (*A_mult_ptr[act_level])[v].set_dedicated_sun_distance(dedicated_sun_distance);
+ (*A_mult_ptr[act_level])[v].set_dedicated_pm_node(nearest_neighbour_node);
+
+ //identify nearest_neighbour_node as a pm_node and update its information
+
+ (*A_mult_ptr[act_level])[nearest_neighbour_node].set_type(3);
+ (*A_mult_ptr[act_level])[nearest_neighbour_node].
+ get_dedicated_moon_node_List_ptr()->pushBack(v);
+ }//forall
+}
+
+
+inline void Multilevel::collaps_solar_systems(
+ Array<Graph*> &G_mult_ptr,
+ Array<NodeArray<NodeAttributes>*> &A_mult_ptr,
+ Array<EdgeArray<EdgeAttributes>*> &E_mult_ptr,
+ int act_level)
+{
+ EdgeArray<double> new_edgelength;
+ calculate_mass_of_collapsed_nodes(G_mult_ptr, A_mult_ptr, act_level);
+ create_edges_edgedistances_and_lambda_Lists(G_mult_ptr, A_mult_ptr, E_mult_ptr,
+ new_edgelength, act_level);
+ delete_parallel_edges_and_update_edgelength(G_mult_ptr, E_mult_ptr, new_edgelength,
+ act_level);
+}
+
+
+inline void Multilevel::calculate_mass_of_collapsed_nodes(
+ Array<Graph*> &G_mult_ptr,
+ Array<NodeArray <NodeAttributes>*> &A_mult_ptr,
+ int act_level)
+{
+ node v;
+ node dedicated_sun,high_level_node;
+
+ forall_nodes(v,*G_mult_ptr[act_level])
+ {
+ dedicated_sun = (*A_mult_ptr[act_level])[v].get_dedicated_sun_node();
+ high_level_node = (*A_mult_ptr[act_level])[dedicated_sun].get_higher_level_node();
+ (*A_mult_ptr[act_level+1])[high_level_node].set_mass((*A_mult_ptr[act_level+1])
+ [high_level_node].get_mass()+1);
+ }
+}
+
+
+void Multilevel::create_edges_edgedistances_and_lambda_Lists(
+ Array<Graph*> &G_mult_ptr,
+ Array<NodeArray<NodeAttributes>*> &A_mult_ptr,
+ Array<EdgeArray<EdgeAttributes>*> &E_mult_ptr,
+ EdgeArray<double>& new_edgelength,int
+ act_level)
+{
+ edge e, e_new;
+ node s_node, t_node;
+ node s_sun_node, t_sun_node;
+ node high_level_sun_s, high_level_sun_t;
+ double length_e, length_s_edge, length_t_edge, newlength;
+ double lambda_s, lambda_t;
+ List<edge> inter_solar_system_edges;
+
+ //create new edges at act_level+1 and create for each inter solar system edge at
+ //act_level a link to its corresponding edge
+
+ forall_edges(e,*G_mult_ptr[act_level])
+ {//forall
+ s_node = e->source();
+ t_node = e->target();
+ s_sun_node = (*A_mult_ptr[act_level])[s_node].get_dedicated_sun_node();
+ t_sun_node = (*A_mult_ptr[act_level])[t_node].get_dedicated_sun_node();
+ if( s_sun_node != t_sun_node) //a inter solar system edge
+ {//if
+ high_level_sun_s = (*A_mult_ptr[act_level])[s_sun_node].get_higher_level_node();
+ high_level_sun_t = (*A_mult_ptr[act_level])[t_sun_node].get_higher_level_node();
+
+ //create new edge in *G_mult_ptr[act_level+1]
+ e_new = G_mult_ptr[act_level+1]->newEdge(high_level_sun_s,high_level_sun_t);
+ (*E_mult_ptr[act_level])[e].set_higher_level_edge(e_new);
+ inter_solar_system_edges.pushBack(e);
+ }//if
+ }//forall
+
+ //init new_edgelength calculate the values of new_edgelength and the lambda Lists
+
+ new_edgelength.init(*G_mult_ptr[act_level+1]);
+ forall_listiterators(edge, e_ptr, inter_solar_system_edges)
+ {//forall
+ s_node = (*e_ptr)->source();
+ t_node = (*e_ptr)->target();
+ s_sun_node = (*A_mult_ptr[act_level])[s_node].get_dedicated_sun_node();
+ t_sun_node = (*A_mult_ptr[act_level])[t_node].get_dedicated_sun_node();
+ length_e = (*E_mult_ptr[act_level])[*e_ptr].get_length();
+ length_s_edge =(*A_mult_ptr[act_level])[s_node].get_dedicated_sun_distance();
+ length_t_edge =(*A_mult_ptr[act_level])[t_node].get_dedicated_sun_distance();
+ newlength = length_s_edge + length_e + length_t_edge;
+
+ //set new edge_length in *G_mult_ptr[act_level+1]
+ e_new = (*E_mult_ptr[act_level])[*e_ptr].get_higher_level_edge();
+ new_edgelength[e_new] = newlength;
+
+ //create entries in lambda Lists
+ lambda_s = length_s_edge/newlength;
+ lambda_t = length_t_edge/newlength;
+ (*A_mult_ptr[act_level])[s_node].get_lambda_List_ptr()->pushBack(lambda_s);
+ (*A_mult_ptr[act_level])[t_node].get_lambda_List_ptr()->pushBack(lambda_t);
+ (*A_mult_ptr[act_level])[s_node].get_neighbour_sun_node_List_ptr()->pushBack(
+ t_sun_node);
+ (*A_mult_ptr[act_level])[t_node].get_neighbour_sun_node_List_ptr()->pushBack(
+ s_sun_node);
+ }//forall
+}
+
+
+void Multilevel::delete_parallel_edges_and_update_edgelength(
+ Array<Graph*> &G_mult_ptr,
+ Array<EdgeArray<EdgeAttributes>*> &E_mult_ptr,
+ EdgeArray<double>& new_edgelength,int
+ act_level)
+{
+ EdgeMaxBucketFunc get_max_index;
+ EdgeMinBucketFunc get_min_index;
+ edge e_act, e_save = 0;
+ Edge f_act;
+ List<Edge> sorted_edges;
+ Graph* Graph_ptr = G_mult_ptr[act_level+1];
+ int save_s_index = 0, save_t_index = 0, act_s_index, act_t_index;
+ int counter = 1;
+
+ //make *G_mult_ptr[act_level+1] undirected
+ makeSimpleUndirected(*G_mult_ptr[act_level+1]);
+
+ //sort the List sorted_edges
+ forall_edges(e_act,*Graph_ptr)
+ {
+ f_act.set_Edge(e_act,Graph_ptr);
+ sorted_edges.pushBack(f_act);
+ }
+
+ sorted_edges.bucketSort(0,Graph_ptr->numberOfNodes()-1,get_max_index);
+ sorted_edges.bucketSort(0,Graph_ptr->numberOfNodes()-1,get_min_index);
+
+ //now parallel edges are consecutive in sorted_edges
+ forall_listiterators(Edge, EdgeIterator,sorted_edges)
+ {//for
+ e_act = (*EdgeIterator).get_edge();
+ act_s_index = e_act->source()->index();
+ act_t_index = e_act->target()->index();
+
+ if(EdgeIterator != sorted_edges.begin())
+ {//if
+ if( (act_s_index == save_s_index && act_t_index == save_t_index) ||
+ (act_s_index == save_t_index && act_t_index == save_s_index) )
+ {
+ new_edgelength[e_save] += new_edgelength[e_act];
+ Graph_ptr->delEdge(e_act);
+ counter++;
+ }
+ else
+ {
+ if (counter > 1)
+ {
+ new_edgelength[e_save] /= counter;
+ counter = 1;
+ }
+ save_s_index = act_s_index;
+ save_t_index = act_t_index;
+ e_save = e_act;
+ }
+ }//if
+ else //first edge
+ {
+ save_s_index = act_s_index;
+ save_t_index = act_t_index;
+ e_save = e_act;
+ }
+ }//for
+
+ //treat special case (last edges were multiple edges)
+ if(counter >1)
+ new_edgelength[e_save] /= counter;
+
+ //init *E_mult_ptr[act_level+1] and import EdgeAttributes
+ E_mult_ptr[act_level+1]->init(*G_mult_ptr[act_level+1]);
+ forall_edges(e_act,*Graph_ptr)
+ (*E_mult_ptr[act_level+1])[e_act].set_length(new_edgelength[e_act]);
+}
+
+
+void Multilevel::find_initial_placement_for_level(
+ int level,
+ int init_placement_way,
+ Array<Graph*> &G_mult_ptr,
+ Array<NodeArray<NodeAttributes>*> &A_mult_ptr,
+ Array<EdgeArray<EdgeAttributes>*> &E_mult_ptr)
+{
+ List<node> pm_nodes;
+ set_initial_positions_of_sun_nodes(level, G_mult_ptr, A_mult_ptr);
+ set_initial_positions_of_planet_and_moon_nodes(level, init_placement_way, G_mult_ptr,
+ A_mult_ptr, E_mult_ptr, pm_nodes);
+ set_initial_positions_of_pm_nodes(level, init_placement_way, A_mult_ptr,
+ E_mult_ptr, pm_nodes);
+}
+
+
+void Multilevel::set_initial_positions_of_sun_nodes(
+ int level,
+ Array<Graph*> &G_mult_ptr,
+ Array<NodeArray <NodeAttributes>*> &A_mult_ptr)
+{
+ node v_high, v_act;
+ DPoint new_pos;
+ forall_nodes(v_high,*G_mult_ptr[level+1])
+ {
+ v_act = (*A_mult_ptr[level+1])[v_high].get_lower_level_node();
+ new_pos = (*A_mult_ptr[level+1])[v_high].get_position();
+ (*A_mult_ptr[level])[v_act].set_position(new_pos);
+ (*A_mult_ptr[level])[v_act].place();
+ }
+}
+
+
+void Multilevel::set_initial_positions_of_planet_and_moon_nodes(
+ int level,
+ int init_placement_way,
+ Array<Graph*> &G_mult_ptr,
+ Array<NodeArray<NodeAttributes>*> &A_mult_ptr,
+ Array<EdgeArray<EdgeAttributes>*> &E_mult_ptr,
+ List<node>& pm_nodes)
+{
+ double lambda, dedicated_sun_distance;
+ int node_type;
+ node v, v_adj, dedicated_sun;
+ edge e;
+ DPoint new_pos,dedicated_sun_pos, adj_sun_pos;
+ List<DPoint> L;
+ ListIterator<double> lambdaIterator;
+
+ create_all_placement_sectors(G_mult_ptr,A_mult_ptr,E_mult_ptr,level);
+ forall_nodes(v,*G_mult_ptr[level])
+ {//for
+ node_type = (*A_mult_ptr[level])[v].get_type();
+ if(node_type == 3)
+ pm_nodes.pushBack(v);
+ else if(node_type == 2 || node_type == 4) //a planet_node or moon_node
+ {//else
+ L.clear();
+ dedicated_sun = (*A_mult_ptr[level])[v].get_dedicated_sun_node();
+ dedicated_sun_pos = (*A_mult_ptr[level])[dedicated_sun].get_position();
+ dedicated_sun_distance = (*A_mult_ptr[level])[v].get_dedicated_sun_distance();
+
+ if(init_placement_way == FMMMLayout::ipmAdvanced)
+ {
+ forall_adj_edges(e,v)
+ {
+ if(e->source() != v)
+ v_adj = e->source();
+ else
+ v_adj = e->target();
+ if( ( (*A_mult_ptr[level])[v].get_dedicated_sun_node() ==
+ (*A_mult_ptr[level])[v_adj].get_dedicated_sun_node() ) &&
+ ( (*A_mult_ptr[level])[v_adj].get_type() != 1 ) &&
+ ( (*A_mult_ptr[level])[v_adj].is_placed() ) )
+ {
+ new_pos = calculate_position(dedicated_sun_pos,(*A_mult_ptr[level])
+ [v_adj].get_position(),dedicated_sun_distance,
+ (*E_mult_ptr[level])[e].get_length());
+ L.pushBack(new_pos);
+ }
+ }
+ }
+ if ((*A_mult_ptr[level])[v].get_lambda_List_ptr()->empty())
+ {//special case
+ if(L.empty())
+ {
+ new_pos = create_random_pos(dedicated_sun_pos,(*A_mult_ptr[level])
+ [v].get_dedicated_sun_distance(),
+ (*A_mult_ptr[level])[v].get_angle_1(),
+ (*A_mult_ptr[level])[v].get_angle_2());
+ L.pushBack(new_pos);
+ }
+ }//special case
+ else
+ {//usual case
+ lambdaIterator = (*A_mult_ptr[level])[v].get_lambda_List_ptr()->begin();
+
+ forall_listiterators(node, adj_sun_ptr,*(*A_mult_ptr[level])[v].
+ get_neighbour_sun_node_List_ptr())
+ {
+ lambda = *lambdaIterator;
+ adj_sun_pos = (*A_mult_ptr[level])[*adj_sun_ptr].get_position();
+ new_pos = get_waggled_inbetween_position(dedicated_sun_pos,adj_sun_pos,
+ lambda);
+ L.pushBack(new_pos);
+ if(lambdaIterator != (*A_mult_ptr[level])[v].get_lambda_List_ptr()
+ ->rbegin())
+ lambdaIterator = (*A_mult_ptr[level])[v].get_lambda_List_ptr()
+ ->cyclicSucc(lambdaIterator);
+ }
+ }//usual case
+
+ (*A_mult_ptr[level])[v].set_position(get_barycenter_position(L));
+ (*A_mult_ptr[level])[v].place();
+ }//else
+ }//for
+}
+
+
+void Multilevel::create_all_placement_sectors(
+ Array<Graph*> &G_mult_ptr,
+ Array<NodeArray<NodeAttributes>*> &A_mult_ptr,
+ Array<EdgeArray<EdgeAttributes>*> &E_mult_ptr,
+ int level)
+{
+ node v_high, w_high, sun_node, v, ded_sun;
+ edge e_high;
+ List<DPoint> adj_pos;
+ double angle_1 = 0.0, angle_2 = 0.0, act_angle_1, act_angle_2, next_angle, min_next_angle = 0.0;
+ DPoint start_pos, end_pos;
+ int MAX = 10; //the biggest of at most MAX random selected sectors is choosen
+ int steps;
+ ListIterator<DPoint> it, next_pos_ptr;
+ bool first_angle;
+
+
+ forall_nodes(v_high,(*G_mult_ptr[level+1]))
+ {//forall
+ //find pos of adjacent nodes
+ adj_pos.clear();
+ DPoint v_high_pos ((*A_mult_ptr[level+1])[v_high].get_x(),
+ (*A_mult_ptr[level+1])[v_high].get_y());
+ forall_adj_edges(e_high,v_high)
+ if(!(*E_mult_ptr[level+1])[e_high].is_extra_edge())
+ {
+ if(v_high == e_high->source())
+ w_high = e_high->target();
+ else
+ w_high = e_high->source();
+
+ DPoint w_high_pos ((*A_mult_ptr[level+1])[w_high].get_x(),
+ (*A_mult_ptr[level+1])[w_high].get_y());
+ adj_pos.pushBack(w_high_pos);
+ }
+ if(adj_pos.empty()) //easy case
+ {
+ angle_1 = 0;
+ angle_2 = 6.2831853;
+ }
+ else if(adj_pos.size() == 1) //special case
+ {
+ //create angle_1
+ start_pos = *adj_pos.begin();
+ DPoint x_parallel_pos (v_high_pos.m_x + 1, v_high_pos.m_y);
+ angle_1 = angle(v_high_pos,x_parallel_pos,start_pos);
+ //create angle_2
+ angle_2 = angle_1 + Math::pi;
+ }
+ else //usual case
+ {//else
+ steps = 1;
+ it = adj_pos.begin();
+ do
+ {
+ //create act_angle_1
+ start_pos = *it;
+ DPoint x_parallel_pos (v_high_pos.m_x + 1, v_high_pos.m_y);
+ act_angle_1 = angle(v_high_pos,x_parallel_pos,start_pos);
+ //create act_angle_2
+ first_angle = true;
+
+ for(next_pos_ptr = adj_pos.begin();next_pos_ptr.valid();++next_pos_ptr)
+ {
+ next_angle = angle(v_high_pos,start_pos,*next_pos_ptr);
+
+ if(start_pos != *next_pos_ptr && (first_angle || next_angle <
+ min_next_angle))
+ {
+ min_next_angle = next_angle;
+ first_angle = false;
+ }
+ }
+ act_angle_2 = act_angle_1 + min_next_angle;
+ if((it == adj_pos.begin())||((act_angle_2-act_angle_1)>(angle_2-angle_1)))
+ {
+ angle_1 = act_angle_1;
+ angle_2 = act_angle_2;
+ }
+ if(it != adj_pos.rbegin())
+ it = adj_pos.cyclicSucc(it);
+ steps++;
+ }
+ while((steps <= MAX) && (it != adj_pos.rbegin()));
+
+ if(angle_1 == angle_2)
+ angle_2 = angle_1 + Math::pi;
+ }//else
+
+ //import angle_1 and angle_2 to the dedicated suns at level level
+ sun_node = (*A_mult_ptr[level+1])[v_high].get_lower_level_node();
+ (*A_mult_ptr[level])[sun_node].set_angle_1(angle_1);
+ (*A_mult_ptr[level])[sun_node].set_angle_2(angle_2);
+ }//forall
+
+ //import the angle values from the values of the dedicated sun nodes
+ forall_nodes(v,*G_mult_ptr[level])
+ {
+ ded_sun = (*A_mult_ptr[level])[v].get_dedicated_sun_node();
+ (*A_mult_ptr[level])[v].set_angle_1((*A_mult_ptr[level])[ded_sun].get_angle_1());
+ (*A_mult_ptr[level])[v].set_angle_2((*A_mult_ptr[level])[ded_sun].get_angle_2());
+ }
+}
+
+
+void Multilevel::set_initial_positions_of_pm_nodes(
+ int level,
+ int init_placement_way,
+ Array<NodeArray<NodeAttributes>*> &A_mult_ptr,
+ Array<EdgeArray<EdgeAttributes>*> &E_mult_ptr,
+ List<node>& pm_nodes)
+{
+ double moon_dist, sun_dist, lambda;
+ node v_adj, sun_node;
+ edge e;
+ DPoint sun_pos, moon_pos, new_pos, adj_sun_pos;
+ List<DPoint> L;
+ ListIterator<double> lambdaIterator;
+
+ forall_listiterators(node,v_ptr,pm_nodes)
+ {//forall
+ L.clear();
+ sun_node = (*A_mult_ptr[level])[*v_ptr].get_dedicated_sun_node();
+ sun_pos = (*A_mult_ptr[level])[sun_node].get_position();
+ sun_dist = (*A_mult_ptr[level])[*v_ptr].get_dedicated_sun_distance();
+
+ if(init_placement_way == FMMMLayout::ipmAdvanced)
+ {//if
+ forall_adj_edges(e,*v_ptr)
+ {
+ if(e->source() != *v_ptr)
+ v_adj = e->source();
+ else
+ v_adj = e->target();
+ if( (!(*E_mult_ptr[level])[e].is_moon_edge()) &&
+ ( (*A_mult_ptr[level])[*v_ptr].get_dedicated_sun_node() ==
+ (*A_mult_ptr[level])[v_adj].get_dedicated_sun_node() ) &&
+ ( (*A_mult_ptr[level])[v_adj].get_type() != 1 ) &&
+ ( (*A_mult_ptr[level])[v_adj].is_placed() ) )
+ {
+ new_pos = calculate_position(sun_pos,(*A_mult_ptr[level])[v_adj].
+ get_position(),sun_dist,(*E_mult_ptr[level])
+ [e].get_length());
+ L.pushBack(new_pos);
+ }
+ }
+ }//if
+ forall_listiterators(node, moon_node_ptr,*(*A_mult_ptr[level])[*v_ptr].
+ get_dedicated_moon_node_List_ptr())
+ {
+ moon_pos = (*A_mult_ptr[level])[*moon_node_ptr].get_position();
+ moon_dist = (*A_mult_ptr[level])[*moon_node_ptr].get_dedicated_sun_distance();
+ lambda = sun_dist/moon_dist;
+ new_pos = get_waggled_inbetween_position(sun_pos,moon_pos,lambda);
+ L.pushBack(new_pos);
+ }
+
+ if (!(*A_mult_ptr[level])[*v_ptr].get_lambda_List_ptr()->empty())
+ {
+ lambdaIterator = (*A_mult_ptr[level])[*v_ptr].get_lambda_List_ptr()->begin();
+
+ forall_listiterators(node,adj_sun_ptr,*(*A_mult_ptr[level])[*v_ptr].
+ get_neighbour_sun_node_List_ptr())
+ {
+ lambda = *lambdaIterator;
+ adj_sun_pos = (*A_mult_ptr[level])[*adj_sun_ptr].get_position();
+ new_pos = get_waggled_inbetween_position(sun_pos,adj_sun_pos,lambda);
+ L.pushBack(new_pos);
+ if(lambdaIterator != (*A_mult_ptr[level])[*v_ptr].get_lambda_List_ptr()
+ ->rbegin())
+ lambdaIterator = (*A_mult_ptr[level])[*v_ptr].get_lambda_List_ptr()
+ ->cyclicSucc(lambdaIterator);
+ }
+ }
+
+ (*A_mult_ptr[level])[*v_ptr].set_position(get_barycenter_position(L));
+ (*A_mult_ptr[level])[*v_ptr].place();
+ }//forall
+}
+
+
+inline DPoint Multilevel::create_random_pos(DPoint center,double radius,double angle_1,
+ double angle_2)
+{
+ const int BILLION = 1000000000;
+ DPoint new_point;
+ double rnd = double(randomNumber(1,BILLION)+1)/(BILLION+2);//rand number in (0,1)
+ double rnd_angle = angle_1 +(angle_2-angle_1)*rnd;
+ double dx = cos(rnd_angle) * radius;
+ double dy = sin(rnd_angle) * radius;
+ new_point.m_x = center.m_x + dx ;
+ new_point.m_y = center.m_y + dy;
+ return new_point;
+}
+
+
+inline DPoint Multilevel::get_waggled_inbetween_position(DPoint s, DPoint t, double lambda)
+{
+ const double WAGGLEFACTOR = 0.05;
+ const int BILLION = 1000000000;
+ DPoint inbetween_point;
+ inbetween_point.m_x = s.m_x + lambda*(t.m_x - s.m_x);
+ inbetween_point.m_y = s.m_y + lambda*(t.m_y - s.m_y);
+ double radius = WAGGLEFACTOR * (t-s).norm();
+ double rnd = double(randomNumber(1,BILLION)+1)/(BILLION+2);//rand number in (0,1)
+ double rand_radius = radius * rnd;
+ return create_random_pos(inbetween_point,rand_radius,0,6.2831853);
+}
+
+
+inline DPoint Multilevel::get_barycenter_position(List<DPoint>& L)
+{
+ DPoint sum (0,0);
+ DPoint barycenter;
+
+ forall_listiterators(DPoint, act_point_ptr,L)
+ sum = sum + (*act_point_ptr);
+ barycenter.m_x = sum.m_x/L.size();
+ barycenter.m_y = sum.m_y/L.size();
+ return barycenter;
+}
+
+
+inline DPoint Multilevel::calculate_position(DPoint P, DPoint Q, double dist_P, double dist_Q)
+{
+ double dist_PQ = (P-Q).norm();
+ double lambda = (dist_P + (dist_PQ - dist_P - dist_Q)/2)/dist_PQ;
+ return get_waggled_inbetween_position(P,Q,lambda);
+}
+
+
+void Multilevel::delete_multilevel_representations(
+ Array<Graph*> &G_mult_ptr,
+ Array<NodeArray<NodeAttributes>*> &A_mult_ptr,
+ Array<EdgeArray<EdgeAttributes>*> &E_mult_ptr,
+ int max_level)
+{
+ for(int i=1; i<= max_level; i++)
+ {
+ delete G_mult_ptr[i];
+ delete A_mult_ptr[i];
+ delete E_mult_ptr[i];
+ }
+}
+
+
+double Multilevel::angle(DPoint& P, DPoint& Q, DPoint& R)
+{
+ double dx1 = Q.m_x - P.m_x;
+ double dy1 = Q.m_y - P.m_y;
+ double dx2 = R.m_x - P.m_x;
+ double dy2 = R.m_y - P.m_y;
+ double fi;//the angle
+
+ if ((dx1 == 0 && dy1 == 0) || (dx2 == 0 && dy2 == 0))
+ cout<<"Multilevel::angle()"<<endl;
+
+ double norm = (dx1*dx1+dy1*dy1)*(dx2*dx2+dy2*dy2);
+ double cosfi = (dx1*dx2+dy1*dy2) / sqrt(norm);
+
+ if (cosfi >= 1.0 ) fi = 0;
+ if (cosfi <= -1.0 ) fi = Math::pi;
+ else
+ {
+ fi = acos(cosfi);
+ if (dx1*dy2 < dy1*dx2) fi = -fi;
+ if (fi < 0) fi += 2*Math::pi;
+ }
+ return fi;
+}
+
+}//namespace ogdf
diff --git a/ogdf/energybased/Multilevel.h b/ogdf/energybased/Multilevel.h
new file mode 100644
index 0000000..ba2268d
--- /dev/null
+++ b/ogdf/energybased/Multilevel.h
@@ -0,0 +1,247 @@
+/*
+ * $Revision: 2559 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-06 15:04:28 +0200 (Fr, 06. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of class Multlevel (used by FMMMLayout).
+ *
+ * \author Stefan Hachul
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_MULTILEVEL_H
+#define OGDF_MULTILEVEL_H
+
+#include "../basic/Graph.h"
+#include "../basic/NodeArray.h"
+#include "../basic/EdgeArray.h"
+#include "../basic/List.h"
+#include "Edge.h"
+#include "../internal/energybased/NodeAttributes.h"
+#include "../internal/energybased/EdgeAttributes.h"
+
+
+namespace ogdf {
+
+class Multilevel
+{
+public:
+
+ Multilevel() { } //constructor
+ ~Multilevel() { } //destructor
+
+ //The multilevel representations *G_mult_ptr/*A_mult_ptr/*E_mult_ptr for
+ //G/A/E are created. The maximum multilevel is calculated, too.
+ void create_multilevel_representations(Graph& G,NodeArray<NodeAttributes>& A,
+ EdgeArray <EdgeAttributes>& E,
+ int rand_seed,
+ int galaxy_choice,
+ int min_Graph_size,
+ int rand_tries,
+ Array<Graph*> &G_mult_ptr,
+ Array<NodeArray<NodeAttributes>*> &A_mult_ptr,
+ Array<EdgeArray<EdgeAttributes>*> &E_mult_ptr,
+ int & max_level);
+
+ //The initial placement of the nodes at multilevel level are created by the
+ //placements of the nodes of the graphs at the lower level (if init_placement_way
+ //is 0) or additionally using information of the actual level ( if
+ //init_placement_way == 1). Precondition: level < max_level
+ void find_initial_placement_for_level(
+ int level,
+ int init_placement_way,
+ Array<Graph*> &G_mult_ptr,
+ Array<NodeArray <NodeAttributes>*> &A_mult_ptr,
+ Array<EdgeArray<EdgeAttributes>*> &E_mult_ptr);
+
+ //Free dynamically allocated memory.
+ void delete_multilevel_representations(
+ Array<Graph*> &G_mult_ptr,
+ Array<NodeArray<NodeAttributes>*> &A_mult_ptr,
+ Array<EdgeArray<EdgeAttributes>*> &E_mult_ptr,
+ int max_level);
+
+private:
+
+ //This function returns true if act_level = 0 or if act_level >0 and the
+ //number of edges at the actual level is <= 80% of the number of edges of the
+ //previous level or if the actual edgenumber is >80% of the number of edges of the
+ //previous level, but bad_edgecounter is <= 5. In this case edgecounter is
+ //incremented. In all other cases false is returned.
+ bool edgenumbersum_of_all_levels_is_linear(
+ Array<Graph*> &G_mult_ptr,
+ int act_level,
+ int&bad_edgenr_counter);
+
+ //The multilevel values of *A_mult_ptr[level][v] are set to the default values
+ //for all nodes v in *G_mult_ptr[level]
+ void init_multilevel_values(
+ Array<Graph*> &G_mult_ptr,
+ Array<NodeArray<NodeAttributes>*> &A_mult_ptr,
+ Array<EdgeArray<EdgeAttributes>*> &E_mult_ptr,
+ int level);
+
+ //The nodeset(galaxy) of *G_mult_ptr[act_level] is partitioned in s,p,pm,m nodes.
+ //The dedicated s,p,pm,m nodes define a subgraph (called solar system).
+ //For each solar system a new node is created in *G_mult_ptr[act_level+1] and
+ //it is linked with the corresponding sun node at act_level; the mass of this node
+ //is set to the mass of the solar system. Additionally for each node in *G_mult_ptr
+ //[act_level] the dedicated sun node and the distance to its dedicates sun node is
+ //calculated
+ void partition_galaxy_into_solar_systems(
+ Array<Graph*> &G_mult_ptr,
+ Array<NodeArray<NodeAttributes>*> &A_mult_ptr,
+ Array<EdgeArray<EdgeAttributes>*> &E_mult_ptr,
+ int rand_seed,
+ int galaxy_choice,
+ int random_tries,
+ int act_level);
+
+ //The sun and planet nodes are created by choosing the sun nodes randomly with
+ //uniform or weighted probability (depending on galaxy_choice)
+ void create_suns_and_planets(
+ Array<Graph*> &G_mult_ptr,
+ Array<NodeArray<NodeAttributes>*> &A_mult_ptr,
+ Array<EdgeArray<EdgeAttributes>*> &E_mult_ptr,
+ int rand_seed,
+ int galaxy_choice,
+ int random_tries,
+ int act_level);
+
+ //Partitions the nodes of *G_mult_ptr[act_level] that have not been assigned yet,
+ //to moon nodes of a nearest planet or pm node and identify this planet as a
+ //pm-node if this has not been done before.
+ void create_moon_nodes_and_pm_nodes(
+ Array<Graph*> &G_mult_ptr,
+ Array<NodeArray<NodeAttributes>*> &A_mult_ptr,
+ Array<EdgeArray<EdgeAttributes>*> &E_mult_ptr,
+ int act_level);
+
+ //Using information generated in partition_galaxy_into_solar_systems we
+ //create the edge set of *G_mult_ptr[act_level+1] and for each node at act_level+1
+ //the list of sun nodes of neighbouring sun systems and the corresponding lambda
+ //values.
+ void collaps_solar_systems(
+ Array<Graph*> &G_mult_ptr,
+ Array<NodeArray<NodeAttributes>*> &A_mult_ptr,
+ Array<EdgeArray<EdgeAttributes>*> &E_mult_ptr,
+ int act_level);
+
+ //The mass of all nodes at level act_level+1 is set to the mass of its dedicated
+ //solar_system at level act_level.
+ void calculate_mass_of_collapsed_nodes(
+ Array<Graph*> &G_mult_ptr,
+ Array<NodeArray<NodeAttributes>*> &A_mult_ptr,
+ int act_level);
+
+ //The edges , new_edgelength and the lambda lists at level act_level+1 are created
+ //(the graph may contain parallel edges afterwards).
+ void create_edges_edgedistances_and_lambda_Lists(
+ Array<Graph*> &G_mult_ptr,
+ Array<NodeArray<NodeAttributes>*> &A_mult_ptr,
+ Array<EdgeArray<EdgeAttributes>*> &E_mult_ptr,
+ EdgeArray<double>& new_edgelength,
+ int act_level);
+
+ //Parallel edges at level act_level+1 are deleted and the edgelength of the
+ //remaining edge is set to the average edgelength of all its parallel edges.
+ void delete_parallel_edges_and_update_edgelength(
+ Array<Graph*> &G_mult_ptr,
+ Array<EdgeArray<EdgeAttributes>*> &E_mult_ptr,
+ EdgeArray<double>& new_edgelength,
+ int act_level);
+
+ //The initial positions of all sun_nodes at level level are set.
+ void set_initial_positions_of_sun_nodes(
+ int level,
+ Array<Graph*> &G_mult_ptr,
+ Array<NodeArray<NodeAttributes>*> &A_mult_ptr);
+
+ //The initial positions of the planet/moon_nodes at level level are calculated here
+ //and a list of all pm_nodes is returned.
+ void set_initial_positions_of_planet_and_moon_nodes(
+ int level,
+ int init_placement_way,
+ Array<Graph*> &G_mult_ptr,
+ Array<NodeArray<NodeAttributes>*> &A_mult_ptr,
+ Array<EdgeArray<EdgeAttributes>*> &E_mult_ptr,
+ List<node> &pm_nodes);
+
+ //The values of angle_1 and angle_2 that restrict the area of the placement for
+ //all nodes that are not adjacent to other solar systems are created for all nodes
+ //at multilevel level.
+ void create_all_placement_sectors(
+ Array<Graph*> &G_mult_ptr,
+ Array<NodeArray<NodeAttributes>*> &A_mult_ptr,
+ Array<EdgeArray<EdgeAttributes>*> &E_mult_ptr,
+ int level);
+
+ //The initial positions of the pm nodes are calculated by the position of the
+ //dedicated sun and moon_nodes.
+ void set_initial_positions_of_pm_nodes(
+ int level,
+ int init_placement_way,
+ Array<NodeArray<NodeAttributes>*> &A_mult_ptr,
+ Array<EdgeArray<EdgeAttributes>*> &E_mult_ptr,
+ List<node>& pm_nodes);
+
+ //Returns a random point with radius radius between angle_1 and angle_2.
+ DPoint create_random_pos(DPoint center, double radius, double angle_1, double angle_2);
+
+ //Returns roughtly the position s +lambda*(t-s) + some random waggling.
+ DPoint get_waggled_inbetween_position(DPoint s, DPoint t, double lambda);
+
+ //Returns the barycenter position of all points in L (the mass of all point is
+ //regarded as equal).
+ DPoint get_barycenter_position(List<DPoint>& L);
+
+ //Creates a waggled position on the line PQ, depending on dist_P and dist_Q
+ //needed in case init_placement_way() == 1.
+ DPoint calculate_position(DPoint P,DPoint Q, double dist_P, double dist_Q);
+
+ //Calculates the angle between PQ and PS in [0,2pi)
+ double angle(DPoint& P, DPoint& Q, DPoint& R);
+};
+
+}//namespace ogdf
+#endif
+
diff --git a/ogdf/energybased/Node.h b/ogdf/energybased/Node.h
new file mode 100644
index 0000000..f95f8a0
--- /dev/null
+++ b/ogdf/energybased/Node.h
@@ -0,0 +1,99 @@
+/*
+ * $Revision: 2559 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-06 15:04:28 +0200 (Fr, 06. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Auxiliary data structure for (node,int) pair.
+ *
+ * \author Stefan Hachul
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+//Data structure for representing nodes and an int value (needed for class ogdf/list)
+//to perform bucket sort.
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_NODE_H
+#define OGDF_NODE_H
+
+#include "../basic/Graph.h"
+#include "../basic/Graph_d.h"
+#include <iostream>
+
+namespace ogdf {
+
+ class Node
+ {
+ friend int value(const Node& A) { return A.value; }
+
+ friend ostream &operator<< (ostream & output,const Node & A)
+ {
+ output <<"node index ";
+ if(A.vertex == NULL)
+ output<<"nil";
+ else
+ output<<A.vertex->index();
+ output<<" value "<< A.value;
+ return output;
+ }
+
+ friend istream &operator>> (istream & input,Node & A) {
+ input >> A.value;
+ return input;
+ }
+
+ public:
+ Node() { vertex = NULL; value = 0; } //constructor
+ ~Node() { } //destructor
+
+
+ void set_Node(node v,int a) { vertex = v; value = a; }
+ int get_value() const { return value; }
+ node get_node() const { return vertex; }
+
+ private:
+ node vertex;
+ int value ;
+ };
+
+}//namespace ogdf
+#endif
+
+
diff --git a/ogdf/energybased/PQueue.h b/ogdf/energybased/PQueue.h
new file mode 100644
index 0000000..f4170b2
--- /dev/null
+++ b/ogdf/energybased/PQueue.h
@@ -0,0 +1,176 @@
+/*
+ * $Revision: 2559 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-06 15:04:28 +0200 (Fr, 06. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of class PQueue (priority queue).
+ *
+ * \author Stefan Hachul
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_PQUEUE_H
+#define OGDF_PQUEUE_H
+
+#include "../basic/List.h"
+
+namespace ogdf {
+
+//Needed for storing entries of the heap.
+class HelpRecord
+{
+public:
+ HelpRecord() { } //constructor
+ ~HelpRecord(){ } //destructor
+
+ void set_ListIterator(ListIterator<PackingRowInfo>& it) { iterator = it; }
+ void set_value (double v) { value = v; }
+ ListIterator<PackingRowInfo> get_ListIterator() const { return iterator; }
+ double get_value() const { return value; }
+
+private:
+ double value;
+ ListIterator<PackingRowInfo> iterator;
+};
+
+class PQueue
+{
+ //Helping data structure that is a priority queue (heap) and holds double values
+ //(as comparison values) and iterators of type ListIterator<PackingRowInfo>
+ //as contents. It is needed in class MAARPacking for the Best_Fit insert strategy.
+
+public:
+
+ PQueue() { P.clear(); } //constructor
+ ~PQueue(){ } //destructor
+
+ //Inserts content with value value into the priority queue and restores the heap.
+ void insert(double value, ListIterator<PackingRowInfo> iterator)
+ {
+ HelpRecord h;
+ h.set_value(value);
+ h.set_ListIterator(iterator);
+ P.pushBack(h);
+ //reheap bottom up
+ reheap_bottom_up(P.size()-1);
+ }
+
+ //Deletes the element with the minimum value from the queue and restores
+ //the heap.
+ void del_min()
+ {
+ if(P.size() < 1)
+ cout<<"Error PQueue:: del_min() ; Heap is empty"<<endl;
+ else
+ {
+ //last element becomes first element
+ P.popFront();
+ if(!P.empty())
+ {
+ P.pushFront(P.back());
+ P.popBack();
+ //reheap top down
+ reheap_top_down(0);
+ }
+ }
+ }
+
+ //Returns the content with the minimum value.
+ ListIterator<PackingRowInfo> find_min()
+ {
+ OGDF_ASSERT(P.size() >= 1);
+ //if(P.size() < 1)
+ // cout<<"Error PQueue:: find_min() ; Heap is empty"<<endl;
+ //else
+ return P.front().get_ListIterator();
+ }
+
+private:
+ List<HelpRecord> P;//the priority queue;
+
+ //Restores the heap property in P starting from position i bottom up.
+ void reheap_bottom_up(int i)
+ {
+ int parent = (i-1)/2;
+
+ if((i != 0) && ((*P.get(parent)).get_value() > (*P.get(i)).get_value()))
+ {
+ exchange(i,parent);
+ reheap_bottom_up(parent);
+ }
+ }
+
+ //Restores the heap property in P starting from position i top down.
+ void reheap_top_down(int i)
+ {
+ int smallest = i;
+ int l = 2*i+1;
+ int r = 2*i+2;
+
+ if((l <= P.size()-1) && ((*P.get(l)).get_value() < (*P.get(i)).get_value()))
+ smallest = l;
+ else
+ smallest = i;
+ if((r <= P.size()-1) && ((*P.get(r)).get_value() < (*P.get(smallest)).get_value()))
+ smallest = r;
+ if(smallest != i)//exchange and recursion
+ {
+ exchange(i,smallest);
+ reheap_top_down(smallest);
+ }
+ }
+
+ //Exchanges heap entries at positions i and j.
+ void exchange(int i, int j)
+ {
+ HelpRecord h = *P.get(i);
+ *P.get(i) = *P.get(j);
+ *P.get(j) = h;
+ }
+};
+
+}//namespace ogdf
+#endif
+
+
+
+
diff --git a/ogdf/energybased/PackingRowInfo.h b/ogdf/energybased/PackingRowInfo.h
new file mode 100644
index 0000000..b80ce60
--- /dev/null
+++ b/ogdf/energybased/PackingRowInfo.h
@@ -0,0 +1,105 @@
+/*
+ * $Revision: 2559 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-06 15:04:28 +0200 (Fr, 06. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of class PackingRowInfo.
+ *
+ * \author Stefan Hachul
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_PACKING_ROW_INFO_H
+#define OGDF_PACKING_ROW_INFO_H
+
+#include "../basic/basic.h"
+
+namespace ogdf {
+
+ class PackingRowInfo
+ {
+ //Helping data structure for MAARPacking.
+
+ //Outputstream for PackingRowInfo
+ friend ostream &operator<< (ostream & output, const PackingRowInfo & A)
+ {
+ output <<" max_height "<<A.max_height<<" total_width "<<A.total_width<<" row_index "
+ << A.row_index;
+ return output;
+ }
+
+ //Inputstream for PackingRowInfo
+ friend istream &operator>> (istream & input, PackingRowInfo & A)
+ {
+ input >>A.max_height>>A.total_width>>A.row_index;
+ return input;
+ }
+
+ public:
+
+ PackingRowInfo() //constructor
+ {
+ total_width = 0;
+ max_height = 0;
+ row_index = 0;
+ }
+
+ ~PackingRowInfo() { } //destructor
+
+ void set_max_height(double h) { max_height = h; }
+ void set_total_width(double w) { total_width = w; }
+ void set_row_index(int i) { row_index = i; }
+
+ double get_max_height() { return max_height; }
+ double get_total_width() { return total_width; }
+ int get_row_index() { return row_index; }
+
+ private:
+ double max_height; //the maximum height of a rectangle placed in this row
+ double total_width; //the sum of the width of all rectsngles in this row
+ int row_index; //the index of the row (first row in packing has index 0)
+
+ };
+
+}//namespace ogdf
+#endif
+
+
diff --git a/ogdf/energybased/Rectangle.h b/ogdf/energybased/Rectangle.h
new file mode 100644
index 0000000..f3c75ee
--- /dev/null
+++ b/ogdf/energybased/Rectangle.h
@@ -0,0 +1,240 @@
+/*
+ * $Revision: 2559 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-06 15:04:28 +0200 (Fr, 06. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of class Rectangle.
+ *
+ * \author Stefan Hachul
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_RECTANGLE_H
+#define OGDF_RECTANGLE_H
+
+#include "../basic/geometry.h"
+#include <iostream>
+
+namespace ogdf {
+
+ class Rectangle
+ {
+ //Helping data structure for packing rectangles; The width, height and the position
+ //of the down left corner of the tight surroundig rectangle is represented for each
+ //connected component of the graph.
+
+ //Outputstream for Rectangle.
+ friend ostream &operator<< (ostream & output, const Rectangle & A)
+ {
+ output <<"width: "<< A.width<<" height: "<<A.height<<" old dlc_position: "
+ <<A.old_down_left_corner_position<<" new dlc_position: "
+ <<A.new_down_left_corner_position<<" coponenet_index: "<<A.component_index;
+ if(A.tipped_over == true)
+ output<<" is tipped_over";
+ return output;
+ }
+
+ //Inputstream for Rectangle.
+ friend istream &operator>> (istream & input, Rectangle & A)
+ {
+ input >>A.width;
+ return input;
+ }
+
+ public:
+
+ Rectangle() //constructor
+ {
+ old_down_left_corner_position.m_x = 0;
+ old_down_left_corner_position.m_y = 0;
+ new_down_left_corner_position.m_x = 0;
+ new_down_left_corner_position.m_y = 0;
+ width = 0;
+ height = 0;
+ component_index = -1;
+ tipped_over = false;
+ }
+
+ ~Rectangle() { } //destructor
+
+ void set_rectangle (double w, double h, double old_dlc_x_pos,double
+ old_dlc_y_pos,int comp_index)
+ {
+ width = w;
+ height = h;
+ old_down_left_corner_position.m_x = old_dlc_x_pos;
+ old_down_left_corner_position.m_y = old_dlc_y_pos;
+ component_index = comp_index;
+ tipped_over = false;
+ }
+
+ void set_old_dlc_position(DPoint dlc_pos){old_down_left_corner_position = dlc_pos;}
+ void set_new_dlc_position(DPoint dlc_pos){new_down_left_corner_position = dlc_pos;}
+ void set_width(double w) {width = w;}
+ void set_height(double h) {height = h;}
+ void set_component_index (int comp_index) {component_index = comp_index;}
+ void tipp_over()
+ {
+ if(tipped_over == false)
+ tipped_over = true;
+ else
+ tipped_over = false;
+ }
+
+ DPoint get_old_dlc_position() const { return old_down_left_corner_position; }
+ DPoint get_new_dlc_position() const { return new_down_left_corner_position; }
+ double get_width() const {return width;}
+ double get_height() const {return height;}
+ int get_component_index() const {return component_index;}
+ bool is_tipped_over() const {return tipped_over;}
+
+ private:
+ DPoint old_down_left_corner_position;//down left corner of the tight surround. rect.
+ DPoint new_down_left_corner_position;//new calculated down left corner of ...
+ double width; //width of the surround. rect.
+ double height; //height of the surround. rect.
+ int component_index; //the index of the related connected component
+ bool tipped_over; //indicates if this rectangle has been tipped over in the
+ //packing step
+
+ };
+
+
+ //Needed for sorting algorithms in ogdf/List and ogdf/Array.
+ class RectangleComparerHeight
+ {
+ public:
+ RectangleComparerHeight() { }
+ ~RectangleComparerHeight() { }
+
+ bool less(const Rectangle& A,const Rectangle & B) const
+ {
+ if(A.get_height() > B.get_height() )
+ return true;
+ else
+ return false;
+ }
+
+ bool leq(const Rectangle& A,const Rectangle & B) const
+ {
+ if(A.get_height() >= B.get_height() )
+ return true;
+ else
+ return false;
+ }
+
+ bool equal(const Rectangle& A,const Rectangle & B) const
+ {
+ if(A.get_height() == B.get_height() )
+ return true;
+ else
+ return false;
+ }
+ };
+
+
+ class RectangleComparerWidth
+ {
+ public:
+ RectangleComparerWidth() { }
+ ~RectangleComparerWidth() { }
+
+ bool less(const Rectangle& A,const Rectangle & B) const
+ {
+ if(A.get_width() > B.get_width() )
+ return true;
+ else
+ return false;
+ }
+
+ bool leq(const Rectangle& A,const Rectangle & B) const
+ {
+ if(A.get_width() >= B.get_width() )
+ return true;
+ else
+ return false;
+ }
+
+ bool equal(const Rectangle& A,const Rectangle & B) const
+ {
+ if(A.get_width() == B.get_width() )
+ return true;
+ else
+ return false;
+ }
+ };
+
+
+ class RectangleComparerArea
+ {
+ public:
+ RectangleComparerArea() { }
+ ~RectangleComparerArea() { }
+
+ bool less(const Rectangle& A,const Rectangle & B) const
+ {
+ if(A.get_height() * A.get_width() > B.get_height() * B.get_width() )
+ return true;
+ else
+ return false;
+ }
+
+ bool leq(const Rectangle& A,const Rectangle & B) const
+ {
+ if(A.get_height() * A.get_width() >= B.get_height() * B.get_width() )
+ return true;
+ else
+ return false;
+ }
+
+ bool equal(const Rectangle& A,const Rectangle & B) const
+ {
+ if(A.get_height() * A.get_width() == B.get_height() * B.get_width() )
+ return true;
+ else
+ return false;
+ }
+ };
+
+}//namespace ogdf
+#endif
+
+
diff --git a/ogdf/energybased/Set.cpp b/ogdf/energybased/Set.cpp
new file mode 100644
index 0000000..2640b55
--- /dev/null
+++ b/ogdf/energybased/Set.cpp
@@ -0,0 +1,241 @@
+/*
+ * $Revision: 2552 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-05 16:45:20 +0200 (Do, 05. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of class Set.
+ *
+ * \author Stefan Hachul
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "Set.h"
+
+namespace ogdf {
+
+Set::Set()
+{
+ last_selectable_index_of_S_node = -1;
+ S_node = NULL;
+ using_S_node = false;
+}
+
+
+Set::~Set()
+{
+ if (using_S_node) delete [] S_node;
+}
+
+
+void Set::set_seed(int rand_seed)
+{
+ srand(rand_seed);
+}
+
+
+void Set::init_node_set(Graph& G)
+{
+ using_S_node = true;
+ node v;
+
+ S_node = new node[G.numberOfNodes()];
+ position_in_node_set.init(G);
+
+ forall_nodes(v,G)
+ {
+ S_node[v->index()] = v;
+ position_in_node_set[v] = v->index();
+ }
+ last_selectable_index_of_S_node = G.numberOfNodes()-1;
+}
+
+
+bool Set::empty_node_set()
+{
+ if(last_selectable_index_of_S_node < 0)
+ return true;
+ else
+ return false;
+}
+
+
+bool Set::is_deleted(node v)
+{
+ if (position_in_node_set[v] > last_selectable_index_of_S_node )
+ return true;
+ else
+ return false;
+}
+
+
+void Set::delete_node(node del_node)
+{
+ int del_node_index = position_in_node_set[del_node];
+ node last_selectable_node = S_node[last_selectable_index_of_S_node];
+
+ S_node[last_selectable_index_of_S_node] = del_node;
+ S_node[del_node_index] = last_selectable_node;
+ position_in_node_set[del_node] = last_selectable_index_of_S_node;
+ position_in_node_set[last_selectable_node] = del_node_index;
+ last_selectable_index_of_S_node -=1;
+}
+
+
+//---------------- for set of nodes with uniform probability -------------------
+
+node Set::get_random_node()
+{
+ int rand_index = randomNumber(0,last_selectable_index_of_S_node);
+ node random_node = S_node[rand_index];
+ node last_selectable_node = S_node[last_selectable_index_of_S_node];
+
+ S_node[last_selectable_index_of_S_node] = random_node;
+ S_node[rand_index] = last_selectable_node;
+ position_in_node_set[random_node] = last_selectable_index_of_S_node;
+ position_in_node_set[last_selectable_node] = rand_index;
+ last_selectable_index_of_S_node -=1;
+ return random_node;
+}
+
+
+//---------------- for set of nodes with weighted probability ------------------
+
+void Set::init_node_set(Graph& G,NodeArray<NodeAttributes>& A)
+{
+ node v,v_adj;
+ edge e_adj;
+
+ init_node_set(G);
+ mass_of_star.init(G);
+ forall_nodes(v,G)
+ {
+ mass_of_star[v] = A[v].get_mass();
+ forall_adj_edges(e_adj, v)
+ {
+ if(e_adj->source() != v)
+ v_adj = e_adj->source();
+ else
+ v_adj = e_adj->target();
+ mass_of_star[v] += A[v_adj].get_mass();
+ }
+ }
+}
+
+//---------------- for set of nodes with ``lower mass'' probability --------------
+
+node Set::get_random_node_with_lowest_star_mass(int rand_tries)
+{
+ int rand_index = 0, new_rand_index, min_mass = 0;
+ int i = 1;
+ node random_node = node(), new_rand_node,last_trie_node,last_selectable_node;
+
+ //randomly select rand_tries distinct!!! nodes from S_node and select the one
+ //with the lowest mass
+
+ int last_trie_index = last_selectable_index_of_S_node;
+ while( (i<= rand_tries) && (last_trie_index >= 0) )
+ {//while
+ last_trie_node = S_node[last_trie_index];
+ new_rand_index = randomNumber(0,last_trie_index);
+ new_rand_node = S_node[new_rand_index];
+ S_node[last_trie_index] = new_rand_node;
+ S_node[new_rand_index] = last_trie_node;
+ position_in_node_set[new_rand_node] = last_trie_index;
+ position_in_node_set[last_trie_node] = new_rand_index;
+
+ if( (i == 1) || (min_mass > mass_of_star[S_node[last_trie_index]]) )
+ {
+ rand_index = last_trie_index;
+ random_node = S_node[last_trie_index];
+ min_mass = mass_of_star[random_node];
+ }
+ i++;
+ last_trie_index -=1;
+ }//while
+
+ //now rand_index and random_node have been fixed
+ last_selectable_node = S_node[last_selectable_index_of_S_node];
+ S_node[last_selectable_index_of_S_node] = random_node;
+ S_node[rand_index] = last_selectable_node;
+ position_in_node_set[random_node] = last_selectable_index_of_S_node;
+ position_in_node_set[last_selectable_node] = rand_index;
+ last_selectable_index_of_S_node -=1;
+ return random_node;
+}
+
+
+//---------------- for set of nodes with ``higher mass'' probability --------------
+
+node Set::get_random_node_with_highest_star_mass(int rand_tries)
+{
+ int rand_index = 0, new_rand_index, min_mass = 0;
+ int i = 1;
+ node random_node = node(), new_rand_node,last_trie_node,last_selectable_node;
+
+ //randomly select rand_tries distinct!!! nodes from S_node and select the one
+ //with the lowest mass
+
+ int last_trie_index = last_selectable_index_of_S_node;
+ while( (i<= rand_tries) && (last_trie_index >= 0) )
+ {//while
+ last_trie_node = S_node[last_trie_index];
+ new_rand_index = randomNumber(0,last_trie_index);
+ new_rand_node = S_node[new_rand_index];
+ S_node[last_trie_index] = new_rand_node;
+ S_node[new_rand_index] = last_trie_node;
+ position_in_node_set[new_rand_node] = last_trie_index;
+ position_in_node_set[last_trie_node] = new_rand_index;
+
+ if( (i == 1) || (min_mass < mass_of_star[S_node[last_trie_index]]) )
+ {
+ rand_index = last_trie_index;
+ random_node = S_node[last_trie_index];
+ min_mass = mass_of_star[random_node];
+ }
+ i++;
+ last_trie_index -=1;
+ }//while
+
+ //now rand_index and random_node have been fixed
+ last_selectable_node = S_node[last_selectable_index_of_S_node];
+ S_node[last_selectable_index_of_S_node] = random_node;
+ S_node[rand_index] = last_selectable_node;
+ position_in_node_set[random_node] = last_selectable_index_of_S_node;
+ position_in_node_set[last_selectable_node] = rand_index;
+ last_selectable_index_of_S_node -=1;
+ return random_node;
+}
+
+}//namespace ogdf
diff --git a/ogdf/energybased/Set.h b/ogdf/energybased/Set.h
new file mode 100644
index 0000000..9d637f5
--- /dev/null
+++ b/ogdf/energybased/Set.h
@@ -0,0 +1,131 @@
+/*
+ * $Revision: 2559 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-06 15:04:28 +0200 (Fr, 06. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of class Set.
+ *
+ * \author Stefan Hachul
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_SET_H
+#define OGDF_SET_H
+
+#include "../basic/List.h"
+#include "../basic/Graph.h"
+#include "../basic/NodeArray.h"
+#include "../internal/energybased/NodeAttributes.h"
+
+namespace ogdf {
+
+ class Set
+ {
+ //Helping data structure that holds set S_node of nodes in the range [0,
+ //G.number_of_nodes()-1] (needed for class Multilevel) for randomly choosing nodes
+ //(with uniform or weighted probability!)
+
+ public:
+
+ Set(); //constructor
+ ~Set(); //destructor
+
+ void set_seed(int rand_seed); //the the random seed to rand_seed
+
+
+ //---------------------- for set of nodes---------------------------------------
+
+ //Inits S_node[0,...,G.number_of_nodes()-1] and stores the i-th node of P
+ //at position S_node[i] and in position_in_node_set for each node its index in
+ //S_node.
+ void init_node_set(Graph& G);
+
+ //Returns whether S_node is empty or not.
+ bool empty_node_set();
+
+ //Returns true if and only if v is deleted from S_node.
+ bool is_deleted(node v);
+
+ //Deletes the node v from S_node.
+ void delete_node(node v);
+
+ //---------------- for set of nodes with uniform probability -------------------
+
+
+ //Selects a random element from S_node with uniform probability and updates S_node
+ //and position_in_node_set.
+ node get_random_node();
+
+ //---------------- for set of nodes with weighted probability -------------------
+
+ //Same as init_node_set(G), but additionally the array mass_of_star is caculated.
+ void init_node_set(Graph& G,NodeArray<NodeAttributes>& A);
+
+ //---------------- for set of nodes with ``lower mass'' probability --------------
+
+ //Gets rand_tries random elements from S_node and selects the one with the lowest
+ //mass_of_star and updates S_node and position_in_node_set.
+ node get_random_node_with_lowest_star_mass(int rand_tries);
+
+ //---------------- for set of nodes with ``higher mass'' probability --------------
+
+ //Gets rand_tries random elements from S_node and selects the one with the highest
+ //mass_of_star and updates S_node and position_in_node_set.
+ node get_random_node_with_highest_star_mass(int rand_tries);
+
+ private:
+
+ bool using_S_node; //indicates weather S_item, or S_node is used
+
+ node* S_node; //representation of the node set S_node[0,G.number_of_nodes()-1]
+ int last_selectable_index_of_S_node;//index of the last randomly choosable element
+ //in S_node (this value is decreased after each
+ //select operation)
+ NodeArray<int> position_in_node_set;//holds for each node of G the index of its
+ //position in S_node
+ NodeArray<int> mass_of_star; //the sum of the masses of a node and its neighbours
+
+ };
+
+}//namespace ogdf
+#endif
+
+
diff --git a/ogdf/energybased/numexcept.cpp b/ogdf/energybased/numexcept.cpp
new file mode 100644
index 0000000..9aeb95f
--- /dev/null
+++ b/ogdf/energybased/numexcept.cpp
@@ -0,0 +1,214 @@
+/*
+ * $Revision: 2552 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-05 16:45:20 +0200 (Do, 05. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of class numexcept (handling of numeric problems).
+ *
+ * \author Stefan Hachul
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "numexcept.h"
+#include "../basic/basic.h"
+
+#define epsilon 0.1
+#define POS_SMALL_DOUBLE 1e-300
+#define POS_BIG_DOUBLE 1e+300
+
+
+namespace ogdf {
+
+
+DPoint numexcept::choose_distinct_random_point_in_disque(DPoint old_point,
+ double xmin,double xmax,double ymin,double ymax)
+{
+ const int BILLION = 1000000000;
+ double mindist;//minimal distance from old_point to the boundaries of the disc
+ double mindist_to_xmin,mindist_to_xmax,mindist_to_ymin,mindist_to_ymax;
+ double rand_x,rand_y;
+ DPoint new_point;
+
+ mindist_to_xmin = old_point.m_x - xmin;
+ mindist_to_xmax = xmax - old_point.m_x;
+ mindist_to_ymin = old_point.m_y - ymin;
+ mindist_to_ymax = ymax - old_point.m_y;
+
+ mindist = min(min(mindist_to_xmin,mindist_to_xmax), min(mindist_to_ymin,mindist_to_ymax));
+
+ if(mindist > 0)
+ do {
+ //assign random double values in range (-1,1)
+ rand_x = 2*(double(randomNumber(1,BILLION)+1)/(BILLION+2)-0.5);
+ rand_y = 2*(double(randomNumber(1,BILLION)+1)/(BILLION+2)-0.5);
+ new_point.m_x = old_point.m_x+mindist*rand_x*epsilon;
+ new_point.m_y = old_point.m_y+mindist*rand_y*epsilon;
+ } while((old_point == new_point)||((old_point-new_point).norm() >= mindist*epsilon));
+
+ else if(mindist == 0) //old_point lies at the boundaries
+ {//else1
+ double mindist_x =0;
+ double mindist_y =0;
+
+ if (mindist_to_xmin > 0)
+ mindist_x = (-1)* mindist_to_xmin;
+ else if (mindist_to_xmax > 0)
+ mindist_x = mindist_to_xmax;
+ if (mindist_to_ymin > 0)
+ mindist_y = (-1)* mindist_to_ymin;
+ else if (mindist_to_ymax > 0)
+ mindist_y = mindist_to_ymax;
+
+ if((mindist_x != 0)||(mindist_y != 0))
+ do {
+ //assign random double values in range (0,1)
+ rand_x = double(randomNumber(1,BILLION)+1)/(BILLION+2);
+ rand_y = double(randomNumber(1,BILLION)+1)/(BILLION+2);
+ new_point.m_x = old_point.m_x+mindist_x*rand_x*epsilon;
+ new_point.m_y = old_point.m_y+mindist_y*rand_y*epsilon;
+ } while(old_point == new_point);
+ else
+ cout<<"Error DIM2:: box is equal to old_pos"<<endl;
+ }//else1
+
+ else //mindist < 0
+ {//else2
+ cout<<"Error DIM2:: choose_distinct_random_point_in_disque: old_point not ";
+ cout<<"in box"<<endl;
+ }//else2
+
+ return new_point;
+}
+
+
+DPoint numexcept::choose_distinct_random_point_in_radius_epsilon(DPoint old_pos)
+{
+ double xmin = old_pos.m_x-1*epsilon;
+ double xmax = old_pos.m_x+1*epsilon;
+ double ymin = old_pos.m_y-1*epsilon;
+ double ymax = old_pos.m_y+1*epsilon;
+
+ return choose_distinct_random_point_in_disque(old_pos,xmin,xmax,ymin,ymax);
+}
+
+
+bool numexcept::f_rep_near_machine_precision(double distance,DPoint& force )
+{
+ const double POS_BIG_LIMIT = POS_BIG_DOUBLE * 1e-190;
+ const double POS_SMALL_LIMIT = POS_SMALL_DOUBLE * 1e190;
+ const int BILLION = 1000000000;
+
+ if(distance > POS_BIG_LIMIT)
+ {
+ //create random number in range (0,1)
+ double randx = double(randomNumber(1,BILLION)+1)/(BILLION+2);
+ double randy = double(randomNumber(1,BILLION)+1)/(BILLION+2);
+ int rand_sign_x = randomNumber(0,1);
+ int rand_sign_y = randomNumber(0,1);
+ force.m_x = POS_SMALL_LIMIT*(1+randx)*pow(-1.0,rand_sign_x);
+ force.m_y = POS_SMALL_LIMIT*(1+randy)*pow(-1.0,rand_sign_y);
+ return true;
+
+ } else if (distance < POS_SMALL_LIMIT)
+ {
+ //create random number in range (0,1)
+ double randx = double(randomNumber(1,BILLION)+1)/(BILLION+2);
+ double randy = double(randomNumber(1,BILLION)+1)/(BILLION+2);
+ int rand_sign_x = randomNumber(0,1);
+ int rand_sign_y = randomNumber(0,1);
+ force.m_x = POS_BIG_LIMIT*randx*pow(-1.0,rand_sign_x);
+ force.m_y = POS_BIG_LIMIT*randy*pow(-1.0,rand_sign_y);
+ return true;
+
+ } else
+ return false;
+}
+
+
+bool numexcept::f_near_machine_precision(double distance,DPoint& force )
+{
+ const double POS_BIG_LIMIT = POS_BIG_DOUBLE * 1e-190;
+ const double POS_SMALL_LIMIT = POS_SMALL_DOUBLE * 1e190;
+ const int BILLION = 1000000000;
+
+ if(distance < POS_SMALL_LIMIT)
+ {
+ //create random number in range (0,1)
+ double randx = double(randomNumber(1,BILLION)+1)/(BILLION+2);
+ double randy = double(randomNumber(1,BILLION)+1)/(BILLION+2);
+ int rand_sign_x = randomNumber(0,1);
+ int rand_sign_y = randomNumber(0,1);
+ force.m_x = POS_SMALL_LIMIT*(1+randx)*pow(-1.0,rand_sign_x);
+ force.m_y = POS_SMALL_LIMIT*(1+randy)*pow(-1.0,rand_sign_y);
+ return true;
+
+ } else if (distance > POS_BIG_LIMIT)
+ {
+ //create random number in range (0,1)
+ double randx = double(randomNumber(1,BILLION)+1)/(BILLION+2);
+ double randy = double(randomNumber(1,BILLION)+1)/(BILLION+2);
+ int rand_sign_x = randomNumber(0,1);
+ int rand_sign_y = randomNumber(0,1);
+ force.m_x = POS_BIG_LIMIT*randx*pow(-1.0,rand_sign_x);
+ force.m_x = POS_BIG_LIMIT*randy*pow(-1.0,rand_sign_y);
+ return true;
+
+ } else
+ return false;
+}
+
+
+bool numexcept::nearly_equal(double a,double b)
+{
+ double delta = 1e-10;
+ double small_b,big_b;
+
+ if(b > 0) {
+ small_b = b*(1-delta);
+ big_b = b*(1+delta);
+
+ } else //b <= 0
+ {
+ small_b = b*(1+delta);
+ big_b = b*(1-delta);
+ }
+
+ if((small_b <= a) && (a <= big_b))
+ return true;
+ else
+ return false;
+}
+
+}//namespace ogdf
diff --git a/ogdf/energybased/numexcept.h b/ogdf/energybased/numexcept.h
new file mode 100644
index 0000000..6f1b096
--- /dev/null
+++ b/ogdf/energybased/numexcept.h
@@ -0,0 +1,104 @@
+/*
+ * $Revision: 2559 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-06 15:04:28 +0200 (Fr, 06. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of class numexcept (handling of numeric problems).
+ *
+ * \author Stefan Hachul
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_NUMEXCEPT_H
+#define OGDF_NUMEXCEPT_H
+
+#include "../basic/geometry.h"
+
+namespace ogdf {
+
+//--------------------------------------------------------------------------
+// this class is developed for exceptions that might occure, when nodes are
+// placed at the same position and a new random position has to be found, or
+// when the calculated forces are near the machine accuracy, where no
+// reasonable numeric and logic calculations are possible any more
+//---------------------------------------------------------------------------
+
+ class numexcept
+ {
+ public:
+
+ //Returns a distinct random point within the smallest disque D with center
+ //old_point that is contained in the box defined by xmin,...,ymax; The size of
+ //D is shrunk by multiplying with epsilon = 0.1; Precondition:
+ //old_point is contained in the box and the box is not equal to old_point.
+ DPoint choose_distinct_random_point_in_disque(
+ DPoint old_point,
+ double xmin,
+ double xmax,
+ double ymin,
+ double ymax);
+
+ //A random point (distinct from old_pos) on the disque around old_pos with
+ //radius epsilon = 0.1 is computed.
+ DPoint choose_distinct_random_point_in_radius_epsilon(DPoint old_pos);
+
+ //If distance has a value near the machine precision the repulsive force calculation
+ //is not possible (calculated values exceed the machine accuracy) in this cases
+ //true is returned and force is set to a reasonable value that does
+ //not cause problems; Else false is returned and force keeps unchanged.
+ bool f_rep_near_machine_precision(double distance, DPoint& force);
+
+ //If distance has a value near the machine precision the (attractive)force
+ //calculation is not possible (calculated values exceed the machine accuracy) in
+ //this cases true is returned and force is set to a reasonable value that does
+ //not cause problems; Else false is returned and force keeps unchanged.
+ bool f_near_machine_precision(double distance, DPoint& force);
+
+ //Returns true if a is "nearly" equal to b (needed, when machine accuracy is
+ //insufficient in functions well_seperated and bordering of NMM)
+ bool nearly_equal(double a, double b);
+
+ };
+
+}//namespace ogdf
+#endif
+
diff --git a/ogdf/fileformats/DinoLineBuffer.cpp b/ogdf/fileformats/DinoLineBuffer.cpp
new file mode 100644
index 0000000..c2360de
--- /dev/null
+++ b/ogdf/fileformats/DinoLineBuffer.cpp
@@ -0,0 +1,424 @@
+/*
+ * $Revision: 2565 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-07 17:14:54 +0200 (Sa, 07. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of a line buffer serving the class DinoXmlScanner
+ *
+ * \author Dino Ahr
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "DinoLineBuffer.h"
+#include "../basic/String.h"
+#include "DinoTools.h"
+
+#include <ctype.h>
+#include <string.h>
+
+extern ofstream os;
+
+namespace ogdf {
+
+ // Initialize static variables
+ const int DinoLineBuffer::c_maxStringLength = OGDF_STRING_BUFFER_SIZE;
+ const int DinoLineBuffer::c_maxLineLength = 200;
+ const int DinoLineBuffer::c_maxNoOfLines = 20;
+
+ //
+ // ---------- D i n o L i n e B u f f e r P o s i t i o n ----------
+ //
+
+ //
+ // C o n s t r u c t o r
+ //
+ DinoLineBufferPosition::DinoLineBufferPosition(
+ int lineNumber,
+ int lineUpdateCount,
+ int linePosition)
+ {
+ set(lineNumber, lineUpdateCount, linePosition);
+ }
+
+ //
+ // C o p y C o n s t r u c t o r
+ //
+ DinoLineBufferPosition::DinoLineBufferPosition(const DinoLineBufferPosition &position)
+ {
+ m_lineNumber = position.m_lineNumber;
+ m_lineUpdateCount = position.m_lineUpdateCount;
+ m_linePosition = position.m_linePosition;
+ }
+
+ //
+ // s e t
+ //
+ void DinoLineBufferPosition::set(int lineNumber, int lineUpdateCount, int linePosition)
+ {
+ OGDF_ASSERT((lineNumber >= 0) && (lineNumber < DinoLineBuffer::c_maxNoOfLines))
+ OGDF_ASSERT(lineUpdateCount >= 0)
+ OGDF_ASSERT((linePosition >= 0) && (linePosition < DinoLineBuffer::c_maxLineLength))
+
+ m_lineNumber = lineNumber;
+ m_lineUpdateCount = lineUpdateCount;
+ m_linePosition = linePosition;
+
+ } // set
+
+ //
+ // i n c r e m e n t P o s i t i o n
+ //
+ void DinoLineBufferPosition::incrementPosition()
+ {
+ ++m_linePosition;
+
+ OGDF_ASSERT((m_linePosition >= 0) && (m_linePosition < DinoLineBuffer::c_maxLineLength))
+
+ } // increasePosition
+
+ //
+ // o p e r a t o r ! =
+ //
+ bool DinoLineBufferPosition::operator!=(const DinoLineBufferPosition &position) const
+ {
+ if ((m_lineNumber != position.m_lineNumber) ||
+ (m_lineUpdateCount != position.m_lineUpdateCount) ||
+ (m_linePosition != position.m_linePosition))
+ {
+ return true;
+ }
+
+ return false;
+
+ } // operator!=
+
+ //
+ // o p e r a t o r =
+ //
+ const DinoLineBufferPosition &
+ DinoLineBufferPosition::operator=(const DinoLineBufferPosition &position)
+ {
+ if (&position != this){
+
+ m_lineNumber = position.getLineNumber();
+ m_lineUpdateCount = position.getLineUpdateCount();
+ m_linePosition = position.getLinePosition();
+
+ }
+
+ return *this;
+
+ } // operator=
+
+ //
+ // ---------- D i n o L i n e B u f f e r ----------
+ //
+
+ //
+ // C o n s t r u c t o r
+ //
+ DinoLineBuffer::DinoLineBuffer(const char *fileName) :
+ m_pIs(0),
+ m_pLinBuf(0),
+ m_numberOfMostRecentlyReadLine(0),
+ m_inputFileLineCounter(0)
+ {
+ // Open file
+ m_pIs = new ifstream(fileName, ios::in);
+ if (!(*m_pIs)) {
+ DinoTools::reportError("DinoLineBuffer::DinoLineBuffer", __LINE__, "Error opening file!");
+ }
+
+ // Create and initialize lineUpdateCountArray
+ m_lineUpdateCountArray = new int[DinoLineBuffer::c_maxNoOfLines];
+ int i;
+ for (i = 0; i < DinoLineBuffer::c_maxNoOfLines; i++){
+ m_lineUpdateCountArray[i] = 0;
+ }
+
+ // Create and initialize line buffer
+ m_pLinBuf = new char[(DinoLineBuffer::c_maxNoOfLines * DinoLineBuffer::c_maxLineLength)];
+ if (m_pLinBuf == 0)
+ OGDF_THROW(InsufficientMemoryException);
+ for (i = 0; i < DinoLineBuffer::c_maxNoOfLines * DinoLineBuffer::c_maxLineLength; i++){
+ m_pLinBuf[i] = '0';
+ }
+
+ // Read first line
+ if (!m_pIs->eof()){
+
+ // Read first line
+ m_pIs->getline(m_pLinBuf, DinoLineBuffer::c_maxLineLength);
+
+ // Increase inputFileLineCounter
+ ++m_inputFileLineCounter;
+
+ // Increase updateCount
+ ++(m_lineUpdateCountArray[0]);
+
+ }
+ // End of file is reached immeadiately
+ else{
+
+ // Set eof marker
+ *m_pLinBuf = EOF;
+
+ }
+
+ // Set position
+ m_currentPosition.set(0, m_lineUpdateCountArray[0], 0);
+
+ } // DinoLineBuffer::DinoLineBuffer
+
+ //
+ // D e s t r u c t o r
+ //
+ DinoLineBuffer::~DinoLineBuffer()
+ {
+ // destroy line buffer
+ delete [] m_pLinBuf;
+
+ // destroy lineUpdateCountArray
+ delete [] m_lineUpdateCountArray;
+
+ // Close file
+ delete m_pIs;
+
+ } // DinoLineBuffer::~DinoLineBuffer
+
+ //
+ // m o v e T o N e x t C h a r a c t e r
+ //
+ char DinoLineBuffer::moveToNextCharacter(){
+
+ // Return if end of file is reached
+ if (getCurrentCharacter() == EOF){
+ return EOF;
+ }
+
+ // Increment position
+ m_currentPosition.incrementPosition();
+
+ // End of line is reached, there can be some consecutive lines
+ // with only \0 in it; hence we use a while loop
+ while (getCurrentCharacter() == '\0'){
+
+ // Current line is equal to most recently read line,
+ // i.e. we have to read a new line from the file
+ if (m_currentPosition.getLineNumber() == m_numberOfMostRecentlyReadLine){
+
+ // Increment line pointer (modulo c_maxNoOfLines - 1)
+ if (m_numberOfMostRecentlyReadLine == (DinoLineBuffer::c_maxNoOfLines - 1)){
+ m_numberOfMostRecentlyReadLine = 0;
+ }
+ else {
+ ++m_numberOfMostRecentlyReadLine;
+ }
+
+ // Increment update count
+ ++(m_lineUpdateCountArray[m_numberOfMostRecentlyReadLine]);
+
+ // Increment inputFileLineCounter
+ ++m_inputFileLineCounter;
+
+ // Set current position
+ m_currentPosition.set(
+ m_numberOfMostRecentlyReadLine,
+ m_lineUpdateCountArray[m_numberOfMostRecentlyReadLine],
+ 0);
+
+ // End of file is reached
+ if (m_pIs->eof()){
+
+ // Set eof marker
+ setCurrentCharacter(EOF);
+
+ }
+ // Read next line and put it to the new position
+ else{
+
+ m_pIs->getline(getCurrentCharacterPointer(), DinoLineBuffer::c_maxLineLength);
+ }
+
+ } // Current line is equal to most recently read line
+
+ // Current line is NOT equal to most recently read line, i.e.
+ // it is not necessary to read a new line from the file but to
+ // set the currentPosition to the next line which is already in
+ // the line buffer.
+ else{
+
+ int newLine;
+
+ // Increment current line pointer (modulo c_maxNoOfLines - 1)
+ if (m_currentPosition.getLineNumber() == (DinoLineBuffer::c_maxNoOfLines - 1)){
+ newLine = 0;
+ }
+ else {
+ newLine = m_currentPosition.getLineNumber() + 1;
+ }
+
+ // Set current position
+ m_currentPosition.set(newLine, m_lineUpdateCountArray[newLine], 0);
+
+ } // Current line is NOT equal to most recently read line
+
+ } // End of line is reached
+
+ return getCurrentCharacter();
+
+ } // moveToNextCharacter
+
+ //
+ // s e t C u r r e n t P o s i t i o n
+ //
+ bool DinoLineBuffer::setCurrentPosition(const DinoLineBufferPosition &newPosition){
+
+ // Given positon is not valid
+ if (!isValidPosition(newPosition))
+ {
+ return false;
+ }
+
+ m_currentPosition = newPosition;
+
+ return true;
+
+ } // setCurrentPosition
+
+ //
+ // s k i p W h i t e s p a c e
+ //
+ void DinoLineBuffer::skipWhitespace()
+ {
+
+ if (getCurrentCharacter() == EOF) {
+ return;
+ }
+
+ while ((isspace(getCurrentCharacter())) && (!(getCurrentCharacter() == EOF)))
+ {
+ moveToNextCharacter();
+ }
+
+ } // skipWhitespace
+
+ //
+ // e x t r a c t S t r i n g
+ //
+ bool DinoLineBuffer::extractString(
+ const DinoLineBufferPosition &startPosition,
+ const DinoLineBufferPosition &endPosition,
+ char *targetString)
+ {
+
+ // StartPosition invalid, probably because the line of the startPosition
+ // has already been overwritten, i.e. the string is too long
+ if (!isValidPosition(startPosition))
+ {
+ ogdf::strcpy(targetString, DinoLineBuffer::c_maxStringLength, "String too long!");
+ return false;
+ }
+
+ // EndPosition must be valid
+ OGDF_ASSERT(isValidPosition(endPosition))
+
+ // Remember original currentPosition
+ DinoLineBufferPosition originalCurrentPosition = getCurrentPosition();
+
+ // Begin at startPosition
+ setCurrentPosition(startPosition);
+
+ // Copy characters to tempString
+ int targetStringIndex = 0;
+ while (getCurrentPosition() != endPosition)
+ {
+
+ // Check if eof
+ OGDF_ASSERT(getCurrentCharacter() != EOF)
+
+ // Put character into targetString
+ targetString[targetStringIndex] = getCurrentCharacter();
+ ++targetStringIndex;
+
+ // String too long
+ if (targetStringIndex >= DinoLineBuffer::c_maxStringLength - 1){
+
+ ogdf::strcpy(targetString, DinoLineBuffer::c_maxStringLength, "String too long!");
+
+ // Set back the original current position
+ setCurrentPosition(originalCurrentPosition);
+
+ return false;
+
+ }
+
+ // Move to next character
+ moveToNextCharacter();
+
+ } // Copy characters to tempString
+
+ // Set back the original current position
+ setCurrentPosition(originalCurrentPosition);
+
+ // Terminate string
+ targetString[targetStringIndex] = '\0';
+
+ return true;
+
+ } // extractString
+
+ //
+ // i s V a l i d P o s i t i o n
+ //
+ bool DinoLineBuffer::isValidPosition(const DinoLineBufferPosition &position) const
+ {
+
+ // We can assume that the position is valid according to
+ // array ranges since these things are checked in constructor and set of
+ // class DinoLineBufferPosition
+
+ // The line of the given position has already been overwritten
+ if (position.getLineUpdateCount() !=
+ m_lineUpdateCountArray[position.getLineNumber()])
+ {
+ return false;
+ }
+
+ return true;
+
+ } // isValidPosition
+
+} // namespace ogdf
diff --git a/ogdf/fileformats/DinoLineBuffer.h b/ogdf/fileformats/DinoLineBuffer.h
new file mode 100644
index 0000000..57675ce
--- /dev/null
+++ b/ogdf/fileformats/DinoLineBuffer.h
@@ -0,0 +1,247 @@
+/*
+ * $Revision: 2564 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-07 00:03:48 +0200 (Sa, 07. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of the clssses DinoLineBuffer and
+ * DinoLineBufferPosition
+ *
+ * \author Dino Ahr
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_DINO_LINE_BUFFER_H
+#define OGDF_DINO_LINE_BUFFER_H
+
+#include "../basic/basic.h"
+
+
+namespace ogdf {
+
+ //---------------------------------------------------------
+ // D i n o L i n e B u f f e r P o s i t i o n
+ //---------------------------------------------------------
+ /** This class characterizes uniquely a position in the line
+ * buffer.
+ *
+ * Note that the element m_lineUpdateCount allows to check
+ * if a position is obsolete, i.e. its content has already
+ * been overwritten.
+ */
+ class OGDF_EXPORT DinoLineBufferPosition {
+
+ private:
+
+ /** Contains the lineNumber; Range [0 .. c_maxNoOfLines-1] */
+ int m_lineNumber;
+
+ /** Contains the number of times line m_lineNumber has been
+ * overwritten by new data; Range [0 .. ]
+ */
+ int m_lineUpdateCount;
+
+ /** Contains the position in line m_lineNumber; Range [0 .. c_maxLineLength-1] */
+ int m_linePosition;
+
+ public:
+
+ /** Default Constructor */
+ DinoLineBufferPosition() :
+ m_lineNumber(0),
+ m_lineUpdateCount(0),
+ m_linePosition(0)
+ { }
+
+ /** Constructor */
+ DinoLineBufferPosition(
+ int lineNumber,
+ int lineUpdateCount,
+ int linePosition);
+
+ /** Copy Constructor */
+ DinoLineBufferPosition(const DinoLineBufferPosition &position);
+
+ /** Get the line number */
+ inline int getLineNumber() const {
+ return m_lineNumber;
+ }
+
+ /** Get the update count of the line */
+ inline int getLineUpdateCount() const {
+ return m_lineUpdateCount;
+ }
+
+ /** Get the position in the line */
+ inline int getLinePosition() const {
+ return m_linePosition;
+ }
+
+ /** Set all values */
+ void set(int lineNumber, int lineUpdateCount, int linePosition);
+
+ /** Increments the position by 1 */
+ void incrementPosition();
+
+ /** Test if inequal */
+ bool operator!=(const DinoLineBufferPosition &position) const;
+
+ /** Assignment */
+ const DinoLineBufferPosition &operator=(const DinoLineBufferPosition &position);
+
+ }; // DinoLineBufferPosition
+
+ //---------------------------------------------------------
+ // D i n o L i n e B u f f e r
+ //---------------------------------------------------------
+ /** This class maintains the input file and provides a
+ * convenient interface to handle it.
+ */
+ class OGDF_EXPORT DinoLineBuffer {
+
+ public:
+
+ // Maximal length of a string handled by extractString()
+ const static int c_maxStringLength;
+
+ // Maximal length of one line
+ const static int c_maxLineLength;
+
+ // Maximal number of lines
+ const static int c_maxNoOfLines;
+
+ private:
+
+ // Handle to the input file
+ istream *m_pIs;
+
+ // Contains for each line of the line buffer its update count
+ // Range is [0 .. c_maxNoOfLines]
+ int *m_lineUpdateCountArray;
+
+ // Pointer to the line buffer
+ char *m_pLinBuf;
+
+ // The current position in m_pLinBuf
+ DinoLineBufferPosition m_currentPosition;
+
+ // The line which has been read from the file most recently;
+ // this does not have to be equal to m_currentPosition.m_lineNumber
+ // because of the lookahead facilities.
+ // Range is [0 .. c_maxNoOfLines - 1]
+ int m_numberOfMostRecentlyReadLine;
+
+ // Contains the current line number of the input file;
+ int m_inputFileLineCounter;
+
+ public:
+
+ // construction
+ DinoLineBuffer(const char *fileName);
+
+ // destruction
+ ~DinoLineBuffer();
+
+ // Returns the current position (as a copy)
+ DinoLineBufferPosition getCurrentPosition() const{
+ return m_currentPosition;
+ }
+
+ // Returns the character which is currently pointed to
+ inline char getCurrentCharacter() const {
+ return m_pLinBuf[(m_currentPosition.getLineNumber() * DinoLineBuffer::c_maxLineLength) +
+ m_currentPosition.getLinePosition()];
+ }
+
+ // Returns line number of the most recently read line of the input file
+ inline int getInputFileLineCounter() const {
+ return m_inputFileLineCounter;
+ }
+
+ // Moves to the next position;
+ // reading of new lines and handling of eof are done internally.
+ // If end of file is reached the position will stuck to EOF character.
+ // The current character after moving is returned
+ char moveToNextCharacter();
+
+ // Sets the current position to new positon.
+ // Takes care if the given newPosition is valid.
+ // Returns false if given position is invalid
+ bool setCurrentPosition(const DinoLineBufferPosition &newPosition);
+
+ // Moves to the next character until the currentCharacter is
+ // no whitespace.
+ void skipWhitespace();
+
+ // Copys the characters which have been extracted from the
+ // line buffer starting from position startPosition (including it)
+ // to endPosition (excluding it) to targetString (terminated by '\0').
+ // The length of strings is limited to c_maxStringLength
+ //
+ // Returns false if the startPosition is not valid, i.e. the string
+ // is too long; targetString will contain the message "String too long!"
+ bool extractString(
+ const DinoLineBufferPosition &startPostion,
+ const DinoLineBufferPosition &endPosition,
+ char *targetString);
+
+ private:
+
+ // Returns a pointer to the character which is currently pointed to
+ inline char *getCurrentCharacterPointer() {
+ return &m_pLinBuf[(m_currentPosition.getLineNumber() * DinoLineBuffer::c_maxLineLength) +
+ m_currentPosition.getLinePosition()];
+ }
+
+ // Sets the given character to the current position
+ inline void setCurrentCharacter(char c) {
+ m_pLinBuf[(m_currentPosition.getLineNumber() * DinoLineBuffer::c_maxLineLength) +
+ m_currentPosition.getLinePosition()] = c;
+ }
+
+ // Checks wether the given position is valid
+ bool isValidPosition(const DinoLineBufferPosition &position) const;
+
+ }; // class DinoLineBuffer
+
+} // end namespace ogdf
+
+#endif
diff --git a/ogdf/fileformats/DinoTools.cpp b/ogdf/fileformats/DinoTools.cpp
new file mode 100644
index 0000000..868ac8d
--- /dev/null
+++ b/ogdf/fileformats/DinoTools.cpp
@@ -0,0 +1,114 @@
+/*
+ * $Revision: 2565 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-07 17:14:54 +0200 (Sa, 07. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of some tools
+ *
+ * \author Dino Ahr
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "DinoTools.h"
+#include <ctype.h>
+
+namespace ogdf {
+
+ //
+ // s t r i n g T o D o u b l e A r r a y
+ //
+ void DinoTools::stringToDoubleArray(const String &str, Array<double> &doubleArray)
+ {
+ size_t strIndex = 0;
+ char tempString[20];
+ int tempStringIndex = 0;
+
+ for (int i = 0; i < 4; i++){
+
+ tempStringIndex = 0;
+
+ // Skip whitespace
+ while (isspace(str[strIndex])){
+ ++strIndex;
+ }
+
+ // Copy characters of double value
+ // values are separated by comma
+ while (str[strIndex] != ','){
+
+ tempString[tempStringIndex] = str[strIndex];
+ ++tempStringIndex;
+ ++strIndex;
+
+ }
+
+ // Skip over ','
+ ++strIndex;
+
+ // Terminate string
+ tempString[tempStringIndex] = '\0';
+
+ // Put double value into array
+ doubleArray[i] = atof(tempString);
+
+ } // for
+
+ } // stringToDoubleArray
+
+ //
+ // r e p o r t E r r o r
+ //
+ void DinoTools::reportError(
+ const char *functionName,
+ int sourceLine,
+ const char *message,
+ int inputFileLine,
+ bool abort)
+ {
+ cerr << "Error reported!" << endl;
+ cerr << "\tFunction: " << functionName << "(), Source line: " << sourceLine << endl;
+ cerr << "\tMessage: " << message << endl;
+ if (inputFileLine != -1) {
+ cerr << "\tCurrent line of input file: " << inputFileLine;
+ }
+
+ cerr << endl;
+
+ if (abort)
+ exit(1);
+
+ } // reportError
+
+} // namespace ogdf
diff --git a/ogdf/fileformats/DinoTools.h b/ogdf/fileformats/DinoTools.h
new file mode 100644
index 0000000..6629908
--- /dev/null
+++ b/ogdf/fileformats/DinoTools.h
@@ -0,0 +1,87 @@
+/*
+ * $Revision: 2523 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-02 20:59:27 +0200 (Mon, 02 Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of the class DinoTools
+ *
+ * \author Dino Ahr
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_DINO_TOOLS_H
+#define OGDF_DINO_TOOLS_H
+
+#include "../basic/String.h"
+#include "../basic/Array.h"
+
+
+namespace ogdf {
+
+ //---------------------------------------------------------
+ // D i n o T o o l s
+ //
+ // provides some useful tools
+ //---------------------------------------------------------
+ class OGDF_EXPORT DinoTools {
+
+ public:
+
+ // Extracts the single values of string str with format
+ // "x, y, width, height," and puts them into doubleArray
+ static void stringToDoubleArray(const String &str, Array<double> &doubleArray);
+
+ // Reports errors to cout
+ // Value -1 for inputFileLine indicates that this information is
+ // not available
+ static void reportError(const char *functionName,
+ int sourceLine,
+ const char *errorMessage,
+ int inputFileLine = -1,
+ bool abort = true);
+
+ }; // class DinoTools
+
+
+
+} // end namespace ogdf
+
+#endif
diff --git a/ogdf/fileformats/DinoXmlParser.cpp b/ogdf/fileformats/DinoXmlParser.cpp
new file mode 100644
index 0000000..938fb9b
--- /dev/null
+++ b/ogdf/fileformats/DinoXmlParser.cpp
@@ -0,0 +1,913 @@
+/*
+ * $Revision: 2565 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-07 17:14:54 +0200 (Sa, 07. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of XML parser (class DinoXmlParser)
+ * (used for parsing and reading XML files)
+ *
+ * \author Dino Ahr
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "DinoXmlParser.h"
+#include "DinoTools.h"
+
+#include <ctype.h>
+#include <string.h>
+
+
+namespace ogdf {
+
+ //-----------------------------------------------------
+ //Methods for handling XML objects for OGML file format
+ //-----------------------------------------------------
+ bool XmlTagObject::isLeaf() const {
+ if(this->m_pFirstSon) return false;
+ else return true;
+ }
+
+ bool XmlTagObject::findSonXmlTagObjectByName(
+ const String sonsName,
+ XmlTagObject *&son) const
+ {
+ XmlTagObject *currentSon = this->m_pFirstSon;
+ while(currentSon && currentSon->m_pTagName->key() != sonsName)
+ {
+ currentSon = currentSon->m_pBrother;
+ }
+
+ if(currentSon) {
+ son = currentSon;
+ return true;
+ }
+
+ son = 0;
+ return false;
+ }
+
+ bool XmlTagObject::findSonXmlTagObjectByName(
+ const String sonsName,
+ List<XmlTagObject*> &sons) const
+ {
+ bool found;
+ XmlTagObject *currentSon = this->m_pFirstSon;
+ while(currentSon)
+ {
+ if(currentSon->m_pTagName->key() == sonsName) {
+ found = true;
+ sons.pushBack(currentSon);
+ }
+ currentSon = currentSon->m_pBrother;
+ }
+
+ return found;
+ }
+
+ bool XmlTagObject::hasMoreSonXmlTagObject(const List<String> &sonNamesToIgnore) const {
+ const XmlTagObject *currentSon = this->m_pFirstSon;
+ while(currentSon)
+ {
+
+ //Proof if name of currentSon is inequal to all in sonsName
+ ListConstIterator<String> it;
+ bool found = false;
+ for(it = sonNamesToIgnore.begin(); it.valid() && !found; it++) {
+ if(*it == currentSon->m_pTagName->key()) found = true;
+ }
+ if(!found) return true;
+ currentSon = currentSon->m_pBrother;
+ }
+
+ return false;
+ }
+
+ bool XmlTagObject::findXmlAttributeObjectByName(
+ const String attName,
+ XmlAttributeObject*& attribute) const
+ {
+ XmlAttributeObject *currentAttribute = this->m_pFirstAttribute;
+ while ((currentAttribute != 0) &&
+ (currentAttribute->m_pAttributeName->key() != attName))
+ {
+ currentAttribute = currentAttribute->m_pNextAttribute;
+ }
+
+ // Attribute found
+ if (currentAttribute != 0){
+ attribute = currentAttribute;
+ return true;
+ }
+
+ // Not found
+ attribute = 0;
+ return false;
+ }
+
+ bool XmlTagObject::isAttributeLess() const {
+ if(this->m_pFirstAttribute) return false;
+ else return true;
+ }
+
+
+ //
+ // ---------- D i n o X m l P a r s e r ------------------------
+ //
+
+ //
+ // C o n s t r u c t o r
+ //
+ DinoXmlParser::DinoXmlParser(const char *fileName) :
+ m_pRootTag(0),
+ m_hashTableInfoIndex(0),
+ m_recursionDepth(0)
+ {
+ // Create scanner
+ m_pScanner = new DinoXmlScanner(fileName);
+
+ } // DinoXmlParser::DinoXmlParser
+
+ //
+ // D e s t r u c t o r
+ //
+ DinoXmlParser::~DinoXmlParser()
+ {
+ // Delete parse tree
+ if (m_pRootTag)
+ destroyParseTree(m_pRootTag);
+
+ // Delete scanner
+ delete m_pScanner;
+
+ } // DinoXmlParser::~DinoXmlParser
+
+
+ //
+ // c r e a t e P a r s e T r e e
+ //
+ void DinoXmlParser::createParseTree()
+ {
+
+ // Info
+ //cout << "Parsing..." << endl;
+
+ // create parse tree
+ m_pRootTag = parse();
+
+ // recursion depth not correct
+ if (m_recursionDepth != 0) {
+ DinoTools::reportError("DinoXmlParser::createParseTree", __LINE__, "Recursion depth not equal to zero after parsing!");
+ }
+
+ } // createParseTree
+
+ //
+ // d e s t r o y P a r s e T r e e
+ //
+ void DinoXmlParser::destroyParseTree(XmlTagObject *root)
+ {
+ // Destroy all attributes of root
+ XmlAttributeObject *currentAttribute = root->m_pFirstAttribute;
+ while (currentAttribute != 0){
+ XmlAttributeObject *nextAttribute = currentAttribute->m_pNextAttribute;
+ delete currentAttribute;
+ currentAttribute = nextAttribute;
+ }
+
+ // Traverse children of root and destroy them
+ XmlTagObject *currentChild = root->m_pFirstSon;
+ while (currentChild != 0){
+ XmlTagObject *nextChild = currentChild->m_pBrother;
+ destroyParseTree(currentChild);
+ currentChild = nextChild;
+ }
+
+ // Destroy root itself
+ delete root;
+
+ } // destroyParseTree
+
+
+ //
+ // p a r s e
+ //
+ // Take a look at the state machine of parse() to understand
+ // what is going on here.
+ //
+ // TODO: It seems to be useful that this function throws an exception
+ // if something goes wrong.
+ XmlTagObject *DinoXmlParser::parse()
+ {
+ // Increment recursion depth
+ ++m_recursionDepth;
+
+ // currentTagObject is the tag object we want to create
+ // in this invocation of parse()
+ XmlTagObject *currentTagObject = 0;
+
+ // Now we are in the start state of the state machine
+ for( ; ; )
+ {
+ XmlToken token = m_pScanner->getNextToken();
+
+ // Expect "<", otherwise failure
+ if (token != openingBracket){
+ DinoTools::reportError("DinoXmlParser::parse",
+ __LINE__,
+ "Opening Bracket expected!",
+ getInputFileLineCounter());
+ }
+
+ // Let's look what comes after "<"
+ token = m_pScanner->getNextToken();
+
+ // Read "?", i.e. we have the XML header line <? ... ?>
+ if (token == questionMark){
+
+ // Skip until we reach the matching question mark
+ if (!m_pScanner->skipUntil('?')){
+ DinoTools::reportError("DinoXmlParser::parse",
+ __LINE__,
+ "Could not found the matching '?'",
+ getInputFileLineCounter());
+ }
+
+ // Consume ">", otherwise failure
+ token = m_pScanner->getNextToken();
+ if (token != closingBracket){
+ DinoTools::reportError("DinoXmlParser::parse",
+ __LINE__,
+ "Closing Bracket expected!",
+ getInputFileLineCounter());
+ }
+
+ // Go to start state of the state machine
+ continue;
+
+ } // end of Read "?"
+
+ // Read "!", i.e. we have a XML comment <!-- bla -->
+ if (token == exclamationMark){
+
+ // A preambel comment <!lala > which could be also nested
+ if ((m_pScanner->getNextToken() != minus) ||
+ (m_pScanner->getNextToken() != minus))
+ {
+ if (!m_pScanner->skipUntilMatchingClosingBracket()){
+
+ DinoTools::reportError("DinoXmlParser::parse",
+ __LINE__,
+ "Could not find closing comment bracket!",
+ getInputFileLineCounter());
+ }
+
+ continue;
+ }
+
+ // Find end of comment
+ bool endOfCommentFound = false;
+ while (!endOfCommentFound){
+
+ // Skip until we find a - (and skip over it)
+ if (!m_pScanner->skipUntil('-', true)){
+ DinoTools::reportError("DinoXmlParser::parse",
+ __LINE__,
+ "Closing --> of comment not found!",
+ getInputFileLineCounter());
+ }
+
+ // The next characters must be -> (note that one minus is already consumed)
+ if ((m_pScanner->getNextToken() == minus) &&
+ (m_pScanner->getNextToken() == closingBracket))
+ {
+ endOfCommentFound = true;
+ }
+
+ } // while
+
+ // Go to start state of the state machine
+ continue;
+
+ } // end of Read "!"
+
+ // We have found an identifier, i.e. a tag name
+ if (token == identifier){
+
+ // Get hash element of token string
+ HashedString *tagName =
+ hashString(m_pScanner->getCurrentTokenString());
+
+ // Create new tag object
+ currentTagObject = new XmlTagObject(tagName);
+ if (currentTagObject == 0){
+ OGDF_THROW(InsufficientMemoryException);
+ }
+ //push (opening) tagName to stack
+ m_tagObserver.push(tagName->key());
+ // set depth of current tag object
+ currentTagObject->setDepth(m_recursionDepth);
+
+ // set line of the tag object in the parsed xml document
+ currentTagObject->setLine(getInputFileLineCounter());
+
+ // Next token
+ token = m_pScanner->getNextToken();
+
+ // Again we found an identifier, so it must be an attribute
+ if (token == identifier){
+
+ // Read list of attributes
+ do {
+ // Save the attribute name
+ HashedString *attributeName =
+ hashString(m_pScanner->getCurrentTokenString());
+
+ // Consume "=", otherwise failure
+ token = m_pScanner->getNextToken();
+ if (token != equalSign)
+ {
+ DinoTools::reportError("DinoXmlParser::parse",
+ __LINE__,
+ "Equal Sign expected!",
+ getInputFileLineCounter());
+ }
+
+ // Read value
+ token = m_pScanner->getNextToken();
+ if ((token != quotedValue) &&
+ (token != identifier) &&
+ (token != attributeValue))
+ {
+ DinoTools::reportError("DinoXmlParser::parse",
+ __LINE__,
+ "No valid attribute value!",
+ getInputFileLineCounter());
+ }
+
+ // Create a new XmlAttributeObject
+ XmlAttributeObject *currentAttributeObject =
+ new XmlAttributeObject(attributeName, hashString(m_pScanner->getCurrentTokenString()));
+ if (currentAttributeObject == 0){
+ OGDF_THROW(InsufficientMemoryException);
+ }
+
+ // Append attribute to attribute list of the current tag object
+ appendAttributeObject(currentTagObject, currentAttributeObject);
+
+ // Get next token
+ token = m_pScanner->getNextToken();
+
+ }
+ while (token == identifier);
+
+ } // Found an identifier of an attribute
+
+ // Read "/", i.e. the tag is ended immeadiately, e.g.
+ // <A ... /> without a closing tag </A>
+ if (token == slash){
+
+ // Consume ">", otherwise failure
+ token = m_pScanner->getNextToken();
+ if (token != closingBracket)
+ {
+ DinoTools::reportError("DinoXmlParser::parse",
+ __LINE__,
+ "Closing Bracket expected!",
+ getInputFileLineCounter());
+ }
+
+ // The tag is closed and ended so we return
+ String s = m_tagObserver.pop();
+ --m_recursionDepth;
+ return currentTagObject;
+
+ } // end of Read "/"
+
+ // Read ">", i.e. the tag is closed and we
+ // expect some content
+ if (token == closingBracket){
+
+ // We read something different from "<", so we have to
+ // deal with a tag value now, i.e. a string inbetween the
+ // opening and the closing tag, e.g. <A ...> lalala </A>
+ if (m_pScanner->testNextToken() != openingBracket){
+
+ // Read the characters until "<" is reached and put them into
+ // currentTagObject
+ m_pScanner->readStringUntil('<');
+ currentTagObject->m_pTagValue = hashString(m_pScanner->getCurrentTokenString());
+
+ // We expect a closing tag now, i.e. </id>
+ token = m_pScanner->getNextToken();
+ if (token != openingBracket)
+ {
+ DinoTools::reportError("DinoXmlParser::parse",
+ __LINE__,
+ "Opening Bracket expected!",
+ getInputFileLineCounter());
+ }
+
+ token = m_pScanner->getNextToken();
+ if (token != slash)
+ {
+ DinoTools::reportError("DinoXmlParser::parse",
+ __LINE__,
+ "Slash expected!",
+ getInputFileLineCounter());
+ }
+
+ token = m_pScanner->getNextToken();
+ if (token != identifier)
+ {
+ DinoTools::reportError("DinoXmlParser::parse",
+ __LINE__,
+ "Identifier expected!",
+ getInputFileLineCounter());
+ }
+
+ // next token is the closing tag
+ String nextTag(m_pScanner->getCurrentTokenString());
+ // pop corresponding tag from stack
+ String s = m_tagObserver.pop();
+ // compare the two tags
+ if (s != nextTag)
+ {
+ // the closing tag doesn't correspond to the opening tag:
+ DinoTools::reportError("DinoXmlParser::parse",
+ __LINE__,
+ "wrong closing tag!",
+ getInputFileLineCounter());
+ }
+
+ token = m_pScanner->getNextToken();
+ if (token != closingBracket)
+ {
+ DinoTools::reportError("DinoXmlParser::parse",
+ __LINE__,
+ "Closing Bracket expected!",
+ getInputFileLineCounter());
+ }
+
+ // The tag is closed so we return
+ --m_recursionDepth;
+ return currentTagObject;
+
+ } // end of read something different from "<"
+
+ // Found "<", so a (series of) new tag begins and we have to perform
+ // recursive invocation of parse()
+ //
+ // There are two exceptions:
+ // - a slash follows afer <, i.e. we have a closing tag
+ // - an exclamation mark follows after <, i.e. we have a comment
+ while (m_pScanner->testNextToken() == openingBracket){
+
+ // Leave the while loop if a closing tag occurs
+ if (m_pScanner->testNextNextToken() == slash){
+ break;
+ }
+
+ // Ignore comments
+ if (m_pScanner->testNextNextToken() == exclamationMark){
+
+ // Comment must start with <!--
+ if ((m_pScanner->getNextToken() != openingBracket) ||
+ (m_pScanner->getNextToken() != exclamationMark) ||
+ (m_pScanner->getNextToken() != minus) ||
+ (m_pScanner->getNextToken() != minus))
+ {
+ DinoTools::reportError("DinoXmlParser::parse",
+ __LINE__,
+ "Comment must start with <!--",
+ getInputFileLineCounter());
+ }
+
+ // Find end of comment
+ bool endOfCommentFound = false;
+ while (!endOfCommentFound){
+
+ // Skip until we find a - (and skip over it)
+ if (!m_pScanner->skipUntil('-', true)){
+ DinoTools::reportError("DinoXmlParser::parse",
+ __LINE__,
+ "Closing --> of comment not found!",
+ getInputFileLineCounter());
+ }
+
+ // The next characters must be -> (note that one minus is already consumed)
+ if ((m_pScanner->getNextToken() == minus) &&
+ (m_pScanner->getNextToken() == closingBracket))
+ {
+ endOfCommentFound = true;
+ }
+
+ } // while
+
+ // Proceed with outer while loop
+ continue;
+
+ } // Ignore comments
+
+ // The new tag object is a son of the current tag object
+ XmlTagObject *sonTagObject = parse();
+ appendSonTagObject(currentTagObject, sonTagObject);
+
+ } // while
+
+ // Now we have found all tags.
+ // We expect a closing tag now, i.e. </id>
+ token = m_pScanner->getNextToken();
+ if (token != openingBracket)
+ {
+ DinoTools::reportError("DinoXmlParser::parse",
+ __LINE__,
+ "Opening Bracket expected!",
+ getInputFileLineCounter());
+ }
+
+ token = m_pScanner->getNextToken();
+ if (token != slash)
+ {
+ DinoTools::reportError("DinoXmlParser::parse",
+ __LINE__,
+ "Slash expected!",
+ getInputFileLineCounter());
+ }
+
+ token = m_pScanner->getNextToken();
+ if (token != identifier)
+ {
+ DinoTools::reportError("DinoXmlParser::parse",
+ __LINE__,
+ "Identifier expected!",
+ getInputFileLineCounter());
+ }
+
+ // next token is the closing tag
+ String nextTag(m_pScanner->getCurrentTokenString());
+ // pop corresponding tag from stack
+ String s = m_tagObserver.pop();
+ // compare the two tags
+ if (s != nextTag)
+ {
+ // the closing tag doesn't correspond to the opening tag:
+ DinoTools::reportError("DinoXmlParser::parse",
+ __LINE__,
+ "wrong closing tag!",
+ getInputFileLineCounter());
+ }
+
+ token = m_pScanner->getNextToken();
+ if (token != closingBracket)
+ {
+ DinoTools::reportError("DinoXmlParser::parse",
+ __LINE__,
+ "Closing Bracket expected!",
+ getInputFileLineCounter());
+ }
+
+ --m_recursionDepth;
+
+ // check if Document contains code after the last closing bracket
+ if (m_recursionDepth == 0){
+ token = m_pScanner->getNextToken();
+ if (token != endOfFile){
+ DinoTools::reportError("DinoXmlParser::parse",
+ __LINE__,
+ "Document contains code after the last closing bracket!",
+ getInputFileLineCounter());
+ }
+ }
+
+ return currentTagObject;
+
+ } // end of Read ">"
+
+ OGDF_ASSERT(false)
+ //continue;
+
+ } // end of found identifier
+
+ OGDF_ASSERT(false)
+
+ } // end of while (true)
+
+ } // parse
+
+ //
+ // a p p e n d A t t r i b u t e O b j e c t
+ //
+ void DinoXmlParser::appendAttributeObject(
+ XmlTagObject *tagObject,
+ XmlAttributeObject *attributeObject)
+ {
+
+ // No attribute exists yet
+ if (tagObject->m_pFirstAttribute == 0) {
+ tagObject->m_pFirstAttribute = attributeObject;
+ }
+ // At least one attribute exists
+ else{
+
+ XmlAttributeObject *currentAttribute = tagObject->m_pFirstAttribute;
+
+ // Find the last attribute
+ while (currentAttribute->m_pNextAttribute != 0){
+ currentAttribute = currentAttribute->m_pNextAttribute;
+ }
+
+ // Append given attribute
+ currentAttribute->m_pNextAttribute = attributeObject;
+
+ }
+
+ } // appendAttributeObject
+
+ //
+ // a p p e n d S o n T a g O b j e c t
+ //
+ void DinoXmlParser::appendSonTagObject(
+ XmlTagObject *currentTagObject,
+ XmlTagObject *sonTagObject)
+ {
+ // No Son exists yet
+ if (currentTagObject->m_pFirstSon == 0) {
+ currentTagObject->m_pFirstSon = sonTagObject;
+ }
+ // At least one son exists
+ else{
+
+ XmlTagObject *currentSon = currentTagObject->m_pFirstSon;
+
+ // Find the last son
+ while (currentSon->m_pBrother != 0){
+ currentSon = currentSon->m_pBrother;
+ }
+
+ // Append given son
+ currentSon->m_pBrother = sonTagObject;
+ }
+
+ } // appendSonTagObject
+
+ //
+ // h a s h S t r i n g
+ //
+ HashedString *DinoXmlParser::hashString(const String &str)
+ {
+ // insertByNeed inserts a new element (str, -1) into the
+ // table if no element with key str exists;
+ // otherwise nothing is done
+ HashedString *key = m_hashTable.insertByNeed(str,-1);
+
+ // String str was not contained in the table
+ // --> assign a new info index to the new string
+ if(key->info() == -1){
+ key->info() = m_hashTableInfoIndex++;
+ }
+
+ return key;
+
+ } // hashString
+
+ //
+ // t r a v e r s e P a t h
+ //
+ bool DinoXmlParser::traversePath(
+ const XmlTagObject &startTag,
+ const Array<int> &infoIndexPath,
+ const XmlTagObject *&targetTag) const
+ {
+ // Traverse array
+ const XmlTagObject *currentTag = &startTag;
+ for (int i = 0; i < infoIndexPath.size(); i++){
+
+ const XmlTagObject *sonTag;
+
+ // Not found
+ if (!findSonXmlTagObject(*currentTag, infoIndexPath[i], sonTag)){
+ return false;
+ }
+
+ // Found
+ currentTag = sonTag;
+
+ } // for
+
+ targetTag = currentTag;
+ return true;
+
+ } // traversePath
+
+ //
+ // f i n d S o n X m l T a g O b j e c t
+ //
+ bool DinoXmlParser::findSonXmlTagObject(const XmlTagObject &father,
+ int sonInfoIndex,
+ const XmlTagObject *&son) const
+ {
+ // Traverse sons
+ const XmlTagObject *currentSon = father.m_pFirstSon;
+ while ((currentSon != 0) &&
+ (currentSon->m_pTagName->info() != sonInfoIndex))
+ {
+ currentSon = currentSon->m_pBrother;
+ }
+
+ // Son found
+ if (currentSon != 0){
+ son = currentSon;
+ return true;
+ }
+
+ // Not found
+ son = 0;
+ return false;
+
+ } // findSonXmlTagObject
+
+ //
+ // f i n d B r o t h e r X m l T a g O b j e c t
+ //
+ bool DinoXmlParser::findBrotherXmlTagObject(const XmlTagObject ¤tTag,
+ int brotherInfoIndex,
+ const XmlTagObject *&brother) const
+ {
+
+ const XmlTagObject *currentBrother = currentTag.m_pBrother;
+ while ((currentBrother != 0) &&
+ (currentBrother->m_pTagName->info() != brotherInfoIndex))
+ {
+ currentBrother = currentBrother->m_pBrother;
+ }
+
+ // brother found
+ if (currentBrother != 0){
+ brother = currentBrother;
+ return true;
+ }
+
+ // Not found
+ brother = 0;
+ return false;
+
+ } // findBrotherXmlTagObject
+
+ //
+ // f i n d X m l A t t r i b u t e O b j e c t
+ //
+ bool DinoXmlParser::findXmlAttributeObject(
+ const XmlTagObject ¤tTag,
+ int attributeInfoIndex,
+ const XmlAttributeObject *&attribute) const
+ {
+ const XmlAttributeObject *currentAttribute = currentTag.m_pFirstAttribute;
+ while ((currentAttribute != 0) &&
+ (currentAttribute->m_pAttributeName->info() != attributeInfoIndex))
+ {
+ currentAttribute = currentAttribute->m_pNextAttribute;
+ }
+
+ // Attribute found
+ if (currentAttribute != 0){
+ attribute = currentAttribute;
+ return true;
+ }
+
+ // Not found
+ attribute = 0;
+ return false;
+
+ } // findXmlAttributeObject
+
+ //
+ // p r i n t H a s h T a b l e
+ //
+ void DinoXmlParser::printHashTable(ostream &os)
+ {
+ // Header
+ os << "\n--- Content of Hash table: m_hashTable ---\n" << endl;
+
+ // Get iterator
+ HashConstIterator<String, int> it;
+
+ // Traverse table
+ for( it = m_hashTable.begin(); it.valid(); ++it){
+ os << "\"" << it.key() << "\" has index " << it.info() << endl;
+ }
+
+ } // printHashTable
+
+ //
+ // p r i n t X m l T a g O b j e c t T r e e
+ //
+ void DinoXmlParser::printXmlTagObjectTree(
+ ostream &outs,
+ const XmlTagObject &rootObject,
+ int indent) const
+ {
+ printSpaces(outs, indent);
+
+ // Opening tag (bracket and Tag name)
+ outs << "<" << rootObject.m_pTagName->key();
+
+ // Attributes
+ XmlAttributeObject *currentAttribute = rootObject.m_pFirstAttribute;
+ while (currentAttribute != 0){
+
+ outs << " "
+ << currentAttribute->m_pAttributeName->key()
+ << " = \""
+ << currentAttribute->m_pAttributeValue->key()
+ << "\"";
+
+ // Next attribute
+ currentAttribute = currentAttribute->m_pNextAttribute;
+
+ } // while
+
+ // Closing bracket
+ outs << ">" << endl;
+
+ // Children
+ const XmlTagObject *currentChild = rootObject.m_pFirstSon;
+ while (currentChild != 0){
+
+ // Proceed recursively
+ printXmlTagObjectTree(outs, *currentChild, indent + 2);
+
+ // Next child
+ currentChild = currentChild->m_pBrother;
+
+ } // while
+
+ // Content
+ if (rootObject.m_pTagValue != 0){
+
+ printSpaces(outs, indent + 2);
+
+ outs << rootObject.m_pTagValue->key() << endl;
+
+ }
+
+ // Closing tag
+ printSpaces(outs, indent);
+ outs << "</" << rootObject.m_pTagName->key() << ">" << endl;
+
+ } // printXmlTagObjectTree
+
+ //
+ // p r i n t S p a c e s
+ //
+ void DinoXmlParser::printSpaces(ostream &outs, int nOfSpaces) const
+ {
+ for (int i = 0; i < nOfSpaces; i++){
+ outs << " ";
+ }
+
+ } // printSpaces
+
+
+ //
+ // o u t p u t O p e r a t o r for DinoXmlParser
+ //
+ ostream &operator<<(ostream &os, const DinoXmlParser &parser)
+ {
+ parser.printXmlTagObjectTree(os, parser.getRootTag(), 0);
+ return os;
+ }
+
+
+} // namespace ogdf
diff --git a/ogdf/fileformats/DinoXmlParser.h b/ogdf/fileformats/DinoXmlParser.h
new file mode 100644
index 0000000..51576d1
--- /dev/null
+++ b/ogdf/fileformats/DinoXmlParser.h
@@ -0,0 +1,464 @@
+/*
+ * $Revision: 2564 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-07 00:03:48 +0200 (Sa, 07. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Contains the struct declarations XmlAttributeObject, XmlTagObject
+ * and the class DinoXmlParser.
+ *
+ * \author Dino Ahr
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_DINO_XML_PARSER_H
+#define OGDF_DINO_XML_PARSER_H
+
+#include "../basic/Stack.h"
+#include "../basic/String.h"
+#include "../basic/Hashing.h"
+#include "../basic/GraphAttributes.h"
+#include "DinoXmlScanner.h"
+
+
+
+namespace ogdf {
+
+ //---------------------------------------------------------
+ // H a s h e d S t r i n g
+ //---------------------------------------------------------
+
+ typedef HashElement<String,int> HashedString;
+
+ //---------------------------------------------------------
+ // X m l A t t r i b u t e O b j e c t
+ //---------------------------------------------------------
+ /** This struct represents an attribute associated to a tag.
+ */
+ struct OGDF_EXPORT XmlAttributeObject {
+
+ /** Contains the name of the attribute, i.e.
+ * for <A attr1="value1"> ... </A> it contains "attr1"
+ */
+ HashedString *m_pAttributeName;
+
+ /** Contains the value assigned to this attribute without qoutes, i.e.
+ * for <A attr1="value1"> ... </A> it contains "value1" and not "\"value1\"".
+ */
+ HashedString *m_pAttributeValue;
+
+ /** Pointer to the next attribute and 0 if this is the only attribute. */
+ XmlAttributeObject *m_pNextAttribute;
+
+ /** Constructor */
+ XmlAttributeObject(HashedString *name, HashedString *value) :
+ m_pAttributeName(name),
+ m_pAttributeValue(value),
+ m_pNextAttribute(0)
+ {};
+
+ /** Destructor; will be performed in destroyParseTree(). */
+ ~XmlAttributeObject(){};
+
+ /** Flag denotes whether attribute is valid or not. */
+ bool m_valid;
+
+ /** Getter. */
+ const String& getName() const {
+ return m_pAttributeName->key();
+ }
+
+ const String& getValue() const {
+ return m_pAttributeValue->key();
+ }
+
+ const bool& valid() const {
+ return m_valid;
+ }
+
+ /** Setter. */
+ void setValid() {
+ m_valid = true;
+ }
+
+ void setInvalid() {
+ m_valid = false;
+ }
+
+ // Overloaded new and delete operators
+ OGDF_NEW_DELETE
+
+ }; // struct XmlAttributeObject
+
+ //---------------------------------------------------------
+ // X m l T a g O b j e c t
+ //---------------------------------------------------------
+ /** This struct represents a node in the XML parse tree.
+ */
+ struct OGDF_EXPORT XmlTagObject {
+
+ /** The identifier of the tag,
+ *i.e. for <A> the identifier is "A"
+ */
+ HashedString *m_pTagName;
+
+ /** Pointer to the first attribute;
+ * if there is more than one attribute these are linked by
+ * m_pNextAttribute in struct XmlAttributeObject
+ */
+ XmlAttributeObject *m_pFirstAttribute;
+
+ /** Contains the characters inbetween the start tag and the end tag,
+ * i.e. for <A attr1=... attr2=...> lala </A> it contains " lala "
+ */
+ HashedString *m_pTagValue;
+
+ /** Contains the pointer to the first son tag object,
+ * i.e. for <A> <B> ... </B> <C> ... </C> </A> it contains a pointer
+ * to the object representing B
+ * The other children of A are reachable via m_pBrother of the first son,
+ * i.e. the variable m_pBrother of the object representing B contains a
+ * pointer to the object representing C
+ */
+ XmlTagObject *m_pFirstSon;
+
+ /** Contains the pointer to a brother tag object or 0 if this
+ * object is the only child
+ */
+ XmlTagObject *m_pBrother;
+
+ /** Constructor */
+ XmlTagObject(HashedString *name) :
+ m_pTagName(name),
+ m_pFirstAttribute(0),
+ m_pTagValue(0),
+ m_pFirstSon(0),
+ m_pBrother(0),
+ m_valid(0)
+ {};
+
+ /** Destructor; will be performed in destroyParseTree(). */
+ ~XmlTagObject(){};
+
+ /** Flag denotes whether attribute is valid or not. */
+ mutable bool m_valid;
+
+ /** integer value for the depth in the xml parse tree */
+ int m_depth;
+
+ /** integer value that stores the line number
+ * of the tag in the parsed xml document */
+ int m_line;
+
+ public:
+
+ /**Checks if currentNode is leaf in the parse tree.
+ * Returns true if list of sons is empty.
+ * Returns false otherwise.
+ *
+ * NEW
+ */
+ bool isLeaf() const;
+
+ /**Searches for a son with tag name sonsName.
+ * Returns the son via the referenced pointer son.
+ * Returns true if son is found.
+ * Returns false, otherwise, son is set to NULL.
+ *
+ * NEW
+ */
+ bool findSonXmlTagObjectByName( const String sonsName,
+ XmlTagObject *&son) const;
+
+ /**Searches for sons with tag name sonsName.
+ * Returns the sons via a list with pointers to the sons.
+ * Returns true if at least one son was found.
+ * Returns false otherwise, sons is set to NULL.
+ *
+ * NEW
+ */
+ bool findSonXmlTagObjectByName( const String sonsName,
+ List<XmlTagObject*> &sons) const;
+
+ /**Searches for sons of father which names are inequal to those
+ * in list sonsNames.
+ * Returns true if at least one son of father is found whose name
+ * doesn't match one in sonsNames.
+ * Returns false otherwise.
+ *
+ * NEW
+ */
+ bool hasMoreSonXmlTagObject(const List<String> &sonNamesToIgnore) const;
+
+ /**Searches for an attribute with name name.
+ *
+ * NEW
+ */
+ bool findXmlAttributeObjectByName(
+ const String attName,
+ XmlAttributeObject*& attribute) const;
+
+ /**Checks if currentTag owns at least one attribute.
+ * Returns true if list of attributes isn't empty.
+ * Returns false otherwise.
+ *
+ * NEW
+ */
+ bool isAttributeLess() const;
+
+ /** Getter. */
+ const bool& valid() const {
+ return m_valid;
+ }
+
+ const String& getName() const {
+ return m_pTagName->key();
+ }
+
+ const String& getValue() const {
+ return m_pTagValue->key();
+ }
+
+ /** Setter. */
+ void setValid() const {
+ m_valid = true;
+ }
+
+ void setInvalid() {
+ m_valid = false;
+ }
+
+ /* get for depth of xml-tag-object */
+ const int& getDepth() const {
+ return m_depth;
+ }
+
+ /* setter for new depth */
+ void setDepth(int newDepth){
+ m_depth = newDepth;
+ }
+
+
+ /* get for line of xml-tag-object */
+ const int& getLine() const {
+ return m_line;
+ }
+
+ /* setter for line */
+ void setLine(int line) {
+ m_line = line;
+ }
+
+ // Overloaded new and delete operators
+ OGDF_NEW_DELETE
+
+ }; // struct XmlTagObject
+
+ //---------------------------------------------------------
+ // D i n o X m l P a r s e r
+ //---------------------------------------------------------
+ /** This class parses the XML input file and builds up a
+ * parse tree with linked elements XMLTagObject and
+ * XMLAttributeObject. The class DinoXmlScanner is used to
+ * get the token for the parse process.
+ */
+ class OGDF_EXPORT DinoXmlParser {
+
+ friend ostream &operator<<(ostream&, const DinoXmlParser &);
+
+ private:
+
+ /** Pointer to the root element of the parse tree. */
+ XmlTagObject *m_pRootTag;
+
+ /** Pointer to the scanner. */
+ DinoXmlScanner *m_pScanner;
+
+ /** Hash table for storing names of TagObjects and
+ * AttributeObjects in an efficient manner.
+ * The key element is String.
+ * The info element is int.
+ */
+ Hashing<String,int> m_hashTable;
+
+ /** The info element of the hash table is simply an integer
+ * number which is incremented for each new element (starting at 0).
+ * The value m_hashTableInfoIndex - 1 is the last used index.
+ */
+ int m_hashTableInfoIndex;
+
+ /** Recursion depth of parse(). */
+ int m_recursionDepth;
+ /** stack for checking correctness of correspondent closing tags */
+ Stack<String> m_tagObserver;
+
+
+ public:
+
+ /** Constructor.
+ * Inside the constructor the scanner is generated.
+ */
+ DinoXmlParser(const char *fileName);
+
+ /** Destructor; destroys the parse tree. */
+ ~DinoXmlParser();
+
+ /** Creates a new hash element and inserts it into the hash table.
+ */
+ void addNewHashElement(const String &key, int info){
+ OGDF_ASSERT(info >= m_hashTableInfoIndex)
+ m_hashTable.fastInsert(key, info);
+ m_hashTableInfoIndex = info + 1;
+ }
+
+ /** Creates the parse tree and anchors it in m_pRootTag.
+ * TODO: Should return a value to indicate if success.
+ */
+ void createParseTree();
+
+ /** Allows (non modifying) access to the parse tree. */
+ const XmlTagObject &getRootTag() const {
+ return *m_pRootTag;
+ }
+
+ /** Traverses the parseTree starting at startTag using the path
+ * description in path, which contains the infoIndices of the tags
+ * which have to be traversed.
+ * If the XmlTagObject associated to the last infoIndex in the path is
+ * found, it is returned via targetTag and the return value is true
+ * If the XmlTagObject is not found the return value is false.
+ */
+ bool traversePath(
+ const XmlTagObject &startTag,
+ const Array<int> &infoIndexPath,
+ const XmlTagObject *&targetTag) const;
+
+ /** Searches for a specific son (identified by sonInfoIndex)
+ * of father.
+ * Returns the son via the referenced pointer son.
+ * Returns true if son is found.
+ * Returns false otherwise, son is set to NULL.
+ */
+ bool findSonXmlTagObject(
+ const XmlTagObject &father,
+ int sonInfoIndex,
+ const XmlTagObject *&son) const;
+
+ /** Searches for a specific brother (identified by brotherInfoIndex)
+ * of current.
+ * Returns the brother via the referenced pointer brother.
+ * Returns true if brother is found.
+ * Returns false otherwise, brother is set to NULL.
+ */
+ bool findBrotherXmlTagObject(
+ const XmlTagObject ¤tTag,
+ int brotherInfoIndex,
+ const XmlTagObject *&brother) const;
+
+ /** Searches for a specific attribute (identified by attributeInfoIndex)
+ * of current.
+ * Returns the attribute via the referenced pointer attribute.
+ * Returns true if attribute is found.
+ * Returns false otherwise, attribute is set to NULL.
+ */
+ bool findXmlAttributeObject(
+ const XmlTagObject ¤tTag,
+ int attributeInfoIndex,
+ const XmlAttributeObject *&attribute) const;
+
+ /** Returns line number of the most recently read line of
+ * the input file.
+ */
+ inline int getInputFileLineCounter() const {
+ return m_pScanner->getInputFileLineCounter();
+ }
+
+ /** Prints the content of the hash table to os. */
+ void printHashTable(ostream &os);
+
+ private:
+
+ /** Destroys the parse tree appended to root. */
+ void destroyParseTree(XmlTagObject *root);
+
+ /** Parses the token stream provided by the scanner until a complete
+ * XmlTagObject is identified which will be returned.
+ * This function is likely to be called recursively
+ * due to the recursive structure of XML documents.
+ */
+ XmlTagObject* parse();
+
+ /** Append attributeObject to list of attributes of tagObject. */
+ void appendAttributeObject(
+ XmlTagObject *tagObject,
+ XmlAttributeObject *attributeObject);
+
+ /** Appends sonTagObject to the list of sons of currentTagObject. */
+ void appendSonTagObject(
+ XmlTagObject *currentTagObject,
+ XmlTagObject *sonTagObject);
+
+ /** Returns the hash element for the given string.
+ * If the key str is not contained in the table yet, it is
+ * inserted together with a new info index and the new
+ * hash element is returned.
+ * If the key str exists, the associated hash element is returned.
+ */
+ HashedString *hashString(const String &str);
+
+ /** Prints the given XmlTagObject and its children recursively.
+ * The parameter indent is used as indentation value.
+ */
+ void printXmlTagObjectTree(
+ ostream &os,
+ const XmlTagObject &rootObject,
+ int indent = 0) const;
+
+ /** Little helper that prints nOfSpaces space characters. */
+ void printSpaces(ostream &os, int nOfSpaces) const;
+
+ }; // class DinoXmlParser
+
+ /** Output operator for DinoXmlParser. */
+ ostream &operator<<(ostream &os, const DinoXmlParser &parser);
+
+} // end namespace ogdf
+
+#endif
diff --git a/ogdf/fileformats/DinoXmlScanner.cpp b/ogdf/fileformats/DinoXmlScanner.cpp
new file mode 100644
index 0000000..b8d6c70
--- /dev/null
+++ b/ogdf/fileformats/DinoXmlScanner.cpp
@@ -0,0 +1,448 @@
+/*
+ * $Revision: 2565 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-07 17:14:54 +0200 (Sa, 07. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of the class DinoXmlScanner serving the
+ * class DinoXmlParser
+ *
+ * \author Dino Ahr
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "DinoXmlScanner.h"
+
+#include <ctype.h>
+#include <string.h>
+
+extern ofstream os;
+
+namespace ogdf {
+
+ //
+ // C o n s t r u c t o r
+ //
+ DinoXmlScanner::DinoXmlScanner(const char *fileName)
+ {
+ // Create line buffer
+ m_pLineBuffer = new DinoLineBuffer(fileName);
+
+ // Create current token string
+ m_pCurrentTokenString = new char[DinoLineBuffer::c_maxStringLength];
+ if (m_pCurrentTokenString == 0)
+ OGDF_THROW(InsufficientMemoryException);
+ for (int i = 0; i < DinoLineBuffer::c_maxStringLength; i++){
+ m_pCurrentTokenString[i] = '0';
+ }
+
+ } // DinoXmlScanner::DinoXmlScanner
+
+ //
+ // D e s t r u c t o r
+ //
+ DinoXmlScanner::~DinoXmlScanner()
+ {
+ // Destroy current token string
+ delete [] m_pCurrentTokenString;
+
+ // Destroy line buffer
+ delete m_pLineBuffer;
+
+ } // DinoXmlScanner::~DinoXmlScanner
+
+ //
+ // g e t N e x t T o k e n
+ //
+ // Take a look at the state machine of getNextToken() to understand
+ // what is going on here.
+ //
+ // TODO: It seems to be useful that this function throws an exception
+ // if something goes wrong.
+ XmlToken DinoXmlScanner::getNextToken(){
+
+ // First skip whitespaces
+ m_pLineBuffer->skipWhitespace();
+
+ // Let's have a look at the current character
+ char currentCharacter = m_pLineBuffer->getCurrentCharacter();
+
+ // End of file reached
+ if (currentCharacter == EOF){
+ return endOfFile;
+ }
+
+ // First we handle single characters with a switch statement
+ switch (currentCharacter){
+
+ // Opening Bracket
+ case '<':
+ {
+ m_pLineBuffer->moveToNextCharacter();
+ return openingBracket;
+ }
+ break;
+
+ // Closing Bracket
+ case '>':
+ {
+ m_pLineBuffer->moveToNextCharacter();
+ return closingBracket;
+ }
+ break;
+
+ // Question Mark
+ case '?':
+ {
+ m_pLineBuffer->moveToNextCharacter();
+ return questionMark;
+ }
+ break;
+
+ // Exclamation Mark
+ case '!':
+ {
+ m_pLineBuffer->moveToNextCharacter();
+ return exclamationMark;
+ }
+ break;
+
+ // Minus
+ case '-':
+ {
+ m_pLineBuffer->moveToNextCharacter();
+ return minus;
+ }
+ break;
+
+ // Slash
+ case '/':
+ {
+ m_pLineBuffer->moveToNextCharacter();
+ return slash;
+ }
+ break;
+
+ // Equal Sign
+ case '=':
+ {
+ m_pLineBuffer->moveToNextCharacter();
+ return equalSign;
+ }
+ break;
+
+ } // end of switch
+
+ // Now we handle more complex token
+
+ // Identifier
+ if (isalpha(currentCharacter)){
+
+ // Put a pointer to the beginning of the identifier
+ DinoLineBufferPosition startPosition = m_pLineBuffer->getCurrentPosition();
+
+ currentCharacter = m_pLineBuffer->moveToNextCharacter();
+
+ // Read valid identifier characters
+ while ((isalnum(currentCharacter)) || // a..z|A..Z|0..9
+ (currentCharacter == '.') ||
+ (currentCharacter == ':') ||
+ (currentCharacter == '_'))
+ {
+ currentCharacter = m_pLineBuffer->moveToNextCharacter();
+ }
+
+ // Copy identifier to currentTokenString
+ m_pLineBuffer->extractString(startPosition,
+ m_pLineBuffer->getCurrentPosition(),
+ m_pCurrentTokenString);
+
+ // Return identifier token
+ return identifier;
+
+ } // end of identifier
+
+ // Quoted characters " ... " or ' ... '
+ if ((currentCharacter == '\"') ||
+ (currentCharacter == '\''))
+ {
+ // Distinguish what kind of quote sign we have
+ bool doubleQuote;
+ if (currentCharacter == '\"')
+ doubleQuote = true;
+ else
+ doubleQuote = false;
+
+ // Skip quote sign
+ currentCharacter = m_pLineBuffer->moveToNextCharacter();
+
+ // Read until the closing quotation sign is found
+ // String is copied to m_pCurrentTokenString by readStringUntil()
+ if (doubleQuote){
+ readStringUntil('\"', false);
+ }
+ else{
+ readStringUntil('\'', false);
+ }
+
+ // Skip over the end quote character
+ m_pLineBuffer->moveToNextCharacter();
+
+ // Return token for quoted value
+ return quotedValue;
+
+ } // end of quoted characters
+
+ // An atributeValue, i.e. a sequence of characters, digits, minus - or dot .
+ if ((isalnum(currentCharacter)) ||
+ (currentCharacter == '-') ||
+ (currentCharacter == '.'))
+ {
+ // Put a pointer to the beginning of the quoted text
+ DinoLineBufferPosition startPosition = m_pLineBuffer->getCurrentPosition();;
+
+ // Read until until an invalid character occurs
+ currentCharacter = m_pLineBuffer->moveToNextCharacter();
+ while ((isalnum(currentCharacter)) ||
+ (currentCharacter == '-') ||
+ (currentCharacter == '.'))
+ {
+ currentCharacter = m_pLineBuffer->moveToNextCharacter();
+ }
+
+ // Copy attributeValue to currentTokenString
+ m_pLineBuffer->extractString(startPosition,
+ m_pLineBuffer->getCurrentPosition(),
+ m_pCurrentTokenString);
+
+ // Return token for attribute value
+ return attributeValue;
+
+ } // end of an attributeValue
+
+ // No valid token
+ m_pLineBuffer->moveToNextCharacter();
+ return invalidToken;
+
+ } // getNextToken
+
+ //
+ // t e s t N e x t T o k e n
+ //
+ XmlToken DinoXmlScanner::testNextToken(){
+
+ // Save pointer to the current position
+ DinoLineBufferPosition originalPosition = m_pLineBuffer->getCurrentPosition();
+
+ // Call getNextToken()
+ XmlToken returnToken = getNextToken();
+
+ // Set pointer back to the original position
+ m_pLineBuffer->setCurrentPosition(originalPosition);
+
+ // Return token
+ return returnToken;
+
+ } // testNextToken
+
+ //
+ // t e s t N e x t N e x t T o k e n
+ //
+ XmlToken DinoXmlScanner::testNextNextToken(){
+
+ // Save pointer to the current position
+ DinoLineBufferPosition originalPosition = m_pLineBuffer->getCurrentPosition();
+
+ // Call getNextToken()
+ getNextToken();
+
+ // Again Call getNextToken()
+ XmlToken returnToken = getNextToken();
+
+ // Set pointer back to the original position
+ m_pLineBuffer->setCurrentPosition(originalPosition);
+
+ // Return token
+ return returnToken;
+
+ } // testNextNextToken
+
+ //
+ // s k i p U n t i l
+ //
+ bool DinoXmlScanner::skipUntil(char searchCharacter, bool skipOverSearchCharacter){
+
+ while (m_pLineBuffer->getCurrentCharacter() != EOF){
+
+ // Search character has been found!
+ if (m_pLineBuffer->getCurrentCharacter() == searchCharacter){
+
+ // Move to the position behind the search character if desired
+ if (skipOverSearchCharacter){
+ m_pLineBuffer->moveToNextCharacter();
+ }
+
+ return true;
+
+ } // Search character has been found!
+
+ // Move to next character and proceed
+ m_pLineBuffer->moveToNextCharacter();
+
+ } // while (!EOF)
+
+ return false;
+
+ } // skipUntil
+
+ //
+ // s k i p U n t i l M a t c h i n g C l o s i n g B r a c k e t
+ //
+ bool DinoXmlScanner::skipUntilMatchingClosingBracket(){
+
+ // We assume that the opening bracket has already been read
+ int bracketParity = 1;
+
+ while ((m_pLineBuffer->getCurrentCharacter() != EOF) &&
+ (bracketParity != 0))
+ {
+ // Opening bracket has been found!
+ if (m_pLineBuffer->getCurrentCharacter() == '<'){
+
+ ++bracketParity;
+ }
+
+ // Closing bracket has been found!
+ if (m_pLineBuffer->getCurrentCharacter() == '>'){
+
+ --bracketParity;
+ }
+
+ // Move to next character and proceed
+ m_pLineBuffer->moveToNextCharacter();
+
+ } // while
+
+ if (bracketParity != 0 )
+ return false;
+ else
+ return true;
+
+ } // skipUntilMatchingClosingBracket
+
+ //
+ // r e a d S t r i n g U n t i l
+ //
+ bool DinoXmlScanner::readStringUntil(char searchCharacter,
+ bool includeSearchCharacter){
+
+ // Remember start position
+ DinoLineBufferPosition startPosition = m_pLineBuffer->getCurrentPosition();
+
+ // Use skipUntil()
+ if (skipUntil(searchCharacter, includeSearchCharacter)){
+
+ // Copy found string to m_pCurrentTokenString
+ m_pLineBuffer->extractString(startPosition,
+ m_pLineBuffer->getCurrentPosition(),
+ m_pCurrentTokenString);
+
+ return true;
+
+ }
+ // An error occurred
+ else{
+ return false;
+ }
+
+ } // getStringUntil
+
+ //
+ // t e s t
+ //
+ void DinoXmlScanner::test(){
+
+ bool terminate = false;
+ XmlToken currentToken;
+
+ while (!terminate){
+
+ cout << "Line " << getInputFileLineCounter() << ": ";
+ currentToken = getNextToken();
+
+ switch (currentToken){
+ case openingBracket:
+ cout << "<" << endl;
+ break;
+ case closingBracket:
+ cout << ">" << endl;
+ break;
+ case questionMark:
+ cout << "?" << endl;
+ break;
+ case exclamationMark:
+ cout << "!" << endl;
+ break;
+ case minus:
+ cout << "-" << endl;
+ break;
+ case slash:
+ cout << "/" << endl;
+ break;
+ case equalSign:
+ cout << "<" << endl;
+ break;
+ case identifier:
+ cout << "Identifier: " << m_pCurrentTokenString << endl;
+ break;
+ case attributeValue:
+ cout << "Attribute value: " << m_pCurrentTokenString << endl;
+ break;
+ case quotedValue:
+ cout << "Quoted value: \"" << m_pCurrentTokenString << "\"" << endl;
+ break;
+ case endOfFile:
+ cout << "EOF" << endl;
+ terminate = true;
+ break;
+ default:
+ cout << "Invalid token!" << endl;
+
+ } // switch
+
+ } // while
+
+ } // testScanner
+
+} // namespace ogdf
diff --git a/ogdf/fileformats/DinoXmlScanner.h b/ogdf/fileformats/DinoXmlScanner.h
new file mode 100644
index 0000000..dbb73b6
--- /dev/null
+++ b/ogdf/fileformats/DinoXmlScanner.h
@@ -0,0 +1,166 @@
+/*
+ * $Revision: 2564 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-07 00:03:48 +0200 (Sa, 07. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Contains the enum XmlToken and the class DinoXmlScanner.
+ *
+ * \author Dino Ahr
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_DINO_XML_SCANNER_H
+#define OGDF_DINO_XML_SCANNER_H
+
+#include "DinoLineBuffer.h"
+
+namespace ogdf {
+
+ //---------------------------------------------------------
+ // X m l T o k e n
+ //---------------------------------------------------------
+ /** This enum type represents the values, which are returned by
+ * the function DinoXmlScanner::getNextToken().
+ * @see DinoXmlScanner::getNextToken()
+ */
+ enum XmlToken {
+ openingBracket, ///< <
+ closingBracket, ///< >
+ questionMark, ///< ?
+ exclamationMark, ///< !
+ minus, ///< -
+ slash, ///< /
+ equalSign, ///< =
+ identifier, ///< (a..z|A..Z){(a..z|A..Z|0..9|.|_|:)}
+ attributeValue, ///< a sequence of characters, digits, minus - and dot .
+ quotedValue, ///< all quoted content " ... " or ' ... '
+ endOfFile, ///< End of file detected
+ invalidToken, ///< No token identified
+ noToken ///< Used for the m_lookAheadToken to indicate that there
+ ///< is no lookahead token
+ }; // enum XmlToken
+
+
+ //---------------------------------------------------------
+ // D i n o X m l S c a n n e r
+ //---------------------------------------------------------
+ /** This class scans the characters of the input file and
+ * provides the detected token.
+ */
+ class OGDF_EXPORT DinoXmlScanner {
+
+ private:
+
+ // Pointer to the line buffer
+ DinoLineBuffer *m_pLineBuffer;
+
+ // String which contains the characters of the current token
+ // Its size is limited to DinoLineBuffer::c_maxStringLength
+ char *m_pCurrentTokenString;
+
+ public:
+ // construction
+ DinoXmlScanner(const char *fileName);
+
+ // destruction: destroys the parse tree
+ ~DinoXmlScanner();
+
+ // This function represents the core of the scanner. It scans the input
+ // and returns the identified token. After performing getNextToken() the
+ // token is "consumed", i.e. the line buffer pointer already points to the
+ // next token.
+ // The scanned string is deposited in m_pCurrentTokenString, hence it is
+ // available via getCurrentTokenString()
+ XmlToken getNextToken();
+
+ // Returns the current token string
+ inline const char *getCurrentTokenString(){
+ return m_pCurrentTokenString;
+ }
+
+ // This function provides a lookahead to the next token;
+ // the token is NOT consumed like it is the case for getNextToken()
+ XmlToken testNextToken();
+
+ // This function provides a lookahead to the nextnext token;
+ // the tokens are NOT consumed like it is the case for getNextToken()
+ XmlToken testNextNextToken();
+
+ // Skips until the searchCharacter is found;
+ //
+ // If skipOverSearchCharacter is set true the currentPosition will be set
+ // BEHIND the search character
+ // otherwise the pointer currentPosition points TO the searchCharacter
+ //
+ // Returns true if the searchCharacter is found
+ // Returns false if file ends before the searchCharacter is found
+ bool skipUntil(char searchCharacter, bool skipOverSearchCharacter = true);
+
+ // Skips until '>' is found (> is consumed)
+ // Nested brackets are taken into account
+ // Returns true if matching bracket has been found; false otherwise
+ bool skipUntilMatchingClosingBracket();
+
+ // Reads until the searchCharacter is found; the string starting at the current
+ // position and ending at the position where the search character is found
+ // is deposited in m_pCurrentTokenString.
+ // If includeSearchCharacter is false (default) the search character is
+ // not contained; otherwise it is contained
+ //
+ // Returns true if the searchCharacter is found
+ // Returns false if file ends before the searchCharacter is found
+ bool readStringUntil(char searchCharacter, bool includeSearchCharacter = false);
+
+ // Returns line number of the most recently read line of the input file
+ inline int getInputFileLineCounter() const {
+ return m_pLineBuffer->getInputFileLineCounter();
+ }
+
+ // This function tests the scanner by reading the complete
+ // input file and printing the identified token to stdout
+ void test();
+
+ }; // class DinoXmlScanner
+
+} // end namespace ogdf
+
+#endif
diff --git a/ogdf/fileformats/GmlParser.cpp b/ogdf/fileformats/GmlParser.cpp
new file mode 100644
index 0000000..5fafa87
--- /dev/null
+++ b/ogdf/fileformats/GmlParser.cpp
@@ -0,0 +1,1315 @@
+/*
+ * $Revision: 2565 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-07 17:14:54 +0200 (Sa, 07. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of GML parser (class GmlParser)
+ * (used for parsing and reading GML files)
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "GmlParser.h"
+#include <ctype.h>
+#include <string.h>
+
+extern ofstream os;
+
+namespace ogdf {
+
+GmlParser::GmlParser(const char *fileName, bool doCheck)
+{
+ ifstream is(fileName, ios::in); // open file
+ doInit(is,doCheck);
+}
+
+
+GmlParser::GmlParser(istream &is, bool doCheck)
+{
+ doInit(is,doCheck);
+}
+
+
+void GmlParser::doInit(istream &is, bool doCheck)
+{
+ m_objectTree = 0;
+
+ if (!is) {
+ setError("Cannot open file.");
+ return;
+ }
+
+ createObjectTree(is,doCheck);
+
+ int minId, maxId;
+ m_graphObject = getNodeIdRange(minId, maxId);
+ m_mapToNode.init(minId,maxId,0);
+}
+
+
+void GmlParser::createObjectTree(istream &is, bool doCheck)
+{
+ initPredefinedKeys();
+ m_error = false;
+
+ m_is = &is;
+ m_doCheck = doCheck; // indicates more extensive checking
+
+ // initialize line buffer (note: GML specifies a maximal line length
+ // of 254 characters!)
+ m_rLineBuffer = new char[256];
+ if (m_rLineBuffer == 0) OGDF_THROW(InsufficientMemoryException);
+
+ *m_rLineBuffer = '\n';
+ m_lineBuffer = m_rLineBuffer+1;
+
+ m_pCurrent = m_pStore = m_lineBuffer;
+ m_cStore = 0; // forces getNextSymbol() to read first line
+
+ // create object tree
+ m_objectTree = parseList(gmlEOF,gmlListEnd);
+
+ delete[] m_rLineBuffer;
+}
+
+// we use predefined id constants for all relevant keys
+// this allows us to use efficient switch() statemnts in read() methods
+void GmlParser::initPredefinedKeys()
+{
+ m_hashTable.fastInsert("id", idPredefKey);
+ m_hashTable.fastInsert("label", labelPredefKey);
+ m_hashTable.fastInsert("Creator", CreatorPredefKey);
+ m_hashTable.fastInsert("name", namePredefKey);
+ m_hashTable.fastInsert("graph", graphPredefKey);
+ m_hashTable.fastInsert("version", versionPredefKey);
+ m_hashTable.fastInsert("directed", directedPredefKey);
+ m_hashTable.fastInsert("node", nodePredefKey);
+ m_hashTable.fastInsert("edge", edgePredefKey);
+ m_hashTable.fastInsert("graphics", graphicsPredefKey);
+ m_hashTable.fastInsert("x", xPredefKey);
+ m_hashTable.fastInsert("y", yPredefKey);
+ m_hashTable.fastInsert("w", wPredefKey);
+ m_hashTable.fastInsert("h", hPredefKey);
+ m_hashTable.fastInsert("type", typePredefKey);
+ m_hashTable.fastInsert("width", widthPredefKey);
+ m_hashTable.fastInsert("source", sourcePredefKey);
+ m_hashTable.fastInsert("target", targetPredefKey);
+ m_hashTable.fastInsert("arrow", arrowPredefKey);
+ m_hashTable.fastInsert("Line", LinePredefKey);
+ m_hashTable.fastInsert("line", linePredefKey);
+ m_hashTable.fastInsert("point", pointPredefKey);
+ m_hashTable.fastInsert("generalization", generalizationPredefKey);
+ m_hashTable.fastInsert("subgraph", subGraphPredefKey);
+ m_hashTable.fastInsert("fill", fillPredefKey);
+ m_hashTable.fastInsert("cluster", clusterPredefKey);
+ m_hashTable.fastInsert("rootcluster", rootClusterPredefKey);
+ m_hashTable.fastInsert("vertex", vertexPredefKey);
+ m_hashTable.fastInsert("color", colorPredefKey);
+ m_hashTable.fastInsert("height", heightPredefKey);
+ m_hashTable.fastInsert("stipple", stipplePredefKey); //linestyle
+ m_hashTable.fastInsert("pattern", patternPredefKey); //brush pattern
+ m_hashTable.fastInsert("lineWidth", lineWidthPredefKey);//line width
+ m_hashTable.fastInsert("template", templatePredefKey);//line width
+ m_hashTable.fastInsert("weight", edgeWeightPredefKey);
+
+ // further keys get id's starting with NEXTPREDEFKEY
+ m_num = NEXTPREDEFKEY;
+}
+
+
+GmlObject *GmlParser::parseList(GmlObjectType closingKey,
+ GmlObjectType /* errorKey */)
+{
+ GmlObject *firstSon = 0;
+ GmlObject **pPrev = &firstSon;
+
+ for( ; ; ) {
+ GmlObjectType symbol = getNextSymbol();
+
+ if (symbol == closingKey || symbol == gmlError)
+ return firstSon;
+
+ if (symbol != gmlKey) {
+ setError("key expected");
+ return firstSon;
+ }
+
+ GmlKey key = m_keySymbol;
+
+ symbol = getNextSymbol();
+ GmlObject *object = 0;
+
+ switch (symbol) {
+ case gmlIntValue:
+ object = OGDF_NEW GmlObject(key,m_intSymbol);
+ break;
+
+ case gmlDoubleValue:
+ object = OGDF_NEW GmlObject(key,m_doubleSymbol);
+ break;
+
+ case gmlStringValue: {
+ size_t len = strlen(m_stringSymbol)+1;
+ char *pChar = new char[len];
+ if (pChar == 0) OGDF_THROW(InsufficientMemoryException);
+
+ ogdf::strcpy(pChar,len,m_stringSymbol);
+ object = OGDF_NEW GmlObject(key,pChar); }
+ break;
+
+ case gmlListBegin:
+ object = OGDF_NEW GmlObject(key);
+ object->m_pFirstSon = parseList(gmlListEnd,gmlEOF);
+ break;
+
+ case gmlListEnd:
+ setError("unexpected end of list");
+ return firstSon;
+
+ case gmlKey:
+ setError("unexpected key");
+ return firstSon;
+
+ case gmlEOF:
+ setError("missing value");
+ return firstSon;
+
+ case gmlError:
+ return firstSon;
+
+ OGDF_NODEFAULT // one of the cases above has to occur
+ }
+
+ *pPrev = object;
+ pPrev = &object->m_pBrother;
+ }
+
+ return firstSon;
+}
+
+
+void GmlParser::destroyObjectList(GmlObject *object)
+{
+ GmlObject *nextObject;
+ for(; object; object = nextObject) {
+ nextObject = object->m_pBrother;
+
+ if (object->m_valueType == gmlStringValue)
+ delete[] const_cast<char *>(object->m_stringValue);
+
+ else if (object->m_valueType == gmlListBegin)
+ destroyObjectList(object->m_pFirstSon);
+
+ delete object;
+ }
+}
+
+
+GmlParser::~GmlParser()
+{
+ // we have to delete all objects and allocated char arrays in string values
+ destroyObjectList(m_objectTree);
+}
+
+
+bool GmlParser::getLine()
+{
+ do {
+ if (m_is->eof()) return false;
+ (*m_is) >> std::ws; // skip whitespace like spaces for indentation
+ m_is->getline(m_lineBuffer,255);
+ if (m_is->fail())
+ return false;
+ for(m_pCurrent = m_lineBuffer;
+ *m_pCurrent && isspace(*m_pCurrent); ++m_pCurrent) ;
+ } while (*m_pCurrent == '#' || *m_pCurrent == 0);
+
+ return true;
+}
+
+
+GmlObjectType GmlParser::getNextSymbol()
+{
+ *m_pStore = m_cStore;
+
+ // eat whitespace
+ for(; *m_pCurrent && isspace(*m_pCurrent); ++m_pCurrent) ;
+
+ // get new line if required
+ if (*m_pCurrent == 0) {
+ if (!getLine()) return gmlEOF;
+ }
+
+ // identify start of current symbol
+ char *pStart = m_pCurrent;
+
+ // we currently do not support strings with line breaks!
+ if (*pStart == '\"')
+ { // string
+ m_stringSymbol = ++m_pCurrent;
+ char *pWrite = m_pCurrent;
+ while(*m_pCurrent != 0 && *m_pCurrent != '\"')
+ {
+ if (*m_pCurrent == '\\')
+ {
+ // note: this block is repeated below
+ switch(*(m_pCurrent+1)) {
+ case 0:
+ *m_pCurrent = 0;
+ break;
+ case '\\':
+ *pWrite++ = '\\';
+ m_pCurrent += 2;
+ break;
+ case '\"':
+ *pWrite++ = '\"';
+ m_pCurrent += 2;
+ break;
+ default:
+ // just copy the escape sequence as is
+ *pWrite++ = *m_pCurrent++;
+ *pWrite++ = *m_pCurrent++;
+ }
+
+ } else
+ *pWrite++ = *m_pCurrent++;
+ }
+
+ if (*m_pCurrent == 0)
+ {
+ *pWrite = 0;
+ m_longString = (pStart+1);
+ while(getLine())
+ {
+ m_pCurrent = pWrite = m_lineBuffer;
+ while(*m_pCurrent != 0 && *m_pCurrent != '\"')
+ {
+ if (*m_pCurrent == '\\')
+ {
+ // (block repeated from above)
+ switch(*(m_pCurrent+1)) {
+ case 0:
+ *m_pCurrent = 0;
+ break;
+ case '\\':
+ *pWrite++ = '\\';
+ m_pCurrent += 2;
+ break;
+ case '\"':
+ *pWrite++ = '\"';
+ m_pCurrent += 2;
+ break;
+ default:
+ // just copy the escape sequence as is
+ *pWrite++ = *m_pCurrent++;
+ *pWrite++ = *m_pCurrent++;
+ }
+
+ } else
+ *pWrite++ = *m_pCurrent++;
+ }
+
+ if (*m_pCurrent == 0) {
+ *pWrite = 0;
+ m_longString += m_lineBuffer;
+
+ } else {
+ m_cStore = *(m_pStore = m_pCurrent);
+ ++m_pCurrent;
+ *pWrite = 0;
+ m_longString += m_lineBuffer;
+ break;
+ }
+ }
+ m_stringSymbol = m_longString.cstr();
+
+ } else {
+ m_cStore = *(m_pStore = m_pCurrent);
+ ++m_pCurrent;
+ *pWrite = 0;
+ }
+
+ return gmlStringValue;
+ }
+
+ // identify end of current symbol
+ while(*m_pCurrent != 0 && !isspace(*m_pCurrent)) ++m_pCurrent;
+
+ m_cStore = *(m_pStore = m_pCurrent);
+ *m_pCurrent = 0;
+
+ if(isalpha(*pStart)) { // key
+
+ // check if really a correct key (error if not)
+ if (m_doCheck) {
+ for (char *p = pStart+1; *p; ++p)
+ if (!(isalpha(*p) || isdigit(*p))) {
+ setError("malformed key");
+ return gmlError;
+ }
+ }
+
+ m_keySymbol = hashString(pStart);
+ return gmlKey;
+
+ } else if (*pStart == '[') {
+ return gmlListBegin;
+
+ } else if (*pStart == ']') {
+ return gmlListEnd;
+
+ } else if (*pStart == '-' || isdigit(*pStart)) { // int or double
+ char *p = pStart+1;
+ while(isdigit(*p)) ++p;
+
+ if (*p == '.') { // double
+ // check to be done
+
+ sscanf(pStart,"%lf",&m_doubleSymbol);
+ return gmlDoubleValue;
+
+ } else { // int
+ if (*p != 0) {
+ setError("malformed number");
+ return gmlError;
+ }
+
+ sscanf(pStart,"%d",&m_intSymbol);
+ return gmlIntValue;
+ }
+ }
+
+ setError("unknown symbol");
+
+ return gmlError;
+}
+
+
+GmlKey GmlParser::hashString(const String &str)
+{
+ GmlKey key = m_hashTable.insertByNeed(str,-1);
+ if(key->info() == -1) key->info() = m_num++;
+
+ return key;
+}
+
+
+GmlObject *GmlParser::getNodeIdRange(int &minId,int &maxId)
+{
+ minId = maxId = 0;
+
+ GmlObject *graphObject = m_objectTree;
+ for(; graphObject; graphObject = graphObject->m_pBrother)
+ if (id(graphObject) == graphPredefKey) break;
+
+ if (!graphObject || graphObject->m_valueType != gmlListBegin) return 0;
+
+ bool first = true;
+ GmlObject *son = graphObject->m_pFirstSon;
+ for(; son; son = son->m_pBrother) {
+ if (id(son) == nodePredefKey && son->m_valueType == gmlListBegin) {
+
+ GmlObject *nodeSon = son->m_pFirstSon;
+ for(; nodeSon; nodeSon = nodeSon->m_pBrother) {
+ if (id(nodeSon) == idPredefKey ||
+ nodeSon->m_valueType == gmlIntValue)
+ {
+ int nodeSonId = nodeSon->m_intValue;
+ if (first) {
+ minId = maxId = nodeSonId;
+ first = false;
+ } else {
+ if (nodeSonId < minId) minId = nodeSonId;
+ if (nodeSonId > maxId) maxId = nodeSonId;
+ }
+ }
+ }
+ }
+ }
+
+ return graphObject;
+}
+
+
+bool GmlParser::read(Graph &G)
+{
+ G.clear();
+
+ int minId = m_mapToNode.low();
+ int maxId = m_mapToNode.high();
+ int notDefined = minId-1; //indicates not defined id key
+
+ GmlObject *son = m_graphObject->m_pFirstSon;
+ for(; son; son = son->m_pBrother)
+ {
+ switch(id(son))
+ {
+ case nodePredefKey: {
+ if (son->m_valueType != gmlListBegin) break;
+
+ // set attributes to default values
+ int vId = notDefined;
+
+ // read all relevant attributes
+ GmlObject *nodeSon = son->m_pFirstSon;
+ for(; nodeSon; nodeSon = nodeSon->m_pBrother) {
+ if (id(nodeSon) == idPredefKey &&
+ nodeSon->m_valueType == gmlIntValue)
+ {
+ vId = nodeSon->m_intValue;
+ }
+ }
+
+ // check if everything required is defined correctly
+ if (vId == notDefined) {
+ setError("node id not defined");
+ return false;
+ }
+
+ // create new node if necessary
+ if (m_mapToNode[vId] == 0) m_mapToNode[vId] = G.newNode(); }
+ break;
+
+ case edgePredefKey: {
+ if (son->m_valueType != gmlListBegin) break;
+
+ // set attributes to default values
+ int sourceId = notDefined, targetId = notDefined;
+
+ // read all relevant attributes
+ GmlObject *edgeSon = son->m_pFirstSon;
+ for(; edgeSon; edgeSon = edgeSon->m_pBrother) {
+
+ switch(id(edgeSon)) {
+ case sourcePredefKey:
+ if (edgeSon->m_valueType != gmlIntValue) break;
+ sourceId = edgeSon->m_intValue;
+ break;
+
+ case targetPredefKey:
+ if (edgeSon->m_valueType != gmlIntValue) break;
+ targetId = edgeSon->m_intValue;
+ break;
+ }
+ }
+
+ // check if everything required is defined correctly
+ if (sourceId == notDefined || targetId == notDefined) {
+ setError("source or target id not defined");
+ return false;
+
+ } else if (sourceId < minId || maxId < sourceId ||
+ targetId < minId || maxId < targetId) {
+ setError("source or target id out of range");
+ return false;
+ }
+
+ // create adjacent nodes if necessary and new edge
+ if (m_mapToNode[sourceId] == 0) m_mapToNode[sourceId] = G.newNode();
+ if (m_mapToNode[targetId] == 0) m_mapToNode[targetId] = G.newNode();
+
+ G.newEdge(m_mapToNode[sourceId],m_mapToNode[targetId]);
+ }//case edge
+ break;
+ }//switch
+ }//for sons
+
+ return true;
+}
+
+
+bool GmlParser::read(Graph &G, GraphAttributes &AG)
+{
+ OGDF_ASSERT(&G == &(AG.constGraph()))
+
+ G.clear();
+
+ int minId = m_mapToNode.low();
+ int maxId = m_mapToNode.high();
+ int notDefined = minId-1; //indicates not defined id key
+
+ DPolyline bends;
+
+ GmlObject *son = m_graphObject->m_pFirstSon;
+ for(; son; son = son->m_pBrother) {
+
+ switch(id(son)) {
+ case nodePredefKey: {
+ if (son->m_valueType != gmlListBegin) break;
+
+ // set attributes to default values
+ int vId = notDefined;
+ double x = 0, y = 0, w = 0, h = 0;
+ String label;
+ String templ;
+ String fill; // the fill color attribute
+ String line; // the line color attribute
+ String shape; //the shape type
+ double lineWidth = 1.0; //node line width
+ int pattern = 1; //node brush pattern
+ int stipple = 1; //line style pattern
+
+ // read all relevant attributes
+ GmlObject *nodeSon = son->m_pFirstSon;
+ for(; nodeSon; nodeSon = nodeSon->m_pBrother) {
+ switch(id(nodeSon)) {
+ case idPredefKey:
+ if(nodeSon->m_valueType != gmlIntValue) break;
+ vId = nodeSon->m_intValue;
+ break;
+
+ case graphicsPredefKey: {
+ if (nodeSon->m_valueType != gmlListBegin) break;
+
+ GmlObject *graphicsObject = nodeSon->m_pFirstSon;
+ for(; graphicsObject;
+ graphicsObject = graphicsObject->m_pBrother)
+ {
+ switch(id(graphicsObject)) {
+ case xPredefKey:
+ if(graphicsObject->m_valueType != gmlDoubleValue) break;
+ x = graphicsObject->m_doubleValue;
+ break;
+
+ case yPredefKey:
+ if(graphicsObject->m_valueType != gmlDoubleValue) break;
+ y = graphicsObject->m_doubleValue;
+ break;
+
+ case wPredefKey:
+ if(graphicsObject->m_valueType != gmlDoubleValue) break;
+ w = graphicsObject->m_doubleValue;
+ break;
+
+ case hPredefKey:
+ if(graphicsObject->m_valueType != gmlDoubleValue) break;
+ h = graphicsObject->m_doubleValue;
+ break;
+
+ case fillPredefKey:
+ if(graphicsObject->m_valueType != gmlStringValue) break;
+ fill = graphicsObject->m_stringValue;
+ break;
+
+ case linePredefKey:
+ if(graphicsObject->m_valueType != gmlStringValue) break;
+ line = graphicsObject->m_stringValue;
+ break;
+
+ case lineWidthPredefKey:
+ if(graphicsObject->m_valueType != gmlDoubleValue) break;
+ lineWidth = graphicsObject->m_doubleValue;
+ break;
+
+ case typePredefKey:
+ if(graphicsObject->m_valueType != gmlStringValue) break;
+ shape = graphicsObject->m_stringValue;
+ break;
+ case patternPredefKey: //fill style
+ if(graphicsObject->m_valueType != gmlIntValue) break;
+ pattern = graphicsObject->m_intValue;
+ case stipplePredefKey: //line style
+ if(graphicsObject->m_valueType != gmlIntValue) break;
+ stipple = graphicsObject->m_intValue;
+ }
+ }
+ break; }
+
+ case templatePredefKey:
+ if (nodeSon->m_valueType != gmlStringValue) break;
+
+ templ = nodeSon->m_stringValue;
+ break;
+
+ case labelPredefKey:
+ if (nodeSon->m_valueType != gmlStringValue) break;
+
+ label = nodeSon->m_stringValue;
+ break;
+ }
+ }
+
+ // check if everything required is defined correctly
+ if (vId == notDefined) {
+ setError("node id not defined");
+ return false;
+ }
+
+ // create new node if necessary and assign attributes
+ if (m_mapToNode[vId] == 0) m_mapToNode[vId] = G.newNode();
+ if (AG.attributes() & GraphAttributes::nodeGraphics)
+ {
+ AG.x(m_mapToNode[vId]) = x;
+ AG.y(m_mapToNode[vId]) = y;
+ AG.width (m_mapToNode[vId]) = w;
+ AG.height(m_mapToNode[vId]) = h;
+ if (shape == "oval")
+ AG.shapeNode(m_mapToNode[vId]) = GraphAttributes::oval;
+ else AG.shapeNode(m_mapToNode[vId]) = GraphAttributes::rectangle;
+ }
+ if ( (AG.attributes() & GraphAttributes::nodeColor) &&
+ (AG.attributes() & GraphAttributes::nodeGraphics) )
+ {
+ AG.colorNode(m_mapToNode[vId]) = fill;
+ AG.nodeLine(m_mapToNode[vId]) = line;
+ }
+ if (AG.attributes() & GraphAttributes::nodeLabel)
+ AG.labelNode(m_mapToNode[vId]) = label;
+ if (AG.attributes() & GraphAttributes::nodeTemplate)
+ AG.templateNode(m_mapToNode[vId]) = templ;
+ if (AG.attributes() & GraphAttributes::nodeId)
+ AG.idNode(m_mapToNode[vId]) = vId;
+ if (AG.attributes() & GraphAttributes::nodeStyle)
+ {
+ AG.nodePattern(m_mapToNode[vId]) =
+ GraphAttributes::intToPattern(pattern);
+ AG.styleNode(m_mapToNode[vId]) =
+ GraphAttributes::intToStyle(stipple);
+ AG.lineWidthNode(m_mapToNode[vId]) =
+ lineWidth;
+ }
+ }//node
+ //Todo: line style set stipple value
+ break;
+
+ case edgePredefKey: {
+ String arrow; // the arrow type attribute
+ String fill; //the color fill attribute
+ int stipple = 1; //the line style
+ double lineWidth = 1.0;
+ double edgeWeight = 1.0;
+ int subGraph = 0; //edgeSubGraph attribute
+ String label; // label attribute
+
+ if (son->m_valueType != gmlListBegin) break;
+
+ // set attributes to default values
+ int sourceId = notDefined, targetId = notDefined;
+ Graph::EdgeType umlType = Graph::association;
+
+ // read all relevant attributes
+ GmlObject *edgeSon = son->m_pFirstSon;
+ for(; edgeSon; edgeSon = edgeSon->m_pBrother) {
+
+ switch(id(edgeSon)) {
+ case sourcePredefKey:
+ if (edgeSon->m_valueType != gmlIntValue) break;
+ sourceId = edgeSon->m_intValue;
+ break;
+
+ case targetPredefKey:
+ if (edgeSon->m_valueType != gmlIntValue) break;
+ targetId = edgeSon->m_intValue;
+ break;
+
+ case subGraphPredefKey:
+ if (edgeSon->m_valueType != gmlIntValue) break;
+ subGraph = edgeSon->m_intValue;
+ break;
+
+ case labelPredefKey:
+ if (edgeSon->m_valueType != gmlStringValue) break;
+ label = edgeSon->m_stringValue;
+ break;
+
+ case graphicsPredefKey: {
+ if (edgeSon->m_valueType != gmlListBegin) break;
+
+ GmlObject *graphicsObject = edgeSon->m_pFirstSon;
+ for(; graphicsObject;
+ graphicsObject = graphicsObject->m_pBrother)
+ {
+ if(id(graphicsObject) == LinePredefKey &&
+ graphicsObject->m_valueType == gmlListBegin)
+ {
+ readLineAttribute(graphicsObject->m_pFirstSon,bends);
+ }
+ if(id(graphicsObject) == arrowPredefKey &&
+ graphicsObject->m_valueType == gmlStringValue)
+ arrow = graphicsObject->m_stringValue;
+ if(id(graphicsObject) == fillPredefKey &&
+ graphicsObject->m_valueType == gmlStringValue)
+ fill = graphicsObject->m_stringValue;
+ if (id(graphicsObject) == stipplePredefKey && //line style
+ graphicsObject->m_valueType == gmlIntValue)
+ stipple = graphicsObject->m_intValue;
+ if (id(graphicsObject) == lineWidthPredefKey && //line width
+ graphicsObject->m_valueType == gmlDoubleValue)
+ lineWidth = graphicsObject->m_doubleValue;
+ if (id(graphicsObject) == edgeWeightPredefKey &&
+ graphicsObject->m_valueType == gmlDoubleValue)
+ edgeWeight = graphicsObject->m_doubleValue;
+ }//for graphics
+ }
+
+ case generalizationPredefKey:
+ if (edgeSon->m_valueType != gmlIntValue) break;
+ umlType = (edgeSon->m_intValue == 0) ?
+ Graph::association : Graph::generalization;
+ break;
+
+ }
+ }
+
+ // check if everything required is defined correctly
+ if (sourceId == notDefined || targetId == notDefined) {
+ setError("source or target id not defined");
+ return false;
+
+ } else if (sourceId < minId || maxId < sourceId ||
+ targetId < minId || maxId < targetId) {
+ setError("source or target id out of range");
+ return false;
+ }
+
+ // create adjacent nodes if necessary and new edge
+ if (m_mapToNode[sourceId] == 0) m_mapToNode[sourceId] = G.newNode();
+ if (m_mapToNode[targetId] == 0) m_mapToNode[targetId] = G.newNode();
+
+ edge e = G.newEdge(m_mapToNode[sourceId],m_mapToNode[targetId]);
+ if (AG.attributes() & GraphAttributes::edgeGraphics)
+ AG.bends(e).conc(bends);
+ if (AG.attributes() & GraphAttributes::edgeType)
+ AG.type(e) = umlType;
+ if(AG.attributes() & GraphAttributes::edgeSubGraph)
+ AG.subGraphBits(e) = subGraph;
+ if (AG.attributes() & GraphAttributes::edgeLabel)
+ AG.labelEdge(e) = label;
+
+ if (AG.attributes() & GraphAttributes::edgeArrow) {
+ if (arrow == "none")
+ AG.arrowEdge(e) = GraphAttributes::none;
+ else if (arrow == "last")
+ AG.arrowEdge(e) = GraphAttributes::last;
+ else if (arrow == "first")
+ AG.arrowEdge(e) = GraphAttributes::first;
+ else if (arrow == "both")
+ AG.arrowEdge(e) = GraphAttributes::both;
+ else
+ AG.arrowEdge(e) = GraphAttributes::undefined;
+ }
+
+ if (AG.attributes() & GraphAttributes::edgeColor)
+ AG.colorEdge(e) = fill;
+ if (AG.attributes() & GraphAttributes::edgeStyle)
+ {
+ AG.styleEdge(e) = AG.intToStyle(stipple);
+ AG.edgeWidth(e) = lineWidth;
+ }
+
+ if (AG.attributes() & GraphAttributes::edgeDoubleWeight)
+ AG.doubleWeight(e) = edgeWeight;
+
+
+ break; }
+ case directedPredefKey: {
+ if(son->m_valueType != gmlIntValue) break;
+ AG.directed(son->m_intValue > 0);
+ break; }
+ }
+ }
+
+ return true;
+}//read
+
+
+//to be called AFTER calling read(G, AG)
+bool GmlParser::readAttributedCluster(
+ Graph &/*G*/,
+ ClusterGraph& CG,
+ ClusterGraphAttributes& ACG)
+{
+// OGDF_ASSERT(&CG.getGraph() == &G)
+
+
+ //now we need the cluster object
+ GmlObject *rootObject = m_objectTree;
+ for(; rootObject; rootObject = rootObject->m_pBrother)
+ if (id(rootObject) == rootClusterPredefKey) break;
+
+ if(rootObject == 0)
+ return true;
+
+ if (id(rootObject) != rootClusterPredefKey)
+ {
+ setError("missing rootcluster key");
+ return false;
+ }
+
+ if (rootObject->m_valueType != gmlListBegin) return false;
+
+ attributedClusterRead(rootObject, CG, ACG);
+
+ return true;
+}//readAttributedCluster
+
+
+//the clustergraph has to be initialized on G!!,
+//no clusters other then root cluster may exist, which holds all nodes
+bool GmlParser::readCluster(Graph &/*G*/, ClusterGraph& CG)
+{
+// OGDF_ASSERT(&CG.getGraph() == &G)
+
+ //now we need the cluster object
+ GmlObject *rootObject = m_objectTree;
+ for(; rootObject; rootObject = rootObject->m_pBrother)
+ if (id(rootObject) == rootClusterPredefKey) break;
+
+ //we have to check if the file does really contain clusters
+ //otherwise, rootcluster will suffice
+ if (rootObject == 0) return true;
+ if (id(rootObject) != rootClusterPredefKey)
+ {
+ setError("missing rootcluster key");
+ return false;
+ }
+
+ if (rootObject->m_valueType != gmlListBegin) return false;
+
+ clusterRead(rootObject, CG);
+
+ return true;
+}//read clustergraph
+
+
+//read all cluster tree information
+bool GmlParser::clusterRead(
+ GmlObject* rootCluster,
+ ClusterGraph& CG)
+{
+
+ //the root cluster is only allowed to hold child clusters and
+ //nodes in a list
+
+ if (rootCluster->m_valueType != gmlListBegin) return false;
+
+ // read all clusters and nodes
+ GmlObject *rootClusterSon = rootCluster->m_pFirstSon;
+
+ for(; rootClusterSon; rootClusterSon = rootClusterSon->m_pBrother)
+ {
+ switch(id(rootClusterSon))
+ {
+ case clusterPredefKey:
+ {
+ //we could delete this, but we aviod the call
+ if (rootClusterSon->m_valueType != gmlListBegin) return false;
+ // set attributes to default values
+ //we currently do not set any values
+ cluster c = CG.newCluster(CG.rootCluster());
+
+ //recursively read cluster
+ recursiveClusterRead(rootClusterSon, CG, c);
+
+ } //case cluster
+ break;
+ case vertexPredefKey: //direct root vertices
+ {
+ if (rootClusterSon->m_valueType != gmlStringValue) return false;
+ String vIDString = rootClusterSon->m_stringValue;
+
+ //we only allow a vertex id as string identification
+ if ((vIDString[0] != 'v') &&
+ (!isdigit(vIDString[0])))return false; //do not allow labels
+ //if old style entry "v"i
+ if (!isdigit(vIDString[0])) //should check prefix?
+ vIDString[0] = '0'; //leading zero to allow conversion
+ int vID = atoi(vIDString.cstr());
+
+ OGDF_ASSERT(m_mapToNode[vID] != 0)
+
+ //we assume that no node is already assigned ! Changed:
+ //all new nodes are assigned to root
+ //CG.reassignNode(mapToNode[vID], CG.rootCluster());
+ //it seems that this may be unnessecary, TODO check
+ CG.reassignNode(m_mapToNode[vID], CG.rootCluster());
+ //char* vIDChar = new char[vIDString.length()+1];
+ //for (int ind = 1; ind < vIDString.length(); ind++)
+ // vIDChar
+
+ }//case vertex
+ }//switch
+ }//for all rootcluster sons
+
+ return true;
+
+}//clusterread
+
+
+//the same for attributed graphs
+//read all cluster tree information
+//make changes to this as well as the recursive function
+bool GmlParser::attributedClusterRead(
+ GmlObject* rootCluster,
+ ClusterGraph& CG,
+ ClusterGraphAttributes& ACG)
+{
+
+ //the root cluster is only allowed to hold child clusters and
+ //nodes in a list
+
+ if (rootCluster->m_valueType != gmlListBegin) return false;
+
+ // read all clusters and nodes
+ GmlObject *rootClusterSon = rootCluster->m_pFirstSon;
+
+ for(; rootClusterSon; rootClusterSon = rootClusterSon->m_pBrother)
+ {
+ switch(id(rootClusterSon))
+ {
+ case clusterPredefKey:
+ {
+ //we could delete this, but we avoid the call
+ if (rootClusterSon->m_valueType != gmlListBegin) return false;
+ // set attributes to default values
+ //we currently do not set any values
+ cluster c = CG.newCluster(CG.rootCluster());
+
+ //recursively read cluster
+ recursiveAttributedClusterRead(rootClusterSon, CG, ACG, c);
+
+ } //case cluster
+ break;
+
+ case vertexPredefKey: //direct root vertices
+ {
+ if (rootClusterSon->m_valueType != gmlStringValue) return false;
+ String vIDString = rootClusterSon->m_stringValue;
+
+ //we only allow a vertex id as string identification
+ if ((vIDString[0] != 'v') &&
+ (!isdigit(vIDString[0])))return false; //do not allow labels
+ //if old style entry "v"i
+ if (!isdigit(vIDString[0])) //should check prefix?
+ vIDString[0] = '0'; //leading zero to allow conversion
+ int vID = atoi(vIDString.cstr());
+
+ OGDF_ASSERT(m_mapToNode[vID] != 0)
+
+ //we assume that no node is already assigned
+ //CG.reassignNode(mapToNode[vID], CG.rootCluster());
+ //changed: all nodes are already assigned to root
+ //this code seems to be obsolete, todo: check
+ CG.reassignNode(m_mapToNode[vID], CG.rootCluster());
+ //char* vIDChar = new char[vIDString.length()+1];
+ //for (int ind = 1; ind < vIDString.length(); ind++)
+ // vIDChar
+
+ }//case vertex
+ }//switch
+ }//for all rootcluster sons
+
+ return true;
+
+}//attributedclusterread
+
+
+bool GmlParser::readClusterAttributes(
+ GmlObject* cGraphics,
+ cluster c,
+ ClusterGraphAttributes& ACG)
+{
+ String label;
+ String fill; // the fill color attribute
+ String line; // the line color attribute
+ double lineWidth = 1.0; //node line width
+ int pattern = 1; //node brush pattern
+ int stipple = 1; //line style pattern
+
+ // read all relevant attributes
+ GmlObject *graphicsObject = cGraphics->m_pFirstSon;
+ for(; graphicsObject; graphicsObject = graphicsObject->m_pBrother)
+ {
+ switch(id(graphicsObject))
+ {
+ case xPredefKey:
+ if(graphicsObject->m_valueType != gmlDoubleValue) return false;
+ ACG.clusterXPos(c) = graphicsObject->m_doubleValue;
+ break;
+
+ case yPredefKey:
+ if(graphicsObject->m_valueType != gmlDoubleValue) return false;
+ ACG.clusterYPos(c) = graphicsObject->m_doubleValue;
+ break;
+
+ case widthPredefKey:
+ if(graphicsObject->m_valueType != gmlDoubleValue) return false;
+ ACG.clusterWidth(c) = graphicsObject->m_doubleValue;
+ break;
+
+ case heightPredefKey:
+ if(graphicsObject->m_valueType != gmlDoubleValue) return false;
+ ACG.clusterHeight(c) = graphicsObject->m_doubleValue;
+ break;
+ case fillPredefKey:
+ if(graphicsObject->m_valueType != gmlStringValue) return false;
+ ACG.clusterFillColor(c) = graphicsObject->m_stringValue;
+ break;
+ case patternPredefKey:
+ if(graphicsObject->m_valueType != gmlIntValue) return false;
+ pattern = graphicsObject->m_intValue;
+ break;
+ //line style
+ case colorPredefKey: // line color
+ if(graphicsObject->m_valueType != gmlStringValue) return false;
+ ACG.clusterColor(c) = graphicsObject->m_stringValue;
+ break;
+
+ case stipplePredefKey:
+ if(graphicsObject->m_valueType != gmlIntValue) return false;
+ stipple = graphicsObject->m_intValue;
+ break;
+ case lineWidthPredefKey:
+ if(graphicsObject->m_valueType != gmlDoubleValue) return false;
+ lineWidth =
+ graphicsObject->m_doubleValue;
+ break;
+ //TODO: backgroundcolor
+ //case stylePredefKey:
+ //case boderwidthPredefKey:
+ }//switch
+ }//for
+
+ //Hier eigentlich erst abfragen, ob clusterattributes setzbar in ACG,
+ //dann setzen
+ ACG.clusterLineStyle(c) = GraphAttributes::intToStyle(stipple); //defaulting 1
+ ACG.clusterLineWidth(c) = lineWidth;
+ ACG.clusterFillPattern(c) = GraphAttributes::intToPattern(pattern);
+
+ return true;
+}//readclusterattributes
+
+//recursively read cluster subtree information
+bool GmlParser::recursiveClusterRead(GmlObject* clusterObject,
+ ClusterGraph& CG,
+ cluster c)
+{
+
+ //for direct root cluster sons, this is checked twice...
+ if (clusterObject->m_valueType != gmlListBegin) return false;
+
+ GmlObject *clusterSon = clusterObject->m_pFirstSon;
+
+ for(; clusterSon; clusterSon = clusterSon->m_pBrother)
+ {
+ //we dont read the attributes, therefore look only for
+ //id and sons
+ switch(id(clusterSon))
+ {
+ case clusterPredefKey:
+ {
+ if (clusterSon->m_valueType != gmlListBegin) return false;
+
+ cluster cson = CG.newCluster(c);
+ //recursively read child cluster
+ recursiveClusterRead(clusterSon, CG, cson);
+ }
+ break;
+ case vertexPredefKey: //direct cluster vertex entries
+ {
+ if (clusterSon->m_valueType != gmlStringValue) return false;
+ String vIDString = clusterSon->m_stringValue;
+
+ //if old style entry "v"i
+ if ((vIDString[0] != 'v') &&
+ (!isdigit(vIDString[0])))return false; //do not allow labels
+ //if old style entry "v"i
+ if (!isdigit(vIDString[0])) //should check prefix?
+ vIDString[0] = '0'; //leading zero to allow conversion
+ int vID = atoi(vIDString.cstr());
+
+ OGDF_ASSERT(m_mapToNode[vID] != 0)
+
+ //we assume that no node is already assigned
+ //CG.reassignNode(mapToNode[vID], c);
+ //changed: all nodes are already assigned to root
+ CG.reassignNode(m_mapToNode[vID], c);
+ //char* vIDChar = new char[vIDString.length()+1];
+ //for (int ind = 1; ind < vIDString.length(); ind++)
+ // vIDChar
+
+ }//case vertex
+ }//switch
+ }//for clustersons
+
+ return true;
+
+}//recursiveclusterread
+
+//recursively read cluster subtree information
+bool GmlParser::recursiveAttributedClusterRead(GmlObject* clusterObject,
+ ClusterGraph& CG,
+ ClusterGraphAttributes& ACG,
+ cluster c)
+{
+
+ //for direct root cluster sons, this is checked twice...
+ if (clusterObject->m_valueType != gmlListBegin) return false;
+
+ GmlObject *clusterSon = clusterObject->m_pFirstSon;
+
+ for(; clusterSon; clusterSon = clusterSon->m_pBrother)
+ {
+ //we dont read the attributes, therefore look only for
+ //id and sons
+ switch(id(clusterSon))
+ {
+ case clusterPredefKey:
+ {
+ if (clusterSon->m_valueType != gmlListBegin) return false;
+
+ cluster cson = CG.newCluster(c);
+ //recursively read child cluster
+ recursiveAttributedClusterRead(clusterSon, CG, ACG, cson);
+ }
+ break;
+ case labelPredefKey:
+ {
+ if (clusterSon->m_valueType != gmlStringValue) return false;
+ ACG.clusterLabel(c) = clusterSon->m_stringValue;
+ }
+ break;
+ case templatePredefKey:
+ {
+ if (clusterSon->m_valueType != gmlStringValue) return false;
+ ACG.templateCluster(c) = clusterSon->m_stringValue;
+ break;
+ }
+ case graphicsPredefKey: //read the info for cluster c
+ {
+ if (clusterSon->m_valueType != gmlListBegin) return false;
+
+ readClusterAttributes(clusterSon, c , ACG);
+ }//graphics
+ break;
+ case vertexPredefKey: //direct cluster vertex entries
+ {
+ if (clusterSon->m_valueType != gmlStringValue) return false;
+ String vIDString = clusterSon->m_stringValue;
+
+ if ((vIDString[0] != 'v') &&
+ (!isdigit(vIDString[0])))return false; //do not allow labels
+ //if old style entry "v"i
+ if (!isdigit(vIDString[0])) //should check prefix?
+ vIDString[0] = '0'; //leading zero to allow conversion
+ int vID = atoi(vIDString.cstr());
+
+ OGDF_ASSERT(m_mapToNode[vID] != 0)
+
+ //we assume that no node is already assigned
+ //changed: all nodes are already assigned to root
+ CG.reassignNode(m_mapToNode[vID], c);
+
+ }//case vertex
+ }//switch
+ }//for clustersons
+
+ return true;
+}//recursiveAttributedClusterRead
+
+void GmlParser::readLineAttribute(GmlObject *object, DPolyline &dpl)
+{
+ dpl.clear();
+ for(; object; object = object->m_pBrother) {
+ if (id(object) == pointPredefKey &&
+ object->m_valueType == gmlListBegin)
+ {
+ DPoint dp;
+
+ GmlObject *pointObject = object->m_pFirstSon;
+ for (; pointObject; pointObject = pointObject->m_pBrother) {
+ if (pointObject->m_valueType != gmlDoubleValue) continue;
+ if (id(pointObject) == xPredefKey)
+ dp.m_x = pointObject->m_doubleValue;
+ else if (id(pointObject) == yPredefKey)
+ dp.m_y = pointObject->m_doubleValue;
+ }
+
+ dpl.pushBack(dp);
+ }
+ }
+}
+
+
+void GmlParser::setError(const char *errorString)
+{
+ m_error = true;
+ m_errorString = errorString;
+}
+
+
+void GmlParser::indent(ostream &os, int d)
+{
+ for(int i = 1; i <= d; ++i)
+ os << " ";
+}
+
+void GmlParser::output(ostream &os, GmlObject *object, int d)
+{
+ for(; object; object = object->m_pBrother) {
+ indent(os,d); os << object->m_key->key();
+
+ switch(object->m_valueType) {
+ case gmlIntValue:
+ os << " " << object->m_intValue << "\n";
+ break;
+
+ case gmlDoubleValue:
+ os << " " << object->m_doubleValue << "\n";
+ break;
+
+ case gmlStringValue:
+ os << " \"" << object->m_stringValue << "\"\n";
+ break;
+
+ case gmlListBegin:
+ os << "\n";
+ output(os, object->m_pFirstSon, d+2);
+ break;
+ case gmlListEnd:
+ break;
+ case gmlKey:
+ break;
+ case gmlEOF:
+ break;
+ case gmlError:
+ break;
+ }
+ }
+}
+
+
+} // end namespace ogdf
diff --git a/ogdf/fileformats/GmlParser.h b/ogdf/fileformats/GmlParser.h
new file mode 100644
index 0000000..26052a0
--- /dev/null
+++ b/ogdf/fileformats/GmlParser.h
@@ -0,0 +1,233 @@
+/*
+ * $Revision: 2564 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-07 00:03:48 +0200 (Sa, 07. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of classes GmlObject and GmlParser.
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_GML_PARSER_H
+#define OGDF_GML_PARSER_H
+
+
+#include "../basic/Hashing.h"
+#include "../basic/String.h"
+#include "../basic/GraphAttributes.h"
+#include "../cluster/ClusterGraph.h"
+#include "../cluster/ClusterGraphAttributes.h"
+
+
+namespace ogdf {
+
+
+typedef HashElement<String,int> *GmlKey;
+enum GmlObjectType { gmlIntValue, gmlDoubleValue, gmlStringValue, gmlListBegin,
+ gmlListEnd, gmlKey, gmlEOF, gmlError };
+
+
+//---------------------------------------------------------
+// GmlObject
+// represents node in GML parse tree
+//---------------------------------------------------------
+struct OGDF_EXPORT GmlObject {
+ GmlObject *m_pBrother; // brother of node in tree
+ GmlKey m_key; // tag of node
+ GmlObjectType m_valueType; // type of node
+
+ // the entry in the union is selected according to m_valueType:
+ // gmlIntValue -> m_intValue
+ // gmlDoubleValue -> m_doubleValue
+ // gmlStringValue -> m_stringValue
+ // gmlListBegin -> m_pFirstSon (in case of a list, m_pFirstSon is pointer
+ // to first son and the sons are chained by m_pBrother)
+ union {
+ int m_intValue;
+ double m_doubleValue;
+ const char *m_stringValue;
+ GmlObject *m_pFirstSon;
+ };
+
+ // construction
+ GmlObject(GmlKey key, int intValue) : m_pBrother(0), m_key(key),
+ m_valueType(gmlIntValue), m_intValue(intValue) { }
+
+ GmlObject(GmlKey key, double doubleValue) : m_pBrother(0), m_key(key),
+ m_valueType(gmlDoubleValue), m_doubleValue(doubleValue) { }
+
+ GmlObject(GmlKey key, const char *stringValue) : m_pBrother(0), m_key(key),
+ m_valueType(gmlStringValue), m_stringValue(stringValue) { }
+
+ GmlObject(GmlKey key) : m_pBrother(0), m_key(key),
+ m_valueType(gmlListBegin), m_pFirstSon(0) { }
+
+ OGDF_NEW_DELETE
+};
+
+
+//---------------------------------------------------------
+// GmlParser
+// reads GML file and constructs GML parse tree
+//---------------------------------------------------------
+class OGDF_EXPORT GmlParser {
+ Hashing<String,int> m_hashTable; // hash table for tags
+ int m_num;
+
+ istream *m_is;
+ bool m_error;
+ String m_errorString;
+
+ char *m_rLineBuffer, *m_lineBuffer, *m_pCurrent, *m_pStore, m_cStore;
+
+ int m_intSymbol;
+ double m_doubleSymbol;
+ const char *m_stringSymbol;
+ GmlKey m_keySymbol;
+ String m_longString;
+
+ GmlObject *m_objectTree; // root node of GML parse tree
+
+ bool m_doCheck;
+ Array<node> m_mapToNode;
+ GmlObject *m_graphObject;
+
+public:
+ // predefined id constants for all used keys
+ enum PredefinedKey { idPredefKey = 0, labelPredefKey, CreatorPredefKey,
+ namePredefKey, graphPredefKey, versionPredefKey, directedPredefKey,
+ nodePredefKey, edgePredefKey, graphicsPredefKey, xPredefKey,
+ yPredefKey, wPredefKey, hPredefKey, typePredefKey, widthPredefKey,
+ sourcePredefKey, targetPredefKey, arrowPredefKey, LinePredefKey,
+ pointPredefKey, generalizationPredefKey, subGraphPredefKey, fillPredefKey, clusterPredefKey,
+ rootClusterPredefKey, vertexPredefKey, colorPredefKey,
+ heightPredefKey, stipplePredefKey, patternPredefKey,
+ linePredefKey, lineWidthPredefKey, templatePredefKey,
+ edgeWeightPredefKey, NEXTPREDEFKEY };
+
+ // construction: creates object tree
+ // sets m_error flag if an error occured
+ GmlParser(const char *fileName, bool doCheck = false);
+ GmlParser(istream &is, bool doCheck = false);
+
+ // destruction: destroys object tree
+ ~GmlParser();
+
+ // returns id of object
+ int id(GmlObject *object) const { return object->m_key->info(); }
+
+ // true <=> an error in GML files has been detected
+ bool error() const { return m_error; }
+ // returns error message
+ const String &errorString() const { return m_errorString; }
+
+ // creates graph from GML parse tree
+ bool read(Graph &G);
+ // creates attributed graph from GML parse tree
+ bool read(Graph &G, GraphAttributes &AG);
+ //creates clustergraph from GML parse tree
+ //bool read(Graph &G, ClusterGraph & CG);
+ //read only cluster part of object tree and create cluster graph structure
+ bool readCluster(Graph &G, ClusterGraph& CG);
+ //the same with attributes
+ bool readAttributedCluster(
+ Graph &G,
+ ClusterGraph& CG,
+ ClusterGraphAttributes& ACG);
+
+protected:
+
+ //read all cluster tree information
+ bool clusterRead(
+ GmlObject* rootCluster,
+ ClusterGraph& CG);
+
+ //with attributes
+ bool attributedClusterRead(
+ GmlObject* rootCluster,
+ ClusterGraph& CG,
+ ClusterGraphAttributes& ACG);
+
+ //recursively read cluster subtree information
+ bool recursiveClusterRead(
+ GmlObject* clusterObject,
+ ClusterGraph& CG,
+ cluster c);
+
+ bool recursiveAttributedClusterRead(
+ GmlObject* clusterObject,
+ ClusterGraph& CG,
+ ClusterGraphAttributes& ACG,
+ cluster c);
+
+ bool readClusterAttributes(
+ GmlObject* cGraphics,
+ cluster c,
+ ClusterGraphAttributes& ACG);
+
+private:
+ void doInit(istream &is, bool doCheck);
+ void createObjectTree(istream &is, bool doCheck);
+ void initPredefinedKeys();
+ void setError(const char *errorString);
+
+ GmlObject *parseList(GmlObjectType closingKey, GmlObjectType errorKey);
+ GmlObjectType getNextSymbol();
+ bool getLine();
+
+ GmlKey hashString(const String &str);
+
+ GmlObject *getNodeIdRange(int &minId,int &maxId);
+ void readLineAttribute(GmlObject *object, DPolyline &dpl);
+
+ void destroyObjectList(GmlObject *object);
+
+ void indent(ostream &os, int d);
+ void output(ostream &os, GmlObject *object, int d);
+
+};
+
+
+} // end namespace ogdf
+
+#endif
diff --git a/ogdf/fileformats/Ogml.cpp b/ogdf/fileformats/Ogml.cpp
new file mode 100644
index 0000000..6b7434a
--- /dev/null
+++ b/ogdf/fileformats/Ogml.cpp
@@ -0,0 +1,303 @@
+/*
+ * $Revision: 2597 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-15 19:26:11 +0200 (So, 15. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Contains diverse enumerations and string constants.
+ *
+ * \author Christian Wolf, Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "Ogml.h"
+
+
+namespace ogdf
+{
+
+ /// This vector contains the real names of all OGML tags
+ const String Ogml::s_tagNames[TAG_NUM] =
+ {
+ //"none"
+ "bool",
+ "composed",
+ "constraint",
+ "constraints",
+ "content",
+ "data",
+ "default",
+ "edge",
+ "edgeRef",
+ "edgeStyle",
+ "edgeStyleTemplate",
+ "template",
+ "endpoint",
+ "fill",
+ "font",
+ "graph",
+ "graphStyle",
+ "int",
+ "label",
+ "labelRef",
+ "labelStyle",
+ "labelStyleTemplate",
+ "template",
+ "layout",
+ "line",
+ "location",
+ "node",
+ "nodeRef",
+ "nodeStyle",
+ "nodeStyleTemplate",
+ "template",
+ "num",
+ "ogml",
+ "point",
+ "port",
+ "segment",
+ "shape",
+ "source",
+ "sourceStyle",
+ "string",
+ "structure",
+ "styles",
+ "styleTemplates",
+ "target",
+ "targetStyle",
+ "text",
+ "image"
+ };
+
+
+ // This vector contains the real names of all OGML attributes.
+ const String Ogml::s_attributeNames[ATT_NUM] =
+ {
+ "alignment",
+ "angle",
+ "color",
+ "decoration",
+ "defaultEdgeTemplate",
+ "defaultLabelTemplate",
+ "defaultNodeTemplate",
+ "family",
+ "height",
+ "id", // id attribute
+ "idRef", // attribute idRef of elements source, target, nodeRef, nodeStyle
+ "idRef", // attribute idRef of elements edgeRef, edgeStyle
+ "idRef", // attribute idRef of elements edgeRef, edgeStyle
+ "idRef", // attribute idRef of element endpoint
+ "idRef", // attribute idRef of element endpoint
+ "idRef", // attribute idRef of subelement template of element nodeStyle
+ "idRef", // attribute idRef of subelement template of element edgeStyle
+ "idRef", // attribute idRef of subelement template of element labelStyle
+ "idRef", // attribute idRef of subelement endpoint of element segment
+ "name",
+ "type", // attribute type of subelement line of tag nodeStyleTemplate
+ "type", // attribute type of subelement shape of tag nodeStyleTemplate
+ "pattern",
+ "patternColor",
+ "rotation",
+ "size",
+ "stretch",
+ "style",
+ "transform",
+ "type", // attribute type of subelements source-/targetStyle of tag edgeStyleTemplate
+ "uri",
+ "value",
+ "value",
+ "value",
+ "variant",
+ "weight",
+ "width",
+ "x",
+ "y",
+ "z",
+ "uri",
+ "style",
+ "alignment",
+ "drawLine",
+ "width",
+ "height",
+ "type",
+ "disabled"
+ };
+
+
+ // This vector contains the real names of all OGML values of attributes.
+ const String Ogml::s_attributeValueNames[ATT_VAL_NUM] = {
+ "any", // for any attributeValue
+ "blink",
+ "bold",
+ "bolder",
+ "bool",
+ "box",
+ "capitalize",
+ "center",
+ "checked",
+ "circle",
+ "condensed",
+ "cursive",
+ "dashed",
+ "esNoPen", // values for line style
+ "esSolid",
+ "esDash",
+ "esDot",
+ "esDashdot",
+ "esDashdotdot",
+ "diamond",
+ "dotted",
+ "double",
+ "doubleSlash",
+ "ellipse",
+ "expanded",
+ "extraCondensed",
+ "extraExpanded",
+ "fantasy",
+ "filledBox",
+ "filledCircle",
+ "filledDiamond",
+ "filledHalfBox",
+ "filledHalfCircle",
+ "filledHalfDiamond",
+ "filledHalfRhomb",
+ "filledRhomb",
+ "smurf",
+ "arrow",
+ "groove",
+ "halfBox",
+ "halfCircle",
+ "halfDiamond",
+ "halfRhomb",
+ "hexagon",
+ "hex",
+ "id",
+ "nodeId", // attribute idRef of elements source, target, nodeRef, nodeStyle
+ "edgeId", // attribute idRef of elements edgeRef, edgeStyle
+ "labelId", // attribute idRef of elements edgeRef, edgeStyle
+ "sourceId", // attribute idRef of element endpoint
+ "targetId", // attribute idRef of element endpoint
+ "nodeStyleTemplateId", // attribute idRef of subelement template of element nodeStyle
+ "edgeStyleTemplateId", // attribute idRef of subelement template of element edgeStyle
+ "labelStyleTemplateId", // attribute idRef of subelement template of element labelStyle
+ "pointId", // attribute idRef of subelement endpoint of element segment
+ "image",
+ "inset",
+ "int",
+ "italic",
+ "justify",
+ "left",
+ "lighter",
+ "line",
+ "lineThrough",
+ "lowercase",
+ "lParallelogram",
+ "monospace",
+ "narrower",
+ "none",
+ "normal",
+ "num",
+ "oblique",
+ "oct",
+ "octagon",
+ "outset",
+ "overline",
+ "pentagon",
+ "rect",
+ "rectSimple",
+ "rhomb",
+ "ridge",
+ "right",
+ "rParallelogram",
+ "sansSerif",
+ "semiCondensed",
+ "semiExpanded",
+ "serif",
+ "slash",
+ "smallCaps",
+ "solid",
+ "bpNone", // values for node patterns
+ "bpSolid",
+ "bpDense1",
+ "bpDense2",
+ "bpDense3",
+ "bpDense4",
+ "bpDense5",
+ "bpDense6",
+ "bpDense7",
+ "bpHorizontal",
+ "bpVertical",
+ "bpCross",
+ "bpBackwardDiagonal",
+ "bpForwardDiagonal",
+ "bpDiagonalCross",
+ "string",
+ "striped",
+ "trapeze",
+ "triangle",
+ "triple",
+ "ultraCondensed",
+ "ultraExpanded",
+ "umlClass",
+ "underline",
+ "uppercase",
+ "upTrapeze",
+ "uri",
+ "wider",
+ "freeScale", // image-style
+ "fixScale", // image-style
+ "topLeft", // image-alignemnt
+ "topCenter", // image-alignemnt
+ "topRight", // image-alignemnt
+ "centerLeft", // image-alignemnt
+ // "center", // just defined // image-alignemnt
+ "centerRight", // image-alignemnt
+ "bottomLeft", // image-alignemnt
+ "bottomCenter", // image-alignemnt
+ "bottomRight", // image-alignemnt
+ "Alignment",
+ "Anchor",
+ "Sequence"
+ };
+
+
+ static const String s_graphTypeS[] =
+ {
+ "graph",
+ "clusterGraph",
+ "compoundGraph",
+ "corruptCompoundGraph"
+ };
+
+}; //namspace ogdf
diff --git a/ogdf/fileformats/Ogml.h b/ogdf/fileformats/Ogml.h
new file mode 100644
index 0000000..4a001b0
--- /dev/null
+++ b/ogdf/fileformats/Ogml.h
@@ -0,0 +1,368 @@
+/*
+ * $Revision: 2523 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-02 20:59:27 +0200 (Mon, 02 Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Contains diverse enumerations and string constants.
+ * See comments for further information.
+ *
+ * \author Christian Wolf
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_OGML_H
+#define OGDF_OGML_H
+
+#include "../basic/String.h"
+
+
+namespace ogdf
+{
+
+class Ogml
+{
+public:
+
+ //! Max count of ogml tags (used for setting maxOccurs).
+ static const int MAX_TAG_COUNT = 4000;
+
+
+ //! This enumeration is used for identifying OGML tags.
+ enum TagId
+ {
+ t_none = -1,
+ t_bool,
+ t_composed,
+ t_constraint,
+ t_constraints,
+ t_content,
+ t_data,
+ t_default,
+ t_edge,
+ t_edgeRef,
+ t_edgeStyle,
+ t_edgeStyleTemplate,
+ t_edgeStyleTemplateRef, //!< tag template within tag edgeStyle/-Template
+ t_endpoint,
+ t_fill,
+ t_font,
+ t_graph,
+ t_graphStyle,
+ t_int,
+ t_label,
+ t_labelRef,
+ t_labelStyle,
+ t_labelStyleTemplate,
+ t_labelStyleTemplateRef, //!< tag template within tag labelStyle/-Template
+ t_layout,
+ t_line,
+ t_location,
+ t_node,
+ t_nodeRef,
+ t_nodeStyle,
+ t_nodeStyleTemplate,
+ t_nodeStyleTemplateRef, //!< tag template within tag nodeStyle/-Template
+ t_num,
+ t_ogml,
+ t_point,
+ t_port,
+ t_segment,
+ t_shape,
+ t_source,
+ t_sourceStyle,
+ t_string,
+ t_structure,
+ t_styles,
+ t_styleTemplates,
+ t_target,
+ t_targetStyle,
+ t_text,
+ t_image,
+
+ TAG_NUM //!< number of tags
+ };
+
+
+ //! Stores the names of all OGML tags.
+ static const String s_tagNames[TAG_NUM];
+
+
+ //! This enumeration is used for identifying OGML attributes.
+ enum AttributeId
+ {
+ a_none = -1,
+ a_alignment,
+ a_angle,
+ a_color,
+ a_decoration,
+ a_defaultEdgeTemplate,
+ a_defaultLabelTemplate,
+ a_defaultNodeTemplate,
+ a_family,
+ a_height,
+ a_id, //!< id attribute
+ a_nodeIdRef, //!< attribute idRef of elements source, target, nodeRef, nodeStyle
+ a_edgeIdRef, //!< attribute idRef of elements edgeRef, edgeStyle
+ a_labelIdRef, //!< attribute idRef of elements edgeRef, edgeStyle
+ a_sourceIdRef, //!< attribute idRef of element endpoint
+ a_targetIdRef, //!< attribute idRef of element endpoint
+ a_nodeStyleTemplateIdRef, //!< attribute idRef of subelement template of element nodeStyle
+ a_edgeStyleTemplateIdRef, //!< attribute idRef of subelement template of element edgeStyle
+ a_labelStyleTemplateIdRef, //!< attribute idRef of subelement template of element labelStyle
+ a_endpointIdRef, //!< attribute idRef of subelement endpoint of element segment
+ a_name,
+ a_nLineType, //!< attribute type of subelement line of tag nodeStyleTemplate
+ a_nShapeType, //!< attribute type of subelement shape of tag nodeStyleTemplate
+ a_pattern,
+ a_patternColor,
+ a_rotation,
+ a_size,
+ a_stretch,
+ a_style,
+ a_transform,
+ a_type, //!< attribute type of subelements source-/targetStyle of tag edgeStyleTemplate
+ a_uri,
+ a_intValue,
+ a_boolValue,
+ a_numValue,
+ a_variant,
+ a_weight,
+ a_width,
+ a_x,
+ a_y,
+ a_z,
+ a_imageUri,
+ a_imageStyle,
+ a_imageAlignment,
+ a_imageDrawLine,
+ a_imageWidth,
+ a_imageHeight,
+ a_constraintType,
+ a_disabled,
+
+ ATT_NUM //!< number of attributes
+ };
+
+
+ //! Stores the names of all OGML attributes.
+ static const String s_attributeNames[ATT_NUM];
+
+
+ //! This enumeration is used for identifying OGML attributes.
+ enum AttributeValueId
+ {
+ av_any = 0, //!< for any attributeValue
+ av_blink,
+ av_bold,
+ av_bolder,
+ av_bool,
+ av_box,
+ av_capitalize,
+ av_center,
+ av_checked,
+ av_circle,
+ av_condensed,
+ av_cursive,
+ av_dashed,
+ av_esNoPen, //!< values for line style
+ av_esSolid,
+ av_esDash,
+ av_esDot,
+ av_esDashdot,
+ av_esDashdotdot,
+ av_diamond,
+ av_dotted,
+ av_double,
+ av_doubleSlash,
+ av_ellipse,
+ av_expanded,
+ av_extraCondensed,
+ av_extraExpanded,
+ av_fantasy,
+ av_filledBox,
+ av_filledCircle,
+ av_filledDiamond,
+ av_filledHalfBox,
+ av_filledHalfCircle,
+ av_filledHalfDiamond,
+ av_filledHalfRhomb,
+ av_filledRhomb,
+ av_smurf,
+ av_arrow,
+ av_groove,
+ av_halfBox,
+ av_halfCircle,
+ av_halfDiamond,
+ av_halfRhomb,
+ av_hexagon,
+ av_hex, //!< hexadecimal value
+ av_id,
+ av_nodeIdRef, //!< attribute idRef of elements source, target, nodeRef, nodeStyle
+ av_edgeIdRef, //!< attribute idRef of elements edgeRef, edgeStyle
+ av_labelIdRef, //!< attribute idRef of elements edgeRef, edgeStyle
+ av_sourceIdRef, //!< attribute idRef of element endpoint
+ av_targetIdRef, //!< attribute idRef of element endpoint
+ av_nodeStyleTemplateIdRef, //!< attribute idRef of subelement template of element nodeStyle
+ av_edgeStyleTemplateIdRef, //!< attribute idRef of subelement template of element edgeStyle
+ av_labelStyleTemplateIdRef, //!< attribute idRef of subelement template of element labelStyle
+ av_pointIdRef, //!< attribute idRef of subelement endpoint of element segment
+ av_image,
+ av_inset,
+ av_int, //!< integer value
+ av_italic,
+ av_justify,
+ av_left,
+ av_lighter,
+ av_line,
+ av_lineThrough,
+ av_lowercase,
+ av_lParallelogram,
+ av_monospace,
+ av_narrower,
+ av_none,
+ av_normal,
+ av_num, //!< real value
+ av_oblique,
+ av_oct,
+ av_octagon,
+ av_outset,
+ av_overline,
+ av_pentagon,
+ av_rect,
+ av_rectSimple,
+ av_rhomb,
+ av_ridge,
+ av_right,
+ av_rParallelogram,
+ av_sansSerif,
+ av_semiCondensed,
+ av_semiExpanded,
+ av_serif,
+ av_slash,
+ av_smallCaps,
+ av_solid,
+ av_bpNone, //!< values for node patterns
+ av_bpSolid,
+ av_bpDense1,
+ av_bpDense2,
+ av_bpDense3,
+ av_bpDense4,
+ av_bpDense5,
+ av_bpDense6,
+ av_bpDense7,
+ av_bpHorizontal,
+ av_bpVertical,
+ av_bpCross,
+ av_bpBackwardDiagonal,
+ av_bpForwardDiagonal,
+ av_bpDiagonalCross,
+ av_string,
+ av_striped,
+ av_trapeze,
+ av_triangle,
+ av_triple,
+ av_ultraCondensed,
+ av_ultraExpanded,
+ av_umlClass,
+ av_underline,
+ av_uppercase,
+ av_upTrapeze,
+ av_uri,
+ av_wider,
+ av_freeScale, //!< image-style
+ av_fixScale, //!< image-style
+ av_topLeft, //!< image-alignemnt
+ av_topCenter, //!< image-alignemnt
+ av_topRight, //!< image-alignemnt
+ av_centerLeft, //!< image-alignemnt
+ // av_center, // just defined // image-alignemnt
+ av_centerRight, //!< image-alignemnt
+ av_bottomLeft, //!< image-alignemnt
+ av_bottomCenter, //!< image-alignemnt
+ av_bottomRight, //!< image-alignemnt
+ // Constraint-Types:
+ av_constraintAlignment,
+ av_constraintAnchor,
+ av_constraintSequence,
+
+ ATT_VAL_NUM //!< number of attribute values
+ };
+
+
+ //! Stores the names of all OGML values of attributes.
+ static const String s_attributeValueNames[ATT_VAL_NUM];
+
+
+ //! This enumeration is used for encoding diverse validity stati of tags and attributes after parsing and validating a Xml file.
+ enum ValidityState
+ {
+ vs_tagEmptIncl = -10, //!< empty tag inclusion
+ vs_idNotUnique = -9, //!< id already exhausted
+ vs_idRefErr = -8, //!< referenced id wasn't found or wrong type of referenced tag
+ vs_unexpTag = -7, //!< tag unexpected
+ vs_unexpAtt = -6, //!< attribute unexpected
+ vs_expTagNotFound = -5, //!< expected tag not found
+ vs_expAttNotFound = -4, //!< expected attribute not found
+ vs_attValueErr = -3, //!< attribute-value error
+ vs_cardErr = -2, //!< tag/attribute cardinality error
+ vs_invalid = -1, //!< tag/attribute is invalid (no detailled information)
+ vs_valid = 1 //!< tag/attribute is valid
+ };
+
+
+ //! This enumeration is used for indentifying graph types.
+ enum GraphType
+ {
+ graph,
+ clusterGraph,
+ compoundGraph,
+ corruptCompoundGraph
+ };
+
+
+ //! Stores the names of graph types.
+ static const String s_graphTypeS[];
+};
+
+}; //namspace ogdf
+
+#endif
diff --git a/ogdf/fileformats/OgmlParser.cpp b/ogdf/fileformats/OgmlParser.cpp
new file mode 100644
index 0000000..6b5f480
--- /dev/null
+++ b/ogdf/fileformats/OgmlParser.cpp
@@ -0,0 +1,3939 @@
+/*
+ * $Revision: 2565 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-07 17:14:54 +0200 (Sa, 07. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of OGML parser.
+ *
+ * \author Christian Wolf and Bernd Zey
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+#include "OgmlParser.h"
+#include "Ogml.h"
+
+
+namespace ogdf {
+
+
+//---------------------------------------------------------
+// OgmlParser::OgmlNodeTemplate
+//---------------------------------------------------------
+
+// struct definitions for mapping of templates
+struct OgmlParser::OgmlNodeTemplate
+{
+ String m_id;
+ int m_shapeType;
+ double m_width;
+ double m_height;
+ String m_color;
+ GraphAttributes::BrushPattern m_pattern;
+ String m_patternColor;
+ GraphAttributes::EdgeStyle m_lineType;
+ double m_lineWidth;
+ String m_lineColor;
+ // nodeTemplate stores the graphical type
+ // e.g. rectangle, ellipse, hexagon, ...
+ String m_nodeTemplate;
+
+ //Constructor:
+ OgmlNodeTemplate(const String &id): m_id(id) { }
+};
+
+
+//---------------------------------------------------------
+// OgmlParser::OgmlEdgeTemplate
+//---------------------------------------------------------
+
+struct OgmlParser::OgmlEdgeTemplate
+{
+ String m_id;
+ GraphAttributes::EdgeStyle m_lineType;
+ double m_lineWidth;
+ String m_color;
+ int m_sourceType; // actually this is only a boolean value 0 or 1
+ // ogdf doesn't support source-arrow-color and size
+ // String m_sourceColor;
+ // double m_sourceSize;
+ int m_targetType; // actually this is only a boolean value 0 or 1
+ // ogdf doesn't support target-arrow-color and size
+ // String m_targetColor;
+ // double m_targetSize;
+
+ //Constructor:
+ OgmlEdgeTemplate(const String &id): m_id(id) { }
+};
+
+
+// struct OgmlParser::OgmlLabelTemplate{
+// String m_id;
+// };
+
+
+//---------------------------------------------------------
+// OgmlParser::OgmlSegment
+//---------------------------------------------------------
+
+struct OgmlParser::OgmlSegment
+{
+ DPoint point1, point2;
+};
+
+
+//---------------------------------------------------------
+// OgmlParser::OgmlAttributeValue
+//---------------------------------------------------------
+
+//! Objects of this class represent a value set of an attribute in Ogml.
+class OgmlParser::OgmlAttributeValue
+{
+ int id; //!< Id of the attribute value; for possible ones see Ogml.h.
+
+public:
+ // Construction
+ OgmlAttributeValue() : id(Ogml::av_any) { }
+
+ OgmlAttributeValue(int id) {
+ if(id >= 0 && id < Ogml::ATT_VAL_NUM) this->id = id;
+ else id = Ogml::av_any;
+ }
+
+ // Destruction
+ ~OgmlAttributeValue() { }
+
+ // Getter
+ const int& getId() const { return id; }
+ const String& getValue() const { return Ogml::s_attributeValueNames[id]; }
+
+ // Setter
+ void setId(int id) {
+ if(id >= 0 && id < Ogml::ATT_VAL_NUM) this->id = id;
+ else id = Ogml::av_any;
+ }
+
+
+ /**
+ * Checks the type of the input given in string
+ * and returns an OgmlAttributeValueId defined in Ogml.h
+ */
+ Ogml::AttributeValueId getTypeOfString(const String& input) const
+ {
+ // |--------------------|
+ // | char | ascii-value |
+ // |--------------------|
+ // | '.' | 46 |
+ // | '-' | 45 |
+ // | '+' | 43 |
+ // | '#' | 35 |
+
+ // bool values
+ bool isInt = true;
+ bool isNum = true;
+ bool isHex = true;
+
+ // value for point seperator
+ bool numPoint = false;
+
+ // input is a boolean value
+ if (input == "true" || input == "false" /*|| input == "0" || input == "1"*/)
+ return Ogml::av_bool;
+
+ if (input.length() > 0){
+ char actChar = input[0];
+ int actCharInt = static_cast<int>(actChar);
+ //check the first char
+ if (!isalnum(actChar)){
+
+ if (actCharInt == 35){
+ // support hex values with starting "#"
+ isInt = false;
+ isNum = false;
+ }
+ else
+ {
+
+ // (actChar != '-') and (actChar != '+')
+ if (!(actCharInt == 45) && !(actChar == 43)){
+ isInt = isNum = false;
+ }
+ else
+ {
+ // input[0] == '-' or '+'
+ if (input.length() > 1){
+ // 2nd char have to be a digit or xdigit
+ actChar = input[1];
+ actCharInt = static_cast<int>(actChar);
+ if (!isdigit(actChar)){
+ isInt = false;
+ isNum = false;
+ if (!isxdigit(actChar))
+ return Ogml::av_string;
+ }
+ }
+ else
+ return Ogml::av_string;
+ } // else... (input[0] == '-')
+ }
+ }
+ else{
+ if (!isdigit(actChar)){
+ isInt = false;
+ isNum = false;
+ }
+ if (!isxdigit(actChar)){
+ isHex = false;
+ }
+ }
+
+ // check every input char
+ // and set bool value to false if char-type is wrong
+ for(size_t it=1; ( (it<input.length()) && ((isInt) || (isNum) || (isHex)) ); it++)
+ {
+ actChar = input[it];
+ actCharInt = static_cast<int>(actChar);
+
+ // actChar == '.'
+ if (actChar == 46){
+ isInt = false;
+ isHex = false;
+ if (!numPoint){
+ numPoint = true;
+ }
+ else
+ isNum = false;
+ }// if (actChar == '.')
+ else {
+ if (!(isdigit(actChar))){
+ isInt = false;
+ isNum = false;
+ }
+ if (!(isxdigit(actChar)))
+ isHex = false;
+ }//else... (actChar != '.')
+ }//for
+ }//if (input.length() > 0)
+ else{
+ // input.length() == 0
+ return Ogml::av_none;
+ }
+ // return correct value
+ if (isInt) return Ogml::av_int;
+ if (isNum) return Ogml::av_num;
+ if (isHex) return Ogml::av_hex;
+ // if all bool values are false return av_string
+ return Ogml::av_string;
+
+ }//getTypeOfString
+
+
+ /**
+ * According to id this method proofs whether s is a valid value
+ * of the value set.
+ * E.g. if id=av_int s should contain an integer value.
+ * It returns the following validity states:
+ * vs_idNotUnique =-10, //id already exhausted
+ * vs_idRefErr = -9, //referenced id wasn't found or wrong type of referenced tag
+ * vs_idRefErr = -8, //referenced id wrong
+ * vs_attValueErr = -3, //attribute-value error
+ * Ogml::vs_valid = 1 //attribute-value is valid
+ *
+ * TODO: Completion of the switch-case statement.
+ */
+ int validValue(
+ const String &attributeValue,
+ const XmlTagObject* xmlTag, //owns an attribute with attributeValue
+ Hashing<String,
+ const XmlTagObject*>& ids) const //hashtable with id-tagName pairs
+ {
+ //get attribute value type of string
+ Ogml::AttributeValueId stringType = getTypeOfString(attributeValue);
+
+ HashElement<String, const XmlTagObject*>* he;
+
+ int valid = Ogml::vs_attValueErr;
+
+ switch(id) {
+ case Ogml::av_any:
+ valid = Ogml::vs_valid;
+ break;
+
+ case Ogml::av_int:
+ if (stringType == Ogml::av_int) valid = Ogml::vs_valid;
+ break;
+
+ case Ogml::av_num:
+ if (stringType == Ogml::av_num) valid = Ogml::vs_valid;
+ if (stringType == Ogml::av_int) valid = Ogml::vs_valid;
+ break;
+
+ case Ogml::av_bool:
+ if (stringType == Ogml::av_bool) valid = Ogml::vs_valid;
+ break;
+
+ case Ogml::av_string:
+ valid = Ogml::vs_valid;
+ break;
+
+ case Ogml::av_hex:
+ if (stringType == Ogml::av_hex) valid = Ogml::vs_valid;
+ if (stringType == Ogml::av_int) valid = Ogml::vs_valid;
+ break;
+
+ case Ogml::av_oct:
+ valid = Ogml::vs_attValueErr;
+ break;
+
+ case Ogml::av_id:
+ // id mustn't exist
+ if( !(he = ids.lookup(attributeValue)) ) {
+ ids.fastInsert(attributeValue, xmlTag);
+ valid = Ogml::vs_valid;
+ }
+ else valid = Ogml::vs_idNotUnique;
+ break;
+
+ // attribute idRef of elements source, target, nodeRef, nodeStyle
+ case Ogml::av_nodeIdRef:
+ // element exists && is tagname expected
+ if( (he = ids.lookup(attributeValue)) && (he->info()->getName() == Ogml::s_tagNames[Ogml::t_node]) ) valid = Ogml::vs_valid;
+ else valid = Ogml::vs_idRefErr;
+ break;
+
+ // attribute idRef of elements edgeRef, edgeStyle
+ case Ogml::av_edgeIdRef:
+ // element exists && is tagname expected
+ if( (he = ids.lookup(attributeValue)) && (he->info()->getName() == Ogml::s_tagNames[Ogml::t_edge]) ) valid = Ogml::vs_valid;
+ else valid = Ogml::vs_idRefErr;
+ break;
+
+ // attribute idRef of elements labelRef, labelStyle
+ case Ogml::av_labelIdRef:
+ // element exists && is tagname expected
+ if( (he = ids.lookup(attributeValue)) && (he->info()->getName() == Ogml::s_tagNames[Ogml::t_label]) ) valid = Ogml::vs_valid;
+ else valid = Ogml::vs_idRefErr;
+ break;
+
+ // attribute idRef of element endpoint
+ case Ogml::av_sourceIdRef:
+ // element exists && is tagname expected
+ if( (he = ids.lookup(attributeValue)) && (he->info()->getName() == Ogml::s_tagNames[Ogml::t_source]) ) valid = Ogml::vs_valid;
+ else valid = Ogml::vs_idRefErr;
+ break;
+
+ // attribute idRef of element endpoint
+ case Ogml::av_targetIdRef:
+ // element exists && is tagname expected
+ if( (he = ids.lookup(attributeValue)) && (he->info()->getName() == Ogml::s_tagNames[Ogml::t_target]) ) valid = Ogml::vs_valid;
+ else valid = Ogml::vs_idRefErr;
+ break;
+
+ // attribute idRef of subelement template of element nodeStyle
+ case Ogml::av_nodeStyleTemplateIdRef:
+ // element exists && is tagname expected
+ if( (he = ids.lookup(attributeValue)) && (he->info()->getName() == Ogml::s_tagNames[Ogml::t_nodeStyleTemplate]) ) valid = Ogml::vs_valid;
+ else valid = Ogml::vs_idRefErr;
+ break;
+
+ // attribute idRef of subelement template of element edgeStyle
+ case Ogml::av_edgeStyleTemplateIdRef:
+ // element exists && is tagname expected
+ if( (he = ids.lookup(attributeValue)) && (he->info()->getName() == Ogml::s_tagNames[Ogml::t_edgeStyleTemplate]) ) valid = Ogml::vs_valid;
+ else valid = Ogml::vs_idRefErr;
+ break;
+
+ // attribute idRef of subelement template of element labelStyle
+ case Ogml::av_labelStyleTemplateIdRef:
+ // element exists && is tagname expected
+ if( (he = ids.lookup(attributeValue)) && (he->info()->getName() == Ogml::s_tagNames[Ogml::t_labelStyleTemplate]) ) valid = Ogml::vs_valid;
+ else valid = Ogml::vs_idRefErr;
+ break;
+
+ case Ogml::av_pointIdRef:
+ // element exists && is tagname expected
+ if( (he = ids.lookup(attributeValue)) && (he->info()->getName() == Ogml::s_tagNames[Ogml::t_point]) ) valid = Ogml::vs_valid;
+ else valid = Ogml::vs_idRefErr;
+ break;
+
+ default:
+ // Proof string for equality
+ if(getValue() == attributeValue) valid = Ogml::vs_valid;
+ break;
+ }
+
+ return valid;
+ }
+
+};//class OgmlAttributeValue
+
+
+//---------------------------------------------------------
+// OgmlParser::OgmlAttribute
+//---------------------------------------------------------
+
+/** Objects of this class represent an attribute and its value set in Ogml.
+*/
+class OgmlParser::OgmlAttribute
+{
+ /**
+ */
+ int id; //!< Integer identifier of object; for possible ids see Ogml.h.
+ List<OgmlAttributeValue*> values; //!< Represents the value set of this attribute.
+
+public:
+
+ // Construction
+ OgmlAttribute() : id(Ogml::a_none), values() { }
+
+ OgmlAttribute(int id) : values() {
+ if(id >= 0 && id < Ogml::ATT_NUM) this->id = id;
+ else this->id = Ogml::a_none;
+ }
+
+ // Destruction
+ ~OgmlAttribute() { }
+
+ // Getter
+ const int& getId() const { return id; }
+ const String& getName() const { return Ogml::s_attributeNames[id]; }
+ const List<OgmlAttributeValue*>& getValueList() const { return values; }
+
+ // Setter
+ void setId(int id) {
+ if(id >= 0 && id < Ogml::ATT_NUM) this->id = id;
+ else this->id = Ogml::a_none;
+ }
+
+ /**
+ * Pushes pointers to OgmlAttributeValue objects back to list values.
+ * These value objects are looked up in hashtable values.
+ *
+ * NOTE: This method uses a variable parameter list. The last parameter
+ * need to be -1!
+ */
+ void pushValues(Hashing<int, OgmlAttributeValue> *val, int key, ...) {
+ va_list argp;
+ int arg = key;
+ HashElement<int, OgmlAttributeValue>* he;
+ va_start(argp, key);
+ while(arg!=-1) {
+ if((he = val->lookup(arg))) values.pushBack( &(he->info()) );
+ arg = va_arg(argp,int);
+ }
+ va_end(argp);
+ }
+
+ // Prints the value set of the attribute.
+ void print(ostream &os) const {
+ ListConstIterator<OgmlAttributeValue*> it;
+ os << "\"" << getName() << "\"={ ";
+ for(it = values.begin(); it.valid(); it++) {
+ os << (**it).getValue() << " ";
+ }
+ os << "}\n";
+ }
+
+ /**This method proofs whether o is a valid attribute in comparison
+ * to this object.
+ * That means if the name of o and this object are equal and if
+ * o has a valid value.
+ * It returns a validity state code (see Ogml.h).
+ **/
+ int validAttribute(const XmlAttributeObject &xmlAttribute,
+ const XmlTagObject* xmlTag,
+ Hashing<String, const XmlTagObject*>& ids) const
+ {
+ int valid = Ogml::vs_expAttNotFound;
+
+ if( xmlAttribute.getName() == getName() ) {
+ ListConstIterator<OgmlAttributeValue*> it;
+ for(it = values.begin(); it.valid(); it++) {
+ if ( (valid = (**it).validValue( xmlAttribute.getValue(), xmlTag, ids )) == Ogml::vs_valid ) break;
+ }
+ }
+
+ return valid;
+ }
+};//class OgmlAttribute
+
+
+
+//---------------------------------------------------------
+// OgmlParser::OgmlTag
+//---------------------------------------------------------
+
+/**Objects of this class represent a tag in Ogml with attributes.
+*/
+class OgmlParser::OgmlTag
+{
+ int id; //!< Integer identifier of object; for possible ids see Ogml.h.
+
+ int minOccurs, maxOccurs; // Min. occurs and max. occurs of this tag.
+
+ /**
+ * Flag denotes whether tag content can be ignored.
+ * It is possible to exchange this flag by a list of contents for more
+ * complex purposes ;-)
+ */
+ bool ignoreContent;
+
+ List<OgmlParser::OgmlAttribute*> compulsiveAttributes; //!< Represents the compulsive attributes of this object.
+ List<OgmlAttribute*> choiceAttributes; //!< Represents the attributes of this object of which at least one needs to exist.
+ List<OgmlAttribute*> optionalAttributes; //!< Represents the optional attributes of this object.
+
+ List<OgmlTag*> compulsiveTags;
+ List<OgmlTag*> choiceTags;
+ List<OgmlTag*> optionalTags;
+
+
+ void printOwnedTags(ostream &os, int mode) const
+ {
+ String s;
+ const List<OgmlTag*> *list = 0;
+
+ switch(mode) {
+ case 0:
+ list = &compulsiveTags;
+ s += "compulsive";
+ break;
+
+ case 1:
+ list = &choiceTags;
+ s += "selectable";
+ break;
+
+ case 2:
+ list = &optionalTags;
+ s += "optional";
+ break;
+
+ }
+
+ if(list->empty())
+ os << "Tag \"<" << getName() <<">\" doesn't include " << s << " tag(s).\n";
+ else {
+ os << "Tag \"<" << getName() <<">\" includes the following " << s << " tag(s): \n";
+ ListConstIterator<OgmlTag*> currTag;
+ for(currTag = list->begin(); currTag.valid(); currTag++)
+ os << "\t<" << (**currTag).getName() << ">\n";
+ }
+ }
+
+ void printOwnedAttributes(ostream &os, int mode) const
+ {
+ String s;
+ const List<OgmlAttribute*> *list = 0;
+
+ switch(mode)
+ case 0: {
+ list = &compulsiveAttributes;
+ s += "compulsive";
+ break;
+
+ case 1:
+ list = &choiceAttributes;
+ s += "selectable";
+ break;
+
+ case 2:
+ list = &optionalAttributes;
+ s += "optional";
+ break;
+
+ }
+
+ if(list->empty())
+ os << "Tag \"<" << getName() <<">\" doesn't include " << s << " attribute(s).\n";
+ else {
+ cout << "Tag \"<" << getName() <<">\" includes the following " << s << " attribute(s): \n";
+ ListConstIterator<OgmlAttribute*> currAtt;
+ for(currAtt = list->begin(); currAtt.valid(); currAtt++)
+ os << "\t" << (**currAtt);
+ }
+ }
+
+
+public:
+
+ bool ownsCompulsiveTags() {
+ return !compulsiveTags.empty();
+ }
+
+ bool ownsChoiceTags() {
+ return !choiceTags.empty();
+ }
+
+ bool ownsOptionalTags() {
+ return !optionalTags.empty();
+ }
+
+ const List<OgmlTag*>& getCompulsiveTags() const { return compulsiveTags; }
+
+ const List<OgmlTag*>& getChoiceTags() const { return choiceTags; }
+
+ const List<OgmlTag*>& getOptionalTags() const { return optionalTags; }
+
+
+ const int& getMinOccurs() const { return minOccurs; }
+
+ const int& getMaxOccurs() const { return maxOccurs; }
+
+ const bool& ignoresContent() const { return ignoreContent; }
+
+ void setMinOccurs(int occurs) { minOccurs = occurs; }
+
+ void setMaxOccurs(int occurs) { maxOccurs = occurs; }
+
+ void setIgnoreContent(bool ignore) { ignoreContent = ignore; }
+
+ //Construction
+ OgmlTag() : id(Ogml::t_none), ignoreContent(0) { }
+
+ OgmlTag(int id) : id(Ogml::t_none), ignoreContent(0) {
+ if(id >= 0 && id < Ogml::TAG_NUM) this->id = id;
+ else id = Ogml::a_none;
+ }
+
+ //Destruction
+ ~OgmlTag() {}
+
+ //Getter
+ const int& getId() const { return id; }
+ const String& getName() const { return Ogml::s_tagNames[id]; }
+
+ //Setter
+ void setId(int id){
+ if(id >= 0 && id < Ogml::TAG_NUM) this->id = id;
+ else id = Ogml::a_none;
+ }
+
+
+ void printOwnedTags(ostream& os) const {
+ printOwnedTags(os, 0);
+ printOwnedTags(os, 1);
+ printOwnedTags(os, 2);
+ }
+
+ void printOwnedAttributes(ostream& os) const {
+ printOwnedAttributes(os, 0);
+ printOwnedAttributes(os, 1);
+ printOwnedAttributes(os, 2);
+ }
+
+ /**Pushes pointers to OgmlAttribute objects back to list reqAttributes.
+ * These value objects are looked up in hashtable attrib.
+ *
+ * NOTE: This method uses a variable parameter list. The last parameter
+ * need to be -1!
+ */
+ void pushAttributes(int mode, Hashing<int, OgmlAttribute> *attrib, int key, ...)
+ {
+ List<OgmlAttribute*>* list;
+
+ if(mode==0) list = &compulsiveAttributes;
+ else if(mode==1) list = &choiceAttributes;
+ else list = &optionalAttributes;
+
+ va_list argp;
+ int arg = key;
+ HashElement<int, OgmlAttribute>* he;
+ va_start(argp, key);
+ while(arg!=-1) {
+ if((he = attrib->lookup(arg)))
+ (*list).pushBack( &(he->info()) );
+ arg = va_arg(argp,int);
+ }
+ va_end(argp);
+ }
+
+ /**Pushes pointers to OgmlAttribute objects back to list reqAttributes.
+ * These value objects are looked up in hashtable tag.
+ *
+ * NOTE: This method uses a variable parameter list. The last parameter
+ * need to be -1!
+ */
+ void pushTags(int mode, Hashing<int, OgmlTag> *tag, int key, ...)
+ {
+ List<OgmlTag*>* list;
+
+ if(mode==0) list = &compulsiveTags;
+ else if(mode==1) list = &choiceTags;
+ else list = &optionalTags;
+
+ va_list argp;
+ int arg = key;
+ HashElement<int, OgmlTag>* he;
+ va_start(argp, key);
+
+ while(arg!=-1) {
+ if((he = tag->lookup(arg)))
+ (*list).pushBack( &(he->info()) );
+ arg = va_arg(argp,int);
+ }
+ va_end(argp);
+ }
+
+ /**This method proofs whether o is a valid tag in comparison
+ * to this object.
+ * That means if the name of o and this object are equal and if
+ * the attribute list of o is valid (see also validAttribute(...)
+ * in OgmlAttribute.h). Otherwise false.
+ */
+ int validTag(const XmlTagObject &o,
+ Hashing<String, const XmlTagObject*>& ids) const
+ {
+ int valid = Ogml::vs_unexpTag;
+
+ if( o.getName() == getName() ) {
+
+ ListConstIterator<OgmlAttribute*> it;
+ XmlAttributeObject* att;
+
+ //Tag requires attributes
+ if(!compulsiveAttributes.empty()) {
+
+ for(it = compulsiveAttributes.begin(); it.valid(); it++) {
+ //Att not found or invalid
+ if(!o.findXmlAttributeObjectByName((**it).getName(), att) )
+ return valid = Ogml::vs_expAttNotFound;
+ if( (valid = (**it).validAttribute(*att, &o, ids) ) <0 )
+ return valid;
+ //Att is valid
+ att->setValid();
+ }
+ }
+
+ //Choice attributes
+ if(!choiceAttributes.empty()) {
+
+ bool tookChoice = false;
+
+ for(it = choiceAttributes.begin(); it.valid(); it++) {
+ //Choice att found
+ if( o.findXmlAttributeObjectByName((**it).getName(), att) ) {
+ //Proof if valid
+ if( (valid = (**it).validAttribute(*att, &o, ids)) <0 )
+ return valid;
+ tookChoice = true;
+ att->setValid();
+ }
+ }
+
+ if(!tookChoice)
+ return valid = Ogml::vs_expAttNotFound;
+
+ }
+
+ if(!optionalAttributes.empty() && !o.isAttributeLess()) {
+
+ //Check optional attributes
+ for(it = optionalAttributes.begin(); it.valid(); it++) {
+ if( o.findXmlAttributeObjectByName((**it).getName(), att) ) {
+ if( (valid = (**it).validAttribute(*att, &o, ids)) <0 )
+ return valid;
+ att->setValid();
+ }
+ }
+ }
+
+ //Are there still invalid attributes?
+ att = o.m_pFirstAttribute;
+ while(att) {
+ if(!att->valid())
+ return valid = Ogml::vs_unexpAtt;
+ att = att->m_pNextAttribute;
+ }
+
+ valid = Ogml::vs_valid;
+ }
+
+ return valid;
+ }
+
+};//class OgmlTag
+
+
+
+//---------------------------------------------------------
+// OgmlParser
+//---------------------------------------------------------
+
+// Definition of Hashtables
+Hashing < int, OgmlParser::OgmlTag > *OgmlParser::s_tags = 0;
+Hashing < int, OgmlParser::OgmlAttribute > *OgmlParser::s_attributes = 0;
+Hashing < int, OgmlParser::OgmlAttributeValue > *OgmlParser::s_attValues = 0;
+
+
+// ***********************************************************
+//
+// b u i l d H a s h T a b l e s
+//
+// ***********************************************************
+void OgmlParser::buildHashTables()
+{
+ if(s_tags != 0) // hash tables already built?
+ return;
+
+ s_tags = new Hashing < int, OgmlParser::OgmlTag >;
+ s_attributes = new Hashing < int, OgmlParser::OgmlAttribute >;
+ s_attValues = new Hashing < int, OgmlParser::OgmlAttributeValue >;
+
+ // Create OgmlAttributeValue objects and fill hashtable s_attValues.
+
+ for (int i = 0; i < Ogml::ATT_VAL_NUM; i++)
+ s_attValues->fastInsert(i, OgmlAttributeValue(i));
+
+ for (int i = 0; i < Ogml::ATT_NUM; i++)
+ s_attributes->fastInsert(i, OgmlAttribute(i));
+
+
+ // Create OgmlAttribute objects and fill hashtable attributes.
+
+ for (int i = 0; i < Ogml::ATT_NUM; i++) {
+
+ OgmlAttribute &att = s_attributes->lookup(i)->info();
+
+ switch (i) {
+
+ case Ogml::a_alignment:
+ att.pushValues(s_attValues,
+ Ogml::av_left,
+ Ogml::av_center,
+ Ogml::av_right,
+ Ogml::av_justify,
+ -1);
+ break;
+
+ case Ogml::a_angle:
+ att.pushValues(s_attValues,
+ Ogml::av_int,
+ -1);
+ break;
+
+ case Ogml::a_color:
+ att.pushValues(s_attValues,
+ Ogml::av_hex,
+ -1);
+ break;
+
+ case Ogml::a_decoration:
+ att.pushValues(s_attValues,
+ Ogml::av_underline,
+ Ogml::av_overline,
+ Ogml::av_lineThrough,
+ Ogml::av_blink,
+ Ogml::av_none,
+ -1);
+ break;
+
+ case Ogml::a_defaultEdgeTemplate:
+ att.pushValues(s_attValues, Ogml::av_any, -1);
+ break;
+
+ case Ogml::a_defaultLabelTemplate:
+ att.pushValues(s_attValues, Ogml::av_any, -1);
+ break;
+
+ case Ogml::a_defaultNodeTemplate:
+ att.pushValues(s_attValues, Ogml::av_any, -1);
+ break;
+
+ case Ogml::a_family:
+ att.pushValues(s_attValues,
+ Ogml::av_serif,
+ Ogml::av_sansSerif,
+ Ogml::av_cursive,
+ Ogml::av_fantasy,
+ Ogml::av_monospace,
+ -1);
+ break;
+
+ case Ogml::a_height:
+ att.pushValues(s_attValues, Ogml::av_num, -1);
+ break;
+
+ case Ogml::a_id:
+ att.pushValues(s_attValues, Ogml::av_id, -1);
+ break;
+
+ case Ogml::a_nodeIdRef:
+ att.pushValues(s_attValues, Ogml::av_nodeIdRef, -1);
+ break;
+
+ case Ogml::a_edgeIdRef:
+ att.pushValues(s_attValues, Ogml::av_edgeIdRef, -1);
+ break;
+
+ case Ogml::a_labelIdRef:
+ att.pushValues(s_attValues, Ogml::av_labelIdRef, -1);
+ break;
+
+ case Ogml::a_sourceIdRef:
+ att.pushValues(s_attValues, Ogml::av_nodeIdRef, Ogml::av_edgeIdRef, -1);
+ break;
+
+ case Ogml::a_targetIdRef:
+ att.pushValues(s_attValues, Ogml::av_nodeIdRef, Ogml::av_edgeIdRef, -1);
+ break;
+
+ case Ogml::a_nodeStyleTemplateIdRef:
+ att.pushValues(s_attValues, Ogml::av_nodeStyleTemplateIdRef, -1);
+ break;
+
+ case Ogml::a_edgeStyleTemplateIdRef:
+ att.pushValues(s_attValues, Ogml::av_edgeStyleTemplateIdRef, -1);
+ break;
+
+ case Ogml::a_labelStyleTemplateIdRef:
+ att.pushValues(s_attValues, Ogml::av_labelStyleTemplateIdRef, -1);
+ break;
+
+ case Ogml::a_endpointIdRef:
+ att.pushValues(s_attValues, Ogml::av_pointIdRef, Ogml::av_sourceIdRef, Ogml::av_targetIdRef, -1);
+ break;
+
+ case Ogml::a_name:
+ att.pushValues(s_attValues, Ogml::av_any, -1);
+ break;
+
+ // attribute type of subelement line of tag nodeStyleTemplate
+ case Ogml::a_nLineType:
+ att.pushValues(s_attValues,
+ Ogml::av_solid,
+ Ogml::av_dotted,
+ Ogml::av_dashed,
+ Ogml::av_double,
+ Ogml::av_triple,
+ Ogml::av_groove,
+ Ogml::av_ridge,
+ Ogml::av_inset,
+ Ogml::av_outset,
+ Ogml::av_none,
+ Ogml::av_esNoPen,
+ Ogml::av_esSolid,
+ Ogml::av_esDash,
+ Ogml::av_esDot,
+ Ogml::av_esDashdot,
+ Ogml::av_esDashdotdot,
+ -1);
+ break;
+
+ // attribute type of subelement shape of tag nodeStyleTemplate
+ case Ogml::a_nShapeType:
+ att.pushValues(s_attValues,
+ Ogml::av_rect,
+ Ogml::av_rectSimple,
+ Ogml::av_triangle,
+ Ogml::av_circle,
+ Ogml::av_ellipse,
+ Ogml::av_hexagon,
+ Ogml::av_rhomb,
+ Ogml::av_trapeze,
+ Ogml::av_upTrapeze,
+ Ogml::av_lParallelogram,
+ Ogml::av_rParallelogram,
+ Ogml::av_pentagon,
+ Ogml::av_octagon,
+ Ogml::av_umlClass,
+ Ogml::av_image,
+ -1);
+ break;
+
+ case Ogml::a_pattern:
+ att.pushValues(s_attValues,
+ Ogml::av_solid,
+ Ogml::av_striped,
+ Ogml::av_checked,
+ Ogml::av_dotted,
+ Ogml::av_none,
+ Ogml::av_bpNone,
+ Ogml::av_bpSolid,
+ Ogml::av_bpDense1,
+ Ogml::av_bpDense2,
+ Ogml::av_bpDense3,
+ Ogml::av_bpDense4,
+ Ogml::av_bpDense5,
+ Ogml::av_bpDense6,
+ Ogml::av_bpDense7,
+ Ogml::av_bpHorizontal,
+ Ogml::av_bpVertical,
+ Ogml::av_bpCross,
+ Ogml::av_bpBackwardDiagonal,
+ Ogml::av_bpForwardDiagonal,
+ Ogml::av_bpDiagonalCross, -1);
+ break;
+
+ case Ogml::a_patternColor:
+ att.pushValues(s_attValues, Ogml::av_hex, -1);
+ break;
+
+ case Ogml::a_rotation:
+ att.pushValues(s_attValues, Ogml::av_int, -1);
+ break;
+
+ case Ogml::a_size:
+ att.pushValues(s_attValues, Ogml::av_int, -1);
+ break;
+
+ case Ogml::a_stretch:
+ att.pushValues(s_attValues,
+ Ogml::av_normal,
+ Ogml::av_wider,
+ Ogml::av_narrower,
+ Ogml::av_ultraCondensed,
+ Ogml::av_extraCondensed,
+ Ogml::av_condensed,
+ Ogml::av_semiCondensed,
+ Ogml::av_semiExpanded,
+ Ogml::av_expanded,
+ Ogml::av_extraExpanded,
+ Ogml::av_ultraExpanded, -1);
+ break;
+
+ case Ogml::a_style:
+ att.pushValues(s_attValues, Ogml::av_normal, Ogml::av_italic, Ogml::av_oblique, -1);
+ break;
+
+ case Ogml::a_transform:
+ att.pushValues(s_attValues, Ogml::av_capitalize, Ogml::av_uppercase, Ogml::av_lowercase, Ogml::av_none, -1);
+ break;
+
+ // attribute type of subelements source-/targetStyle of tag edgeStyleTemplate
+ case Ogml::a_type:
+ att.pushValues(s_attValues,
+ Ogml::av_circle,
+ Ogml::av_halfCircle,
+ Ogml::av_filledCircle,
+ Ogml::av_filledHalfCircle,
+ Ogml::av_box,
+ Ogml::av_halfBox,
+ Ogml::av_filledBox,
+ Ogml::av_filledHalfBox,
+ Ogml::av_rhomb,
+ Ogml::av_halfRhomb,
+ Ogml::av_filledRhomb,
+ Ogml::av_filledHalfRhomb,
+ Ogml::av_diamond,
+ Ogml::av_halfDiamond,
+ Ogml::av_filledDiamond,
+ Ogml::av_filledHalfDiamond,
+ Ogml::av_smurf,
+ Ogml::av_arrow,
+ Ogml::av_slash,
+ Ogml::av_doubleSlash,
+ Ogml::av_solid,
+ Ogml::av_line,
+ Ogml::av_none, -1);
+ break;
+
+ case Ogml::a_uri:
+ att.pushValues(s_attValues, Ogml::av_uri, -1);
+ break;
+
+ case Ogml::a_intValue:
+ att.pushValues(s_attValues, Ogml::av_int, -1);
+ break;
+
+ case Ogml::a_numValue:
+ att.pushValues(s_attValues, Ogml::av_num, -1);
+ break;
+
+ case Ogml::a_boolValue:
+ att.pushValues(s_attValues, Ogml::av_bool, -1);
+ break;
+
+ case Ogml::a_variant:
+ att.pushValues(s_attValues, Ogml::av_normal, Ogml::av_smallCaps, -1);
+ break;
+
+ case Ogml::a_weight:
+ att.pushValues(s_attValues,
+ Ogml::av_normal,
+ Ogml::av_bold,
+ Ogml::av_bolder,
+ Ogml::av_lighter,
+ Ogml::av_int,
+ -1);
+ break;
+
+ case Ogml::a_width:
+ att.pushValues(s_attValues, Ogml::av_num, -1);
+ break;
+
+ case Ogml::a_x:
+ att.pushValues(s_attValues, Ogml::av_num, -1);
+ break;
+
+ case Ogml::a_y:
+ att.pushValues(s_attValues, Ogml::av_num, -1);
+ break;
+
+ case Ogml::a_z:
+ att.pushValues(s_attValues, Ogml::av_num, -1);
+
+ case Ogml::a_imageUri:
+ att.pushValues(s_attValues, Ogml::av_string, -1);
+
+ case Ogml::a_imageStyle:
+ att.pushValues(s_attValues, Ogml::av_freeScale, Ogml::av_fixScale, -1);
+
+ case Ogml::a_imageAlignment:
+ att.pushValues(s_attValues, Ogml::av_topLeft,
+ Ogml::av_topCenter,
+ Ogml::av_topRight,
+ Ogml::av_centerLeft,
+ Ogml::av_center,
+ Ogml::av_centerRight,
+ Ogml::av_bottomLeft,
+ Ogml::av_bottomCenter,
+ Ogml::av_bottomRight, -1);
+
+ case Ogml::a_imageDrawLine:
+ att.pushValues(s_attValues, Ogml::av_bool, -1);
+
+ case Ogml::a_imageWidth:
+ att.pushValues(s_attValues, Ogml::av_num, -1);
+
+ case Ogml::a_imageHeight:
+ att.pushValues(s_attValues, Ogml::av_num, -1);
+
+ case Ogml::a_constraintType:
+ att.pushValues(s_attValues, Ogml::av_constraintAlignment, Ogml::av_constraintAnchor, Ogml::av_constraintSequence, -1);
+
+ case Ogml::a_disabled:
+ att.pushValues(s_attValues, Ogml::av_bool, -1);
+
+ }
+ }
+
+
+ // Create OgmlTag objects and fill hashtable tags.
+
+ for (int i = 0; i < Ogml::TAG_NUM; i++)
+ s_tags->fastInsert(i, OgmlTag(i));
+
+
+ enum Mode { compMode = 0, choiceMode, optMode };
+
+ // Create tag relations.
+
+ for (int i = 0; i < Ogml::TAG_NUM; i++)
+ {
+ OgmlTag &tag = s_tags->lookup(i)->info();
+
+ switch (i) {
+ case Ogml::t_bool:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(Ogml::MAX_TAG_COUNT);
+ tag.pushAttributes(compMode, s_attributes, Ogml::a_boolValue, -1);
+ tag.pushAttributes(optMode, s_attributes, Ogml::a_name, -1);
+ break;
+
+ case Ogml::t_composed:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(Ogml::MAX_TAG_COUNT);
+ tag.pushAttributes(optMode, s_attributes, Ogml::a_name, -1);
+ tag.pushTags(choiceMode, s_tags, Ogml::t_num, Ogml::t_int, Ogml::t_bool,
+ Ogml::t_string, Ogml::t_nodeRef, Ogml::t_edgeRef, Ogml::t_labelRef, Ogml::t_composed, -1);
+ break;
+
+ case Ogml::t_constraint:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(Ogml::MAX_TAG_COUNT);
+ tag.pushAttributes(compMode, s_attributes, Ogml::a_constraintType, -1);
+ tag.pushAttributes(choiceMode, s_attributes, Ogml::a_id, Ogml::a_name, Ogml::a_disabled, -1);
+ tag.pushTags(choiceMode, s_tags, Ogml::t_num, Ogml::t_int, Ogml::t_bool,
+ Ogml::t_string, Ogml::t_nodeRef, Ogml::t_edgeRef, Ogml::t_labelRef, Ogml::t_composed, Ogml::t_constraint, -1);
+ break;
+
+ case Ogml::t_constraints:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(1);
+ tag.pushTags(compMode, s_tags, Ogml::t_constraint, -1);
+ break;
+
+ case Ogml::t_content:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(1);
+ tag.setIgnoreContent(true);
+ break;
+
+ case Ogml::t_data:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(Ogml::MAX_TAG_COUNT);
+ tag.pushAttributes(optMode, s_attributes, Ogml::a_name, -1);
+ tag.pushTags(choiceMode, s_tags, Ogml::t_int, Ogml::t_bool, Ogml::t_num, Ogml::t_string, Ogml::t_data, -1);
+ break;
+
+ case Ogml::t_default:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(1);
+ break;
+
+ case Ogml::t_edge:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(Ogml::MAX_TAG_COUNT);
+ tag.pushAttributes(compMode, s_attributes, Ogml::a_id, -1);
+ tag.pushTags(choiceMode, s_tags, Ogml::t_source, Ogml::t_target, -1);
+ tag.pushTags(optMode, s_tags, Ogml::t_data, Ogml::t_label, -1);
+ break;
+
+ case Ogml::t_edgeRef:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(Ogml::MAX_TAG_COUNT);
+ tag.pushAttributes(compMode, s_attributes, Ogml::a_edgeIdRef, -1);
+ tag.pushAttributes(optMode, s_attributes, Ogml::a_name, -1);
+ break;
+
+ case Ogml::t_edgeStyle:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(Ogml::MAX_TAG_COUNT);
+ tag.pushAttributes(compMode, s_attributes, Ogml::a_edgeIdRef, -1);
+ tag.pushTags(choiceMode, s_tags, Ogml::t_edgeStyleTemplateRef,
+ Ogml::t_line, Ogml::t_sourceStyle, Ogml::t_targetStyle, Ogml::t_point, Ogml::t_segment, -1);
+ tag.pushTags(optMode, s_tags, Ogml::t_data, -1);
+ break;
+
+ case Ogml::t_edgeStyleTemplate:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(Ogml::MAX_TAG_COUNT);
+ tag.pushAttributes(compMode, s_attributes, Ogml::a_id, -1);
+ tag.pushTags(choiceMode, s_tags, Ogml::t_line, Ogml::t_sourceStyle, Ogml::t_targetStyle, -1);
+ tag.pushTags(optMode, s_tags, Ogml::t_data, Ogml::t_edgeStyleTemplateRef, -1);
+ break;
+
+ case Ogml::t_endpoint:
+ tag.setMinOccurs(2);
+ tag.setMaxOccurs(2);
+ tag.pushAttributes(compMode, s_attributes, Ogml::a_endpointIdRef, -1);
+ tag.pushAttributes(optMode, s_attributes, Ogml::a_type, Ogml::a_color, Ogml::a_size, -1);
+ break;
+
+ case Ogml::t_fill:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(1);
+ tag.pushAttributes(compMode, s_attributes, Ogml::a_color, Ogml::a_pattern, Ogml::a_patternColor, -1);
+ break;
+
+ case Ogml::t_font:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(1);
+ tag.pushAttributes(compMode, s_attributes, Ogml::a_family, -1);
+ tag.pushAttributes(optMode, s_attributes, Ogml::a_style,
+ Ogml::a_variant, Ogml::a_weight, Ogml::a_stretch, Ogml::a_size, Ogml::a_color, -1);
+ break;
+
+ case Ogml::t_graph:
+ tag.setMinOccurs(1);
+ tag.setMaxOccurs(1);
+ tag.pushTags(compMode, s_tags, Ogml::t_structure, -1);
+ tag.pushTags(optMode, s_tags, Ogml::t_layout, Ogml::t_data, -1);
+ break;
+
+ case Ogml::t_graphStyle:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(1);
+ tag.pushAttributes(choiceMode, s_attributes,
+ Ogml::a_defaultNodeTemplate,
+ Ogml::a_defaultEdgeTemplate, Ogml::a_defaultLabelTemplate, -1);
+ break;
+
+ case Ogml::t_int:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(Ogml::MAX_TAG_COUNT);
+ tag.pushAttributes(compMode, s_attributes, Ogml::a_intValue, -1);
+ tag.pushAttributes(optMode, s_attributes, Ogml::a_name, -1);
+ break;
+
+ case Ogml::t_label:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(Ogml::MAX_TAG_COUNT);
+ tag.pushAttributes(compMode, s_attributes, Ogml::a_id, -1);
+ tag.pushTags(compMode, s_tags, Ogml::t_content, -1);
+ tag.pushTags(optMode, s_tags, Ogml::t_data, -1);
+ break;
+
+ case Ogml::t_labelRef:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(Ogml::MAX_TAG_COUNT);
+ tag.pushAttributes(compMode, s_attributes, Ogml::a_labelIdRef, -1);
+ tag.pushAttributes(optMode, s_attributes, Ogml::a_name, -1);
+ break;
+
+ case Ogml::t_labelStyle:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(Ogml::MAX_TAG_COUNT);
+ tag.pushAttributes(compMode, s_attributes, Ogml::a_labelIdRef, -1);
+ tag.pushTags(choiceMode, s_tags, Ogml::t_labelStyleTemplateRef,
+ Ogml::t_data, Ogml::t_text, Ogml::t_font, Ogml::t_location, -1);
+ break;
+
+ case Ogml::t_labelStyleTemplate:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(Ogml::MAX_TAG_COUNT);
+ tag.pushAttributes(compMode, s_attributes, Ogml::a_id, -1);
+ tag.pushTags(compMode, s_tags, Ogml::t_text, Ogml::t_font, -1);
+ tag.pushTags(optMode, s_tags, Ogml::t_data, Ogml::t_labelStyleTemplateRef, -1);
+ break;
+
+ case Ogml::t_layout:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(1);
+ tag.pushTags(optMode, s_tags, Ogml::t_data, Ogml::t_styleTemplates, Ogml::t_styles, Ogml::t_constraints, -1);
+ break;
+
+ case Ogml::t_line:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(1);
+ tag.pushAttributes(choiceMode, s_attributes, Ogml::a_nLineType, Ogml::a_width, Ogml::a_color, -1);
+ break;
+
+ case Ogml::t_location:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(1);
+ tag.pushAttributes(compMode, s_attributes, Ogml::a_x, Ogml::a_y, -1);
+ tag.pushAttributes(optMode, s_attributes, Ogml::a_z, -1);
+ break;
+
+ case Ogml::t_node:
+ tag.setMinOccurs(1);
+ tag.setMaxOccurs(Ogml::MAX_TAG_COUNT);
+ tag.pushAttributes(compMode, s_attributes, Ogml::a_id, -1);
+ tag.pushTags(optMode, s_tags, Ogml::t_data, Ogml::t_label, Ogml::t_node, -1);
+ break;
+
+ case Ogml::t_nodeRef:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(Ogml::MAX_TAG_COUNT);
+ tag.pushAttributes(compMode, s_attributes, Ogml::a_nodeIdRef, -1);
+ tag.pushAttributes(optMode, s_attributes, Ogml::a_name, -1);
+ break;
+
+ case Ogml::t_nodeStyle:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(Ogml::MAX_TAG_COUNT);
+ tag.pushAttributes(compMode, s_attributes, Ogml::a_nodeIdRef, -1);
+ tag.pushTags(choiceMode, s_tags, Ogml::t_location, Ogml::t_shape, Ogml::t_fill, Ogml::t_line, Ogml::t_image, -1);
+ tag.pushTags(optMode, s_tags, Ogml::t_data, Ogml::t_nodeStyleTemplateRef, -1);
+ break;
+
+
+ case Ogml::t_nodeStyleTemplate:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(Ogml::MAX_TAG_COUNT);
+ tag.pushAttributes(compMode, s_attributes, Ogml::a_id, -1);
+ tag.pushTags(choiceMode, s_tags, Ogml::t_shape, Ogml::t_fill, Ogml::t_line, -1);
+ tag.pushTags(optMode, s_tags, Ogml::t_data, Ogml::t_nodeStyleTemplateRef, -1);
+ break;
+
+ case Ogml::t_num:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(Ogml::MAX_TAG_COUNT);
+ tag.pushAttributes(compMode, s_attributes, Ogml::a_numValue, -1);
+ tag.pushAttributes(optMode, s_attributes, Ogml::a_name, -1);
+ break;
+
+ case Ogml::t_ogml:
+ tag.setMinOccurs(1);
+ tag.setMaxOccurs(1);
+ tag.pushTags(compMode, s_tags, Ogml::t_graph, -1);
+ break;
+
+ case Ogml::t_point:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(Ogml::MAX_TAG_COUNT);
+ tag.pushAttributes(compMode, s_attributes, Ogml::a_id, Ogml::a_x, Ogml::a_y, -1);
+ tag.pushAttributes(optMode, s_attributes, Ogml::a_z, -1);
+ tag.pushTags(optMode, s_tags, Ogml::t_data, -1);
+ break;
+
+ case Ogml::t_port:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(Ogml::MAX_TAG_COUNT);
+ tag.pushAttributes(compMode, s_attributes, Ogml::a_id, Ogml::a_x, Ogml::a_y, -1);
+ break;
+
+ case Ogml::t_segment:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(Ogml::MAX_TAG_COUNT);
+ tag.pushTags(compMode, s_tags, Ogml::t_endpoint, -1);
+ tag.pushTags(optMode, s_tags, Ogml::t_data, Ogml::t_line, -1);
+ break;
+
+ case Ogml::t_shape:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(1);
+ tag.pushAttributes(choiceMode, s_attributes, Ogml::a_nShapeType, Ogml::a_width, Ogml::a_height, /*a_uri,*/ -1);
+ // comment (BZ): uri is obsolete, images got an own tag
+ break;
+
+ case Ogml::t_source:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(Ogml::MAX_TAG_COUNT);
+ tag.pushAttributes(compMode, s_attributes, Ogml::a_sourceIdRef, -1);
+ tag.pushAttributes(optMode, s_attributes, Ogml::a_id, -1);
+ tag.pushTags(optMode, s_tags, Ogml::t_data, Ogml::t_label, -1);
+ break;
+
+ case Ogml::t_sourceStyle:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(1);
+ tag.pushAttributes(choiceMode, s_attributes, Ogml::a_type, Ogml::a_color, Ogml::a_size, -1);
+ break;
+
+ case Ogml::t_string:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(Ogml::MAX_TAG_COUNT);
+ tag.pushAttributes(optMode, s_attributes, Ogml::a_name, -1);
+ tag.setIgnoreContent(true);
+ break;
+
+ case Ogml::t_structure:
+ tag.setMinOccurs(1);
+ tag.setMaxOccurs(1);
+ tag.pushTags(compMode, s_tags, Ogml::t_node, -1);
+ tag.pushTags(optMode, s_tags, Ogml::t_edge, Ogml::t_label, Ogml::t_data, -1);
+ break;
+
+ case Ogml::t_styles:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(1);
+ tag.pushTags(choiceMode, s_tags, Ogml::t_nodeStyle, Ogml::t_edgeStyle, Ogml::t_labelStyle, -1);
+ tag.pushTags(optMode, s_tags, Ogml::t_graphStyle, Ogml::t_data, -1);
+ break;
+
+ case Ogml::t_styleTemplates:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(1);
+ tag.pushTags(choiceMode, s_tags, Ogml::t_nodeStyleTemplate,
+ Ogml::t_edgeStyleTemplate, Ogml::t_labelStyleTemplate, -1);
+ tag.pushTags(optMode, s_tags, Ogml::t_data, -1);
+ break;
+
+ case Ogml::t_target:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(Ogml::MAX_TAG_COUNT);
+ tag.pushAttributes(compMode, s_attributes, Ogml::a_targetIdRef, -1);
+ tag.pushAttributes(optMode, s_attributes, Ogml::a_id, -1);
+ tag.pushTags(optMode, s_tags, Ogml::t_data, Ogml::t_label, -1);
+ break;
+
+ case Ogml::t_targetStyle:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(1);
+ tag.pushAttributes(choiceMode, s_attributes, Ogml::a_type, Ogml::a_color, Ogml::a_size, -1);
+ break;
+
+ case Ogml::t_labelStyleTemplateRef:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(1);
+ tag.pushAttributes(compMode, s_attributes, Ogml::a_labelStyleTemplateIdRef, -1);
+ break;
+
+ case Ogml::t_nodeStyleTemplateRef:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(1);
+ tag.pushAttributes(compMode, s_attributes, Ogml::a_nodeStyleTemplateIdRef, -1);
+ break;
+
+ case Ogml::t_edgeStyleTemplateRef:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(1);
+ tag.pushAttributes(compMode, s_attributes, Ogml::a_edgeStyleTemplateIdRef, -1);
+ break;
+
+ case Ogml::t_text:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(1);
+ tag.pushAttributes(choiceMode, s_attributes, Ogml::a_alignment,
+ Ogml::a_decoration, Ogml::a_transform, Ogml::a_rotation, -1);
+ break;
+
+ case Ogml::t_image:
+ tag.setMinOccurs(0);
+ tag.setMaxOccurs(1);
+ tag.pushAttributes(compMode, s_attributes, Ogml::a_imageUri, -1);
+ tag.pushAttributes(optMode, s_attributes,
+ Ogml::a_imageStyle,
+ Ogml::a_imageAlignment,
+ Ogml::a_imageDrawLine,
+ Ogml::a_imageWidth,
+ Ogml::a_imageHeight, -1);
+ break;
+ }
+ }
+}
+
+
+// ********************************************************
+//
+// v a l i d a t e
+//
+// ********************************************************
+int OgmlParser::validate(const XmlTagObject * xmlTag, int ogmlTagId)
+{
+
+ OgmlTag *ogmlTag = &s_tags->lookup(ogmlTagId)->info();
+ ListConstIterator < OgmlTag * > it;
+ XmlTagObject *sonTag;
+ int valid;
+
+ // Perhaps xmlTag is already valid
+ if(xmlTag->valid())
+ return valid = Ogml::vs_valid;
+
+ if(!ogmlTag) {
+ cerr << "Didn't found tag with id \"" << ogmlTagId << "\" in hashtable in OgmlParser::validate! Aborting.\n";
+ return false;
+ }
+
+ if((valid = ogmlTag->validTag(*xmlTag, m_ids)) < 0) {
+ this->printValidityInfo(*ogmlTag, *xmlTag, valid, __LINE__);
+ return valid;
+ }
+
+ // if tag ignores its content simply return
+ if(ogmlTag->ignoresContent()) {
+ xmlTag->setValid();
+#ifdef OGDF_DEBUG
+ this->printValidityInfo(*ogmlTag, *xmlTag, valid = Ogml::vs_valid, __LINE__);
+#endif
+ return valid = Ogml::vs_valid;
+ }
+
+ // Check if all required son tags exist
+ if(ogmlTag->ownsCompulsiveTags())
+ {
+ // find all obligatoric sons: all obligatoric sons
+ for (it = ogmlTag->getCompulsiveTags().begin(); it.valid(); it++)
+ {
+ int cnt = 0;
+
+ // search for untested sons
+ sonTag = xmlTag->m_pFirstSon;
+ while(sonTag) {
+ if(sonTag->getName() == (**it).getName()) {
+ cnt++;
+ if((valid = validate(sonTag, (**it).getId())) < 0)
+ return valid;
+ }
+ sonTag = sonTag->m_pBrother;
+ }
+
+ // Exp. son not found
+ if(cnt == 0) {
+ this->printValidityInfo(*ogmlTag, *xmlTag, valid = Ogml::vs_expTagNotFound, __LINE__);
+ return valid;
+ }
+
+ // Check cardinality
+ if(cnt < (**it).getMinOccurs() || cnt > (**it).getMaxOccurs()) {
+ this->printValidityInfo((**it), *xmlTag, valid = Ogml::vs_cardErr, __LINE__);
+ return valid;
+ }
+ }
+ }
+
+ // Check if choice son tags exist
+ if(ogmlTag->ownsChoiceTags())
+ {
+ bool tookChoice = false;
+
+ // find all obligatoric sons: all obligatoric sons
+ for (it = ogmlTag->getChoiceTags().begin(); it.valid(); it++)
+ {
+ int cnt = 0;
+
+ // search for untested sons
+ sonTag = xmlTag->m_pFirstSon;
+ while(sonTag) {
+ if(sonTag->getName() == (**it).getName()) {
+ if((valid = validate(sonTag, (**it).getId())) < 0)
+ return valid;
+ tookChoice = true;
+ cnt++;
+ }
+ sonTag = sonTag->m_pBrother;
+ }
+
+ // Check cardinality
+ if(cnt > 0 && (cnt < (**it).getMinOccurs()
+ || cnt > (**it).getMaxOccurs())) {
+ this->printValidityInfo((**it), *xmlTag, valid = Ogml::vs_cardErr, __LINE__);
+ return valid;
+ }
+
+ }
+ if ((!tookChoice) && (xmlTag->m_pFirstSon)) {
+ this->printValidityInfo((**it), *xmlTag, valid = Ogml::vs_tagEmptIncl, __LINE__);
+ return valid;
+ }
+
+ } //Check choice son tags
+
+ // Check if opt son tags exist
+ if(ogmlTag->ownsOptionalTags())
+ {
+ // find all obligatoric sons: all obligatoric sons
+ for (it = ogmlTag->getOptionalTags().begin(); it.valid(); ++it)
+ {
+ int cnt = 0;
+
+ // search for untested sons
+ sonTag = xmlTag->m_pFirstSon;
+ while(sonTag) {
+
+ if(sonTag->getName() == (**it).getName()) {
+ if((valid = validate(sonTag, (**it).getId())) < 0)
+ return valid;
+ cnt++;
+ }
+ sonTag = sonTag->m_pBrother;
+ }
+
+ // Check cardinality
+ // if( (cnt<(**it).getMinOccurs() || cnt>(**it).getMaxOccurs()) ) {
+ if(cnt > (**it).getMaxOccurs()) {
+ this->printValidityInfo((**it), *xmlTag, valid = Ogml::vs_cardErr, __LINE__);
+ return valid;
+ }
+ }
+ }
+
+ // Are there invalid son tags left?
+ sonTag = xmlTag->m_pFirstSon;
+ while(sonTag) {
+ // tag already valid
+ if(!sonTag->valid()) {
+ this->printValidityInfo(*ogmlTag, *xmlTag, valid = Ogml::vs_unexpTag, __LINE__);
+ return valid;
+ }
+ sonTag = sonTag->m_pBrother;
+ }
+
+ // Finally xmlTag is valid :-)
+ xmlTag->setValid();
+
+#ifdef OGDF_DEBUG
+ this->printValidityInfo(*ogmlTag, *xmlTag, valid = Ogml::vs_valid, __LINE__);
+#endif
+
+ return Ogml::vs_valid;
+}
+
+
+//
+// v a l i d a t e
+//
+void OgmlParser::validate(const char *fileName)
+{
+ DinoXmlParser p(fileName);
+ p.createParseTree();
+
+ const XmlTagObject *root = &p.getRootTag();
+ buildHashTables();
+ validate(root, Ogml::t_ogml);
+}
+
+
+//
+// o p e r a t o r < <
+//
+ostream& operator<<(ostream& os, const OgmlParser::OgmlAttribute& oa)
+{
+ oa.print(os);
+ return os;
+}
+
+//
+// o p e r a t o r < <
+//
+ostream& operator<<(ostream& os, const OgmlParser::OgmlTag& ot)
+{
+ ot.printOwnedTags(os);
+ ot.printOwnedAttributes(os);
+ return os;
+}
+
+
+// ***********************************************************
+//
+// p r i n t V a l i d i t y I n f o
+//
+// ***********************************************************
+void OgmlParser::printValidityInfo(const OgmlTag & ot, const XmlTagObject & xto, int valStatus, int /*line*/)
+{
+ const String &ogmlTagName = ot.getName();
+
+ switch (valStatus) {
+
+ case Ogml::vs_tagEmptIncl:
+ cerr << "ERROR: tag \"<" << ogmlTagName << ">\" expects tag(s) to include! ";
+ cerr << "(Input source line: " << xto.
+ getLine() << ", recursion depth: " << xto.getDepth() << ")\n";
+ ot.printOwnedTags(cerr);
+ break;
+
+ case Ogml::vs_idNotUnique:
+ cerr << "ERROR: tag \"<" << ogmlTagName << ">\" owns already assigned id! ";
+ cerr << "(Input source line: " << xto.
+ getLine() << ", recursion depth: " << xto.getDepth() << ")\n";
+ break;
+
+ case Ogml::vs_idRefErr:
+ cerr << "ERROR: tag \"<" << ogmlTagName << ">\" references unknown or wrong id! ";
+ cerr << "(Input source line: " << xto.
+ getLine() << ", recursion depth: " << xto.getDepth() << ")\n";
+ break;
+
+ case Ogml::vs_unexpTag:
+ cerr << "ERROR: tag \"<" << ogmlTagName << ">\" owns unexpected tag! ";
+ cerr << "(Input source line: " << xto.
+ getLine() << ", recursion depth: " << xto.getDepth() << ")\n";
+ ot.printOwnedTags(cerr);
+ break;
+
+ case Ogml::vs_unexpAtt:
+ cerr << "ERROR: tag \"<" << ogmlTagName << ">\" owns unexpected attribute(s)! ";
+ cerr << "(Input source line: " << xto.
+ getLine() << ", recursion depth: " << xto.getDepth() << ")\n";
+ ot.printOwnedAttributes(cerr);
+ break;
+
+ case Ogml::vs_expTagNotFound:
+ cerr << "ERROR: tag \"<" << ogmlTagName << ">\" doesn't own compulsive tag(s)! ";
+ cerr << "(Input source line: " << xto.
+ getLine() << ", recursion depth: " << xto.getDepth() << ")\n";
+ ot.printOwnedTags(cerr);
+ break;
+
+ case Ogml::vs_expAttNotFound:
+ cerr << "ERROR: tag \"<" << ogmlTagName << ">\" doesn't own compulsive attribute(s)! ";
+ cerr << "(Input source line: " << xto.
+ getLine() << ", recursion depth: " << xto.getDepth() << ")\n";
+ ot.printOwnedAttributes(cerr);
+ break;
+
+ case Ogml::vs_attValueErr:
+ cerr << "ERROR: tag \"<" << ogmlTagName << ">\" owns attribute with wrong value! ";
+ cerr << "(Input source line: " << xto.
+ getLine() << ", recursion depth: " << xto.getDepth() << ")\n";
+ ot.printOwnedAttributes(cerr);
+ break;
+
+ case Ogml::vs_cardErr:
+ cerr << "ERROR: tag \"<" << ogmlTagName <<
+ ">\" occurence exceeds the number of min. (" << ot.
+ getMinOccurs() << ") or max. (" << ot.getMaxOccurs() << ") occurences in its context! ";
+ cerr << "(Input source line: " << xto.
+ getLine() << ", recursion depth: " << xto.getDepth() << ")\n";
+ break;
+
+ case Ogml::vs_invalid:
+ cerr << "ERROR: tag \"<" << ogmlTagName << ">\" is invalid! No further information available. ";
+ cerr << "(Input source line: " << xto.
+ getLine() << ", recursion depth: " << xto.getDepth() << ")\n";
+ cerr << ot;
+ break;
+
+ case Ogml::vs_valid:
+ //cout << "INFO: tag \"<" << ogmlTagName << ">\" is valid :-) ";
+ //cout << "(Input source line: " << xto.
+ // getLine() << ", recursion depth: " << xto.getDepth() << ")\n";
+ break;
+ }
+
+//#ifdef OGDF_DEBUG
+// if(valStatus != Ogml::vs_valid)
+// cout << "(Line OgmlParser::validate: " << line << ")\n";
+//#endif
+}
+
+
+
+// ***********************************************************
+//
+// i s G r a p h H i e r a r c h i c a l
+//
+// ***********************************************************
+bool OgmlParser::isGraphHierarchical(const XmlTagObject *xmlTag) const
+{
+ if(xmlTag->getName() == Ogml::s_tagNames[Ogml::t_node] && isNodeHierarchical(xmlTag))
+ return true;
+
+ // Depth-Search only if ret!=true
+ if(xmlTag->m_pFirstSon && isGraphHierarchical(xmlTag->m_pFirstSon))
+ return true;
+
+ // Breadth-Search only if ret!=true
+ if(xmlTag->m_pBrother && isGraphHierarchical(xmlTag->m_pBrother))
+ return true;
+
+ return false;
+}
+
+
+
+// ***********************************************************
+//
+// i s N o d e H i e r a r c h i c a l
+//
+// ***********************************************************
+bool OgmlParser::isNodeHierarchical(const XmlTagObject *xmlTag) const
+{
+ bool ret = false;
+ if(xmlTag->getName() == Ogml::s_tagNames[Ogml::t_node]) {
+
+ XmlTagObject* dum;
+ // check if an ancestor is a node
+ ret = xmlTag->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_node], dum);
+ }
+
+ return ret;
+}
+
+
+
+// ***********************************************************
+//
+// c h e c k G r a p h T y p e
+//
+// ***********************************************************
+bool OgmlParser::checkGraphType(const XmlTagObject *xmlTag) const
+{
+ if(xmlTag->getName() != Ogml::s_tagNames[Ogml::t_ogml]) {
+ cerr << "ERROR: Expecting root tag \"" << Ogml::s_tagNames[Ogml::t_ogml] << "\" in OgmlParser::checkGraphType!\n";
+ return false;
+ }
+
+ // Normal graph present
+ if(!isGraphHierarchical(xmlTag)) {
+ m_graphType = Ogml::graph;
+ return true;
+ }
+
+ // Cluster-/Compound graph present
+ m_graphType = Ogml::clusterGraph;
+
+ // Traverse the parse tree and collect all edge tags
+ List<const XmlTagObject*> edges;
+ if(xmlTag->getName() == Ogml::s_tagNames[Ogml::t_edge]) edges.pushBack(xmlTag);
+ XmlTagObject* son = xmlTag->m_pFirstSon;
+ while(son) {
+ if(son->getName() == Ogml::s_tagNames[Ogml::t_edge]) edges.pushBack(son);
+ son = son->m_pBrother;
+ }
+
+ // Cluster graph already present
+ if(edges.empty()) return true;
+
+ // Traverse edges
+ ListConstIterator<const XmlTagObject*> edgeIt;
+ for(edgeIt = edges.begin(); edgeIt.valid() && m_graphType != Ogml::compoundGraph; edgeIt++)
+ {
+ // Traverse the sources/targets
+ son = (*edgeIt)->m_pFirstSon;
+
+ // Parse tree is valid so one edge contains at least one source/target
+ // with idRef attribute
+ while(son) {
+ XmlAttributeObject* att;
+ if(son->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_nodeIdRef], att)) {
+ const XmlTagObject *refTag = m_ids.lookup(att->getValue())->info();
+ if(isNodeHierarchical(refTag)) {
+ m_graphType = Ogml::compoundGraph;
+ break;
+ }
+ }
+ son = son->m_pBrother;
+ }
+ }
+
+ return true;
+}
+
+
+
+// ***********************************************************
+//
+// a u x i l i a r y m e t h o d s
+//
+// ***********************************************************
+// => Mapping of OGML to OGDF <=
+
+
+// Mapping Brush Pattern
+int OgmlParser::getBrushPatternAsInt(String s)
+{
+ if (s == Ogml::s_attributeValueNames[Ogml::av_bpNone])
+ return 0;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_bpSolid])
+ return 1;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_bpDense1])
+ return 2;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_bpDense2])
+ return 3;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_bpDense3])
+ return 4;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_bpDense4])
+ return 5;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_bpDense5])
+ return 6;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_bpDense6])
+ return 7;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_bpDense7])
+ return 8;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_bpHorizontal])
+ return 9;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_bpVertical])
+ return 10;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_bpCross])
+ return 11;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_bpBackwardDiagonal])
+ return 12;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_bpForwardDiagonal])
+ return 13;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_bpDiagonalCross])
+ return 14;
+ // default return bpSolid
+ return 1;
+}
+
+
+// Mapping Shape to Integer
+int OgmlParser::getShapeAsInt(String s)
+{
+ //TODO: has to be completed if other shape types are implemented!!!
+ // SMALL PROBLEM: OGML DOESN'T SUPPORT SHAPES
+ // -> change XSD, if necessary
+
+ if (s=="rect" || s=="rectangle")
+ return GraphAttributes::rectangle;
+ // default return rectangle
+
+ return GraphAttributes::rectangle;
+}
+
+
+// Mapping OgmlNodeShape to OGDF::NodeTemplate
+String OgmlParser::getNodeTemplateFromOgmlValue(String s)
+{
+ // Mapping OGML-Values to ogdf
+ // rect | triangle | circle | ellipse | hexagon | rhomb
+ // | trapeze | upTrapeze | lParallelogram | rParallelogram | pentagon
+ // | octagon | umlClass | image
+ if (s == Ogml::s_attributeValueNames[Ogml::av_rect])
+ return "ogdf:std:rect";
+ if (s == Ogml::s_attributeValueNames[Ogml::av_rectSimple])
+ return "ogdf:std:rect simple";
+ if (s == Ogml::s_attributeValueNames[Ogml::av_triangle])
+ s = "ogdf:std:rect";
+ if (s == Ogml::s_attributeValueNames[Ogml::av_circle])
+ return "ogdf:std:ellipse";
+ if (s == Ogml::s_attributeValueNames[Ogml::av_ellipse])
+ return "ogdf:std:ellipse";
+ if (s == Ogml::s_attributeValueNames[Ogml::av_hexagon])
+ return "ogdf:std:hexagon";
+ if (s == Ogml::s_attributeValueNames[Ogml::av_rhomb])
+ return "ogdf:std:rect";
+ if (s == Ogml::s_attributeValueNames[Ogml::av_trapeze])
+ return "ogdf:std:rect";
+ if (s == Ogml::s_attributeValueNames[Ogml::av_upTrapeze])
+ return "ogdf:std:rect";
+ if (s == Ogml::s_attributeValueNames[Ogml::av_lParallelogram])
+ return "ogdf:std:rect";
+ if (s == Ogml::s_attributeValueNames[Ogml::av_rParallelogram])
+ return "ogdf:std:rect";
+ if (s == Ogml::s_attributeValueNames[Ogml::av_pentagon])
+ return "ogdf:std:rect";
+ if (s == Ogml::s_attributeValueNames[Ogml::av_octagon])
+ return"ogdf:std:rect";
+ if (s == Ogml::s_attributeValueNames[Ogml::av_umlClass])
+ return "ogdf:std:UML class";
+ if (s == Ogml::s_attributeValueNames[Ogml::av_image])
+ return "ogdf:std:rect";
+ // default
+ return "ogdf:std:rect";
+}
+
+
+// Mapping Line type to Integer
+int OgmlParser::getLineTypeAsInt(String s)
+{
+ if (s == Ogml::s_attributeValueNames[Ogml::av_esNoPen])
+ return 0;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_esSolid])
+ return 1;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_esDash])
+ return 2;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_esDot])
+ return 3;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_esDashdot])
+ return 4;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_esDashdotdot])
+ return 5;
+ // Mapping OGML-Values to ogdf
+ // solid | dotted | dashed | double | triple
+ // | groove | ridge | inset | outset | none
+ if (s == Ogml::s_attributeValueNames[Ogml::av_solid])
+ return 1;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_dotted])
+ return 3;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_dashed])
+ return 2;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_double])
+ return 4;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_triple])
+ return 5;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_groove])
+ return 5;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_ridge])
+ return 1;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_inset])
+ return 1;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_outset])
+ return 1;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_none])
+ return 0;
+ //default return bpSolid
+ return 1;
+}
+
+
+// Mapping ArrowStyles to Integer
+int OgmlParser::getArrowStyleAsInt(String s, String /*sot*/)
+{
+ // sot = "source" or "target", actually not necessary
+ // TODO: Complete, if new arrow styles are implemented in ogdf
+ if (s == "none")
+ return 0;
+ else
+ return 1;
+ // default return 0
+ return 0;
+}
+
+
+// Mapping ArrowStyles to EdgeArrow
+GraphAttributes::EdgeArrow OgmlParser::getArrowStyle(int i)
+{
+ switch (i){
+ case 0:
+ return GraphAttributes::none;
+ break;
+ case 1:
+ return GraphAttributes::last;
+ break;
+ case 2:
+ return GraphAttributes::first;
+ break;
+ case 3:
+ return GraphAttributes::both;
+ break;
+ default:
+ return GraphAttributes::last;
+ }
+}
+
+
+// Mapping Image Style to Integer
+int OgmlParser::getImageStyleAsInt(String s)
+{
+ if (s == Ogml::s_attributeValueNames[Ogml::av_freeScale])
+ return 0;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_fixScale])
+ return 1;
+ //default return freeScale
+ return 0;
+}
+
+
+// Mapping Image Alignment to Integer
+int OgmlParser::getImageAlignmentAsInt(String s)
+{
+ if (s == Ogml::s_attributeValueNames[Ogml::av_topLeft])
+ return 0;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_topCenter])
+ return 1;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_topRight])
+ return 2;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_centerLeft])
+ return 3;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_center])
+ return 4;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_centerRight])
+ return 5;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_bottomLeft])
+ return 6;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_bottomCenter])
+ return 7;
+ if (s == Ogml::s_attributeValueNames[Ogml::av_bottomRight])
+ return 8;
+ //default return center
+ return 4;
+}
+
+
+// returns the string with "<" substituted for "<"
+// and ">" substituted for ">"
+String OgmlParser::getLabelCaptionFromString(String str)
+{
+ String output;
+ size_t i=0;
+ while (i<str.length())
+ {
+ if (str[i] == '&')
+ {
+ if (i+3 < str.length())
+ {
+ if ((str[i+1] == 'l') && (str[i+2] == 't') && (str[i+3] == ';')){
+ // found char sequence "<"
+ output += "<";
+ } else {
+ if ((str[i+1] == 'g') && (str[i+2] == 't') && (str[i+3] == ';')){
+ // found char sequence ">"
+ // \n newline is required!!!
+ output += ">\n";
+ }
+ }
+ i = i + 4;
+ }
+ } else {
+ char c = str[i];
+ output += c;
+ i++;
+ }
+ }
+ str += "\n";
+ return output;
+}
+
+
+// returns the integer value of the id at the end of the string - if existent
+// the return value is 'id', the boolean return value is for checking existance of an integer value
+//
+// why do we need such a function?
+// in OGML every id is globally unique, so we write a char-prefix
+// to the ogdf-id's ('n' for node, 'e' for edge, ...)
+bool OgmlParser::getIdFromString(String str, int &id)
+{
+ if (str.length() == 0)
+ return false;
+
+ String strId;
+ size_t i=0;
+ while (i<str.length()) {
+ // if act char is a digit append it to the strId
+ if (isdigit(str[i]))
+ strId += str[i];
+ i++;
+ }
+
+ if (strId.length() == 0)
+ return false;
+
+ // transform str to int
+ id = atoi(strId.cstr());
+ return true;
+}
+
+
+// ***********************************************************
+//
+// B U I L D A T T R I B U T E D C L U S T E R -- G R A P H
+//
+//
+// ***********************************************************
+bool OgmlParser::buildAttributedClusterGraph(
+ Graph &G,
+ ClusterGraphAttributes &CGA,
+ const XmlTagObject *root)
+{
+ HashConstIterator<String, const XmlTagObject*> it;
+
+ if(!root) {
+ cout << "WARNING: can't determine layout information, no parse tree available!\n";
+
+ } else {
+ // root tag isn't a NULL pointer... let's start...
+ XmlTagObject* son = root->m_pFirstSon;
+ // first traverse to the structure- and the layout block
+ if (son->getName() != Ogml::s_tagNames[Ogml::t_graph]){
+ while (son->getName() != Ogml::s_tagNames[Ogml::t_graph]){
+ son = son->m_pFirstSon;
+ if (!son){
+ // wrong rootTag given or graph tag wasn't found
+ return false;
+ }
+ } //while
+ } //if
+
+ // now son is the graph tag which first child is structure
+ XmlTagObject* structure = son->m_pFirstSon;
+ if (structure->getName() != Ogml::s_tagNames[Ogml::t_structure]){
+ return false;
+ }
+ // now structure is what it is meant to be
+ // traverse the children of structure
+ // and set the labels
+ son = structure->m_pFirstSon;
+ while(son)
+ {
+ //Set labels of nodes
+ if ((son->getName() == Ogml::s_tagNames[Ogml::t_node]) && (CGA.attributes() & GraphAttributes::nodeLabel))
+ {
+ if (!isNodeHierarchical(son))
+ {
+ // get the id of the actual node
+ XmlAttributeObject *att;
+ if(son->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_id], att))
+ {
+ // lookup for node
+ node actNode = (m_nodes.lookup(att->getValue()))->info();
+ // find label tag
+ XmlTagObject* label;
+ if (son->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_label], label))
+ {
+ // get content tag
+ XmlTagObject* content = label->m_pFirstSon;
+ // get the content as string
+ if (content->m_pTagValue) {
+ String str = content->getValue();
+ String labelStr = getLabelCaptionFromString(str);
+ // now set the label of the node
+ CGA.labelNode(actNode) = labelStr;
+ }
+ }
+ }
+ }// "normal" nodes
+ else
+ {
+ // get the id of the actual cluster
+ XmlAttributeObject *att;
+ if(son->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_id], att))
+ {
+ // lookup for cluster
+ cluster actCluster = (m_clusters.lookup(att->getValue()))->info();
+ // find label tag
+ XmlTagObject* label;
+ if (son->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_label], label))
+ {
+ // get content tag
+ XmlTagObject* content = label->m_pFirstSon;
+ // get the content as string
+ if (content->m_pTagValue) {
+ String str = content->getValue();
+ String labelStr = getLabelCaptionFromString(str);
+ // now set the label of the node
+ CGA.clusterLabel(actCluster) = labelStr;
+ }
+ }
+ }
+ // hierSon = hierarchical Son
+ XmlTagObject *hierSon;
+ if (son->m_pFirstSon)
+ {
+ hierSon = son->m_pFirstSon;
+ while(hierSon) {
+ // recursive call for setting labels of child nodes
+ if (!setLabelsRecursive(G, CGA, hierSon))
+ return false;
+ hierSon = hierSon->m_pBrother;
+ }
+ }
+ }//cluster nodes
+ }// node labels
+
+ //Set labels of edges
+ if ((son->getName() == Ogml::s_tagNames[Ogml::t_edge]) && (CGA.attributes() & GraphAttributes::edgeLabel))
+ {
+ // get the id of the actual edge
+ XmlAttributeObject *att;
+ if (son->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_id], att))
+ {
+ // lookup for edge
+ // 0, if (hyper)edge not read from file
+ if(m_edges.lookup(att->getValue())){
+ edge actEdge = (m_edges.lookup(att->getValue()))->info();
+ // find label tag
+ XmlTagObject* label;
+ if(son->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_label], label))
+ {
+ // get content tag
+ XmlTagObject* content = label->m_pFirstSon;
+ // get the content as string
+ if (content->m_pTagValue) {
+ String str = content->getValue();
+ String labelStr = getLabelCaptionFromString(str);
+ // now set the label of the node
+ CGA.labelEdge(actEdge) = labelStr;
+ }
+ }
+ }
+ }
+ }// edge labels
+
+ // Labels
+ // ACTUALLY NOT IMPLEMENTED IN OGDF
+ //if (son->getName() == Ogml::s_tagNames[t_label]) {
+ // get the id of the actual edge
+ //XmlAttributeObject *att;
+ //if (son->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_id], att)){
+ // lookup for label
+ //label actLabel = (labels.lookup(att->getValue()))->info();
+ // get content tag
+ //XmlTagObject* content = son->m_pFirstSon;
+ // get the content as string
+ //if (content->m_pTagValue){
+ //String str = content->getValue();
+ //String labelStr = getLabelCaptionFromString(str);
+ //now set the label of the node
+ // CGA.labelLabel(actLabel) = labelStr;
+ //}
+ //}
+ //}// Labels
+
+ // go to the next brother
+ son = son->m_pBrother;
+ }// while(son) // son <=> children of structure
+
+ // get the layout tag
+ XmlTagObject* layout;
+ if (structure->m_pBrother != NULL) {
+ layout = structure->m_pBrother;
+ }
+ else
+ layout = 0;
+
+ if ((layout) && (layout->getName() == Ogml::s_tagNames[Ogml::t_layout]))
+ {
+ // layout exists
+
+ // first get the styleTemplates
+ XmlTagObject *layoutSon;
+ if (layout->m_pFirstSon)
+ {
+ // layout has at least one child-tag
+ layoutSon = layout->m_pFirstSon;
+ // ->loop through all of them
+ while (layoutSon)
+ {
+ // style templates
+ if (layoutSon->getName() == Ogml::s_tagNames[Ogml::t_styleTemplates])
+ {
+ // has children data, nodeStyleTemplate, edgeStyleTemplate, labelStyleTemplate
+ XmlTagObject *styleTemplatesSon;
+ if (layoutSon->m_pFirstSon)
+ {
+ styleTemplatesSon = layoutSon->m_pFirstSon;
+
+ while (styleTemplatesSon)
+ {
+ // nodeStyleTemplate
+ if (styleTemplatesSon->getName() == Ogml::s_tagNames[Ogml::t_nodeStyleTemplate])
+ {
+ XmlAttributeObject *actAtt;
+ if (styleTemplatesSon->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_id], actAtt))
+ {
+ const String &actKey = actAtt->getValue();
+ OgmlNodeTemplate *actTemplate = new OgmlNodeTemplate(actKey); // when will this be deleted?
+
+ XmlTagObject *actTag;
+
+ // template inheritance
+ if (styleTemplatesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_nodeStyleTemplateRef], actTag))
+ {
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_nodeStyleTemplateIdRef], actAtt)) {
+ // actual template references another
+ // get it from the hash table
+ OgmlNodeTemplate *refTemplate = m_ogmlNodeTemplates.lookup(actAtt->getValue())->info();
+ if (refTemplate) {
+ // the referenced template was inserted into the hash table
+ // so copy the values
+ String actId = actTemplate->m_id;
+ *actTemplate = *refTemplate;
+ actTemplate->m_id = actId;
+ }
+ }
+ }// template inheritance
+
+ // // data
+ // if (styleTemplatesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[t_data], actTag)){
+ // // found data for nodeStyleTemplate
+ // // no implementation required for ogdf
+ // }// data
+
+ // shape tag
+ if (styleTemplatesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_shape], actTag))
+ {
+ // type
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_nShapeType], actAtt)) {
+ // TODO: change, if shapes are expanded
+ // actually shape and template are calculated from the same value!!!
+ actTemplate->m_nodeTemplate = getNodeTemplateFromOgmlValue(actAtt->getValue());
+ actTemplate->m_shapeType = getShapeAsInt(actAtt->getValue());
+ }
+ // width
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_width], actAtt))
+ actTemplate->m_width = atof(actAtt->getValue().cstr());
+ // height
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_height], actAtt))
+ actTemplate->m_height = atof(actAtt->getValue().cstr());
+ // uri
+ //ACTUALLY NOT SUPPORTED
+ //if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[a_uri], actAtt))
+ // CGA.uri(actNode) = actAtt->getValue();
+ }// shape
+
+ // fill tag
+ if (styleTemplatesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_fill], actTag))
+ {
+ // fill color
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_color], actAtt))
+ actTemplate->m_color = actAtt->getValue();
+ // fill pattern
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_pattern], actAtt))
+ actTemplate->m_pattern = GraphAttributes::intToPattern(getBrushPatternAsInt(actAtt->getValue()));
+ // fill patternColor
+ //TODO: check if pattern color exists
+ //if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[a_patternColor], actAtt));
+ // actTemplate->m_patternColor = actAtt->getValue());
+ }// fill
+
+ // line tag
+ if (styleTemplatesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_line], actTag))
+ {
+ // type
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_nLineType], actAtt))
+ actTemplate->m_lineType = GraphAttributes::intToStyle(getLineTypeAsInt(actAtt->getValue()));
+ // width
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_width], actAtt))
+ actTemplate->m_lineWidth = atof(actAtt->getValue().cstr());
+ // color
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_color], actAtt))
+ actTemplate->m_lineColor = actAtt->getValue();
+ }// line
+
+ //insert actual template into hash table
+ m_ogmlNodeTemplates.fastInsert(actKey, actTemplate);
+ }
+ }//nodeStyleTemplate
+
+ // edgeStyleTemplate
+ if (styleTemplatesSon->getName() == Ogml::s_tagNames[Ogml::t_edgeStyleTemplate])
+ {
+ XmlAttributeObject *actAtt;
+ if (styleTemplatesSon->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_id], actAtt))
+ {
+ const String &actKey = actAtt->getValue();
+ OgmlEdgeTemplate *actTemplate = new OgmlEdgeTemplate(actKey); // when will this be deleted?
+
+ XmlTagObject *actTag;
+
+ // template inheritance
+ if (styleTemplatesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_edgeStyleTemplateRef], actTag)){
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_edgeStyleTemplateIdRef], actAtt)){
+ // actual template references another
+ // get it from the hash table
+ OgmlEdgeTemplate *refTemplate = m_ogmlEdgeTemplates.lookup(actAtt->getValue())->info();
+ if (refTemplate){
+ // the referenced template was inserted into the hash table
+ // so copy the values
+ String actId = actTemplate->m_id;
+ *actTemplate = *refTemplate;
+ actTemplate->m_id = actId;
+ }
+ }
+ }// template inheritance
+
+ // // data
+ // if (styleTemplatesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[t_data], actTag)){
+ // // found data for edgeStyleTemplate
+ // // no implementation required for ogdf
+ // }// data
+
+ // line tag
+ if (styleTemplatesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_line], actTag))
+ {
+ // type
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_type], actAtt))
+ actTemplate->m_lineType = GraphAttributes::intToStyle(getLineTypeAsInt(actAtt->getValue()));
+ // width
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_width], actAtt))
+ actTemplate->m_lineWidth = atof(actAtt->getValue().cstr());
+ // color
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_color], actAtt))
+ actTemplate->m_color = actAtt->getValue();
+ }// line
+
+ // sourceStyle tag
+ if (styleTemplatesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_sourceStyle], actTag))
+ {
+ // type
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_type], actAtt))
+ actTemplate->m_sourceType = getArrowStyleAsInt(actAtt->getValue(), Ogml::s_tagNames[Ogml::t_source]);
+ // color
+ //if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[a_color], actAtt))
+ // actTemplate->m_sourceColor = actAtt->getValue();
+ // size
+ //if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[a_size], actAtt))
+ // actTemplate->m_sourceSize = atof(actAtt->getValue());
+ }
+
+ // targetStyle tag
+ if (styleTemplatesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_targetStyle], actTag)){
+ // type
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_type], actAtt))
+ actTemplate->m_targetType = getArrowStyleAsInt(actAtt->getValue(), Ogml::s_tagNames[Ogml::t_target]);
+ // color
+ //if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[a_color], actAtt))
+ // actTemplate->m_targetColor = actAtt->getValue();
+ // size
+ //if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[a_size], actAtt))
+ // actTemplate->m_targetSize = atof(actAtt->getValue());
+ }
+
+ //insert actual template into hash table
+ m_ogmlEdgeTemplates.fastInsert(actKey, actTemplate);
+ }
+
+ }//edgeStyleTemplate
+
+ // labelStyleTemplate
+ if (styleTemplatesSon->getName() == Ogml::s_tagNames[Ogml::t_labelStyleTemplate]){
+ // ACTUALLY NOT SUPPORTED
+ }//labelStyleTemplate
+
+ styleTemplatesSon = styleTemplatesSon->m_pBrother;
+ }
+ }
+ }// styleTemplates
+
+ //STYLES
+ if (layoutSon->getName() == Ogml::s_tagNames[Ogml::t_styles])
+ {
+ // has children graphStyle, nodeStyle, edgeStyle, labelStyle
+ XmlTagObject *stylesSon;
+ if (layoutSon->m_pFirstSon)
+ {
+ stylesSon = layoutSon->m_pFirstSon;
+
+ while (stylesSon)
+ {
+ // GRAPHSTYLE
+ if (stylesSon->getName() == Ogml::s_tagNames[Ogml::t_graphStyle])
+ {
+ XmlAttributeObject *actAtt;
+ // defaultNodeTemplate
+ if (stylesSon->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_defaultNodeTemplate], actAtt))
+ {
+ OgmlNodeTemplate* actTemplate = m_ogmlNodeTemplates.lookup(actAtt->getValue())->info();
+
+ // XmlTagObject *actTag;
+ // // data
+ // if (stylesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[t_data], actTag)){
+ // // found data for graphStyle
+ // // no implementation required for ogdf
+ // }// data
+
+ // set values for ALL nodes
+ node v;
+ forall_nodes(v, G){
+
+ if (CGA.attributes() & GraphAttributes::nodeType){
+ CGA.templateNode(v) = actTemplate->m_nodeTemplate;
+ CGA.shapeNode(v) = actTemplate->m_shapeType;
+ }
+ if (CGA.attributes() & GraphAttributes::nodeGraphics){
+ CGA.width(v) = actTemplate->m_width;
+ CGA.height(v) = actTemplate->m_height;
+ }
+ if (CGA.attributes() & GraphAttributes::nodeColor)
+ CGA.colorNode(v) = actTemplate->m_color;
+ if (CGA.attributes() & GraphAttributes::nodeStyle){
+ CGA.nodePattern(v) = actTemplate->m_pattern;
+ //CGA.nodePatternColor(v) = actTemplate->m_patternColor;
+ CGA.styleNode(v) = actTemplate->m_lineType;
+ CGA.lineWidthNode(v) = actTemplate->m_lineWidth;
+ CGA.nodeLine(v) = actTemplate->m_lineColor;
+ }
+ }// forall_nodes
+ }// defaultNodeTemplate
+
+ // // defaultClusterTemplate
+ // if (stylesSon->findXmlAttributeObjectByName(Ogml::s_attributeNames[a_defaultCompoundTemplate], actAtt)){
+ // // OgmlNodeTemplate* actTemplate = m_ogmlNodeTemplates.lookup(actAtt->getValue())->info();
+ // // // set values for ALL Cluster
+ // cluster c;
+ // forall_clusters(c, G){
+ //
+ // if (CGA.attributes() & GraphAttributes::nodeType){
+ // CGA.templateCluster(c) = actTemplate->m_nodeTemplate;
+ // // no shape definition for clusters
+ // //CGA.shapeNode(c) = actTemplate->m_shapeType;
+ // }
+ // if (CGA.attributes() & GraphAttributes::nodeGraphics){
+ // CGA.clusterWidth(c) = actTemplate->m_width;
+ // CGA.clusterHeight(c) = actTemplate->m_height;
+ // }
+ // if (CGA.attributes() & GraphAttributes::nodeColor)
+ // CGA.clusterFillColor(c) = actTemplate->m_color;
+ // if (CGA.attributes() & GraphAttributes::nodeStyle){
+ // CGA.clusterFillPattern(c) = actTemplate->m_pattern;
+ // CGA.clusterBackColor(c) = actTemplate->m_patternColor;
+ // CGA.clusterLineStyle(c) = actTemplate->m_lineType;
+ // CGA.clusterLineWidth(c) = actTemplate->m_lineWidth;
+ // CGA.clusterColor(c) = actTemplate->m_lineColor;
+ // }
+ // }// forall_clusters
+ // }// defaultClusterTemplate
+
+
+ // defaultEdgeTemplate
+ if (stylesSon->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_defaultEdgeTemplate], actAtt))
+ {
+ OgmlEdgeTemplate* actTemplate = m_ogmlEdgeTemplates.lookup(actAtt->getValue())->info();
+
+ // set values for ALL edges
+ edge e;
+ forall_edges(e, G)
+ {
+ if (CGA.attributes() & GraphAttributes::edgeStyle) {
+ CGA.styleEdge(e) = actTemplate->m_lineType;
+ CGA.edgeWidth(e) = actTemplate->m_lineWidth;
+ }
+ if (CGA.attributes() & GraphAttributes::edgeColor) {
+ CGA.colorEdge(e) = actTemplate->m_color;
+ }
+
+ //edgeArrow
+ if ((CGA.attributes()) & (GraphAttributes::edgeArrow))
+ {
+ if (actTemplate->m_sourceType == 0) {
+ if (actTemplate->m_targetType == 0) {
+ // source = no_arrow, target = no_arrow // =>none
+ CGA.arrowEdge(e) = GraphAttributes::none;
+ }
+ else {
+ // source = no_arrow, target = arrow // =>last
+ CGA.arrowEdge(e) = GraphAttributes::last;
+ }
+ }
+ else {
+ if (actTemplate->m_targetType == 0){
+ // source = arrow, target = no_arrow // =>first
+ CGA.arrowEdge(e) = GraphAttributes::first;
+ }
+ else {
+ // source = arrow, target = arrow // =>both
+ CGA.arrowEdge(e) = GraphAttributes::both;
+ }
+ }
+ }//edgeArrow
+ }//forall_edges
+ }//defaultEdgeTemplate
+
+ // defaultLabelTemplate
+ //if (stylesSon->findXmlAttributeObjectByName(Ogml::s_attributeNames[a_defaultLabelTemplate], actAtt)){
+ // // set values for ALL labels
+ // // ACTUALLY NOT IMPLEMENTED
+ // label l;
+ // forall_labels(l, G){
+ //
+ // }
+ //}//defaultLabelTemplate
+ }// graphStyle
+
+ // NODESTYLE
+ if (stylesSon->getName() == Ogml::s_tagNames[Ogml::t_nodeStyle])
+ {
+ // get the id of the actual node
+ XmlAttributeObject *att;
+ if(stylesSon->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_nodeIdRef], att))
+ {
+ // check if referenced id is a node or a cluster/compound
+ if (m_nodes.lookup(att->getValue()))
+ {
+ // lookup for node
+ node actNode = (m_nodes.lookup(att->getValue()))->info();
+
+ // actTag is the actual tag that is considered
+ XmlTagObject* actTag;
+ XmlAttributeObject *actAtt;
+
+ // // data
+ // if (stylesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[t_data], actTag)){
+ // // found data for nodeStyle
+ // // no implementation required for ogdf
+ // }// data
+
+ // check if actual nodeStyle references a template
+ if (stylesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_nodeStyleTemplateRef], actTag))
+ {
+ // get referenced template id
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_nodeStyleTemplateIdRef], actAtt))
+ {
+ // actual nodeStyle references a template
+ OgmlNodeTemplate* actTemplate = m_ogmlNodeTemplates.lookup(actAtt->getValue())->info();
+ if (CGA.attributes() & GraphAttributes::nodeType) {
+ CGA.templateNode(actNode) = actTemplate->m_nodeTemplate;
+ CGA.shapeNode(actNode) = actTemplate->m_shapeType;
+ }
+ if (CGA.attributes() & GraphAttributes::nodeGraphics) {
+ CGA.width(actNode) = actTemplate->m_width;
+ CGA.height(actNode) = actTemplate->m_height;
+ }
+ if (CGA.attributes() & GraphAttributes::nodeColor)
+ CGA.colorNode(actNode) = actTemplate->m_color;
+ if (CGA.attributes() & GraphAttributes::nodeStyle) {
+ CGA.nodePattern(actNode) = actTemplate->m_pattern;
+ //CGA.nodePatternColor(actNode) = actTemplate->m_patternColor;
+ CGA.styleNode(actNode) = actTemplate->m_lineType;
+ CGA.lineWidthNode(actNode) = actTemplate->m_lineWidth;
+ CGA.nodeLine(actNode) = actTemplate->m_lineColor;
+ }
+ }
+ }//template
+
+ // Graph::nodeType
+ //TODO: COMPLETE, IF NECESSARY
+ CGA.type(actNode) = Graph::vertex;
+
+ // location tag
+ if ((stylesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_location], actTag))
+ && (CGA.attributes() & GraphAttributes::nodeGraphics))
+ {
+ // set location of node
+ // x
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_x], actAtt))
+ CGA.x(actNode) = atof(actAtt->getValue().cstr());
+ // y
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_y], actAtt))
+ CGA.y(actNode) = atof(actAtt->getValue().cstr());
+ // z
+ //if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[a_x], actAtt))
+ //CGA.z(actNode) = atof(actAtt->getValue());
+ }// location
+
+ // shape tag
+ if ((stylesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_shape], actTag))
+ && (CGA.attributes() & GraphAttributes::nodeType))
+ {
+ // set shape of node
+ // type
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_nShapeType], actAtt)) {
+ CGA.templateNode(actNode) = getNodeTemplateFromOgmlValue(actAtt->getValue());
+ // TODO: change, if shapes are expanded
+ // actually shape and template are calculated from the same value!!!
+ CGA.shapeNode(actNode) = getShapeAsInt(actAtt->getValue());
+ }
+ // width
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_width], actAtt))
+ CGA.width(actNode) = atof(actAtt->getValue().cstr());
+ // height
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_height], actAtt))
+ CGA.height(actNode) = atof(actAtt->getValue().cstr());
+ // uri
+ //ACTUALLY NOT SUPPORTED
+ //if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[a_uri], actAtt))
+ // CGA.uri(actNode) = actAtt->getValue();
+ }// shape
+
+ // fill tag
+ if ((stylesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_fill], actTag))
+ && (CGA.attributes() & GraphAttributes::nodeStyle))
+ {
+ // fill color
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_color], actAtt))
+ CGA.colorNode(actNode) = actAtt->getValue();
+ // fill pattern
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_pattern], actAtt))
+ CGA.nodePattern(actNode) = GraphAttributes::intToPattern(getBrushPatternAsInt(actAtt->getValue()));
+ // fill patternColor
+ //TODO: check if pattern color exists
+ //if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[a_patternColor], actAtt))
+ // CGA.nodePatternColor(actNode) = actAtt->getValue());
+ }// fill
+
+ // line tag
+ if ((stylesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_line], actTag))
+ && (CGA.attributes() & GraphAttributes::nodeStyle))
+ {
+ // type
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_nLineType], actAtt))
+ CGA.styleNode(actNode) = GraphAttributes::intToStyle(getLineTypeAsInt(actAtt->getValue()));
+ // width
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_width], actAtt))
+ CGA.lineWidthNode(actNode) = atof(actAtt->getValue().cstr());
+ // color
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_color], actAtt))
+ CGA.nodeLine(actNode) = actAtt->getValue().cstr();
+ }// line
+
+ // // ports
+ // // go through all ports with dummy tagObject port
+ // XmlTagObject* port = stylesSon->m_pFirstSon;
+ // while(port){
+ // if (port->getName() == ogmlTagObjects[t_port]){
+ // // TODO: COMPLETE
+ // // ACTUALLY NOT IMPLEMENTED IN OGDF
+ // }
+ //
+ // // go to next tag
+ // port = port->m_pBrother;
+ // }
+
+ }
+ else
+
+ // CLUSTER NODE STYLE
+ {
+ // get the id of the cluster/compound
+ XmlAttributeObject *att;
+ if(stylesSon->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_nodeIdRef], att))
+ {
+ // lookup for node
+ cluster actCluster = (m_clusters.lookup(att->getValue()))->info();
+ // actTag is the actual tag that is considered
+ XmlTagObject* actTag;
+ XmlAttributeObject *actAtt;
+
+ // // data
+ // if (stylesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[t_data], actTag)){
+ // // found data for nodeStyle (CLuster/Compound)
+ // // no implementation required for ogdf
+ // }// data
+
+ // check if actual nodeStyle (equal to cluster) references a template
+ if (stylesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_nodeStyleTemplateRef], actTag))
+ {
+ // get referenced template id
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_nodeStyleTemplateIdRef], actAtt))
+ {
+ // actual nodeStyle references a template
+ OgmlNodeTemplate* actTemplate = m_ogmlNodeTemplates.lookup(actAtt->getValue())->info();
+ if (CGA.attributes() & GraphAttributes::nodeType) {
+ CGA.templateCluster(actCluster) = actTemplate->m_nodeTemplate;
+ // no shape definition for clusters
+ //CGA.shapeNode(actCluster) = actTemplate->m_shapeType;
+ }
+ if (CGA.attributes() & GraphAttributes::nodeGraphics) {
+ CGA.clusterWidth(actCluster) = actTemplate->m_width;
+ CGA.clusterHeight(actCluster) = actTemplate->m_height;
+ }
+ if (CGA.attributes() & GraphAttributes::nodeColor)
+ CGA.clusterFillColor(actCluster) = actTemplate->m_color;
+ if (CGA.attributes() & GraphAttributes::nodeStyle) {
+ CGA.clusterFillPattern(actCluster) = actTemplate->m_pattern;
+ CGA.clusterBackColor(actCluster) = actTemplate->m_patternColor;
+ CGA.clusterLineStyle(actCluster) = actTemplate->m_lineType;
+ CGA.clusterLineWidth(actCluster) = actTemplate->m_lineWidth;
+ CGA.clusterColor(actCluster) = actTemplate->m_lineColor;
+ }
+ }
+ }//template
+
+ // Graph::nodeType
+ //TODO: COMPLETE, IF NECESSARY
+ // not supported for clusters!!!
+ //CGA.type(actCluster) = Graph::vertex;
+
+ // location tag
+ if ((stylesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_location], actTag))
+ && (CGA.attributes() & GraphAttributes::nodeGraphics))
+ {
+ // set location of node
+ // x
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_x], actAtt))
+ CGA.clusterXPos(actCluster) = atof(actAtt->getValue().cstr());
+ // y
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_y], actAtt))
+ CGA.clusterYPos(actCluster) = atof(actAtt->getValue().cstr());
+ // z
+ //if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[a_x], actAtt))
+ //CGA.clusterZPos(actCluster) = atof(actAtt->getValue());
+ }// location
+
+ // shape tag
+ if ((stylesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_shape], actTag))
+ && (CGA.attributes() & GraphAttributes::nodeType))
+ {
+ // set shape of node
+ // type
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_nShapeType], actAtt)) {
+ CGA.templateCluster(actCluster) = getNodeTemplateFromOgmlValue(actAtt->getValue().cstr());
+ // no shape definition for clusters
+ //CGA.shapeNode(actCluster) = getShapeAsInt(actAtt->getValue());
+ }
+ // width
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_width], actAtt))
+ CGA.clusterWidth(actCluster) = atof(actAtt->getValue().cstr());
+ // height
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_height], actAtt))
+ CGA.clusterHeight(actCluster) = atof(actAtt->getValue().cstr());
+ // uri
+ //ACTUALLY NOT SUPPORTED
+ //if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[a_uri], actAtt))
+ // CGA.uriCluster(actCluster) = actAtt->getValue();
+ }// shape
+
+ // fill tag
+ if ((stylesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_fill], actTag))
+ && (CGA.attributes() & GraphAttributes::nodeStyle))
+ {
+ // fill color
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_color], actAtt))
+ CGA.clusterFillColor(actCluster) = actAtt->getValue().cstr();
+ // fill pattern
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_pattern], actAtt))
+ CGA.clusterFillPattern(actCluster) = GraphAttributes::intToPattern(getBrushPatternAsInt(actAtt->getValue()));
+ // fill patternColor
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_patternColor], actAtt))
+ CGA.clusterBackColor(actCluster) = actAtt->getValue().cstr();
+ }// fill
+
+ // line tag
+ if ((stylesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_line], actTag))
+ && (CGA.attributes() & GraphAttributes::nodeStyle))
+ {
+ // type
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_nLineType], actAtt))
+ CGA.clusterLineStyle(actCluster) = GraphAttributes::intToStyle(getLineTypeAsInt(actAtt->getValue()));
+ // width
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_width], actAtt))
+ CGA.clusterLineWidth(actCluster) = atof(actAtt->getValue().cstr());
+ // color
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_color], actAtt))
+ CGA.clusterColor(actCluster) = actAtt->getValue();
+ }// line
+
+
+ // // ports
+ // // go through all ports with dummy tagObject port
+ // XmlTagObject* port = stylesSon->m_pFirstSon;
+ // while(port){
+ // if (port->getName() == ogmlTagObjects[t_port]){
+ // // TODO: COMPLETE
+ // // no implementation required for ogdf
+ // }
+ //
+ // // go to next tag
+ // port = port->m_pBrother;
+ // }
+
+ }//nodeIdRef (with cluster)
+
+ }// nodeStyle for cluster
+ }//nodeIdRef
+
+ }//nodeStyle
+
+ // EDGESTYLE
+ if (stylesSon->getName() == Ogml::s_tagNames[Ogml::t_edgeStyle])
+ {
+ // get the id of the actual edge
+ XmlAttributeObject *att;
+ if(stylesSon->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_edgeIdRef], att))
+ {
+ // lookup for edge
+ edge actEdge = (m_edges.lookup(att->getValue()))->info();
+
+ // actTag is the actual tag that is considered
+ XmlTagObject* actTag;
+ XmlAttributeObject *actAtt;
+
+ // // data
+ // if (stylesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[t_data], actTag)){
+ // // found data for edgeStyle
+ // // no implementation required for ogdf
+ // }// data
+
+ // check if actual edgeStyle references a template
+ if (stylesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_edgeStyleTemplateRef], actTag))
+ {
+ // get referenced template id
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_edgeStyleTemplateIdRef], actAtt))
+ {
+ // actual edgeStyle references a template
+ OgmlEdgeTemplate* actTemplate = m_ogmlEdgeTemplates.lookup(actAtt->getValue())->info();
+ if (CGA.attributes() & GraphAttributes::edgeStyle) {
+ CGA.styleEdge(actEdge) = actTemplate->m_lineType;
+ CGA.edgeWidth(actEdge) = actTemplate->m_lineWidth;
+ }
+ if (CGA.attributes() & GraphAttributes::edgeColor) {
+ CGA.colorEdge(actEdge) = actTemplate->m_color;
+ }
+
+ //edgeArrow
+ if ((CGA.attributes()) & (GraphAttributes::edgeArrow))
+ {
+ if (actTemplate->m_sourceType == 0) {
+ if (actTemplate->m_targetType == 0) {
+ // source = no_arrow, target = no_arrow // =>none
+ CGA.arrowEdge(actEdge) = GraphAttributes::none;
+ }
+ else {
+ // source = no_arrow, target = arrow // =>last
+ CGA.arrowEdge(actEdge) = GraphAttributes::last;
+ }
+ }
+ else {
+ if (actTemplate->m_targetType == 0) {
+ // source = arrow, target = no_arrow // =>first
+ CGA.arrowEdge(actEdge) = GraphAttributes::first;
+ }
+ else {
+ // source = arrow, target = arrow // =>both
+ CGA.arrowEdge(actEdge) = GraphAttributes::both;
+ }
+ }
+ }//edgeArrow
+
+ }
+ }//template
+
+ // Graph::edgeType
+ //TODO: COMPLETE, IF NECESSARY
+ CGA.type(actEdge) = Graph::association;
+
+ // line tag
+ if ((stylesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_line], actTag))
+ && (CGA.attributes() & GraphAttributes::edgeType))
+ {
+ // type
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_nLineType], actAtt))
+ CGA.styleEdge(actEdge) = GraphAttributes::intToStyle(getLineTypeAsInt(actAtt->getValue()));
+ // width
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_width], actAtt))
+ CGA.edgeWidth(actEdge) = atof(actAtt->getValue().cstr());
+ // color
+ if ((actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_color], actAtt))
+ && (CGA.attributes() & GraphAttributes::edgeType))
+ CGA.colorEdge(actEdge) = actAtt->getValue();
+ }// line
+
+ // mapping of arrows
+ if (CGA.attributes() & GraphAttributes::edgeArrow)
+ {
+ // values for mapping edge arrows to GDE
+ // init to -1 for a simple check
+ int sourceInt = -1;
+ int targetInt = -1;
+
+ // sourceStyle tag
+ if (stylesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_sourceStyle], actTag))
+ {
+ // type
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_type], actAtt))
+ sourceInt = getArrowStyleAsInt((actAtt->getValue()), Ogml::s_attributeNames[Ogml::t_source]);
+ // color
+ //if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[a_color], actAtt))
+ // ;
+ // size
+ //if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[a_size], actAtt))
+ // ;
+ }// sourceStyle
+
+ // targetStyle tag
+ if (stylesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_targetStyle], actTag))
+ {
+ // type
+ if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_type], actAtt))
+ targetInt = getArrowStyleAsInt((actAtt->getValue()), Ogml::s_attributeNames[Ogml::t_target]);
+ // color
+ //if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[a_color], actAtt))
+ // ;
+ // size
+ //if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[a_size], actAtt))
+ // ;
+ }// targetStyle
+
+ // map edge arrows
+ if ((sourceInt != -1) || (targetInt != -1))
+ {
+ if (sourceInt <= 0) {
+ if (targetInt <= 0) {
+ //source=no arrow, target=no arrow // => none
+ CGA.arrowEdge(actEdge) = GraphAttributes::none;
+ }
+ else {
+ // source=no arrow, target=arrow // => last
+ CGA.arrowEdge(actEdge) = GraphAttributes::last;
+ }
+ }
+ else {
+ if (targetInt <= 0) {
+ //source=arrow, target=no arrow // => first
+ CGA.arrowEdge(actEdge) = GraphAttributes::first;
+ }
+ else {
+ //source=target=arrow // => both
+ CGA.arrowEdge(actEdge) = GraphAttributes::both;
+ }
+ }
+ }
+ }//arrow
+
+ // points & segments
+ // bool value for checking if segments exist
+ bool segmentsExist = stylesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_segment], actTag);
+ if ((stylesSon->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_point], actTag))
+ && (CGA.attributes() & GraphAttributes::edgeGraphics))
+ {
+ // at least one point exists
+ XmlTagObject *pointTag = stylesSon->m_pFirstSon;
+ DPolyline dpl;
+ dpl.clear();
+ // traverse all points in the order given in the ogml file
+ while (pointTag)
+ {
+ if (pointTag->getName() == Ogml::s_tagNames[Ogml::t_point])
+ {
+
+ if (pointTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_id], actAtt)) {
+ DPoint dp;
+ // here we have a point
+ if (pointTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_x], actAtt)) {
+ dp.m_x = atof(actAtt->getValue().cstr());
+ }
+ if (pointTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_y], actAtt)) {
+ dp.m_y = atof(actAtt->getValue().cstr());
+ }
+ //if (actTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[a_z], actAtt))
+ // dp.m_z = atof(actAtt->getValue());
+ // insert point into hash table
+ pointTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_id], actAtt);
+ m_points.fastInsert(actAtt->getValue(), dp);
+ //insert point into polyline
+ if (!segmentsExist)
+ dpl.pushBack(dp);
+ }
+ }
+ // go to next tag
+ pointTag = pointTag->m_pBrother;
+ }// while (pointTag)
+ //concatenate polyline
+ if (!segmentsExist) {
+ CGA.bends(actEdge).conc(dpl);
+ }
+ else{
+ // work with segments
+ // one error can occur:
+ // if a segments is going to be inserted,
+ // which doesn't match with any other,
+ // the order can be not correct at the end
+ // then the edge is relly corrupted!!
+
+ // TODO: this implementation doesn't work with hyperedges
+ // cause hyperedges have more than one source/target
+
+ // segmentsUnsorted stores all found segments
+ List<OgmlSegment> segmentsUnsorted;
+ XmlTagObject *segmentTag = stylesSon->m_pFirstSon;
+ while (segmentTag)
+ {
+ if (segmentTag->getName() == Ogml::s_tagNames[Ogml::t_segment])
+ {
+ XmlTagObject *endpointTag = segmentTag->m_pFirstSon;
+ OgmlSegment actSeg;
+ int endpointsSet = 0;
+ while ((endpointTag) && (endpointsSet <2)) {
+ if (endpointTag->getName() == Ogml::s_tagNames[Ogml::t_endpoint]) {
+ // get the referenced point
+ endpointTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_endpointIdRef], actAtt);
+ DPoint dp = (m_points.lookup(actAtt->getValue()))->info();
+
+ if (endpointsSet == 0)
+ actSeg.point1 = dp;
+ else
+ actSeg.point2 = dp;
+ endpointsSet++;
+ }
+ endpointTag = endpointTag->m_pBrother;
+ }// while
+ // now we created a segment
+ // we can insert this easily into in segmentsUnsorted
+ if (actSeg.point1 != actSeg.point2) {
+ segmentsUnsorted.pushBack(actSeg);
+ } // point1 != point2
+ }// if (segment)
+ // go to next tag
+ segmentTag = segmentTag->m_pBrother;
+ }// while (segmentTag)
+ // now are the segments stored in the segmentsUnsorted list
+ // but we have to sort it in segments list while inserting
+ List<OgmlSegment> segments;
+ ListIterator<OgmlSegment> segIt;
+ // check the number of re-insertions
+ int checkNumOfSegReInserts = segmentsUnsorted.size()+2;
+ while ((segmentsUnsorted.size() > 0) && (checkNumOfSegReInserts > 0))
+ {
+ OgmlSegment actSeg = segmentsUnsorted.front();
+ segmentsUnsorted.popFront();
+ // actSeg has to be inserted in correct order
+ // and then being deleted
+ // OR waiting in list until it can be inserted
+ // size == 0 => insert
+ if (segments.size() == 0) {
+ segments.pushFront(actSeg);
+ }
+ else {
+ // segments contains >1 segment
+ segIt = segments.begin();
+ bool inserted = false;
+ while (segIt.valid() && !inserted)
+ {
+ if ((actSeg.point1 == (*segIt).point1) ||
+ (actSeg.point1 == (*segIt).point2) ||
+ (actSeg.point2 == (*segIt).point1) ||
+ (actSeg.point2 == (*segIt).point2))
+ {
+ // found two matching segments
+ // now we can insert
+ // there are some cases to check
+ if (actSeg.point1 == (*segIt).point1) {
+ DPoint dumP = actSeg.point1;
+ actSeg.point1 = actSeg.point2;
+ actSeg.point2 = dumP;
+ segments.insertBefore(actSeg, segIt);
+ }
+ else
+ if (actSeg.point2 == (*segIt).point1) {
+ segments.insertBefore(actSeg, segIt);
+ }
+ else
+ if ((actSeg.point2 == (*segIt).point2)) {
+ DPoint dumP = actSeg.point1;
+ actSeg.point1 = actSeg.point2;
+ actSeg.point2 = dumP;
+ segments.insertAfter(actSeg, segIt);
+ }
+ else {
+ segments.insertAfter(actSeg, segIt);
+ }
+ inserted = true;
+ } // first if
+ segIt++;
+ } //while
+ if (!inserted) {
+ // segment doesn't found matching segment,
+ // so insert it again into unsorted segments list
+ // so it will be inserted later
+ segmentsUnsorted.pushBack(actSeg);
+ checkNumOfSegReInserts--;
+ }
+ }//else
+ }//while segmentsUnsorted.size() > 0
+
+
+ if (checkNumOfSegReInserts==0){
+ cout << "WARNING! Segment definition is not correct" << endl << flush;
+ cout << "Not able to work with #"<< segmentsUnsorted.size() << " segments" << endl << flush;
+ cout << "Please check connection and sorting of segments!" << endl << flush;
+ // // inserting the bends although there might be an error
+ // // I commented this, because in this case in ogdf the edge will
+ // // be a straight edge and there will not be any artefacts
+ // // TODO: uncomment if desired
+ // for (segIt = segments.begin(); segIt.valid(); segIt++){
+ // dpl.pushBack((*segIt).point1);
+ // dpl.pushBack((*segIt).point2);
+ }
+ else {
+ // the segments are now ordered (perhaps in wrong way)...
+ // so we have to check if the first and last point
+ // are graphically laying in the source- and target- node
+ bool invertSegments = false;
+ segIt = segments.begin();
+ node target = actEdge->target();
+ node source = actEdge->source();
+ // check if source is a normal node or a cluster
+ //if (...){
+
+ //}
+ //else{
+ // big if-check: if (first point is in target
+ // and not in source)
+ // AND
+ // (last point is in source
+ // and not in target)
+ if (( ( (CGA.x(target) + CGA.width(target))>= (*segIt).point1.m_x )
+ && (CGA.x(target) <= (*segIt).point1.m_x )
+ && ( (CGA.y(target) + CGA.height(target))>= (*segIt).point1.m_y )
+ && (CGA.y(target) <= (*segIt).point1.m_y ) )
+ &&
+ (!( ( (CGA.x(source) + CGA.width(source))>= (*segIt).point1.m_x )
+ && (CGA.x(source) <= (*segIt).point1.m_x )
+ && ( (CGA.y(source) + CGA.height(source))>= (*segIt).point1.m_y )
+ && (CGA.y(source) <= (*segIt).point1.m_y ) )))
+ {
+ segIt = segments.rbegin();
+ if (( ( (CGA.x(source) + CGA.width(source))>= (*segIt).point2.m_x )
+ && (CGA.x(source) <= (*segIt).point2.m_x )
+ && ( (CGA.y(source) + CGA.height(source))>= (*segIt).point2.m_y )
+ && (CGA.y(source) <= (*segIt).point2.m_y ) )
+ &&
+ (!( ( (CGA.x(target) + CGA.width(source))>= (*segIt).point2.m_x )
+ && (CGA.x(target) <= (*segIt).point2.m_x )
+ && ( (CGA.y(target) + CGA.height(source))>= (*segIt).point2.m_y )
+ && (CGA.y(target) <= (*segIt).point2.m_y ) ))) {
+ // invert the segment-line
+ invertSegments = true;
+ }
+ }
+ //}
+ if (!invertSegments){
+ for (segIt = segments.begin(); segIt.valid(); segIt++) {
+ dpl.pushBack((*segIt).point1);
+ dpl.pushBack((*segIt).point2);
+ }
+ }
+ else {
+ for (segIt = segments.rbegin(); segIt.valid(); segIt--) {
+ dpl.pushBack((*segIt).point2);
+ dpl.pushBack((*segIt).point1);
+ }
+ }
+ // unify bends = delete superfluous points
+ dpl.unify();
+ // finally concatenate/set the bends
+ CGA.bends(actEdge).conc(dpl);
+ }// else (checkNumOfSegReInserts==0)
+ }// else (segments exist)
+ }// points & segments
+
+ }//edgeIdRef
+
+ }// edgeStyle
+
+ // // LABELSTYLE
+ // if (stylesSon->getName() == Ogml::s_tagNames[t_labelStyle]){
+ // // labelStyle
+ // // ACTUALLY NOT SUPPORTED
+ // }// labelStyle
+
+ stylesSon = stylesSon->m_pBrother;
+ } // while
+
+ }
+ } //styles
+
+ // CONSTRAINTS
+ if (layoutSon->getName() == Ogml::s_tagNames[Ogml::t_constraints]) {
+
+ // this code is encapsulated in the method
+ // OgmlParser::buildConstraints
+ // has to be called by read methods after building
+
+ // here we only set the pointer,
+ // so we don't have to traverse the parse tree
+ // to the constraints tag later
+ m_constraintsTag = layoutSon;
+
+ }// constraints
+
+
+ // go to next brother
+ layoutSon = layoutSon->m_pBrother;
+ }// while(layoutSon)
+ }//if (layout->m_pFirstSon)
+ }// if ((layout) && (layout->getName() == Ogml::s_tagNames[t_layout]))
+
+
+ }// else
+
+
+
+
+
+ // cout << "buildAttributedClusterGraph COMPLETE. Check... " << endl << flush;
+ // edge e;
+ // forall_edges(e, G){
+ // //cout << "CGA.labelEdge" << e << " = " << CGA.labelEdge(e) << endl << flush;
+ // cout << "CGA.arrowEdge" << e << " = " << CGA.arrowEdge(e) << endl << flush;
+ // cout << "CGA.styleEdge" << e << " = " << CGA.styleEdge(e) << endl << flush;
+ // cout << "CGA.edgeWidth" << e << " = " << CGA.edgeWidth(e) << endl << flush;
+ // cout << "CGA.colorEdge" << e << " = " << CGA.colorEdge(e) << endl << flush;
+ // cout << "CGA.type " << e << " = " << CGA.type(e) << endl << flush;
+ // ListConstIterator<DPoint> it;
+ // for(it = CGA.bends(e).begin(); it!=CGA.bends(e).end(); ++it) {
+ // cout << "point " << " x=" << (*it).m_x << " y=" << (*it).m_y << endl << flush;
+ // }
+ //
+ // }
+ //
+ // node n;
+ // forall_nodes(n, G){
+ // cout << "CGA.labelNode(" << n << ") = " << CGA.labelNode(n) << endl << flush;
+ // cout << "CGA.templateNode(" << n << ") = " << CGA.templateNode(n) << endl << flush;
+ // cout << "CGA.shapeNode(" << n << ") = " << CGA.shapeNode(n) << endl << flush;
+ // cout << "CGA.width(" << n << ") = " << CGA.width(n) << endl << flush;
+ // cout << "CGA.height(" << n << ") = " << CGA.height(n) << endl << flush;
+ // cout << "CGA.colorNode(" << n << ") = " << CGA.colorNode(n) << endl << flush;
+ // cout << "CGA.nodePattern(" << n << ") = " << CGA.nodePattern(n) << endl << flush;
+ // cout << "CGA.styleNode(" << n << ") = " << CGA.styleNode(n) << endl << flush;
+ // cout << "CGA.lineWidthNode(" << n << ") = " << CGA.lineWidthNode(n) << endl << flush;
+ // cout << "CGA.nodeLine(" << n << ") = " << CGA.nodeLine(n) << endl << flush;
+ // cout << "CGA.x(" << n << ") = " << CGA.x(n) << endl << flush;
+ // cout << "CGA.y(" << n << ") = " << CGA.y(n) << endl << flush;
+ // cout << "CGA.type(" << n << ") = " << CGA.type(n) << endl << flush;
+ // }
+ //
+ // cluster c;
+ // forall_clusters(c, CGA.constClusterGraph()){
+ // cout << "CGA.templateCluster(" << c << ") = " << CGA.templateCluster(c) << endl << flush;
+ // cout << "CGA.clusterWidth(" << c << ") = " << CGA.clusterWidth(c) << endl << flush;
+ // cout << "CGA.clusterHeight(" << c << ") = " << CGA.clusterHeight(c) << endl << flush;
+ // cout << "CGA.clusterFillColor(" << c << ") = " << CGA.clusterFillColor(c) << endl << flush;
+ // cout << "CGA.clusterFillPattern(" << c << ") = " << CGA.clusterFillPattern(c) << endl << flush;
+ // cout << "CGA.clusterBackColor(" << c << ") = " << CGA.clusterBackColor(c) << endl << flush;
+ // cout << "CGA.clusterLineStyle(" << c << ") = " << CGA.clusterLineStyle(c) << endl << flush;
+ // cout << "CGA.clusterLineWidth(" << c << ") = " << CGA.clusterLineWidth(c) << endl << flush;
+ // cout << "CGA.clusterColor(" << c << ") = " << CGA.clusterColor(c) << endl << flush;
+ // cout << "CGA.clusterXPos(" << c << ") = " << CGA.clusterXPos(c) << endl << flush;
+ // cout << "CGA.clusterYPos(" << c << ") = " << CGA.clusterYPos(c) << endl << flush;
+ // }
+
+ // cout << "buildAttributedClusterGraph COMPLETE... Check COMPLETE... Let's have fun in GDE ;) " << endl << flush;
+
+ // building terminated, so return true
+ return true;
+
+}//buildAttributedClusterGraph
+
+
+
+// ***********************************************************
+//
+// s e t l a b e l s r e c u r s i v e f o r c l u s t e r s
+//
+// ***********************************************************
+// sets the labels of hierarchical nodes => cluster
+bool OgmlParser::setLabelsRecursive(Graph &G, ClusterGraphAttributes &CGA, XmlTagObject *root)
+{
+ if ((root->getName() == Ogml::s_tagNames[Ogml::t_node]) && (CGA.attributes() & GraphAttributes::nodeLabel))
+ {
+ if (!isNodeHierarchical(root))
+ {
+ // get the id of the actual node
+ XmlAttributeObject *att;
+ if(root->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_id], att))
+ {
+ // lookup for node
+ node actNode = (m_nodes.lookup(att->getValue()))->info();
+ // find label tag
+ XmlTagObject* label;
+ if (root->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_label], label)) {
+ // get content tag
+ XmlTagObject* content = label->m_pFirstSon;
+ // get the content as string
+ if (content->m_pTagValue){
+ String str = content->getValue();
+ String labelStr = getLabelCaptionFromString(str);
+ // now set the label of the node
+ CGA.labelNode(actNode) = labelStr;
+ }
+ }
+ }
+ }// "normal" nodes
+ else
+ {
+ // get the id of the actual cluster
+ XmlAttributeObject *att;
+ if(root->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_id], att))
+ {
+ // lookup for cluster
+ cluster actCluster = (m_clusters.lookup(att->getValue()))->info();
+ // find label tag
+ XmlTagObject* label;
+ if (root->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_label], label)) {
+ // get content tag
+ XmlTagObject* content = label->m_pFirstSon;
+ // get the content as string
+ if (content->m_pTagValue) {
+ String str = content->getValue();
+ String labelStr = getLabelCaptionFromString(str);
+ // now set the label of the node
+ CGA.clusterLabel(actCluster) = labelStr;
+ }
+ }
+ }
+ // hierSon = hierarchical Son
+ XmlTagObject *hierSon;
+ if (root->m_pFirstSon)
+ {
+ hierSon = root->m_pFirstSon;
+ while(hierSon) {
+ // recursive call for setting labels of child nodes
+ if (!setLabelsRecursive(G, CGA, hierSon))
+ return false;
+ hierSon = hierSon->m_pBrother;
+ }
+ }
+
+ }//cluster nodes
+ }
+ return true;
+}// setLabelsRecursive
+
+
+
+// ***********************************************************
+//
+// b u i l d g r a p h
+//
+// ***********************************************************
+bool OgmlParser::buildGraph(Graph &G)
+{
+ G.clear();
+
+ int id = 0;
+
+ //Build nodes first
+ HashConstIterator<String, const XmlTagObject*> it;
+
+ for(it = m_ids.begin(); it.valid(); ++it)
+ {
+ if( it.info()->getName() == Ogml::s_tagNames[Ogml::t_node] && !isNodeHierarchical(it.info()))
+ {
+ // get id string from xmlTag
+ XmlAttributeObject *idAtt;
+ if ( (it.info())->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_id], idAtt)
+ && (getIdFromString(idAtt->getValue(), id)) )
+ {
+ // now we got an id from the id-string
+ // we have to check, if this id was assigned
+ if (m_nodeIds.lookup(id)) {
+ // new id was assigned to another node
+ id = G.maxNodeIndex() + 1;
+ }
+ }
+ else {
+ // default id setting
+ id = G.maxNodeIndex() + 1;
+ }
+ m_nodes.fastInsert(it.key(), G.newNode(id));
+ m_nodeIds.fastInsert(id, idAtt->getValue());
+ }
+ }//for nodes
+
+ id = 0;
+
+ //Build edges second
+ for(it = m_ids.begin(); it.valid(); ++it)
+ {
+ if( it.info()->getName() == Ogml::s_tagNames[Ogml::t_edge] )
+ {
+ //Check sources/targets
+ Stack<node> srcTgt;
+ const XmlTagObject* son = it.info()->m_pFirstSon;
+ while(son) {
+ if( son->getName() == Ogml::s_tagNames[Ogml::t_source] ||
+ son->getName() == Ogml::s_tagNames[Ogml::t_target] )
+ {
+ XmlAttributeObject *att;
+ son->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_nodeIdRef], att);
+ //Validate if source/target is really a node
+ if(m_ids.lookup(att->getValue())->info()->getName() != Ogml::s_tagNames[Ogml::t_node]) {
+ cout << "WARNING: edge relation between graph elements of none type node " <<
+ "are temporarily not supported!\n";
+ }
+ else {
+ srcTgt.push(m_nodes.lookup(att->getValue())->info());
+ }
+ }
+ son = son->m_pBrother;
+ }
+ if(srcTgt.size() != 2) {
+ cout << "WARNING: hyperedges are temporarily not supported! Discarding edge.\n";
+ }
+ else {
+ // create edge
+
+ // get id string from xmlTag
+ XmlAttributeObject *idAtt;
+ if ( (it.info())->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_id], idAtt)
+ && (getIdFromString(idAtt->getValue(), id)) )
+ {
+ if (m_edgeIds.lookup(id)) {
+ // new id was assigned to another edge
+ id = G.maxEdgeIndex() + 1;
+ }
+ }
+ else {
+ // default id setting
+ id = G.maxEdgeIndex() + 1;
+ }
+ m_edges.fastInsert(it.key(), G.newEdge(srcTgt.pop(), srcTgt.pop(), id));
+ m_edgeIds.fastInsert(id, idAtt->getValue());
+ }
+ }
+ }//for edges
+
+ //Structure data determined, so building the graph was successfull.
+ return true;
+}//buildGraph
+
+
+
+// ***********************************************************
+//
+// b u i l d c l u s t e r -- g r a p h
+//
+// ***********************************************************
+bool OgmlParser::buildClusterRecursive(
+ const XmlTagObject *xmlTag,
+ cluster parent,
+ Graph &G,
+ ClusterGraph &CG)
+{
+ // create new cluster
+
+ // first get the id
+ int id = -1;
+
+ XmlAttributeObject *idAtt;
+ if ( (xmlTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_id], idAtt))
+ && (getIdFromString(idAtt->getValue(), id)) )
+ {
+ if (m_clusterIds.lookup(id)) {
+ // id was assigned to another cluster
+ id = CG.maxClusterIndex() + 1;
+ }
+ }
+ else {
+ // default id setting
+ id = CG.maxClusterIndex() + 1;
+ }
+ // create cluster and insert into hash tables
+ cluster actCluster = CG.newCluster(parent, id);
+ m_clusters.fastInsert(idAtt->getValue(), actCluster);
+ m_clusterIds.fastInsert(id, idAtt->getValue());
+
+ // check children of cluster tag
+ XmlTagObject *son = xmlTag->m_pFirstSon;
+
+ while(son)
+ {
+ if (son->getName() == Ogml::s_tagNames[Ogml::t_node]) {
+ if (isNodeHierarchical(son))
+ // recursive call
+ buildClusterRecursive(son, actCluster, G, CG);
+ else {
+ // the actual node tag is a child of the cluster
+ XmlAttributeObject *att;
+ //parse tree is valid so tag owns id attribute
+ son->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_id], att);
+ // get node from lookup table with the id in att
+ node v = m_nodes.lookup(att->getValue())->info();
+ // assign node to actual cluster
+ CG.reassignNode(v, actCluster);
+ }
+ }
+
+ son = son->m_pBrother;
+ }//while
+
+ return true;
+}//buildClusterRecursive
+
+
+
+bool OgmlParser::buildCluster(
+ const XmlTagObject *rootTag,
+ Graph &G,
+ ClusterGraph &CG)
+{
+ CG.clear();
+ CG.init(G);
+
+ if(rootTag->getName() != Ogml::s_tagNames[Ogml::t_ogml]) {
+ cerr << "ERROR: Expecting root tag \"" << Ogml::s_tagNames[Ogml::t_ogml] << "\" in OgmlParser::buildCluster!\n";
+ return false;
+ }
+
+ //Search for first node tag
+ XmlTagObject *nodeTag;
+ rootTag->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_graph], nodeTag);
+ nodeTag->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_structure], nodeTag);
+ nodeTag->findSonXmlTagObjectByName(Ogml::s_tagNames[Ogml::t_node], nodeTag);
+
+ while (nodeTag)
+ {
+ if(nodeTag->getName() == Ogml::s_tagNames[Ogml::t_node] && isNodeHierarchical(nodeTag)) {
+ if (!buildClusterRecursive(nodeTag, CG.rootCluster(), G, CG))
+ return false;
+ }
+
+ nodeTag = nodeTag->m_pBrother;
+ }
+
+ return true;
+}//buildCluster
+
+
+
+
+// ***********************************************************
+//
+// b u i l d c o n s t r a i n t s
+//
+// ***********************************************************
+//Commented out due to missing graphconstraints in OGDF
+/*
+bool OgmlParser::buildConstraints(Graph& G, GraphConstraints &GC) {
+
+ // constraints-tag was already set
+ // if not, then return... job's done
+ if (!m_constraintsTag)
+ return true;
+
+ if (m_constraintsTag->getName() != Ogml::s_tagNames[t_constraints]){
+ cerr << "Error: constraints tag is not the required tag!" << endl;
+ return false;
+ }
+
+ XmlTagObject* constraintTag;
+ if(! m_constraintsTag->findSonXmlTagObjectByName(Ogml::s_tagNames[t_constraint], constraintTag) ) {
+ cerr << "Error: no constraint block in constraints block of valid parse tree found!" << endl;
+ return false;
+ }
+
+
+ while(constraintTag) {
+
+// // found data
+// if (constraintTag->getName() == Ogml::s_tagNames[t_data]){
+// // found data for constraints in general
+// // no implementation required for ogdf
+// }//data
+
+ if(constraintTag->getName() == Ogml::s_tagNames[t_constraint]) {
+
+ XmlAttributeObject* actAtt;
+ String cId;
+ String cType;
+
+ if (constraintTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[Ogml::a_id], actAtt))
+ // set id of the constraint
+ cId = actAtt->getValue();
+
+ if (constraintTag->findXmlAttributeObjectByName(Ogml::s_attributeNames[a_type], actAtt))
+ cType = actAtt->getValue();
+ else {
+ cerr << "Error: constraint doesn't own compulsive attribute \'type\' in valid parse tree!" << endl;
+ return false;
+ }
+ // now we need a constraint manager to create a constraint
+ // with the type of the name stored in cType
+ // create the constraint
+ Constraint* c = ConstraintManager::createConstraintByName(G, &cType);
+ // check if the constraintManager doesn't return a null pointer
+ // that occurs if cM doesn't know the constraint name
+ if (c) {
+ // let the constraint load itself
+ if (c->buildFromOgml(constraintTag, &m_nodes)){
+ // add constraint if true is returned
+ GC.addConstraint(c);
+ }
+ else
+ cerr << "Error while building constraint with name \""<<cType<<"\"!" << endl;
+ }
+ else
+ cerr << "Error: constraint type \""<<cType<<"\" is unknown!" << endl;
+
+ }//constraint
+
+ // go to next constraint tag
+ constraintTag = constraintTag->m_pBrother;
+ }//while
+
+ // terminated, so return true
+ return true;
+
+}
+*/
+
+
+
+// ***********************************************************
+//
+// p u b l i c r e a d m e t h o d s
+//
+// ***********************************************************
+bool OgmlParser::read(
+ const char* fileName,
+ Graph &G,
+ ClusterGraph &CG)
+{
+ try {
+ // DinoXmlParser for parsing the ogml file
+ DinoXmlParser p(fileName);
+ p.createParseTree();
+
+ // get root object of the parse tree
+ const XmlTagObject *root = &p.getRootTag();
+
+ // build the required hash tables
+ buildHashTables();
+
+ // valide the document
+ if ( validate(root, Ogml::t_ogml) == Ogml::vs_valid )
+ {
+ checkGraphType(root);
+ // build graph
+ if (buildGraph(G))
+ {
+ Ogml::GraphType gt = getGraphType();
+ // switch GraphType
+ switch (gt){
+ //normal graph
+ case Ogml::graph:
+ break;
+
+ // cluster graph
+ case Ogml::clusterGraph:
+ // build cluster
+ if (!buildCluster(root, G, CG))
+ return false;
+ break;
+
+ // compound graph
+ case Ogml::compoundGraph:
+ // build cluster because we got a cluster graph variable
+ // although we have a compound graph in the ogml file
+ if (!buildCluster(root, G, CG))
+ return false;
+ break;
+
+ // corrupt compound graph
+ case Ogml::corruptCompoundGraph:
+ // build cluster because we got a cluster graph variable
+ // although we have a corrupted compound graph in the ogml file
+ if (!buildCluster(root, G, CG))
+ return false;
+ break;
+ }
+ } else
+ return false;
+ } else
+ return false;
+
+ } catch(const char *error) {
+ cout << error << endl << flush;
+ return false;
+ }
+
+ return true;
+};
+
+
+bool OgmlParser::read(
+ const char* fileName,
+ Graph &G,
+ ClusterGraph &CG,
+ ClusterGraphAttributes &CGA)
+{
+ try {
+ // DinoXmlParser for parsing the ogml file
+ DinoXmlParser p(fileName);
+ p.createParseTree();
+
+ // get root object of the parse tree
+ const XmlTagObject *root = &p.getRootTag();
+
+ // build the required hash tables
+ buildHashTables();
+
+ // valide the document
+ if ( validate(root, Ogml::t_ogml) == Ogml::vs_valid )
+ {
+ checkGraphType(root);
+
+ // build graph
+ if (buildGraph(G))
+ {
+ Ogml::GraphType gt = getGraphType();
+ // switch GraphType
+ switch (gt){
+ // normal graph
+ case Ogml::graph:
+ if (!buildAttributedClusterGraph(G, CGA, root))
+ return false;
+ break;
+
+ // cluster graph
+ case Ogml::clusterGraph:
+ if (!buildCluster(root, G, CG))
+ return false;
+ if (!buildAttributedClusterGraph(G, CGA, root))
+ return false;
+ break;
+
+ // compound graph
+ case Ogml::compoundGraph:
+ // build cluster because we got a cluster graph variable
+ // although we have a compound graph in the ogml file
+ if (!buildCluster(root, G, CG))
+ return false;
+ if (!buildAttributedClusterGraph(G, CGA, root))
+ return false;
+ break;
+
+ // corrupt compound graph
+ case Ogml::corruptCompoundGraph:
+ // build cluster because we got a cluster graph variable
+ // although we have a corrupted compound graph in the ogml file
+ if (!buildCluster(root, G, CG))
+ return false;
+ if (!buildAttributedClusterGraph(G, CGA, root))
+ return false;
+ }
+
+ } else
+ return false;
+
+ } else
+ return false;
+
+ } catch(const char *error) {
+ cout << error << endl << flush;
+ return false;
+ }
+
+ return true;
+};
+
+
+}//namespace ogdf
+
diff --git a/ogdf/fileformats/OgmlParser.h b/ogdf/fileformats/OgmlParser.h
new file mode 100644
index 0000000..ca4e128
--- /dev/null
+++ b/ogdf/fileformats/OgmlParser.h
@@ -0,0 +1,290 @@
+/*
+ * $Revision: 2523 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-02 20:59:27 +0200 (Mon, 02 Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of auxiliary classes OgmlAttributeValue,
+ * OgmlAttribute and OgmlTag.
+ *
+ * \author Christian Wolf and Bernd Zey
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+//KK: Commented out the constraint stuff using //o
+//CG: compound graph stuff has been removed with commit 2465
+
+#ifndef OGDF_OGML_PARSER_H
+#define OGDF_OGML_PARSER_H
+
+#include "Ogml.h"
+#include "DinoXmlParser.h"
+#include "../basic/Hashing.h"
+#include "../basic/String.h"
+#include "../cluster/ClusterGraph.h"
+#include "../cluster/ClusterGraphAttributes.h"
+
+// constraints
+//o#include <ogdf/Constraints.h>
+
+
+namespace ogdf {
+
+//
+// ---------- O g m l P a r s e r ------------------------
+//
+
+/**Objects of this class represent a validating parser for files in Ogml.
+*/
+class OgmlParser
+{
+private:
+
+ // struct definitions for mapping of templates
+ struct OgmlNodeTemplate;
+ struct OgmlEdgeTemplate;
+ //struct OgmlLabelTemplate;
+
+ struct OgmlSegment;
+
+ class OgmlAttributeValue;
+ class OgmlAttribute;
+ class OgmlTag;
+
+ friend ostream& operator<<(ostream& os, const OgmlParser::OgmlAttribute& oa);
+ friend ostream& operator<<(ostream& os, const OgmlParser::OgmlTag& ot);
+
+ static Hashing<int, OgmlTag> *s_tags; //!< Hashtable for saving all ogml tags.
+ static Hashing<int, OgmlAttribute> *s_attributes; //!< Hashtable for saving all ogml attributes.
+ static Hashing<int, OgmlAttributeValue> *s_attValues; //!< Hashtable for saving all values of ogml attributes.
+
+
+ //! Builds hashtables for tags and attributes.
+ static void buildHashTables();
+
+ mutable Ogml::GraphType m_graphType; //!< Saves a graph type. Is set by checkGraphType.
+
+ Hashing<String, const XmlTagObject*> m_ids; //!< Saves all ids of an ogml-file.
+
+ /**
+ * Checks if all tags (XmlTagObject), their attributes (XmlAttributeObject) and
+ * their values are valid (are tags expected, do they own the rigth attributes...)
+ * and sets a valid flag to these. Furthermore it checks if ids of tags are
+ * unique and if id references are valid.
+ * See OgmlTag.h for semantics of the encodings.
+ * Returns the validity state of the current processed tag.
+ */
+ int validate(const XmlTagObject *xmlTag, int ogmlTag);
+
+ /**
+ * Wrapper method for validate method above.
+ * Returns true when validation is successfull, false otherwise.
+ */
+ //bool validate(const char* fileName);
+
+ //! Prints some useful information about un-/successful validation.
+ void printValidityInfo(const OgmlTag &ot,
+ const XmlTagObject &xto,
+ int valStatus,
+ int line);
+
+ /**
+ * Finds the OGML-tag in the parse tree with the specified id,
+ * stores the tag in xmlTag
+ * recTag is the tag for recursive calls
+ * returns false if something goes wrong
+ */
+ //bool getXmlTagObjectById(XmlTagObject *recTag, String id, XmlTagObject *&xmlTag);
+
+ /**
+ * Checks the graph type and stores it in the member variable m_graphType
+ * xmlTag has to be the root or the graph or the structure Ogml-tag
+ * returns false if something goes wrong
+ */
+ bool checkGraphType(const XmlTagObject *xmlTag) const;
+
+ //! Returns true iff subgraph is an hierarchical graph.
+ bool isGraphHierarchical(const XmlTagObject *xmlTag) const;
+
+ //! Returns true iff node contains other nodes.
+ bool isNodeHierarchical(const XmlTagObject *xmlTag) const;
+
+ Ogml::GraphType getGraphType() { return m_graphType; };
+
+
+ // id hash tables
+ // required variables for building
+ // hash table with id from file and node
+ Hashing<String, node> m_nodes;
+ Hashing<String, edge> m_edges;
+ Hashing<String, cluster> m_clusters;
+ // hash table for bend-points
+ Hashing<String, DPoint> m_points;
+
+ // hash table for checking uniqueness of ids
+ // (key:) int = id in the created graph
+ // (info:) String = id in the ogml file
+ Hashing<int, String> m_nodeIds;
+ Hashing<int, String> m_edgeIds;
+ Hashing<int, String> m_clusterIds;
+
+ // build methods
+
+ //! Builds a graph; ignores nodes which have hierarchical structure.
+ bool buildGraph(Graph &G);
+
+ //! Builds a cluster graph.
+ bool buildCluster(
+ const XmlTagObject *rootTag,
+ Graph &G,
+ ClusterGraph &CG);
+
+ //! Recursive part of buildCluster.
+ bool buildClusterRecursive(
+ const XmlTagObject *xmlTag,
+ cluster parent,
+ Graph &G,
+ ClusterGraph &CG);
+
+ //! Build a cluster graph with style/layout attributes.
+ bool buildAttributedClusterGraph(
+ Graph &G,
+ ClusterGraphAttributes &CGA,
+ const XmlTagObject *root);
+
+ //! Method for setting labels of clusters.
+ bool setLabelsRecursive(
+ Graph &G,
+ ClusterGraphAttributes &CGA,
+ XmlTagObject *root);
+
+ // helping pointer for constraints-loading
+ // this pointer is set in the building methods
+ // so we don't have to traverse the tree in buildConstraints
+ XmlTagObject* m_constraintsTag;
+
+ // hashing lists for templates
+ // string = id
+ Hashing<String, OgmlNodeTemplate*> m_ogmlNodeTemplates;
+ Hashing<String, OgmlEdgeTemplate*> m_ogmlEdgeTemplates;
+ //Hashing<String, OgmlLabelTemplate> m_ogmlLabelTemplates;
+
+ // auxiliary methods for mapping graph attributes
+
+ //! Returns int value for the pattern.
+ int getBrushPatternAsInt(String s);
+
+ //! Returns the shape as an integer value.
+ int getShapeAsInt(String s);
+
+ //! Maps the OGML attribute values to corresponding GDE values.
+ String getNodeTemplateFromOgmlValue(String s);
+
+ //! Returns the line type as an integer value.
+ int getLineTypeAsInt(String s);
+
+ //! Returns the image style as an integer value.
+ int getImageStyleAsInt(String s);
+
+ //! Returns the alignment of image as an integer value.
+ int getImageAlignmentAsInt(String s);
+
+ // arrow style, actually a "boolean" function
+ // because it returns only 0 or 1 according to GDE
+ // sot <=> source or target
+ int getArrowStyleAsInt(String s, String sot);
+
+ // the matching method to getArrowStyleAsInt
+ GraphAttributes::EdgeArrow getArrowStyle(int i);
+
+ // function that operates on a string
+ // the input string contains "<" instead of "<"
+ // and ">" instead of ">"
+ // to disable interpreting the string as xml-tags (by DinoXmlParser)
+ // so this function substitutes "<" for "<"
+ String getLabelCaptionFromString(String str);
+
+ //! Returns the integer value of the id at the end of the string (if it exists).
+ bool getIdFromString(String str, int &id);
+
+ //! Validiation method.
+ void validate(const char* fileName);
+
+public:
+
+ //! Constructs an OGML parser.
+ OgmlParser() { }
+
+ ~OgmlParser() { }
+
+
+ //! Reads a cluster graph \a CG from file \a fileName in OGML format.
+ /**
+ * @param fileName is the name of the file to be parsed as OGML file.
+ * @param G is the graph to be build from the OGML file; must be the graph associated with \a CG.
+ * @param CG is the cluster graph to be build from the OGML file.
+ * @return true if succesfull, false otherwise.
+ */
+ bool read(
+ const char* fileName,
+ Graph &G,
+ ClusterGraph &CG);
+
+ //! Reads a cluster graph \a CG with attributes \a CGA from file \a fileName in OGML format.
+ /**
+ * @param fileName is the name of the file to be parsed as OGML file.
+ * @param G is the graph to be build from the OGML file; must be the graph associated with \a CG.
+ * @param CG is the cluster graph to be build from the OGML file.
+ * @param CGA are the cluster graph attributes (associated with CG) in which layout and style information are stored.
+ * @return true if succesfull, false otherwise.
+ */
+ bool read(
+ const char* fileName,
+ Graph &G,
+ ClusterGraph &CG,
+ ClusterGraphAttributes &CGA);
+
+};//end class OGMLParser
+
+}//end namespace ogdf
+
+#endif
+
diff --git a/ogdf/fileformats/XmlObject.h b/ogdf/fileformats/XmlObject.h
new file mode 100644
index 0000000..351eb8d
--- /dev/null
+++ b/ogdf/fileformats/XmlObject.h
@@ -0,0 +1,132 @@
+/*
+ * $Revision: 2523 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-02 20:59:27 +0200 (Mon, 02 Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of class XmlObject.
+ *
+ * \author Sebastian Leipert and Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_XML_OBJECT_H
+#define OGDF_XML_OBJECT_H
+
+
+
+namespace ogdf {
+
+
+typedef HashElement<String,int> *XmlKey;
+enum XmlObjectType { xmlIntValue, xmlDoubleValue, xmlStringValue, xmlListBegin,
+ xmlListEnd, xmlKey, xmlEOF, xmlError };
+
+
+//---------------------------------------------------------
+// XmlObject
+// represents node in XML parse tree
+//---------------------------------------------------------
+struct OGDF_EXPORT XmlObject {
+
+ XmlObject *m_pBrother; // brother of node in tree
+ XmlKey m_key; // tag of node
+ XmlObjectType m_valueType; // type of node
+
+ // the entry in the union is selected according to m_valueType:
+ // xmlIntValue -> m_intValue
+ // xmlDoubleValue -> m_doubleValue
+ // xmlStringValue -> m_stringValue
+ // xmlListBegin -> m_pFirstSon (in case of a list, m_pFirstSon is pointer
+ // to first son and the sons are chained by m_pBrother)
+ union {
+ int m_intValue;
+ double m_doubleValue;
+ const char *m_stringValue;
+ XmlObject *m_pFirstSon;
+ };
+
+ // construction
+
+ // Some Reference on the XML notation:
+ // XML consists of one or more elements.
+ // An element is marked with the following form:
+ // <body>
+ // elementinformation
+ // </body>
+ // The opening <body> and the closing </body> are the tags
+ // of the element. The text between the two tags is considered
+ // part of the element.
+ // Elemets can have attributes applied, e.g.
+ // <body style="bold">blablabla</body>
+ // The attribute is specified inside the opening tag
+ // and is called "style". It is given a value "bold" which is expressed
+ // inside quotation marks.
+
+
+
+ // Stores the "tag" of an XML element
+ XmlObject(XmlKey key) : m_pBrother(0), m_key(key),
+ m_valueType(xmlListBegin), m_pFirstSon(0) { }
+
+ // Stores an integer "attribute" of an XML element
+ XmlObject(XmlKey key, int intValue) : m_pBrother(0), m_key(key),
+ m_valueType(xmlIntValue), m_intValue(intValue) { }
+
+ // Stores a double "attribute" of an XML element
+ XmlObject(XmlKey key, double doubleValue) : m_pBrother(0), m_key(key),
+ m_valueType(xmlDoubleValue), m_doubleValue(doubleValue) { }
+
+ // Stores a string "attribute" of an XML element
+ XmlObject(XmlKey key, const char *stringValue) : m_pBrother(0), m_key(key),
+ m_valueType(xmlStringValue), m_stringValue(stringValue) { }
+
+ // Stores the body of the element
+ XmlObject(const char *stringValue) : m_pBrother(0), m_key(0),
+ m_valueType(xmlStringValue), m_stringValue(stringValue) { }
+
+
+ OGDF_NEW_DELETE
+};
+
+} // end namespace ogdf
+
+#endif
diff --git a/ogdf/fileformats/XmlParser.cpp b/ogdf/fileformats/XmlParser.cpp
new file mode 100644
index 0000000..d7cf5da
--- /dev/null
+++ b/ogdf/fileformats/XmlParser.cpp
@@ -0,0 +1,1204 @@
+/*
+ * $Revision: 2565 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-07 17:14:54 +0200 (Sa, 07. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of XML parser (class XmlParser)
+ * (used for parsing and reading XML files)
+ *
+ * \author Sebastian Leipert
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "XmlParser.h"
+#include <ctype.h>
+#include <string.h>
+
+extern ofstream os;
+
+namespace ogdf {
+
+
+#define BUFFERLENGTH 8192
+
+XmlParser::XmlParser(const char *fileName, bool doCheck)
+{
+ // open file
+ ifstream is(fileName, ios::in);// | ios::nocreate); // not accepted by gnu 3.02
+ if (!is) {
+ setError("Cannot open file."); return;
+ }
+
+ createObjectTree(is, doCheck);
+}
+
+
+XmlParser::XmlParser(istream &is, bool doCheck)
+{
+ createObjectTree(is,doCheck);
+}
+
+
+void XmlParser::createObjectTree(istream &is, bool doCheck)
+{
+ initPredefinedKeys();
+ m_error = false;
+ m_objectTree = 0;
+
+ m_is = &is;
+ m_doCheck = doCheck; // indicates more extensive checking
+
+ // initialize line buffer (note: XML specifies a maximal line length
+ // of 254 characters!)
+ // See als the workaround for Get2Chip in function getLine()
+
+ m_rLineBuffer = new char[BUFFERLENGTH]; // get2Chip special:
+ // XML Standard: char[256];
+ *m_rLineBuffer = '\n';
+ m_lineBuffer = m_rLineBuffer+1;
+
+ m_pCurrent = m_pStore = m_lineBuffer;
+ m_cStore = 0; // forces getNextSymbol() to read first line
+ m_keyName = 0;
+
+ // create object tree
+ m_objectTree = parseList(xmlEOF,xmlListEnd,"");
+
+ delete[] m_rLineBuffer;
+}
+
+
+// we use predefined id constants for all relevant keys
+// this allows us to use efficient switch() statemnts in read() methods
+void XmlParser::initPredefinedKeys()
+{
+
+ m_hashTable.fastInsert("NAME", namePredefKey);
+ m_hashTable.fastInsert("GRAPH", graphPredefKey);
+ m_hashTable.fastInsert("NODE", nodePredefKey);
+ m_hashTable.fastInsert("TRANSITION",edgePredefKey);
+ m_hashTable.fastInsert("EDGE", edgePredefKey);
+
+ m_hashTable.fastInsert("POSITION", positionPredefKey);
+ m_hashTable.fastInsert("X", xPredefKey);
+ m_hashTable.fastInsert("Y", yPredefKey);
+
+ m_hashTable.fastInsert("SIZE", sizePredefKey);
+ m_hashTable.fastInsert("W", wPredefKey);
+ m_hashTable.fastInsert("H", hPredefKey);
+ m_hashTable.fastInsert("WIDTH", widthPredefKey);
+ m_hashTable.fastInsert("HEIGHT", heightPredefKey);
+
+ m_hashTable.fastInsert("NODETYPE", nodetypePredefKey);
+ m_hashTable.fastInsert("EDGETYPE", edgetypePredefKey);
+ m_hashTable.fastInsert("TYPE", typePredefKey);
+
+ m_hashTable.fastInsert("FROM", sourcePredefKey);
+ m_hashTable.fastInsert("SOURCE", sourcePredefKey);
+ m_hashTable.fastInsert("TO", targetPredefKey);
+ m_hashTable.fastInsert("TARGET", targetPredefKey);
+ m_hashTable.fastInsert("SENSE", sensePredefKey);
+ m_hashTable.fastInsert("PATH", pathPredefKey);
+
+
+ // further keys get id's starting with NEXTPREDEFKEY
+ m_num = NEXTPREDEFKEY;
+}
+
+
+XmlObject *XmlParser::parseList(XmlObjectType closingKey,
+ XmlObjectType /* errorKey */,
+ const char *objectBodyName)
+{
+ XmlObject *firstSon = 0;
+ XmlObject **pPrev = &firstSon;
+
+ for( ; ; ) {
+ XmlObjectType symbol = getNextSymbol();
+
+ if (symbol == closingKey || symbol == xmlError)
+ return firstSon;
+
+ XmlObject *object = 0;
+
+ if (symbol == xmlListBegin) {
+ symbol = getNextSymbol();
+ if (symbol != xmlKey) {
+ setError("key expected");
+ return firstSon;
+ }
+ XmlKey key = m_keySymbol;
+ object = OGDF_NEW XmlObject(key);
+
+ size_t len = strlen(m_keyName)+1;
+ char* newObjectBodyName = new char[len];
+ m_objectBody.pushBack(newObjectBodyName);
+ ogdf::strcpy(newObjectBodyName,len,m_keyName);
+
+ // Recursive call for building the tree.
+ object->m_pFirstSon = parseList(xmlListEnd,xmlEOF,newObjectBodyName);
+ }
+
+ else if (m_eoTag)
+ { // must be the body of an element
+ if (symbol != xmlStringValue) {
+ setError("String expected");
+ return firstSon;
+ }
+ size_t len = strlen(m_stringSymbol)+1;
+ char *pChar = new char[len];
+ ogdf::strcpy(pChar,len,m_stringSymbol);
+
+ object = OGDF_NEW XmlObject(hashString(objectBodyName),pChar);
+ }
+ else
+ { // must be a symbol
+ if (symbol != xmlKey) {
+ setError("key expected");
+ return firstSon;
+ }
+
+ XmlKey key = m_keySymbol;
+
+ symbol = getNextSymbol();
+ switch (symbol) {
+ case xmlIntValue:
+ object = OGDF_NEW XmlObject(key,m_intSymbol);
+ break;
+
+ case xmlDoubleValue:
+ object = OGDF_NEW XmlObject(key,m_doubleSymbol);
+ break;
+
+ case xmlStringValue: {
+ size_t len = strlen(m_stringSymbol)+1;
+ char *pChar = new char[len];
+ ogdf::strcpy(pChar,len,m_stringSymbol);
+ object = OGDF_NEW XmlObject(key,pChar); }
+ break;
+
+ case xmlListBegin:
+ setError("unexpected begin of list");
+ break;
+
+ case xmlListEnd:
+ setError("unexpected end of list");
+ return firstSon;
+
+ case xmlKey:
+ setError("unexpected key");
+ return firstSon;
+
+ case xmlEOF:
+ setError("missing value");
+ return firstSon;
+
+ case xmlError:
+ return firstSon;
+ }
+ }
+
+ *pPrev = object;
+ pPrev = &object->m_pBrother;
+
+ }
+ return firstSon;
+}
+
+
+void XmlParser::destroyObjectList(XmlObject *object)
+{
+ XmlObject *nextObject;
+ for(; object; object = nextObject) {
+ nextObject = object->m_pBrother;
+
+ if (object->m_valueType == xmlStringValue)
+ delete[] const_cast<char *>(object->m_stringValue);
+
+ else if (object->m_valueType == xmlListBegin)
+ destroyObjectList(object->m_pFirstSon);
+
+ delete object;
+ }
+}
+
+
+XmlParser::~XmlParser()
+{
+ // we have to delete all objects and allocated char arrays in string values
+ destroyObjectList(m_objectTree);
+ while (!m_objectBody.empty())
+ delete[] m_objectBody.popFrontRet();
+ delete[] m_keyName;
+}
+
+
+bool XmlParser::getLine()
+{
+ do {
+// Standard XML needs only this
+// if (m_is->eof()) return false;
+// m_is->getline(m_lineBuffer,255);
+
+// Workaround for Get2Chip. XML-Information may exceed 254 signs per line.
+// Moreover, XML signs may be longer than 254 signs. Cut information at '>'.
+// Workaround starts here.
+ char c;
+ int count = 0;
+ while ( ((c = m_is->get() ) != '>') && (count <= (BUFFERLENGTH - 2))){
+ if (m_is->eof()) return false;
+ m_lineBuffer[count++] = c;
+ }
+ if ( (c == '>') && (count <= (BUFFERLENGTH - 2)))
+ m_lineBuffer[count++] = c;
+ m_lineBuffer[count] = '\0';
+// Workaround stops here.
+
+ // Eat Whitespaces.
+ for(m_pCurrent = m_lineBuffer; *m_pCurrent && isspace(*m_pCurrent); ++m_pCurrent) ;
+ } while (*m_pCurrent == '#' || *m_pCurrent == 0);
+
+ return true;
+}
+
+/*****************************************************************************
+ getNextSymbol
+******************************************************************************/
+
+
+
+XmlObjectType XmlParser::getNextSymbol()
+{
+ *m_pStore = m_cStore;
+ m_eoTag = false;
+ bool digit = false;
+
+ // eat whitespace
+ for(; *m_pCurrent && isspace(*m_pCurrent); ++m_pCurrent) ;
+ if (*m_pCurrent == '>')
+ {
+ m_pCurrent++;
+ m_eoTag = true; // end of a tag reached.
+ }
+ for(; *m_pCurrent && isspace(*m_pCurrent); ++m_pCurrent) ;
+ // get new line if required
+ if (*m_pCurrent == 0) {
+ if (!getLine()) return xmlEOF;
+ }
+
+
+ // identify start of current symbol
+ char *pStart = m_pCurrent;
+
+ // we currently do not support strings with line breaks!
+
+ if (*pStart == '=')
+ { // attribute value
+ // string or int or double expected
+
+ // again: eat whitespace
+ pStart++;m_pCurrent++;
+ for(; *m_pCurrent && isspace(*m_pCurrent); ++m_pCurrent) ;
+ // again: get new line if required
+ if (*m_pCurrent == 0) {
+ if (!getLine()) return xmlEOF;
+ }
+ // again: identify start of current symbol
+ char *pStart = m_pCurrent;
+
+ bool quotation = (*pStart == '\"' ? 1 : 0);
+ if (quotation)
+ {
+ pStart++;
+ m_pCurrent++;
+ }
+ if (*pStart == '-' || isdigit(*pStart)) // Check if int or double
+ {
+ digit = true;
+ char *pCheck = m_pCurrent;
+ pCheck++;
+ while(isdigit(*pCheck)) ++pCheck; // int or double
+ if (*pCheck == '.')
+ pCheck++; // only double
+ else if (quotation && *pCheck != '\"')
+ digit = false; // must be string
+ else if (!quotation && !isspace(*pCheck) && *pCheck != '>')
+ digit = false; // must be string
+ if (digit)
+ {
+ while(isdigit(*pCheck)) ++pCheck;
+ if (quotation && *pCheck != '\"')
+ digit = false; // must be string
+ else if (!quotation && !isspace(*pCheck) && *pCheck != '>')
+ digit = false; // must be string
+ }
+ }
+
+// if (!isdigit(*pStart) && (*pStart != '-')) { // string
+ if (!digit) // string
+ {
+ m_stringSymbol = m_pCurrent;
+ if (quotation){
+ for(; *m_pCurrent != 0 && *m_pCurrent != '\"'; ++m_pCurrent)
+ if (*m_pCurrent == '\\')
+ ++m_pCurrent; // No quotation mark found yet. Drop the line.
+ }
+ else {
+ for(; *m_pCurrent != 0 && !isspace(*m_pCurrent) && *m_pCurrent != '>'; ++m_pCurrent)
+ if (*m_pCurrent == '\\') ++m_pCurrent;
+ }
+ if (quotation && *m_pCurrent == 0) {
+ m_longString = (pStart);
+ while(getLine()) {
+ for(m_pCurrent = m_lineBuffer; *m_pCurrent != 0 && *m_pCurrent != '\"'; ++m_pCurrent)
+ if (*m_pCurrent == '\\') ++m_pCurrent;
+ if (*m_pCurrent == 0)
+ m_longString += m_lineBuffer;
+ else {
+ m_cStore = *(m_pStore = m_pCurrent);
+ *m_pCurrent++ = 0; // Drop quotation mark.
+ m_longString += m_lineBuffer;
+ break;
+ }
+ }
+ m_stringSymbol = m_longString.cstr();
+
+ }
+ else {
+ m_cStore = *(m_pStore = m_pCurrent);
+ if (quotation)
+ *m_pCurrent++ = 0; // Drop quotation mark.
+ else
+ *m_pCurrent = 0;
+ }
+
+ return xmlStringValue;
+ }
+// else if (*pStart == '-' || isdigit(*pStart))
+ else // int or double
+ {
+ m_pCurrent++;
+ while(isdigit(*m_pCurrent)) ++m_pCurrent;
+
+ if (*m_pCurrent == '.') // double
+ {
+ // check to be done
+
+ sscanf(pStart,"%lf",&m_doubleSymbol);
+ m_pCurrent++;
+ while (isdigit(*m_pCurrent)) ++m_pCurrent;
+ if (quotation){
+ for(; *m_pCurrent != 0 && *m_pCurrent != '\"' && isdigit(*m_pCurrent); ++m_pCurrent) ;
+
+ if (*m_pCurrent == '\"')
+ m_pCurrent++;
+ else
+ {
+ setError("malformed number");
+ return xmlError;
+ }
+ }
+ return xmlDoubleValue;
+
+ }
+
+ else // int
+ {
+ if (isalpha(*m_pCurrent)) {
+ setError("malformed number");
+ return xmlError;
+ }
+ if (quotation){
+ for(; *m_pCurrent != 0 && *m_pCurrent != '\"'; ++m_pCurrent);
+ if (*m_pCurrent == '\"')
+ m_pCurrent++;
+ else{
+ setError("malformed number");
+ return xmlError;
+ }
+ }
+ sscanf(pStart,"%d",&m_intSymbol);
+ return xmlIntValue;
+ }
+
+ }
+ }
+
+ if (*pStart == '<') {
+ //check if end of list
+ m_pCurrent++;
+ for (; *m_pCurrent && isspace(*m_pCurrent); ++m_pCurrent);
+ if (*m_pCurrent == '/'){
+ for (; *m_pCurrent && *m_pCurrent != '>'; ++m_pCurrent);
+ m_cStore = *(m_pStore = m_pCurrent);
+ return xmlListEnd;
+ }
+ else {
+ m_cStore = *(m_pStore = m_pCurrent);
+ return xmlListBegin;
+ }
+ }
+ else if (*pStart == '/') {
+ m_pCurrent++;
+ for (; *m_pCurrent && *m_pCurrent == '>'; ++m_pCurrent);
+ m_cStore = *(m_pStore = m_pCurrent);
+ return xmlListEnd;
+
+ }
+
+ else // Invalid clause: if(isalpha(*pStart)). May contain numbers
+ {
+ // Tag name, Attribute Name (both are said to be keys)
+ // or body name (element)
+
+ // check if really a correct key (error if not)
+ if (m_doCheck) {
+ m_pCurrent++;
+ for (;*m_pCurrent; ++m_pCurrent)
+ if (!(isalpha(*m_pCurrent) || isdigit(*m_pCurrent))) {
+ setError("malformed key");
+ return xmlError;
+ }
+ }
+ if (m_eoTag) // its the body of an element
+ {
+ // Do not ignore whitespace, quotation marks etc.
+ // They belong to the element.
+ // Only search for the '<' of the next tag.
+ // The element is considered as string.
+
+ // Get new line if required
+ if (*m_pCurrent == 0) {
+ if (!getLine()) return xmlEOF;
+ }
+ // again: identify start of current symbol
+ //char *pStart = m_pCurrent;
+
+
+ m_stringSymbol = m_pCurrent;
+
+ while(*m_pCurrent != 0 && *m_pCurrent != '<' )
+ ++m_pCurrent;
+ m_cStore = *(m_pStore = m_pCurrent);
+ *m_pCurrent = 0;
+
+ return xmlStringValue;
+ }
+ else // it is a key
+ {
+ while(*m_pCurrent != 0 &&
+ *m_pCurrent != '=' &&
+ *m_pCurrent != '>' &&
+ *m_pCurrent != '/' &&
+ *m_pCurrent != '<' &&
+ !isspace(*m_pCurrent)
+ )
+ ++m_pCurrent;
+ m_cStore = *(m_pStore = m_pCurrent);
+ *m_pCurrent = 0;
+
+ if (m_keyName != 0)
+ delete[] m_keyName;
+ size_t len = strlen(pStart)+6;
+ m_keyName = new char[len];
+ ogdf::strcpy(m_keyName,len,pStart);
+
+ m_keySymbol = hashString(pStart);
+ return xmlKey;
+ }
+ }
+
+ //
+ //setError("unknown symbol");
+
+ //return xmlError;
+}
+
+
+
+
+XmlKey XmlParser::hashString(const String &str)
+{
+ XmlKey key = m_hashTable.insertByNeed(str,-1);
+ if(key->info() == -1) key->info() = m_num++;
+
+ return key;
+}
+
+/*****************************************************************************
+ getNodeIdRange
+******************************************************************************/
+
+
+XmlObject *XmlParser::getNodeIdRange(int &minId,int &maxId,
+ int &nodetypeCount,
+ XmlObject *graphObject)
+
+{
+ nodetypeCount = minId = maxId = -1;
+
+ if (graphObject == 0)
+ graphObject = m_objectTree;
+ XmlObject *scanObject = graphObject;
+
+ for(; scanObject; scanObject = scanObject->m_pBrother)
+ if (id(scanObject) == graphPredefKey) break;
+
+ if (!scanObject || id(scanObject) != graphPredefKey)
+ {
+ scanObject = graphObject;
+ for(; scanObject; scanObject = scanObject->m_pBrother)
+ {
+ graphObject = getNodeIdRange(minId,maxId,nodetypeCount,scanObject->m_pFirstSon);
+ if (graphObject && id(graphObject) == graphPredefKey)
+ return graphObject;
+ }
+ }
+
+ if (!scanObject || scanObject->m_valueType != xmlListBegin) return 0;
+
+ XmlObject *son = scanObject->m_pFirstSon;
+ for(; son; son = son->m_pBrother) {
+ if (id(son) == nodePredefKey && son->m_valueType == xmlListBegin)
+ maxId++;
+ else if (id(son) == nodetypePredefKey && son->m_valueType == xmlListBegin)
+ nodetypeCount++;
+ }
+
+ if (maxId >= 0)
+ minId = 0;
+
+ return scanObject;
+}
+
+
+
+
+/*****************************************************************************
+ makeIdMap
+******************************************************************************/
+
+
+bool XmlParser::makeIdMap(
+ int maxId,
+ Array<char*> & idMap,
+ int nodetypeCount,
+ Array<char*> & typeName,
+ Array<double> & typeWidth,
+ Array<double> & typeHeight,
+ XmlObject *graphObject)
+{
+ int idCount = 0;
+ int typeCount = 0;
+ for(; graphObject; graphObject = graphObject->m_pBrother)
+ if (id(graphObject) == graphPredefKey) break;
+
+ if (!graphObject || graphObject->m_valueType != xmlListBegin) return 0;
+
+ XmlObject *son = graphObject->m_pFirstSon;
+ for(; son; son = son->m_pBrother) {
+ if (id(son) == nodePredefKey && son->m_valueType == xmlListBegin) {
+ XmlObject *nodeSon = son->m_pFirstSon;
+ for(; nodeSon; nodeSon = nodeSon->m_pBrother)
+ if (id(nodeSon) == namePredefKey && nodeSon->m_valueType == xmlStringValue){
+ if (idCount >= maxId+1)
+ return 0;
+ size_t len = strlen(nodeSon->m_stringValue)+1;
+ idMap[idCount] = new char[len];
+ ogdf::strcpy(idMap[idCount++],len,nodeSon->m_stringValue);
+ }
+ }
+ else if (id(son) == nodetypePredefKey && son->m_valueType == xmlListBegin){
+ XmlObject *nodeSon = son->m_pFirstSon;
+ if (typeCount <= nodetypeCount){
+ for(; nodeSon; nodeSon = nodeSon->m_pBrother) {
+ if (id(nodeSon) == namePredefKey && nodeSon->m_valueType == xmlStringValue){
+ size_t len = strlen(nodeSon->m_stringValue)+1;
+ typeName[typeCount] = new char[len];
+ ogdf::strcpy(typeName[typeCount],len,nodeSon->m_stringValue);
+ }
+ else if (id(nodeSon) == widthPredefKey ){
+ if (nodeSon->m_valueType == xmlIntValue)
+ typeWidth[typeCount] = (int) nodeSon->m_intValue;
+ else if (nodeSon->m_valueType == xmlDoubleValue)
+ typeWidth[typeCount] = nodeSon->m_doubleValue;
+ }
+ else if (id(nodeSon) == heightPredefKey ){
+ if (nodeSon->m_valueType == xmlIntValue)
+ typeHeight[typeCount] = (int) nodeSon->m_intValue;
+ else if (nodeSon->m_valueType == xmlDoubleValue)
+ typeHeight[typeCount] = nodeSon->m_doubleValue;
+ }
+ }
+ typeCount++;
+ }
+ }
+
+ }
+ if (idCount != maxId+1)
+ return 0;
+ else
+ return 1;
+}
+
+
+/*****************************************************************************
+ read
+******************************************************************************/
+
+
+bool XmlParser::read(Graph &G)
+{
+ G.clear();
+
+ int minId, maxId, nodetypeCount;
+ XmlObject *graphObject = getNodeIdRange(minId, maxId, nodetypeCount,0);
+
+ //cout << endl << minId << " " << maxId << endl;
+ if (!graphObject) {
+ setError("missing graph key");
+ return false;
+ }
+
+ Array<double> typeWidth(0,nodetypeCount,0);
+ Array<double> typeHeight(0,nodetypeCount,0);
+ Array<char*> typeName(nodetypeCount+1);
+ Array<char*> idMap(maxId+1);
+ if (!makeIdMap(maxId,idMap,nodetypeCount,typeName,typeWidth,typeHeight,graphObject)) {
+ setError("wrong name identifier");
+ return false;
+ }
+
+ Array<node> mapToNode(minId,maxId,0);
+ int notDefined = minId-1; //indicates not defined id key
+ int idCount = minId;
+
+ XmlObject *son = graphObject->m_pFirstSon;
+ for(; son; son = son->m_pBrother) {
+
+ switch(id(son)) {
+ case nodePredefKey: {
+ if (son->m_valueType != xmlListBegin) break;
+
+ // set attributes to default values
+ int vId = idCount++;
+
+ // create new node if necessary and assign attributes
+ if (mapToNode[vId] == 0)
+ mapToNode[vId] = G.newNode();
+ break;
+ }
+ case edgePredefKey:
+ if (son->m_valueType != xmlListBegin) break;
+
+ // set attributes to default values
+ int sourceId = notDefined, targetId = notDefined;
+ // read all relevant attributes
+ XmlObject *edgeSon = son->m_pFirstSon;
+ for(; edgeSon; edgeSon = edgeSon->m_pBrother) {
+ int i = 0;
+ switch(id(edgeSon)) {
+ case sourcePredefKey:
+ if (edgeSon->m_valueType != xmlStringValue) break;
+ for (i = 0; i<= maxId;i++)
+ if (!strcmp(idMap[i],edgeSon->m_stringValue))
+ sourceId = i;
+ break;
+
+ case targetPredefKey:
+ if (edgeSon->m_valueType != xmlStringValue) break;
+ for (i = 0; i<= maxId;i++)
+ if (!strcmp(idMap[i],edgeSon->m_stringValue))
+ targetId = i;
+ break;
+
+ }
+ }
+
+ // check if everything required is defined correctly
+ if (sourceId == notDefined || targetId == notDefined) {
+ setError("source or target id not defined");
+ //cout << "source or target id not defined" << endl;
+ return false;
+
+ } else if (sourceId < minId || maxId < sourceId ||
+ targetId < minId || maxId < targetId) {
+ setError("source or target id out of range");
+ //cout << "source or target id out of range" << endl;
+ return false;
+ }
+
+ // create adjacent nodes if necessary and new edge
+ if (mapToNode[sourceId] == 0) mapToNode[sourceId] = G.newNode();
+ if (mapToNode[targetId] == 0) mapToNode[targetId] = G.newNode();
+
+
+ G.newEdge(mapToNode[sourceId],mapToNode[targetId]);
+ break;
+ }
+ }
+
+ return true;
+}
+
+
+/*****************************************************************************
+ read
+******************************************************************************/
+
+
+bool XmlParser::read(Graph &G, GraphAttributes &AG)
+{
+ OGDF_ASSERT(&G == &(const Graph &)AG)
+
+ G.clear();
+
+ int minId, maxId, nodetypeCount;
+ XmlObject *graphObject = getNodeIdRange(minId, maxId, nodetypeCount,0);
+
+ if (!graphObject) {
+ setError("missing graph key");
+ return false;
+ }
+
+ Array<double> typeWidth(0,nodetypeCount,0);
+ Array<double> typeHeight(0,nodetypeCount,0);
+ Array<char*> typeName(nodetypeCount+1);
+ Array<char*> idMap(maxId+1);
+ if (!makeIdMap(maxId,idMap,nodetypeCount,typeName,typeWidth,typeHeight,graphObject)) {
+ setError("wrong name identifier");
+ closeLabels(idMap,typeName);
+ return false;
+ }
+ Array<node> mapToNode(minId,maxId,0);
+ int notDefined = minId-1; //indicates not defined id key
+ int idCount = minId;
+
+ DPolyline bends;
+ String label;
+
+ XmlObject *son = graphObject->m_pFirstSon;
+ for(; son; son = son->m_pBrother) {
+
+ switch(id(son)) {
+ case nodePredefKey:
+ {
+ if (son->m_valueType != xmlListBegin) break;
+
+ // set attributes to default values
+ int vId = idCount++;;
+ double x = 0, y = 0, w = 0, h = 0;
+ bool typeDefined = 0;
+ // read all relevant attributes
+
+ XmlObject *graphicsObject = son->m_pFirstSon;
+ for(; graphicsObject; graphicsObject = graphicsObject->m_pBrother)
+ {
+ switch(id(graphicsObject))
+ {
+ case namePredefKey:
+ if (graphicsObject->m_valueType == xmlStringValue)
+ label = graphicsObject->m_stringValue;
+ break;
+ case xPredefKey:
+ if(graphicsObject->m_valueType == xmlDoubleValue)
+ x = graphicsObject->m_doubleValue;
+ else if (graphicsObject->m_valueType == xmlIntValue)
+ x = (int) graphicsObject->m_intValue;
+ break;
+ case yPredefKey:
+ if(graphicsObject->m_valueType == xmlDoubleValue)
+ y = graphicsObject->m_doubleValue;
+ else if (graphicsObject->m_valueType == xmlIntValue)
+ y = (int) graphicsObject->m_intValue;
+ break;
+ case wPredefKey:
+ if (!typeDefined)
+ {
+ if(graphicsObject->m_valueType == xmlDoubleValue)
+ w = graphicsObject->m_doubleValue;
+ else if (graphicsObject->m_valueType == xmlIntValue)
+ w = (int) graphicsObject->m_intValue;
+ }
+ break;
+ case hPredefKey:
+ if (!typeDefined)
+ {
+ if(graphicsObject->m_valueType == xmlDoubleValue)
+ h = graphicsObject->m_doubleValue;
+ else if (graphicsObject->m_valueType == xmlIntValue)
+ h = (int) graphicsObject->m_intValue;
+ }
+ break;
+ case widthPredefKey:
+ if (!typeDefined)
+ {
+ if(graphicsObject->m_valueType == xmlDoubleValue)
+ w = graphicsObject->m_doubleValue;
+ else if (graphicsObject->m_valueType == xmlIntValue)
+ w = (int) graphicsObject->m_intValue;
+ }
+ break;
+ case heightPredefKey:
+ if (!typeDefined)
+ {
+ if(graphicsObject->m_valueType == xmlDoubleValue)
+ h = graphicsObject->m_doubleValue;
+ else if (graphicsObject->m_valueType == xmlIntValue)
+ h = (int) graphicsObject->m_intValue;
+ }
+ break;
+ case typePredefKey:
+ if(graphicsObject->m_valueType == xmlStringValue)
+ {
+ int i = 0;
+ for (;i <= nodetypeCount && strcmp(typeName[i],graphicsObject->m_stringValue);i++);
+ if (i <= nodetypeCount)
+ {
+ w = typeWidth[i];
+ h = typeHeight[i];
+ typeDefined = 1;
+ }
+ }
+ break;
+
+
+ case positionPredefKey:
+ {
+ if (graphicsObject->m_valueType != xmlListBegin) break;
+
+
+ XmlObject *graphicsObjectElement = graphicsObject->m_pFirstSon;
+ for(; graphicsObjectElement; graphicsObjectElement = graphicsObjectElement->m_pBrother)
+ {
+ switch(id(graphicsObjectElement))
+ {
+ case xPredefKey:
+ if(graphicsObjectElement->m_valueType == xmlDoubleValue)
+ x = graphicsObjectElement->m_doubleValue;
+ else if (graphicsObjectElement->m_valueType == xmlIntValue)
+ x = (int) graphicsObjectElement->m_intValue;
+ break;
+ case yPredefKey:
+ if(graphicsObjectElement->m_valueType == xmlDoubleValue)
+ y = graphicsObjectElement->m_doubleValue;
+ else if (graphicsObjectElement->m_valueType == xmlIntValue)
+ y = (int) graphicsObjectElement->m_intValue;
+ break;
+ }// switch(id(graphicsObjectElement))
+ }// for(; graphicsObjectElement; graphicsObjectElement = graphicsObjectElement->m_pBrother)
+ break;
+ }// case positionPredefKey:
+ case sizePredefKey:
+ {
+ if (graphicsObject->m_valueType != xmlListBegin) break;
+
+
+ XmlObject *graphicsObjectElement = graphicsObject->m_pFirstSon;
+ for(; graphicsObjectElement; graphicsObjectElement = graphicsObjectElement->m_pBrother)
+ {
+ switch(id(graphicsObjectElement))
+ {
+ case wPredefKey:
+ if (!typeDefined)
+ {
+ if(graphicsObjectElement->m_valueType == xmlDoubleValue)
+ w = graphicsObjectElement->m_doubleValue;
+ else if (graphicsObjectElement->m_valueType == xmlIntValue)
+ w = (int) graphicsObjectElement->m_intValue;
+ }
+ break;
+ case hPredefKey:
+ if (!typeDefined)
+ {
+ if(graphicsObjectElement->m_valueType == xmlDoubleValue)
+ h = graphicsObjectElement->m_doubleValue;
+ else if (graphicsObjectElement->m_valueType == xmlIntValue)
+ h = (int) graphicsObjectElement->m_intValue;
+ }
+ break;
+ case widthPredefKey:
+ if (!typeDefined)
+ {
+ if(graphicsObjectElement->m_valueType == xmlDoubleValue)
+ w = graphicsObjectElement->m_doubleValue;
+ else if (graphicsObjectElement->m_valueType == xmlIntValue)
+ w = (int) graphicsObjectElement->m_intValue;
+ }
+ break;
+ case heightPredefKey:
+ if (!typeDefined)
+ {
+ if(graphicsObjectElement->m_valueType == xmlDoubleValue)
+ h = graphicsObjectElement->m_doubleValue;
+ else if (graphicsObjectElement->m_valueType == xmlIntValue)
+ h = (int) graphicsObjectElement->m_intValue;
+ }
+ break;
+ }// switch(id(graphicsObjectElement))
+ }// for(; graphicsObjectElement; graphicsObjectElement = graphicsObjectElement->m_pBrother)
+
+ break;
+ }// case sizePredefKey:
+
+
+
+
+ }// switch(id(graphicsObject))
+ }// for(; graphicsObject; graphicsObject = graphicsObject->m_pBrother)
+
+
+ // create new node if necessary and assign attributes
+ if (mapToNode[vId] == 0) mapToNode[vId] = G.newNode();
+ AG.x(mapToNode[vId]) = x;
+ AG.y(mapToNode[vId]) = y;
+ if (w > 0) //skip negative width
+ AG.width (mapToNode[vId]) = w;
+ if (h > 0) // skip negative height
+ AG.height(mapToNode[vId]) = h;
+ AG.labelNode(mapToNode[vId]) = label;
+ break;
+
+ }// case nodePredefKey:
+
+
+
+
+
+ case edgePredefKey:
+ {
+ if (son->m_valueType != xmlListBegin) break;
+
+ // set attributes to default values
+ int sourceId = notDefined, targetId = notDefined;
+ bool backward = false;
+ // read all relevant attributes
+ XmlObject *graphicsObject = son->m_pFirstSon;
+ for(; graphicsObject; graphicsObject = graphicsObject->m_pBrother)
+ {
+ int i = 0;
+ switch(id(graphicsObject))
+ {
+ case namePredefKey:
+ if (graphicsObject->m_valueType == xmlStringValue)
+ label = graphicsObject->m_stringValue;
+ break;
+ case sourcePredefKey:
+ if (graphicsObject->m_valueType != xmlStringValue) break;
+ for (i = 0; i<= maxId;i++)
+ if (!strcmp(idMap[i],graphicsObject->m_stringValue))
+ sourceId = i;
+ break;
+
+ case targetPredefKey:
+ if (graphicsObject->m_valueType != xmlStringValue) break;
+ for (i = 0; i<= maxId;i++)
+ if (!strcmp(idMap[i],graphicsObject->m_stringValue))
+ targetId = i;
+ break;
+ case sensePredefKey:
+ if (graphicsObject->m_valueType != xmlStringValue) break;
+ if (!strcmp("BACKWARD",graphicsObject->m_stringValue))
+ backward = true;
+ case pathPredefKey:
+ {
+ if (graphicsObject->m_valueType != xmlListBegin) break;
+ DPoint dp;
+
+ XmlObject *graphicsObjectElement = graphicsObject->m_pFirstSon;
+ for(; graphicsObjectElement; graphicsObjectElement = graphicsObjectElement->m_pBrother)
+ {
+ switch(id(graphicsObjectElement))
+ {
+ case positionPredefKey:
+ {
+ if (graphicsObjectElement->m_valueType != xmlListBegin) break;
+ DPoint dp;
+
+ XmlObject *element = graphicsObjectElement->m_pFirstSon;
+ for(; element; element = element->m_pBrother)
+ {
+ switch(id(element))
+ {
+ case xPredefKey:
+ if(element->m_valueType == xmlDoubleValue)
+ dp.m_x = element->m_doubleValue;
+ else if (element->m_valueType == xmlIntValue)
+ dp.m_x = (int) element->m_intValue;
+ break;
+ case yPredefKey:
+ if(element->m_valueType == xmlDoubleValue)
+ dp.m_y = element->m_doubleValue;
+ else if (element->m_valueType == xmlIntValue)
+ dp.m_y = (int) element->m_intValue;
+ break;
+ }// switch(id(element))
+ }// for(; element; element = element->m_pBrother)
+ bends.pushBack(dp);
+ break;
+ }// case positionPredefKey:
+ }//switch(id(graphicsObjectElement))
+ }//for(; graphicsObjectElement; graphicsObjectElement = graphicsObjectElement->m_pBrother)
+ break;
+ }// case positionPredefKey:
+/*
+ case graphicsPredefKey:
+ if (graphicsObject->m_valueType != xmlListBegin) break;
+
+ XmlObject *graphicsObject = graphicsObject->m_pFirstSon;
+ for(; graphicsObject; graphicsObject = graphicsObject->m_pBrother) {
+ if(id(graphicsObject) == LinePredefKey &&
+ graphicsObject->m_valueType == xmlListBegin)
+ readLineAttribute(graphicsObject->m_pFirstSon,bends);
+ }
+*/
+ }// switch(id(graphicsObject))
+ }// for(; graphicsObject; graphicsObject = graphicsObject->m_pBrother)
+
+ // check if everything required is defined correctly
+ if (sourceId == notDefined || targetId == notDefined)
+ {
+ setError("source or target id not defined");
+ closeLabels(idMap,typeName);
+ return false;
+
+ }
+ else if (sourceId < minId || maxId < sourceId ||
+ targetId < minId || maxId < targetId)
+ {
+ setError("source or target id out of range");
+ closeLabels(idMap,typeName);
+ return false;
+ }
+
+ // create adjacent nodes if necessary and new edge
+ if (mapToNode[sourceId] == 0) mapToNode[sourceId] = G.newNode();
+ if (mapToNode[targetId] == 0) mapToNode[targetId] = G.newNode();
+
+ edge e;
+ if (backward)
+ e = G.newEdge(mapToNode[targetId],mapToNode[sourceId]);
+ else
+ e = G.newEdge(mapToNode[sourceId],mapToNode[targetId]);
+ AG.labelEdge(e) = label;
+ AG.bends(e).conc(bends);
+ break;
+
+ }// case edgePredefKey:
+
+ }// switch(id(son)) {
+ }
+ closeLabels(idMap,typeName);
+ return true;
+}
+
+
+void XmlParser::closeLabels(Array<char*> idMap, Array<char*> typeName)
+{
+ int i;
+ for (i = idMap.low(); i <= idMap.high();i++)
+ if (idMap[i])
+ delete[] idMap[i];
+ for (i = typeName.low(); i <= typeName.high();i++)
+ if (typeName[i])
+ delete[] typeName[i];
+}
+
+
+void XmlParser::readLineAttribute(XmlObject *object, DPolyline &dpl)
+{
+ dpl.clear();
+ for(; object; object = object->m_pBrother) {
+ if (id(object) == pointPredefKey && object->m_valueType == xmlListBegin) {
+ DPoint dp;
+
+ XmlObject *pointObject = object->m_pFirstSon;
+ for (; pointObject; pointObject = pointObject->m_pBrother) {
+ if (pointObject->m_valueType != xmlDoubleValue) continue;
+ if (id(pointObject) == xPredefKey)
+ dp.m_x = pointObject->m_doubleValue;
+ else if (id(pointObject) == yPredefKey)
+ dp.m_y = pointObject->m_doubleValue;
+ }
+
+ dpl.pushBack(dp);
+ }
+ }
+}
+
+
+void XmlParser::setError(const char *errorString)
+{
+ m_error = true;
+ m_errorString = errorString;
+}
+
+
+
+void XmlParser::indent(ostream &os, int d)
+{
+ for(int i = 1; i <= d; ++i)
+ os << " ";
+}
+
+/*
+void XmlParser::output(ostream &os, XmlObject *object, int d)
+{
+ for(; object; object = object->m_pBrother) {
+ indent(os,d); os << object->m_key->key();
+
+ switch(object->m_valueType) {
+ case xmlIntValue:
+ os << " " << object->m_intValue << "\n";
+ break;
+
+ case xmlDoubleValue:
+ os << " " << object->m_doubleValue << "\n";
+ break;
+
+ case xmlStringValue:
+ os << " \"" << object->m_stringValue << "\"\n";
+ break;
+
+ case xmlListBegin:
+ os << "\n";
+ output(os, object->m_pFirstSon, d+2);
+ break;
+ }
+ }
+}
+*/
+
+} // end namespace ogdf
diff --git a/ogdf/fileformats/XmlParser.h b/ogdf/fileformats/XmlParser.h
new file mode 100644
index 0000000..73aedc9
--- /dev/null
+++ b/ogdf/fileformats/XmlParser.h
@@ -0,0 +1,175 @@
+/*
+ * $Revision: 2564 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-07 00:03:48 +0200 (Sa, 07. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of class XmlParser.
+ *
+ * \author Sebastian Leipert and Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_XML_PARSER_H
+#define OGDF_XML_PARSER_H
+
+
+#include "../basic/Hashing.h"
+#include "../basic/String.h"
+#include "../basic/GraphAttributes.h"
+#include "XmlObject.h"
+#include "../basic/SList.h"
+
+
+namespace ogdf {
+
+
+
+//---------------------------------------------------------
+// XmlParser
+// reads XML file and constructs XML parse tree
+//---------------------------------------------------------
+class OGDF_EXPORT XmlParser {
+ Hashing<String,int> m_hashTable; // hash table for tags
+ int m_num;
+
+ istream *m_is;
+ bool m_error;
+ String m_errorString;
+
+ char *m_rLineBuffer, *m_lineBuffer, *m_pCurrent, *m_pStore, m_cStore;
+
+ int m_intSymbol; // integer attribute
+ double m_doubleSymbol; // double attribute
+ const char *m_stringSymbol; // string attribute
+ char *m_keyName; // Tag name
+ XmlKey m_keySymbol; // Tag name and Attribute Name in Hash Table
+ String m_longString;
+ bool m_eoTag; // end of Tag recognized
+
+ XmlObject *m_objectTree; // root node of XML parse tree
+
+ bool m_doCheck;
+
+ SList<char*> m_objectBody;
+
+public:
+ // predefined id constants for all used keys
+ enum PredefinedKey { idPredefKey = 0, labelPredefKey, CreatorPredefKey,
+ namePredefKey, graphPredefKey, versionPredefKey, directedPredefKey,
+ nodePredefKey, edgePredefKey, graphicsPredefKey, xPredefKey,
+ yPredefKey, wPredefKey, hPredefKey, nodetypePredefKey, edgetypePredefKey,
+ typePredefKey, widthPredefKey, heightPredefKey, sizePredefKey,
+ positionPredefKey, pathPredefKey,
+ sourcePredefKey, targetPredefKey, sensePredefKey, arrowPredefKey, LinePredefKey,
+ pointPredefKey, NEXTPREDEFKEY };
+
+ // construction: creates object tree
+ // sets m_error flag if an error occured
+ XmlParser(const char *fileName, bool doCheck = false);
+ XmlParser(istream &is, bool doCheck = false);
+
+ // destruction: destroys object tree
+ ~XmlParser();
+
+ // returns root object
+ XmlObject *root() { return m_objectTree; }
+
+ // id of a string in hash table; -1 if not contained
+ int getId(const String &tag) const {
+ HashElement<String,int> *it = m_hashTable.lookup(tag);
+ return (it != 0) ? it->info() : -1;
+ }
+
+ // returns id of object
+ int id(XmlObject *object) const { return object->m_key->info(); }
+
+ // true <=> an error in XML files has been detected
+ bool error() const { return m_error; }
+ // returns error message
+ const String &errorString() const { return m_errorString; }
+
+ // creates graph from XML parse tree
+ bool read(Graph &G);
+ // creates attributed graph from XML parse tree
+ bool read(Graph &G, GraphAttributes &AG);
+
+private:
+ void createObjectTree(istream &is, bool doCheck);
+ void initPredefinedKeys();
+ void setError(const char *errorString);
+
+ XmlObject *parseList(XmlObjectType closingKey, XmlObjectType errorKey, const char *objectBodyName);
+ XmlObjectType getNextSymbol();
+ bool getLine();
+
+ XmlKey hashString(const String &str);
+
+ XmlObject *getNodeIdRange(
+ int &minId,
+ int &maxId,
+ int &nodetypeCount,
+ XmlObject *graphObject);
+
+ bool makeIdMap(
+ int maxId,
+ Array<char*> &idMap,
+ int nodetypeCount,
+ Array<char*> & typeName,
+ Array<double> &typeWidth,
+ Array<double> &typeHeight,
+ XmlObject *graphObject);
+
+ void closeLabels(Array<char*> idMap, Array<char*> typeName);
+
+ void readLineAttribute(XmlObject *object, DPolyline &dpl);
+
+ void destroyObjectList(XmlObject *object);
+
+ void indent(ostream &os, int d);
+ void output(ostream &os, XmlObject *object, int d);
+
+};
+
+
+} // end namespace ogdf
+
+#endif
diff --git a/ogdf/internal/basic/MallocMemoryAllocator.h b/ogdf/internal/basic/MallocMemoryAllocator.h
new file mode 100644
index 0000000..315d474
--- /dev/null
+++ b/ogdf/internal/basic/MallocMemoryAllocator.h
@@ -0,0 +1,118 @@
+/*
+ * $Revision: 2523 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-02 20:59:27 +0200 (Mon, 02 Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of memory manager for allocating small
+ * pieces of memory
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_MALLOC_MEMORY_ALLOCATOR_H
+#define OGDF_MALLOC_MEMORY_ALLOCATOR_H
+
+
+namespace ogdf {
+
+//! Implements a simple memory manager using \c malloc() and \c free().
+class OGDF_EXPORT MallocMemoryAllocator
+{
+ struct MemElem { MemElem *m_next; };
+ typedef MemElem *MemElemPtr;
+
+public:
+
+ MallocMemoryAllocator() { }
+ ~MallocMemoryAllocator() { }
+
+
+ static void init() { }
+ static void initThread() { }
+ static void cleanup() { }
+
+ static bool checkSize(size_t /* nBytes */) { return true; }
+
+ //! Allocates memory of size \a nBytes.
+ static void *allocate(size_t nBytes, const char *, int) { return allocate(nBytes); }
+
+ //! Allocates memory of size \a nBytes.
+ static void *allocate(size_t nBytes)
+ {
+ void *p = malloc(nBytes);
+ if (OGDF_UNLIKELY(p == 0)) OGDF_THROW(ogdf::InsufficientMemoryException);
+ return p;
+ }
+
+
+ //! Deallocates memory at address \a p which is of size \a nBytes.
+ static void deallocate(size_t /* nBytes */, void *p) { free(p); }
+
+ //! Deallocate a complete list starting at \a pHead and ending at \a pTail.
+ /**
+ * The elements are assumed to be chained using the first word of each element and
+ * elements are of size \a nBytes.
+ */
+ static void deallocateList(size_t /* nBytes */, void *pHead, void *pTail)
+ {
+ MemElemPtr q, pStop = MemElemPtr(pTail)->m_next;
+ while (pHead != pStop) {
+ q = MemElemPtr(pHead)->m_next;
+ free(pHead);
+ pHead = q;
+ }
+ }
+
+ static void flushPool() { }
+ static void flushPool(__uint16 /* nBytes */) { }
+
+ //! Always returns 0, since no blocks are allocated.
+ static size_t memoryAllocatedInBlocks() { return 0; }
+
+ //! Always returns 0, since no blocks are allocated.
+ static size_t memoryInFreelist() { return 0; }
+};
+
+} // namespace ogdf
+
+#endif
diff --git a/ogdf/internal/basic/PoolMemoryAllocator.cpp b/ogdf/internal/basic/PoolMemoryAllocator.cpp
new file mode 100644
index 0000000..e42ad87
--- /dev/null
+++ b/ogdf/internal/basic/PoolMemoryAllocator.cpp
@@ -0,0 +1,448 @@
+/*
+ * $Revision: 2549 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-04 23:09:19 +0200 (Mi, 04. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of memory manager for more efficiently
+ * allocating small pieces of memory
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "../../basic/basic.h"
+
+
+namespace ogdf {
+
+
+struct PoolMemoryAllocator::PoolVector
+{
+ MemElemPtr m_pool[ePoolVectorLength];
+ PoolVector *m_prev;
+};
+
+struct PoolMemoryAllocator::PoolElement
+{
+ PoolVector *m_currentVector;
+ MemElemPtr m_restHead;
+ MemElemPtr m_restTail;
+ __int16 m_index;
+ __int16 m_restCount;
+};
+
+struct PoolMemoryAllocator::BlockChain
+{
+ char m_fill[eBlockSize-sizeof(void*)];
+ BlockChain *m_next;
+};
+
+
+PoolMemoryAllocator::PoolElement PoolMemoryAllocator::s_pool[eTableSize];
+PoolMemoryAllocator::MemElemPtr PoolMemoryAllocator::s_freeVectors;
+PoolMemoryAllocator::BlockChainPtr PoolMemoryAllocator::s_blocks;
+
+#ifdef OGDF_MEMORY_POOL_NTS
+PoolMemoryAllocator::MemElemPtr PoolMemoryAllocator::s_tp[eTableSize];
+#elif defined(OGDF_NO_COMPILER_TLS)
+CriticalSection *PoolMemoryAllocator::s_criticalSection;
+pthread_key_t PoolMemoryAllocator::s_tpKey;
+#else
+CriticalSection *PoolMemoryAllocator::s_criticalSection;
+OGDF_DECL_THREAD PoolMemoryAllocator::MemElemPtr PoolMemoryAllocator::s_tp[eTableSize];
+#endif
+
+
+void PoolMemoryAllocator::init()
+{
+#ifndef OGDF_MEMORY_POOL_NTS
+#ifdef OGDF_NO_COMPILER_TLS
+ pthread_key_create(&s_tpKey,NULL);
+#endif
+ s_criticalSection = new CriticalSection(500);
+#endif
+ initThread();
+}
+
+
+void PoolMemoryAllocator::initThread() {
+#if !defined(OGDF_MEMORY_POOL_NTS) && defined(OGDF_NO_COMPILER_TLS)
+ pthread_setspecific(s_tpKey,calloc(eTableSize,sizeof(MemElemPtr)));
+#endif
+}
+
+
+void PoolMemoryAllocator::cleanup()
+{
+ BlockChainPtr p = s_blocks;
+ while(p != 0) {
+ BlockChainPtr pNext = p->m_next;
+ free(p);
+ p = pNext;
+ }
+
+#ifndef OGDF_MEMORY_POOL_NTS
+#ifdef OGDF_NO_COMPILER_TLS
+ pthread_key_delete(s_tpKey);
+#endif
+ delete s_criticalSection;
+#endif
+}
+
+
+bool PoolMemoryAllocator::checkSize(size_t nBytes) {
+ return nBytes < eTableSize;
+}
+
+
+void *PoolMemoryAllocator::allocate(size_t nBytes) {
+#if !defined(OGDF_MEMORY_POOL_NTS) && defined(OGDF_NO_COMPILER_TLS)
+ MemElemPtr *pFreeBytes = ((MemElemPtr*)pthread_getspecific(s_tpKey))+nBytes;
+#else
+ MemElemPtr *pFreeBytes = s_tp+nBytes;
+#endif
+ if (OGDF_LIKELY(*pFreeBytes != 0)) {
+ MemElemPtr p = *pFreeBytes;
+ *pFreeBytes = p->m_next;
+ return p;
+ } else {
+ return fillPool(*pFreeBytes,__uint16(nBytes));
+ }
+}
+
+
+void PoolMemoryAllocator::deallocate(size_t nBytes, void *p) {
+#if !defined(OGDF_MEMORY_POOL_NTS) && defined(OGDF_NO_COMPILER_TLS)
+ MemElemPtr *pFreeBytes = ((MemElemPtr*)pthread_getspecific(s_tpKey))+nBytes;
+#else
+ MemElemPtr *pFreeBytes = s_tp+nBytes;
+#endif
+ MemElemPtr(p)->m_next = *pFreeBytes;
+ *pFreeBytes = MemElemPtr(p);
+}
+
+
+void PoolMemoryAllocator::deallocateList(size_t nBytes, void *pHead, void *pTail) {
+#if !defined(OGDF_MEMORY_POOL_NTS) && defined(OGDF_NO_COMPILER_TLS)
+ MemElemPtr *pFreeBytes = ((MemElemPtr*)pthread_getspecific(s_tpKey))+nBytes;
+#else
+ MemElemPtr *pFreeBytes = s_tp+nBytes;
+#endif
+ MemElemPtr(pTail)->m_next = *pFreeBytes;
+ *pFreeBytes = MemElemPtr(pHead);
+}
+
+
+PoolMemoryAllocator::MemElemExPtr
+PoolMemoryAllocator::collectGroups(
+ __uint16 nBytes,
+ MemElemPtr &pRestHead,
+ MemElemPtr &pRestTail,
+ int &nRest)
+{
+ int n = slicesPerBlock(nBytes);
+ pRestHead = 0;
+
+#if !defined(OGDF_MEMORY_POOL_NTS) && defined(OGDF_NO_COMPILER_TLS)
+ MemElemPtr p = ((MemElemPtr*)pthread_getspecific(s_tpKey))[nBytes];
+#else
+ MemElemPtr p = s_tp[nBytes];
+#endif
+ MemElemExPtr pStart = 0, pLast = 0;
+ while(p != 0)
+ {
+ int i = 0;
+ MemElemPtr pHead = p, pTail;
+ do {
+ pTail = p;
+ p = p->m_next;
+ } while(++i < n && p != 0);
+
+ pTail->m_next = 0;
+ if(i == n) {
+ if(pStart == 0)
+ pStart = MemElemExPtr(pHead);
+ else
+ pLast->m_down = MemElemExPtr(pHead);
+ pLast = MemElemExPtr(pHead);
+
+ } else {
+ pRestHead = pHead;
+ pRestTail = pTail;
+ nRest = i;
+ }
+ }
+ if (pLast)
+ pLast->m_down = 0;
+
+ return pStart;
+}
+
+
+void PoolMemoryAllocator::flushPoolSmall(__uint16 nBytes)
+{
+ int n = slicesPerBlock(nBytes < eMinBytes ? int(eMinBytes) : int(nBytes));
+ PoolElement &pe = s_pool[nBytes];
+
+#if !defined(OGDF_MEMORY_POOL_NTS) && defined(OGDF_NO_COMPILER_TLS)
+ MemElemPtr p = ((MemElemPtr*)pthread_getspecific(s_tpKey))[nBytes];
+#else
+ MemElemPtr p = s_tp[nBytes];
+#endif
+ if(pe.m_restHead != 0) {
+ pe.m_restTail->m_next = p;
+ p = pe.m_restHead;
+ pe.m_restHead = 0;
+ }
+
+ while(p != 0)
+ {
+ int i = 0;
+ MemElemPtr pHead = p, pTail;
+ do {
+ pTail = p;
+ p = p->m_next;
+ } while(++i < n && p != 0);
+
+ if(i == n) {
+ incVectorSlot(pe);
+ pe.m_currentVector->m_pool[pe.m_index] = pHead;
+
+ } else {
+ pe.m_restHead = pHead;
+ pe.m_restTail = pTail;
+ pe.m_restCount = i;
+ }
+ }
+}
+
+
+void PoolMemoryAllocator::incVectorSlot(PoolElement &pe)
+{
+ if(pe.m_currentVector == 0 || ++pe.m_index == ePoolVectorLength) {
+ if(s_freeVectors == 0)
+ s_freeVectors = allocateBlock(sizeof(PoolVector));
+
+ PoolVector *pv = (PoolVector *)s_freeVectors;
+ s_freeVectors = MemElemPtr(pv)->m_next;
+ pe.m_currentVector = pv;
+ pe.m_index = 0;
+ }
+}
+
+
+void PoolMemoryAllocator::flushPool(__uint16 nBytes)
+{
+#ifndef OGDF_MEMORY_POOL_NTS
+ if(nBytes >= sizeof(MemElemEx)) {
+ MemElemPtr pRestHead, pRestTail;
+ int nRest;
+ MemElemExPtr pStart = collectGroups(nBytes, pRestHead, pRestTail, nRest);
+
+ s_criticalSection->enter();
+ PoolElement &pe = s_pool[nBytes];
+
+ while(pStart != 0) {
+ incVectorSlot(pe);
+ pe.m_currentVector->m_pool[pe.m_index] = MemElemPtr(pStart);
+ pStart = pStart->m_down;
+ }
+ if(pRestHead != 0) {
+ int n = slicesPerBlock(nBytes);
+ pRestTail->m_next = pe.m_restTail;
+ int nTotal = nRest + pe.m_restCount;
+ if(nTotal >= n) {
+ MemElemPtr p = pe.m_restHead;
+ int i = n-nRest;
+ while(--i > 0)
+ p = p->m_next;
+ pe.m_restHead = p->m_next;
+ pe.m_restCount = nTotal-n;
+ incVectorSlot(pe);
+ pe.m_currentVector->m_pool[pe.m_index] = pRestHead;
+ } else {
+ pe.m_restHead = pRestHead;
+ pe.m_restCount = nTotal;
+ }
+ }
+ s_criticalSection->leave();
+
+ } else {
+ s_criticalSection->enter();
+ flushPoolSmall(nBytes);
+ s_criticalSection->leave();
+ }
+#endif
+}
+
+
+void PoolMemoryAllocator::flushPool()
+{
+#ifndef OGDF_MEMORY_POOL_NTS
+ for(__uint16 nBytes = 1; nBytes < eTableSize; ++nBytes) {
+#ifdef OGDF_NO_COMPILER_TLS
+ MemElemPtr p = ((MemElemPtr*)pthread_getspecific(s_tpKey))[nBytes];
+#else
+ MemElemPtr p = s_tp[nBytes];
+#endif
+ if(p != 0)
+ flushPool(nBytes);
+ }
+#endif
+}
+
+
+void *PoolMemoryAllocator::fillPool(MemElemPtr &pFreeBytes, __uint16 nBytes)
+{
+#ifdef OGDF_MEMORY_POOL_NTS
+ pFreeBytes = allocateBlock(nBytes);
+#else
+
+ s_criticalSection->enter();
+
+ PoolElement &pe = s_pool[nBytes];
+ if(pe.m_currentVector != 0) {
+ pFreeBytes = pe.m_currentVector->m_pool[pe.m_index];
+ if(--pe.m_index < 0) {
+ PoolVector *pV = pe.m_currentVector;
+ pe.m_currentVector = pV->m_prev;
+ pe.m_index = ePoolVectorLength-1;
+ MemElemPtr(pV)->m_next = s_freeVectors;
+ s_freeVectors = MemElemPtr(pV);
+ }
+ s_criticalSection->leave();
+
+ } else {
+ s_criticalSection->leave();
+ pFreeBytes = allocateBlock(nBytes);
+ }
+#endif
+
+ MemElemPtr p = pFreeBytes;
+ pFreeBytes = p->m_next;
+ return p;
+}
+
+
+// __asm __volatile ("":::"memory") GLIBC
+
+
+PoolMemoryAllocator::MemElemPtr
+PoolMemoryAllocator::allocateBlock(__uint16 nBytes)
+{
+ if(nBytes < eMinBytes)
+ nBytes = eMinBytes;
+
+ MemElemPtr pBlock = (MemElemPtr) malloc(eBlockSize);
+
+ // we altogether create nSlices slices
+ int nWords;
+ int nSlices = slicesPerBlock(nBytes,nWords);
+
+ MemElemPtr pHead = MemElemPtr(pBlock);
+ BlockChainPtr(pBlock)->m_next = s_blocks;
+ s_blocks = BlockChainPtr(pBlock);
+
+ do {
+ pBlock = pBlock->m_next = pBlock+nWords;
+ } while(--nSlices > 1);
+ MemElemPtr(pBlock)->m_next = 0;
+
+ return pHead;
+}
+
+
+size_t PoolMemoryAllocator::memoryAllocatedInBlocks()
+{
+#ifndef OGDF_MEMORY_POOL_NTS
+ s_criticalSection->enter();
+#endif
+
+ size_t nBlocks = 0;
+ for (BlockChainPtr p = s_blocks; p != 0; p = p->m_next)
+ ++nBlocks;
+
+#ifndef OGDF_MEMORY_POOL_NTS
+ s_criticalSection->leave();
+#endif
+
+ return nBlocks * eBlockSize;
+}
+
+
+size_t PoolMemoryAllocator::memoryInGlobalFreeList()
+{
+#ifndef OGDF_MEMORY_POOL_NTS
+ s_criticalSection->enter();
+#endif
+
+ size_t bytesFree = 0;
+ for (int sz = 1; sz < eTableSize; ++sz)
+ {
+ const PoolElement &pe = s_pool[sz];
+ PoolVector *pv = pe.m_currentVector;
+ for(; pv != 0; pv = pv->m_prev)
+ bytesFree += ePoolVectorLength*sz;
+ if(pe.m_restHead != 0)
+ bytesFree += pe.m_restCount;
+ }
+
+#ifndef OGDF_MEMORY_POOL_NTS
+ s_criticalSection->leave();
+#endif
+
+ return bytesFree;
+}
+
+
+size_t PoolMemoryAllocator::memoryInThreadFreeList()
+{
+ size_t bytesFree = 0;
+ for (int sz = 1; sz < eTableSize; ++sz)
+ {
+#if !defined(OGDF_MEMORY_POOL_NTS) && defined(OGDF_NO_COMPILER_TLS)
+ MemElemPtr p = ((MemElemPtr*)pthread_getspecific(s_tpKey))[sz];
+#else
+ MemElemPtr p = s_tp[sz];
+#endif
+ for(; p != 0; p = p->m_next)
+ bytesFree += sz;
+ }
+
+ return bytesFree;
+}
+
+
+}
diff --git a/ogdf/internal/basic/PoolMemoryAllocator.h b/ogdf/internal/basic/PoolMemoryAllocator.h
new file mode 100644
index 0000000..b112d67
--- /dev/null
+++ b/ogdf/internal/basic/PoolMemoryAllocator.h
@@ -0,0 +1,191 @@
+/*
+ * $Revision: 2523 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-02 20:59:27 +0200 (Mon, 02 Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of memory manager for allocating small
+ * pieces of memory
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_POOL_MEMORY_ALLOCATOR_H
+#define OGDF_POOL_MEMORY_ALLOCATOR_H
+
+#ifndef OGDF_MEMORY_POOL_NTS
+#include "../../basic/CriticalSection.h"
+#else
+#include "../../basic/System.h"
+#endif
+
+
+namespace ogdf {
+
+
+//! The class \a PoolAllocator represents ogdf's pool memory allocator.
+/**
+ * <H3>Usage:</H3>
+ *
+ * Adding the macro \c #OGDF_NEW_DELETE in a class declaration overloads
+ * new and delete operators of that class such that they use this
+ * memory allocator. This is useful if the size of a class is less than
+ * \c PoolAllocator::eTableSize bytes.
+ *
+ * Another benefit from the OGDF memory-manager is that it throws an
+ * InsufficientMemoryException if no more memory is available. Hence
+ * it is legal to omit checking if new returned 0 as long as stack-
+ * unwinding frees all memory allocated so far.
+ * It is also possible to make the usual \c new operator behave the same
+ * way (throwing an InsufficientMemoryException) by defining the
+ * macro \c #OGDF_MALLOC_NEW_DELETE in a class declaration.
+ */
+
+class PoolMemoryAllocator
+{
+ struct MemElem {
+ MemElem *m_next;
+ };
+ struct MemElemEx {
+ MemElemEx *m_next;
+ MemElemEx *m_down;
+ };
+
+ typedef MemElem *MemElemPtr;
+ typedef MemElemEx *MemElemExPtr;
+
+ struct PoolVector;
+ struct PoolElement;
+ struct BlockChain;
+ typedef BlockChain *BlockChainPtr;
+
+public:
+ enum {
+ eMinBytes = sizeof(MemElemPtr),
+ eTableSize = 256,
+ eBlockSize = 8192,
+ ePoolVectorLength = 15
+ };
+
+ PoolMemoryAllocator() { }
+ ~PoolMemoryAllocator() { }
+
+ //! Initializes the memory manager.
+ static OGDF_EXPORT void init();
+
+ static OGDF_EXPORT void initThread();
+
+ //! Frees all memory blocks allocated by the memory manager.
+ static OGDF_EXPORT void cleanup();
+
+ static OGDF_EXPORT bool checkSize(size_t nBytes);
+
+ //! Allocates memory of size \a nBytes.
+ static OGDF_EXPORT void *allocate(size_t nBytes);
+
+ //! Deallocates memory at address \a p which is of size \a nBytes.
+ static OGDF_EXPORT void deallocate(size_t nBytes, void *p);
+
+ //! Deallocate a complete list starting at \a pHead and ending at \a pTail.
+ /**
+ * The elements are assumed to be chained using the first word of each element and
+ * elements are of size \a nBytes. This is much more efficient the deallocating
+ * each element separately, since the whole chain can be concatenated with the
+ * free list, requiring only constant effort.
+ */
+ static OGDF_EXPORT void deallocateList(size_t nBytes, void *pHead, void *pTail);
+
+ static OGDF_EXPORT void flushPool();
+ static OGDF_EXPORT void flushPool(__uint16 nBytes);
+
+ //! Returns the total amount of memory (in bytes) allocated from the system.
+ static OGDF_EXPORT size_t memoryAllocatedInBlocks();
+
+ //! Returns the total amount of memory (in bytes) available in the global free lists.
+ static OGDF_EXPORT size_t memoryInGlobalFreeList();
+
+ //! Returns the total amount of memory (in bytes) available in the thread's free lists.
+ static OGDF_EXPORT size_t memoryInThreadFreeList();
+
+private:
+ static int slicesPerBlock(__uint16 nBytes) {
+ int nWords;
+ return slicesPerBlock(nBytes,nWords);
+ }
+
+ static int slicesPerBlock(__uint16 nBytes, int &nWords) {
+ nWords = (nBytes+sizeof(MemElemPtr)-1)/sizeof(MemElemPtr);
+ return (eBlockSize-sizeof(MemElemPtr))/(nWords*sizeof(MemElemPtr));
+ }
+
+ static void incVectorSlot(PoolElement &pe);
+
+ static void flushPoolSmall(__uint16 nBytes);
+ static MemElemExPtr collectGroups(
+ __uint16 nBytes,
+ MemElemPtr &pRestHead,
+ MemElemPtr &pRestTail,
+ int &nRest);
+
+ static void *fillPool(MemElemPtr &pFreeBytes, __uint16 nBytes);
+
+ static MemElemPtr allocateBlock(__uint16 nBytes);
+
+ static PoolElement s_pool[eTableSize];
+ static MemElemPtr s_freeVectors;
+ static BlockChainPtr s_blocks;
+
+#ifdef OGDF_MEMORY_POOL_NTS
+ static MemElemPtr s_tp[eTableSize];
+#elif defined(OGDF_NO_COMPILER_TLS)
+ static CriticalSection *s_criticalSection;
+ static pthread_key_t s_tpKey;
+#else
+ static CriticalSection *s_criticalSection;
+ static OGDF_DECL_THREAD MemElemPtr s_tp[eTableSize];
+#endif
+};
+
+
+}
+
+#endif
diff --git a/ogdf/internal/basic/list_templates.h b/ogdf/internal/basic/list_templates.h
new file mode 100644
index 0000000..89ee80e
--- /dev/null
+++ b/ogdf/internal/basic/list_templates.h
@@ -0,0 +1,101 @@
+/*
+ * $Revision: 2523 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-02 20:59:27 +0200 (Mon, 02 Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of algorithms as templates working with
+ * different list types
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_LIST_TEMPLATES_H
+#define OGDF_LIST_TEMPLATES_H
+
+
+#include "../../basic/Array.h"
+
+
+namespace ogdf {
+
+// sorts list L using quicksort
+template<class LIST>
+void quicksortTemplate(LIST &L)
+{
+ const int n = L.size();
+ Array<typename LIST::value_type> A(n);
+
+ int i = 0;
+ typename LIST::iterator it;
+ for (it = L.begin(); it.valid(); ++it)
+ A[i++] = *it;
+
+ A.quicksort();
+
+ for (i = 0, it = L.begin(); i < n; i++)
+ *it++ = A[i];
+}
+
+
+// sorts list L using quicksort and compare element comp
+template<class LIST, class COMPARER>
+void quicksortTemplate(LIST &L, COMPARER &comp)
+{
+ const int n = L.size();
+ Array<typename LIST::value_type> A(n);
+
+ int i = 0;
+ typename LIST::iterator it;
+ for (it = L.begin(); it.valid(); ++it)
+ A[i++] = *it;
+
+ A.quicksort(comp);
+
+ for (i = 0, it = L.begin(); i < n; i++)
+ *it++ = A[i];
+}
+
+
+} // end namespace ogdf
+
+#endif
diff --git a/ogdf/internal/energybased/EdgeAttributes.cpp b/ogdf/internal/energybased/EdgeAttributes.cpp
new file mode 100644
index 0000000..9995406
--- /dev/null
+++ b/ogdf/internal/energybased/EdgeAttributes.cpp
@@ -0,0 +1,87 @@
+/*
+ * $Revision: 2552 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-05 16:45:20 +0200 (Do, 05. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of class EdgeAttributes.
+ *
+ * \author Stefan Hachul
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "EdgeAttributes.h"
+
+
+namespace ogdf {
+
+ostream &operator<< (ostream & output, const EdgeAttributes & A)
+{
+ output <<"length: "<< A.length;
+ output<<" index of original edge ";
+ if (A.e_original == NULL)
+ output <<"NULL";
+ else output<<A.e_original->index();
+ output<<" index of subgraph edge ";
+ if (A.e_subgraph == NULL)
+ output <<"NULL";
+ if (A.moon_edge)
+ output<<" is moon edge ";
+ else
+ output <<" no moon edge ";
+ if (A.extra_edge)
+ output<<" is extra edge ";
+ else
+ output <<" no extra edge ";
+ return output;
+}
+
+
+istream &operator>> (istream & input, EdgeAttributes & A)
+{
+ input >> A.length;
+ return input;
+}
+
+
+EdgeAttributes::EdgeAttributes()
+{
+ length = 0;
+ e_original = NULL;
+ e_subgraph = NULL;
+ moon_edge = false;
+ extra_edge = false;
+}
+
+}//namespace ogdf
diff --git a/ogdf/internal/energybased/EdgeAttributes.h b/ogdf/internal/energybased/EdgeAttributes.h
new file mode 100644
index 0000000..5bf532e
--- /dev/null
+++ b/ogdf/internal/energybased/EdgeAttributes.h
@@ -0,0 +1,121 @@
+/*
+ * $Revision: 2523 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-02 20:59:27 +0200 (Mon, 02 Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of class EdgeAttributes.
+ *
+ * \author Stefan Hachul
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_EDGE_ATTRIBUTES_H
+#define OGDF_EDGE_ATTRIBUTES_H
+
+#include "../../basic/geometry.h"
+#include "../../basic/Graph.h"
+
+namespace ogdf {
+
+
+class OGDF_EXPORT EdgeAttributes
+{
+ //helping data structure that stores the graphical attributes of an edge
+ //that are needed for the force-directed algorithms.
+
+ //outputstream for EdgeAttributes
+ friend ostream &operator<< (ostream &,const EdgeAttributes &);
+
+ //inputstream for EdgeAttributes
+ friend istream &operator>> (istream &,EdgeAttributes &);
+
+public:
+
+ EdgeAttributes(); //constructor
+ ~EdgeAttributes() { } //destructor
+
+ void set_EdgeAttributes(double l, edge e_orig, edge e_sub)
+ {
+ length = l;
+ e_original = e_orig;
+ e_subgraph = e_sub;
+ }
+
+ void set_length(double l) { length = l; }
+ double get_length() const { return length; }
+
+
+ //needed for the divide et impera step in FMMM
+
+ void set_original_edge (edge e) { e_original = e; }
+ void set_subgraph_edge (edge e) { e_subgraph = e; }
+ edge get_original_edge() const { return e_original; }
+ edge get_subgraph_edge() const { return e_subgraph; }
+
+ //needed for the preprocessing step in FMMM (set/get_original_edge are needed, too)
+
+ void set_copy_edge (edge e) {e_subgraph = e;}
+ edge get_copy_edge() const {return e_subgraph;}
+
+ //needed for multilevel step
+
+ void set_higher_level_edge (edge e) { e_subgraph = e; }
+ edge get_higher_level_edge() const { return e_subgraph; }
+ bool is_moon_edge() const { return moon_edge; }
+ void make_moon_edge() { moon_edge = true; }
+ bool is_extra_edge() const { return extra_edge; }
+ void make_extra_edge() { extra_edge = true; }
+ void mark_as_normal_edge() { extra_edge = false; }
+ void init_mult_values() { e_subgraph = NULL; moon_edge = false; }
+
+private:
+ double length;
+ edge e_original;
+ edge e_subgraph;
+ bool moon_edge; //indicates if this edge is associasted with a moon node
+ bool extra_edge;//indicates if this edge is an extra edge that is added to
+ //enforce few edge crossings
+};
+
+}//namespace ogdf
+#endif
+
diff --git a/ogdf/internal/energybased/FruchtermanReingold.cpp b/ogdf/internal/energybased/FruchtermanReingold.cpp
new file mode 100644
index 0000000..ce73cd7
--- /dev/null
+++ b/ogdf/internal/energybased/FruchtermanReingold.cpp
@@ -0,0 +1,269 @@
+/*
+ * $Revision: 2552 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-05 16:45:20 +0200 (Do, 05. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of class FruchtermanReingold (computation of forces).
+ *
+ * \author Stefan Hachul
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "FruchtermanReingold.h"
+
+#include "../../energybased/numexcept.h"
+#include "../../basic/Array2D.h"
+
+
+namespace ogdf {
+
+FruchtermanReingold::FruchtermanReingold()
+{
+ grid_quotient(2);
+}
+
+
+void FruchtermanReingold::calculate_exact_repulsive_forces(
+ const Graph &G,
+ NodeArray<NodeAttributes> &A,
+ NodeArray<DPoint>& F_rep)
+{
+ //naive algorithm by Fruchterman & Reingold
+ numexcept N;
+ node v,u;
+ DPoint f_rep_u_on_v;
+ DPoint vector_v_minus_u;
+ DPoint pos_u,pos_v;
+ DPoint nullpoint (0,0);
+ double norm_v_minus_u;
+ long node_number = G.numberOfNodes();
+ Array<node> array_of_the_nodes (node_number+1);
+ long counter = 1;
+ long i,j;
+ double scalar;
+
+ forall_nodes(v,G)
+ F_rep[v]= nullpoint;
+
+ forall_nodes(v,G)
+ {
+ array_of_the_nodes[counter]=v;
+ counter++;
+ }
+
+ for(i = 1; i<node_number;i++)
+ for(j = i+1;j<=node_number;j++)
+ {
+ u = array_of_the_nodes[i];
+ v = array_of_the_nodes[j];
+ pos_u = A[u].get_position();
+ pos_v = A[v].get_position();
+ if (pos_u == pos_v)
+ {//if2 (Exception handling if two nodes have the same position)
+ pos_u = N.choose_distinct_random_point_in_radius_epsilon(pos_u);
+ }//if2
+ vector_v_minus_u = pos_v - pos_u;
+ norm_v_minus_u = vector_v_minus_u.norm();
+ if(!N.f_rep_near_machine_precision(norm_v_minus_u,f_rep_u_on_v))
+ {
+ scalar = f_rep_scalar(norm_v_minus_u)/norm_v_minus_u ;
+ f_rep_u_on_v.m_x = scalar * vector_v_minus_u.m_x;
+ f_rep_u_on_v.m_y = scalar * vector_v_minus_u.m_y;
+ }
+ F_rep[v] = F_rep[v] + f_rep_u_on_v;
+ F_rep[u] = F_rep[u] - f_rep_u_on_v;
+ }
+}
+
+
+void FruchtermanReingold::calculate_approx_repulsive_forces(
+ const Graph &G,
+ NodeArray<NodeAttributes> &A,
+ NodeArray<DPoint>& F_rep)
+{
+ //GRID algorithm by Fruchterman & Reingold
+ numexcept N;
+ List<IPoint> neighbour_boxes;
+ List<node> neighbour_box;
+ IPoint act_neighbour_box;
+ IPoint neighbour;
+ DPoint f_rep_u_on_v;
+ DPoint vector_v_minus_u;
+ DPoint nullpoint (0,0);
+ DPoint pos_u,pos_v;
+ double norm_v_minus_u;
+ double scalar;
+
+ int i,j,act_i,act_j,k,l,length;
+ node u,v;
+ double x,y,gridboxlength;//length of a box in the GRID
+ int x_index,y_index;
+
+ //init F_rep
+ forall_nodes(v,G)
+ F_rep[v]= nullpoint;
+
+ //init max_gridindex and set contained_nodes;
+
+ max_gridindex = static_cast<int> (sqrt(double(G.numberOfNodes()))/grid_quotient())-1;
+ max_gridindex = ((max_gridindex > 0)? max_gridindex : 0);
+ Array2D<List<node> > contained_nodes (0,max_gridindex, 0, max_gridindex);
+
+ for(i=0;i<= max_gridindex;i++)
+ for(j=0;j<= max_gridindex;j++)
+ {
+ contained_nodes(i,j).clear();
+ }
+
+ gridboxlength = boxlength/(max_gridindex+1);
+ forall_nodes(v,G)
+ {
+ x = A[v].get_x()-down_left_corner.m_x;//shift comput. box to nullpoint
+ y = A[v].get_y()-down_left_corner.m_y;
+ x_index = static_cast<int>(x/gridboxlength);
+ y_index = static_cast<int>(y/gridboxlength);
+ contained_nodes(x_index,y_index).pushBack(v);
+ }
+
+ //force calculation
+
+ for(i=0;i<= max_gridindex;i++)
+ for(j=0;j<= max_gridindex;j++)
+ {
+ //step1: calculate forces inside contained_nodes(i,j)
+
+ length = contained_nodes(i,j).size();
+ Array<node> nodearray_i_j (length+1);
+ k = 1;
+ forall_listiterators(node, v_it,contained_nodes(i,j))
+ {
+ nodearray_i_j[k]= *v_it;
+ k++;
+ }
+
+ for(k = 1; k<length;k++)
+ for(l = k+1;l<=length;l++)
+ {
+ u = nodearray_i_j[k];
+ v = nodearray_i_j[l];
+ pos_u = A[u].get_position();
+ pos_v = A[v].get_position();
+ if (pos_u == pos_v)
+ {//if2 (Exception handling if two nodes have the same position)
+ pos_u = N.choose_distinct_random_point_in_radius_epsilon(pos_u);
+ }//if2
+ vector_v_minus_u = pos_v - pos_u;
+ norm_v_minus_u = vector_v_minus_u.norm();
+
+ if(!N.f_rep_near_machine_precision(norm_v_minus_u,f_rep_u_on_v))
+ {
+ scalar = f_rep_scalar(norm_v_minus_u)/norm_v_minus_u ;
+ f_rep_u_on_v.m_x = scalar * vector_v_minus_u.m_x;
+ f_rep_u_on_v.m_y = scalar * vector_v_minus_u.m_y;
+ }
+ F_rep[v] = F_rep[v] + f_rep_u_on_v;
+ F_rep[u] = F_rep[u] - f_rep_u_on_v;
+ }
+
+ //step 2: calculated forces to nodes in neighbour boxes
+
+ //find_neighbour_boxes
+
+ neighbour_boxes.clear();
+ for(k = i -1;k <= i+1;k++)
+ for(l = j-1;l <= j+1;l++)
+ if ( (k>=0) && (l>=0) && (k<=max_gridindex) && (l<=max_gridindex))
+ {
+ neighbour.m_x = k;
+ neighbour.m_y = l;
+ if ((k != i) || (l != j) )
+ neighbour_boxes.pushBack(neighbour);
+ }
+
+
+ //forget neighbour_boxes that already had access to this box
+ forall_listiterators(IPoint, act_neighbour_box_it,neighbour_boxes)
+ {//forall
+ act_i = (*act_neighbour_box_it).m_x;
+ act_j = (*act_neighbour_box_it).m_y;
+ if((act_j == j+1)||((act_j == j)&&(act_i == i+1)))
+ {//if1
+ forall_listiterators(node,v_it,contained_nodes(i,j))
+ forall_listiterators(node,u_it,contained_nodes(act_i,act_j))
+ {//for
+ pos_u = A[*u_it].get_position();
+ pos_v = A[*v_it].get_position();
+ if (pos_u == pos_v)
+ {//if2 (Exception handling if two nodes have the same position)
+ pos_u = N.choose_distinct_random_point_in_radius_epsilon(pos_u);
+ }//if2
+ vector_v_minus_u = pos_v - pos_u;
+ norm_v_minus_u = vector_v_minus_u.norm();
+
+ if(!N.f_rep_near_machine_precision(norm_v_minus_u,f_rep_u_on_v))
+ {
+ scalar = f_rep_scalar(norm_v_minus_u)/norm_v_minus_u ;
+ f_rep_u_on_v.m_x = scalar * vector_v_minus_u.m_x;
+ f_rep_u_on_v.m_y = scalar * vector_v_minus_u.m_y;
+ }
+ F_rep[*v_it] = F_rep[*v_it] + f_rep_u_on_v;
+ F_rep[*u_it] = F_rep[*u_it] - f_rep_u_on_v;
+ }//for
+ }//if1
+ }//forall
+ }
+}
+
+
+void FruchtermanReingold::make_initialisations(double bl, DPoint d_l_c, int grid_quot)
+{
+ grid_quotient(grid_quot);
+ down_left_corner = d_l_c; //export this two values from FMMM
+ boxlength = bl;
+}
+
+
+inline double FruchtermanReingold::f_rep_scalar(double d)
+{
+ if (d > 0) {
+ return 1/d;
+
+ } else {
+ cout<<"Error FruchtermanReingold:: f_rep_scalar nodes at same position"<<endl;
+ return 0;
+ }
+}
+
+}//namespace ogdf
diff --git a/ogdf/internal/energybased/FruchtermanReingold.h b/ogdf/internal/energybased/FruchtermanReingold.h
new file mode 100644
index 0000000..c677b24
--- /dev/null
+++ b/ogdf/internal/energybased/FruchtermanReingold.h
@@ -0,0 +1,108 @@
+/*
+ * $Revision: 2523 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-02 20:59:27 +0200 (Mon, 02 Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of class FruchtermanReingold (computation of forces).
+ *
+ * \author Stefan Hachul
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_FRUCHTERMAN_REINGOLD_H
+#define OGDF_FRUCHTERMAN_REINGOLD_H
+
+#include "../../basic/Graph.h"
+#include "../../basic/geometry.h"
+#include "../../basic/NodeArray.h"
+#include "NodeAttributes.h"
+#include "EdgeAttributes.h"
+
+namespace ogdf {
+
+class OGDF_EXPORT FruchtermanReingold
+{
+public:
+ FruchtermanReingold(); //constructor
+ ~FruchtermanReingold() { } //destructor
+
+ //Calculate exact rep. forces for each node.
+ void calculate_exact_repulsive_forces(
+ const Graph &G,
+ NodeArray<NodeAttributes>& A,
+ NodeArray<DPoint>& F_rep);
+
+ //Grid approximation of rep.forces for each node.
+ void calculate_approx_repulsive_forces(
+ const Graph &G,
+ NodeArray<NodeAttributes>& A,
+ NodeArray<DPoint>& F_rep);
+
+ //Make all initialisations that are needed for FruchtermanReingold.
+ void make_initialisations (
+ double boxlength,
+ DPoint down_left_corner,
+ int grid_quotient);
+
+ //Import updated information of the drawing area.
+ void update_boxlength_and_cornercoordinate(double b_l, DPoint d_l_c) {
+ boxlength = b_l; down_left_corner = d_l_c;
+ }
+
+private:
+ int _grid_quotient;//for coarsening the FrRe-grid
+ int max_gridindex; //maximum index of a grid row/column
+ double boxlength; //length of drawing box
+ DPoint down_left_corner;//down left corner of drawing box
+
+ //Returns the repulsing force_function_value of scalar d.
+ double f_rep_scalar (double d);
+
+ //The number k of rows and colums of the grid is sqrt(|V|) / frGridQuotient()
+ //(Note that in [FrRe] frGridQuotient() is 2.)
+ void grid_quotient(int p) { _grid_quotient = ((0<=p) ? p : 2);}
+ int grid_quotient() const {return _grid_quotient;}
+};
+
+}//namespace ogdf
+#endif
+
diff --git a/ogdf/internal/energybased/MultilevelGraph.cpp b/ogdf/internal/energybased/MultilevelGraph.cpp
new file mode 100644
index 0000000..ec3af4b
--- /dev/null
+++ b/ogdf/internal/energybased/MultilevelGraph.cpp
@@ -0,0 +1,834 @@
+/*
+ * $Revision: 2552 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-05 16:45:20 +0200 (Do, 05. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief MLG is the main data structure for ModularMultilevelMixer
+ *
+ * \author Gereon Bartel
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+#include "MultilevelGraph.h"
+#include "../../basic/simple_graph_alg.h"
+#include <algorithm>
+
+
+namespace ogdf {
+
+
+MultilevelGraph::~MultilevelGraph()
+{
+ // delete all Nodemerges!
+ while(!m_changes.empty()) {
+ delete m_changes.back();
+ m_changes.pop_back();
+ }
+
+ // only delete the Graph if it was created!
+ if (m_createdGraph) {
+ delete m_G;
+ }
+ delete m_GA;
+}
+
+//initialize internal structures such as the GraphAttributes that store the layout
+void MultilevelGraph::initInternal()
+{
+ OGDF_ASSERT(m_G != 0);
+ m_GA = new GraphAttributes(*m_G);
+}
+
+MultilevelGraph::MultilevelGraph()
+:m_createdGraph(true)
+{
+ m_G = new Graph();
+ if(m_G == 0) {
+ OGDF_THROW(InsufficientMemoryException);
+ }
+
+ //replaces layout info stuff below
+ initInternal();
+
+ m_nodeAssociations.init(*m_G, 0);
+ m_edgeAssociations.init(*m_G, 0);
+ m_radius.init(*m_G, 1.0);
+ m_weight.init(*m_G, 1.0);
+
+ initReverseIndizes();
+}
+
+
+MultilevelGraph::MultilevelGraph(GraphAttributes &GA)
+:m_createdGraph(true)
+{
+ m_G = new Graph();
+ if(m_G == 0) {
+ OGDF_THROW(InsufficientMemoryException);
+ }
+
+ //replaces layout info stuff below
+ initInternal();
+
+ m_nodeAssociations.init(*m_G);
+ m_edgeAssociations.init(*m_G);
+ m_radius.init(*m_G);
+ m_weight.init(*m_G);
+ copyFromGraph(GA.constGraph(), m_nodeAssociations, m_edgeAssociations);
+ prepareGraphAttributes(GA);
+ importAttributes(GA);
+
+ initReverseIndizes();
+}
+
+
+MultilevelGraph::MultilevelGraph(Graph &G)
+:m_createdGraph(false), m_G(0)
+{
+ m_G = &G;
+
+ //replaces layout info stuff below
+ initInternal();
+
+ m_nodeAssociations.init(*m_G, 0);
+ m_edgeAssociations.init(*m_G, 0);
+ m_radius.init(*m_G, 1.0);
+ m_weight.init(*m_G, 1.0);
+
+ initReverseIndizes();
+}
+
+
+MultilevelGraph::MultilevelGraph(GraphAttributes &GA, Graph &G)
+:m_createdGraph(false), m_G(0)
+{
+ m_G = &G;
+ m_nodeAssociations.init(*m_G, 0);
+ m_edgeAssociations.init(*m_G, 0);
+ m_radius.init(*m_G);
+ m_weight.init(*m_G);
+
+ initInternal();
+
+ prepareGraphAttributes(GA);
+ importAttributes(GA);
+
+ initReverseIndizes();
+}
+
+
+MultilevelGraph::MultilevelGraph(istream &is)
+:m_createdGraph(true)
+{
+ m_G = new Graph();
+ if(m_G == 0) {
+ OGDF_THROW(InsufficientMemoryException);
+ }
+ m_nodeAssociations.init(*m_G);
+ m_edgeAssociations.init(*m_G);
+ m_radius.init(*m_G);
+ m_weight.init(*m_G);
+
+ initInternal();
+ //GraphAttributes tempGA(*m_G);
+ m_GA->readGML(*m_G, is);
+ prepareGraphAttributes(*m_GA);
+ importAttributesSimple(*m_GA);
+
+ initReverseIndizes();
+}
+
+
+MultilevelGraph::MultilevelGraph(const String &filename)
+:m_createdGraph(true)
+{
+ m_G = new Graph();
+ if(m_G == 0) {
+ OGDF_THROW(InsufficientMemoryException);
+ }
+ m_nodeAssociations.init(*m_G);
+ m_edgeAssociations.init(*m_G);
+ m_radius.init(*m_G);
+ m_weight.init(*m_G);
+
+ initInternal();
+ //GraphAttributes tempGA(*m_G);
+ m_GA->readGML(*m_G, filename);
+ prepareGraphAttributes(*m_GA);
+ importAttributesSimple(*m_GA);
+
+ initReverseIndizes();
+}
+
+
+void MultilevelGraph::prepareGraphAttributes(GraphAttributes &GA) const
+{
+ long additionalAttributes = 0;
+ if (!(GA.attributes() & GraphAttributes::edgeDoubleWeight)) {
+ additionalAttributes |= GraphAttributes::edgeDoubleWeight;
+ }
+ if (!(GA.attributes() & GraphAttributes::nodeWeight)) {
+ additionalAttributes |= GraphAttributes::nodeWeight;
+ }
+ GA.initAttributes(additionalAttributes);
+}
+
+
+void MultilevelGraph::copyFromGraph(const Graph &G, NodeArray<int> & /*nodeAssociations*/, EdgeArray<int> & /* edgeAssociations */)
+{
+ NodeArray<node> tempAssociations(G);
+
+ node v;
+ forall_nodes(v, G) {
+ node v_new = m_G->newNode();
+ m_nodeAssociations[v_new] = v->index();
+ tempAssociations[v] = v_new;
+ }
+
+ edge e;
+ forall_edges(e, G) {
+ edge e_new = m_G->newEdge(tempAssociations[e->source()], tempAssociations[e->target()]);
+ m_edgeAssociations[e_new] = e->index();
+ }
+
+ initReverseIndizes();
+}
+
+
+int MultilevelGraph::getLevel()
+{
+ if (m_changes.size() == 0)
+ {
+ return 0;
+ }
+ else
+ {
+ return m_changes.back()->m_level;
+ }
+}
+
+
+// assumes, that the Graphs of MultilevelGraph and GA are the same, not copies!
+void MultilevelGraph::exportAttributesSimple(GraphAttributes &GA) const
+{
+ OGDF_ASSERT(&(GA.constGraph()) == m_G);
+
+ prepareGraphAttributes(GA);
+
+ node v;
+ forall_nodes(v, *m_G) {
+ GA.x(v) = m_GA->x(v);
+ GA.y(v) = m_GA->y(v);
+ //TODO: Check what this w,h computation does
+ double w = GA.width(v);
+ double h = GA.height(v);
+ if(w > 0 || h > 0) {
+ double factor = m_radius[v] / sqrt(w*w + h*h) * 2.0f;
+ w *= factor;
+ h *= factor;
+ } else {
+ w = h = m_radius[v] * sqrt(2.0f);
+ }
+ GA.width(v) = w;
+ GA.height(v) = h;
+ GA.weight(v) = m_reverseNodeMergeWeight[v->index()];
+ }
+
+ edge e;
+ forall_edges(e, *m_G) {
+ GA.doubleWeight(e) = m_weight[e];
+ }
+}
+
+
+void MultilevelGraph::exportAttributes(GraphAttributes &GA) const
+{
+ OGDF_ASSERT(GA.constGraph().numberOfNodes() == m_G->numberOfNodes());
+ OGDF_ASSERT(GA.constGraph().numberOfEdges() == m_G->numberOfEdges());
+
+ prepareGraphAttributes(GA);
+
+ std::vector<node> tempNodeAssociations;
+ node v;
+ const Graph &cG = GA.constGraph();
+ tempNodeAssociations.resize(cG.maxNodeIndex()+1, 0);
+ forall_nodes(v, cG) {
+ tempNodeAssociations[v->index()] = v;
+ }
+
+ forall_nodes(v, *m_G) {
+ GA.x(tempNodeAssociations[m_nodeAssociations[v]]) = m_GA->x(v);
+ GA.y(tempNodeAssociations[m_nodeAssociations[v]]) = m_GA->y(v);
+ double w = GA.width(tempNodeAssociations[m_nodeAssociations[v]]);
+ double h = GA.height(tempNodeAssociations[m_nodeAssociations[v]]);
+ if(w > 0 || h > 0) {
+ double factor = m_radius[v] / sqrt(w*w + h*h) * 2.0f;
+ w *= factor;
+ h *= factor;
+ } else {
+ w = h = m_radius[v] * sqrt(2.0f);
+ }
+ GA.width(tempNodeAssociations[m_nodeAssociations[v]]) = w;
+ GA.height(tempNodeAssociations[m_nodeAssociations[v]]) = h;
+ GA.weight(tempNodeAssociations[m_nodeAssociations[v]]) = m_reverseNodeMergeWeight[v->index()];
+ }
+
+ std::vector<edge> tempEdgeAssociations;
+ edge e;
+ tempEdgeAssociations.resize(cG.maxEdgeIndex()+1, 0);
+ forall_edges(e, cG) {
+ tempEdgeAssociations[e->index()] = e;
+ }
+
+ forall_edges(e, *m_G) {
+ GA.doubleWeight(tempEdgeAssociations[m_edgeAssociations[e]]) = m_weight[e];
+ }
+}
+
+
+void MultilevelGraph::importAttributesSimple(const GraphAttributes &GA)
+{
+ OGDF_ASSERT(&(GA.constGraph()) == m_G);
+
+ m_avgRadius = 0.0;
+
+ node v;
+ forall_nodes(v, *m_G) {
+ double w = GA.width(v);
+ double h = GA.height(v);
+ if(w > 0 || h > 0) {
+ m_radius[v] = sqrt(w*w + h*h) / 2.0f;
+ } else {
+ m_radius[v] = 1.0f;
+ }
+ m_avgRadius += m_radius[v];
+ m_GA->x(v) = GA.x(v);
+ m_GA->y(v) = GA.y(v);
+ m_GA->width(v) = GA.width(v);
+ m_GA->height(v) = GA.height(v);
+ }
+ m_avgRadius /= m_G->numberOfNodes();
+
+ edge e;
+ forall_edges(e, *m_G) {
+ m_weight[e] = GA.doubleWeight(e);
+ }
+}
+
+
+void MultilevelGraph::importAttributes(const GraphAttributes &GA)
+{
+ OGDF_ASSERT(GA.constGraph().numberOfNodes() == m_G->numberOfNodes());
+ OGDF_ASSERT(GA.constGraph().numberOfEdges() == m_G->numberOfEdges());
+
+ m_avgRadius = 0.0;
+
+ std::vector<node> tempNodeAssociations;
+ node v;
+ const Graph &cG = GA.constGraph();
+ tempNodeAssociations.resize(cG.maxNodeIndex()+1, 0);
+ forall_nodes(v, cG) {
+ tempNodeAssociations[v->index()] = v;
+ }
+
+ forall_nodes(v, *m_G) {
+
+ double w = GA.width(tempNodeAssociations[m_nodeAssociations[v]]);
+ double h = GA.height(tempNodeAssociations[m_nodeAssociations[v]]);
+ if(w > 0 || h > 0) {
+ m_radius[v] = sqrt(w*w + h*h) / 2.0f;
+ } else {
+ m_radius[v] = 1.0f;
+ }
+
+ m_avgRadius += m_radius[v];
+
+ m_GA->x(v) = GA.x(tempNodeAssociations[m_nodeAssociations[v]]);
+ m_GA->y(v) = GA.y(tempNodeAssociations[m_nodeAssociations[v]]);
+ m_GA->width(v) = GA.width(tempNodeAssociations[m_nodeAssociations[v]]);
+ m_GA->height(v) = GA.height(tempNodeAssociations[m_nodeAssociations[v]]);
+ }
+
+ m_avgRadius /= m_G->numberOfNodes();
+
+ std::vector<edge> tempEdgeAssociations;
+ edge e;
+ tempEdgeAssociations.resize(cG.maxEdgeIndex()+1, 0);
+ forall_edges(e, cG) {
+ tempEdgeAssociations[e->index()] = e;
+ }
+
+ forall_edges(e, *m_G) {
+ m_weight[e] = GA.doubleWeight(tempEdgeAssociations[m_edgeAssociations[e]]);
+ }
+}
+
+
+void MultilevelGraph::reInsertGraph(MultilevelGraph &MLG)
+{
+ std::map<node, node> tempNodeAssociations;
+
+ node v;
+ forall_nodes(v, *(MLG.m_G)) {
+ MLG.copyNodeTo(v, *this, tempNodeAssociations, false, MLG.m_nodeAssociations[v]);
+ }
+
+ edge e;
+ forall_edges(e, *(MLG.m_G)) {
+ MLG.copyEdgeTo(e, *this, tempNodeAssociations, false, MLG.m_edgeAssociations[e]);
+ }
+
+ initReverseIndizes();
+}
+
+
+void MultilevelGraph::reInsertAll(std::vector<MultilevelGraph *> components)
+{
+ for(std::vector<MultilevelGraph *>::iterator i = components.begin();
+ i != components.end(); i++)
+ {
+ reInsertGraph(**i);
+ }
+}
+
+
+// keeps Changes
+// keeps Node and Edge Associations
+// deletes Nodes and Eges from Graph
+// deletes Attributes
+// deprecated, use componentsplitterlayout instead
+std::vector<MultilevelGraph *> MultilevelGraph::splitIntoComponents()
+{
+ std::vector<MultilevelGraph *> components;
+
+ NodeArray<int> componentNumbers(*m_G);
+ int numComponents = connectedComponents(*m_G, componentNumbers);
+ if (numComponents == 0) {
+ return components;
+ }
+
+ std::vector< std::vector<node> > componentArray;
+ componentArray.resize(numComponents);
+ node v;
+ forall_nodes(v, *m_G) {
+ componentArray[componentNumbers[v]].push_back(v);
+ }
+
+ for (unsigned int componentNumber = 0; componentNumber < componentArray.size(); componentNumber++) {
+ std::vector<node> componentSubArray = componentArray[componentNumber];
+ MultilevelGraph * component = removeOneCC(componentSubArray);
+ components.push_back(component);
+ }
+
+ OGDF_ASSERT(m_G->numberOfNodes() == 0);
+ OGDF_ASSERT(m_G->numberOfEdges() == 0);
+
+ m_radius.init(*m_G);
+ m_weight.init(*m_G);
+
+ return components;
+}
+
+
+void MultilevelGraph::copyNodeTo(node v, MultilevelGraph &MLG, std::map<node, node> &tempNodeAssociations, bool associate, int index)
+{
+ node v_new;
+ if (index == -1) {
+ v_new = MLG.m_G->newNode();
+ } else {
+ v_new = MLG.m_G->newNode(index);
+ }
+
+ tempNodeAssociations[v] = v_new;
+ if(associate) {
+ MLG.m_nodeAssociations[v_new] = v->index();
+ }
+ MLG.m_radius[v_new] = m_radius[v];
+ MLG.x(v_new, x(v));
+ MLG.y(v_new, y(v));
+}
+
+
+void MultilevelGraph::copyEdgeTo(edge e, MultilevelGraph &MLG, std::map<node, node> &tempNodeAssociations, bool associate, int index)
+{
+ node source = e->source();
+ node target = e->target();
+ edge e_new;
+ if (index == -1) {
+ e_new = MLG.m_G->newEdge(tempNodeAssociations[source], tempNodeAssociations[target]);
+ } else {
+ e_new = MLG.m_G->newEdge(tempNodeAssociations[source], tempNodeAssociations[target], index);
+ }
+
+ if(associate) {
+ MLG.m_edgeAssociations[e_new] = e->index();
+ }
+ MLG.m_weight[e_new] = m_weight[e];
+}
+
+
+MultilevelGraph * MultilevelGraph::removeOneCC(std::vector<node> &componentSubArray)
+{
+ MultilevelGraph * MLGcomponent = new MultilevelGraph();
+ std::map<node, node> tempNodeAssociations;
+
+ // copy nodes
+ for (std::vector<node>::iterator i = componentSubArray.begin(); i != componentSubArray.end(); i++) {
+ node v = *i;
+ copyNodeTo(v, *MLGcomponent, tempNodeAssociations, true);
+ }
+
+ // move edges
+ for (std::vector<node>::iterator i = componentSubArray.begin(); i != componentSubArray.end(); i++) {
+ node v = *i;
+ edge e;
+// std::vector<edge> toDelete;
+ forall_adj_edges(e, v) {
+ if (e != 0 && e->source() == v) {
+ copyEdgeTo(e, *MLGcomponent, tempNodeAssociations, true);
+// toDelete.push_back(e);
+ }
+ }
+/* // Test if this is good for Performace.
+ // makes Assert Edges == 0 fail!
+ // Because of self loops!
+ for(std::vector<edge>::iterator j = toDelete.begin(); j != toDelete.end(); j++) {
+ m_G->delEdge(*j);
+ }
+*/
+ }
+
+ tempNodeAssociations.clear();
+
+ // delete nodes
+ for (std::vector<node>::iterator i = componentSubArray.begin(); i != componentSubArray.end(); i++) {
+ node v = *i;
+ m_G->delNode(v);
+ }
+
+ MLGcomponent->initReverseIndizes();
+ return MLGcomponent;
+}
+
+
+bool MultilevelGraph::postMerge(NodeMerge * NM, node merged)
+{
+ // merged has no more edges!
+ int index = merged->index();
+ if (merged->degree() == 0 && NM->m_changedNodes.size() > 0) {
+ NM->m_mergedNode = index;
+ NM->m_radius[index] = m_radius[index];
+ m_changes.push_back(NM);
+ m_G->delNode(merged);
+ m_reverseNodeIndex[index] = 0;
+ return true;
+ } else {
+ return false;
+ }
+}
+
+
+bool MultilevelGraph::changeNode(NodeMerge * NM, node theNode, double newRadius, node merged)
+{
+ int index = theNode->index();
+ //we assume that changeNode is called exactly onces when a node is merged
+ //with its parent with parameter theNode being the parent and add 1 to
+ //the parents merge weight
+ m_reverseNodeMergeWeight[index] += m_reverseNodeMergeWeight[merged->index()];
+ std::vector<int>::iterator pos = find(NM->m_changedNodes.begin(), NM->m_changedNodes.end(), index);
+
+ if (pos == NM->m_changedNodes.end()) {
+ NM->m_changedNodes.push_back(index);
+ NM->m_radius[index] = m_radius[index];
+ }
+ m_radius[index] = newRadius;
+
+ return true;
+}
+
+
+bool MultilevelGraph::changeEdge(NodeMerge * NM, edge theEdge, double newWeight, node newSource, node newTarget)
+{
+ int index = theEdge->index();
+ std::vector<int>::iterator pos = find(NM->m_changedEdges.begin(), NM->m_changedEdges.end(), index);
+
+ if (pos == NM->m_changedEdges.end()) {
+ NM->m_changedEdges.push_back(index);
+ NM->m_doubleWeight[index] = m_weight[index];
+ NM->m_source[index] = theEdge->source()->index();
+ NM->m_target[index] = theEdge->target()->index();
+ }
+ m_G->delEdge(theEdge);
+ m_reverseEdgeIndex[index] = m_G->newEdge(newSource, newTarget, index);
+ m_weight[index] = newWeight;
+
+ return true;
+}
+
+
+bool MultilevelGraph::deleteEdge(NodeMerge * NM, edge theEdge)
+{
+ int index = theEdge->index();
+
+ NM->m_deletedEdges.push_back(index);
+ NM->m_doubleWeight[index] = m_weight[index];
+ NM->m_source[index] = theEdge->source()->index();
+ NM->m_target[index] = theEdge->target()->index();
+
+ m_G->delEdge(theEdge);
+ m_reverseEdgeIndex[index] = 0;
+
+ return true;
+}
+
+
+std::vector<edge> MultilevelGraph::moveEdgesToParent(NodeMerge * NM, node theNode, node parent, bool deleteDoubleEdges, int adjustEdgeLengths)
+{
+ OGDF_ASSERT(theNode != parent);
+
+ std::vector<edge> doubleEdges;
+ std::vector<edge> adjEdges;
+ edge e;
+ forall_adj_edges(e, theNode) {
+ adjEdges.push_back(e);
+ }
+
+ double nodeToParentLen = 0.0;
+ for (std::vector<edge>::iterator i = adjEdges.begin(); i != adjEdges.end(); i++)
+ {
+ e = *i;
+ node newSource = e->source();
+ node newTarget = e->target();
+ if ((newSource == theNode && newTarget == parent)
+ || (newSource == parent && newTarget == theNode)){
+ nodeToParentLen = m_weight[e->index()];
+ break;
+ }
+ }
+
+ for (std::vector<edge>::iterator i = adjEdges.begin(); i != adjEdges.end(); i++)
+ {
+ e = *i;
+ node newSource = e->source();
+ node newTarget = e->target();
+
+ if (newSource == theNode) {
+ newSource = parent;
+ }
+ if (newTarget == theNode) {
+ newTarget = parent;
+ }
+
+ bool exists = false;
+ edge twinEdge = 0;
+ adjEntry adj;
+ forall_adj(adj, parent) {
+ if (adj->twinNode() != parent && (adj->twinNode() == newSource || adj->twinNode() == newTarget)) {
+ exists = true;
+ twinEdge = adj->theEdge();
+ double extraLength = 0.0;
+ if(adjustEdgeLengths != 0) {
+ extraLength = m_weight[twinEdge->index()] + adjustEdgeLengths * nodeToParentLen;
+ }
+ changeEdge(NM, twinEdge, (m_weight[twinEdge->index()] + m_weight[e->index()] + extraLength) * 0.5f, twinEdge->source(), twinEdge->target());
+ break;
+ }
+ }
+
+ // has this edge already
+ if (exists || newSource == newTarget) {
+ doubleEdges.push_back(e);
+ } else {
+ changeEdge(NM, e, m_weight[e->index()], newSource, newTarget);
+ }
+ }
+
+ if (deleteDoubleEdges) {
+ while (!doubleEdges.empty()) {
+ deleteEdge(NM, doubleEdges.back());
+ doubleEdges.pop_back();
+ }
+ }
+
+ OGDF_ASSERT(theNode->degree() == doubleEdges.size());
+
+ // not deleted edges that are adjacent to theNode are returned.
+ return doubleEdges;
+}
+
+
+NodeMerge * MultilevelGraph::getLastMerge()
+{
+ return m_changes.back();
+}
+
+
+node MultilevelGraph::undoLastMerge()
+{
+ if (m_changes.empty()) {
+ return 0;
+ }
+ NodeMerge * merge = m_changes.back();
+ m_changes.pop_back();
+
+ // reinsert merged node
+ int index = merge->m_mergedNode;
+ node merged = m_G->newNode(index);
+ m_reverseNodeIndex[index] = merged;
+ m_radius[index] = merge->m_radius[index];
+
+ std::vector<int>::iterator it;
+ // add deleted edges
+ for (it = merge->m_deletedEdges.begin(); it != merge->m_deletedEdges.end(); it++) {
+ index = *it;
+ m_reverseEdgeIndex[index] = m_G->newEdge(m_reverseNodeIndex[merge->m_source[index]], m_reverseNodeIndex[merge->m_target[index]], index);
+ m_weight[index] = merge->m_doubleWeight[index];
+ }
+
+ // undo edge changes
+ for (it = merge->m_changedEdges.begin(); it != merge->m_changedEdges.end(); it++) {
+ index = *it;
+ m_G->delEdge(m_reverseEdgeIndex[index]);
+ m_reverseEdgeIndex[index] = m_G->newEdge(m_reverseNodeIndex[merge->m_source[index]], m_reverseNodeIndex[merge->m_target[index]], index);
+ m_weight[index] = merge->m_doubleWeight[index];
+ }
+
+ // undo node changes
+ for (it = merge->m_changedNodes.begin(); it != merge->m_changedNodes.end(); it++) {
+ index = *it;
+ m_radius[index] = merge->m_radius[index];
+ m_reverseNodeMergeWeight[index] -= m_reverseNodeMergeWeight[merged->index()];
+ }
+
+ delete merge;
+ return merged;
+}
+
+
+edge MultilevelGraph::getEdge(unsigned int index)
+{
+ if (index >= m_reverseEdgeIndex.size()) {
+ return 0;
+ }
+ return m_reverseEdgeIndex[index];
+}
+
+
+node MultilevelGraph::getNode(unsigned int index)
+{
+ if (index >= m_reverseNodeIndex.size()) {
+ return 0;
+ }
+ return m_reverseNodeIndex[index];
+}
+
+
+void MultilevelGraph::initReverseIndizes()
+{
+ if (m_G->numberOfNodes() > 0) {
+ m_reverseNodeIndex.resize(m_G->maxNodeIndex()+1, 0);
+ }
+ if (m_G->numberOfNodes() > 0) {
+ m_reverseNodeMergeWeight.resize(m_G->maxNodeIndex()+1, 1);
+ }
+ if (m_G->numberOfEdges() > 0) {
+ m_reverseEdgeIndex.resize(m_G->maxEdgeIndex()+1, 0);
+ }
+}
+
+
+void MultilevelGraph::updateMergeWeights()
+{
+ node v;
+ forall_nodes(v, *m_G) {
+ m_reverseNodeMergeWeight[v->index()] = 1;
+ }
+
+}
+
+
+void MultilevelGraph::updateReverseIndizes()
+{
+ if ((unsigned int)m_G->maxNodeIndex() >= m_reverseNodeIndex.size() || (unsigned int)m_G->maxEdgeIndex() >= m_reverseEdgeIndex.size()) {
+ initReverseIndizes();
+ }
+
+ node v;
+ forall_nodes(v, *m_G) {
+ m_reverseNodeIndex[v->index()] = v;
+ }
+
+ edge e;
+ forall_edges(e, *m_G) {
+ m_reverseEdgeIndex[e->index()] = e;
+ }
+}
+
+
+void MultilevelGraph::writeGML(ostream &os)
+{
+ GraphAttributes GA(*m_G);
+ exportAttributesSimple(GA);
+
+ GA.writeGML(os);
+}
+
+
+void MultilevelGraph::writeGML(const String &fileName)
+{
+ ofstream os(fileName.cstr());
+ writeGML(os);
+}
+
+
+void MultilevelGraph::moveToZero()
+{
+ // move Graph to zero
+ node v;
+ double avg_x = 0.0;
+ double avg_y = 0.0;
+ forall_nodes(v, getGraph()) {
+ avg_x += x(v);
+ avg_y += y(v);
+ }
+ avg_x /= getGraph().numberOfNodes();
+ avg_y /= getGraph().numberOfNodes();
+ forall_nodes(v, getGraph()) {
+ x(v, x(v) - avg_x);
+ y(v, y(v) - avg_y);
+ }
+}
+
+
+} // namespace ogdf
diff --git a/ogdf/internal/energybased/MultilevelGraph.h b/ogdf/internal/energybased/MultilevelGraph.h
new file mode 100644
index 0000000..d294bed
--- /dev/null
+++ b/ogdf/internal/energybased/MultilevelGraph.h
@@ -0,0 +1,180 @@
+/*
+ * $Revision: 2523 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-02 20:59:27 +0200 (Mon, 02 Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief MLG is the main data structure for ModularMultilevelMixer
+ *
+ * \author Gereon Bartel
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_MULTILEVEL_GRAPH_H
+#define OGDF_MULTILEVEL_GRAPH_H
+
+#include "../../basic/Graph.h"
+#include "../../basic/GraphAttributes.h"
+#include <vector>
+#include <map>
+
+namespace ogdf {
+
+//Stores info on merging for a refinement level
+struct NodeMerge
+{
+ // Node/Edge IDs instead of pointers as the nodes themselves may be nonexistent.
+ std::vector<int> m_deletedEdges;
+ std::vector<int> m_changedEdges;
+ std::map<int, double> m_doubleWeight; // for changed and deleted edges
+ std::map<int, int> m_source;
+ std::map<int, int> m_target;
+
+ int m_mergedNode;
+ std::vector< std::pair<int, double> > m_position; // optional information <target, distance>. mergedNode will be placed at average of relative distances to target.
+
+ std::vector<int> m_changedNodes; // there may be placement strategies that use more than one reference-node.
+ std::map<int, double> m_radius; // for changed nodes and the merged node
+
+ int m_level;
+
+
+ NodeMerge(int level) : m_level(level) { }
+ ~NodeMerge() { }
+};
+
+
+class OGDF_EXPORT MultilevelGraph
+{
+private:
+ bool m_createdGraph; //used in destructor, TODO: check if it is needed
+ Graph * m_G;
+ GraphAttributes * m_GA; //<! Keeps layout info in replacement of information below (todo: remove them)
+ std::vector<NodeMerge *> m_changes;
+ NodeArray<double> m_radius;
+ double m_avgRadius; //stores average node radius for scaling and random layout purposes
+
+ EdgeArray<double> m_weight;
+
+ // Associations to index only as the node/edge may be nonexistent
+ NodeArray<int> m_nodeAssociations;
+ EdgeArray<int> m_edgeAssociations;
+
+ std::vector<node> m_reverseNodeIndex;
+ std::vector<int> m_reverseNodeMergeWeight;//<! Keeps number of vertices represented by vertex with given index
+ std::vector<edge> m_reverseEdgeIndex;
+
+ MultilevelGraph * removeOneCC(std::vector<node> &componentSubArray);
+ void copyFromGraph(const Graph &G, NodeArray<int> &nodeAssociations, EdgeArray<int> &edgeAssociations);
+ void prepareGraphAttributes(GraphAttributes &GA) const;
+
+ void initReverseIndizes();
+ void initInternal();
+
+public:
+ ~MultilevelGraph();
+ MultilevelGraph();
+ MultilevelGraph(Graph &G);
+ MultilevelGraph(GraphAttributes &GA);
+ // if the Graph is available without const, no copy needs to be created.
+ MultilevelGraph(GraphAttributes &GA, Graph &G);
+
+ // creates MultilevelGraph directly from GML file.
+ MultilevelGraph(istream &is);
+ MultilevelGraph(const String &filename);
+
+ NodeArray<double> &getRArray() { return m_radius; }
+ EdgeArray<double> &getWArray() { return m_weight; }
+
+ edge getEdge(unsigned int index);
+ node getNode(unsigned int index);
+
+ double radius(node v) { return m_radius[v]; }
+ void radius(node v, double r) { m_radius[v] = r; }
+ double averageRadius() const { return m_avgRadius;}
+
+ double x(node v) { return m_GA->x(v); }
+ double y(node v) { return m_GA->y(v); }
+ void x(node v, double x) { m_GA->x(v) = x;}
+ void y(node v, double y) { m_GA->y(v) = y;}
+
+ void weight(edge e, double weight) { m_weight[e] = weight; }
+ double weight(edge e) { return m_weight[e]; }
+
+ //returns the merge weight, i.e. the number of nodes represented by v on the current level
+ int mergeWeight(node v) {return m_reverseNodeMergeWeight[v->index()];}
+
+ void moveToZero();
+
+ int getLevel();
+ Graph & getGraph() { return *m_G; }
+ //! Returns attributes of current level graph as GraphAttributes
+ GraphAttributes & getGraphAttributes() const { return *m_GA; }
+ void exportAttributes(GraphAttributes &GA) const;
+ void exportAttributesSimple(GraphAttributes &GA) const;
+ void importAttributes(const GraphAttributes &GA);
+ void importAttributesSimple(const GraphAttributes &GA);
+ void reInsertGraph(MultilevelGraph &MLG);
+ void reInsertAll(std::vector<MultilevelGraph *> components);
+ void copyNodeTo(node v, MultilevelGraph &MLG, std::map<node, node> &tempNodeAssociations, bool associate, int index = -1);
+ void copyEdgeTo(edge e, MultilevelGraph &MLG, std::map<node, node> &tempNodeAssociations, bool associate, int index = -1);
+ void writeGML(ostream &os);
+ void writeGML(const String &fileName);
+
+ // the original graph will be cleared to save Memory
+ std::vector<MultilevelGraph *> splitIntoComponents();
+
+ bool postMerge(NodeMerge * NM, node merged);
+ //\a merged is the node now represented by \a theNode
+ bool changeNode(NodeMerge * NM, node theNode, double newRadius, node merged);
+ bool changeEdge(NodeMerge * NM, edge theEdge, double newWeight, node newSource, node newTarget);
+ bool deleteEdge(NodeMerge * NM, edge theEdge);
+ std::vector<edge> moveEdgesToParent(NodeMerge * NM, node theNode, node parent, bool deleteDoubleEndges, int adjustEdgeLengths);
+ NodeMerge * getLastMerge();
+ node undoLastMerge();
+
+ void updateReverseIndizes();
+ //sets the merge weights back to initial values
+ void updateMergeWeights();
+};
+
+} // namespace ogdf
+
+#endif
diff --git a/ogdf/internal/energybased/NMM.cpp b/ogdf/internal/energybased/NMM.cpp
new file mode 100644
index 0000000..200824c
--- /dev/null
+++ b/ogdf/internal/energybased/NMM.cpp
@@ -0,0 +1,2867 @@
+/*
+ * $Revision: 2552 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-05 16:45:20 +0200 (Do, 05. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of class NMM (New Multipole Method).
+ *
+ * \author Stefan Hachul
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "NMM.h"
+#include "../../energybased/FMMMLayout.h"
+#include "../../basic/Math.h"
+#include "../../energybased/numexcept.h"
+#include <time.h>
+
+
+#define MIN_BOX_LENGTH 1e-300
+
+#ifdef __BORLANDC__
+ using _STL::log;
+#else
+ using std::log;
+#endif
+
+
+namespace ogdf {
+
+NMM::NMM()
+{
+ //set MIN_NODE_NUMBER and using_NMM
+ MIN_NODE_NUMBER = 175; using_NMM = true;
+
+ //setting predefined parameters
+ precision(4); particles_in_leaves(25);
+ tree_construction_way(FMMMLayout::rtcSubtreeBySubtree);
+ find_sm_cell(FMMMLayout::scfIteratively);
+}
+
+
+void NMM::calculate_repulsive_forces(
+ const Graph &G,
+ NodeArray <NodeAttributes>& A,
+ NodeArray<DPoint>& F_rep)
+{
+ if(using_NMM) //use NewMultipoleMethod
+ calculate_repulsive_forces_by_NMM(G,A,F_rep);
+ else //used the exact naive way
+ calculate_repulsive_forces_by_exact_method(G,A,F_rep);
+}
+
+
+void NMM::calculate_repulsive_forces_by_NMM(
+ const Graph &G,
+ NodeArray<NodeAttributes>& A,
+ NodeArray<DPoint>& F_rep)
+{
+ QuadTreeNM T;
+ node v;
+ DPoint nullpoint (0,0);
+ NodeArray<DPoint> F_direct(G);
+ NodeArray<DPoint> F_local_exp(G);
+ NodeArray<DPoint> F_multipole_exp(G);
+ List<QuadTreeNodeNM*> quad_tree_leaves;
+
+ //initializations
+
+ forall_nodes(v,G)
+ F_direct[v]=F_local_exp[v]=F_multipole_exp[v]=nullpoint;
+
+ quad_tree_leaves.clear();
+ if(tree_construction_way() == FMMMLayout::rtcPathByPath)
+ build_up_red_quad_tree_path_by_path(G,A,T);
+ else //tree_construction_way == FMMMLayout::rtcSubtreeBySubtree
+ build_up_red_quad_tree_subtree_by_subtree(G,A,T);
+
+ form_multipole_expansions(A,T,quad_tree_leaves);
+ calculate_local_expansions_and_WSPRLS(A,T.get_root_ptr());
+ transform_local_exp_to_forces(A,quad_tree_leaves,F_local_exp);
+ transform_multipole_exp_to_forces(A,quad_tree_leaves,F_multipole_exp);
+ calculate_neighbourcell_forces(A,quad_tree_leaves,F_direct);
+ add_rep_forces(G,F_direct,F_multipole_exp,F_local_exp,F_rep);
+
+ delete_red_quad_tree_and_count_treenodes(T);
+}
+
+
+inline void NMM::calculate_repulsive_forces_by_exact_method(
+ const Graph &G,
+ NodeArray<NodeAttributes>& A,
+ NodeArray<DPoint>& F_rep)
+{
+ ExactMethod.calculate_exact_repulsive_forces(G,A,F_rep);
+}
+
+
+void NMM::make_initialisations(
+ const Graph &G,
+ double bl,
+ DPoint d_l_c,
+ int p_i_l,
+ int p,
+ int t_c_w,
+ int f_s_c)
+{
+ if(G.numberOfNodes() >= MIN_NODE_NUMBER) //using_NMM
+ {
+ using_NMM = true; //indicate that NMM is used for force calculation
+
+ particles_in_leaves(p_i_l);
+ precision(p);
+ tree_construction_way(t_c_w);
+ find_sm_cell(f_s_c);
+ down_left_corner = d_l_c; //Export this two values from FMMM
+ boxlength = bl;
+ init_binko(2* precision());
+ init_power_of_2_array();
+ }
+ else //use exact method
+ {
+ using_NMM = false; //indicate that exact method is used for force calculation
+ ExactMethod.make_initialisations(bl,d_l_c,0);
+ }
+}
+
+
+void NMM::deallocate_memory()
+{
+ if(using_NMM) {
+ free_binko();
+ free_power_of_2_array();
+ }
+}
+
+
+void NMM::update_boxlength_and_cornercoordinate(double b_l, DPoint d_l_c)
+{
+ if(using_NMM) {
+ boxlength = b_l;
+ down_left_corner = d_l_c;
+ }
+ else
+ ExactMethod.update_boxlength_and_cornercoordinate(b_l,d_l_c);
+}
+
+
+inline void NMM::init_power_of_2_array()
+{
+ int p = 1;
+ max_power_of_2_index = 30;
+ power_of_2 = new int[max_power_of_2_index+1];
+ for(int i = 0; i<= max_power_of_2_index; i++) {
+ power_of_2[i] = p;
+ p*=2;
+ }
+}
+
+
+inline void NMM::free_power_of_2_array()
+{
+ delete [] power_of_2;
+}
+
+
+inline int NMM::power_of_two(int i)
+{
+ if(i <= max_power_of_2_index)
+ return power_of_2[i];
+ else
+ return static_cast<int>(pow(2.0,i));
+}
+
+
+inline int NMM::maxboxindex (int level)
+{
+ if ((level < 0 )) {
+ cout <<"Failure NMM::maxboxindex :wrong level "<<endl;
+ cout <<"level" <<level<<endl;
+ return -1;
+
+ } else
+ return power_of_two(level)-1;
+}
+
+
+// ************Functions needed for path by path based tree construction**********
+
+void NMM::build_up_red_quad_tree_path_by_path(
+ const Graph& G,
+ NodeArray<NodeAttributes>& A,
+ QuadTreeNM& T)
+{
+ List<QuadTreeNodeNM*> act_leaf_List,new_leaf_List;
+ List<QuadTreeNodeNM*> *act_leaf_List_ptr,*new_leaf_List_ptr,*help_ptr;
+ List <ParticleInfo> act_x_List_copy,act_y_List_copy;
+ QuadTreeNodeNM *act_node_ptr;
+
+ build_up_root_node(G,A,T);
+
+ act_leaf_List.clear();
+ new_leaf_List.clear();
+ act_leaf_List.pushFront(T.get_root_ptr());
+ act_leaf_List_ptr = &act_leaf_List;
+ new_leaf_List_ptr = &new_leaf_List;
+
+ while(!act_leaf_List_ptr->empty())
+ {
+ while(!act_leaf_List_ptr->empty())
+ {
+ act_node_ptr = act_leaf_List_ptr->popFrontRet();
+ make_copy_and_init_Lists(*(act_node_ptr->get_x_List_ptr()),act_x_List_copy,
+ *(act_node_ptr->get_y_List_ptr()),act_y_List_copy);
+ T.set_act_ptr(act_node_ptr);
+ decompose_subtreenode(T,act_x_List_copy,act_y_List_copy,*new_leaf_List_ptr);
+ }
+ help_ptr = act_leaf_List_ptr;
+ act_leaf_List_ptr = new_leaf_List_ptr;
+ new_leaf_List_ptr = help_ptr;
+ }
+}
+
+
+void NMM::make_copy_and_init_Lists(
+ List<ParticleInfo>& L_x_orig,
+ List<ParticleInfo>& L_x_copy,
+ List<ParticleInfo>& L_y_orig,
+ List<ParticleInfo>& L_y_copy)
+{
+ ListIterator<ParticleInfo> origin_x_item,copy_x_item,origin_y_item,copy_y_item,
+ new_cross_ref_item;
+ ParticleInfo P_x_orig,P_y_orig,P_x_copy,P_y_copy;
+ bool L_x_orig_traversed = false;
+ bool L_y_orig_traversed = false;
+
+ L_x_copy.clear();
+ L_y_copy.clear();
+
+ origin_x_item = L_x_orig.begin();
+ while(!L_x_orig_traversed)
+ {
+ //reset values
+ P_x_orig = *origin_x_item;
+ P_x_orig.set_subList_ptr(NULL); //clear subList_ptr
+ P_x_orig.set_copy_item(NULL); //clear copy_item
+ P_x_orig.unmark(); //unmark this element
+ P_x_orig.set_tmp_cross_ref_item(NULL);//clear tmp_cross_ref_item
+
+ //update L_x_copy
+ P_x_copy = P_x_orig;
+ L_x_copy.pushBack(P_x_copy);
+
+ //update L_x_orig
+ P_x_orig.set_copy_item(L_x_copy.rbegin());
+ *origin_x_item = P_x_orig;
+
+ if(origin_x_item != L_x_orig.rbegin())
+ origin_x_item = L_x_orig.cyclicSucc(origin_x_item);
+ else
+ L_x_orig_traversed = true;
+ }
+
+ origin_y_item = L_y_orig.begin();
+ while(!L_y_orig_traversed)
+ {
+ //reset values
+ P_y_orig = *origin_y_item;
+ P_y_orig.set_subList_ptr(NULL); //clear subList_ptr
+ P_y_orig.set_copy_item(NULL); //clear copy_item
+ P_y_orig.set_tmp_cross_ref_item(NULL);//clear tmp_cross_ref_item
+ P_y_orig.unmark(); //unmark this element
+
+ //update L_x(y)_copy
+ P_y_copy = P_y_orig;
+ new_cross_ref_item = (*P_y_orig.get_cross_ref_item()).get_copy_item();
+ P_y_copy.set_cross_ref_item(new_cross_ref_item);
+ L_y_copy.pushBack(P_y_copy);
+ P_x_copy = *new_cross_ref_item;
+ P_x_copy.set_cross_ref_item(L_y_copy.rbegin());
+ *new_cross_ref_item = P_x_copy;
+
+ //update L_y_orig
+ P_y_orig.set_copy_item(L_y_copy.rbegin());
+ *origin_y_item = P_y_orig;
+
+ if(origin_y_item != L_y_orig.rbegin())
+ origin_y_item = L_y_orig.cyclicSucc(origin_y_item);
+ else
+ L_y_orig_traversed = true;
+ }
+}
+
+
+void NMM::build_up_root_node(
+ const Graph& G,
+ NodeArray<NodeAttributes>& A,
+ QuadTreeNM& T)
+{
+ T.init_tree();
+ T.get_root_ptr()->set_Sm_level(0);
+ T.get_root_ptr()->set_Sm_downleftcorner(down_left_corner);
+ T.get_root_ptr()->set_Sm_boxlength(boxlength);
+ //allocate space for L_x and L_y List of the root node
+ T.get_root_ptr()->set_x_List_ptr(OGDF_NEW List<ParticleInfo>);
+ T.get_root_ptr()->set_y_List_ptr(OGDF_NEW List<ParticleInfo>);
+ create_sorted_coordinate_Lists(G, A, *(T.get_root_ptr()->get_x_List_ptr()), *(T.get_root_ptr()->get_y_List_ptr()));
+}
+
+
+void NMM::create_sorted_coordinate_Lists(
+ const Graph& G,
+ NodeArray <NodeAttributes>& A,
+ List<ParticleInfo>& L_x,
+ List<ParticleInfo>& L_y)
+{
+ ParticleInfo P_x,P_y;
+ ListIterator<ParticleInfo> x_item,y_item;
+ node v;
+
+ //build up L_x,L_y and link the Lists
+ forall_nodes(v,G)
+ {
+ P_x.set_x_y_coord(A[v].get_x());
+ P_y.set_x_y_coord(A[v].get_y());
+ P_x.set_vertex(v);
+ P_y.set_vertex(v);
+ L_x.pushBack(P_x);
+ L_y.pushBack(P_y);
+ P_x.set_cross_ref_item(L_y.rbegin());
+ P_y.set_cross_ref_item(L_x.rbegin());
+ *L_x.rbegin() = P_x;
+ *L_y.rbegin() = P_y;
+ }
+
+
+ //sort L_x and update the links of L_y
+ ParticleInfoComparer comp;
+ L_x.quicksort(comp);//Quicksort L_x
+
+ for(x_item = L_x.begin(); x_item.valid();++x_item)
+ {
+ y_item = (*x_item).get_cross_ref_item();
+ P_y = *y_item;
+ P_y.set_cross_ref_item(x_item);
+ *y_item = P_y;
+ }
+
+ //sort L_y and update the links of L_x
+ L_y.quicksort(comp);//Quicksort L_x
+
+ for(y_item = L_y.begin(); y_item.valid();++y_item)
+ {
+ x_item = (*y_item).get_cross_ref_item();
+ P_x = *x_item;
+ P_x.set_cross_ref_item(y_item);
+ *x_item = P_x;
+ }
+}
+
+
+void NMM::decompose_subtreenode(
+ QuadTreeNM& T,
+ List<ParticleInfo>& act_x_List_copy,
+ List<ParticleInfo>& act_y_List_copy,
+ List<QuadTreeNodeNM*>& new_leaf_List)
+{
+ QuadTreeNodeNM* act_ptr = T.get_act_ptr();
+ int act_particle_number = act_ptr->get_x_List_ptr()->size();
+ double x_min,x_max,y_min,y_max;
+ List<ParticleInfo> *L_x_l_ptr,*L_x_r_ptr,*L_x_lb_ptr,*L_x_rb_ptr,*L_x_lt_ptr,
+ *L_x_rt_ptr;
+ List<ParticleInfo> *L_y_l_ptr,*L_y_r_ptr,*L_y_lb_ptr,*L_y_rb_ptr,*L_y_lt_ptr,
+ *L_y_rt_ptr;
+
+ L_x_l_ptr = L_x_r_ptr = L_x_lb_ptr = L_x_lt_ptr = L_x_rb_ptr = L_x_rt_ptr = NULL;
+ L_y_l_ptr = L_y_r_ptr = L_y_lb_ptr = L_y_lt_ptr = L_y_rb_ptr = L_y_rt_ptr = NULL;
+
+ calculate_boundaries_of_act_node(T.get_act_ptr(),x_min,x_max,y_min,y_max);
+ if(find_sm_cell() == FMMMLayout::scfIteratively)
+ find_small_cell_iteratively(T.get_act_ptr(),x_min,x_max,y_min,y_max);
+ else //find_small_cell == FMMMLayout::scfAluru
+ find_small_cell_iteratively(T.get_act_ptr(),x_min,x_max,y_min,y_max);
+
+ if( (act_particle_number > particles_in_leaves()) &&
+ ((x_max-x_min >=MIN_BOX_LENGTH) || (y_max-y_min >= MIN_BOX_LENGTH )))
+ {//if0
+
+ //recursive calls for the half of the quad that contains the most particles
+
+ split_in_x_direction(act_ptr,L_x_l_ptr,L_y_l_ptr,
+ L_x_r_ptr,L_y_r_ptr);
+ if((L_x_r_ptr == NULL) ||
+ (L_x_l_ptr != NULL && L_x_l_ptr->size() > L_x_r_ptr->size()))
+ {//if1 left half contains more particles
+ split_in_y_direction(act_ptr,L_x_lb_ptr,
+ L_y_lb_ptr,L_x_lt_ptr,L_y_lt_ptr);
+ if((L_x_lt_ptr == NULL)||
+ (L_x_lb_ptr != NULL && L_x_lb_ptr->size() > L_x_lt_ptr->size()))
+ {//if2
+ T.create_new_lb_child(L_x_lb_ptr,L_y_lb_ptr);
+ T.go_to_lb_child();
+ decompose_subtreenode(T,act_x_List_copy,act_y_List_copy,new_leaf_List);
+ T.go_to_father();
+ }//if2
+ else //L_x_lt_ptr != NULL && L_x_lb_ptr->size() <= L_x_lt_ptr->size()
+ {//else1
+ T.create_new_lt_child(L_x_lt_ptr,L_y_lt_ptr);
+ T.go_to_lt_child();
+ decompose_subtreenode(T,act_x_List_copy,act_y_List_copy,new_leaf_List);
+ T.go_to_father();
+ }//else1
+ }//if1
+ else //L_x_r_ptr != NULL && (L_x_l_ptr->size() <= L_x_r_ptr->size())
+ {//else2 right half contains more particles
+ split_in_y_direction(act_ptr,L_x_rb_ptr,
+ L_y_rb_ptr,L_x_rt_ptr,L_y_rt_ptr);
+ if ((L_x_rt_ptr == NULL) ||
+ (L_x_rb_ptr != NULL && L_x_rb_ptr->size() > L_x_rt_ptr->size()))
+ {//if3
+ T.create_new_rb_child(L_x_rb_ptr,L_y_rb_ptr);
+ T.go_to_rb_child();
+ decompose_subtreenode(T,act_x_List_copy,act_y_List_copy,new_leaf_List);
+ T.go_to_father();
+ }//if3
+ else// L_x_rt_ptr != NULL && L_x_rb_ptr->size() <= L_x_rt_ptr->size()
+ {//else3
+ T.create_new_rt_child(L_x_rt_ptr,L_y_rt_ptr);
+ T.go_to_rt_child();
+ decompose_subtreenode(T,act_x_List_copy,act_y_List_copy,new_leaf_List);
+ T.go_to_father();
+ }//else3
+ }//else2
+
+ //build up the rest of the quad-subLists
+
+ if( L_x_l_ptr != NULL && L_x_lb_ptr == NULL && L_x_lt_ptr == NULL &&
+ !act_ptr->child_lb_exists() && !act_ptr->child_lt_exists() )
+ split_in_y_direction(act_ptr,L_x_l_ptr,L_x_lb_ptr,L_x_lt_ptr,L_y_l_ptr,
+ L_y_lb_ptr,L_y_lt_ptr);
+ else if( L_x_r_ptr != NULL && L_x_rb_ptr == NULL && L_x_rt_ptr == NULL &&
+ !act_ptr->child_rb_exists() && !act_ptr->child_rt_exists() )
+ split_in_y_direction(act_ptr,L_x_r_ptr,L_x_rb_ptr,L_x_rt_ptr,L_y_r_ptr,
+ L_y_rb_ptr,L_y_rt_ptr);
+
+ //create rest of the childnodes
+ if((!act_ptr->child_lb_exists()) && (L_x_lb_ptr != NULL))
+ {
+ T.create_new_lb_child(L_x_lb_ptr,L_y_lb_ptr);
+ T.go_to_lb_child();
+ new_leaf_List.pushBack(T.get_act_ptr());
+ T.go_to_father();
+ }
+ if((!act_ptr->child_lt_exists()) && (L_x_lt_ptr != NULL))
+ {
+ T.create_new_lt_child(L_x_lt_ptr,L_y_lt_ptr);
+ T.go_to_lt_child();
+ new_leaf_List.pushBack(T.get_act_ptr());
+ T.go_to_father();
+ }
+ if((!act_ptr->child_rb_exists()) && (L_x_rb_ptr != NULL))
+ {
+ T.create_new_rb_child(L_x_rb_ptr,L_y_rb_ptr);
+ T.go_to_rb_child();
+ new_leaf_List.pushBack(T.get_act_ptr());
+ T.go_to_father();
+ }
+ if((!act_ptr->child_rt_exists()) && (L_x_rt_ptr != NULL))
+ {
+ T.create_new_rt_child(L_x_rt_ptr,L_y_rt_ptr);
+ T.go_to_rt_child();
+ new_leaf_List.pushBack(T.get_act_ptr());
+ T.go_to_father();
+ }
+ //reset act_ptr->set_x(y)_List_ptr to avoid multiple deleting of dynamic memory;
+ //(only if *act_ptr is a leaf of T the reserved space is freed (and this is
+ //sufficient !!!))
+ act_ptr->set_x_List_ptr(NULL);
+ act_ptr->set_y_List_ptr(NULL);
+ }//if0
+ else
+ { //else a leaf or machineprecision is reached:
+ //The List contained_nodes is set for *act_ptr and the information of
+ //act_x_List_copy and act_y_List_copy is used to insert particles into the
+ //shorter Lists of previous touched treenodes;additionaly the dynamical allocated
+ //space for *act_ptr->get_x(y)_List_ptr() is freed.
+
+ List<node> L;
+ ListIterator<ParticleInfo> it;
+
+ //set List contained nodes
+
+ L.clear();
+ for(it = act_ptr->get_x_List_ptr()->begin();it.valid();++it)
+ L.pushBack((*it).get_vertex());
+ T.get_act_ptr()->set_contained_nodes(L);
+
+ //insert particles into previous touched Lists
+
+ build_up_sorted_subLists(act_x_List_copy,act_y_List_copy);
+
+ //free allocated space for *act_ptr->get_x(y)_List_ptr()
+ act_ptr->get_x_List_ptr()->clear();//free used space for old L_x,L_y Lists
+ act_ptr->get_y_List_ptr()->clear();
+ }//else
+}
+
+
+inline void NMM::calculate_boundaries_of_act_node(
+ QuadTreeNodeNM* act_ptr,
+ double& x_min,
+ double& x_max,
+ double& y_min,
+ double& y_max)
+{
+ List<ParticleInfo>* L_x_ptr = act_ptr->get_x_List_ptr();
+ List<ParticleInfo>* L_y_ptr = act_ptr->get_y_List_ptr();
+
+ x_min = (*L_x_ptr->begin()).get_x_y_coord();
+ x_max = (*L_x_ptr->rbegin()).get_x_y_coord();
+ y_min = (*L_y_ptr->begin()).get_x_y_coord();
+ y_max = (*L_y_ptr->rbegin()).get_x_y_coord();
+}
+
+
+bool NMM::in_lt_quad(
+ QuadTreeNodeNM* act_ptr,
+ double x_min,
+ double x_max,
+ double y_min,
+ double y_max)
+{
+ double l = act_ptr->get_Sm_downleftcorner().m_x;
+ double r = act_ptr->get_Sm_downleftcorner().m_x+act_ptr->get_Sm_boxlength()/2;
+ double b = act_ptr->get_Sm_downleftcorner().m_y+act_ptr->get_Sm_boxlength()/2;
+ double t = act_ptr->get_Sm_downleftcorner().m_y+act_ptr->get_Sm_boxlength();
+
+ if(l <= x_min && x_max < r && b <= y_min && y_max < t )
+ return true;
+ else if(x_min == x_max && y_min == y_max && l==r && t == b && x_min ==r && y_min ==b)
+ return true;
+ else
+ return false;
+}
+
+
+bool NMM::in_rt_quad(
+ QuadTreeNodeNM* act_ptr,
+ double x_min,
+ double x_max,
+ double y_min,
+ double y_max)
+{
+ double l = act_ptr->get_Sm_downleftcorner().m_x+act_ptr->get_Sm_boxlength()/2;
+ double r = act_ptr->get_Sm_downleftcorner().m_x+act_ptr->get_Sm_boxlength();
+ double b = act_ptr->get_Sm_downleftcorner().m_y+act_ptr->get_Sm_boxlength()/2;
+ double t = act_ptr->get_Sm_downleftcorner().m_y+act_ptr->get_Sm_boxlength();
+
+ if(l <= x_min && x_max < r && b <= y_min && y_max < t )
+ return true;
+ else if(x_min == x_max && y_min == y_max && l==r && t == b && x_min ==r && y_min ==b)
+ return true;
+ else
+ return false;
+}
+
+
+bool NMM::in_lb_quad(
+ QuadTreeNodeNM* act_ptr,
+ double x_min,
+ double x_max,
+ double y_min,
+ double y_max)
+{
+ double l = act_ptr->get_Sm_downleftcorner().m_x;
+ double r = act_ptr->get_Sm_downleftcorner().m_x+act_ptr->get_Sm_boxlength()/2;
+ double b = act_ptr->get_Sm_downleftcorner().m_y;
+ double t = act_ptr->get_Sm_downleftcorner().m_y+act_ptr->get_Sm_boxlength()/2;
+
+ if(l <= x_min && x_max < r && b <= y_min && y_max < t )
+ return true;
+ else if(x_min == x_max && y_min == y_max && l==r && t == b && x_min ==r && y_min ==b)
+ return true;
+ else
+ return false;
+}
+
+
+bool NMM::in_rb_quad(
+ QuadTreeNodeNM* act_ptr,
+ double x_min,
+ double x_max,
+ double y_min,
+ double y_max)
+{
+ double l = act_ptr->get_Sm_downleftcorner().m_x+act_ptr->get_Sm_boxlength()/2;
+ double r = act_ptr->get_Sm_downleftcorner().m_x+act_ptr->get_Sm_boxlength();
+ double b = act_ptr->get_Sm_downleftcorner().m_y;
+ double t = act_ptr->get_Sm_downleftcorner().m_y+act_ptr->get_Sm_boxlength()/2;
+
+ if(l <= x_min && x_max < r && b <= y_min && y_max < t )
+ return true;
+ else if(x_min == x_max && y_min == y_max && l==r && t == b && x_min ==r && y_min ==b)
+ return true;
+ else
+ return false;
+}
+
+
+void NMM::split_in_x_direction(
+ QuadTreeNodeNM* act_ptr,
+ List <ParticleInfo>*& L_x_left_ptr,
+ List<ParticleInfo>*& L_y_left_ptr,
+ List <ParticleInfo>*& L_x_right_ptr,
+ List<ParticleInfo>*& L_y_right_ptr)
+{
+ ListIterator<ParticleInfo> l_item = act_ptr->get_x_List_ptr()->begin();
+ ListIterator<ParticleInfo> r_item = act_ptr->get_x_List_ptr()->rbegin();
+ ListIterator<ParticleInfo> last_left_item;
+ double act_Sm_boxlength_half = act_ptr->get_Sm_boxlength()/2;
+ double x_mid_coord = act_ptr->get_Sm_downleftcorner().m_x+ act_Sm_boxlength_half;
+ double l_xcoord,r_xcoord;
+ bool last_left_item_found = false;
+ bool left_particleList_empty = false;
+ bool right_particleList_empty = false;
+ bool left_particleList_larger = true;
+
+ //traverse *act_ptr->get_x_List_ptr() from left and right
+
+ while(!last_left_item_found)
+ {//while
+ l_xcoord = (*l_item).get_x_y_coord();
+ r_xcoord = (*r_item).get_x_y_coord();
+ if(l_xcoord >= x_mid_coord)
+ {
+ left_particleList_larger = false;
+ last_left_item_found = true;
+ if(l_item != act_ptr->get_x_List_ptr()->begin())
+ last_left_item = act_ptr->get_x_List_ptr()->cyclicPred(l_item);
+ else
+ left_particleList_empty = true;
+ }
+ else if(r_xcoord < x_mid_coord)
+ {
+ last_left_item_found = true;
+ if(r_item != act_ptr->get_x_List_ptr()->rbegin())
+ last_left_item = r_item;
+ else
+ right_particleList_empty = true;
+ }
+ if(!last_left_item_found)
+ {
+ l_item = act_ptr->get_x_List_ptr()->cyclicSucc(l_item);
+ r_item = act_ptr->get_x_List_ptr()->cyclicPred(r_item);
+ }
+ }//while
+
+ //get the L_x(y) Lists of the bigger half (from *act_ptr->get_x(y)_List_ptr))
+ //and make entries in L_x_copy,L_y_copy for the smaller halfs
+
+ if(left_particleList_empty)
+ {
+ L_x_left_ptr = NULL;
+ L_y_left_ptr = NULL;
+ L_x_right_ptr = act_ptr->get_x_List_ptr();
+ L_y_right_ptr = act_ptr->get_y_List_ptr();
+ }
+ else if(right_particleList_empty)
+ {
+ L_x_left_ptr = act_ptr->get_x_List_ptr();
+ L_y_left_ptr = act_ptr->get_y_List_ptr();
+ L_x_right_ptr = NULL;
+ L_y_right_ptr = NULL;
+ }
+ else if(left_particleList_larger)
+ x_delete_right_subLists(act_ptr,L_x_left_ptr,L_y_left_ptr,
+ L_x_right_ptr,L_y_right_ptr,last_left_item);
+ else //left particleList is smaller or equal to right particleList
+ x_delete_left_subLists(act_ptr,L_x_left_ptr,L_y_left_ptr,
+ L_x_right_ptr,L_y_right_ptr,last_left_item);
+}
+
+
+void NMM::split_in_y_direction(
+ QuadTreeNodeNM* act_ptr,
+ List<ParticleInfo>*& L_x_left_ptr,
+ List<ParticleInfo>*& L_y_left_ptr,
+ List<ParticleInfo>*& L_x_right_ptr,
+ List<ParticleInfo>*& L_y_right_ptr)
+{
+ ListIterator<ParticleInfo> l_item = act_ptr->get_y_List_ptr()->begin();
+ ListIterator<ParticleInfo> r_item = act_ptr->get_y_List_ptr()->rbegin();
+ ListIterator<ParticleInfo> last_left_item;
+ double act_Sm_boxlength_half = act_ptr->get_Sm_boxlength()/2;
+ double y_mid_coord = act_ptr->get_Sm_downleftcorner().m_y+ act_Sm_boxlength_half;
+ double l_ycoord,r_ycoord;
+ bool last_left_item_found = false;
+ bool left_particleList_empty = false;
+ bool right_particleList_empty = false;
+ bool left_particleList_larger = true;
+ //traverse *act_ptr->get_y_List_ptr() from left and right
+
+ while(!last_left_item_found)
+ {//while
+ l_ycoord = (*l_item).get_x_y_coord();
+ r_ycoord = (*r_item).get_x_y_coord();
+ if(l_ycoord >= y_mid_coord)
+ {
+ left_particleList_larger = false;
+ last_left_item_found = true;
+ if(l_item != act_ptr->get_y_List_ptr()->begin())
+ last_left_item = act_ptr->get_y_List_ptr()->cyclicPred(l_item);
+ else
+ left_particleList_empty = true;
+ }
+ else if(r_ycoord < y_mid_coord)
+ {
+ last_left_item_found = true;
+ if(r_item != act_ptr->get_y_List_ptr()->rbegin())
+ last_left_item = r_item;
+ else
+ right_particleList_empty = true;
+ }
+ if(!last_left_item_found)
+ {
+ l_item = act_ptr->get_y_List_ptr()->cyclicSucc(l_item);
+ r_item = act_ptr->get_y_List_ptr()->cyclicPred(r_item);
+ }
+ }//while
+
+ //get the L_x(y) Lists of the bigger half (from *act_ptr->get_x(y)_List_ptr))
+ //and make entries in L_x_copy,L_y_copy for the smaller halfs
+
+ if(left_particleList_empty)
+ {
+ L_x_left_ptr = NULL;
+ L_y_left_ptr = NULL;
+ L_x_right_ptr = act_ptr->get_x_List_ptr();
+ L_y_right_ptr = act_ptr->get_y_List_ptr();
+ }
+ else if(right_particleList_empty)
+ {
+ L_x_left_ptr = act_ptr->get_x_List_ptr();
+ L_y_left_ptr = act_ptr->get_y_List_ptr();
+ L_x_right_ptr = NULL;
+ L_y_right_ptr = NULL;
+ }
+ else if(left_particleList_larger)
+ y_delete_right_subLists(act_ptr,L_x_left_ptr,L_y_left_ptr,
+ L_x_right_ptr,L_y_right_ptr,last_left_item);
+ else //left particleList is smaller or equal to right particleList
+ y_delete_left_subLists(act_ptr,L_x_left_ptr,L_y_left_ptr,
+ L_x_right_ptr,L_y_right_ptr,last_left_item);
+}
+
+
+void NMM::x_delete_right_subLists(
+ QuadTreeNodeNM* act_ptr,
+ List <ParticleInfo>*& L_x_left_ptr,
+ List<ParticleInfo>*& L_y_left_ptr,
+ List <ParticleInfo>*& L_x_right_ptr,
+ List<ParticleInfo>*& L_y_right_ptr,
+ ListIterator<ParticleInfo> last_left_item)
+{
+ ParticleInfo act_p_info,p_in_L_x_info,p_in_L_y_info,del_p_info;
+ ListIterator<ParticleInfo> act_item,p_in_L_x_item,p_in_L_y_item,del_item;
+ bool last_item_reached =false;
+
+ L_x_left_ptr = act_ptr->get_x_List_ptr();
+ L_y_left_ptr = act_ptr->get_y_List_ptr();
+ L_x_right_ptr = OGDF_NEW List<ParticleInfo>;
+ L_y_right_ptr = OGDF_NEW List<ParticleInfo>;
+
+ act_item = L_x_left_ptr->cyclicSucc(last_left_item);
+
+ while(!last_item_reached)
+ {//while
+ act_p_info = *act_item;
+ del_item = act_item;
+ del_p_info = act_p_info;
+
+ //save references for *L_x(y)_right_ptr in L_x(y)_copy
+ p_in_L_x_item = act_p_info.get_copy_item();
+ p_in_L_x_info = *p_in_L_x_item;
+ p_in_L_x_info.set_subList_ptr(L_x_right_ptr);
+ *p_in_L_x_item = p_in_L_x_info;
+
+ p_in_L_y_item = (*act_p_info.get_cross_ref_item()).get_copy_item();
+ p_in_L_y_info = *p_in_L_y_item;
+ p_in_L_y_info.set_subList_ptr(L_y_right_ptr);
+ *p_in_L_y_item = p_in_L_y_info;
+
+ if(act_item != L_x_left_ptr->rbegin())
+ act_item = L_x_left_ptr->cyclicSucc(act_item);
+ else
+ last_item_reached = true;
+
+ //create *L_x(y)_left_ptr
+ L_y_left_ptr->del(del_p_info.get_cross_ref_item());
+ L_x_left_ptr->del(del_item);
+ }//while
+}
+
+
+void NMM::x_delete_left_subLists(
+ QuadTreeNodeNM* act_ptr,
+ List <ParticleInfo>*& L_x_left_ptr,
+ List<ParticleInfo>*& L_y_left_ptr,
+ List <ParticleInfo>*& L_x_right_ptr,
+ List<ParticleInfo>*& L_y_right_ptr,
+ ListIterator<ParticleInfo> last_left_item)
+{
+ ParticleInfo act_p_info,p_in_L_x_info,p_in_L_y_info,del_p_info;
+ ListIterator<ParticleInfo> act_item,p_in_L_x_item,p_in_L_y_item,del_item;
+ bool last_item_reached =false;
+
+ L_x_right_ptr = act_ptr->get_x_List_ptr();
+ L_y_right_ptr = act_ptr->get_y_List_ptr();
+ L_x_left_ptr = OGDF_NEW List<ParticleInfo>;
+ L_y_left_ptr = OGDF_NEW List<ParticleInfo>;
+
+ act_item = L_x_right_ptr->begin();
+
+ while(!last_item_reached)
+ {//while
+ act_p_info = *act_item;
+ del_item = act_item;
+ del_p_info = act_p_info;
+
+ //save references for *L_x(y)_right_ptr in L_x(y)_copy
+ p_in_L_x_item = act_p_info.get_copy_item();
+ p_in_L_x_info = *p_in_L_x_item;
+ p_in_L_x_info.set_subList_ptr(L_x_left_ptr);
+ *p_in_L_x_item = p_in_L_x_info;
+
+ p_in_L_y_item =(*act_p_info.get_cross_ref_item()).get_copy_item();
+ p_in_L_y_info = *p_in_L_y_item;
+ p_in_L_y_info.set_subList_ptr(L_y_left_ptr);
+ *p_in_L_y_item = p_in_L_y_info;
+
+ if(act_item != last_left_item)
+ act_item = L_x_right_ptr->cyclicSucc(act_item);
+ else
+ last_item_reached = true;
+
+ //create *L_x(y)_right_ptr
+ L_y_right_ptr->del(del_p_info.get_cross_ref_item());
+ L_x_right_ptr->del(del_item);
+ }//while
+}
+
+
+void NMM::y_delete_right_subLists(
+ QuadTreeNodeNM* act_ptr,
+ List <ParticleInfo>*& L_x_left_ptr,
+ List<ParticleInfo>*& L_y_left_ptr,
+ List <ParticleInfo>*& L_x_right_ptr,
+ List<ParticleInfo>*& L_y_right_ptr,
+ ListIterator<ParticleInfo> last_left_item)
+{
+ ParticleInfo act_p_info,p_in_L_x_info,p_in_L_y_info,del_p_info;
+ ListIterator<ParticleInfo> act_item,p_in_L_x_item,p_in_L_y_item,del_item;
+ bool last_item_reached =false;
+
+ L_x_left_ptr = act_ptr->get_x_List_ptr();
+ L_y_left_ptr = act_ptr->get_y_List_ptr();
+ L_x_right_ptr = OGDF_NEW List<ParticleInfo>;
+ L_y_right_ptr = OGDF_NEW List<ParticleInfo>;
+
+ act_item = L_y_left_ptr->cyclicSucc(last_left_item);
+
+ while(!last_item_reached)
+ {//while
+ act_p_info = *act_item;
+ del_item = act_item;
+ del_p_info = act_p_info;
+
+ //save references for *L_x(y)_right_ptr in L_x(y)_copy
+ p_in_L_y_item = act_p_info.get_copy_item();
+ p_in_L_y_info = *p_in_L_y_item;
+ p_in_L_y_info.set_subList_ptr(L_y_right_ptr);
+ *p_in_L_y_item = p_in_L_y_info;
+
+ p_in_L_x_item = (*act_p_info.get_cross_ref_item()).get_copy_item();
+ p_in_L_x_info = *p_in_L_x_item;
+ p_in_L_x_info.set_subList_ptr(L_x_right_ptr);
+ *p_in_L_x_item = p_in_L_x_info;
+
+ if(act_item != L_y_left_ptr->rbegin())
+ act_item = L_y_left_ptr->cyclicSucc(act_item);
+ else
+ last_item_reached = true;
+
+ //create *L_x(y)_left_ptr
+ L_x_left_ptr->del(del_p_info.get_cross_ref_item());
+ L_y_left_ptr->del(del_item);
+ }//while
+}
+
+
+void NMM::y_delete_left_subLists(
+ QuadTreeNodeNM* act_ptr,
+ List<ParticleInfo>*& L_x_left_ptr,
+ List<ParticleInfo>*& L_y_left_ptr,
+ List <ParticleInfo>*& L_x_right_ptr,
+ List<ParticleInfo>*& L_y_right_ptr,
+ ListIterator<ParticleInfo> last_left_item)
+{
+ ParticleInfo act_p_info,p_in_L_x_info,p_in_L_y_info,del_p_info;
+ ListIterator<ParticleInfo> act_item,p_in_L_x_item,p_in_L_y_item,del_item;
+ bool last_item_reached =false;
+
+ L_x_right_ptr = act_ptr->get_x_List_ptr();
+ L_y_right_ptr = act_ptr->get_y_List_ptr();
+ L_x_left_ptr = OGDF_NEW List<ParticleInfo>;
+ L_y_left_ptr = OGDF_NEW List<ParticleInfo>;
+
+ act_item = L_y_right_ptr->begin();
+
+ while(!last_item_reached)
+ {//while
+ act_p_info = *act_item;
+ del_item = act_item;
+ del_p_info = act_p_info;
+
+ //save references for *L_x(y)_right_ptr in L_x(y)_copy
+ p_in_L_y_item = act_p_info.get_copy_item();
+ p_in_L_y_info = *p_in_L_y_item;
+ p_in_L_y_info.set_subList_ptr(L_y_left_ptr);
+ *p_in_L_y_item = p_in_L_y_info;
+
+ p_in_L_x_item = (*act_p_info.get_cross_ref_item()).get_copy_item();
+ p_in_L_x_info = *p_in_L_x_item;
+ p_in_L_x_info.set_subList_ptr(L_x_left_ptr);
+ *p_in_L_x_item = p_in_L_x_info;
+
+ if(act_item != last_left_item)
+ act_item = L_y_right_ptr->cyclicSucc(act_item);
+ else
+ last_item_reached = true;
+
+ //create *L_x(y)_right_ptr
+ L_x_right_ptr->del(del_p_info.get_cross_ref_item());
+ L_y_right_ptr->del(del_item);
+ }//while
+}
+
+
+void NMM::split_in_y_direction(
+ QuadTreeNodeNM* act_ptr,
+ List<ParticleInfo>*& L_x_ptr,
+ List<ParticleInfo>*& L_x_b_ptr,
+ List<ParticleInfo>*& L_x_t_ptr,
+ List<ParticleInfo>*& L_y_ptr,
+ List<ParticleInfo>*& L_y_b_ptr,
+ List<ParticleInfo>*& L_y_t_ptr)
+{
+ ListIterator<ParticleInfo> l_item = L_y_ptr->begin();
+ ListIterator<ParticleInfo> r_item = L_y_ptr->rbegin();
+ ListIterator<ParticleInfo> last_left_item;
+ double act_Sm_boxlength_half = act_ptr->get_Sm_boxlength()/2;
+ double y_mid_coord = act_ptr->get_Sm_downleftcorner().m_y+ act_Sm_boxlength_half;
+ double l_ycoord,r_ycoord;
+ bool last_left_item_found = false;
+ bool left_particleList_empty = false;
+ bool right_particleList_empty = false;
+ bool left_particleList_larger = true;
+
+ //traverse *L_y_ptr from left and right
+
+ while(!last_left_item_found)
+ {//while
+ l_ycoord = (*l_item).get_x_y_coord();
+ r_ycoord = (*r_item).get_x_y_coord();
+ if(l_ycoord >= y_mid_coord)
+ {
+ left_particleList_larger = false;
+ last_left_item_found = true;
+ if(l_item != L_y_ptr->begin())
+ last_left_item = L_y_ptr->cyclicPred(l_item);
+ else
+ left_particleList_empty = true;
+ }
+ else if(r_ycoord < y_mid_coord)
+ {
+ last_left_item_found = true;
+ if(r_item != L_y_ptr->rbegin())
+ last_left_item = r_item;
+ else
+ right_particleList_empty = true;
+ }
+ if(!last_left_item_found)
+ {
+ l_item = L_y_ptr->cyclicSucc(l_item);
+ r_item = L_y_ptr->cyclicPred(r_item);
+ }
+ }//while
+
+ //create *L_x_l(b)_ptr
+
+ if(left_particleList_empty)
+ {
+ L_x_b_ptr = NULL;
+ L_y_b_ptr = NULL;
+ L_x_t_ptr = L_x_ptr;
+ L_y_t_ptr = L_y_ptr;
+ }
+ else if(right_particleList_empty)
+ {
+ L_x_b_ptr = L_x_ptr;
+ L_y_b_ptr = L_y_ptr;
+ L_x_t_ptr = NULL;
+ L_y_t_ptr = NULL;
+ }
+ else if(left_particleList_larger)
+ y_move_right_subLists(L_x_ptr,L_x_b_ptr,L_x_t_ptr,L_y_ptr,L_y_b_ptr,L_y_t_ptr,
+ last_left_item);
+ else //left particleList is smaller or equal to right particleList
+ y_move_left_subLists(L_x_ptr,L_x_b_ptr,L_x_t_ptr,L_y_ptr,L_y_b_ptr,L_y_t_ptr,
+ last_left_item);
+}
+
+
+void NMM::y_move_left_subLists(
+ List<ParticleInfo>*& L_x_ptr,
+ List <ParticleInfo>*& L_x_l_ptr,
+ List<ParticleInfo>*& L_x_r_ptr,
+ List<ParticleInfo>*& L_y_ptr,
+ List <ParticleInfo>*& L_y_l_ptr,
+ List<ParticleInfo>*& L_y_r_ptr,
+ ListIterator<ParticleInfo> last_left_item)
+{
+ ParticleInfo p_in_L_x_info,p_in_L_y_info;
+ ListIterator<ParticleInfo> p_in_L_x_item,p_in_L_y_item,del_item;
+ bool last_item_reached =false;
+
+ L_x_r_ptr = L_x_ptr;
+ L_y_r_ptr = L_y_ptr;
+ L_x_l_ptr = OGDF_NEW List<ParticleInfo>;
+ L_y_l_ptr = OGDF_NEW List<ParticleInfo>;
+
+ p_in_L_y_item = L_y_r_ptr->begin();
+
+ //build up the L_y_Lists and update crossreferences in *L_x_l_ptr
+ while(!last_item_reached)
+ {//while
+ p_in_L_y_info = *p_in_L_y_item;
+ del_item = p_in_L_y_item;
+
+ //create *L_x(y)_l_ptr
+ L_y_l_ptr->pushBack(p_in_L_y_info);
+ p_in_L_x_item = p_in_L_y_info.get_cross_ref_item();
+ p_in_L_x_info = *p_in_L_x_item;
+ p_in_L_x_info.set_cross_ref_item(L_y_l_ptr->rbegin());
+ p_in_L_x_info.mark(); //mark this element of the List
+ *p_in_L_x_item = p_in_L_x_info;
+
+ if(p_in_L_y_item != last_left_item)
+ p_in_L_y_item = L_y_r_ptr->cyclicSucc(p_in_L_y_item);
+ else
+ last_item_reached = true;
+
+ //create *L_y_r_ptr
+ L_y_r_ptr->del(del_item);
+ }//while
+
+ //build up the L_x Lists and update crossreferences in *L_y_l_ptr
+
+ last_item_reached = false;
+ p_in_L_x_item = L_x_r_ptr->begin();
+
+ while(!last_item_reached)
+ {//while
+ del_item = p_in_L_x_item;
+
+ if((*del_item).is_marked())
+ {
+ p_in_L_x_info = *p_in_L_x_item;
+ p_in_L_x_info.unmark();
+ L_x_l_ptr->pushBack(p_in_L_x_info);
+ p_in_L_y_item = p_in_L_x_info.get_cross_ref_item();
+ p_in_L_y_info = *p_in_L_y_item;
+ p_in_L_y_info.set_cross_ref_item(L_x_l_ptr->rbegin());
+ *p_in_L_y_item = p_in_L_y_info;
+ }
+
+ if(p_in_L_x_item != L_x_r_ptr->rbegin())
+ p_in_L_x_item = L_x_r_ptr->cyclicSucc(p_in_L_x_item);
+ else
+ last_item_reached = true;
+
+ //create *L_x_r_ptr
+ if((*del_item).is_marked())
+ L_x_r_ptr->del(del_item);
+ }//while
+}
+
+
+void NMM::y_move_right_subLists(
+ List<ParticleInfo>*& L_x_ptr,
+ List <ParticleInfo>*& L_x_l_ptr,
+ List<ParticleInfo>*& L_x_r_ptr,
+ List<ParticleInfo>*& L_y_ptr,
+ List <ParticleInfo>*& L_y_l_ptr,
+ List<ParticleInfo>*& L_y_r_ptr,
+ ListIterator<ParticleInfo> last_left_item)
+{
+ ParticleInfo p_in_L_x_info,p_in_L_y_info;
+ ListIterator<ParticleInfo> p_in_L_x_item,p_in_L_y_item,del_item;
+ bool last_item_reached =false;
+
+ L_x_l_ptr = L_x_ptr;
+ L_y_l_ptr = L_y_ptr;
+ L_x_r_ptr = OGDF_NEW List<ParticleInfo>;
+ L_y_r_ptr = OGDF_NEW List<ParticleInfo>;
+
+ p_in_L_y_item = L_y_l_ptr->cyclicSucc(last_left_item);
+
+ //build up the L_y_Lists and update crossreferences in *L_x_r_ptr
+ while(!last_item_reached)
+ {//while
+ p_in_L_y_info = *p_in_L_y_item;
+ del_item = p_in_L_y_item;
+
+ //create *L_x(y)_r_ptr
+ L_y_r_ptr->pushBack(p_in_L_y_info);
+ p_in_L_x_item = p_in_L_y_info.get_cross_ref_item();
+ p_in_L_x_info = *p_in_L_x_item;
+ p_in_L_x_info.set_cross_ref_item(L_y_r_ptr->rbegin());
+ p_in_L_x_info.mark(); //mark this element of the List
+ *p_in_L_x_item = p_in_L_x_info;
+
+ if(p_in_L_y_item != L_y_l_ptr->rbegin())
+ p_in_L_y_item = L_y_l_ptr->cyclicSucc(p_in_L_y_item);
+ else
+ last_item_reached = true;
+
+ //create *L_y_l_ptr
+ L_y_l_ptr->del(del_item);
+ }//while
+
+ //build up the L_x Lists and update crossreferences in *L_y_r_ptr
+
+ last_item_reached = false;
+ p_in_L_x_item = L_x_l_ptr->begin();
+
+ while(!last_item_reached)
+ {//while
+ del_item = p_in_L_x_item;
+
+ if((*del_item).is_marked())
+ {
+ p_in_L_x_info = *p_in_L_x_item;
+ p_in_L_x_info.unmark();
+ L_x_r_ptr->pushBack(p_in_L_x_info);
+ p_in_L_y_item = p_in_L_x_info.get_cross_ref_item();
+ p_in_L_y_info = *p_in_L_y_item;
+ p_in_L_y_info.set_cross_ref_item(L_x_r_ptr->rbegin());
+ *p_in_L_y_item = p_in_L_y_info;
+ }
+
+ if(p_in_L_x_item != L_x_l_ptr->rbegin())
+ p_in_L_x_item = L_x_l_ptr->cyclicSucc(p_in_L_x_item);
+ else
+ last_item_reached = true;
+
+ //create *L_x_r_ptr
+ if((*del_item).is_marked())
+ L_x_l_ptr->del(del_item);
+ }//while
+}
+
+
+void NMM::build_up_sorted_subLists(
+ List<ParticleInfo>& L_x_copy,
+ List<ParticleInfo>& L_y_copy)
+{
+ ParticleInfo P_x,P_y;
+ List<ParticleInfo> *L_x_ptr,*L_y_ptr;
+ ListIterator<ParticleInfo> it,new_cross_ref_item;
+
+ for(it = L_x_copy.begin();it.valid();++it)
+ if((*it).get_subList_ptr() != NULL)
+ {
+ //reset values
+ P_x = *it;
+ L_x_ptr = P_x.get_subList_ptr();
+ P_x.set_subList_ptr(NULL); //clear subList_ptr
+ P_x.set_copy_item(NULL); //clear copy_item
+ P_x.unmark(); //unmark this element
+ P_x.set_tmp_cross_ref_item(NULL);//clear tmp_cross_ref_item
+
+ //update *L_x_ptr
+ L_x_ptr->pushBack(P_x);
+
+ //update L_x_copy
+ P_x.set_tmp_cross_ref_item(L_x_ptr->rbegin());
+ *it = P_x;
+ }
+
+ for(it = L_y_copy.begin();it.valid();++it)
+ if((*it).get_subList_ptr() != NULL)
+ {
+ //reset values
+ P_y = *it;
+ L_y_ptr = P_y.get_subList_ptr();
+ P_y.set_subList_ptr(NULL); //clear subList_ptr
+ P_y.set_copy_item(NULL); //clear copy_item
+ P_y.unmark(); //unmark this element
+ P_y.set_tmp_cross_ref_item(NULL);//clear tmp_cross_ref_item
+
+ //update *L_x(y)_ptr
+
+ new_cross_ref_item = (*P_y.get_cross_ref_item()).get_tmp_cross_ref_item();
+ P_y.set_cross_ref_item(new_cross_ref_item);
+ L_y_ptr->pushBack(P_y);
+ P_x = *new_cross_ref_item;
+ P_x.set_cross_ref_item(L_y_ptr->rbegin());
+ *new_cross_ref_item = P_x;
+ }
+}
+
+
+// **********Functions needed for subtree by subtree tree construction(Begin)*********
+
+void NMM::build_up_red_quad_tree_subtree_by_subtree(
+ const Graph& G,
+ NodeArray<NodeAttributes>& A,
+ QuadTreeNM& T)
+{
+ List<QuadTreeNodeNM*> act_subtree_root_List,new_subtree_root_List;
+ List<QuadTreeNodeNM*> *act_subtree_root_List_ptr,*new_subtree_root_List_ptr,*help_ptr;
+ QuadTreeNodeNM *subtree_root_ptr;
+
+ build_up_root_vertex(G,T);
+
+ act_subtree_root_List.clear();
+ new_subtree_root_List.clear();
+ act_subtree_root_List.pushFront(T.get_root_ptr());
+ act_subtree_root_List_ptr = &act_subtree_root_List;
+ new_subtree_root_List_ptr = &new_subtree_root_List;
+
+ while(!act_subtree_root_List_ptr->empty())
+ {
+ while(!act_subtree_root_List_ptr->empty())
+ {
+ subtree_root_ptr = act_subtree_root_List_ptr->popFrontRet();
+ construct_subtree(A,T,subtree_root_ptr,*new_subtree_root_List_ptr);
+ }
+ help_ptr = act_subtree_root_List_ptr;
+ act_subtree_root_List_ptr = new_subtree_root_List_ptr;
+ new_subtree_root_List_ptr = help_ptr;
+ }
+}
+
+
+void NMM::build_up_root_vertex(const Graph&G, QuadTreeNM& T)
+{
+ node v;
+
+ T.init_tree();
+ T.get_root_ptr()->set_Sm_level(0);
+ T.get_root_ptr()->set_Sm_downleftcorner(down_left_corner);
+ T.get_root_ptr()->set_Sm_boxlength(boxlength);
+ T.get_root_ptr()->set_particlenumber_in_subtree(G.numberOfNodes());
+ forall_nodes(v,G)
+ T.get_root_ptr()->pushBack_contained_nodes(v);
+}
+
+
+void NMM::construct_subtree(
+ NodeArray<NodeAttributes>& A,
+ QuadTreeNM& T,
+ QuadTreeNodeNM *subtree_root_ptr,
+ List<QuadTreeNodeNM*>& new_subtree_root_List)
+{
+ int n = subtree_root_ptr->get_particlenumber_in_subtree();
+ int subtree_depth = static_cast<int>(max(1.0,floor(Math::log4(n))-2.0));
+ int maxindex=1;
+
+ for(int i=1; i<=subtree_depth; i++)
+ maxindex *= 2;
+ double subtree_min_boxlength = subtree_root_ptr->get_Sm_boxlength()/maxindex;
+
+ if(subtree_min_boxlength >= MIN_BOX_LENGTH)
+ {
+ Array2D<QuadTreeNodeNM*> leaf_ptr(0,maxindex-1,0,maxindex-1);
+ T.set_act_ptr(subtree_root_ptr);
+ if (find_smallest_quad(A,T)) //not all nodes have the same position
+ {
+ construct_complete_subtree(T,subtree_depth,leaf_ptr,0,0,0);
+ set_contained_nodes_for_leaves(A,subtree_root_ptr,leaf_ptr,maxindex);
+ T.set_act_ptr(subtree_root_ptr);
+ set_particlenumber_in_subtree_entries(T);
+ T.set_act_ptr(subtree_root_ptr);
+ construct_reduced_subtree(A,T,new_subtree_root_List);
+ }
+ }
+}
+
+
+void NMM::construct_complete_subtree(
+ QuadTreeNM& T,
+ int subtree_depth,
+ Array2D<QuadTreeNodeNM*>& leaf_ptr,
+ int act_depth,
+ int act_x_index,
+ int act_y_index)
+{
+ if(act_depth < subtree_depth)
+ {
+ T.create_new_lt_child();
+ T.create_new_rt_child();
+ T.create_new_lb_child();
+ T.create_new_rb_child();
+
+ T.go_to_lt_child();
+ construct_complete_subtree(T,subtree_depth,leaf_ptr,act_depth+1,2*act_x_index,
+ 2*act_y_index+1);
+ T.go_to_father();
+
+ T.go_to_rt_child();
+ construct_complete_subtree(T,subtree_depth,leaf_ptr,act_depth+1,2*act_x_index+1,
+ 2*act_y_index+1);
+ T.go_to_father();
+
+ T.go_to_lb_child();
+ construct_complete_subtree(T,subtree_depth,leaf_ptr,act_depth+1,2*act_x_index,
+ 2*act_y_index);
+ T.go_to_father();
+
+ T.go_to_rb_child();
+ construct_complete_subtree(T,subtree_depth,leaf_ptr,act_depth+1,2*act_x_index+1,
+ 2*act_y_index);
+ T.go_to_father();
+ }
+ else if (act_depth == subtree_depth)
+ {
+ leaf_ptr(act_x_index,act_y_index) = T.get_act_ptr();
+ }
+ else
+ cout<<"Error NMM::construct_complete_subtree()"<<endl;
+}
+
+
+void NMM::set_contained_nodes_for_leaves(
+ NodeArray<NodeAttributes> &A,
+ QuadTreeNodeNM* subtree_root_ptr,
+ Array2D<QuadTreeNodeNM*> &leaf_ptr,
+ int maxindex)
+{
+ node v;
+ QuadTreeNodeNM* act_ptr;
+ double xcoord,ycoord;
+ int x_index,y_index;
+ double minboxlength = subtree_root_ptr->get_Sm_boxlength()/maxindex;
+
+ while(!subtree_root_ptr->contained_nodes_empty())
+ {
+ v = subtree_root_ptr->pop_contained_nodes();
+ xcoord = A[v].get_x()-subtree_root_ptr->get_Sm_downleftcorner().m_x;
+ ycoord = A[v].get_y()-subtree_root_ptr->get_Sm_downleftcorner().m_y;;
+ x_index = int(xcoord/minboxlength);
+ y_index = int(ycoord/minboxlength);
+ act_ptr = leaf_ptr(x_index,y_index);
+ act_ptr->pushBack_contained_nodes(v);
+ act_ptr->set_particlenumber_in_subtree(act_ptr->get_particlenumber_in_subtree()+1);
+ }
+}
+
+
+void NMM::set_particlenumber_in_subtree_entries(QuadTreeNM& T)
+{
+ int child_nr;
+
+ if(!T.get_act_ptr()->is_leaf())
+ {//if
+ T.get_act_ptr()->set_particlenumber_in_subtree(0);
+
+ if (T.get_act_ptr()->child_lt_exists())
+ {
+ T.go_to_lt_child();
+ set_particlenumber_in_subtree_entries(T);
+ T.go_to_father();
+ child_nr = T.get_act_ptr()->get_child_lt_ptr()->get_particlenumber_in_subtree();
+ T.get_act_ptr()->set_particlenumber_in_subtree(child_nr + T.get_act_ptr()->
+ get_particlenumber_in_subtree());
+ }
+ if (T.get_act_ptr()->child_rt_exists())
+ {
+ T.go_to_rt_child();
+ set_particlenumber_in_subtree_entries(T);
+ T.go_to_father();
+ child_nr = T.get_act_ptr()->get_child_rt_ptr()->get_particlenumber_in_subtree();
+ T.get_act_ptr()->set_particlenumber_in_subtree(child_nr + T.get_act_ptr()->
+ get_particlenumber_in_subtree());
+ }
+ if (T.get_act_ptr()->child_lb_exists())
+ {
+ T.go_to_lb_child();
+ set_particlenumber_in_subtree_entries(T);
+ T.go_to_father();
+ child_nr = T.get_act_ptr()->get_child_lb_ptr()->get_particlenumber_in_subtree();
+ T.get_act_ptr()->set_particlenumber_in_subtree(child_nr + T.get_act_ptr()->
+ get_particlenumber_in_subtree());
+ }
+ if (T.get_act_ptr()->child_rb_exists())
+ {
+ T.go_to_rb_child();
+ set_particlenumber_in_subtree_entries(T);
+ T.go_to_father();
+ child_nr = T.get_act_ptr()->get_child_rb_ptr()->get_particlenumber_in_subtree();
+ T.get_act_ptr()->set_particlenumber_in_subtree(child_nr + T.get_act_ptr()->
+ get_particlenumber_in_subtree());
+ }
+ }//if
+}
+
+
+void NMM::construct_reduced_subtree(
+ NodeArray<NodeAttributes>& A,
+ QuadTreeNM& T,
+ List<QuadTreeNodeNM*>& new_subtree_root_List)
+{
+ do
+ {
+ QuadTreeNodeNM* act_ptr = T.get_act_ptr();
+ delete_empty_subtrees(T);
+ T.set_act_ptr(act_ptr);
+ }
+ while(check_and_delete_degenerated_node(T)== true) ;
+
+ if(!T.get_act_ptr()->is_leaf() && T.get_act_ptr()->get_particlenumber_in_subtree()
+ <= particles_in_leaves())
+ {
+ delete_sparse_subtree(T,T.get_act_ptr());
+ }
+
+ //push leaves that contain many particles
+ if(T.get_act_ptr()->is_leaf() && T.get_act_ptr()->
+ get_particlenumber_in_subtree() > particles_in_leaves())
+ new_subtree_root_List.pushBack(T.get_act_ptr());
+
+ //find smallest quad for leaves of T
+ else if(T.get_act_ptr()->is_leaf() && T.get_act_ptr()->
+ get_particlenumber_in_subtree() <= particles_in_leaves())
+ find_smallest_quad(A,T);
+
+ //recursive calls
+ else if(!T.get_act_ptr()->is_leaf())
+ {//else
+ if(T.get_act_ptr()->child_lt_exists())
+ {
+ T.go_to_lt_child();
+ construct_reduced_subtree(A,T,new_subtree_root_List);
+ T.go_to_father();
+ }
+ if(T.get_act_ptr()->child_rt_exists())
+ {
+ T.go_to_rt_child();
+ construct_reduced_subtree(A,T,new_subtree_root_List);
+ T.go_to_father();
+ }
+ if(T.get_act_ptr()->child_lb_exists())
+ {
+ T.go_to_lb_child();
+ construct_reduced_subtree(A,T,new_subtree_root_List);
+ T.go_to_father();
+ }
+ if(T.get_act_ptr()->child_rb_exists())
+ {
+ T.go_to_rb_child();
+ construct_reduced_subtree(A,T,new_subtree_root_List);
+ T.go_to_father();
+ }
+ }//else
+}
+
+
+void NMM::delete_empty_subtrees(QuadTreeNM& T)
+{
+ int child_part_nr;
+ QuadTreeNodeNM* act_ptr = T.get_act_ptr();
+
+ if(act_ptr->child_lt_exists())
+ {
+ child_part_nr = act_ptr->get_child_lt_ptr()->get_particlenumber_in_subtree();
+ if(child_part_nr == 0)
+ {
+ T.delete_tree(act_ptr->get_child_lt_ptr());
+ act_ptr->set_child_lt_ptr(NULL);
+ }
+ }
+
+ if(act_ptr->child_rt_exists())
+ {
+ child_part_nr = act_ptr->get_child_rt_ptr()->get_particlenumber_in_subtree();
+ if(child_part_nr == 0)
+ {
+ T.delete_tree(act_ptr->get_child_rt_ptr());
+ act_ptr->set_child_rt_ptr(NULL);
+ }
+ }
+
+ if(act_ptr->child_lb_exists())
+ {
+ child_part_nr = act_ptr->get_child_lb_ptr()->get_particlenumber_in_subtree();
+ if(child_part_nr == 0)
+ {
+ T.delete_tree(act_ptr->get_child_lb_ptr());
+ act_ptr->set_child_lb_ptr(NULL);
+ }
+ }
+
+ if(act_ptr->child_rb_exists())
+ {
+ child_part_nr = act_ptr->get_child_rb_ptr()->get_particlenumber_in_subtree();
+ if(child_part_nr == 0)
+ {
+ T.delete_tree(act_ptr->get_child_rb_ptr());
+ act_ptr->set_child_rb_ptr(NULL);
+ }
+ }
+}
+
+
+bool NMM::check_and_delete_degenerated_node(QuadTreeNM& T)
+{
+ QuadTreeNodeNM* delete_ptr;
+ QuadTreeNodeNM* father_ptr;
+ QuadTreeNodeNM* child_ptr;
+
+ bool lt_child = T.get_act_ptr()->child_lt_exists();
+ bool rt_child = T.get_act_ptr()->child_rt_exists();
+ bool lb_child = T.get_act_ptr()->child_lb_exists();
+ bool rb_child = T.get_act_ptr()->child_rb_exists();
+ bool is_degenerated = false;
+
+ if(lt_child && !rt_child && !lb_child && !rb_child)
+ {//if1
+ is_degenerated = true;
+ delete_ptr = T.get_act_ptr();
+ child_ptr = T.get_act_ptr()->get_child_lt_ptr();
+ if(T.get_act_ptr() == T.get_root_ptr())//special case
+ {
+ T.set_root_ptr(child_ptr);
+ T.set_act_ptr(T.get_root_ptr());
+ }
+ else//usual case
+ {
+ father_ptr = T.get_act_ptr()->get_father_ptr();
+ child_ptr->set_father_ptr(father_ptr);
+ if(father_ptr->get_child_lt_ptr() == T.get_act_ptr())
+ father_ptr->set_child_lt_ptr(child_ptr);
+ else if(father_ptr->get_child_rt_ptr() == T.get_act_ptr())
+ father_ptr->set_child_rt_ptr(child_ptr);
+ else if(father_ptr->get_child_lb_ptr() == T.get_act_ptr())
+ father_ptr->set_child_lb_ptr(child_ptr);
+ else if(father_ptr->get_child_rb_ptr() == T.get_act_ptr())
+ father_ptr->set_child_rb_ptr(child_ptr);
+ else
+ cout<<"Error NMM::delete_degenerated_node"<<endl;
+ T.set_act_ptr(child_ptr);
+ }
+ delete delete_ptr;
+ }//if1
+ else if(!lt_child && rt_child && !lb_child && !rb_child)
+ {//if2
+ is_degenerated = true;
+ delete_ptr = T.get_act_ptr();
+ child_ptr = T.get_act_ptr()->get_child_rt_ptr();
+ if(T.get_act_ptr() == T.get_root_ptr())//special case
+ {
+ T.set_root_ptr(child_ptr);
+ T.set_act_ptr(T.get_root_ptr());
+ }
+ else//usual case
+ {
+ father_ptr = T.get_act_ptr()->get_father_ptr();
+ child_ptr->set_father_ptr(father_ptr);
+ if(father_ptr->get_child_lt_ptr() == T.get_act_ptr())
+ father_ptr->set_child_lt_ptr(child_ptr);
+ else if(father_ptr->get_child_rt_ptr() == T.get_act_ptr())
+ father_ptr->set_child_rt_ptr(child_ptr);
+ else if(father_ptr->get_child_lb_ptr() == T.get_act_ptr())
+ father_ptr->set_child_lb_ptr(child_ptr);
+ else if(father_ptr->get_child_rb_ptr() == T.get_act_ptr())
+ father_ptr->set_child_rb_ptr(child_ptr);
+ else
+ cout<<"Error NMM::delete_degenerated_node"<<endl;
+ T.set_act_ptr(child_ptr);
+ }
+ delete delete_ptr;
+ }//if2
+ else if(!lt_child && !rt_child && lb_child && !rb_child)
+ {//if3
+ is_degenerated = true;
+ delete_ptr = T.get_act_ptr();
+ child_ptr = T.get_act_ptr()->get_child_lb_ptr();
+ if(T.get_act_ptr() == T.get_root_ptr())//special case
+ {
+ T.set_root_ptr(child_ptr);
+ T.set_act_ptr(T.get_root_ptr());
+ }
+ else//usual case
+ {
+ father_ptr = T.get_act_ptr()->get_father_ptr();
+ child_ptr->set_father_ptr(father_ptr);
+ if(father_ptr->get_child_lt_ptr() == T.get_act_ptr())
+ father_ptr->set_child_lt_ptr(child_ptr);
+ else if(father_ptr->get_child_rt_ptr() == T.get_act_ptr())
+ father_ptr->set_child_rt_ptr(child_ptr);
+ else if(father_ptr->get_child_lb_ptr() == T.get_act_ptr())
+ father_ptr->set_child_lb_ptr(child_ptr);
+ else if(father_ptr->get_child_rb_ptr() == T.get_act_ptr())
+ father_ptr->set_child_rb_ptr(child_ptr);
+ else
+ cout<<"Error NMM::delete_degenerated_node"<<endl;
+ T.set_act_ptr(child_ptr);
+ }
+ delete delete_ptr;
+ }//if3
+ else if(!lt_child && !rt_child && !lb_child && rb_child)
+ {//if4
+ is_degenerated = true;
+ delete_ptr = T.get_act_ptr();
+ child_ptr = T.get_act_ptr()->get_child_rb_ptr();
+ if(T.get_act_ptr() == T.get_root_ptr())//special case
+ {
+ T.set_root_ptr(child_ptr);
+ T.set_act_ptr(T.get_root_ptr());
+ }
+ else//usual case
+ {
+ father_ptr = T.get_act_ptr()->get_father_ptr();
+ child_ptr->set_father_ptr(father_ptr);
+ if(father_ptr->get_child_lt_ptr() == T.get_act_ptr())
+ father_ptr->set_child_lt_ptr(child_ptr);
+ else if(father_ptr->get_child_rt_ptr() == T.get_act_ptr())
+ father_ptr->set_child_rt_ptr(child_ptr);
+ else if(father_ptr->get_child_lb_ptr() == T.get_act_ptr())
+ father_ptr->set_child_lb_ptr(child_ptr);
+ else if(father_ptr->get_child_rb_ptr() == T.get_act_ptr())
+ father_ptr->set_child_rb_ptr(child_ptr);
+ else
+ cout<<"Error NMM::delete_degenerated_node"<<endl;
+ T.set_act_ptr(child_ptr);
+ }
+ delete delete_ptr;
+ }//if4
+ return is_degenerated;
+}
+
+
+void NMM::delete_sparse_subtree(QuadTreeNM& T, QuadTreeNodeNM* new_leaf_ptr)
+{
+ collect_contained_nodes(T,new_leaf_ptr);
+
+ if(new_leaf_ptr->child_lt_exists())
+ {
+ T.delete_tree(new_leaf_ptr->get_child_lt_ptr());
+ new_leaf_ptr->set_child_lt_ptr(NULL);
+ }
+ if(new_leaf_ptr->child_rt_exists())
+ {
+ T.delete_tree(new_leaf_ptr->get_child_rt_ptr());
+ new_leaf_ptr->set_child_rt_ptr(NULL);
+ }
+ if(new_leaf_ptr->child_lb_exists())
+ {
+ T.delete_tree(new_leaf_ptr->get_child_lb_ptr());
+ new_leaf_ptr->set_child_lb_ptr(NULL);
+ }
+ if(new_leaf_ptr->child_rb_exists())
+ {
+ T.delete_tree(new_leaf_ptr->get_child_rb_ptr());
+ new_leaf_ptr->set_child_rb_ptr(NULL);
+ }
+}
+
+
+void NMM::collect_contained_nodes(QuadTreeNM& T, QuadTreeNodeNM* new_leaf_ptr)
+{
+ if(T.get_act_ptr()->is_leaf())
+ while(!T.get_act_ptr()->contained_nodes_empty())
+ new_leaf_ptr->pushBack_contained_nodes(T.get_act_ptr()->pop_contained_nodes());
+ else if(T.get_act_ptr()->child_lt_exists())
+ {
+ T.go_to_lt_child();
+ collect_contained_nodes(T,new_leaf_ptr);
+ T.go_to_father();
+ }
+ if(T.get_act_ptr()->child_rt_exists())
+ {
+ T.go_to_rt_child();
+ collect_contained_nodes(T,new_leaf_ptr);
+ T.go_to_father();
+ }
+ if(T.get_act_ptr()->child_lb_exists())
+ {
+ T.go_to_lb_child();
+ collect_contained_nodes(T,new_leaf_ptr);
+ T.go_to_father();
+ }
+ if(T.get_act_ptr()->child_rb_exists())
+ {
+ T.go_to_rb_child();
+ collect_contained_nodes(T,new_leaf_ptr);
+ T.go_to_father();
+ }
+}
+
+
+bool NMM::find_smallest_quad(NodeArray<NodeAttributes>& A, QuadTreeNM& T)
+{
+ OGDF_ASSERT(!T.get_act_ptr()->contained_nodes_empty());
+ //if(T.get_act_ptr()->contained_nodes_empty())
+ // cout<<"Error NMM :: find_smallest_quad()"<<endl;
+ //else
+ // {//else
+ List<node>L;
+ T.get_act_ptr()->get_contained_nodes(L);
+ node v = L.popFrontRet();
+ double x_min = A[v].get_x();
+ double x_max = x_min;
+ double y_min = A[v].get_y();
+ double y_max = y_min;
+
+ while(! L.empty())
+ {
+ v = L.popFrontRet();
+ if(A[v].get_x() < x_min)
+ x_min = A[v].get_x();
+ if(A[v].get_x() > x_max)
+ x_max = A[v].get_x();
+ if(A[v].get_y() < y_min)
+ y_min = A[v].get_y();
+ if(A[v].get_y() > y_max)
+ y_max = A[v].get_y();
+ }
+ if(x_min != x_max || y_min != y_max) //nodes are not all at the same position
+ {
+ if(find_sm_cell() == FMMMLayout::scfIteratively)
+ find_small_cell_iteratively(T.get_act_ptr(),x_min,x_max,y_min,y_max);
+ else //find_sm_cell == FMMMLayout::scfAluru
+ find_small_cell_iteratively(T.get_act_ptr(),x_min,x_max,y_min,y_max);
+ return true;
+ }
+ else
+ return false;
+ //}//else
+}
+
+
+// ********Functions needed for subtree by subtree tree construction(END)************
+
+void NMM::find_small_cell_iteratively(
+ QuadTreeNodeNM* act_ptr,
+ double x_min,
+ double x_max,
+ double y_min,
+ double y_max)
+{
+ int new_level;
+ double new_boxlength;
+ DPoint new_dlc;
+ bool Sm_cell_found = false;
+
+ while ( !Sm_cell_found && ((x_max-x_min >=MIN_BOX_LENGTH) ||
+ (y_max-y_min >=MIN_BOX_LENGTH)) )
+ {
+ if(in_lt_quad(act_ptr,x_min,x_max,y_min,y_max))
+ {
+ new_level = act_ptr->get_Sm_level()+1;
+ new_boxlength = act_ptr->get_Sm_boxlength()/2;
+ new_dlc.m_x = act_ptr->get_Sm_downleftcorner().m_x;
+ new_dlc.m_y = act_ptr->get_Sm_downleftcorner().m_y+new_boxlength;
+ act_ptr->set_Sm_level(new_level);
+ act_ptr->set_Sm_boxlength(new_boxlength);
+ act_ptr->set_Sm_downleftcorner(new_dlc);
+ }
+ else if(in_rt_quad(act_ptr,x_min,x_max,y_min,y_max))
+ {
+ new_level = act_ptr->get_Sm_level()+1;
+ new_boxlength = act_ptr->get_Sm_boxlength()/2;
+ new_dlc.m_x = act_ptr->get_Sm_downleftcorner().m_x+new_boxlength;
+ new_dlc.m_y = act_ptr->get_Sm_downleftcorner().m_y+new_boxlength;
+ act_ptr->set_Sm_level(new_level);
+ act_ptr->set_Sm_boxlength(new_boxlength);
+ act_ptr->set_Sm_downleftcorner(new_dlc);
+ }
+ else if(in_lb_quad(act_ptr,x_min,x_max,y_min,y_max))
+ {
+ new_level = act_ptr->get_Sm_level()+1;
+ new_boxlength = act_ptr->get_Sm_boxlength()/2;
+ act_ptr->set_Sm_level(new_level);
+ act_ptr->set_Sm_boxlength(new_boxlength);
+ }
+ else if(in_rb_quad(act_ptr,x_min,x_max,y_min,y_max))
+ {
+ new_level = act_ptr->get_Sm_level()+1;
+ new_boxlength = act_ptr->get_Sm_boxlength()/2;
+ new_dlc.m_x = act_ptr->get_Sm_downleftcorner().m_x+new_boxlength;
+ new_dlc.m_y = act_ptr->get_Sm_downleftcorner().m_y;
+ act_ptr->set_Sm_level(new_level);
+ act_ptr->set_Sm_boxlength(new_boxlength);
+ act_ptr->set_Sm_downleftcorner(new_dlc);
+ }
+ else Sm_cell_found = true;
+ }
+}
+
+
+void NMM::find_small_cell_by_formula(
+ QuadTreeNodeNM* act_ptr,
+ double x_min,
+ double x_max,
+ double y_min,
+ double y_max)
+{
+ numexcept N;
+ int level_offset = act_ptr->get_Sm_level();
+ max_power_of_2_index = 30;//up to this level standard integer arithmetic is used
+// DPoint nullpoint (0,0);
+ IPoint Sm_position;
+ double Sm_dlc_x_coord,Sm_dlc_y_coord;
+ double Sm_boxlength;
+ int Sm_level;
+ DPoint Sm_downleftcorner;
+ int j_x = max_power_of_2_index+1;
+ int j_y = max_power_of_2_index+1;
+ bool rectangle_is_horizontal_line = false;
+ bool rectangle_is_vertical_line = false;
+ bool rectangle_is_point = false;
+
+ //shift boundaries to the origin for easy calculations
+ double x_min_old = x_min;
+ double x_max_old = x_max;
+ double y_min_old = y_min;
+ double y_max_old = y_max;
+
+ Sm_boxlength = act_ptr->get_Sm_boxlength();
+ Sm_dlc_x_coord = act_ptr->get_Sm_downleftcorner().m_x;
+ Sm_dlc_y_coord = act_ptr->get_Sm_downleftcorner().m_y;
+
+ x_min -= Sm_dlc_x_coord;
+ x_max -= Sm_dlc_x_coord;
+ y_min -= Sm_dlc_y_coord;
+ y_max -= Sm_dlc_y_coord;
+
+ //check if iterative way has to be used
+ if (x_min == x_max && y_min == y_max)
+ rectangle_is_point = true;
+ else if(x_min == x_max && y_min != y_max)
+ rectangle_is_vertical_line = true;
+ else //x_min != x_max
+ j_x = static_cast<int>(ceil(Math::log2(Sm_boxlength/(x_max-x_min))));
+
+ if(x_min != x_max && y_min == y_max)
+ rectangle_is_horizontal_line = true;
+ else //y_min != y_max
+ j_y = static_cast<int>(ceil(Math::log2(Sm_boxlength/(y_max-y_min))));
+
+ if(rectangle_is_point)
+ {
+ ;//keep the old values
+ }
+ else if ( !N.nearly_equal((x_min_old - x_max_old),(x_min-x_max)) ||
+ !N.nearly_equal((y_min_old - y_max_old),(y_min-y_max)) ||
+ x_min/Sm_boxlength < MIN_BOX_LENGTH || x_max/Sm_boxlength < MIN_BOX_LENGTH ||
+ y_min/Sm_boxlength < MIN_BOX_LENGTH || y_max/Sm_boxlength < MIN_BOX_LENGTH )
+ find_small_cell_iteratively(act_ptr,x_min_old,x_max_old,y_min_old,y_max_old);
+ else if ( ((j_x > max_power_of_2_index) && (j_y > max_power_of_2_index)) ||
+ ((j_x > max_power_of_2_index) && !rectangle_is_vertical_line) ||
+ ((j_y > max_power_of_2_index) && !rectangle_is_horizontal_line) )
+ find_small_cell_iteratively(act_ptr,x_min_old,x_max_old,y_min_old,y_max_old);
+ else //idea of Aluru et al.
+ {//else
+ int k,a1,a2,A,j_minus_k;
+ double h1,h2;
+ int Sm_x_level = 0, Sm_y_level = 0;
+ int Sm_x_position = 0, Sm_y_position = 0;
+
+ if(x_min != x_max)
+ {//if1
+ //calculate Sm_x_level and Sm_x_position
+ a1 = static_cast<int>(ceil((x_min/Sm_boxlength)*power_of_two(j_x)));
+ a2 = static_cast<int>(floor((x_max/Sm_boxlength)*power_of_two(j_x)));
+ h1 = (Sm_boxlength/power_of_two(j_x))* a1;
+ h2 = (Sm_boxlength/power_of_two(j_x))* a2;
+
+ //special cases: two tangents or left tangent and righ cutline
+ if(((h1 == x_min)&&(h2 == x_max)) || ((h1 == x_min) && (h2 != x_max)) )
+ A = a2;
+ else if (a1 == a2) //only one cutline
+ A = a1;
+ else //two cutlines or a right tangent and a left cutline (usual case)
+ {
+ if((a1 % 2) == 0)
+ A = a1;
+ else
+ A = a2;
+ }
+
+ j_minus_k = static_cast<int>(Math::log2(1+(A ^ (A-1)))-1);
+ k = j_x - j_minus_k;
+ Sm_x_level = k-1;
+ Sm_x_position = a1/ power_of_two(j_x - Sm_x_level);
+ }//if1
+
+ if(y_min != y_max)
+ {//if2
+ //calculate Sm_y_level and Sm_y_position
+ a1 = static_cast<int>(ceil((y_min/Sm_boxlength)*power_of_two(j_y)));
+ a2 = static_cast<int>(floor((y_max/Sm_boxlength)*power_of_two(j_y)));
+ h1 = (Sm_boxlength/power_of_two(j_y))* a1;
+ h2 = (Sm_boxlength/power_of_two(j_y))* a2;
+
+ //special cases: two tangents or bottom tangent and top cutline
+ if(((h1 == y_min)&&(h2 == y_max)) || ((h1 == y_min) && (h2 != y_max)) )
+ A = a2;
+ else if (a1 == a2) //only one cutline
+ A = a1;
+ else //two cutlines or a top tangent and a bottom cutline (usual case)
+ {
+ if((a1 % 2) == 0)
+ A = a1;
+ else
+ A = a2;
+ }
+
+ j_minus_k = static_cast<int>(Math::log2(1+(A ^ (A-1)))-1);
+ k = j_y - j_minus_k;
+ Sm_y_level = k-1;
+ Sm_y_position = a1/ power_of_two(j_y - Sm_y_level);
+ }//if2
+
+ if((x_min != x_max) &&(y_min != y_max))//a box with area > 0
+ {//if3
+ if (Sm_x_level == Sm_y_level)
+ {
+ Sm_level = Sm_x_level;
+ Sm_position.m_x = Sm_x_position;
+ Sm_position.m_y = Sm_y_position;
+ }
+ else if (Sm_x_level < Sm_y_level)
+ {
+ Sm_level = Sm_x_level;
+ Sm_position.m_x = Sm_x_position;
+ Sm_position.m_y = Sm_y_position/power_of_two(Sm_y_level-Sm_x_level);
+ }
+ else //Sm_x_level > Sm_y_level
+ {
+ Sm_level = Sm_y_level;
+ Sm_position.m_x = Sm_x_position/power_of_two(Sm_x_level-Sm_y_level);
+ Sm_position.m_y = Sm_y_position;
+ }
+ }//if3
+ else if(x_min == x_max) //a vertical line
+ {//if4
+ Sm_level = Sm_y_level;
+ Sm_position.m_x = static_cast<int> (floor((x_min*power_of_two(Sm_level))/
+ Sm_boxlength));
+ Sm_position.m_y = Sm_y_position;
+ }//if4
+ else //y_min == y_max (a horizontal line)
+ {//if5
+ Sm_level = Sm_x_level;
+ Sm_position.m_x = Sm_x_position;
+ Sm_position.m_y = static_cast<int> (floor((y_min*power_of_two(Sm_level))/
+ Sm_boxlength));
+ }//if5
+
+ Sm_boxlength = Sm_boxlength/power_of_two(Sm_level);
+ Sm_downleftcorner.m_x = Sm_dlc_x_coord + Sm_boxlength * Sm_position.m_x;
+ Sm_downleftcorner.m_y = Sm_dlc_y_coord + Sm_boxlength * Sm_position.m_y;
+ act_ptr->set_Sm_level(Sm_level+level_offset);
+ act_ptr->set_Sm_boxlength(Sm_boxlength);
+ act_ptr->set_Sm_downleftcorner(Sm_downleftcorner);
+ }//else
+}
+
+
+inline void NMM::delete_red_quad_tree_and_count_treenodes(QuadTreeNM& T)
+{
+ T.delete_tree(T.get_root_ptr());
+}
+
+
+inline void NMM::form_multipole_expansions(
+ NodeArray<NodeAttributes>& A,
+ QuadTreeNM& T,
+ List<QuadTreeNodeNM*>& quad_tree_leaves)
+{
+ T.set_act_ptr(T.get_root_ptr());
+ form_multipole_expansion_of_subtree(A,T,quad_tree_leaves);
+}
+
+
+void NMM::form_multipole_expansion_of_subtree(
+ NodeArray<NodeAttributes>& A,
+ QuadTreeNM& T,
+ List<QuadTreeNodeNM*>& quad_tree_leaves)
+{
+ init_expansion_Lists(T.get_act_ptr());
+ set_center(T.get_act_ptr());
+
+ if(T.get_act_ptr()->is_leaf()) //form expansions for leaf nodes
+ {//if
+ quad_tree_leaves.pushBack(T.get_act_ptr());
+ form_multipole_expansion_of_leaf_node(A,T.get_act_ptr());
+ }//if
+ else //rekursive calls and add shifted expansions
+ {//else
+ if(T.get_act_ptr()->child_lt_exists())
+ {
+ T.go_to_lt_child();
+ form_multipole_expansion_of_subtree(A,T,quad_tree_leaves);
+ add_shifted_expansion_to_father_expansion(T.get_act_ptr());
+ T.go_to_father();
+ }
+ if(T.get_act_ptr()->child_rt_exists())
+ {
+ T.go_to_rt_child();
+ form_multipole_expansion_of_subtree(A,T,quad_tree_leaves);
+ add_shifted_expansion_to_father_expansion(T.get_act_ptr());
+ T.go_to_father();
+ }
+ if(T.get_act_ptr()->child_lb_exists())
+ {
+ T.go_to_lb_child();
+ form_multipole_expansion_of_subtree(A,T,quad_tree_leaves);
+ add_shifted_expansion_to_father_expansion(T.get_act_ptr());
+ T.go_to_father();
+ }
+ if(T.get_act_ptr()->child_rb_exists())
+ {
+ T.go_to_rb_child();
+ form_multipole_expansion_of_subtree(A,T,quad_tree_leaves);
+ add_shifted_expansion_to_father_expansion(T.get_act_ptr());
+ T.go_to_father();
+ }
+ }//else
+}
+
+
+inline void NMM::init_expansion_Lists(QuadTreeNodeNM* act_ptr)
+{
+ int i;
+ Array<complex<double> > nulList (precision()+1);
+
+ for (i = 0;i<=precision();i++)
+ nulList[i] = 0;
+
+ act_ptr->set_multipole_exp(nulList,precision());
+ act_ptr->set_locale_exp(nulList,precision());
+}
+
+
+void NMM::set_center(QuadTreeNodeNM* act_ptr)
+{
+
+ const int BILLION = 1000000000;
+ DPoint Sm_downleftcorner = act_ptr->get_Sm_downleftcorner();
+ double Sm_boxlength = act_ptr->get_Sm_boxlength();
+ double boxcenter_x_coord,boxcenter_y_coord;
+ DPoint Sm_dlc;
+ double rand_y;
+
+ boxcenter_x_coord = Sm_downleftcorner.m_x + Sm_boxlength * 0.5;
+ boxcenter_y_coord = Sm_downleftcorner.m_y + Sm_boxlength * 0.5;
+
+ //for use of complex logarithm: waggle the y-coordinates a little bit
+ //such that the new center is really inside the actual box and near the exact center
+ rand_y = double(randomNumber(1,BILLION)+1)/(BILLION+2);//rand number in (0,1)
+ boxcenter_y_coord = boxcenter_y_coord + 0.001 * Sm_boxlength * rand_y;
+
+ complex<double> boxcenter(boxcenter_x_coord,boxcenter_y_coord);
+ act_ptr->set_Sm_center(boxcenter);
+}
+
+
+void NMM::form_multipole_expansion_of_leaf_node(
+ NodeArray<NodeAttributes>& A,
+ QuadTreeNodeNM* act_ptr)
+{
+ int k;
+ complex<double> Q (0,0);
+ complex<double> z_0 = act_ptr->get_Sm_center();//center of actual box
+ complex<double> nullpoint (0,0);
+ Array<complex<double> > coef (precision()+1);
+ complex<double> z_v_minus_z_0_over_k;
+ List<node> nodes_in_box;
+ int i;
+ ListIterator<node> v_it;
+
+ act_ptr->get_contained_nodes(nodes_in_box);
+
+ for(v_it = nodes_in_box.begin();v_it.valid();++v_it)
+ Q += 1;
+ coef[0] = Q;
+
+ for(i = 1; i<=precision();i++)
+ coef[i] = nullpoint;
+
+ for(v_it = nodes_in_box.begin();v_it.valid();++v_it)
+ {
+ complex<double> z_v (A[*v_it].get_x(),A[*v_it].get_y());
+ z_v_minus_z_0_over_k = z_v - z_0;
+ for(k=1;k<=precision();k++)
+ {
+ coef[k] += ((double(-1))*z_v_minus_z_0_over_k)/double(k);
+ z_v_minus_z_0_over_k *= z_v - z_0;
+ }
+ }
+ act_ptr->replace_multipole_exp(coef,precision());
+}
+
+
+void NMM::add_shifted_expansion_to_father_expansion(QuadTreeNodeNM* act_ptr)
+{
+ QuadTreeNodeNM* father_ptr = act_ptr->get_father_ptr();
+ complex<double> sum;
+ complex<double> z_0,z_1;
+ Array<complex<double> > z_0_minus_z_1_over (precision()+1);
+
+ z_1 = father_ptr->get_Sm_center();
+ z_0 = act_ptr->get_Sm_center();
+ father_ptr->get_multipole_exp()[0] += act_ptr->get_multipole_exp()[0];
+
+ //init z_0_minus_z_1_over
+ z_0_minus_z_1_over[0] = 1;
+ for(int i = 1; i<= precision(); i++)
+ z_0_minus_z_1_over[i] = z_0_minus_z_1_over[i-1] * (z_0 - z_1);
+
+ for(int k=1; k<=precision(); k++)
+ {
+ sum = (act_ptr->get_multipole_exp()[0]*(double(-1))*z_0_minus_z_1_over[k])/
+ double(k) ;
+ for(int s=1; s<=k; s++)
+ sum += act_ptr->get_multipole_exp()[s]*z_0_minus_z_1_over[k-s]* binko(k-1,s-1);
+ father_ptr->get_multipole_exp()[k] += sum;
+ }
+}
+
+
+void NMM::calculate_local_expansions_and_WSPRLS(
+ NodeArray<NodeAttributes>&A,
+ QuadTreeNodeNM* act_node_ptr)
+{
+ List<QuadTreeNodeNM*> I,L,L2,E,D1,D2,M;
+ QuadTreeNodeNM *father_ptr = 0, *selected_node_ptr;
+ ListIterator<QuadTreeNodeNM*> ptr_it;
+
+ //Step 0: Initializations
+ if(! act_node_ptr->is_root())
+ father_ptr = act_node_ptr->get_father_ptr();
+ I.clear();L.clear();L2.clear();D1.clear();D2.clear();M.clear();
+
+ //Step 1: calculate Lists I (min. ill sep. set), L (interaction List of well sep.
+ //nodes , they are used to form the Local Expansions from the multipole expansions),
+ //L2 (non bordering leaves that have a larger or equal Sm-cell and are ill separated;
+ //empty if the actual node is a leaf)
+ //calculate List D1(bordering leaves that have a larger or equal Sm-cell and are
+ //ill separated) and D2 (non bordering leaves that have a larger or equal Sm-cell and
+ //are ill separated;empty if the actual node is an interior node)
+
+ //special case: act_node is the root of T
+ if (act_node_ptr->is_root())
+ {//if
+ E.clear();
+ if(act_node_ptr->child_lt_exists())
+ E.pushBack(act_node_ptr->get_child_lt_ptr());
+ if(act_node_ptr->child_rt_exists())
+ E.pushBack(act_node_ptr->get_child_rt_ptr());
+ if(act_node_ptr->child_lb_exists())
+ E.pushBack(act_node_ptr->get_child_lb_ptr());
+ if(act_node_ptr->child_rb_exists())
+ E.pushBack(act_node_ptr->get_child_rb_ptr());
+ }//if
+
+ //usual case: act_node is an interior node of T
+ else
+ {
+ father_ptr->get_D1(E); //bordering leaves of father
+ father_ptr->get_I(I); //min ill sep. nodes of father
+
+
+ for(ptr_it = I.begin();ptr_it.valid();++ptr_it)
+ E.pushBack(*ptr_it);
+ I.clear();
+ }
+
+
+ while (!E.empty())
+ {//while
+ selected_node_ptr = E.popFrontRet();
+ if (well_separated(act_node_ptr,selected_node_ptr))
+ L.pushBack(selected_node_ptr);
+ else if (act_node_ptr->get_Sm_level() < selected_node_ptr->get_Sm_level())
+ I.pushBack(selected_node_ptr);
+ else if(!selected_node_ptr->is_leaf())
+ {
+ if(selected_node_ptr->child_lt_exists())
+ E.pushBack(selected_node_ptr->get_child_lt_ptr());
+ if(selected_node_ptr->child_rt_exists())
+ E.pushBack(selected_node_ptr->get_child_rt_ptr());
+ if(selected_node_ptr->child_lb_exists())
+ E.pushBack(selected_node_ptr->get_child_lb_ptr());
+ if(selected_node_ptr->child_rb_exists())
+ E.pushBack(selected_node_ptr->get_child_rb_ptr());
+ }
+ else if(bordering(act_node_ptr,selected_node_ptr))
+ D1.pushBack(selected_node_ptr);
+ else if( (selected_node_ptr != act_node_ptr)&&(act_node_ptr->is_leaf()))
+ D2.pushBack(selected_node_ptr); //direct calculation (no errors produced)
+ else if((selected_node_ptr != act_node_ptr)&&!(act_node_ptr->is_leaf()))
+ L2.pushBack(selected_node_ptr);
+ }//while
+
+ act_node_ptr->set_I(I);
+ act_node_ptr->set_D1(D1);
+ act_node_ptr->set_D2(D2);
+
+ //Step 2: add local expansions from father(act_node_ptr) and calculate locale
+ //expansions for all nodes in L
+ if(!act_node_ptr->is_root())
+ add_shifted_local_exp_of_parent(act_node_ptr);
+
+ for(ptr_it = L.begin();ptr_it.valid();++ptr_it)
+ add_local_expansion(*ptr_it,act_node_ptr);
+
+ //Step 3: calculate locale expansions for all nodes in D2 (simpler than in Step 2)
+
+ for(ptr_it = L2.begin();ptr_it.valid();++ptr_it)
+ add_local_expansion_of_leaf(A,*ptr_it,act_node_ptr);
+
+ //Step 4: recursive calls if act_node is not a leaf
+ if(!act_node_ptr->is_leaf())
+ {
+ if(act_node_ptr->child_lt_exists())
+ calculate_local_expansions_and_WSPRLS(A,act_node_ptr->get_child_lt_ptr());
+ if(act_node_ptr->child_rt_exists())
+ calculate_local_expansions_and_WSPRLS(A,act_node_ptr->get_child_rt_ptr());
+ if(act_node_ptr->child_lb_exists())
+ calculate_local_expansions_and_WSPRLS(A,act_node_ptr->get_child_lb_ptr());
+ if(act_node_ptr->child_rb_exists())
+ calculate_local_expansions_and_WSPRLS(A,act_node_ptr->get_child_rb_ptr());
+ }
+
+ //Step 5: WSPRLS(Well Separateness Preserving Refinement of leaf surroundings)
+ //if act_node is a leaf than calculate the list D1,D2 and M from I and D1
+ else // *act_node_ptr is a leaf
+ {//else
+ act_node_ptr->get_D1(D1);
+ act_node_ptr->get_D2(D2);
+
+ while(!I.empty())
+ {//while
+ selected_node_ptr = I.popFrontRet();
+ if(selected_node_ptr->is_leaf())
+ {
+ //here D1 contains larger AND smaller bordering leaves!
+ if(bordering(act_node_ptr,selected_node_ptr))
+ D1.pushBack(selected_node_ptr);
+ else
+ D2.pushBack(selected_node_ptr);
+ }
+ else //!selected_node_ptr->is_leaf()
+ {
+ if(bordering(act_node_ptr,selected_node_ptr))
+ {
+ if(selected_node_ptr->child_lt_exists())
+ I.pushBack(selected_node_ptr->get_child_lt_ptr());
+ if(selected_node_ptr->child_rt_exists())
+ I.pushBack(selected_node_ptr->get_child_rt_ptr());
+ if(selected_node_ptr->child_lb_exists())
+ I.pushBack(selected_node_ptr->get_child_lb_ptr());
+ if(selected_node_ptr->child_rb_exists())
+ I.pushBack(selected_node_ptr->get_child_rb_ptr());
+ }
+ else
+ M.pushBack(selected_node_ptr);
+ }
+ }//while
+ act_node_ptr->set_D1(D1);
+ act_node_ptr->set_D2(D2);
+ act_node_ptr->set_M(M);
+ }//else
+}
+
+
+bool NMM::well_separated(QuadTreeNodeNM* node_1_ptr, QuadTreeNodeNM* node_2_ptr)
+{
+ numexcept N;
+ double boxlength_1 = node_1_ptr->get_Sm_boxlength();
+ double boxlength_2 = node_2_ptr->get_Sm_boxlength();
+ double x1_min,x1_max,y1_min,y1_max,x2_min,x2_max,y2_min,y2_max;
+ bool x_overlap,y_overlap;
+
+ if(boxlength_1 <= boxlength_2)
+ {
+ x1_min = node_1_ptr->get_Sm_downleftcorner().m_x;
+ x1_max = node_1_ptr->get_Sm_downleftcorner().m_x+boxlength_1;
+ y1_min = node_1_ptr->get_Sm_downleftcorner().m_y;
+ y1_max = node_1_ptr->get_Sm_downleftcorner().m_y+boxlength_1;
+
+ //blow the box up
+ x2_min = node_2_ptr->get_Sm_downleftcorner().m_x-boxlength_2;
+ x2_max = node_2_ptr->get_Sm_downleftcorner().m_x+2*boxlength_2;
+ y2_min = node_2_ptr->get_Sm_downleftcorner().m_y-boxlength_2;
+ y2_max = node_2_ptr->get_Sm_downleftcorner().m_y+2*boxlength_2;
+ }
+ else //boxlength_1 > boxlength_2
+ {
+ //blow the box up
+ x1_min = node_1_ptr->get_Sm_downleftcorner().m_x-boxlength_1;
+ x1_max = node_1_ptr->get_Sm_downleftcorner().m_x+2*boxlength_1;
+ y1_min = node_1_ptr->get_Sm_downleftcorner().m_y-boxlength_1;
+ y1_max = node_1_ptr->get_Sm_downleftcorner().m_y+2*boxlength_1;
+
+ x2_min = node_2_ptr->get_Sm_downleftcorner().m_x;
+ x2_max = node_2_ptr->get_Sm_downleftcorner().m_x+boxlength_2;
+ y2_min = node_2_ptr->get_Sm_downleftcorner().m_y;
+ y2_max = node_2_ptr->get_Sm_downleftcorner().m_y+boxlength_2;
+ }
+
+ //test if boxes overlap
+ if((x1_max <= x2_min)|| N.nearly_equal(x1_max,x2_min)||
+ (x2_max <= x1_min)|| N.nearly_equal(x2_max,x1_min))
+ x_overlap = false;
+ else
+ x_overlap = true;
+ if((y1_max <= y2_min)|| N.nearly_equal(y1_max,y2_min)||
+ (y2_max <= y1_min)|| N.nearly_equal(y2_max,y1_min))
+ y_overlap = false;
+ else
+ y_overlap = true;
+
+ if (x_overlap && y_overlap)
+ return false;
+ else
+ return true;
+}
+
+
+bool NMM::bordering(QuadTreeNodeNM* node_1_ptr,QuadTreeNodeNM* node_2_ptr)
+{
+ numexcept N;
+ double boxlength_1 = node_1_ptr->get_Sm_boxlength();
+ double boxlength_2 = node_2_ptr->get_Sm_boxlength();
+ double x1_min = node_1_ptr->get_Sm_downleftcorner().m_x;
+ double x1_max = node_1_ptr->get_Sm_downleftcorner().m_x+boxlength_1;
+ double y1_min = node_1_ptr->get_Sm_downleftcorner().m_y;
+ double y1_max = node_1_ptr->get_Sm_downleftcorner().m_y+boxlength_1;
+ double x2_min = node_2_ptr->get_Sm_downleftcorner().m_x;
+ double x2_max = node_2_ptr->get_Sm_downleftcorner().m_x+boxlength_2;
+ double y2_min = node_2_ptr->get_Sm_downleftcorner().m_y;
+ double y2_max = node_2_ptr->get_Sm_downleftcorner().m_y+boxlength_2;
+
+ if( ( (x2_min <= x1_min || N.nearly_equal(x2_min,x1_min)) &&
+ (x1_max <= x2_max || N.nearly_equal(x1_max,x2_max)) &&
+ (y2_min <= y1_min || N.nearly_equal(y2_min,y1_min)) &&
+ (y1_max <= y2_max || N.nearly_equal(y1_max,y2_max)) ) ||
+ ( (x1_min <= x2_min || N.nearly_equal(x1_min,x2_min)) &&
+ (x2_max <= x1_max || N.nearly_equal(x2_max,x1_max)) &&
+ (y1_min <= y2_min || N.nearly_equal(y1_min,y2_min)) &&
+ (y2_max <= y1_max || N.nearly_equal(y2_max,y1_max)) ) )
+ return false; //one box contains the other box(inclusive neighbours)
+ else
+ {//else
+ if (boxlength_1 <= boxlength_2)
+ { //shift box1
+ if (x1_min < x2_min)
+ { x1_min +=boxlength_1;x1_max +=boxlength_1; }
+ else if (x1_max > x2_max)
+ { x1_min -=boxlength_1;x1_max -=boxlength_1; }
+ if (y1_min < y2_min)
+ { y1_min +=boxlength_1;y1_max +=boxlength_1; }
+ else if (y1_max > y2_max)
+ { y1_min -=boxlength_1;y1_max -=boxlength_1; }
+ }
+ else //boxlength_1 > boxlength_2
+ {//shift box2
+ if (x2_min < x1_min)
+ { x2_min +=boxlength_2;x2_max +=boxlength_2; }
+ else if (x2_max > x1_max)
+ { x2_min -=boxlength_2;x2_max -=boxlength_2; }
+ if (y2_min < y1_min)
+ { y2_min +=boxlength_2;y2_max +=boxlength_2; }
+ else if (y2_max > y1_max)
+ { y2_min -=boxlength_2;y2_max -=boxlength_2; }
+ }
+ if( ( (x2_min <= x1_min || N.nearly_equal(x2_min,x1_min)) &&
+ (x1_max <= x2_max || N.nearly_equal(x1_max,x2_max)) &&
+ (y2_min <= y1_min || N.nearly_equal(y2_min,y1_min)) &&
+ (y1_max <= y2_max || N.nearly_equal(y1_max,y2_max)) ) ||
+ ( (x1_min <= x2_min || N.nearly_equal(x1_min,x2_min)) &&
+ (x2_max <= x1_max || N.nearly_equal(x2_max,x1_max)) &&
+ (y1_min <= y2_min || N.nearly_equal(y1_min,y2_min)) &&
+ (y2_max <= y1_max || N.nearly_equal(y2_max,y1_max)) ) )
+ return true;
+ else
+ return false;
+ }//else
+}
+
+
+void NMM::add_shifted_local_exp_of_parent(QuadTreeNodeNM* node_ptr)
+{
+ QuadTreeNodeNM* father_ptr = node_ptr->get_father_ptr();
+
+ complex<double> z_0 = father_ptr->get_Sm_center();
+ complex<double> z_1 = node_ptr->get_Sm_center();
+ Array<complex<double> > z_1_minus_z_0_over (precision()+1);
+
+ //init z_1_minus_z_0_over
+ z_1_minus_z_0_over[0] = 1;
+ for(int i = 1; i<= precision(); i++)
+ z_1_minus_z_0_over[i] = z_1_minus_z_0_over[i-1] * (z_1 - z_0);
+
+
+ for(int l = 0; l <= precision();l++)
+ {
+ complex<double> sum (0,0);
+ for(int k = l;k<=precision();k++)
+ sum += binko(k,l)*father_ptr->get_local_exp()[k]*z_1_minus_z_0_over[k-l];
+ node_ptr->get_local_exp()[l] += sum;
+ }
+}
+
+
+void NMM::add_local_expansion(QuadTreeNodeNM* ptr_0, QuadTreeNodeNM* ptr_1)
+{
+ complex<double> z_0 = ptr_0->get_Sm_center();
+ complex<double> z_1 = ptr_1->get_Sm_center();
+ complex<double> sum, z_error;
+ complex<double> factor;
+ complex<double> z_1_minus_z_0_over_k;
+ complex<double> z_1_minus_z_0_over_s;
+ complex<double> pow_minus_1_s_plus_1;
+ complex<double> pow_minus_1_s;
+
+ //Error-Handling for complex logarithm
+ if ((std::real(z_1-z_0) <=0) && (std::imag(z_1-z_0) == 0)) //no cont. compl. log fct exists !!!
+ {
+ z_error = log(z_1 -z_0 + 0.0000001);
+ sum = ptr_0->get_multipole_exp()[0] * z_error;
+ }
+ else
+ sum = ptr_0->get_multipole_exp()[0]* log(z_1-z_0);
+
+
+ z_1_minus_z_0_over_k = z_1 - z_0;
+ for(int k = 1; k<=precision(); k++)
+ {
+ sum += ptr_0->get_multipole_exp()[k]/z_1_minus_z_0_over_k;
+ z_1_minus_z_0_over_k *= z_1-z_0;
+ }
+ ptr_1->get_local_exp()[0] += sum;
+
+ z_1_minus_z_0_over_s = z_1 - z_0;
+ for (int s = 1; s <= precision(); s++)
+ {
+ pow_minus_1_s_plus_1 = (((s+1)% 2 == 0) ? 1 : -1);
+ pow_minus_1_s = ((pow_minus_1_s_plus_1 == double(1))? -1 : 1);
+ sum = pow_minus_1_s_plus_1*ptr_0->get_multipole_exp()[0]/(z_1_minus_z_0_over_s *
+ double(s));
+ factor = pow_minus_1_s/z_1_minus_z_0_over_s;
+ z_1_minus_z_0_over_s *= z_1-z_0;
+ complex<double> sum_2 (0,0);
+
+ z_1_minus_z_0_over_k = z_1 - z_0;
+ for(int k=1; k<=precision(); k++)
+ {
+ sum_2 += binko(s+k-1,k-1)*ptr_0->get_multipole_exp()[k]/z_1_minus_z_0_over_k;
+ z_1_minus_z_0_over_k *= z_1-z_0;
+ }
+ ptr_1->get_local_exp()[s] += sum + factor* sum_2;
+ }
+}
+
+
+void NMM::add_local_expansion_of_leaf(
+ NodeArray<NodeAttributes>&A,
+ QuadTreeNodeNM* ptr_0,
+ QuadTreeNodeNM* ptr_1)
+{
+ List<node> contained_nodes;
+ double multipole_0_of_v = 1;//only the first coefficient is not zero
+ complex<double> z_1 = ptr_1->get_Sm_center();
+ complex<double> z_error;
+ complex<double> z_1_minus_z_0_over_s;
+ complex<double> pow_minus_1_s_plus_1;
+
+ ptr_0->get_contained_nodes(contained_nodes);
+
+ forall_listiterators(node, v_it, contained_nodes)
+ {//forall
+ //set position of v as center ( (1,0,....,0) are the multipole coefficients at v)
+ complex<double> z_0 (A[*v_it].get_x(),A[*v_it].get_y());
+
+ //now transform multipole_0_of_v to the locale expansion around z_1
+
+ //Error-Handling for complex logarithm
+ if ((std::real(z_1-z_0) <=0) && (std::imag(z_1-z_0) == 0)) //no cont. compl. log fct exists!
+ {
+ z_error = log(z_1 -z_0 + 0.0000001);
+ ptr_1->get_local_exp()[0] += multipole_0_of_v * z_error;
+ }
+ else
+ ptr_1->get_local_exp()[0] += multipole_0_of_v * log(z_1-z_0);
+
+ z_1_minus_z_0_over_s = z_1 - z_0;
+ for (int s = 1;s <= precision();s++)
+ {
+ pow_minus_1_s_plus_1 = (((s+1)% 2 == 0) ? 1 : -1);
+ ptr_1->get_local_exp()[s] += pow_minus_1_s_plus_1*multipole_0_of_v/
+ (z_1_minus_z_0_over_s * double(s));
+ z_1_minus_z_0_over_s *= z_1-z_0;
+ }
+ }//forall
+}
+
+
+void NMM::transform_local_exp_to_forces(
+ NodeArray <NodeAttributes>&A,
+ List<QuadTreeNodeNM*>& quad_tree_leaves,
+ NodeArray<DPoint>& F_local_exp)
+{
+ List<node> contained_nodes;
+ complex<double> sum;
+ complex<double> complex_null (0,0);
+ complex<double> z_0;
+ complex<double> z_v_minus_z_0_over_k_minus_1;
+ DPoint force_vector;
+
+ //calculate derivative of the potential polynom (= local expansion at leaf nodes)
+ //and evaluate it for each node in contained_nodes()
+ //and transform the complex number back to the real-world, to obtain the force
+
+ forall_listiterators( QuadTreeNodeNM*, leaf_ptr_ptr,quad_tree_leaves)
+ {
+ (*leaf_ptr_ptr)->get_contained_nodes(contained_nodes);
+ z_0 = (*leaf_ptr_ptr)->get_Sm_center();
+
+ forall_listiterators(node, v_ptr,contained_nodes)
+ {
+ complex<double> z_v (A[*v_ptr].get_x(),A[*v_ptr].get_y());
+ sum = complex_null;
+ z_v_minus_z_0_over_k_minus_1 = 1;
+ for(int k=1; k<=precision(); k++)
+ {
+ sum += double(k) * (*leaf_ptr_ptr)->get_local_exp()[k] *
+ z_v_minus_z_0_over_k_minus_1;
+ z_v_minus_z_0_over_k_minus_1 *= z_v - z_0;
+ }
+ force_vector.m_x = sum.real();
+ force_vector.m_y = (-1) * sum.imag();
+ F_local_exp[*v_ptr] = force_vector;
+ }
+ }
+}
+
+
+void NMM::transform_multipole_exp_to_forces(
+ NodeArray<NodeAttributes>& A,
+ List<QuadTreeNodeNM*>& quad_tree_leaves,
+ NodeArray<DPoint>& F_multipole_exp)
+{
+ List<QuadTreeNodeNM*> M;
+ List<node> act_contained_nodes;
+ ListIterator<node> v_ptr;
+ complex<double> sum;
+ complex<double> z_0;
+ complex<double> z_v_minus_z_0_over_minus_k_minus_1;
+ DPoint force_vector;
+
+ //for each leaf u in the M-List of an actual leaf v do:
+ //calculate derivative of the multipole expansion function at u
+ //and evaluate it for each node in v.get_contained_nodes()
+ //and transform the complex number back to the real-world, to obtain the force
+
+ forall_listiterators(QuadTreeNodeNM*, act_leaf_ptr_ptr,quad_tree_leaves)
+ {
+ (*act_leaf_ptr_ptr)->get_contained_nodes(act_contained_nodes);
+ (*act_leaf_ptr_ptr)->get_M(M);
+ forall_listiterators(QuadTreeNodeNM*, M_node_ptr_ptr,M)
+ {
+ z_0 = (*M_node_ptr_ptr)->get_Sm_center();
+ forall_listiterators(node, v_ptr,act_contained_nodes)
+ {
+ complex<double> z_v (A[*v_ptr].get_x(),A[*v_ptr].get_y());
+ z_v_minus_z_0_over_minus_k_minus_1 = 1.0/(z_v-z_0);
+ sum = (*M_node_ptr_ptr)->get_multipole_exp()[0]*
+ z_v_minus_z_0_over_minus_k_minus_1;
+
+ for(int k=1; k<=precision(); k++)
+ {
+ z_v_minus_z_0_over_minus_k_minus_1 /= z_v - z_0;
+ sum -= double(k) * (*M_node_ptr_ptr)->get_multipole_exp()[k] *
+ z_v_minus_z_0_over_minus_k_minus_1;
+ }
+ force_vector.m_x = sum.real();
+ force_vector.m_y = (-1) * sum.imag();
+ F_multipole_exp[*v_ptr] = F_multipole_exp[*v_ptr] + force_vector;
+
+ }
+ }
+ }
+}
+
+
+void NMM::calculate_neighbourcell_forces(
+ NodeArray<NodeAttributes>& A,
+ List <QuadTreeNodeNM*>& quad_tree_leaves,
+ NodeArray<DPoint>& F_direct)
+{
+ numexcept N;
+ List<node> act_contained_nodes,neighbour_contained_nodes,non_neighbour_contained_nodes;
+ List<QuadTreeNodeNM*> neighboured_leaves;
+ List<QuadTreeNodeNM*> non_neighboured_leaves;
+ double act_leaf_boxlength,neighbour_leaf_boxlength;
+ DPoint act_leaf_dlc,neighbour_leaf_dlc;
+ DPoint f_rep_u_on_v;
+ DPoint vector_v_minus_u;
+// DPoint nullpoint(0,0);
+ DPoint pos_u,pos_v;
+ double norm_v_minus_u,scalar;
+ int length;
+ node u,v;
+
+ forall_listiterators(QuadTreeNodeNM*, act_leaf_ptr,quad_tree_leaves)
+ {//forall
+ (*act_leaf_ptr)->get_contained_nodes(act_contained_nodes);
+
+ if(act_contained_nodes.size() <= particles_in_leaves())
+ {//if (usual case)
+
+ //Step1:calculate forces inside act_contained_nodes
+
+ length = act_contained_nodes.size();
+ Array<node> numbered_nodes (length+1);
+ int k = 1;
+ forall_listiterators(node, v_ptr,act_contained_nodes)
+ {
+ numbered_nodes[k]= *v_ptr;
+ k++;
+ }
+
+ for(k = 1; k<length; k++)
+ for(int l = k+1; l<=length; l++)
+ {
+ u = numbered_nodes[k];
+ v = numbered_nodes[l];
+ pos_u = A[u].get_position();
+ pos_v = A[v].get_position();
+ if (pos_u == pos_v)
+ {//if2 (Exception handling if two nodes have the same position)
+ pos_u = N.choose_distinct_random_point_in_radius_epsilon(pos_u);
+ }//if2
+ vector_v_minus_u = pos_v - pos_u;
+ norm_v_minus_u = vector_v_minus_u.norm();
+ if(!N.f_rep_near_machine_precision(norm_v_minus_u,f_rep_u_on_v))
+ {
+ scalar = f_rep_scalar(norm_v_minus_u)/norm_v_minus_u ;
+ f_rep_u_on_v.m_x = scalar * vector_v_minus_u.m_x;
+ f_rep_u_on_v.m_y = scalar * vector_v_minus_u.m_y;
+ }
+ F_direct[v] = F_direct[v] + f_rep_u_on_v;
+ F_direct[u] = F_direct[u] - f_rep_u_on_v;
+ }
+
+ //Step 2: calculated forces to nodes in act_contained_nodes() of
+ //leaf_ptr->get_D1()
+
+ (*act_leaf_ptr)->get_D1(neighboured_leaves);
+ act_leaf_boxlength = (*act_leaf_ptr)->get_Sm_boxlength();
+ act_leaf_dlc = (*act_leaf_ptr)->get_Sm_downleftcorner();
+
+ forall_listiterators(QuadTreeNodeNM*, neighbour_leaf_ptr,neighboured_leaves)
+ {//forall2
+ //forget boxes that have already been looked at
+
+ neighbour_leaf_boxlength = (*neighbour_leaf_ptr)->get_Sm_boxlength();
+ neighbour_leaf_dlc = (*neighbour_leaf_ptr)->get_Sm_downleftcorner();
+
+ if( (act_leaf_boxlength > neighbour_leaf_boxlength) ||
+ (act_leaf_boxlength == neighbour_leaf_boxlength &&
+ act_leaf_dlc.m_x < neighbour_leaf_dlc.m_x)
+ || (act_leaf_boxlength == neighbour_leaf_boxlength &&
+ act_leaf_dlc.m_x == neighbour_leaf_dlc.m_x &&
+ act_leaf_dlc.m_y < neighbour_leaf_dlc.m_y) )
+ {//if
+ (*neighbour_leaf_ptr)->get_contained_nodes(neighbour_contained_nodes);
+ forall_listiterators(node, v_ptr,act_contained_nodes)
+ forall_listiterators(node, u_ptr, neighbour_contained_nodes)
+ {//for
+ pos_u = A[*u_ptr].get_position();
+ pos_v = A[*v_ptr].get_position();
+ if (pos_u == pos_v)
+ {//if2 (Exception handling if two nodes have the same position)
+ pos_u = N.choose_distinct_random_point_in_radius_epsilon(pos_u);
+ }//if2
+ vector_v_minus_u = pos_v - pos_u;
+ norm_v_minus_u = vector_v_minus_u.norm();
+ if(!N.f_rep_near_machine_precision(norm_v_minus_u,f_rep_u_on_v))
+ {
+ scalar = f_rep_scalar(norm_v_minus_u)/norm_v_minus_u ;
+ f_rep_u_on_v.m_x = scalar * vector_v_minus_u.m_x;
+ f_rep_u_on_v.m_y = scalar * vector_v_minus_u.m_y;
+ }
+ F_direct[*v_ptr] = F_direct[*v_ptr] + f_rep_u_on_v;
+ F_direct[*u_ptr] = F_direct[*u_ptr] - f_rep_u_on_v;
+ }//for
+ }//if
+ }//forall2
+
+ //Step 3: calculated forces to nodes in act_contained_nodes() of
+ //leaf_ptr->get_D2()
+
+ (*act_leaf_ptr)->get_D2(non_neighboured_leaves);
+ forall_listiterators(QuadTreeNodeNM*, non_neighbour_leaf_ptr,
+ non_neighboured_leaves)
+ {//forall3
+ (*non_neighbour_leaf_ptr)->get_contained_nodes(
+ non_neighbour_contained_nodes);
+ forall_listiterators(node,v_ptr,act_contained_nodes)
+ forall_listiterators(node, u_ptr,non_neighbour_contained_nodes)
+ {//for
+ pos_u = A[*u_ptr].get_position();
+ pos_v = A[*v_ptr].get_position();
+ if (pos_u == pos_v)
+ {//if2 (Exception handling if two nodes have the same position)
+ pos_u = N.choose_distinct_random_point_in_radius_epsilon(pos_u);
+ }//if2
+ vector_v_minus_u = pos_v - pos_u;
+ norm_v_minus_u = vector_v_minus_u.norm();
+ if(!N.f_rep_near_machine_precision(norm_v_minus_u,f_rep_u_on_v))
+ {
+ scalar = f_rep_scalar(norm_v_minus_u)/norm_v_minus_u ;
+ f_rep_u_on_v.m_x = scalar * vector_v_minus_u.m_x;
+ f_rep_u_on_v.m_y = scalar * vector_v_minus_u.m_y;
+ }
+ F_direct[*v_ptr] = F_direct[*v_ptr] + f_rep_u_on_v;
+ }//for
+ }//forall3
+ }//if(usual case)
+ else //special case (more then particles_in_leaves() particles in this leaf)
+ {//else
+ forall_listiterators(node, v_ptr, act_contained_nodes)
+ {
+ pos_v = A[*v_ptr].get_position();
+ pos_u = N.choose_distinct_random_point_in_radius_epsilon(pos_v);
+ vector_v_minus_u = pos_v - pos_u;
+ norm_v_minus_u = vector_v_minus_u.norm();
+ if(!N.f_rep_near_machine_precision(norm_v_minus_u,f_rep_u_on_v))
+ {
+ scalar = f_rep_scalar(norm_v_minus_u)/norm_v_minus_u ;
+ f_rep_u_on_v.m_x = scalar * vector_v_minus_u.m_x;
+ f_rep_u_on_v.m_y = scalar * vector_v_minus_u.m_y;
+ }
+ F_direct[*v_ptr] = F_direct[*v_ptr] + f_rep_u_on_v;
+ }
+ }//else
+ }//forall
+}
+
+
+inline void NMM::add_rep_forces(
+ const Graph& G,
+ NodeArray<DPoint>& F_direct,
+ NodeArray<DPoint>& F_multipole_exp,
+ NodeArray<DPoint>& F_local_exp,
+ NodeArray<DPoint>& F_rep)
+{
+ node v;
+ forall_nodes(v,G)
+ {
+ F_rep[v] = F_direct[v]+F_local_exp[v]+F_multipole_exp[v];
+ }
+}
+
+
+inline double NMM::f_rep_scalar(double d)
+{
+ if (d > 0)
+ {
+ return 1/d;
+ }
+ else
+ {
+ cout<<"Error NMM:: f_rep_scalar nodes at same position"<<endl;
+ return 0;
+ }
+}
+
+
+void NMM::init_binko(int t)
+{
+ typedef double* double_ptr;
+
+ BK = new double_ptr[t+1];
+
+ for(int i = 0; i<= t ; i++)
+ {//for
+ BK[i] = new double[i+1];
+ }//for
+
+ //Pascal's triangle
+
+ for (int i = 0; i <= t; i++)
+ BK[i][0] = BK[i][i] = 1;
+
+ for (int i = 2; i <= t; i ++)
+ for (int j = 1; j < i; j++)
+ {
+ BK[i][j] = BK[i-1][j-1]+BK[i-1][j];
+ }
+}
+
+
+inline void NMM::free_binko()
+{
+ for(int i = 0;i<= 2*precision();i++)
+ delete [] BK[i];
+ delete [] BK;
+}
+
+
+inline double NMM::binko(int n, int k)
+{
+ return BK[n][k];
+}
+
+}//namespace ogdf
diff --git a/ogdf/internal/energybased/NMM.h b/ogdf/internal/energybased/NMM.h
new file mode 100644
index 0000000..8a3a00b
--- /dev/null
+++ b/ogdf/internal/energybased/NMM.h
@@ -0,0 +1,516 @@
+/*
+ * $Revision: 2564 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-07 00:03:48 +0200 (Sa, 07. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of class NMM (New Multipole Method).
+ *
+ * \author Stefan Hachul
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_NMM_H
+#define OGDF_NMM_H
+
+#include "../../basic/Graph.h"
+#include "../..//basic/List.h"
+#include "../..//basic/Array2D.h"
+#include "../..//basic/geometry.h"
+#include "NodeAttributes.h"
+#include "EdgeAttributes.h"
+#include "QuadTreeNM.h"
+#include "ParticleInfo.h"
+#include "FruchtermanReingold.h"
+#include <complex>
+
+
+namespace ogdf {
+
+class OGDF_EXPORT NMM
+{
+public:
+ NMM(); //constructor
+ ~NMM() { } //destructor
+
+ //Calculate rep. forces for each node.
+ void calculate_repulsive_forces(const Graph &G,
+ NodeArray<NodeAttributes>& A,
+ NodeArray<DPoint>& F_rep);
+
+ //Make all initialisations that are needed for New Multipole Method (NMM)
+ void make_initialisations (const Graph &G,
+ double boxlength,
+ DPoint down_left_corner,
+ int particles_in_leaves,
+ int precision,
+ int tree_construction_way,
+ int find_small_cell);
+
+ //Dynamically allocated memory is freed here.
+ void deallocate_memory();
+
+ //Import updated information of the drawing area.
+ void update_boxlength_and_cornercoordinate(double b_l,DPoint d_l_c);
+
+private:
+ int MIN_NODE_NUMBER; //The minimum number of nodes for which the forces are
+ //calculated using NMM (for lower values the exact
+ //calculation is used).
+ bool using_NMM; //Indicates whether the exact method or NMM is used for force
+ //calculation (value depends on MIN_NODE_NUMBER)
+ FruchtermanReingold ExactMethod; //needed in case that using_NMM == false
+
+ int _tree_construction_way;//1 = pathwise;2 = subtreewise
+ int _find_small_cell;//0 = iterative; 1= Aluru
+ int _particles_in_leaves;//max. number of particles for leaves of the quadtree
+ int _precision; //precision for p-term multipole expansion
+
+ double boxlength;//length of drawing box
+ DPoint down_left_corner;//down left corner of drawing box
+
+ int* power_of_2; //holds the powers of 2 (for speed reasons to calculate the
+ //maximal boxindex (index is from 0 to max_power_of_2_index)
+ int max_power_of_2_index;//holds max. index for power_of_2 (= 30)
+ double ** BK; //holds the binomial coefficients
+ List<DPoint> rep_forces; //stores the rep. forces of the last iteration
+ //(needed for error calculation)
+
+ //private helping functions
+
+ //The array power_of_2 is calculated for values from 0 to max_power_of_2_index
+ //which is set here to 30.
+ void init_power_of_2_array();
+
+ //The space of power_of_2 is freed.
+ void free_power_of_2_array();
+
+ //Returns power_of_2[i] for values <= max_power_of_2_index else it returns
+ //pow(2,i).
+ int power_of_two(int i);
+
+ //Returns the maximal index of a box in level i.
+ int maxboxindex (int level);
+
+ //Use NMM for force calculation (used for large Graphs (|V| > MIN_NODE_NUMBER)).
+ void calculate_repulsive_forces_by_NMM(const Graph &G, NodeArray
+ <NodeAttributes>& A, NodeArray<DPoint>& F_rep);
+
+ //Use the exact method for force calculation (used for small Graphs (|V| <=
+ //MIN_NODE_NUMBER) for speed reasons).
+ void calculate_repulsive_forces_by_exact_method(const Graph &G,
+ NodeArray<NodeAttributes>& A,
+ NodeArray<DPoint>& F_rep);
+
+ // *********Functions needed for path by path tree construction***********
+
+ //The reduced quadtree is build up path by path (the Lists LE,ME, the
+ //centers, D1, D2, M, and quad_tree_leaves are not calculated here.
+ void build_up_red_quad_tree_path_by_path(const Graph& G,
+ NodeArray<NodeAttributes>& A,
+ QuadTreeNM& T);
+
+ //Makes L_x(y)_copy a copy of L_x(y)_orig and sets p.copy_item for each element in
+ //L_x(y)_orig to the ListIterator of the corresponding element in L_x(y)_copy;
+ //Furthermore, the p.cross_ref_items in L_x(y)_copy are set and p.subList_ptr and
+ //p.tmp_cross_ref_item is reset to NULL in both lists.
+ void make_copy_and_init_Lists(List<ParticleInfo>& L_x_orig,
+ List<ParticleInfo>& L_x_copy,
+ List<ParticleInfo>& L_y_orig,
+ List<ParticleInfo>& L_y_copy);
+
+ //The root node of T is constructed.
+ void build_up_root_node(const Graph& G,NodeArray<NodeAttributes>& A, QuadTreeNM& T);
+
+ //The sorted and linked Lists L_x and L_y for the root node are created.
+ void create_sorted_coordinate_Lists(const Graph& G,NodeArray<NodeAttributes>& A,
+ List<ParticleInfo>& L_x, List<ParticleInfo>& L_y);
+
+ //T is extended by a subtree T1 rooted at the T.get_act_node().
+ //The boxlength and down_left_corner of the actual node is reduced if it is
+ //not the minimal subquad that contains all the particles in the represented area.
+ void decompose_subtreenode(QuadTreeNM& T,
+ List<ParticleInfo>& act_x_List_copy,
+ List<ParticleInfo>& act_y_List_copy,
+ List<QuadTreeNodeNM*>& new_leaf_List);
+
+ //The extreme coordinates of the particles contained in *act_ptr are calculated.
+ void calculate_boundaries_of_act_node(QuadTreeNodeNM* act_ptr,
+ double& x_min,
+ double& x_max,
+ double& y_min,
+ double& y_max);
+
+ //Returns true if the rectangle defined by x_min,...,y_max lies within the
+ //left(right)_top(bottom) quad of the small cell of *act_ptr.
+ bool in_lt_quad(QuadTreeNodeNM* act_ptr, double x_min,double x_max, double y_min, double y_max);
+ bool in_rt_quad(QuadTreeNodeNM* act_ptr, double x_min,double x_max, double y_min, double y_max);
+ bool in_lb_quad(QuadTreeNodeNM* act_ptr, double x_min,double x_max, double y_min, double y_max);
+ bool in_rb_quad(QuadTreeNodeNM* act_ptr, double x_min,double x_max, double y_min, double y_max);
+
+ //The Lists *act_ptr->get_x(y)_List_ptr() are split into two sublists containing
+ //the particles in the left and right half of the actual quad. The list that is
+ //larger is constructed from *act_ptr->get_x(y)_List_ptr() by deleting the other
+ //elements; The smaller List stays empty at this point, but the corresponding
+ //elements in L_x(y)_copy contain a pointer to the x(y) List, where they belong to.
+ void split_in_x_direction(
+ QuadTreeNodeNM* act_ptr,
+ List<ParticleInfo>*& L_x_left_ptr,
+ List<ParticleInfo>*& L_y_left_ptr,
+ List<ParticleInfo>*& L_x_right_ptr,
+ List <ParticleInfo>*& L_y_right_ptr);
+
+ //The Lists *act_ptr->get_x(y)_List_ptr() are split into two subLists containing
+ //the particles in the top /bottom half ...
+ void split_in_y_direction(
+ QuadTreeNodeNM* act_ptr,
+ List<ParticleInfo>*& L_x_bottom_ptr,
+ List<ParticleInfo>*& L_y_bottom_ptr,
+ List<ParticleInfo>*& L_x_top_ptr,
+ List<ParticleInfo>*& L_y_top_ptr);
+
+
+ //The Lists *L_x(y)_left_ptr are constructed from *act_ptr->get_x(y)_List_ptr()
+ //by deleting all elements right from last_left_item in *act_ptr->get_x_List_ptr()
+ //the corresponding values in *act_ptr->get_y_List_ptr() are deleted as well.
+ //The corresponding List-elements of the deleted elements in the Lists L_x(y)_copy
+ //hold the information, that they belong to the Lists *L_x(y)_left_ptr.
+ void x_delete_right_subLists(
+ QuadTreeNodeNM* act_ptr,
+ List<ParticleInfo>*& L_x_left_ptr,
+ List <ParticleInfo>*& L_y_left_ptr,
+ List<ParticleInfo>*& L_x_right_ptr,
+ List <ParticleInfo>*& L_y_right_ptr,
+ ListIterator<ParticleInfo> last_left_item);
+
+ //Analogue as above.
+ void x_delete_left_subLists(
+ QuadTreeNodeNM* act_ptr,
+ List<ParticleInfo>*& L_x_left_ptr,
+ List <ParticleInfo>*& L_y_left_ptr,
+ List<ParticleInfo>*& L_x_right_ptr,
+ List <ParticleInfo>*& L_y_right_ptr,
+ ListIterator<ParticleInfo> last_left_item);
+
+ //The Lists *L_x(y)_left_ptr are constructed from *act_ptr->get_x(y)_List_ptr()
+ //by deleting all elements right from last_left_item in *act_ptr->get_y_List_ptr()
+ //the ...
+ void y_delete_right_subLists(
+ QuadTreeNodeNM* act_ptr,
+ List<ParticleInfo>*& L_x_left_ptr,
+ List<ParticleInfo>*& L_y_left_ptr,
+ List<ParticleInfo>*& L_x_right_ptr,
+ List <ParticleInfo>*& L_y_right_ptr,
+ ListIterator<ParticleInfo> last_left_item);
+
+ //Analogue as above.
+ void y_delete_left_subLists(
+ QuadTreeNodeNM* act_ptr,
+ List<ParticleInfo>*& L_x_left_ptr,
+ List<ParticleInfo>*& L_y_left_ptr,
+ List<ParticleInfo>*& L_x_right_ptr,
+ List <ParticleInfo>*& L_y_right_ptr,
+ ListIterator<ParticleInfo> last_left_item);
+
+
+ //The Lists *L_x(y)_b_ptr and *L_x(y)_t_ptr are constructed from the Lists
+ // *L_x(y)_ptr.
+ void split_in_y_direction(
+ QuadTreeNodeNM* act_ptr,
+ List<ParticleInfo>*& L_x_ptr,
+ List<ParticleInfo>*& L_x_b_ptr,
+ List<ParticleInfo>*& L_x_t_ptr,
+ List<ParticleInfo>*& L_y_ptr,
+ List<ParticleInfo>*& L_y_b_ptr,
+ List<ParticleInfo>*& L_y_t_ptr);
+
+ //The Lists *L_x(y)_b(t)_ptr are constructed from the Lists *L_x(y)_ptr by
+ //moving all List elements from *L_x(y)_ptr that belong to *L_x(y)_l_ptr
+ //to this List. the L_x(y)_right_ptr point to the reduced Lists L_x(y)_ptr
+ //afterwards.
+ void y_move_left_subLists(List<ParticleInfo>*& L_x_ptr,
+ List<ParticleInfo>*& L_x_b_ptr,
+ List<ParticleInfo>*& L_x_t_ptr,
+ List<ParticleInfo>*& L_y_ptr,
+ List <ParticleInfo>*& L_y_b_ptr,
+ List<ParticleInfo>*& L_y_t_ptr,
+ ListIterator<ParticleInfo> last_left_item);
+
+ //Same as above but the elements that belong to *&L_x(y)_right_ptr are moved.
+ void y_move_right_subLists(List<ParticleInfo>*& L_x_ptr,
+ List<ParticleInfo>*& L_x_b_ptr,
+ List<ParticleInfo>*& L_x_t_ptr,
+ List<ParticleInfo>*&L_y_ptr,
+ List <ParticleInfo>*& L_y_b_ptr,
+ List<ParticleInfo>*& L_y_t_ptr,
+ ListIterator<ParticleInfo> last_left_item);
+
+ //The sorted subLists, that can be accesssed by the entries in L_x(y)_copy->
+ //get_subList_ptr() are constructed.
+ void build_up_sorted_subLists(List<ParticleInfo>& L_x_copy,
+ List<ParticleInfo>& act_y_List_copy);
+
+ // ************functions needed for subtree by subtree tree construction **********
+
+ //The reduced quadtree is build up subtree by subtree (the lists LE, ME the
+ //centers, D1, D2, M, quad_tree_leaves are not calculated here.
+ void build_up_red_quad_tree_subtree_by_subtree(const Graph& G,
+ NodeArray<NodeAttributes>& A,
+ QuadTreeNM& T);
+
+ //The root node of T is constructed and contained_nodes is set to the list of
+ //all nodes of G.
+ void build_up_root_vertex(const Graph&G, QuadTreeNM& T);
+
+ //The reduced subtree of T rooted at *subtree_root_ptr containing all the particles
+ //of subtree_root_ptr->get_contained_nodes() is constructed; Pointers to leaves
+ //of the subtree that contain more than particles_in_leaves() particles in their
+ //contained_nodes() lists are added to new_subtree_root_List_ptr; The lists
+ //contained_nodes() are nonempty only for the (actual) leaves of T.
+ void construct_subtree(NodeArray<NodeAttributes>& A,
+ QuadTreeNM& T,
+ QuadTreeNodeNM* subtree_root_ptr,
+ List<QuadTreeNodeNM*>& new_subtree_root_List);
+
+ //A complete subtree of T and of depth subtree_depth, rooted at *T.get_act_ptr() is
+ //constructed. Furthermore leaf_ptr[i][j] points to a leaf node of the subtree
+ //that represents the quadratic subregion of *T.get_act_ptr() at subtree_depth
+ //and position [i][j] i,j in 0,...,maxindex;act_depth(x_index,y_index) are
+ //helping variables for recursive calls.
+ void construct_complete_subtree(QuadTreeNM& T,
+ int subtree_depth,
+ Array2D<QuadTreeNodeNM*>& leaf_ptr,
+ int act_depth,
+ int act_x_index,
+ int act_y_index);
+
+ //The particles in subtree_root_ptr->get_contained_nodes() are assigned to
+ //the the contained_nodes lists of the leaves of the subtree by using the
+ //information of A,leaf_ptr and maxindex. Afterwards contained_nodes of
+ // *subtree_root_ptr is empty.
+ void set_contained_nodes_for_leaves(NodeArray<NodeAttributes>& A,
+ QuadTreeNodeNM* subtree_root_ptr,
+ Array2D<QuadTreeNodeNM*>& leaf_ptr,
+ int maxindex);
+
+ //The subtree of T rooted at *T.get_act_ptr() is traversed bottom up, such that
+ //the subtreeparticlenumber of every node in this subtree is set correctly.
+ void set_particlenumber_in_subtree_entries(QuadTreeNM& T);
+
+ //The reduced subtree rooted at *T.get_act_ptr() is calculated ; A pointer to
+ //every leaf of this subtree that contains more then particles_in_leaves()
+ //particles is added to new_subtree_root_List; The lists contained_nodes are
+ //empty for all but the leaves.
+ void construct_reduced_subtree(NodeArray<NodeAttributes>& A,
+ QuadTreeNM& T,
+ List<QuadTreeNodeNM*>& new_subtree_root_List);
+
+ //All subtrees of *T.get_act_ptr() that have a child c of *T.get_act_ptr() as root
+ //and c.get_particlenumber_in_subtree() == 0 are deleted.
+ void delete_empty_subtrees(QuadTreeNM& T);
+
+ //If *T.get_act_ptr() is a degenerated node (has only one child c) *T.get_act_ptr()
+ //is deleted from T and the child c is linked with the father of *T.get_act_ptr()
+ //if *T.get_act_ptr() is the root of T than c is set to the new root of T
+ //T.get_act_ptr() points to c afterwards; Furthermore true is returned if
+ // *T.get_act_ptr() has been degenerated, else false is returned.
+ bool check_and_delete_degenerated_node(QuadTreeNM& T);
+
+ //The subtree rooted at new_leaf_ptr is deleted, *new_leaf_ptr is a leaf
+ //of T and new_leaf_ptr->get_contained_nodes() contains all the particles
+ //contained in the leaves of the deleted subtree; Precondition: T.get_act_ptr() is
+ //new_leaf_ptr.
+ void delete_sparse_subtree(QuadTreeNM& T, QuadTreeNodeNM* new_leaf_ptr);
+
+ //new_leaf_ptr->get_contained_nodes() contains all the particles contained in
+ //the leaves of its subtree afterwards; Precondition: T.get_act_ptr() is
+ //new_leaf_ptr
+ void collect_contained_nodes(QuadTreeNM& T, QuadTreeNodeNM* new_leaf_ptr);
+
+ //If all nodes in T.get_act_ptr()->get_contained_nodes() have the same position
+ //false is returned. Else true is returned and
+ //the boxlength, down_left_corner and level of *T.get_act_ptr() is updated
+ //such that this values are minimal (i.e. the smallest quad that contains all
+ //the particles of T.get_act_ptr()->get_contained_nodes(); If all this particles
+ //are placed at a point nothing is done.
+ bool find_smallest_quad(NodeArray<NodeAttributes>& A, QuadTreeNM& T);
+
+ // *********functions needed for subtree by subtree tree construction(end) ********
+
+ //Finds the small cell of the actual Node of T iteratively,and updates
+ //Sm_downleftcorner, Sm_boxlength, and level of *act_ptr.
+ void find_small_cell_iteratively(QuadTreeNodeNM* act_ptr,
+ double x_min,
+ double x_max,
+ double y_min,
+ double y_max);
+
+ //Finds the small cell of the actual Node of T by Aluru's Formula, and updates
+ //Sm_downleftcorner, Sm_boxlength, and level of *act_ptr.
+ void find_small_cell_by_formula(QuadTreeNodeNM* act_ptr,
+ double x_min,
+ double x_max,
+ double y_min,
+ double y_max);
+
+ //The reduced quad tree is deleted; Furthermore the treenode_number is calculated.
+ void delete_red_quad_tree_and_count_treenodes(QuadTreeNM& T);
+
+ //The multipole expansion terms ME are calculated for all nodes of T ( centers are
+ //initialized for each cell and quad_tree_leaves stores pointers to leaves of T).
+ void form_multipole_expansions(NodeArray<NodeAttributes>& A,
+ QuadTreeNM& T,
+ List<QuadTreeNodeNM*>& quad_tree_leaves);
+
+ //The multipole expansion List ME for the tree rooted at T.get_act_ptr() is
+ //recursively calculated.
+ void form_multipole_expansion_of_subtree(NodeArray<NodeAttributes>& A,
+ QuadTreeNM& T,
+ List<QuadTreeNodeNM*>& quad_tree_leaves);
+
+ //The Lists ME and LE are both initialized to zero entries for *act_ptr.
+ void init_expansion_Lists(QuadTreeNodeNM* act_ptr);
+
+ //The center of the box of *act_ptr is initialized.
+ void set_center(QuadTreeNodeNM* act_ptr);
+
+ //Calculate List ME for *act_ptr Precondition: *act_ptr is a leaf.
+ void form_multipole_expansion_of_leaf_node(NodeArray<NodeAttributes>& A,
+ QuadTreeNodeNM* act_ptr);
+
+ //Add the shifted ME Lists of *act_ptr to act_ptr->get_father_ptr() ; precondition
+ // *act_ptr has a father_node.
+ void add_shifted_expansion_to_father_expansion(QuadTreeNodeNM* act_ptr);
+
+ //According to NMM T is traversed recursively top-down starting from act_node_ptr
+ //== T.get_root_ptr() and thereby the lists D1, D2, M and LE are calculated for all
+ //treenodes.
+ void calculate_local_expansions_and_WSPRLS(NodeArray<NodeAttributes>&A,
+ QuadTreeNodeNM* act_node_ptr);
+
+ //If the small cell of ptr_1 and ptr_2 are well separated true is returned (else
+ //false).
+ bool well_separated(QuadTreeNodeNM* ptr_1, QuadTreeNodeNM* ptr_2);
+
+ //If ptr_1 and ptr_2 are nonequal and bordering true is returned; else false.
+ bool bordering(QuadTreeNodeNM* ptr_1, QuadTreeNodeNM* ptr_2);
+
+ //The shifted local expansion of the father of node_ptr is added to the local
+ //expansion of node_ptr;precondition: node_ptr is not the root of T.
+ void add_shifted_local_exp_of_parent(QuadTreeNodeNM* node_ptr);
+
+ //The multipole expansion of *ptr_1 is transformed into a local expansion around
+ //the center of *ptr_2 and added to *ptr_2 s local expansion list.
+ void add_local_expansion(QuadTreeNodeNM* ptr_1, QuadTreeNodeNM* ptr_2);
+
+ //The multipole expansion for every particle of leaf_ptr->contained_nodes
+ //(1,0,...) is transformed into a local expansion around the center of *ptr_2 and
+ //added to *ptr_2 s local expansion List;precondition: *leaf_ptr is a leaf.
+ void add_local_expansion_of_leaf(NodeArray<NodeAttributes>&A,
+ QuadTreeNodeNM* leaf_ptr,
+ QuadTreeNodeNM* act_ptr);
+
+ //For each leaf v in quad_tree_leaves the force contribution defined by
+ //v.get_local_exp() is calculated and stored in F_local_exp.
+ void transform_local_exp_to_forces(NodeArray <NodeAttributes>&A,
+ List<QuadTreeNodeNM*>& quad_tree_leaves,
+ NodeArray<DPoint>& F_local_exp);
+
+ //For each leaf v in quad_tree_leaves the force contribution defined by all nodes
+ //in v.get_M() is calculated and stored in F_multipole_exp.
+ void transform_multipole_exp_to_forces(NodeArray<NodeAttributes>& A,
+ List<QuadTreeNodeNM*>& quad_tree_leaves,
+ NodeArray<DPoint>& F_multipole_exp);
+
+ //For each leaf v in quad_tree_leaves the force contributions from all leaves in
+ //v.get_D1() and v.get_D2() are calculated.
+ void calculate_neighbourcell_forces(NodeArray<NodeAttributes>& A,
+ List<QuadTreeNodeNM*>& quad_tree_leaves,
+ NodeArray<DPoint>& F_direct);
+
+ //Add repulsive force contributions for each node.
+ void add_rep_forces(const Graph& G,
+ NodeArray<DPoint>& F_direct,
+ NodeArray<DPoint>& F_multipole_exp,
+ NodeArray<DPoint>& F_local_exp,
+ NodeArray<DPoint>& F_rep);
+
+ //Returns the repulsing force_function_value of scalar d.
+ double f_rep_scalar (double d);
+
+ //Init BK -matrix for values n, k in 0 to t.
+ void init_binko(int t);
+
+ //Free space for BK.
+ void free_binko();
+
+ //Returns n over k.
+ double binko(int n, int k);
+
+ //The way to construct the reduced tree (0) = level by level (1) path by path
+ //(2) subtree by subtree
+ int tree_construction_way() const { return _tree_construction_way; }
+
+ void tree_construction_way(int a) {
+ _tree_construction_way = (((0<=a)&&(a<=2)) ? a : 0);
+ }
+
+ //(0) means that the smallest quadratic cell that surrounds a node of the
+ //quadtree is calculated iteratively in constant time (1) means that it is
+ //calculated by the formula of Aluru et al. in constant time
+ int find_sm_cell() const { return _find_small_cell; }
+
+ void find_sm_cell(int a) {
+ _find_small_cell = (((0<=a)&&(a<=1)) ? a : 0);
+ }
+
+ //Max. number of particles that are contained in a leaf of the red. quadtree.
+ void particles_in_leaves (int b) { _particles_in_leaves = ((b>= 1)? b : 1); }
+ int particles_in_leaves () const { return _particles_in_leaves; }
+
+ //The precision p for the p-term multipole expansions.
+ void precision (int p) { _precision = ((p >= 1 ) ? p : 1); }
+ int precision () const { return _precision; }
+};
+
+}//namespace ogdf
+#endif
+
diff --git a/ogdf/internal/energybased/NodeAttributes.cpp b/ogdf/internal/energybased/NodeAttributes.cpp
new file mode 100644
index 0000000..73c5a44
--- /dev/null
+++ b/ogdf/internal/energybased/NodeAttributes.cpp
@@ -0,0 +1,143 @@
+/*
+ * $Revision: 2552 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-05 16:45:20 +0200 (Do, 05. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of class NodeAttributes.
+ *
+ * \author Stefan Hachul
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "NodeAttributes.h"
+
+namespace ogdf{
+
+ostream &operator<< (ostream & output, const NodeAttributes & A)
+{
+ output <<"width: "<< A.width<<" height: "<<A.height<<" position: "<<A.position ;
+ output<<" index of lower level node ";
+ if (A.v_lower_level == NULL)
+ output <<"NULL";
+ else output<<A.v_lower_level->index();
+ output<<" index of higher level node ";
+ if (A.v_higher_level == NULL)
+ output <<"NULL";
+ else output<<A.v_higher_level->index();
+ output<<" mass "<<A.mass<<" type "<<A.type;
+ if(A.type == 3)
+ {
+ output<<" dedic_moon_nodes ";
+ if(A.moon_List.empty())
+ output<<" is empty";
+ else forall_listiterators(node,it,A.moon_List) output<<(*it)->index()<<" ";
+ }
+ if(A.type == 4)
+ output<<" dedic_pm_node "<<A.dedicated_pm_node;
+ output<<" index of dedicated sun_node ";
+ if (A.get_dedicated_sun_node() == NULL)
+ output<<"NULL";
+ else
+ output<<A.dedicated_sun_node->index();
+ output<<" distance to dedicated sun "<<A.dedicated_sun_distance;
+ output<<" lambda_List ";
+ if(A.lambda.empty())
+ output<<" is empty";
+ else forall_listiterators(double, l,A.lambda) output<<*l<<" ";
+ output<<" neighbour_sun_node_List ";
+ if(A.neighbour_s_node.empty())
+ output<<" is empty";
+ else forall_listiterators(node, it,A.neighbour_s_node) output<<(*it)->index()<<" ";
+ if(A.placed == true)
+ output<<" is placed";
+ else
+ output<<" is not placed";
+ cout<<" angle_1 "<<A.angle_1<<" angle_2 "<<A.angle_2<<endl;
+ return output;
+}
+
+
+istream &operator>> (istream & input, NodeAttributes & /* A */)
+{
+ //input >> A.l;
+ return input;
+}
+
+
+void NodeAttributes::init_mult_values()
+{
+ type = 0;
+ dedicated_sun_node = NULL;
+ dedicated_sun_distance = 0;
+ dedicated_pm_node = NULL;
+ lambda.clear();
+ neighbour_s_node.clear();
+ lambda_List_ptr = λ
+ neighbour_s_node_List_ptr = &neighbour_s_node;
+ moon_List.clear();
+ moon_List_ptr = &moon_List;
+ placed = false;
+ angle_1 = 0;
+ angle_2 = 6.2831853;
+}
+
+
+NodeAttributes::NodeAttributes()
+{
+ position.m_x = 0;
+ position.m_y = 0;
+ width = 0;
+ height = 0;
+ v_lower_level = NULL;
+ v_higher_level = NULL;
+
+ //for multilevel step
+ mass = 0;
+ type = 0;
+ dedicated_sun_node = NULL;
+ dedicated_sun_distance = 0;
+ dedicated_pm_node = NULL;
+ lambda.clear();
+ neighbour_s_node.clear();
+ lambda_List_ptr = λ
+ neighbour_s_node_List_ptr = &neighbour_s_node;
+ moon_List.clear();
+ moon_List_ptr = &moon_List;
+ placed = false;
+ angle_1 = 0;
+ angle_2 = 6.2831853;
+}
+
+}//namespace ogdf
diff --git a/ogdf/internal/energybased/NodeAttributes.h b/ogdf/internal/energybased/NodeAttributes.h
new file mode 100644
index 0000000..2318e6e
--- /dev/null
+++ b/ogdf/internal/energybased/NodeAttributes.h
@@ -0,0 +1,184 @@
+/*
+ * $Revision: 2555 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-06 12:12:10 +0200 (Fr, 06. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of class NodeAttributes.
+ *
+ * \author Stefan Hachul
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_NODE_ATTRIBUTES_H
+#define OGDF_NODE_ATTRIBUTES_H
+
+#include "../../basic/geometry.h"
+#include "../../basic/Graph.h"
+#include "../../basic/List.h"
+
+namespace ogdf {
+
+class OGDF_EXPORT NodeAttributes
+{
+ //helping data structure that stores the graphical attributes of a node
+ //that are needed for the force-directed algorithms.
+
+
+ //outputstream for NodeAttributes
+ friend ostream &operator<< (ostream &,const NodeAttributes &);
+
+ //inputstream for NodeAttributes
+ friend istream &operator>> (istream &,NodeAttributes &);
+
+public:
+
+ NodeAttributes(); //constructor
+ ~NodeAttributes() { } //destructor
+
+ void set_NodeAttributes(double w, double h, DPoint pos,node v_low,node
+ v_high)
+ {
+ width = w;
+ height = h;
+ position = pos;
+ v_lower_level = v_low;
+ v_higher_level = v_high;
+ }
+
+ void set_position(DPoint pos) {position = pos;}
+ void set_width(double w) {width = w;}
+ void set_height(double h) {height = h;}
+ void set_x(double x) {position.m_x = x;}
+ void set_y(double y) {position.m_y = y;}
+
+ DPoint get_position() const { return position; }
+ double get_x() const {return position.m_x;}
+ double get_y() const {return position.m_y;}
+ double get_width() const {return width;}
+ double get_height() const {return height;}
+
+
+ //for preprocessing step in FMMM
+
+ void set_original_node (node v) {v_lower_level = v;}
+ void set_copy_node (node v) {v_higher_level = v;}
+ node get_original_node() const {return v_lower_level;}
+ node get_copy_node() const {return v_higher_level;}
+
+ //for divide et impera step in FMMM (set/get_original_node() are needed, too)
+
+ void set_subgraph_node (node v) {v_higher_level = v;}
+ node get_subgraph_node() const {return v_higher_level;}
+
+ //for the multilevel step in FMMM
+
+ void set_lower_level_node (node v) {v_lower_level = v;}
+ void set_higher_level_node (node v) {v_higher_level = v;}
+ node get_lower_level_node() const {return v_lower_level;}
+ node get_higher_level_node() const {return v_higher_level;}
+ void set_mass(int m) {mass = m;}
+ void set_type(int t) {type = t;}
+ void set_dedicated_sun_node(node v){dedicated_sun_node = v;}
+ void set_dedicated_sun_distance(double d) {dedicated_sun_distance = d;}
+ void set_dedicated_pm_node(node v) {dedicated_pm_node = v;}
+ void place(){placed = true;}
+ void set_angle_1(double a) {angle_1 = a;}
+ void set_angle_2(double a) {angle_2 = a;}
+
+ int get_mass() const {return mass;}
+ int get_type() const {return type;}
+ node get_dedicated_sun_node() const {return dedicated_sun_node;}
+ double get_dedicated_sun_distance() const {return dedicated_sun_distance;}
+ node get_dedicated_pm_node() const {return dedicated_pm_node;}
+ bool is_placed() const {return placed;}
+ double get_angle_1() const {return angle_1;}
+ double get_angle_2() const {return angle_2;}
+
+
+ List<double>* get_lambda_List_ptr() {return lambda_List_ptr;}
+ List<node>* get_neighbour_sun_node_List_ptr() {return neighbour_s_node_List_ptr;}
+ List<node>* get_dedicated_moon_node_List_ptr() {return moon_List_ptr;}
+
+
+ //initialzes all values needed for multilevel representations
+ void init_mult_values();
+
+private:
+
+ DPoint position;
+ double width;
+ double height;
+
+ //for the multilevel and divide et impera and preprocessing step
+
+ node v_lower_level; //the corresponding node in the lower level graph
+ node v_higher_level;//the corresponding node in the higher level graph
+ //for divide et impera v_lower_level is the original graph and
+ //v_higher_level is the copy of the copy of this node in the
+ //maximum connected subraph
+
+ //for the multilevel step
+
+ int mass; //the mass (= number of previously collapsed nodes) of this node
+ int type; //1 = sun node (s_node); 2 = planet node (p_node) without a dedicate moon
+ //3 = planet node with dedicated moons (pm_node);4 = moon node (m_node)
+ node dedicated_sun_node; //the dedicates s_node of the solar system of this node
+ double dedicated_sun_distance;//the distance to the dedicated sun node of the galaxy
+ //of this node
+ node dedicated_pm_node;//if type == 4 the dedicated_pm_node is saved here
+ List<double> lambda; //the factors lambda for scaling the length of this edge
+ //relative to the pass between v's sun and the sun of a
+ //neighbour solar system
+ List<node> neighbour_s_node;//this is the list of the neighbour solar systems suns
+ //lambda[i] corresponds to neighbour_s_node[i]
+ List<double>* lambda_List_ptr; //a pointer to the lambda list
+ List<node>* neighbour_s_node_List_ptr; //a pointer to to the neighbour_s_node list
+ List<node> moon_List;//the list of all dedicated moon nodes (!= nil if type == 3)
+ List<node>* moon_List_ptr;//a pointer to the moon_List
+ bool placed; //indicates weather an initial position has been assigned to this
+ //node or not
+ double angle_1;//describes the sector where nodes that are not adjacent to other
+ double angle_2;//solar systems have to be placed
+};
+
+}//namespace ogdf
+#endif
diff --git a/ogdf/internal/energybased/ParticleInfo.h b/ogdf/internal/energybased/ParticleInfo.h
new file mode 100644
index 0000000..f1c41b7
--- /dev/null
+++ b/ogdf/internal/energybased/ParticleInfo.h
@@ -0,0 +1,155 @@
+/*
+ * $Revision: 2564 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-07 00:03:48 +0200 (Sa, 07. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of class ParticleInfo.
+ *
+ * \author Stefan Hachul
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_PARTICLE_INFO_H
+#define OGDF_PARTICLE_INFO_H
+
+#include "../../basic/Graph.h"
+#include "../../basic/List.h"
+
+namespace ogdf {
+
+class OGDF_EXPORT ParticleInfo
+{
+ //Helping data structure for building up the reduced quad tree by NMM.
+
+ //Outputstream for ParticleInfo.
+ friend ostream &operator<< (ostream & output, const ParticleInfo & A)
+ {
+ output <<" node_index "<<A.vertex->index()<<" x_y_coord "<<A.x_y_coord;
+ if(A.marked == true)
+ output<<" marked ";
+ else
+ output<<" unmarked ";
+ output<<" sublist_ptr ";
+ if (A.subList_ptr == NULL)
+ output<<"NULL";
+ else
+ output<<A.subList_ptr;
+ return output;
+ }
+
+ //inputstream for ParticleInfo
+ friend istream &operator>> (istream & input, ParticleInfo & A)
+ {
+ int c = input.peek();
+ if (c != EOF)
+ input >> A;
+ return input;
+ }
+
+public:
+
+ ParticleInfo() //constructor
+ {
+ vertex = NULL;
+ x_y_coord = 0;
+ cross_ref_item = NULL;
+ copy_item = NULL;
+ subList_ptr = NULL;
+ marked = false;
+ tmp_item = NULL;
+ }
+
+ ~ParticleInfo() { } //destructor
+
+ void set_vertex(node v) { vertex = v; }
+ void set_x_y_coord(double c) { x_y_coord = c; }
+ void set_cross_ref_item (ListIterator<ParticleInfo> it) { cross_ref_item = it; }
+ void set_subList_ptr(List<ParticleInfo>* ptr) { subList_ptr = ptr; }
+ void set_copy_item (ListIterator<ParticleInfo> it) { copy_item = it; }
+ void mark() { marked = true; }
+ void unmark() { marked = false; }
+ void set_tmp_cross_ref_item(ListIterator<ParticleInfo> it) { tmp_item = it; }
+
+ node get_vertex() const { return vertex; }
+ double get_x_y_coord() const { return x_y_coord; }
+ ListIterator<ParticleInfo> get_cross_ref_item() const { return cross_ref_item; }
+ List<ParticleInfo>* get_subList_ptr() const { return subList_ptr; }
+ ListIterator<ParticleInfo> get_copy_item() const{return copy_item;}
+ bool is_marked() const { return marked; }
+ ListIterator<ParticleInfo> get_tmp_cross_ref_item() const { return tmp_item; }
+
+private:
+ node vertex; //the vertex of G that is associated with this attributes
+ double x_y_coord; //the x (resp. y) coordinate of the actual position of the vertex
+ ListIterator<ParticleInfo> cross_ref_item; //the Listiterator of the
+ //ParticleInfo-Element that
+ //containes the vertex in the List storing the other
+ //coordinates (a cross reference)
+ List<ParticleInfo>* subList_ptr; //points to the subList of L_x(L_y) where the
+ //actual entry of ParticleInfo has to be stored
+ ListIterator<ParticleInfo> copy_item; //the item of this entry in the copy List
+ bool marked; //indicates if this ParticleInfo object is marked or not
+ ListIterator<ParticleInfo> tmp_item; //a temporily item that is used to construct
+ //the cross references for the copy_Lists
+ //and the subLists
+};
+
+
+//Needed for sorting algorithms in ogdf/List and ogdf/Array.
+class ParticleInfoComparer {
+public:
+ //Returns -1(1) if height of a <(>) height of b. If they are equal 0 is
+ //returned.
+ static int compare(const ParticleInfo& a,const ParticleInfo & b)
+ {
+ double p = a.get_x_y_coord();
+ double q = b.get_x_y_coord();
+ if(p < q ) return -1;
+ else if(p > q ) return 1;
+ else return 0;
+ }
+ OGDF_AUGMENT_STATICCOMPARER(ParticleInfo)
+};
+
+}//namespace ogdf
+
+#endif
diff --git a/ogdf/internal/energybased/QuadTreeNM.cpp b/ogdf/internal/energybased/QuadTreeNM.cpp
new file mode 100644
index 0000000..94741ad
--- /dev/null
+++ b/ogdf/internal/energybased/QuadTreeNM.cpp
@@ -0,0 +1,288 @@
+/*
+ * $Revision: 2552 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-05 16:45:20 +0200 (Do, 05. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of class QuadTreeNM.
+ *
+ * \author Stefan Hachul
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "QuadTreeNM.h"
+
+namespace ogdf {
+
+QuadTreeNM::QuadTreeNM()
+{
+ root_ptr = act_ptr =NULL;
+}
+
+
+void QuadTreeNM::create_new_lt_child(
+ List<ParticleInfo>* L_x_ptr,
+ List<ParticleInfo>* L_y_ptr)
+{
+ QuadTreeNodeNM* new_ptr = new QuadTreeNodeNM();
+
+ DPoint old_Sm_dlc = act_ptr->get_Sm_downleftcorner();
+ DPoint new_Sm_dlc;
+ new_Sm_dlc.m_x = old_Sm_dlc.m_x;
+ new_Sm_dlc.m_y = old_Sm_dlc.m_y+act_ptr->get_Sm_boxlength()/2;
+
+ new_ptr->set_Sm_level(act_ptr->get_Sm_level()+1);
+ new_ptr->set_Sm_downleftcorner(new_Sm_dlc);
+ new_ptr->set_Sm_boxlength((act_ptr->get_Sm_boxlength())/2);
+ new_ptr->set_x_List_ptr(L_x_ptr);
+ new_ptr->set_y_List_ptr(L_y_ptr);
+ new_ptr->set_father_ptr(act_ptr);
+ act_ptr->set_child_lt_ptr(new_ptr);
+}
+
+
+void QuadTreeNM::create_new_lt_child()
+{
+ QuadTreeNodeNM* new_ptr = new QuadTreeNodeNM();
+
+ DPoint old_Sm_dlc = act_ptr->get_Sm_downleftcorner();
+ DPoint new_Sm_dlc;
+ new_Sm_dlc.m_x = old_Sm_dlc.m_x;
+ new_Sm_dlc.m_y = old_Sm_dlc.m_y+act_ptr->get_Sm_boxlength()/2;
+
+ new_ptr->set_Sm_level(act_ptr->get_Sm_level()+1);
+ new_ptr->set_Sm_downleftcorner(new_Sm_dlc);
+ new_ptr->set_Sm_boxlength((act_ptr->get_Sm_boxlength())/2);
+ new_ptr->set_father_ptr(act_ptr);
+ act_ptr->set_child_lt_ptr(new_ptr);
+}
+
+
+void QuadTreeNM::create_new_rt_child(
+ List<ParticleInfo>* L_x_ptr,
+ List<ParticleInfo>* L_y_ptr)
+{
+ QuadTreeNodeNM* new_ptr = new QuadTreeNodeNM();
+
+ DPoint old_Sm_dlc = act_ptr->get_Sm_downleftcorner();
+ DPoint new_Sm_dlc;
+ new_Sm_dlc.m_x = old_Sm_dlc.m_x+act_ptr->get_Sm_boxlength()/2;
+ new_Sm_dlc.m_y = old_Sm_dlc.m_y+act_ptr->get_Sm_boxlength()/2;
+
+ new_ptr->set_Sm_level(act_ptr->get_Sm_level()+1);
+ new_ptr->set_Sm_downleftcorner(new_Sm_dlc);
+ new_ptr->set_Sm_boxlength((act_ptr->get_Sm_boxlength())/2);
+ new_ptr->set_x_List_ptr(L_x_ptr);
+ new_ptr->set_y_List_ptr(L_y_ptr);
+ new_ptr->set_father_ptr(act_ptr);
+ act_ptr->set_child_rt_ptr(new_ptr);
+}
+
+
+void QuadTreeNM::create_new_rt_child()
+{
+ QuadTreeNodeNM* new_ptr = new QuadTreeNodeNM();
+
+ DPoint old_Sm_dlc = act_ptr->get_Sm_downleftcorner();
+ DPoint new_Sm_dlc;
+ new_Sm_dlc.m_x = old_Sm_dlc.m_x+act_ptr->get_Sm_boxlength()/2;
+ new_Sm_dlc.m_y = old_Sm_dlc.m_y+act_ptr->get_Sm_boxlength()/2;
+
+ new_ptr->set_Sm_level(act_ptr->get_Sm_level()+1);
+ new_ptr->set_Sm_downleftcorner(new_Sm_dlc);
+ new_ptr->set_Sm_boxlength((act_ptr->get_Sm_boxlength())/2);
+ new_ptr->set_father_ptr(act_ptr);
+ act_ptr->set_child_rt_ptr(new_ptr);
+}
+
+
+void QuadTreeNM::create_new_lb_child(
+ List<ParticleInfo>* L_x_ptr,
+ List<ParticleInfo>* L_y_ptr)
+{
+ QuadTreeNodeNM* new_ptr = new QuadTreeNodeNM();
+
+ DPoint old_Sm_dlc = act_ptr->get_Sm_downleftcorner();
+ DPoint new_Sm_dlc;
+ new_Sm_dlc.m_x = old_Sm_dlc.m_x;
+ new_Sm_dlc.m_y = old_Sm_dlc.m_y;
+
+ new_ptr->set_Sm_level(act_ptr->get_Sm_level()+1);
+ new_ptr->set_Sm_downleftcorner(new_Sm_dlc);
+ new_ptr->set_Sm_boxlength((act_ptr->get_Sm_boxlength())/2);
+ new_ptr->set_x_List_ptr(L_x_ptr);
+ new_ptr->set_y_List_ptr(L_y_ptr);
+ new_ptr->set_father_ptr(act_ptr);
+ act_ptr->set_child_lb_ptr(new_ptr);
+}
+
+
+void QuadTreeNM::create_new_lb_child()
+{
+ QuadTreeNodeNM* new_ptr = new QuadTreeNodeNM();
+
+ DPoint old_Sm_dlc = act_ptr->get_Sm_downleftcorner();
+ DPoint new_Sm_dlc;
+ new_Sm_dlc.m_x = old_Sm_dlc.m_x;
+ new_Sm_dlc.m_y = old_Sm_dlc.m_y;
+
+ new_ptr->set_Sm_level(act_ptr->get_Sm_level()+1);
+ new_ptr->set_Sm_downleftcorner(new_Sm_dlc);
+ new_ptr->set_Sm_boxlength((act_ptr->get_Sm_boxlength())/2);
+ new_ptr->set_father_ptr(act_ptr);
+ act_ptr->set_child_lb_ptr(new_ptr);
+}
+
+
+void QuadTreeNM::create_new_rb_child(
+ List<ParticleInfo>* L_x_ptr,
+ List<ParticleInfo>* L_y_ptr)
+{
+ QuadTreeNodeNM* new_ptr = new QuadTreeNodeNM();
+
+ DPoint old_Sm_dlc = act_ptr->get_Sm_downleftcorner();
+ DPoint new_Sm_dlc;
+ new_Sm_dlc.m_x = old_Sm_dlc.m_x+act_ptr->get_Sm_boxlength()/2;
+ new_Sm_dlc.m_y = old_Sm_dlc.m_y;
+
+ new_ptr->set_Sm_level(act_ptr->get_Sm_level()+1);
+ new_ptr->set_Sm_downleftcorner(new_Sm_dlc);
+ new_ptr->set_Sm_boxlength((act_ptr->get_Sm_boxlength())/2);
+ new_ptr->set_x_List_ptr(L_x_ptr);
+ new_ptr->set_y_List_ptr(L_y_ptr);
+ new_ptr->set_father_ptr(act_ptr);
+ act_ptr->set_child_rb_ptr(new_ptr);
+}
+
+
+void QuadTreeNM::create_new_rb_child()
+{
+ QuadTreeNodeNM* new_ptr = new QuadTreeNodeNM();
+
+ DPoint old_Sm_dlc = act_ptr->get_Sm_downleftcorner();
+ DPoint new_Sm_dlc;
+ new_Sm_dlc.m_x = old_Sm_dlc.m_x+act_ptr->get_Sm_boxlength()/2;
+ new_Sm_dlc.m_y = old_Sm_dlc.m_y;
+
+ new_ptr->set_Sm_level(act_ptr->get_Sm_level()+1);
+ new_ptr->set_Sm_downleftcorner(new_Sm_dlc);
+ new_ptr->set_Sm_boxlength((act_ptr->get_Sm_boxlength())/2);
+ new_ptr->set_father_ptr(act_ptr);
+ act_ptr->set_child_rb_ptr(new_ptr);
+}
+
+
+void QuadTreeNM::delete_tree(QuadTreeNodeNM* node_ptr)
+{
+ if(node_ptr != NULL)
+ {
+ if(node_ptr->get_child_lt_ptr() != NULL)
+ delete_tree(node_ptr->get_child_lt_ptr());
+ if(node_ptr->get_child_rt_ptr() != NULL)
+ delete_tree(node_ptr->get_child_rt_ptr());
+ if(node_ptr->get_child_lb_ptr() != NULL)
+ delete_tree(node_ptr->get_child_lb_ptr());
+ if(node_ptr->get_child_rb_ptr() != NULL)
+ delete_tree(node_ptr->get_child_rb_ptr());
+ delete node_ptr;
+ if (node_ptr == root_ptr)
+ root_ptr = NULL;
+ }
+}
+
+
+void QuadTreeNM::delete_tree_and_count_nodes(QuadTreeNodeNM* node_ptr, int& nodecounter)
+{
+ if(node_ptr != NULL)
+ {
+ nodecounter++;
+ if(node_ptr->get_child_lt_ptr() != NULL)
+ delete_tree_and_count_nodes(node_ptr->get_child_lt_ptr(),nodecounter);
+ if(node_ptr->get_child_rt_ptr() != NULL)
+ delete_tree_and_count_nodes(node_ptr->get_child_rt_ptr(),nodecounter);
+ if(node_ptr->get_child_lb_ptr() != NULL)
+ delete_tree_and_count_nodes(node_ptr->get_child_lb_ptr(),nodecounter);
+ if(node_ptr->get_child_rb_ptr() != NULL)
+ delete_tree_and_count_nodes(node_ptr->get_child_rb_ptr(),nodecounter);
+ delete node_ptr;
+ if (node_ptr == root_ptr)
+ root_ptr = NULL;
+ }
+}
+
+
+void QuadTreeNM::cout_preorder(QuadTreeNodeNM* node_ptr)
+{
+ if(node_ptr != NULL)
+ {
+ cout<< *node_ptr <<endl;
+ if(node_ptr->get_child_lt_ptr() != NULL)
+ cout_preorder(node_ptr->get_child_lt_ptr());
+ if(node_ptr->get_child_rt_ptr() != NULL)
+ cout_preorder(node_ptr->get_child_rt_ptr());
+ if(node_ptr->get_child_lb_ptr() != NULL)
+ cout_preorder(node_ptr->get_child_lb_ptr());
+ if(node_ptr->get_child_rb_ptr() != NULL)
+ cout_preorder(node_ptr->get_child_rb_ptr());
+ }
+}
+
+
+void QuadTreeNM::cout_preorder(QuadTreeNodeNM* node_ptr, int precision)
+{
+ int i;
+ if(node_ptr != NULL)
+ {
+ complex<double>* L =node_ptr->get_local_exp();
+ complex<double>* M =node_ptr->get_multipole_exp();
+ cout<< *node_ptr <<endl;
+ cout<<" ME: ";
+ for(i = 0; i<= precision;i++)
+ cout<<M[i]<<" ";cout<<endl;
+ cout<<" LE: ";
+ for(i = 0; i<= precision;i++)
+ cout<<L[i]<<" ";cout<<endl<<endl;
+
+ if(node_ptr->get_child_lt_ptr() != NULL)
+ cout_preorder(node_ptr->get_child_lt_ptr(),precision);
+ if(node_ptr->get_child_rt_ptr() != NULL)
+ cout_preorder(node_ptr->get_child_rt_ptr(),precision);
+ if(node_ptr->get_child_lb_ptr() != NULL)
+ cout_preorder(node_ptr->get_child_lb_ptr(),precision);
+ if(node_ptr->get_child_rb_ptr() != NULL)
+ cout_preorder(node_ptr->get_child_rb_ptr(),precision);
+ }
+}
+
+}//namespace ogdf
diff --git a/ogdf/internal/energybased/QuadTreeNM.h b/ogdf/internal/energybased/QuadTreeNM.h
new file mode 100644
index 0000000..714846c
--- /dev/null
+++ b/ogdf/internal/energybased/QuadTreeNM.h
@@ -0,0 +1,162 @@
+/*
+ * $Revision: 2523 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-02 20:59:27 +0200 (Mon, 02 Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of class QuadTreeNM.
+ *
+ * \author Stefan Hachul
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_QUAD_TREE_NM_H
+#define OGDF_QUAD_TREE_NM_H
+
+#include "QuadTreeNodeNM.h"
+#include "ParticleInfo.h"
+
+
+namespace ogdf {
+
+class QuadTreeNM
+{
+ //Helping data structure that stores the information needed to represent
+ //the modified quadtree in the New Multipole Merthod (NMM)
+
+public:
+ QuadTreeNM(); //constructor
+ ~QuadTreeNM() { } //destructor
+
+ //Deletes the tree starting at node_ptr.
+ void delete_tree(QuadTreeNodeNM* node_ptr);
+
+ //Deletes the tree starting at node_ptr and counts the nodes of the subtree.
+ void delete_tree_and_count_nodes(QuadTreeNodeNM* node_ptr,int& nodecounter);
+
+ //Pre_order traversal of the tree rooted at node_ptr (with or without
+ //output of the M,L-lists from 0 to precision).
+ void cout_preorder(QuadTreeNodeNM* node_ptr);
+ void cout_preorder(QuadTreeNodeNM* node_ptr,int precision);
+
+ //Creates the root node and lets act_ptr and root_ptr point to the root node.
+ void init_tree() {
+ root_ptr = new QuadTreeNodeNM();
+ act_ptr = root_ptr;
+ }
+
+ //Sets act_ptr to the root_ptr.
+ void start_at_root()
+ {
+ act_ptr = root_ptr;
+ }
+
+ //Sets act_ptr to the father_ptr.
+ void go_to_father()
+ {
+ if (act_ptr->get_father_ptr() != NULL)
+ act_ptr = act_ptr->get_father_ptr();
+ else
+ cout<<"Error QuadTreeNM: No father Node exists";
+ }
+
+ //Sets act_ptr to the left_top_child_ptr.
+ void go_to_lt_child()
+ {
+ act_ptr = act_ptr->get_child_lt_ptr();
+ }
+
+ //Sets act_ptr to the right_top_child_ptr.
+ void go_to_rt_child()
+ {
+ act_ptr = act_ptr->get_child_rt_ptr();
+ }
+
+ //Sets act_ptr to the left_bottom_child_ptr.
+ void go_to_lb_child()
+ {
+ act_ptr = act_ptr->get_child_lb_ptr();
+ }
+
+ //Sets act_ptr to the right_bottom_child_ptr.
+ void go_to_rb_child()
+ {
+ act_ptr = act_ptr->get_child_rb_ptr();
+ }
+
+ //Creates a new left_top_child of the actual node (importing L_x(y)_ptr).
+ void create_new_lt_child(List<ParticleInfo>* L_x_ptr, List<ParticleInfo>* L_y_ptr);
+ void create_new_lt_child();
+
+ //Creates a new right_top_child of the actual node (importing L_x(y)_ptr).
+ void create_new_rt_child(List<ParticleInfo>* L_x_ptr, List<ParticleInfo>* L_y_ptr);
+ void create_new_rt_child();
+
+ //Creates a new left_bottom_child of the actual node (importing L_x(y)_ptr).
+ void create_new_lb_child(List<ParticleInfo>* L_x_ptr, List<ParticleInfo>* L_y_ptr);
+ void create_new_lb_child();
+
+ //Creates a new right_bottom_child of the actual node(importing L_x(y)_ptr).
+ void create_new_rb_child(List<ParticleInfo>* L_x_ptr, List<ParticleInfo>* L_y_ptr);
+ void create_new_rb_child();
+
+ //Returns the actual/root node pointer of the tree.
+ QuadTreeNodeNM* get_act_ptr() { return act_ptr; }
+ QuadTreeNodeNM* get_root_ptr() { return root_ptr; }
+
+ //Sets root_ptr to r_ptr.
+ void set_root_ptr(QuadTreeNodeNM* r_ptr) { root_ptr = r_ptr; }
+
+ //Sets act_ptr to a_ptr.
+ void set_act_ptr(QuadTreeNodeNM* a_ptr) { act_ptr = a_ptr; }
+
+ //Sets the content of *root_ptr to r.
+ void set_root_node(QuadTreeNodeNM& r) { *root_ptr = r; }
+
+private:
+ QuadTreeNodeNM* root_ptr; //points to the root node
+ QuadTreeNodeNM* act_ptr; //points to the actual node
+
+};
+
+}//namespace ogdf
+#endif
+
diff --git a/ogdf/internal/energybased/QuadTreeNodeNM.cpp b/ogdf/internal/energybased/QuadTreeNodeNM.cpp
new file mode 100644
index 0000000..b6bd606
--- /dev/null
+++ b/ogdf/internal/energybased/QuadTreeNodeNM.cpp
@@ -0,0 +1,193 @@
+/*
+ * $Revision: 2555 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-06 12:12:10 +0200 (Fr, 06. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Implementation of class QuadTreeNodeNM.
+ *
+ * \author Stefan Hachul
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+#include "QuadTreeNodeNM.h"
+
+
+namespace ogdf {
+
+ostream &operator<< (ostream & output, const QuadTreeNodeNM & A)
+{
+ output <<" Sm_level: "<<A.Sm_level<<" Sm_downleftcorner: "<<A.Sm_downleftcorner
+ <<" Sm boxlength: "<<A.Sm_boxlength<<" Sm_center: "<<A.Sm_center
+ <<"spnumber: "<<A.subtreeparticlenumber;
+ if(A.father_ptr == NULL)
+ output <<" is root ";
+ if((A.child_lt_ptr == NULL) ||(A.child_rt_ptr == NULL) || (A.child_lb_ptr == NULL)||
+ (A.child_rb_ptr == NULL))
+ {
+ output <<" (no child in ";
+ if(A.child_lt_ptr == NULL)
+ output <<" lt";
+ if(A.child_rt_ptr == NULL)
+ output <<" rt";
+ if(A.child_lb_ptr == NULL)
+ output <<" lb";
+ if(A.child_rb_ptr == NULL)
+ output <<" rb";
+ output<<" quad) ";
+ }
+
+ output<<" L_x: ";
+ if(A.L_x_ptr == NULL)
+ output<<"no list specified";
+ else if(A.L_x_ptr->empty())
+ output <<"is empty";
+ else
+ {
+ forall_listiterators(ParticleInfo, it,*A.L_x_ptr)
+ output<<" "<<*it;
+ }
+
+ output<<" L_y: ";
+ if(A.L_y_ptr == NULL)
+ output<<"no list specified";
+ else if(A.L_y_ptr->empty())
+ output <<"is empty";
+ else
+ {
+ forall_listiterators(ParticleInfo, it,*A.L_y_ptr)
+ output<<" "<<*it;
+ }
+
+ output<<" I: ";
+ if(A.I.empty())
+ output <<"is empty";
+ else
+ {
+ forall_listiterators(QuadTreeNodeNM*, v_ptr,A.I)
+ output<<" ["<<(*v_ptr)->get_Sm_level()<<" , "
+ <<(*v_ptr)->get_Sm_downleftcorner()<<","
+ <<(*v_ptr)->get_Sm_boxlength()<<"]";
+ }
+
+ output<<" D1: ";
+ if(A.D1.empty())
+ output <<"is empty";
+ else
+ {
+ forall_listiterators(QuadTreeNodeNM*, v_ptr,A.D1)
+ output<<" ["<<(*v_ptr)->get_Sm_level()<<" , "
+ <<(*v_ptr)->get_Sm_downleftcorner()<<","
+ <<(*v_ptr)->get_Sm_boxlength()<<"]";
+ }
+
+ output<<" D2: ";
+ if(A.D2.empty())
+ output <<"is empty";
+ else
+ {
+ forall_listiterators(QuadTreeNodeNM*, v_ptr,A.D2)
+ output<<" ["<<(*v_ptr)->get_Sm_level()<<" , "
+ <<(*v_ptr)->get_Sm_downleftcorner()<<","
+ <<(*v_ptr)->get_Sm_boxlength()<<"]";
+ }
+
+ output<<" M: ";
+ if(A.M.empty())
+ output <<"is empty";
+ else
+ {
+ forall_listiterators(QuadTreeNodeNM*, v_ptr,A.M)
+ output<<" ["<<(*v_ptr)->get_Sm_level()<<" , "
+ <<(*v_ptr)->get_Sm_downleftcorner()<<","
+ <<(*v_ptr)->get_Sm_boxlength()<<"]";
+ }
+ output<<" contained_nodes ";
+ if(A.contained_nodes.empty())
+ output <<"is empty";
+ else
+ {
+ forall_listiterators(node,v_it,A.contained_nodes)
+ output<<(*v_it)->index()<<" ";
+ }
+ return output;
+}
+
+
+istream &operator>> (istream & input, QuadTreeNodeNM & A)
+{
+ input >> A.Sm_level;
+ return input;
+}
+
+
+QuadTreeNodeNM::QuadTreeNodeNM()
+{
+ DPoint double_null(0,0);
+ complex<double> comp_null(0,0);
+
+ L_x_ptr = NULL; ;L_y_ptr = NULL;
+ subtreeparticlenumber = 0;
+ Sm_level = 0;
+ Sm_downleftcorner = double_null;
+ Sm_boxlength = 0;
+ Sm_center = comp_null;
+ ME = NULL;
+ LE = NULL;
+ contained_nodes.clear();
+ I.clear();D1.clear();D2.clear();M.clear();
+ father_ptr = NULL;
+ child_lt_ptr = child_rt_ptr = child_lb_ptr = child_rb_ptr = NULL;
+}
+
+
+QuadTreeNodeNM::~QuadTreeNodeNM()
+{
+ if(L_x_ptr != NULL)
+ {
+ delete L_x_ptr;
+ L_x_ptr = NULL;
+ }
+ if(L_y_ptr != NULL)
+ {
+ delete L_y_ptr;
+ L_y_ptr = NULL;
+ }
+ contained_nodes.clear();
+ I.clear();D1.clear();D2.clear();M.clear();
+ delete [] ME;
+ delete [] LE;
+}
+
+}//namespace ogdf
diff --git a/ogdf/internal/energybased/QuadTreeNodeNM.h b/ogdf/internal/energybased/QuadTreeNodeNM.h
new file mode 100644
index 0000000..16f3df2
--- /dev/null
+++ b/ogdf/internal/energybased/QuadTreeNodeNM.h
@@ -0,0 +1,191 @@
+/*
+ * $Revision: 2564 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-07 00:03:48 +0200 (Sa, 07. Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of class QuadTreeNodeNM.
+ *
+ * \author Stefan Hachul
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_QUAD_TREE_NODE_NM_H
+#define OGDF_QUAD_TREE_NODE_NM_H
+
+
+#include "../../basic/Graph.h"
+#include "../../basic/List.h"
+#include "../../basic/geometry.h"
+#include "ParticleInfo.h"
+#include <complex>
+
+
+using std::complex;
+
+namespace ogdf {
+
+class QuadTreeNodeNM
+{
+ //Helping data structure that stores the information needed to represent
+ //a node of the reduced quad tree in the New Multipole Method (NMM).
+
+ //Outputstream for QuadTreeNodeNM.
+ friend ostream &operator<< (ostream &,const QuadTreeNodeNM &);
+
+ //Inputstream for QuadTreeNodeNM.
+ friend istream &operator>> (istream &,QuadTreeNodeNM &);
+
+public:
+
+ QuadTreeNodeNM(); //constructor
+ ~QuadTreeNodeNM(); //destructor
+
+ void set_Sm_level(int l) { Sm_level = l;}
+ void set_Sm_downleftcorner(DPoint dlc) {Sm_downleftcorner = dlc;}
+ void set_Sm_boxlength(double l) {Sm_boxlength = l;}
+ void set_x_List_ptr(List<ParticleInfo>* x_ptr) {L_x_ptr = x_ptr;}
+ void set_y_List_ptr(List<ParticleInfo>* y_ptr) {L_y_ptr = y_ptr;}
+ void set_particlenumber_in_subtree(int p){ subtreeparticlenumber = p;}
+ void set_Sm_center(complex<double> c) {Sm_center = c;}
+ void set_contained_nodes(List<node>& L) {contained_nodes = L;}
+ void pushBack_contained_nodes(node v) {contained_nodes.pushBack(v);}
+ node pop_contained_nodes() {return contained_nodes.popFrontRet();}
+ bool contained_nodes_empty() {return contained_nodes.empty();}
+
+ void set_I(List<QuadTreeNodeNM*>& l) {I = l;}
+ void set_D1(List<QuadTreeNodeNM*>& l) {D1 = l;}
+ void set_D2(List<QuadTreeNodeNM*>& l) {D2 = l;}
+ void set_M(List<QuadTreeNodeNM*>& l) {M = l;}
+
+ //LE[i] is set to local[i] for i = 0 to precision and space for LE is reserved.
+ void set_locale_exp(Array<complex<double> > &local,int precision)
+ {
+ int i;
+ LE = new complex<double> [precision+1];
+ for (i = 0 ; i<= precision; i++)
+ LE[i] = local[i];
+ }
+
+ //ME[i] is set to multi[i] for i = 0 to precision and space for LE is reserved.
+ void set_multipole_exp(Array<complex<double> > &multi,int precision)
+ {
+ int i;
+ ME = new complex<double> [precision+1];
+ for (i = 0 ; i<= precision; i++)
+ ME[i] = multi[i];
+ }
+
+ //ME[i] is set to multi[i] for i = 0 to precision and no space for LE is reserved.
+ void replace_multipole_exp(Array<complex<double> > &multi,int precision)
+ {
+ int i;
+ for (i = 0 ; i<= precision; i++)
+ ME[i] = multi[i];
+ }
+
+ void set_father_ptr (QuadTreeNodeNM* f) { father_ptr = f;}
+ void set_child_lt_ptr(QuadTreeNodeNM* c) {child_lt_ptr = c;}
+ void set_child_rt_ptr(QuadTreeNodeNM* c) {child_rt_ptr = c;}
+ void set_child_lb_ptr(QuadTreeNodeNM* c) {child_lb_ptr = c;}
+ void set_child_rb_ptr(QuadTreeNodeNM* c) {child_rb_ptr = c;}
+
+ bool is_root() {if(father_ptr == NULL) return true; else return false;}
+ bool is_leaf(){if ((child_lt_ptr == NULL) &&(child_rt_ptr == NULL) &&(child_lb_ptr
+ == NULL) && (child_rb_ptr == NULL))
+ return true; else return false;}
+ bool child_lt_exists() { if (child_lt_ptr != NULL) return true; else return false;}
+ bool child_rt_exists() { if (child_rt_ptr != NULL) return true; else return false;}
+ bool child_lb_exists() { if (child_lb_ptr != NULL) return true; else return false;}
+ bool child_rb_exists() { if (child_rb_ptr != NULL) return true; else return false;}
+
+ int get_Sm_level () const {return Sm_level;}
+ DPoint get_Sm_downleftcorner () const {return Sm_downleftcorner;}
+ double get_Sm_boxlength () const {return Sm_boxlength; }
+ List<ParticleInfo>* get_x_List_ptr() {return L_x_ptr;}
+ List<ParticleInfo>* get_y_List_ptr() {return L_y_ptr;}
+ int get_particlenumber_in_subtree()const { return subtreeparticlenumber;}
+ complex<double> get_Sm_center() const {return Sm_center;}
+ complex<double>* get_local_exp () const {return LE;}
+ complex<double>* get_multipole_exp () const {return ME;}
+ void get_contained_nodes(List<node>& L) const {L = contained_nodes;}
+ void get_I (List <QuadTreeNodeNM*>& l){l = I;}
+ void get_D1 (List <QuadTreeNodeNM*>& l){l = D1;}
+ void get_D2 (List <QuadTreeNodeNM*>& l){l = D2;}
+ void get_M (List <QuadTreeNodeNM*>& l){l = M;}
+
+ QuadTreeNodeNM* get_father_ptr () const {return father_ptr;}
+ QuadTreeNodeNM* get_child_lt_ptr () const {return child_lt_ptr;}
+ QuadTreeNodeNM* get_child_rt_ptr () const {return child_rt_ptr;}
+ QuadTreeNodeNM* get_child_lb_ptr () const {return child_lb_ptr;}
+ QuadTreeNodeNM* get_child_rb_ptr () const {return child_rb_ptr;}
+
+private:
+
+ int Sm_level; //level of the small cell
+ DPoint Sm_downleftcorner; //coords of the down left corner of the small cell
+ double Sm_boxlength; //length of small cell
+ List<ParticleInfo>* L_x_ptr; //points to the lists that contain each Particle
+ //of G with its x(y)coordinate in increasing order
+ List<ParticleInfo>* L_y_ptr; //and a cross reference to the list_item in the
+ //list with the other coordinate
+ int subtreeparticlenumber; //the number of particles in the subtree rooted
+ //at this node
+ complex<double> Sm_center; //center of the small cell
+ complex<double>* ME; //Multipole Expansion terms
+ complex<double>* LE; //Locale Expansion terms
+ List <node> contained_nodes; //list of nodes of G that are contained in this
+ //QuadTreeNode (emty if it is not a leave of
+ //the ModQuadTree
+ List <QuadTreeNodeNM*> I; //the list of min. ill sep. nodes in DIM2
+ List <QuadTreeNodeNM*> D1,D2; //list of neighbouring(=D1) and not adjacent(=D2)
+ //leaves for direct force calculation in DIM2
+ List<QuadTreeNodeNM*> M; //list of nodes with multipole force contribution
+ //like in DIM2
+ QuadTreeNodeNM* father_ptr; //points to the father node
+ QuadTreeNodeNM* child_lt_ptr; //points to left top child
+ QuadTreeNodeNM* child_rt_ptr; //points to right bottom child
+ QuadTreeNodeNM* child_lb_ptr; //points to left bottom child
+ QuadTreeNodeNM* child_rb_ptr; //points to right bottom child
+};
+
+}//namespace ogdf
+
+#endif
diff --git a/ogdf/module/LayoutModule.h b/ogdf/module/LayoutModule.h
new file mode 100644
index 0000000..54bcbd4
--- /dev/null
+++ b/ogdf/module/LayoutModule.h
@@ -0,0 +1,104 @@
+/*
+ * $Revision: 2523 $
+ *
+ * last checkin:
+ * $Author: gutwenger $
+ * $Date: 2012-07-02 20:59:27 +0200 (Mon, 02 Jul 2012) $
+ ***************************************************************/
+
+/** \file
+ * \brief Declaration of interface for layout algorithms (class
+ * LayoutModule)
+ *
+ * \author Carsten Gutwenger
+ *
+ * \par License:
+ * This file is part of the Open Graph Drawing Framework (OGDF).
+ *
+ * \par
+ * Copyright (C)<br>
+ * See README.txt in the root directory of the OGDF installation for details.
+ *
+ * \par
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * Version 2 or 3 as published by the Free Software Foundation;
+ * see the file LICENSE.txt included in the packaging of this file
+ * for details.
+ *
+ * \par
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * \par
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ * \see http://www.gnu.org/copyleft/gpl.html
+ ***************************************************************/
+
+
+
+
+
+#ifdef _MSC_VER
+#pragma once
+#endif
+
+#ifndef OGDF_LAYOUT_MODULE_H
+#define OGDF_LAYOUT_MODULE_H
+
+
+
+#include "../basic/GraphAttributes.h"
+#include "../basic/Constraints.h"
+#include "../internal/energybased/MultilevelGraph.h"
+
+namespace ogdf {
+
+
+/**
+ * \brief Interface of general layout algorithms.
+ *
+ */
+class OGDF_EXPORT LayoutModule {
+public:
+ //! Initializes a layout module.
+ LayoutModule() { }
+
+ virtual ~LayoutModule() { }
+
+ /**
+ * \brief Computes a layout of graph \a GA.
+ *
+ * This method is the actual algorithm call and must be implemented by
+ * derived classes.
+ * @param GA is the input graph and will also be assigned the layout information.
+ */
+ virtual void call(GraphAttributes &GA) = 0;
+
+ /**
+ * \brief Computes a layout of graph \a GA wrt the constraints in \a GC
+ * (if applicable).
+ */
+ virtual void call(GraphAttributes &GA, GraphConstraints & /*GC*/) { call(GA); }
+
+ /**
+ * \brief Computes a layout of graph \a GA.
+ *
+ * @param GA is the input graph and will also be assigned the layout information.
+ */
+ void operator()(GraphAttributes &GA) { call(GA); }
+
+ OGDF_MALLOC_NEW_DELETE
+};
+
+
+} // end namespace ogdf
+
+
+#endif
diff --git a/program/globals.cpp b/program/globals.cpp
new file mode 100644
index 0000000..c1f3998
--- /dev/null
+++ b/program/globals.cpp
@@ -0,0 +1,453 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "globals.h"
+#include <QLocale>
+#include <QDir>
+#include <QStringList>
+#include <QFile>
+#include <QTextStream>
+#include <QApplication>
+#include <QProcess>
+#include <math.h>
+
+QSharedPointer<Settings> g_settings;
+QSharedPointer<Memory> g_memory;
+MyGraphicsView * g_graphicsView;
+double g_absoluteZoom;
+QSharedPointer<BlastSearch> g_blastSearch;
+QString m_tempDirectory;
+QSharedPointer<AssemblyGraph> g_assemblyGraph;
+
+
+QString formatIntForDisplay(int num)
+{
+ QLocale locale;
+ return locale.toString(num);
+}
+
+QString formatIntForDisplay(long long num)
+{
+ QLocale locale;
+ return locale.toString(num);
+}
+
+QString formatDoubleForDisplay(double num, int decimalPlacesToDisplay)
+{
+ //Add a bit for rounding
+ double addValue = 0.5 / pow(10, decimalPlacesToDisplay);
+ num += addValue;
+
+ QLocale locale;
+ QString withCommas = locale.toString(num, 'f');
+
+ QString final;
+ bool pastDecimalPoint = false;
+ int numbersPastDecimalPoint = 0;
+ for (int i = 0; i < withCommas.length(); ++i)
+ {
+ final += withCommas[i];
+
+ if (pastDecimalPoint)
+ ++numbersPastDecimalPoint;
+
+ if (numbersPastDecimalPoint >= decimalPlacesToDisplay)
+ return final;
+
+ if (withCommas[i] == locale.decimalPoint())
+ pastDecimalPoint = true;
+ }
+ return final;
+}
+
+
+QString formatDepthForDisplay(double depth)
+{
+ if (depth == 0.0)
+ return "0.0x";
+
+ int decimals = 1;
+ double multipliedDepth = fabs(depth);
+ while (multipliedDepth < 10.0)
+ {
+ multipliedDepth *= 10.0;
+ decimals += 1;
+ }
+ return formatDoubleForDisplay(depth, decimals) + "x";
+}
+
+
+
+std::vector<QColor> getPresetColours()
+{
+ std::vector<QColor> presetColours;
+
+ presetColours.push_back(QColor("#306FF8"));
+ presetColours.push_back(QColor("#86BB18"));
+ presetColours.push_back(QColor("#DF123A"));
+ presetColours.push_back(QColor("#181E2A"));
+ presetColours.push_back(QColor("#F91BBD"));
+ presetColours.push_back(QColor("#3CB2A4"));
+ presetColours.push_back(QColor("#D29AC1"));
+ presetColours.push_back(QColor("#E2922E"));
+ presetColours.push_back(QColor("#22501B"));
+ presetColours.push_back(QColor("#57297D"));
+ presetColours.push_back(QColor("#3FA0E6"));
+ presetColours.push_back(QColor("#770739"));
+ presetColours.push_back(QColor("#6A390C"));
+ presetColours.push_back(QColor("#25AB5D"));
+ presetColours.push_back(QColor("#ACAF61"));
+ presetColours.push_back(QColor("#F0826F"));
+ presetColours.push_back(QColor("#E94A80"));
+ presetColours.push_back(QColor("#C187F2"));
+ presetColours.push_back(QColor("#7E5764"));
+ presetColours.push_back(QColor("#037290"));
+ presetColours.push_back(QColor("#D65114"));
+ presetColours.push_back(QColor("#08396A"));
+ presetColours.push_back(QColor("#99ABBE"));
+ presetColours.push_back(QColor("#F270C0"));
+ presetColours.push_back(QColor("#F056F9"));
+ presetColours.push_back(QColor("#8E8D00"));
+ presetColours.push_back(QColor("#70010F"));
+ presetColours.push_back(QColor("#9C1E9A"));
+ presetColours.push_back(QColor("#471B1F"));
+ presetColours.push_back(QColor("#A00B6D"));
+ presetColours.push_back(QColor("#38C037"));
+ presetColours.push_back(QColor("#282C16"));
+ presetColours.push_back(QColor("#15604D"));
+ presetColours.push_back(QColor("#2E75D6"));
+ presetColours.push_back(QColor("#A09DEB"));
+ presetColours.push_back(QColor("#8454D7"));
+ presetColours.push_back(QColor("#301745"));
+ presetColours.push_back(QColor("#A45704"));
+ presetColours.push_back(QColor("#4D8C0E"));
+ presetColours.push_back(QColor("#C09860"));
+ presetColours.push_back(QColor("#009C73"));
+ presetColours.push_back(QColor("#FD6453"));
+ presetColours.push_back(QColor("#C11C4B"));
+ presetColours.push_back(QColor("#183B8B"));
+ presetColours.push_back(QColor("#5E6706"));
+ presetColours.push_back(QColor("#E42005"));
+ presetColours.push_back(QColor("#4873AF"));
+ presetColours.push_back(QColor("#6CA563"));
+ presetColours.push_back(QColor("#5E0F54"));
+ presetColours.push_back(QColor("#FE2065"));
+ presetColours.push_back(QColor("#5BB4D2"));
+ presetColours.push_back(QColor("#3F4204"));
+ presetColours.push_back(QColor("#521839"));
+ presetColours.push_back(QColor("#9A7706"));
+ presetColours.push_back(QColor("#77AB8C"));
+ presetColours.push_back(QColor("#105E04"));
+ presetColours.push_back(QColor("#98290F"));
+ presetColours.push_back(QColor("#B849D4"));
+ presetColours.push_back(QColor("#FC8426"));
+ presetColours.push_back(QColor("#341B03"));
+ presetColours.push_back(QColor("#E3278C"));
+ presetColours.push_back(QColor("#F28F93"));
+ presetColours.push_back(QColor("#D1A21F"));
+ presetColours.push_back(QColor("#277E46"));
+ presetColours.push_back(QColor("#285C60"));
+ presetColours.push_back(QColor("#76B945"));
+ presetColours.push_back(QColor("#E75D65"));
+ presetColours.push_back(QColor("#84ADDC"));
+ presetColours.push_back(QColor("#153C2B"));
+ presetColours.push_back(QColor("#FD10D9"));
+ presetColours.push_back(QColor("#C095D5"));
+ presetColours.push_back(QColor("#052B48"));
+ presetColours.push_back(QColor("#B365FC"));
+ presetColours.push_back(QColor("#97AA75"));
+ presetColours.push_back(QColor("#C78C9C"));
+ presetColours.push_back(QColor("#FD4838"));
+ presetColours.push_back(QColor("#F181E2"));
+ presetColours.push_back(QColor("#815A1A"));
+ presetColours.push_back(QColor("#BB2093"));
+ presetColours.push_back(QColor("#691822"));
+ presetColours.push_back(QColor("#C41A12"));
+ presetColours.push_back(QColor("#728A1F"));
+ presetColours.push_back(QColor("#375B73"));
+ presetColours.push_back(QColor("#97022C"));
+ presetColours.push_back(QColor("#95B44D"));
+ presetColours.push_back(QColor("#EB8DBB"));
+ presetColours.push_back(QColor("#83ACAB"));
+ presetColours.push_back(QColor("#E37D51"));
+ presetColours.push_back(QColor("#D78A68"));
+ presetColours.push_back(QColor("#4A41A2"));
+ presetColours.push_back(QColor("#8A0C79"));
+ presetColours.push_back(QColor("#133102"));
+ presetColours.push_back(QColor("#237A78"));
+ presetColours.push_back(QColor("#ADB03B"));
+ presetColours.push_back(QColor("#289E26"));
+ presetColours.push_back(QColor("#7683EC"));
+ presetColours.push_back(QColor("#4E1E04"));
+ presetColours.push_back(QColor("#BB17B2"));
+ presetColours.push_back(QColor("#EB6A81"));
+ presetColours.push_back(QColor("#47B4E8"));
+ presetColours.push_back(QColor("#0A6191"));
+ presetColours.push_back(QColor("#4EADB2"));
+ presetColours.push_back(QColor("#442965"));
+ presetColours.push_back(QColor("#FE784B"));
+ presetColours.push_back(QColor("#55BD8D"));
+ presetColours.push_back(QColor("#742B03"));
+ presetColours.push_back(QColor("#8C38AA"));
+ presetColours.push_back(QColor("#F758A6"));
+ presetColours.push_back(QColor("#A32526"));
+ presetColours.push_back(QColor("#442C2E"));
+ presetColours.push_back(QColor("#F06A97"));
+ presetColours.push_back(QColor("#3A1527"));
+ presetColours.push_back(QColor("#503509"));
+ presetColours.push_back(QColor("#2A67B4"));
+ presetColours.push_back(QColor("#243644"));
+ presetColours.push_back(QColor("#A74006"));
+ presetColours.push_back(QColor("#335900"));
+ presetColours.push_back(QColor("#A07484"));
+ presetColours.push_back(QColor("#490216"));
+ presetColours.push_back(QColor("#B19BCB"));
+ presetColours.push_back(QColor("#75B75A"));
+ presetColours.push_back(QColor("#BE71EB"));
+ presetColours.push_back(QColor("#024A2E"));
+ presetColours.push_back(QColor("#A097AB"));
+ presetColours.push_back(QColor("#7A287E"));
+ presetColours.push_back(QColor("#6A1444"));
+ presetColours.push_back(QColor("#212449"));
+ presetColours.push_back(QColor("#B07017"));
+ presetColours.push_back(QColor("#227D57"));
+ presetColours.push_back(QColor("#1B8CAF"));
+ presetColours.push_back(QColor("#016438"));
+ presetColours.push_back(QColor("#EA64CF"));
+ presetColours.push_back(QColor("#B5310E"));
+ presetColours.push_back(QColor("#B00765"));
+ presetColours.push_back(QColor("#5F42B3"));
+ presetColours.push_back(QColor("#EF9649"));
+ presetColours.push_back(QColor("#25717F"));
+ presetColours.push_back(QColor("#BCA309"));
+ presetColours.push_back(QColor("#FA35A6"));
+ presetColours.push_back(QColor("#F63D54"));
+ presetColours.push_back(QColor("#E83D6C"));
+ presetColours.push_back(QColor("#8362F2"));
+ presetColours.push_back(QColor("#33BC4A"));
+ presetColours.push_back(QColor("#194A85"));
+ presetColours.push_back(QColor("#E24215"));
+ presetColours.push_back(QColor("#6D71FE"));
+ presetColours.push_back(QColor("#3E52AF"));
+ presetColours.push_back(QColor("#1E9E89"));
+ presetColours.push_back(QColor("#740860"));
+ presetColours.push_back(QColor("#4B7BEE"));
+ presetColours.push_back(QColor("#8742C0"));
+ presetColours.push_back(QColor("#DD8EC6"));
+ presetColours.push_back(QColor("#CD202C"));
+ presetColours.push_back(QColor("#FD82C2"));
+ presetColours.push_back(QColor("#3C2874"));
+ presetColours.push_back(QColor("#F9742B"));
+ presetColours.push_back(QColor("#013B10"));
+ presetColours.push_back(QColor("#D12867"));
+ presetColours.push_back(QColor("#F743C3"));
+ presetColours.push_back(QColor("#B98EEC"));
+ presetColours.push_back(QColor("#D260EC"));
+ presetColours.push_back(QColor("#671C06"));
+ presetColours.push_back(QColor("#37A968"));
+ presetColours.push_back(QColor("#3B9529"));
+ presetColours.push_back(QColor("#2A0E33"));
+ presetColours.push_back(QColor("#51B237"));
+ presetColours.push_back(QColor("#95B61B"));
+ presetColours.push_back(QColor("#B195E2"));
+ presetColours.push_back(QColor("#68B49A"));
+ presetColours.push_back(QColor("#182339"));
+ presetColours.push_back(QColor("#FC4822"));
+ presetColours.push_back(QColor("#D79621"));
+ presetColours.push_back(QColor("#90761B"));
+ presetColours.push_back(QColor("#777315"));
+ presetColours.push_back(QColor("#E389E9"));
+ presetColours.push_back(QColor("#35BD64"));
+ presetColours.push_back(QColor("#C17910"));
+ presetColours.push_back(QColor("#3386ED"));
+ presetColours.push_back(QColor("#E82C2E"));
+ presetColours.push_back(QColor("#AC925F"));
+ presetColours.push_back(QColor("#F227C8"));
+ presetColours.push_back(QColor("#F43E67"));
+ presetColours.push_back(QColor("#55AEEB"));
+ presetColours.push_back(QColor("#F518E3"));
+ presetColours.push_back(QColor("#AB0643"));
+ presetColours.push_back(QColor("#8DA1F3"));
+ presetColours.push_back(QColor("#5C9C14"));
+ presetColours.push_back(QColor("#381F27"));
+ presetColours.push_back(QColor("#6BB7B5"));
+ presetColours.push_back(QColor("#9842BE"));
+ presetColours.push_back(QColor("#4897D6"));
+ presetColours.push_back(QColor("#8958E4"));
+ presetColours.push_back(QColor("#8F0065"));
+ presetColours.push_back(QColor("#A10A5E"));
+ presetColours.push_back(QColor("#076315"));
+ presetColours.push_back(QColor("#FA5EF9"));
+ presetColours.push_back(QColor("#A33402"));
+ presetColours.push_back(QColor("#A0ABC4"));
+ presetColours.push_back(QColor("#2B6EFE"));
+ presetColours.push_back(QColor("#9A9EE7"));
+
+ return presetColours;
+}
+
+
+
+//This function will convert a colour to its SVG name, if one exists, or the hex value otherwise.
+QString getColourName(QColor colour)
+{
+ if (colour == QColor(240, 248, 255)) return "aliceblue";
+ if (colour == QColor(250, 235, 215)) return "antiquewhite";
+ if (colour == QColor( 0, 255, 255)) return "aqua";
+ if (colour == QColor(127, 255, 212)) return "aquamarine";
+ if (colour == QColor(240, 255, 255)) return "azure";
+ if (colour == QColor(245, 245, 220)) return "beige";
+ if (colour == QColor(255, 228, 196)) return "bisque";
+ if (colour == QColor( 0, 0, 0)) return "black";
+ if (colour == QColor(255, 235, 205)) return "blanchedalmond";
+ if (colour == QColor( 0, 0, 255)) return "blue";
+ if (colour == QColor(138, 43, 226)) return "blueviolet";
+ if (colour == QColor(165, 42, 42)) return "brown";
+ if (colour == QColor(222, 184, 135)) return "burlywood";
+ if (colour == QColor( 95, 158, 160)) return "cadetblue";
+ if (colour == QColor(127, 255, 0)) return "chartreuse";
+ if (colour == QColor(210, 105, 30)) return "chocolate";
+ if (colour == QColor(255, 127, 80)) return "coral";
+ if (colour == QColor(100, 149, 237)) return "cornflowerblue";
+ if (colour == QColor(255, 248, 220)) return "cornsilk";
+ if (colour == QColor(220, 20, 60)) return "crimson";
+ if (colour == QColor( 0, 255, 255)) return "cyan";
+ if (colour == QColor( 0, 0, 139)) return "darkblue";
+ if (colour == QColor( 0, 139, 139)) return "darkcyan";
+ if (colour == QColor(184, 134, 11)) return "darkgoldenrod";
+ if (colour == QColor( 0, 100, 0)) return "darkgreen";
+ if (colour == QColor(169, 169, 169)) return "darkgrey";
+ if (colour == QColor(189, 183, 107)) return "darkkhaki";
+ if (colour == QColor(139, 0, 139)) return "darkmagenta";
+ if (colour == QColor( 85, 107, 47)) return "darkolivegreen";
+ if (colour == QColor(255, 140, 0)) return "darkorange";
+ if (colour == QColor(153, 50, 204)) return "darkorchid";
+ if (colour == QColor(139, 0, 0)) return "darkred";
+ if (colour == QColor(233, 150, 122)) return "darksalmon";
+ if (colour == QColor(143, 188, 143)) return "darkseagreen";
+ if (colour == QColor( 72, 61, 139)) return "darkslateblue";
+ if (colour == QColor( 47, 79, 79)) return "darkslategrey";
+ if (colour == QColor( 0, 206, 209)) return "darkturquoise";
+ if (colour == QColor(148, 0, 211)) return "darkviolet";
+ if (colour == QColor(255, 20, 147)) return "deeppink";
+ if (colour == QColor( 0, 191, 255)) return "deepskyblue";
+ if (colour == QColor(105, 105, 105)) return "dimgrey";
+ if (colour == QColor( 30, 144, 255)) return "dodgerblue";
+ if (colour == QColor(178, 34, 34)) return "firebrick";
+ if (colour == QColor(255, 250, 240)) return "floralwhite";
+ if (colour == QColor( 34, 139, 34)) return "forestgreen";
+ if (colour == QColor(255, 0, 255)) return "fuchsia";
+ if (colour == QColor(220, 220, 220)) return "gainsboro";
+ if (colour == QColor(248, 248, 255)) return "ghostwhite";
+ if (colour == QColor(255, 215, 0)) return "gold";
+ if (colour == QColor(218, 165, 32)) return "goldenrod";
+ if (colour == QColor(128, 128, 128)) return "grey";
+ if (colour == QColor( 0, 128, 0)) return "green";
+ if (colour == QColor(173, 255, 47)) return "greenyellow";
+ if (colour == QColor(240, 255, 240)) return "honeydew";
+ if (colour == QColor(255, 105, 180)) return "hotpink";
+ if (colour == QColor(205, 92, 92)) return "indianred";
+ if (colour == QColor( 75, 0, 130)) return "indigo";
+ if (colour == QColor(255, 255, 240)) return "ivory";
+ if (colour == QColor(240, 230, 140)) return "khaki";
+ if (colour == QColor(230, 230, 250)) return "lavender";
+ if (colour == QColor(255, 240, 245)) return "lavenderblush";
+ if (colour == QColor(124, 252, 0)) return "lawngreen";
+ if (colour == QColor(255, 250, 205)) return "lemonchiffon";
+ if (colour == QColor(173, 216, 230)) return "lightblue";
+ if (colour == QColor(240, 128, 128)) return "lightcoral";
+ if (colour == QColor(224, 255, 255)) return "lightcyan";
+ if (colour == QColor(250, 250, 210)) return "lightgoldenrodyellow";
+ if (colour == QColor(144, 238, 144)) return "lightgreen";
+ if (colour == QColor(211, 211, 211)) return "lightgrey";
+ if (colour == QColor(255, 182, 193)) return "lightpink";
+ if (colour == QColor(255, 160, 122)) return "lightsalmon";
+ if (colour == QColor( 32, 178, 170)) return "lightseagreen";
+ if (colour == QColor(135, 206, 250)) return "lightskyblue";
+ if (colour == QColor(119, 136, 153)) return "lightslategrey";
+ if (colour == QColor(176, 196, 222)) return "lightsteelblue";
+ if (colour == QColor(255, 255, 224)) return "lightyellow";
+ if (colour == QColor( 0, 255, 0)) return "lime";
+ if (colour == QColor( 50, 205, 50)) return "limegreen";
+ if (colour == QColor(250, 240, 230)) return "linen";
+ if (colour == QColor(255, 0, 255)) return "magenta";
+ if (colour == QColor(128, 0, 0)) return "maroon";
+ if (colour == QColor(102, 205, 170)) return "mediumaquamarine";
+ if (colour == QColor( 0, 0, 205)) return "mediumblue";
+ if (colour == QColor(186, 85, 211)) return "mediumorchid";
+ if (colour == QColor(147, 112, 219)) return "mediumpurple";
+ if (colour == QColor( 60, 179, 113)) return "mediumseagreen";
+ if (colour == QColor(123, 104, 238)) return "mediumslateblue";
+ if (colour == QColor( 0, 250, 154)) return "mediumspringgreen";
+ if (colour == QColor( 72, 209, 204)) return "mediumturquoise";
+ if (colour == QColor(199, 21, 133)) return "mediumvioletred";
+ if (colour == QColor( 25, 25, 112)) return "midnightblue";
+ if (colour == QColor(245, 255, 250)) return "mintcream";
+ if (colour == QColor(255, 228, 225)) return "mistyrose";
+ if (colour == QColor(255, 228, 181)) return "moccasin";
+ if (colour == QColor(255, 222, 173)) return "navajowhite";
+ if (colour == QColor( 0, 0, 128)) return "navy";
+ if (colour == QColor(253, 245, 230)) return "oldlace";
+ if (colour == QColor(128, 128, 0)) return "olive";
+ if (colour == QColor(107, 142, 35)) return "olivedrab";
+ if (colour == QColor(255, 165, 0)) return "orange";
+ if (colour == QColor(255, 69, 0)) return "orangered";
+ if (colour == QColor(218, 112, 214)) return "orchid";
+ if (colour == QColor(238, 232, 170)) return "palegoldenrod";
+ if (colour == QColor(152, 251, 152)) return "palegreen";
+ if (colour == QColor(175, 238, 238)) return "paleturquoise";
+ if (colour == QColor(219, 112, 147)) return "palevioletred";
+ if (colour == QColor(255, 239, 213)) return "papayawhip";
+ if (colour == QColor(255, 218, 185)) return "peachpuff";
+ if (colour == QColor(205, 133, 63)) return "peru";
+ if (colour == QColor(255, 192, 203)) return "pink";
+ if (colour == QColor(221, 160, 221)) return "plum";
+ if (colour == QColor(176, 224, 230)) return "powderblue";
+ if (colour == QColor(128, 0, 128)) return "purple";
+ if (colour == QColor(255, 0, 0)) return "red";
+ if (colour == QColor(188, 143, 143)) return "rosybrown";
+ if (colour == QColor( 65, 105, 225)) return "royalblue";
+ if (colour == QColor(139, 69, 19)) return "saddlebrown";
+ if (colour == QColor(250, 128, 114)) return "salmon";
+ if (colour == QColor(244, 164, 96)) return "sandybrown";
+ if (colour == QColor( 46, 139, 87)) return "seagreen";
+ if (colour == QColor(255, 245, 238)) return "seashell";
+ if (colour == QColor(160, 82, 45)) return "sienna";
+ if (colour == QColor(192, 192, 192)) return "silver";
+ if (colour == QColor(135, 206, 235)) return "skyblue";
+ if (colour == QColor(106, 90, 205)) return "slateblue";
+ if (colour == QColor(112, 128, 144)) return "slategrey";
+ if (colour == QColor(255, 250, 250)) return "snow";
+ if (colour == QColor( 0, 255, 127)) return "springgreen";
+ if (colour == QColor( 70, 130, 180)) return "steelblue";
+ if (colour == QColor(210, 180, 140)) return "tan";
+ if (colour == QColor( 0, 128, 128)) return "teal";
+ if (colour == QColor(216, 191, 216)) return "thistle";
+ if (colour == QColor(255, 99, 71)) return "tomato";
+ if (colour == QColor( 64, 224, 208)) return "turquoise";
+ if (colour == QColor(238, 130, 238)) return "violet";
+ if (colour == QColor(245, 222, 179)) return "wheat";
+ if (colour == QColor(255, 255, 255)) return "white";
+ if (colour == QColor(245, 245, 245)) return "whitesmoke";
+ if (colour == QColor(255, 255, 0)) return "yellow";
+ if (colour == QColor(154, 205, 50)) return "yellowgreen";
+
+ return colour.name();
+}
+
+
diff --git a/program/globals.h b/program/globals.h
new file mode 100644
index 0000000..11ca7b7
--- /dev/null
+++ b/program/globals.h
@@ -0,0 +1,82 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef GLOBALS_H
+#define GLOBALS_H
+
+#include <vector>
+#include <QString>
+#include <QProcess>
+#include <QSharedPointer>
+#include <QColor>
+
+class Settings;
+class Memory;
+class MyGraphicsView;
+class BlastSearch;
+class AssemblyGraph;
+
+enum NodeColourScheme {UNIFORM_COLOURS, RANDOM_COLOURS, DEPTH_COLOUR,
+ BLAST_HITS_RAINBOW_COLOUR, BLAST_HITS_SOLID_COLOUR,
+ CONTIGUITY_COLOUR, CUSTOM_COLOURS};
+enum GraphScope {WHOLE_GRAPH, AROUND_NODE, AROUND_BLAST_HITS, DEPTH_RANGE};
+enum ContiguityStatus {STARTING, CONTIGUOUS_STRAND_SPECIFIC,
+ CONTIGUOUS_EITHER_STRAND, MAYBE_CONTIGUOUS,
+ NOT_CONTIGUOUS};
+enum NodeDragging {ONE_PIECE, NEARBY_PIECES, ALL_PIECES, NO_DRAGGING};
+enum ZoomSource {MOUSE_WHEEL, SPIN_BOX, KEYBOARD, GESTURE};
+enum UiState {NO_GRAPH_LOADED, GRAPH_LOADED, GRAPH_DRAWN};
+enum NodeLengthMode {AUTO_NODE_LENGTH, MANUAL_NODE_LENGTH};
+enum GraphFileType {LAST_GRAPH, FASTG, GFA, TRINITY, ASQG, PLAIN_FASTA, ANY_FILE_TYPE,
+ UNKNOWN_FILE_TYPE};
+enum SequenceType {NUCLEOTIDE, PROTEIN, EITHER_NUCLEOTIDE_OR_PROTEIN};
+enum BlastUiState {BLAST_DB_NOT_YET_BUILT, BLAST_DB_BUILD_IN_PROGRESS,
+ BLAST_DB_BUILT_BUT_NO_QUERIES,
+ READY_FOR_BLAST_SEARCH, BLAST_SEARCH_IN_PROGRESS,
+ BLAST_SEARCH_COMPLETE};
+enum CommandLineCommand {NO_COMMAND, BANDAGE_LOAD, BANDAGE_INFO, BANDAGE_IMAGE,
+ BANDAGE_DISTANCE, BANDAGE_QUERY_PATHS, BANDAGE_REDUCE};
+enum EdgeOverlapType {UNKNOWN_OVERLAP, EXACT_OVERLAP,
+ AUTO_DETERMINED_EXACT_OVERLAP};
+enum NodeNameStatus {NODE_NAME_OKAY, NODE_NAME_TAKEN, NODE_NAME_CONTAINS_TAB,
+ NODE_NAME_CONTAINS_NEWLINE, NODE_NAME_CONTAINS_COMMA,
+ NODE_NAME_CONTAINS_SPACE};
+enum SequencesLoadedFromFasta {NOT_READY, NOT_TRIED, TRIED};
+
+
+//Some of the program's common components are made global so they don't have
+//to be passed around as parameters.
+extern QSharedPointer<Settings> g_settings;
+extern QSharedPointer<Memory> g_memory;
+extern MyGraphicsView * g_graphicsView;
+extern double g_absoluteZoom;
+extern QSharedPointer<BlastSearch> g_blastSearch;
+extern QSharedPointer<AssemblyGraph> g_assemblyGraph;
+
+
+//Functions for formatting numbers are used in many places, and are made global.
+QString formatIntForDisplay(int num);
+QString formatIntForDisplay(long long num);
+QString formatDoubleForDisplay(double num, int decimalPlacesToDisplay);
+QString formatDepthForDisplay(double depth);
+
+std::vector<QColor> getPresetColours();
+QString getColourName(QColor colour);
+
+
+#endif // GLOBALS_H
diff --git a/program/graphlayoutworker.cpp b/program/graphlayoutworker.cpp
new file mode 100644
index 0000000..b53660b
--- /dev/null
+++ b/program/graphlayoutworker.cpp
@@ -0,0 +1,83 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "graphlayoutworker.h"
+#include <time.h>
+#include "ogdf/basic/geometry.h"
+#include <QLineF>
+
+GraphLayoutWorker::GraphLayoutWorker(ogdf::FMMMLayout * fmmm, ogdf::GraphAttributes * graphAttributes,
+ ogdf::EdgeArray<double> * edgeArray, int graphLayoutQuality, bool linearLayout,
+ double graphLayoutComponentSeparation, double aspectRatio) :
+ m_fmmm(fmmm), m_graphAttributes(graphAttributes), m_edgeArray(edgeArray), m_graphLayoutQuality(graphLayoutQuality),
+ m_linearLayout(linearLayout), m_graphLayoutComponentSeparation(graphLayoutComponentSeparation),
+ m_aspectRatio(aspectRatio)
+{
+}
+
+
+void GraphLayoutWorker::layoutGraph()
+{
+ m_fmmm->randSeed(clock());
+ m_fmmm->useHighLevelOptions(false);
+ m_fmmm->initialPlacementForces(ogdf::FMMMLayout::ipfRandomRandIterNr);
+ m_fmmm->unitEdgeLength(1.0);
+ m_fmmm->allowedPositions(ogdf::FMMMLayout::apAll);
+ m_fmmm->pageRatio(m_aspectRatio);
+ m_fmmm->minDistCC(m_graphLayoutComponentSeparation);
+ m_fmmm->stepsForRotatingComponents(50); // Helps to make linear graph components more horizontal.
+
+ if (m_linearLayout)
+ m_fmmm->initialPlacementForces(ogdf::FMMMLayout::ipfKeepPositions);
+ else
+ m_fmmm->initialPlacementForces(ogdf::FMMMLayout::ipfRandomTime);
+
+ switch (m_graphLayoutQuality)
+ {
+ case 0:
+ m_fmmm->fixedIterations(3);
+ m_fmmm->fineTuningIterations(1);
+ m_fmmm->nmPrecision(2);
+ break;
+ case 1:
+ m_fmmm->fixedIterations(12);
+ m_fmmm->fineTuningIterations(8);
+ m_fmmm->nmPrecision(2);
+ break;
+ case 2:
+ m_fmmm->fixedIterations(30);
+ m_fmmm->fineTuningIterations(20);
+ m_fmmm->nmPrecision(4);
+ break;
+ case 3:
+ m_fmmm->fixedIterations(60);
+ m_fmmm->fineTuningIterations(20);
+ m_fmmm->nmPrecision(6);
+ break;
+ case 4:
+ m_fmmm->fixedIterations(120);
+ m_fmmm->fineTuningIterations(20);
+ m_fmmm->nmPrecision(8);
+ break;
+ }
+
+ m_fmmm->call(*m_graphAttributes, *m_edgeArray);
+
+ emit finishedLayout();
+}
+
diff --git a/program/graphlayoutworker.h b/program/graphlayoutworker.h
new file mode 100644
index 0000000..c86b4a2
--- /dev/null
+++ b/program/graphlayoutworker.h
@@ -0,0 +1,51 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef GRAPHLAYOUTWORKER_H
+#define GRAPHLAYOUTWORKER_H
+
+#include <QObject>
+#include "../ogdf/energybased/FMMMLayout.h"
+#include "../ogdf/basic/GraphAttributes.h"
+
+
+class GraphLayoutWorker : public QObject
+{
+ Q_OBJECT
+
+public:
+ GraphLayoutWorker(ogdf::FMMMLayout * fmmm, ogdf::GraphAttributes * graphAttributes,
+ ogdf::EdgeArray<double> * edgeArray, int graphLayoutQuality, bool linearLayout,
+ double graphLayoutComponentSeparation, double aspectRatio = 1.333333);
+
+ ogdf::FMMMLayout * m_fmmm;
+ ogdf::GraphAttributes * m_graphAttributes;
+ ogdf::EdgeArray<double> * m_edgeArray;
+ int m_graphLayoutQuality;
+ bool m_linearLayout;
+ double m_graphLayoutComponentSeparation;
+ double m_aspectRatio;
+
+public slots:
+ void layoutGraph();
+
+signals:
+ void finishedLayout();
+};
+
+#endif // GRAPHLAYOUTWORKER_H
diff --git a/program/main.cpp b/program/main.cpp
new file mode 100644
index 0000000..8e99321
--- /dev/null
+++ b/program/main.cpp
@@ -0,0 +1,198 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "../ui/mainwindow.h"
+#include <QApplication>
+#include <QStringList>
+#include <QString>
+#include <QCommandLineParser>
+#include <QTextStream>
+#include "../command_line/load.h"
+#include "../command_line/info.h"
+#include "../command_line/image.h"
+#include "../command_line/querypaths.h"
+#include "../command_line/reduce.h"
+#include "../command_line/commoncommandlinefunctions.h"
+#include "../program/settings.h"
+#include "../program/memory.h"
+#include "../program/globals.h"
+#include "../blast/blastsearch.h"
+#include "../graph/assemblygraph.h"
+#include "../ui/mygraphicsview.h"
+
+#ifndef Q_OS_WIN32
+#include <sys/ioctl.h>
+#endif //Q_OS_WIN32
+
+void printUsage(QTextStream * out, bool all)
+{
+ QStringList text;
+
+ text << "";
+ text << "Usage: Bandage <command> [options]";
+ text << "";
+ text << "Commands: <blank> Launch the Bandage GUI";
+ text << "load Launch the Bandage GUI and load a graph file";
+ text << "info Display information about a graph";
+ text << "image Generate an image file of a graph";
+ text << "querypaths Output graph paths for BLAST queries";
+ text << "reduce Save a subgraph of a larger graph";
+ text << "";
+ text << "Options: --help View this help message";
+ text << "--helpall View all command line settings";
+ text << "--version View Bandage version number";
+ text << "";
+
+ if (all)
+ getSettingsUsage(&text);
+ getOnlineHelpMessage(&text);
+
+ outputText(text, out);
+}
+
+int main(int argc, char *argv[])
+{
+ QStringList arguments = getArgumentList(argc, argv);
+
+ QString first;
+ if (arguments.size() > 0)
+ first = arguments[0];
+
+ //When launched from the app bundle, OS X can pass a process serial number
+ //as the first argument. If so, we throw it out.
+ if (first.contains("-psn_"))
+ {
+ arguments.pop_front();
+ first = "";
+ if (arguments.size() > 0)
+ first = arguments[0];
+ }
+
+ // Create the application. Some ways of running Bandage require the normal platform while other command line only
+ // ways use the minimal platform. Frustratingly, Bandage image cannot render text properly with the minimal
+ // platform, so we need to use the full platform if Bandage image is run with text labels.
+ bool imageWithText = (first.toLower() == "image") &&
+ (arguments.contains("--names") || arguments.contains("--lengths") ||
+ arguments.contains("--depth") || arguments.contains("--blasthits"));
+ bool guiNeeded = (first == "") || (first.toLower() == "load") || imageWithText;
+ if (checkForHelp(arguments) || checkForHelpAll(arguments))
+ guiNeeded = false;
+ if (!guiNeeded)
+ qputenv("QT_QPA_PLATFORM", QByteArrayLiteral("minimal"));
+ new QApplication(argc, argv);
+
+ //Create the important global objects.
+ g_settings.reset(new Settings());
+ g_memory.reset(new Memory());
+ g_blastSearch.reset(new BlastSearch());
+ g_assemblyGraph.reset(new AssemblyGraph());
+ g_graphicsView = new MyGraphicsView();
+
+ //Save the terminal width (useful for displaying help text neatly).
+ #ifndef Q_OS_WIN32
+ struct winsize ws;
+ ioctl(0, TIOCGWINSZ, &ws);
+ g_memory->terminalWidth = ws.ws_col;
+ if (g_memory->terminalWidth < 50) g_memory->terminalWidth = 50;
+ if (g_memory->terminalWidth > 300) g_memory->terminalWidth = 300;
+ #endif //Q_OS_WIN32
+
+ QApplication::setApplicationName("Bandage");
+ QApplication::setApplicationVersion("0.8.1");
+
+ QTextStream out(stdout);
+ QTextStream err(stderr);
+
+ //If the first argument was a recognised command, move to that command's function.
+ if (arguments.size() > 0)
+ {
+ if (checkForVersion(arguments))
+ {
+ out << "Version: " << QApplication::applicationVersion() << endl;
+ return 0;
+ }
+ if (first.toLower() == "load")
+ {
+ arguments.pop_front();
+ g_memory->commandLineCommand = BANDAGE_LOAD;
+ return bandageLoad(arguments);
+ }
+ else if (first.toLower() == "info")
+ {
+ arguments.pop_front();
+ g_memory->commandLineCommand = BANDAGE_INFO;
+ return bandageInfo(arguments);
+ }
+ else if (first.toLower() == "image")
+ {
+ arguments.pop_front();
+ g_memory->commandLineCommand = BANDAGE_IMAGE;
+ return bandageImage(arguments);
+ }
+ else if (first.toLower() == "querypaths")
+ {
+ arguments.pop_front();
+ g_memory->commandLineCommand = BANDAGE_QUERY_PATHS;
+ return bandageQueryPaths(arguments);
+ }
+ else if (first.toLower() == "reduce")
+ {
+ arguments.pop_front();
+ g_memory->commandLineCommand = BANDAGE_REDUCE;
+ return bandageReduce(arguments);
+ }
+
+ //Since a recognised command was not seen, we now check to see if the user
+ //was looking for help information.
+ else if (checkForHelp(arguments))
+ {
+ out << endl;
+ out << getBandageTitleAsciiArt() << endl;
+ out << "Version: " << QApplication::applicationVersion();
+ printUsage(&out, false);
+ return 0;
+ }
+ else if (checkForHelpAll(arguments))
+ {
+ out << endl;
+ out << getBandageTitleAsciiArt() << endl;
+ out << "Version: " << QApplication::applicationVersion();
+ printUsage(&out, true);
+ return 0;
+ }
+ }
+
+ //If the code got here, we assume the user is simply launching Bandage,
+ //with or without some options to specify settings.
+
+ //Check the settings.
+ QStringList argumentsCopy = arguments;
+ QString error = checkForInvalidOrExcessSettings(&argumentsCopy);
+ if (error.length() > 0)
+ {
+ outputText("Bandage error: " + error, &err);
+ return 1;
+ }
+
+ //If the code got here, then the settings are good. Parse them now and
+ //run the program.
+ parseSettings(arguments);
+ MainWindow w;
+ w.show();
+ return QApplication::exec();
+}
diff --git a/program/memory.cpp b/program/memory.cpp
new file mode 100644
index 0000000..e6346a5
--- /dev/null
+++ b/program/memory.cpp
@@ -0,0 +1,60 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "memory.h"
+
+#include <QDir>
+
+Memory::Memory()
+{
+ rememberedPath = QDir::homePath();
+
+ commandLineCommand = NO_COMMAND;
+
+ pathDialogIsVisible = false;
+ queryPathDialogIsVisible = false;
+
+ userSpecifiedPath = Path();
+ userSpecifiedPathString = "";
+ userSpecifiedPathCircular = false;
+
+ distancePathSearchQuery1 = "";
+ distancePathSearchQuery2 = "";
+ distancePathSearchQuery1Path = "";
+ distancePathSearchQuery2Path = "";
+
+ terminalWidth = 80;
+}
+
+
+
+//This function clears all memory that is particular to a graph. It should be
+//called whenever a new graph is loaded.
+void Memory::clearGraphSpecificMemory()
+{
+ userSpecifiedPath = Path();
+ userSpecifiedPathString = "";
+ userSpecifiedPathCircular = false;
+
+ distanceSearchResults.clear();
+ distancePathSearchQuery1 = "";
+ distancePathSearchQuery2 = "";
+ distancePathSearchQuery1Path = "";
+ distancePathSearchQuery2Path = "";
+}
+
diff --git a/program/memory.h b/program/memory.h
new file mode 100644
index 0000000..2291fc4
--- /dev/null
+++ b/program/memory.h
@@ -0,0 +1,61 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef MEMORY_H
+#define MEMORY_H
+
+#include "../program/globals.h"
+#include <QList>
+#include <QStringList>
+#include "../graph/querydistance.h"
+
+class Memory
+{
+public:
+ Memory();
+ void clearGraphSpecificMemory();
+
+ QString rememberedPath;
+
+ CommandLineCommand commandLineCommand;
+
+ bool pathDialogIsVisible;
+ bool queryPathDialogIsVisible;
+
+ //These store the user input in the 'Specify exact path...' dialog so it is
+ //retained between uses.
+ Path userSpecifiedPath;
+ QString userSpecifiedPathString;
+ bool userSpecifiedPathCircular;
+
+ //These store the results of a distance search between two queries.
+ QList<QueryDistance> distanceSearchResults;
+
+ //These store the last used distance path search queries/paths.
+ QString distancePathSearchQuery1;
+ QString distancePathSearchQuery2;
+ QString distancePathSearchQuery1Path;
+ QString distancePathSearchQuery2Path;
+
+ //This stores the currently selected query path in a query path dialog.
+ QList<Path> queryPaths;
+
+ int terminalWidth;
+};
+
+#endif // MEMORY_H
diff --git a/program/scinot.cpp b/program/scinot.cpp
new file mode 100644
index 0000000..b1ad77c
--- /dev/null
+++ b/program/scinot.cpp
@@ -0,0 +1,185 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage.
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "QStringList"
+#include "scinot.h"
+#include "math.h"
+
+SciNot::SciNot() :
+ m_coefficient(0.0), m_exponent(0)
+{
+ normalise();
+}
+
+SciNot::SciNot(double coefficient, int exponent) :
+ m_coefficient(coefficient), m_exponent(exponent)
+{
+ normalise();
+}
+
+
+SciNot::SciNot(QString sciNotString) :
+ m_coefficient(0.0), m_exponent(0)
+{
+ QStringList parts = sciNotString.split('e');
+ if (parts.size() < 1)
+ return;
+ if (parts.size() < 2)
+ m_coefficient = parts[0].toDouble();
+ else
+ {
+ bool ok;
+ double coefficient = parts[0].toDouble(&ok);
+ if (!ok)
+ return;
+
+ double exponent = parts[1].toInt(&ok);
+ if (!ok)
+ return;
+
+ m_coefficient = coefficient;
+ m_exponent = exponent;
+ }
+
+ normalise();
+}
+
+
+SciNot::SciNot(double num) :
+ m_coefficient(num), m_exponent(0)
+{
+ normalise();
+}
+
+
+void SciNot::normalise()
+{
+ if (m_coefficient == 0.0)
+ {
+ m_exponent = 0;
+ return;
+ }
+
+ while (fabs(m_coefficient) >= 10.0)
+ {
+ m_coefficient /= 10.0;
+ ++m_exponent;
+ }
+ while (fabs(m_coefficient) < 1.0)
+ {
+ m_coefficient *= 10.0;
+ --m_exponent;
+ }
+}
+
+
+bool SciNot::operator<(SciNot const &other) const
+{
+ if (isZero())
+ return other.isPositive();
+
+ if (isPositive())
+ {
+ if (other.isNegative() || other.isZero())
+ return false;
+ else //Both are positive
+ {
+ if (m_exponent < other.m_exponent) return true;
+ if (m_exponent > other.m_exponent) return false;
+ return m_coefficient < other.m_coefficient;
+ }
+ }
+
+ else //It's negative
+ {
+ if (other.isPositive() || other.isZero())
+ return true;
+ else //Both are negative
+ {
+ if (m_exponent > other.m_exponent) return true;
+ if (m_exponent < other.m_exponent) return false;
+ return m_coefficient < other.m_coefficient;
+ }
+ }
+}
+
+bool SciNot::operator>(SciNot const &other) const
+{
+ return !(*this < other) && (*this != other);
+}
+bool SciNot::operator<=(SciNot const &other) const
+{
+ return (*this < other) || (*this == other);
+}
+bool SciNot::operator>=(SciNot const &other) const
+{
+ return (*this > other) || (*this == other);
+}
+bool SciNot::operator==(SciNot const &other) const
+{
+ return m_coefficient == other.m_coefficient && m_exponent == other.m_exponent;
+}
+bool SciNot::operator!=(SciNot const &other) const
+{
+ return !(*this == other);
+}
+
+
+QString SciNot::asString(bool alwaysInSciNot) const
+{
+ if (!alwaysInSciNot)
+ {
+ if (isZero())
+ return "0";
+ if (m_exponent < 3 && m_exponent > -3)
+ return QString::number(toDouble());
+ }
+
+ return QString::number(m_coefficient) + "e" + QString::number(m_exponent);
+}
+
+
+double SciNot::toDouble() const
+{
+ return m_coefficient * pow(10.0, m_exponent);
+}
+
+bool SciNot::isValidSciNotString(QString sciNotString)
+{
+ QStringList parts = sciNotString.split('e');
+ if (parts.size() != 2)
+ return false;
+
+ bool coefficientOk;
+ parts[0].toDouble(&coefficientOk);
+
+ bool exponentOk;
+ parts[1].toInt(&exponentOk);
+
+ return coefficientOk && exponentOk;
+}
+
+void SciNot::power(double p) {
+ double newCoefficient = pow(m_coefficient, p);
+ double newExponent = m_exponent * p;
+ int wholePart = int(newExponent);
+ double fractionalPart = newExponent - wholePart;
+ m_coefficient = newCoefficient * pow(10.0, fractionalPart);
+ m_exponent = wholePart;
+ normalise();
+}
diff --git a/program/scinot.h b/program/scinot.h
new file mode 100644
index 0000000..cc9bc98
--- /dev/null
+++ b/program/scinot.h
@@ -0,0 +1,65 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef SCINOT_H
+#define SCINOT_H
+
+//This class defines a number in scientific notation. It is needed because
+//some numbers in Bandage (BLAST e-values and their products) can potentially
+//exceed the limits of the C++ double type.
+
+#include <QString>
+
+class SciNot
+{
+public:
+ // CREATORS
+ SciNot();
+ SciNot(double coefficient, int exponent);
+ SciNot(QString sciNotString);
+ SciNot(double num);
+
+ // ACCESSORS
+ bool operator<(SciNot const &other) const;
+ bool operator>(SciNot const &other) const;
+ bool operator<=(SciNot const &other) const;
+ bool operator>=(SciNot const &other) const;
+ bool operator==(SciNot const &other) const;
+ bool operator!=(SciNot const &other) const;
+ double getCoefficient() const {return m_coefficient;}
+ int getExponent() const {return m_exponent;}
+ QString asString(bool alwaysInSciNot) const;
+ double toDouble() const;
+ bool isPositive() const {return m_coefficient > 0.0;}
+ bool isNegative() const {return m_coefficient < 0.0;}
+ bool isZero() const {return m_coefficient == 0.0;}
+
+ // MANIPULATORS
+ void power(double p);
+
+ // STATIC
+ static bool isValidSciNotString(QString sciNotString);
+
+private:
+ double m_coefficient;
+ int m_exponent;
+
+ void normalise();
+};
+
+#endif // SCINOT_H
diff --git a/program/settings.cpp b/program/settings.cpp
new file mode 100644
index 0000000..c08c8e0
--- /dev/null
+++ b/program/settings.cpp
@@ -0,0 +1,144 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "settings.h"
+#include <QDir>
+
+Settings::Settings()
+{
+ doubleMode = false;
+
+ nodeLengthMode = AUTO_NODE_LENGTH;
+ autoNodeLengthPerMegabase = 1000.0;
+ manualNodeLengthPerMegabase = FloatSetting(1000.0, 0, 1000000.0);
+ meanNodeLength = 40.0;
+ minTotalGraphLength = 500.0;
+ graphLayoutQuality = IntSetting(2, 0, 4);
+ linearLayout = false;
+ minimumNodeLength = FloatSetting(5.0, 1.0, 100.0);
+ edgeLength = FloatSetting(5.0, 0.1, 100.0);
+ doubleModeNodeSeparation = FloatSetting(2.0, 0.0, 100.0);
+ nodeSegmentLength = FloatSetting(20.0, 1.0, 1000.0);
+ componentSeparation = FloatSetting(50.0, 0, 1000.0);
+
+ averageNodeWidth = FloatSetting(5.0, 0.5, 1000.0);
+ depthEffectOnWidth = FloatSetting(0.5, 0.0, 1.0);
+ depthPower = FloatSetting(0.5, 0.0, 1.0);
+
+ edgeWidth = FloatSetting(1.5, 0.1, 100);
+ outlineThickness = FloatSetting(0.0, 0.0, 100.0);
+ selectionThickness = 1.0;
+ arrowheadSize = 0.01;
+ arrowheadsInSingleMode = false;
+ textOutlineThickness = FloatSetting(1.5, 0.0, 10.0);
+
+ blastRainbowPartsPerQuery = 100;
+
+ graphScope = WHOLE_GRAPH;
+ nodeDistance = IntSetting(0, 0, 100);
+ startingNodesExactMatch = true;
+ startingNodes = "";
+ blastQueryFilename = "";
+ unnamedQueryDefaultName = "unnamed";
+
+ minZoom = 0.01;
+ minZoomOnGraphDraw = 0.2;
+ maxZoom = 100.0;
+ maxAutomaticZoom = 10.0;
+ zoomFactor = 1.0005;
+ textZoomScaleFactor = 0.7;
+
+ dragStrength = 100.0;
+
+ displayNodeCustomLabels = false;
+ displayNodeNames = false;
+ displayNodeLengths = false;
+ displayNodeDepth = false;
+ displayNodeCsvData = false;
+ displayNodeCsvDataCol = 0;
+ displayBlastHits = false;
+ labelFont = QFont();
+ textOutline = false;
+ antialiasing = true;
+ positionTextNodeCentre = false;
+
+ nodeDragging = NEARBY_PIECES;
+
+ nodeColourScheme = RANDOM_COLOURS;
+ uniformPositiveNodeColour = QColor(178, 34, 34);
+ uniformNegativeNodeColour = QColor(128, 0, 0);
+ uniformNodeSpecialColour = QColor(0, 128, 0);
+
+ randomColourPositiveOpacity = IntSetting(255, 0, 255);
+ randomColourNegativeOpacity = IntSetting(255, 0, 255);
+ randomColourPositiveSaturation = IntSetting(127, 0, 255);
+ randomColourNegativeSaturation = IntSetting(127, 0, 255);
+ randomColourPositiveLightness = IntSetting(150, 0, 255);
+ randomColourNegativeLightness = IntSetting(90, 0, 255);
+
+ edgeColour = QColor(0, 0, 0, 180);
+ outlineColour = QColor(0, 0, 0);
+ selectionColour = QColor(0, 0, 255);
+ textColour = QColor(0, 0, 0);
+ textOutlineColour = QColor(255, 255, 255);
+
+ contiguitySearchSteps = IntSetting(15, 1, 50);
+ contiguousStrandSpecificColour = QColor(0, 155, 0);
+ contiguousEitherStrandColour = QColor(0, 155, 0);
+ maybeContiguousColour = QColor(190, 240, 190);
+ notContiguousColour = QColor(220, 220, 220);
+ contiguityStartingColour = QColor(0, 255, 0);
+
+ noBlastHitsColour = QColor(220, 220, 220);
+
+ autoDepthValue = true;
+ lowDepthValue = FloatSetting(5.0, 0.0, 1000000.0);
+ lowDepthColour = QColor(0, 0, 0);
+ highDepthValue = FloatSetting(50.0, 0.0, 1000000.0);
+ highDepthColour = QColor(255, 0, 0);
+
+ pathHighlightShadingColour = QColor(0, 0, 0, 60);
+ pathHighlightOutlineColour = QColor(0, 0, 0);
+
+ defaultCustomNodeColour = QColor(190, 190, 190);
+
+ minAutoFindEdgeOverlap = 10;
+ maxAutoFindEdgeOverlap = 200;
+
+ maxHitsForQueryPath = IntSetting(100, 0, 1000000);
+ maxQueryPathNodes = IntSetting(6, 1, 50);
+ minQueryCoveredByPath = FloatSetting(0.9, 0.3, 1.0);
+ minQueryCoveredByHits = FloatSetting(0.9, 0.3, 1.0, true);
+ minMeanHitIdentity = FloatSetting(0.5, 0.0, 1.0, true);
+ maxEValueProduct = SciNotSetting(SciNot(1.0, -10), SciNot(1.0, -999), SciNot(9.9, 1), true);
+ minLengthPercentage = FloatSetting(0.95, 0.0, 10000.0, true);
+ maxLengthPercentage = FloatSetting(1.05, 0.0, 10000.0, true);
+ minLengthBaseDiscrepancy = IntSetting(-100, -1000000, 1000000, false);
+ maxLengthBaseDiscrepancy = IntSetting(100, -1000000, 1000000, false);
+
+ blastSearchParameters = "";
+
+ blastAlignmentLengthFilter = IntSetting(100, 1, 1000000, false);
+ blastQueryCoverageFilter = FloatSetting(50.0, 0.0, 100.0, false);
+ blastIdentityFilter = FloatSetting(90.0, 0.0, 100.0, false);
+ blastEValueFilter = SciNotSetting(SciNot(1.0, -10), SciNot(1.0, -999), SciNot(9.9, 1), false);
+ blastBitScoreFilter = FloatSetting(1000.0, 0.0, 1000000.0, false);
+
+ minDepthRange = FloatSetting(10.0, 0.0, 1000000.0);
+ maxDepthRange = FloatSetting(100.0, 0.0, 1000000.0);
+}
diff --git a/program/settings.h b/program/settings.h
new file mode 100644
index 0000000..b106186
--- /dev/null
+++ b/program/settings.h
@@ -0,0 +1,207 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef SETTINGS_H
+#define SETTINGS_H
+
+#include <QColor>
+#include <QFont>
+#include "globals.h"
+#include <QString>
+#include "../graph/path.h"
+#include "scinot.h"
+
+class DeBruijnNode;
+
+
+
+class IntSetting
+{
+public:
+ IntSetting(int v, int minimum, int maximum, bool isOn = true) {val = v; min = minimum; max = maximum; on = isOn;}
+ IntSetting() {val = 0; min = 0; max = 0;}
+ int val, min, max;
+ bool on;
+ operator int() const {return val;}
+ IntSetting & operator=(int newVal) {val = newVal; return *this;}
+ bool inRange(int v) const {return v >= min && v <= max;}
+};
+
+class FloatSetting
+{
+public:
+ FloatSetting(double v, double minimum, double maximum, bool isOn = true) {val = v; min = minimum; max = maximum; on = isOn;}
+ FloatSetting() {val = 0.0; min = 0.0; max = 0.0;}
+ double val, min, max;
+ bool on;
+ operator double() const {return val;}
+ FloatSetting & operator=(double newVal) {val = newVal; return *this;}
+ bool inRange(double v) const {return v >= min && v <= max;}
+};
+
+class SciNotSetting
+{
+public:
+ SciNotSetting(SciNot v, SciNot minimum, SciNot maximum, bool isOn = true) {val = v; min = minimum; max = maximum; on = isOn;}
+ SciNotSetting() {val = 0.0; min = 0.0; max = 0.0;}
+ SciNot val, min, max;
+ bool on;
+ operator SciNot() const {return val;}
+ SciNotSetting & operator=(SciNot newVal) {val = newVal; return *this;}
+ bool inRange(SciNot v) const {return v >= min && v <= max;}
+};
+
+
+class Settings
+{
+public:
+ Settings();
+
+ bool doubleMode;
+
+ NodeLengthMode nodeLengthMode;
+ double autoNodeLengthPerMegabase;
+ FloatSetting manualNodeLengthPerMegabase;
+ double meanNodeLength;
+ double minTotalGraphLength;
+ IntSetting graphLayoutQuality;
+ bool linearLayout;
+ FloatSetting minimumNodeLength;
+ FloatSetting edgeLength;
+ FloatSetting doubleModeNodeSeparation;
+ FloatSetting nodeSegmentLength;
+ FloatSetting componentSeparation;
+
+ FloatSetting averageNodeWidth;
+ FloatSetting depthEffectOnWidth;
+ FloatSetting depthPower;
+
+ FloatSetting edgeWidth;
+ FloatSetting outlineThickness;
+ double selectionThickness;
+ double arrowheadSize;
+ double arrowheadsInSingleMode;
+ FloatSetting textOutlineThickness;
+
+ int blastRainbowPartsPerQuery;
+
+ GraphScope graphScope;
+ IntSetting nodeDistance;
+ bool startingNodesExactMatch;
+ QString startingNodes;
+ QString blastQueryFilename;
+ QString unnamedQueryDefaultName;
+
+ double minZoom;
+ double minZoomOnGraphDraw;
+ double maxZoom;
+ double maxAutomaticZoom;
+ double zoomFactor;
+ double textZoomScaleFactor; // 1.0 = text size constant, regardless of zoom. 0.0 = text size changes exactly with zoom.
+
+ double dragStrength;
+
+ bool displayNodeCustomLabels;
+ bool displayNodeNames;
+ bool displayNodeLengths;
+ bool displayNodeDepth;
+ bool displayNodeCsvData;
+ int displayNodeCsvDataCol;
+ bool displayBlastHits;
+ QFont labelFont;
+ bool textOutline;
+ bool antialiasing;
+ bool positionTextNodeCentre;
+
+ NodeDragging nodeDragging;
+
+ QColor edgeColour;
+ QColor outlineColour;
+ QColor selectionColour;
+ QColor textColour;
+ QColor textOutlineColour;
+
+ NodeColourScheme nodeColourScheme;
+ QColor uniformPositiveNodeColour;
+ QColor uniformNegativeNodeColour;
+ QColor uniformNodeSpecialColour;
+
+ IntSetting randomColourPositiveOpacity;
+ IntSetting randomColourNegativeOpacity;
+ IntSetting randomColourPositiveSaturation;
+ IntSetting randomColourNegativeSaturation;
+ IntSetting randomColourPositiveLightness;
+ IntSetting randomColourNegativeLightness;
+
+ IntSetting contiguitySearchSteps;
+ QColor contiguousStrandSpecificColour;
+ QColor contiguousEitherStrandColour;
+ QColor maybeContiguousColour;
+ QColor notContiguousColour;
+ QColor contiguityStartingColour;
+
+ QColor noBlastHitsColour;
+
+ bool autoDepthValue;
+ FloatSetting lowDepthValue;
+ QColor lowDepthColour;
+ FloatSetting highDepthValue;
+ QColor highDepthColour;
+
+ QColor pathHighlightShadingColour;
+ QColor pathHighlightOutlineColour;
+
+ QColor defaultCustomNodeColour;
+
+ //These specify the range of overlaps to look for when Bandage determines
+ //edge overlaps automatically.
+ int minAutoFindEdgeOverlap;
+ int maxAutoFindEdgeOverlap;
+
+ //These control how Bandage finds the best path in the graph to represent
+ //each BLAST query. Some of these settings can be turned on and off and
+ //therefore have a corresponding bool value.
+ IntSetting maxHitsForQueryPath;
+ IntSetting maxQueryPathNodes;
+ FloatSetting minQueryCoveredByPath;
+ FloatSetting minQueryCoveredByHits;
+ FloatSetting minMeanHitIdentity;
+ SciNotSetting maxEValueProduct;
+ FloatSetting minLengthPercentage;
+ FloatSetting maxLengthPercentage;
+ IntSetting minLengthBaseDiscrepancy;
+ IntSetting maxLengthBaseDiscrepancy;
+
+ //This holds the BLAST search parameters that a user can change before
+ //running a BLAST search.
+ QString blastSearchParameters;
+
+ //These are the optional BLAST hit filters: whether or not they are used and
+ //what their values are.
+ IntSetting blastAlignmentLengthFilter;
+ FloatSetting blastQueryCoverageFilter;
+ FloatSetting blastIdentityFilter;
+ SciNotSetting blastEValueFilter;
+ FloatSetting blastBitScoreFilter;
+
+ //These are used for the 'Depth range' graph scope.
+ FloatSetting minDepthRange;
+ FloatSetting maxDepthRange;
+};
+
+#endif // SETTINGS_H
diff --git a/tests/bandage_command_line_tests.sh b/tests/bandage_command_line_tests.sh
new file mode 100755
index 0000000..5e06b2d
--- /dev/null
+++ b/tests/bandage_command_line_tests.sh
@@ -0,0 +1,212 @@
+#!/bin/bash
+
+# Change this variable to point to the Bandage executable.
+bandagepath="../../build-Bandage-Desktop_Qt_5_6_0_clang_64bit-Release/Bandage.app/Contents/MacOS/Bandage"
+
+# This function tests the exit code, stdout and stderr of a command.
+function test_all {
+ command=$1
+ expected_exit_code=$2
+ expected_std_out=$3
+ expected_std_err=$4
+
+ $command 1> tmp/std_out 2> tmp/std_err
+ exit_code=$?
+ std_out="$(echo $(cat tmp/std_out))"
+ std_err="$(echo $(cat tmp/std_err))"
+
+ if [ $exit_code == $expected_exit_code ]; then correct_exit_code=true; else correct_exit_code=false; fi
+ if [ "$std_out" == "$expected_std_out" ]; then correct_std_out=true; else correct_std_out=false; fi
+ if [ "$std_err" == "$expected_std_err" ]; then correct_std_err=true; else correct_std_err=false; fi
+
+ if $correct_exit_code && $correct_std_out && $correct_std_err;
+ then echo "PASS: $command";
+ else
+ echo "FAIL: $command"
+ if ! $correct_exit_code; then echo " expected exit code: $expected_exit_code"; echo " actual exit code: $exit_code"; fi
+ if ! $correct_std_out; then echo " expected std out: $expected_std_out"; echo " actual std out: $std_out"; fi
+ if ! $correct_std_err; then echo " expected std err: $expected_std_err"; echo " actual std err: $std_err"; fi
+ fi
+
+ rm tmp/std_out
+ rm tmp/std_err
+}
+
+# This function only tests the exit code of a command.
+function test_exit_code {
+ command=$1
+ expected_exit_code=$2
+
+ $command 1> tmp/std_out 2> tmp/std_err
+ exit_code=$?
+
+ if [ $exit_code == $expected_exit_code ]; then correct_exit_code=true; else correct_exit_code=false; fi
+
+ if $correct_exit_code && $correct_std_out && $correct_std_err;
+ then echo "PASS: $command";
+ else
+ echo "FAIL: $command"
+ if ! $correct_exit_code; then echo " expected exit code: $expected_exit_code"; echo " actual exit code: $exit_code"; fi
+ fi
+
+ rm tmp/std_out
+ rm tmp/std_err
+}
+
+# This function tests only the width of an image.
+function test_image_height {
+ image=$1
+ height=$2
+
+ size=`convert $image -print "Size: %wx%h\n" /dev/null`
+
+ if [[ $size == *"x$height"* ]]
+ then echo "PASS: $size";
+ else
+ echo "FAIL:"
+ echo " expected height: $height"
+ echo " actual: $size"
+ fi
+}
+
+# This function tests only the width of an image.
+function test_image_width {
+ image=$1
+ width=$2
+
+ size=`convert $image -print "Size: %wx%h\n" /dev/null`
+
+ if [[ $size == *"$width""x"* ]]
+ then echo "PASS: $size";
+ else
+ echo "FAIL:"
+ echo " expected width: $width"
+ echo " actual: $size"
+ fi
+}
+
+# This function tests the height and width of an image.
+function test_image_width_and_height {
+ image=$1
+ width=$2
+ height=$3
+
+ size=`convert $image -print "Size: %wx%h\n" /dev/null`
+ expected_size="Size: $width""x""$height"
+
+ if [ "$size" == "$expected_size" ]
+ then echo "PASS: $size";
+ else
+ echo "FAIL:"
+ echo " expected: $expected_size"
+ echo " actual: $size"
+ fi
+}
+
+
+# The tmp directory is used to store files that hold stdout and stderr as well as anything else made by the commands.
+mkdir tmp
+
+# Bandage image tests
+test_all "$bandagepath image test.fastg tmp/test.png" 0 "" ""
+test_image_height tmp/test.png 1000; rm tmp/test.png
+test_all "$bandagepath image test.fastg tmp/test.jpg" 0 "" "";
+test_image_height tmp/test.jpg 1000; rm tmp/test.jpg
+test_all "$bandagepath image test.fastg tmp/test.svg" 0 "" ""; rm tmp/test.svg
+test_all "$bandagepath image test.fastg tmp/test.png --height 500" 0 "" ""
+test_image_height tmp/test.png 500; rm tmp/test.png
+test_all "$bandagepath image test.fastg tmp/test.png --height 50" 0 "" ""
+test_image_height tmp/test.png 50; rm tmp/test.png
+test_all "$bandagepath image test.fastg tmp/test.png --width 500" 0 "" ""
+test_image_width tmp/test.png 500; rm tmp/test.png
+test_all "$bandagepath image test.fastg tmp/test.png --width 50" 0 "" ""
+test_image_width tmp/test.png 50; rm tmp/test.png
+test_all "$bandagepath image test.fastg tmp/test.png --width 400 --height 500" 0 "" ""
+test_image_width_and_height tmp/test.png 400 500; rm tmp/test.png
+test_all "$bandagepath image test.fastg tmp/test.png --width 500 --height 400" 0 "" ""
+test_image_width_and_height tmp/test.png 500 400; rm tmp/test.png
+test_all "$bandagepath image abc.fastg test.png" 1 "" "Bandage error: abc.fastg does not exist"
+test_all "$bandagepath image test.fastg test.abc" 1 "" "Bandage error: the output filename must end in .png, .jpg or .svg"
+test_all "$bandagepath image test.csv tmp/test.png" 1 "" "Bandage error: could not load test.csv"
+test_all "$bandagepath image test.fastg test.png --query abc.fasta" 1 "" "Bandage error: --query must be followed by a valid filename"
+
+# Bandage load tests
+test_all "$bandagepath load abc.fastg" 1 "" "Bandage error: abc.fastg does not exist"
+test_all "$bandagepath load test.fastg --query abc.fasta" 1 "" "Bandage error: --query must be followed by a valid filename"
+
+# Bandage help tests
+test_exit_code "$bandagepath --help" 0
+test_exit_code "$bandagepath --helpall" 0
+test_exit_code "$bandagepath --version" 0
+
+# Bandage incorrect settings tests
+test_all "$bandagepath --abc" 1 "" "Bandage error: Invalid option: --abc"
+test_all "$bandagepath --scope" 1 "" "Bandage error: --scope must be followed by entire, aroundnodes, aroundblast or depthrange"
+test_all "$bandagepath --scope abc" 1 "" "Bandage error: --scope must be followed by entire, aroundnodes, aroundblast or depthrange"
+test_all "$bandagepath --nodes" 1 "" "Bandage error: --nodes must be followed by a list of node names"
+test_all "$bandagepath --distance" 1 "" "Bandage error: --distance must be followed by an integer"
+test_all "$bandagepath --distance abc" 1 "" "Bandage error: --distance must be followed by an integer"
+test_all "$bandagepath --mindepth" 1 "" "Bandage error: --mindepth must be followed by a number"
+test_all "$bandagepath --mindepth abc" 1 "" "Bandage error: --mindepth must be followed by a number"
+test_all "$bandagepath --maxdepth" 1 "" "Bandage error: --maxdepth must be followed by a number"
+test_all "$bandagepath --nodelen" 1 "" "Bandage error: --nodelen must be followed by a number"
+test_all "$bandagepath --minnodlen" 1 "" "Bandage error: --minnodlen must be followed by a number"
+test_all "$bandagepath --edgelen" 1 "" "Bandage error: --edgelen must be followed by a number"
+test_all "$bandagepath --edgewidth" 1 "" "Bandage error: --edgewidth must be followed by a number"
+test_all "$bandagepath --doubsep" 1 "" "Bandage error: --doubsep must be followed by a number"
+test_all "$bandagepath --nodseglen" 1 "" "Bandage error: --nodseglen must be followed by a number"
+test_all "$bandagepath --iter" 1 "" "Bandage error: --iter must be followed by an integer"
+test_all "$bandagepath --nodewidth" 1 "" "Bandage error: --nodewidth must be followed by a number"
+test_all "$bandagepath --depwidth" 1 "" "Bandage error: --depwidth must be followed by a number"
+test_all "$bandagepath --deppower" 1 "" "Bandage error: --deppower must be followed by a number"
+test_all "$bandagepath --fontsize" 1 "" "Bandage error: --fontsize must be followed by an integer"
+test_all "$bandagepath --edgecol" 1 "" "Bandage error: --edgecol must be followed by a 6-digit hex colour (e.g. #FFB6C1), an 8-digit hex colour (e.g. #7FD2B48C) or a standard colour name (e.g. skyblue)"
+test_all "$bandagepath --edgecol abc" 1 "" "Bandage error: --edgecol must be followed by a 6-digit hex colour (e.g. #FFB6C1), an 8-digit hex colour (e.g. #7FD2B48C) or a standard colour name (e.g. skyblue)"
+test_all "$bandagepath --outcol" 1 "" "Bandage error: --outcol must be followed by a 6-digit hex colour (e.g. #FFB6C1), an 8-digit hex colour (e.g. #7FD2B48C) or a standard colour name (e.g. skyblue)"
+test_all "$bandagepath --outline" 1 "" "Bandage error: --outline must be followed by a number"
+test_all "$bandagepath --selcol" 1 "" "Bandage error: --selcol must be followed by a 6-digit hex colour (e.g. #FFB6C1), an 8-digit hex colour (e.g. #7FD2B48C) or a standard colour name (e.g. skyblue)"
+test_all "$bandagepath --textcol" 1 "" "Bandage error: --textcol must be followed by a 6-digit hex colour (e.g. #FFB6C1), an 8-digit hex colour (e.g. #7FD2B48C) or a standard colour name (e.g. skyblue)"
+test_all "$bandagepath --toutcol" 1 "" "Bandage error: --toutcol must be followed by a 6-digit hex colour (e.g. #FFB6C1), an 8-digit hex colour (e.g. #7FD2B48C) or a standard colour name (e.g. skyblue)"
+test_all "$bandagepath --toutline" 1 "" "Bandage error: --toutline must be followed by a number"
+test_all "$bandagepath --colour" 1 "" "Bandage error: --colour must be followed by random, uniform, depth, blastsolid or blastrainbow"
+test_all "$bandagepath --colour abc" 1 "" "Bandage error: --colour must be followed by random, uniform, depth, blastsolid or blastrainbow"
+test_all "$bandagepath --ransatpos" 1 "" "Bandage error: --ransatpos must be followed by an integer"
+test_all "$bandagepath --ransatneg" 1 "" "Bandage error: --ransatneg must be followed by an integer"
+test_all "$bandagepath --ranligpos" 1 "" "Bandage error: --ranligpos must be followed by an integer"
+test_all "$bandagepath --ranligneg" 1 "" "Bandage error: --ranligneg must be followed by an integer"
+test_all "$bandagepath --ranopapos" 1 "" "Bandage error: --ranopapos must be followed by an integer"
+test_all "$bandagepath --ranopaneg" 1 "" "Bandage error: --ranopaneg must be followed by an integer"
+test_all "$bandagepath --unicolpos" 1 "" "Bandage error: --unicolpos must be followed by a 6-digit hex colour (e.g. #FFB6C1), an 8-digit hex colour (e.g. #7FD2B48C) or a standard colour name (e.g. skyblue)"
+test_all "$bandagepath --unicolneg" 1 "" "Bandage error: --unicolneg must be followed by a 6-digit hex colour (e.g. #FFB6C1), an 8-digit hex colour (e.g. #7FD2B48C) or a standard colour name (e.g. skyblue)"
+test_all "$bandagepath --unicolspe" 1 "" "Bandage error: --unicolspe must be followed by a 6-digit hex colour (e.g. #FFB6C1), an 8-digit hex colour (e.g. #7FD2B48C) or a standard colour name (e.g. skyblue)"
+test_all "$bandagepath --depcollow" 1 "" "Bandage error: --depcollow must be followed by a 6-digit hex colour (e.g. #FFB6C1), an 8-digit hex colour (e.g. #7FD2B48C) or a standard colour name (e.g. skyblue)"
+test_all "$bandagepath --depcolhi" 1 "" "Bandage error: --depcolhi must be followed by a 6-digit hex colour (e.g. #FFB6C1), an 8-digit hex colour (e.g. #7FD2B48C) or a standard colour name (e.g. skyblue)"
+test_all "$bandagepath --depvallow" 1 "" "Bandage error: --depvallow must be followed by a number"
+test_all "$bandagepath --depvalhi" 1 "" "Bandage error: --depvalhi must be followed by a number"
+test_all "$bandagepath --query" 1 "" "Bandage error: A graph must be given (e.g. via Bandage load) to use the --query option"
+test_all "$bandagepath --blastp" 1 "" "Bandage error: --blastp must be followed by blastn/tblastn parameters"
+test_all "$bandagepath --alfilter" 1 "" "Bandage error: --alfilter must be followed by an integer"
+test_all "$bandagepath --qcfilter" 1 "" "Bandage error: --qcfilter must be followed by a number"
+test_all "$bandagepath --ifilter" 1 "" "Bandage error: --ifilter must be followed by a number"
+test_all "$bandagepath --evfilter" 1 "" "Bandage error: --evfilter must be followed by a number in scientific notation"
+test_all "$bandagepath --evfilter abc" 1 "" "Bandage error: --evfilter must be followed by a number in scientific notation"
+test_all "$bandagepath --evfilter 1" 1 "" "Bandage error: --evfilter must be followed by a number in scientific notation"
+test_all "$bandagepath --evfilter 1.0" 1 "" "Bandage error: --evfilter must be followed by a number in scientific notation"
+test_all "$bandagepath --evfilter e1" 1 "" "Bandage error: --evfilter must be followed by a number in scientific notation"
+test_all "$bandagepath --bsfilter" 1 "" "Bandage error: --bsfilter must be followed by a number"
+test_all "$bandagepath --pathnodes" 1 "" "Bandage error: --pathnodes must be followed by an integer"
+test_all "$bandagepath --minpatcov" 1 "" "Bandage error: --minpatcov must be followed by a number"
+test_all "$bandagepath --minhitcov" 1 "" "Bandage error: --minhitcov must be followed by a number"
+test_all "$bandagepath --minmeanid" 1 "" "Bandage error: --minmeanid must be followed by a number"
+test_all "$bandagepath --minpatlen" 1 "" "Bandage error: --minpatlen must be followed by a number"
+test_all "$bandagepath --maxpatlen" 1 "" "Bandage error: --maxpatlen must be followed by a number"
+test_all "$bandagepath --minlendis" 1 "" "Bandage error: --minlendis must be followed by an integer"
+test_all "$bandagepath --maxlendis" 1 "" "Bandage error: --maxlendis must be followed by an integer"
+test_all "$bandagepath --maxevprod" 1 "" "Bandage error: --maxevprod must be followed by a number in scientific notation"
+
+
+
+
+
+
+rmdir tmp
\ No newline at end of file
diff --git a/tests/bandagetests.cpp b/tests/bandagetests.cpp
new file mode 100644
index 0000000..388cd42
--- /dev/null
+++ b/tests/bandagetests.cpp
@@ -0,0 +1,1589 @@
+//Copyright 2015 Ryan Wick
+
+//This file is part of Bandage.
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include <QtTest/QtTest>
+#include <QDebug>
+#include "ogdf/basic/Graph.h"
+#include "ogdf/basic/GraphAttributes.h"
+#include "../graph/assemblygraph.h"
+#include "../program/settings.h"
+#include "../blast/blastsearch.h"
+#include "../ui/mygraphicsview.h"
+#include "../program/memory.h"
+#include "../graph/debruijnnode.h"
+#include "../graph/debruijnedge.h"
+#include "../program/globals.h"
+#include "../command_line/commoncommandlinefunctions.h"
+
+class BandageTests : public QObject
+{
+ Q_OBJECT
+
+private slots:
+ void loadFastg();
+ void loadLastGraph();
+ void loadTrinity();
+ void pathFunctionsOnLastGraph();
+ void pathFunctionsOnFastg();
+ void pathFunctionsOnGfaSequencesInGraph();
+ void pathFunctionsOnGfaSequencesInFasta();
+ void graphLocationFunctions();
+ void loadCsvData();
+ void loadCsvDataTrinity();
+ void blastSearch();
+ void blastSearchFilters();
+ void graphScope();
+ void commandLineSettings();
+ void sciNotComparisons();
+ void graphEdits();
+ void velvetToGfa();
+ void spadesToGfa();
+ void mergeNodesOnGfa();
+ void changeNodeNames();
+ void changeNodeDepths();
+ void blastQueryPaths();
+ void bandageInfo();
+
+
+private:
+ void createGlobals();
+ bool createBlastTempDirectory();
+ void deleteBlastTempDirectory();
+ QString getTestDirectory();
+ DeBruijnEdge * getEdgeFromNodeNames(QString startingNodeName,
+ QString endingNodeName);
+ bool doCircularSequencesMatch(QByteArray s1, QByteArray s2);
+};
+
+
+
+
+void BandageTests::loadFastg()
+{
+ createGlobals();
+ bool fastgGraphLoaded = g_assemblyGraph->loadGraphFromFile(getTestDirectory() + "test.fastg");
+
+ //Check that the graph loaded properly.
+ QCOMPARE(fastgGraphLoaded, true);
+
+ //Check that the appropriate number of nodes/edges are present.
+ QCOMPARE(g_assemblyGraph->m_deBruijnGraphNodes.size(), 88);
+ QCOMPARE(g_assemblyGraph->m_deBruijnGraphEdges.size(), 118);
+
+ //Check the length of a couple nodes.
+ DeBruijnNode * node1 = g_assemblyGraph->m_deBruijnGraphNodes["1+"];
+ DeBruijnNode * node28 = g_assemblyGraph->m_deBruijnGraphNodes["28-"];
+ QCOMPARE(node1->getLength(), 6070);
+ QCOMPARE(node28->getLength(), 79);
+}
+
+
+void BandageTests::loadLastGraph()
+{
+ createGlobals();
+ bool lastGraphLoaded = g_assemblyGraph->loadGraphFromFile(getTestDirectory() + "test.LastGraph");
+
+ //Check that the graph loaded properly.
+ QCOMPARE(lastGraphLoaded, true);
+
+ //Check that the appropriate number of nodes/edges are present.
+ QCOMPARE(g_assemblyGraph->m_deBruijnGraphNodes.size(), 34);
+ QCOMPARE(g_assemblyGraph->m_deBruijnGraphEdges.size(), 32);
+
+ //Check the length of a couple nodes.
+ DeBruijnNode * node1 = g_assemblyGraph->m_deBruijnGraphNodes["1+"];
+ DeBruijnNode * node14 = g_assemblyGraph->m_deBruijnGraphNodes["14-"];
+ QCOMPARE(node1->getLength(), 2000);
+ QCOMPARE(node14->getLength(), 60);
+}
+
+
+
+void BandageTests::loadTrinity()
+{
+ createGlobals();
+ bool trinityLoaded = g_assemblyGraph->loadGraphFromFile(getTestDirectory() + "test.Trinity.fasta");
+
+ //Check that the graph loaded properly.
+ QCOMPARE(trinityLoaded, true);
+
+ //Check that the appropriate number of nodes/edges are present.
+ QCOMPARE(g_assemblyGraph->m_deBruijnGraphNodes.size(), 1170);
+ QCOMPARE(g_assemblyGraph->m_deBruijnGraphEdges.size(), 1056);
+
+ //Check the length of a couple nodes.
+ DeBruijnNode * node10241 = g_assemblyGraph->m_deBruijnGraphNodes["4|c4_10241+"];
+ DeBruijnNode * node3901 = g_assemblyGraph->m_deBruijnGraphNodes["19|c0_3901-"];
+ QCOMPARE(node10241->getLength(), 1186);
+ QCOMPARE(node3901->getLength(), 1);
+}
+
+
+//LastGraph files have no overlap in the edges, so these tests look at paths
+//where the connections are simple.
+void BandageTests::pathFunctionsOnLastGraph()
+{
+ createGlobals();
+ g_assemblyGraph->loadGraphFromFile(getTestDirectory() + "test.LastGraph");
+
+ QString pathStringFailure;
+ Path testPath1 = Path::makeFromString("(1996) 9+, 13+ (5)", false, &pathStringFailure);
+ Path testPath2 = Path::makeFromString("(1996) 9+, 13+ (5)", false, &pathStringFailure);
+ Path testPath3 = Path::makeFromString("(1996) 9+, 13+ (6)", false, &pathStringFailure);
+ Path testPath4 = Path::makeFromString("9+, 13+, 14-", false, &pathStringFailure);
+
+ DeBruijnNode * node4Minus = g_assemblyGraph->m_deBruijnGraphNodes["4-"];
+ DeBruijnNode * node9Plus = g_assemblyGraph->m_deBruijnGraphNodes["9+"];
+ DeBruijnNode * node13Plus = g_assemblyGraph->m_deBruijnGraphNodes["13+"];
+ DeBruijnNode * node14Minus = g_assemblyGraph->m_deBruijnGraphNodes["14+"];
+ DeBruijnNode * node7Plus = g_assemblyGraph->m_deBruijnGraphNodes["7+"];
+
+ QCOMPARE(testPath1.getLength(), 10);
+ QCOMPARE(testPath1.getPathSequence(), QByteArray("GACCTATAGA"));
+ QCOMPARE(testPath1.isEmpty(), false);
+ QCOMPARE(testPath1.isCircular(), false);
+ QCOMPARE(testPath1 == testPath2, true);
+ QCOMPARE(testPath1 == testPath3, false);
+ QCOMPARE(testPath1.haveSameNodes(testPath3), true);
+ QCOMPARE(testPath1.hasNodeSubset(testPath4), true);
+ QCOMPARE(testPath4.hasNodeSubset(testPath1), false);
+ QCOMPARE(testPath1.getString(true), QString("(1996) 9+, 13+ (5)"));
+ QCOMPARE(testPath1.getString(false), QString("(1996)9+,13+(5)"));
+ QCOMPARE(testPath4.getString(true), QString("9+, 13+, 14-"));
+ QCOMPARE(testPath4.getString(false), QString("9+,13+,14-"));
+ QCOMPARE(testPath1.containsEntireNode(node13Plus), false);
+ QCOMPARE(testPath4.containsEntireNode(node13Plus), true);
+ QCOMPARE(testPath4.isInMiddleOfPath(node13Plus), true);
+ QCOMPARE(testPath4.isInMiddleOfPath(node14Minus), false);
+ QCOMPARE(testPath4.isInMiddleOfPath(node9Plus), false);
+
+ Path testPath4Extended;
+ QCOMPARE(testPath4.canNodeFitOnEnd(node7Plus, &testPath4Extended), true);
+ QCOMPARE(testPath4Extended.getString(true), QString("9+, 13+, 14-, 7+"));
+ QCOMPARE(testPath4.canNodeFitAtStart(node4Minus, &testPath4Extended), true);
+ QCOMPARE(testPath4Extended.getString(true), QString("4-, 9+, 13+, 14-"));
+}
+
+
+
+//FASTG files have overlaps in the edges, so these tests look at paths where
+//the overlap has to be removed from the path sequence.
+void BandageTests::pathFunctionsOnFastg()
+{
+ createGlobals();
+ g_assemblyGraph->loadGraphFromFile(getTestDirectory() + "test.fastg");
+
+ QString pathStringFailure;
+ Path testPath1 = Path::makeFromString("(50234) 6+, 26+, 23+, 26+, 24+ (200)", false, &pathStringFailure);
+ Path testPath2 = Path::makeFromString("26+, 23+", true, &pathStringFailure);
+ QCOMPARE(testPath1.getLength(), 1764);
+ QCOMPARE(testPath2.getLength(), 1387);
+ QCOMPARE(testPath1.isCircular(), false);
+ QCOMPARE(testPath2.isCircular(), true);
+}
+
+
+//This function tests paths on a GFA file which keeps its sequences in the GFA
+//file.
+void BandageTests::pathFunctionsOnGfaSequencesInGraph()
+{
+ createGlobals();
+ bool gfaLoaded = g_assemblyGraph->loadGraphFromFile(getTestDirectory() + "test_plasmids.gfa");
+ QCOMPARE(gfaLoaded, true);
+
+ //Check that the number of nodes/edges.
+ QCOMPARE(g_assemblyGraph->m_deBruijnGraphNodes.size(), 18);
+ QCOMPARE(g_assemblyGraph->m_deBruijnGraphEdges.size(), 24);
+
+ //Check a couple short paths.
+ QString pathStringFailure;
+
+ Path testPath1 = Path::makeFromString("232+, 277+", false, &pathStringFailure);
+ QByteArray testPath1Sequence = "CCTTATACGAAGCCCAGGTTAATCCTGGGCTTTTTGTTGAATCTGATCATTGGTAGCAAACAGATCAGGATTGGTAATTTTGATGTTTTCCTGACAACTCCTGCAAAGCATCAGCCCAGCAAAAAGTTGTACATGTTCCGTTGATTCACAGAAGGCACATGGCTTAGGAAAAGAGATGATATTGGCTGAATTGACTAATTCTGTTGACATAAGAAGTAACCTTGGATTGTACATATTTATTTTTAATAAATTTCAATACTTTATACCTAATTTAGCCACTAAAATTTGTACATTATTGTATAATCCATGTGTACATATTATTTTTTATAATTTTCATTCACTTAGACCCAAAATAGTATTTATTTTTGTACAACACCATGTACAGAACAATAATCATATAAATCAAATTTTTAGCATAAAAAAGTCCATTAATTTTGTACACAATTCTGAAACTTA [...]
+ Path testPath2 = Path::makeFromString("277-, 232-", false, &pathStringFailure);
+ QByteArray testPath2Sequence = "GCCCTTGGTTTTCGCTTCGCTCAAACTCTATTGAACTTCGCTTTCGCTCAGTTCGTCGGGGCAATTTTTTGGTTAATACTTGCGTGACTTTAAGAAAAAGCAAAAGCAACTCGGAATTCGCTTCGCTCATGAGCTTTTTTTCTCGCTACGCTCGGTCCAGGAGCAAATTTCTGCATGAAAATTAAGCTTTCTTAGGCTAAAGAGGGCAAAAAAATGTTTTTCAGAGAGTCTAGACGCAAATTTTGATAGTTCGCTCGTAGACACTCGCTCTATGCAGCTATCTAAAGTCAAAACATCTCTTTACTTCACTCTCTTTTGCGTTTTTTGAGCTGTTTTCTGTTTTTCGCTATAAGATCTATGTTTTTTAGATAAAGGCTCTTAAATCGCATTTGAATGCTTTCTGTGAAGCTTTTCATAATTAAAGTTTTAGGTTGAAATTTTTAACCTGGATGAATG [...]
+ QCOMPARE(testPath1.getPathSequence(), testPath1Sequence);
+ QCOMPARE(testPath2.getPathSequence(), testPath2Sequence);
+}
+
+
+//This function tests paths on a GFA file which keeps its sequences in a
+//separate FASTA file.
+void BandageTests::pathFunctionsOnGfaSequencesInFasta()
+{
+ createGlobals();
+ bool gfaLoaded = g_assemblyGraph->loadGraphFromFile(getTestDirectory() + "test_plasmids_separate_sequences.gfa");
+ QCOMPARE(gfaLoaded, true);
+
+ //Check that the number of nodes/edges.
+ QCOMPARE(g_assemblyGraph->m_deBruijnGraphNodes.size(), 18);
+ QCOMPARE(g_assemblyGraph->m_deBruijnGraphEdges.size(), 24);
+
+ //Since a node sequence hasn't be required yet, the nodes should still have
+ //just '*' for their sequence. But they should still report the correct
+ //length.
+ DeBruijnNode * node282Plus = g_assemblyGraph->m_deBruijnGraphNodes["282+"];
+ DeBruijnNode * node282Minus = g_assemblyGraph->m_deBruijnGraphNodes["282-"];
+ QCOMPARE(node282Plus->sequenceIsMissing(), true);
+ QCOMPARE(node282Minus->sequenceIsMissing(), true);
+ QCOMPARE(node282Plus->getLength(), 1819);
+ QCOMPARE(node282Minus->getLength(), 1819);
+
+ //Check a couple short paths.
+ QString pathStringFailure;
+ Path testPath1 = Path::makeFromString("232+, 277+", false, &pathStringFailure);
+ QByteArray testPath1Sequence = "CCTTATACGAAGCCCAGGTTAATCCTGGGCTTTTTGTTGAATCTGATCATTGGTAGCAAACAGATCAGGATTGGTAATTTTGATGTTTTCCTGACAACTCCTGCAAAGCATCAGCCCAGCAAAAAGTTGTACATGTTCCGTTGATTCACAGAAGGCACATGGCTTAGGAAAAGAGATGATATTGGCTGAATTGACTAATTCTGTTGACATAAGAAGTAACCTTGGATTGTACATATTTATTTTTAATAAATTTCAATACTTTATACCTAATTTAGCCACTAAAATTTGTACATTATTGTATAATCCATGTGTACATATTATTTTTTATAATTTTCATTCACTTAGACCCAAAATAGTATTTATTTTTGTACAACACCATGTACAGAACAATAATCATATAAATCAAATTTTTAGCATAAAAAAGTCCATTAATTTTGTACACAATTCTGAAACTTA [...]
+ Path testPath2 = Path::makeFromString("277-, 232-", false, &pathStringFailure);
+ QByteArray testPath2Sequence = "GCCCTTGGTTTTCGCTTCGCTCAAACTCTATTGAACTTCGCTTTCGCTCAGTTCGTCGGGGCAATTTTTTGGTTAATACTTGCGTGACTTTAAGAAAAAGCAAAAGCAACTCGGAATTCGCTTCGCTCATGAGCTTTTTTTCTCGCTACGCTCGGTCCAGGAGCAAATTTCTGCATGAAAATTAAGCTTTCTTAGGCTAAAGAGGGCAAAAAAATGTTTTTCAGAGAGTCTAGACGCAAATTTTGATAGTTCGCTCGTAGACACTCGCTCTATGCAGCTATCTAAAGTCAAAACATCTCTTTACTTCACTCTCTTTTGCGTTTTTTGAGCTGTTTTCTGTTTTTCGCTATAAGATCTATGTTTTTTAGATAAAGGCTCTTAAATCGCATTTGAATGCTTTCTGTGAAGCTTTTCATAATTAAAGTTTTAGGTTGAAATTTTTAACCTGGATGAATG [...]
+
+ //Check the paths sequences. Doing so will trigger the loading of node
+ //sequences from the FASTA file.
+ QCOMPARE(testPath1.getPathSequence(), testPath1Sequence);
+ QCOMPARE(testPath2.getPathSequence(), testPath2Sequence);
+
+ //Now that the paths have been accessed, the node sequences should be
+ //loaded (even the ones not in the path).
+ QCOMPARE(node282Plus->sequenceIsMissing(), false);
+ QCOMPARE(node282Minus->sequenceIsMissing(), false);
+ QCOMPARE(node282Plus->getLength(), 1819);
+ QCOMPARE(node282Minus->getLength(), 1819);
+}
+
+
+void BandageTests::graphLocationFunctions()
+{
+ //First do some tests with a FASTG, where the overlap results in a simpler
+ //sitations: all positions have a reverse complement position in the
+ //reverse complement node.
+ createGlobals();
+ g_assemblyGraph->loadGraphFromFile(getTestDirectory() + "test.fastg");
+ DeBruijnNode * node12Plus = g_assemblyGraph->m_deBruijnGraphNodes["12+"];
+ DeBruijnNode * node3Plus = g_assemblyGraph->m_deBruijnGraphNodes["3+"];
+
+ GraphLocation location1(node12Plus, 1);
+ GraphLocation revCompLocation1 = location1.reverseComplementLocation();
+
+ QCOMPARE(location1.getBase(), 'C');
+ QCOMPARE(revCompLocation1.getBase(), 'G');
+ QCOMPARE(revCompLocation1.getPosition(), 394);
+
+ GraphLocation location2 = GraphLocation::endOfNode(node3Plus);
+ QCOMPARE(location2.getPosition(), 5869);
+
+ location2.moveLocation(-1);
+ QCOMPARE(location2.getPosition(), 5868);
+
+ location2.moveLocation(2);
+ QCOMPARE(location2.getNode()->getName(), QString("38-"));
+ QCOMPARE(location2.getPosition(), 1);
+
+ GraphLocation location3;
+ QCOMPARE(location2.isNull(), false);
+ QCOMPARE(location3.isNull(), true);
+
+ //Now look at a LastGraph file which is more complex. Because of the
+ //offset, reverse complement positions can be in different nodes and may
+ //not even exist.
+ createGlobals();
+ g_assemblyGraph->loadGraphFromFile(getTestDirectory() + "test.LastGraph");
+ int kmer = g_assemblyGraph->m_kmer;
+ DeBruijnNode * node13Plus = g_assemblyGraph->m_deBruijnGraphNodes["13+"];
+ DeBruijnNode * node8Minus = g_assemblyGraph->m_deBruijnGraphNodes["8-"];
+
+ GraphLocation location4 = GraphLocation::startOfNode(node13Plus);
+ QCOMPARE(location4.getBase(), 'A');
+ QCOMPARE(location4.getPosition(), 1);
+
+ GraphLocation revCompLocation4 = location4.reverseComplementLocation();
+ QCOMPARE(revCompLocation4.getBase(), 'T');
+ QCOMPARE(revCompLocation4.getNode()->getName(), QString("13-"));
+ QCOMPARE(revCompLocation4.getPosition(), node13Plus->getLength() - kmer + 1);
+
+ GraphLocation location5 = GraphLocation::endOfNode(node8Minus);
+ GraphLocation location6 = location5;
+ location6.moveLocation(-60);
+ GraphLocation revCompLocation5 = location5.reverseComplementLocation();
+ GraphLocation revCompLocation6 = location6.reverseComplementLocation();
+ QCOMPARE(revCompLocation5.isNull(), true);
+ QCOMPARE(revCompLocation6.isNull(), false);
+ QCOMPARE(revCompLocation6.getNode()->getName(), QString("8+"));
+ QCOMPARE(revCompLocation6.getPosition(), 1);
+}
+
+
+
+void BandageTests::loadCsvData()
+{
+ createGlobals();
+ g_assemblyGraph->loadGraphFromFile(getTestDirectory() + "test.fastg");
+
+ QString errormsg;
+ QStringList columns;
+ bool coloursLoaded = false;
+ g_assemblyGraph->loadCSV(getTestDirectory() + "test.csv", &columns, &errormsg, &coloursLoaded);
+
+ DeBruijnNode * node6Plus = g_assemblyGraph->m_deBruijnGraphNodes["6+"];
+ DeBruijnNode * node6Minus = g_assemblyGraph->m_deBruijnGraphNodes["6-"];
+ DeBruijnNode * node7Plus = g_assemblyGraph->m_deBruijnGraphNodes["7+"];
+ DeBruijnNode * node4Plus = g_assemblyGraph->m_deBruijnGraphNodes["4+"];
+ DeBruijnNode * node4Minus = g_assemblyGraph->m_deBruijnGraphNodes["4-"];
+ DeBruijnNode * node3Plus = g_assemblyGraph->m_deBruijnGraphNodes["3+"];
+ DeBruijnNode * node5Minus = g_assemblyGraph->m_deBruijnGraphNodes["5-"];
+ DeBruijnNode * node8Plus = g_assemblyGraph->m_deBruijnGraphNodes["8+"];
+ DeBruijnNode * node9Plus = g_assemblyGraph->m_deBruijnGraphNodes["9+"];
+
+ QCOMPARE(columns.size(), 3);
+ QCOMPARE(errormsg, QString("There were 2 unmatched entries in the CSV."));
+
+ QCOMPARE(node6Plus->getCsvLine(0), QString("SIX_PLUS"));
+ QCOMPARE(node6Plus->getCsvLine(1), QString("6plus"));
+ QCOMPARE(node6Plus->getCsvLine(2), QString("plus6"));
+ QCOMPARE(node9Plus->getCsvLine(3), QString(""));
+ QCOMPARE(node9Plus->getCsvLine(25), QString(""));
+
+ QCOMPARE(node6Minus->getCsvLine(0), QString("SIX_MINUS"));
+ QCOMPARE(node6Minus->getCsvLine(1), QString("6minus"));
+ QCOMPARE(node6Minus->getCsvLine(2), QString("minus6"));
+
+ QCOMPARE(node7Plus->getCsvLine(0), QString("SEVEN_PLUS"));
+ QCOMPARE(node7Plus->getCsvLine(1), QString("7plus"));
+ QCOMPARE(node7Plus->getCsvLine(2), QString("plus7"));
+
+ QCOMPARE(node4Plus->getCsvLine(0), QString("FOUR_PLUS"));
+ QCOMPARE(node4Plus->getCsvLine(1), QString("4plus"));
+ QCOMPARE(node4Plus->getCsvLine(2), QString("plus4"));
+
+ QCOMPARE(node4Minus->getCsvLine(0), QString("FOUR_MINUS"));
+ QCOMPARE(node4Minus->getCsvLine(1), QString("4minus"));
+ QCOMPARE(node4Minus->getCsvLine(2), QString("minus4"));
+
+ QCOMPARE(node3Plus->getCsvLine(0), QString("THREE_PLUS"));
+ QCOMPARE(node3Plus->getCsvLine(1), QString("3plus"));
+ QCOMPARE(node3Plus->getCsvLine(2), QString("plus3"));
+
+ QCOMPARE(node5Minus->getCsvLine(0), QString("FIVE_MINUS"));
+ QCOMPARE(node5Minus->getCsvLine(1), QString(""));
+ QCOMPARE(node5Minus->getCsvLine(2), QString(""));
+
+ QCOMPARE(node8Plus->getCsvLine(0), QString("EIGHT_PLUS"));
+ QCOMPARE(node8Plus->getCsvLine(1), QString("8plus"));
+ QCOMPARE(node8Plus->getCsvLine(2), QString("plus8"));
+
+ QCOMPARE(node9Plus->getCsvLine(0), QString("NINE_PLUS"));
+ QCOMPARE(node9Plus->getCsvLine(1), QString("9plus"));
+ QCOMPARE(node9Plus->getCsvLine(2), QString("plus9"));
+ QCOMPARE(node9Plus->getCsvLine(3), QString(""));
+ QCOMPARE(node9Plus->getCsvLine(4), QString(""));
+ QCOMPARE(node9Plus->getCsvLine(5), QString(""));
+}
+
+
+void BandageTests::loadCsvDataTrinity()
+{
+ createGlobals();
+ g_assemblyGraph->loadGraphFromFile(getTestDirectory() + "test.Trinity.fasta");
+
+ QString errormsg;
+ QStringList columns;
+ bool coloursLoaded = false;
+ g_assemblyGraph->loadCSV(getTestDirectory() + "test.Trinity.csv", &columns, &errormsg, &coloursLoaded);
+
+ DeBruijnNode * node3912Plus = g_assemblyGraph->m_deBruijnGraphNodes["19|c0_3912+"];
+ DeBruijnNode * node3912Minus = g_assemblyGraph->m_deBruijnGraphNodes["19|c0_3912-"];
+ DeBruijnNode * node3914Plus = g_assemblyGraph->m_deBruijnGraphNodes["19|c0_3914+"];
+ DeBruijnNode * node3915Plus = g_assemblyGraph->m_deBruijnGraphNodes["19|c0_3915+"];
+ DeBruijnNode * node3923Plus = g_assemblyGraph->m_deBruijnGraphNodes["19|c0_3923+"];
+ DeBruijnNode * node3924Plus = g_assemblyGraph->m_deBruijnGraphNodes["19|c0_3924+"];
+ DeBruijnNode * node3940Plus = g_assemblyGraph->m_deBruijnGraphNodes["19|c0_3940+"];
+
+ QCOMPARE(columns.size(), 1);
+
+ QCOMPARE(node3912Plus->getCsvLine(0), QString("3912PLUS"));
+ QCOMPARE(node3912Minus->getCsvLine(0), QString("3912MINUS"));
+ QCOMPARE(node3914Plus->getCsvLine(0), QString("3914PLUS"));
+ QCOMPARE(node3915Plus->getCsvLine(0), QString("3915PLUS"));
+ QCOMPARE(node3923Plus->getCsvLine(0), QString("3923PLUS"));
+ QCOMPARE(node3924Plus->getCsvLine(0), QString("3924PLUS"));
+ QCOMPARE(node3940Plus->getCsvLine(0), QString("3940PLUS"));
+}
+
+void BandageTests::blastSearch()
+{
+ createGlobals();
+ g_assemblyGraph->loadGraphFromFile(getTestDirectory() + "test.fastg");
+ g_settings->blastQueryFilename = getTestDirectory() + "test_queries1.fasta";
+ createBlastTempDirectory();
+
+ g_blastSearch->doAutoBlastSearch();
+
+ BlastQuery * exact = g_blastSearch->m_blastQueries.getQueryFromName("test_query_exact");
+ BlastQuery * one_mismatch = g_blastSearch->m_blastQueries.getQueryFromName("test_query_one_mismatch");
+ BlastQuery * one_insertion = g_blastSearch->m_blastQueries.getQueryFromName("test_query_one_insertion");
+ BlastQuery * one_deletion = g_blastSearch->m_blastQueries.getQueryFromName("test_query_one_deletion");
+
+ QCOMPARE(exact->getLength(), 100);
+ QCOMPARE(one_mismatch->getLength(), 100);
+ QCOMPARE(one_insertion->getLength(), 101);
+ QCOMPARE(one_deletion->getLength(), 99);
+
+ QSharedPointer<BlastHit> exactHit = exact->getHits().at(0);
+ QSharedPointer<BlastHit> one_mismatchHit = one_mismatch->getHits().at(0);
+ QSharedPointer<BlastHit> one_insertionHit = one_insertion->getHits().at(0);
+ QSharedPointer<BlastHit> one_deletionHit = one_deletion->getHits().at(0);
+
+ QCOMPARE(exactHit->m_numberMismatches, 0);
+ QCOMPARE(exactHit->m_numberGapOpens, 0);
+ QCOMPARE(one_mismatchHit->m_numberMismatches, 1);
+ QCOMPARE(one_mismatchHit->m_numberGapOpens, 0);
+ QCOMPARE(one_insertionHit->m_numberMismatches, 0);
+ QCOMPARE(one_insertionHit->m_numberGapOpens, 1);
+ QCOMPARE(one_deletionHit->m_numberMismatches, 0);
+ QCOMPARE(one_deletionHit->m_numberGapOpens, 1);
+
+ QCOMPARE(exactHit->m_percentIdentity < 100.0, false);
+ QCOMPARE(one_mismatchHit->m_percentIdentity < 100.0, true);
+ QCOMPARE(one_insertionHit->m_percentIdentity < 100.0, true);
+ QCOMPARE(one_deletionHit->m_percentIdentity < 100.0, true);
+
+ deleteBlastTempDirectory();
+}
+
+
+
+void BandageTests::blastSearchFilters()
+{
+ createGlobals();
+ g_assemblyGraph->loadGraphFromFile(getTestDirectory() + "test.fastg");
+ g_settings->blastQueryFilename = getTestDirectory() + "test_queries2.fasta";
+ createBlastTempDirectory();
+
+ //First do the search with no filters
+ g_blastSearch->doAutoBlastSearch();
+ int unfilteredHitCount = g_blastSearch->m_allHits.size();
+
+ //Now filter by e-value.
+ g_settings->blastEValueFilter.on = true;
+ g_settings->blastEValueFilter = SciNot(1.0, -5);
+ g_blastSearch->doAutoBlastSearch();
+ QCOMPARE(g_blastSearch->m_allHits.size(), 14);
+ QCOMPARE(g_blastSearch->m_allHits.size() < unfilteredHitCount, true);
+
+ //Now add a bit score filter.
+ g_settings->blastBitScoreFilter.on = true;
+ g_settings->blastBitScoreFilter = 100.0;
+ g_blastSearch->doAutoBlastSearch();
+ QCOMPARE(g_blastSearch->m_allHits.size(), 9);
+
+ //Now add an alignment length filter.
+ g_settings->blastAlignmentLengthFilter.on = true;
+ g_settings->blastAlignmentLengthFilter = 100;
+ g_blastSearch->doAutoBlastSearch();
+ QCOMPARE(g_blastSearch->m_allHits.size(), 8);
+
+ //Now add an identity filter.
+ g_settings->blastIdentityFilter.on = true;
+ g_settings->blastIdentityFilter = 50.0;
+ g_blastSearch->doAutoBlastSearch();
+ QCOMPARE(g_blastSearch->m_allHits.size(), 7);
+
+ //Now add a query coverage filter.
+ g_settings->blastQueryCoverageFilter.on = true;
+ g_settings->blastQueryCoverageFilter = 90.0;
+ g_blastSearch->doAutoBlastSearch();
+ QCOMPARE(g_blastSearch->m_allHits.size(), 5);
+
+ deleteBlastTempDirectory();
+}
+
+
+
+void BandageTests::graphScope()
+{
+ createGlobals();
+ g_assemblyGraph->loadGraphFromFile(getTestDirectory() + "test.fastg");
+
+ QString errorTitle;
+ QString errorMessage;
+ int drawnNodes;
+ std::vector<DeBruijnNode *> startingNodes;
+
+ g_settings->graphScope = WHOLE_GRAPH;
+ g_settings->nodeDistance = 0;
+ g_settings->doubleMode = false;
+ startingNodes = g_assemblyGraph->getStartingNodes(&errorTitle, &errorMessage, g_settings->doubleMode, g_settings->startingNodes, "");
+ g_assemblyGraph->buildOgdfGraphFromNodesAndEdges(startingNodes, g_settings->nodeDistance);
+ g_assemblyGraph->layoutGraph();
+ drawnNodes = g_assemblyGraph->getDrawnNodeCount();
+ QCOMPARE(drawnNodes, 44);
+
+ g_settings->graphScope = WHOLE_GRAPH;
+ g_settings->nodeDistance = 0;
+ g_settings->doubleMode = true;
+ startingNodes = g_assemblyGraph->getStartingNodes(&errorTitle, &errorMessage, g_settings->doubleMode, g_settings->startingNodes, "");
+ g_assemblyGraph->buildOgdfGraphFromNodesAndEdges(startingNodes, g_settings->nodeDistance);
+ g_assemblyGraph->layoutGraph();
+ drawnNodes = g_assemblyGraph->getDrawnNodeCount();
+ QCOMPARE(drawnNodes, 88);
+
+ g_settings->graphScope = AROUND_NODE;
+ g_settings->startingNodes = "1";
+ g_settings->nodeDistance = 0;
+ g_settings->doubleMode = false;
+ startingNodes = g_assemblyGraph->getStartingNodes(&errorTitle, &errorMessage, g_settings->doubleMode, g_settings->startingNodes, "");
+ g_assemblyGraph->buildOgdfGraphFromNodesAndEdges(startingNodes, g_settings->nodeDistance);
+ g_assemblyGraph->layoutGraph();
+ drawnNodes = g_assemblyGraph->getDrawnNodeCount();
+ QCOMPARE(drawnNodes, 1);
+
+ g_settings->graphScope = AROUND_NODE;
+ g_settings->startingNodes = "1";
+ g_settings->nodeDistance = 0;
+ g_settings->doubleMode = true;
+ startingNodes = g_assemblyGraph->getStartingNodes(&errorTitle, &errorMessage, g_settings->doubleMode, g_settings->startingNodes, "");
+ g_assemblyGraph->buildOgdfGraphFromNodesAndEdges(startingNodes, g_settings->nodeDistance);
+ g_assemblyGraph->layoutGraph();
+ drawnNodes = g_assemblyGraph->getDrawnNodeCount();
+ QCOMPARE(drawnNodes, 2);
+
+ g_settings->graphScope = AROUND_NODE;
+ g_settings->startingNodes = "1+";
+ g_settings->nodeDistance = 0;
+ g_settings->doubleMode = true;
+ startingNodes = g_assemblyGraph->getStartingNodes(&errorTitle, &errorMessage, g_settings->doubleMode, g_settings->startingNodes, "");
+ g_assemblyGraph->buildOgdfGraphFromNodesAndEdges(startingNodes, g_settings->nodeDistance);
+ g_assemblyGraph->layoutGraph();
+ drawnNodes = g_assemblyGraph->getDrawnNodeCount();
+ QCOMPARE(drawnNodes, 1);
+
+ g_settings->graphScope = AROUND_NODE;
+ g_settings->startingNodes = "1";
+ g_settings->nodeDistance = 1;
+ g_settings->doubleMode = false;
+ startingNodes = g_assemblyGraph->getStartingNodes(&errorTitle, &errorMessage, g_settings->doubleMode, g_settings->startingNodes, "");
+ g_assemblyGraph->buildOgdfGraphFromNodesAndEdges(startingNodes, g_settings->nodeDistance);
+ g_assemblyGraph->layoutGraph();
+ drawnNodes = g_assemblyGraph->getDrawnNodeCount();
+ QCOMPARE(drawnNodes, 3);
+
+ g_settings->graphScope = AROUND_NODE;
+ g_settings->startingNodes = "1";
+ g_settings->nodeDistance = 2;
+ g_settings->doubleMode = false;
+ startingNodes = g_assemblyGraph->getStartingNodes(&errorTitle, &errorMessage, g_settings->doubleMode, g_settings->startingNodes, "");
+ g_assemblyGraph->buildOgdfGraphFromNodesAndEdges(startingNodes, g_settings->nodeDistance);
+ g_assemblyGraph->layoutGraph();
+ drawnNodes = g_assemblyGraph->getDrawnNodeCount();
+ QCOMPARE(drawnNodes, 10);
+
+ g_settings->graphScope = DEPTH_RANGE;
+ g_settings->nodeDistance = 0;
+ g_settings->doubleMode = false;
+ g_settings->minDepthRange = 0.0;
+ g_settings->maxDepthRange = 211.0;
+ startingNodes = g_assemblyGraph->getStartingNodes(&errorTitle, &errorMessage, g_settings->doubleMode, g_settings->startingNodes, "");
+ g_assemblyGraph->buildOgdfGraphFromNodesAndEdges(startingNodes, g_settings->nodeDistance);
+ g_assemblyGraph->layoutGraph();
+ drawnNodes = g_assemblyGraph->getDrawnNodeCount();
+ QCOMPARE(drawnNodes, 43);
+
+ g_settings->graphScope = DEPTH_RANGE;
+ g_settings->nodeDistance = 10;
+ g_settings->doubleMode = false;
+ g_settings->minDepthRange = 0.0;
+ g_settings->maxDepthRange = 211.0;
+ startingNodes = g_assemblyGraph->getStartingNodes(&errorTitle, &errorMessage, g_settings->doubleMode, g_settings->startingNodes, "");
+ g_assemblyGraph->buildOgdfGraphFromNodesAndEdges(startingNodes, g_settings->nodeDistance);
+ g_assemblyGraph->layoutGraph();
+ drawnNodes = g_assemblyGraph->getDrawnNodeCount();
+ QCOMPARE(drawnNodes, 43);
+
+ g_settings->graphScope = DEPTH_RANGE;
+ g_settings->nodeDistance = 0;
+ g_settings->doubleMode = false;
+ g_settings->minDepthRange = 211.0;
+ g_settings->maxDepthRange = 1000.0;
+ startingNodes = g_assemblyGraph->getStartingNodes(&errorTitle, &errorMessage, g_settings->doubleMode, g_settings->startingNodes, "");
+ g_assemblyGraph->buildOgdfGraphFromNodesAndEdges(startingNodes, g_settings->nodeDistance);
+ g_assemblyGraph->layoutGraph();
+ drawnNodes = g_assemblyGraph->getDrawnNodeCount();
+ QCOMPARE(drawnNodes, 1);
+
+ g_settings->graphScope = DEPTH_RANGE;
+ g_settings->nodeDistance = 0;
+ g_settings->doubleMode = false;
+ g_settings->minDepthRange = 40.0;
+ g_settings->maxDepthRange = 211.0;
+ startingNodes = g_assemblyGraph->getStartingNodes(&errorTitle, &errorMessage, g_settings->doubleMode, g_settings->startingNodes, "");
+ g_assemblyGraph->buildOgdfGraphFromNodesAndEdges(startingNodes, g_settings->nodeDistance);
+ g_assemblyGraph->layoutGraph();
+ drawnNodes = g_assemblyGraph->getDrawnNodeCount();
+ QCOMPARE(drawnNodes, 42);
+
+ createBlastTempDirectory();
+
+ g_settings->blastQueryFilename = getTestDirectory() + "test_queries1.fasta";
+ g_blastSearch->doAutoBlastSearch();
+
+ g_settings->graphScope = AROUND_BLAST_HITS;
+ g_settings->nodeDistance = 0;
+ g_settings->doubleMode = false;
+ startingNodes = g_assemblyGraph->getStartingNodes(&errorTitle, &errorMessage, g_settings->doubleMode, g_settings->startingNodes, "all");
+ g_assemblyGraph->buildOgdfGraphFromNodesAndEdges(startingNodes, g_settings->nodeDistance);
+ g_assemblyGraph->layoutGraph();
+ drawnNodes = g_assemblyGraph->getDrawnNodeCount();
+ QCOMPARE(drawnNodes, 1);
+
+ g_settings->graphScope = AROUND_BLAST_HITS;
+ g_settings->nodeDistance = 1;
+ g_settings->doubleMode = false;
+ startingNodes = g_assemblyGraph->getStartingNodes(&errorTitle, &errorMessage, g_settings->doubleMode, g_settings->startingNodes, "all");
+ g_assemblyGraph->buildOgdfGraphFromNodesAndEdges(startingNodes, g_settings->nodeDistance);
+ g_assemblyGraph->layoutGraph();
+ drawnNodes = g_assemblyGraph->getDrawnNodeCount();
+ QCOMPARE(drawnNodes, 3);
+
+ g_settings->graphScope = AROUND_BLAST_HITS;
+ g_settings->nodeDistance = 2;
+ g_settings->doubleMode = false;
+ startingNodes = g_assemblyGraph->getStartingNodes(&errorTitle, &errorMessage, g_settings->doubleMode, g_settings->startingNodes, "all");
+ g_assemblyGraph->buildOgdfGraphFromNodesAndEdges(startingNodes, g_settings->nodeDistance);
+ g_assemblyGraph->layoutGraph();
+ drawnNodes = g_assemblyGraph->getDrawnNodeCount();
+ QCOMPARE(drawnNodes, 9);
+
+ deleteBlastTempDirectory();
+}
+
+void BandageTests::commandLineSettings()
+{
+ createGlobals();
+ QStringList commandLineSettings;
+
+ commandLineSettings = QString("--scope entire").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->graphScope, WHOLE_GRAPH);
+
+ commandLineSettings = QString("--scope aroundnodes").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->graphScope, AROUND_NODE);
+
+ commandLineSettings = QString("--scope aroundblast").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->graphScope, AROUND_BLAST_HITS);
+
+ commandLineSettings = QString("--scope depthrange").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->graphScope, DEPTH_RANGE);
+
+ commandLineSettings = QString("--nodes 5+").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->startingNodes, QString("5+"));
+
+ commandLineSettings = QString("--nodes 1,2,3").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->startingNodes, QString("1,2,3"));
+
+ QCOMPARE(g_settings->startingNodesExactMatch, true);
+ commandLineSettings = QString("--partial").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->startingNodesExactMatch, false);
+
+ commandLineSettings = QString("--distance 12").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->nodeDistance.val, 12);
+
+ commandLineSettings = QString("--mindepth 1.2").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->minDepthRange.val, 1.2);
+
+ commandLineSettings = QString("--maxdepth 2.1").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->maxDepthRange.val, 2.1);
+
+ QCOMPARE(g_settings->doubleMode, false);
+ commandLineSettings = QString("--double").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->doubleMode, true);
+
+ QCOMPARE(g_settings->nodeLengthMode, AUTO_NODE_LENGTH);
+ commandLineSettings = QString("--nodelen 10000").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->nodeLengthMode, MANUAL_NODE_LENGTH);
+ QCOMPARE(g_settings->manualNodeLengthPerMegabase.val, 10000.0);
+
+ commandLineSettings = QString("--iter 1").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->graphLayoutQuality.val, 1);
+
+ commandLineSettings = QString("--nodewidth 4.2").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->averageNodeWidth.val, 4.2);
+
+ commandLineSettings = QString("--depwidth 0.222").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->depthEffectOnWidth.val, 0.222);
+
+ commandLineSettings = QString("--deppower 0.72").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->depthPower.val, 0.72);
+
+ QCOMPARE(g_settings->displayNodeNames, false);
+ commandLineSettings = QString("--names").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->displayNodeNames, true);
+
+ QCOMPARE(g_settings->displayNodeLengths, false);
+ commandLineSettings = QString("--lengths").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->displayNodeLengths, true);
+
+ QCOMPARE(g_settings->displayNodeDepth, false);
+ commandLineSettings = QString("--depth").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->displayNodeDepth, true);
+
+ QCOMPARE(g_settings->displayBlastHits, false);
+ commandLineSettings = QString("--blasthits").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->displayBlastHits, true);
+
+ commandLineSettings = QString("--fontsize 5").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->labelFont.pointSize(), 5);
+
+ commandLineSettings = QString("--edgecol #00ff00").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->edgeColour.name(), QString("#00ff00"));
+
+ commandLineSettings = QString("--edgewidth 5.5").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->edgeWidth.val, 5.5);
+
+ commandLineSettings = QString("--outcol #ff0000").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->outlineColour.name(), QString("#ff0000"));
+
+ commandLineSettings = QString("--outline 0.123").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->outlineThickness.val, 0.123);
+
+ commandLineSettings = QString("--selcol tomato").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->selectionColour.name(), QString("#ff6347"));
+
+ QCOMPARE(g_settings->antialiasing, true);
+ commandLineSettings = QString("--noaa").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->antialiasing, false);
+
+ commandLineSettings = QString("--textcol #550000ff").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->textColour.name(), QString("#0000ff"));
+ QCOMPARE(g_settings->textColour.alpha(), 85);
+
+ commandLineSettings = QString("--toutcol steelblue").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(getColourName(g_settings->textOutlineColour), QString("steelblue"));
+
+ commandLineSettings = QString("--toutline 0.321").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->textOutlineThickness.val, 0.321);
+
+ QCOMPARE(g_settings->positionTextNodeCentre, false);
+ commandLineSettings = QString("--centre").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->positionTextNodeCentre, true);
+
+ commandLineSettings = QString("--colour random").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->nodeColourScheme, RANDOM_COLOURS);
+
+ commandLineSettings = QString("--colour uniform").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->nodeColourScheme, UNIFORM_COLOURS);
+
+ commandLineSettings = QString("--colour depth").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->nodeColourScheme, DEPTH_COLOUR);
+
+ commandLineSettings = QString("--colour blastsolid").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->nodeColourScheme, BLAST_HITS_SOLID_COLOUR);
+
+ commandLineSettings = QString("--colour blastrainbow").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->nodeColourScheme, BLAST_HITS_RAINBOW_COLOUR);
+
+ commandLineSettings = QString("--ransatpos 12").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->randomColourPositiveSaturation.val, 12);
+
+ commandLineSettings = QString("--ransatneg 23").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->randomColourNegativeSaturation.val, 23);
+
+ commandLineSettings = QString("--ranligpos 34").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->randomColourPositiveLightness.val, 34);
+
+ commandLineSettings = QString("--ranligneg 45").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->randomColourNegativeLightness.val, 45);
+
+ commandLineSettings = QString("--ranopapos 56").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->randomColourPositiveOpacity.val, 56);
+
+ commandLineSettings = QString("--ranopaneg 67").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->randomColourNegativeOpacity.val, 67);
+
+ commandLineSettings = QString("--unicolpos springgreen").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(getColourName(g_settings->uniformPositiveNodeColour), QString("springgreen"));
+
+ commandLineSettings = QString("--unicolneg teal").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(getColourName(g_settings->uniformNegativeNodeColour), QString("teal"));
+
+ commandLineSettings = QString("--unicolspe papayawhip").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(getColourName(g_settings->uniformNodeSpecialColour), QString("papayawhip"));
+
+ commandLineSettings = QString("--depcollow mediumorchid").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(getColourName(g_settings->lowDepthColour), QString("mediumorchid"));
+
+ commandLineSettings = QString("--depcolhi linen").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(getColourName(g_settings->highDepthColour), QString("linen"));
+
+ QCOMPARE(g_settings->autoDepthValue, true);
+ commandLineSettings = QString("--depvallow 56.7").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->lowDepthValue.val, 56.7);
+ QCOMPARE(g_settings->autoDepthValue, false);
+
+ commandLineSettings = QString("--depvalhi 67.8").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->highDepthValue.val, 67.8);
+
+ commandLineSettings = QString("--depvalhi 67.8").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->highDepthValue.val, 67.8);
+
+ commandLineSettings = QString("--query queries.fasta").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->blastQueryFilename, QString("queries.fasta"));
+
+ commandLineSettings = QString("--blastp --abc").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->blastSearchParameters, QString("--abc"));
+
+ QCOMPARE(g_settings->blastAlignmentLengthFilter.on, false);
+ commandLineSettings = QString("--alfilter 543").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->blastAlignmentLengthFilter.on, true);
+ QCOMPARE(g_settings->blastAlignmentLengthFilter.val, 543);
+
+ QCOMPARE(g_settings->blastQueryCoverageFilter.on, false);
+ commandLineSettings = QString("--qcfilter 67.8").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->blastQueryCoverageFilter.on, true);
+ QCOMPARE(g_settings->blastQueryCoverageFilter.val, 67.8);
+
+ QCOMPARE(g_settings->blastIdentityFilter.on, false);
+ commandLineSettings = QString("--ifilter 12.3").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->blastIdentityFilter.on, true);
+ QCOMPARE(g_settings->blastIdentityFilter.val, 12.3);
+
+ QCOMPARE(g_settings->blastEValueFilter.on, false);
+ commandLineSettings = QString("--evfilter 8.5e-14").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->blastEValueFilter.on, true);
+ QCOMPARE(g_settings->blastEValueFilter.val, SciNot(8.5, -14));
+ QCOMPARE(g_settings->blastEValueFilter.val.getCoefficient(), 8.5);
+ QCOMPARE(g_settings->blastEValueFilter.val.getExponent(), -14);
+
+ QCOMPARE(g_settings->blastBitScoreFilter.on, false);
+ commandLineSettings = QString("--bsfilter 1234.5").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->blastBitScoreFilter.on, true);
+ QCOMPARE(g_settings->blastBitScoreFilter.val, 1234.5);
+
+ commandLineSettings = QString("--pathnodes 3").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->maxQueryPathNodes.val, 3);
+
+ commandLineSettings = QString("--minpatcov 0.543").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->minQueryCoveredByPath.val, 0.543);
+
+ commandLineSettings = QString("--minhitcov 0.654").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->minQueryCoveredByHits.val, 0.654);
+ QCOMPARE(g_settings->minQueryCoveredByHits.on, true);
+
+ commandLineSettings = QString("--minhitcov off").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->minQueryCoveredByHits.on, false);
+
+ commandLineSettings = QString("--minmeanid 0.765").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->minMeanHitIdentity.val, 0.765);
+ QCOMPARE(g_settings->minMeanHitIdentity.on, true);
+
+ commandLineSettings = QString("--minmeanid off").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->minMeanHitIdentity.on, false);
+
+ commandLineSettings = QString("--minpatlen 0.97").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->minLengthPercentage.val, 0.97);
+ QCOMPARE(g_settings->minLengthPercentage.on, true);
+
+ commandLineSettings = QString("--minpatlen off").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->minLengthPercentage.on, false);
+
+ commandLineSettings = QString("--maxpatlen 1.03").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->maxLengthPercentage.val, 1.03);
+ QCOMPARE(g_settings->maxLengthPercentage.on, true);
+
+ commandLineSettings = QString("--maxpatlen off").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->maxLengthPercentage.on, false);
+
+ commandLineSettings = QString("--minlendis -1234").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->minLengthBaseDiscrepancy.val, -1234);
+ QCOMPARE(g_settings->minLengthBaseDiscrepancy.on, true);
+
+ commandLineSettings = QString("--minlendis off").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->minLengthBaseDiscrepancy.on, false);
+
+ commandLineSettings = QString("--maxlendis 4321").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->maxLengthBaseDiscrepancy.val, 4321);
+ QCOMPARE(g_settings->maxLengthBaseDiscrepancy.on, true);
+
+ commandLineSettings = QString("--maxlendis off").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->maxLengthBaseDiscrepancy.on, false);
+
+ commandLineSettings = QString("--maxevprod 4e-500").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->maxEValueProduct.val.getCoefficient(), 4.0);
+ QCOMPARE(g_settings->maxEValueProduct.val.getExponent(), -500);
+ QCOMPARE(g_settings->maxEValueProduct.on, true);
+
+ commandLineSettings = QString("--maxevprod off").split(" ");
+ parseSettings(commandLineSettings);
+ QCOMPARE(g_settings->maxEValueProduct.on, false);
+}
+
+
+void BandageTests::sciNotComparisons()
+{
+ SciNot sn01(1.0, 10);
+ SciNot sn02(10.0, 9);
+ SciNot sn03(0.1, 11);
+ SciNot sn04(5.0, 10);
+ SciNot sn05(-5.0, 15);
+ SciNot sn06(-6.0, 15);
+ SciNot sn07(-3.0, 3);
+ SciNot sn08(-0.3, 4);
+ SciNot sn09(-3.0, -3);
+ SciNot sn10(-0.3, -2);
+ SciNot sn11(1.4, 2);
+ SciNot sn12("1.4e2");
+ SciNot sn13("140");
+
+ QCOMPARE(sn01 == sn02, true);
+ QCOMPARE(sn01 == sn03, true);
+ QCOMPARE(sn01 == sn03, true);
+ QCOMPARE(sn01 >= sn03, true);
+ QCOMPARE(sn01 <= sn03, true);
+ QCOMPARE(sn01 != sn03, false);
+ QCOMPARE(sn01 < sn04, true);
+ QCOMPARE(sn01 <= sn04, true);
+ QCOMPARE(sn01 > sn04, false);
+ QCOMPARE(sn01 >= sn04, false);
+ QCOMPARE(sn04 > sn05, true);
+ QCOMPARE(sn04 < sn05, false);
+ QCOMPARE(sn06 < sn05, true);
+ QCOMPARE(sn06 <= sn05, true);
+ QCOMPARE(sn06 > sn05, false);
+ QCOMPARE(sn06 >= sn05, false);
+ QCOMPARE(sn07 == sn08, true);
+ QCOMPARE(sn07 != sn08, false);
+ QCOMPARE(sn09 == sn10, true);
+ QCOMPARE(sn09 != sn10, false);
+ QCOMPARE(sn11 == sn12, true);
+ QCOMPARE(sn11 == sn13, true);
+ QCOMPARE(sn01.asString(true), QString("1e10"));
+ QCOMPARE(sn01.asString(false), QString("1e10"));
+ QCOMPARE(sn11.asString(true), QString("1.4e2"));
+ QCOMPARE(sn11.asString(false), QString("140"));
+}
+
+
+void BandageTests::graphEdits()
+{
+ createGlobals();
+ g_assemblyGraph->loadGraphFromFile(getTestDirectory() + "test.fastg");
+
+ QCOMPARE(g_assemblyGraph->m_deBruijnGraphNodes.size(), 88);
+ QCOMPARE(int(g_assemblyGraph->m_deBruijnGraphEdges.size()), 118);
+
+ //Get the path sequence now to compare to the merged node sequence at the
+ //end.
+ QString pathStringFailure;
+ Path path = Path::makeFromString("6+, 26+, 23+, 26+, 24+", false, &pathStringFailure);
+ QByteArray pathSequence = path.getPathSequence();
+
+ g_assemblyGraph->duplicateNodePair(g_assemblyGraph->m_deBruijnGraphNodes["26+"], 0);
+
+ QCOMPARE(g_assemblyGraph->m_deBruijnGraphNodes.size(), 90);
+ QCOMPARE(int(g_assemblyGraph->m_deBruijnGraphEdges.size()), 126);
+
+ std::vector<DeBruijnEdge *> edgesToRemove;
+ edgesToRemove.push_back(getEdgeFromNodeNames("26_copy+", "24+"));
+ edgesToRemove.push_back(getEdgeFromNodeNames("6+", "26+"));
+ edgesToRemove.push_back(getEdgeFromNodeNames("26+", "23+"));
+ edgesToRemove.push_back(getEdgeFromNodeNames("23+", "26_copy+"));
+ g_assemblyGraph->deleteEdges(&edgesToRemove);
+
+ QCOMPARE(g_assemblyGraph->m_deBruijnGraphNodes.size(), 90);
+ QCOMPARE(int(g_assemblyGraph->m_deBruijnGraphEdges.size()), 118);
+
+ g_assemblyGraph->mergeAllPossible();
+
+ QCOMPARE(g_assemblyGraph->m_deBruijnGraphNodes.size(), 82);
+ QCOMPARE(int(g_assemblyGraph->m_deBruijnGraphEdges.size()), 110);
+
+ DeBruijnNode * mergedNode = g_assemblyGraph->m_deBruijnGraphNodes["6_26_copy_23_26_24+"];
+ QCOMPARE(pathSequence, mergedNode->getSequence());
+}
+
+
+//Saving a Velvet graph to GFA is a bit complex because the node sequence offset
+//must be filled in. This function tests aspects of that process.
+void BandageTests::velvetToGfa()
+{
+ //First load the graph as a LastGraph and pull out some information and a
+ //circular path sequence.
+ createGlobals();
+ g_assemblyGraph->loadGraphFromFile(getTestDirectory() + "big_test.LastGraph");
+
+ int lastGraphNodeCount = g_assemblyGraph->m_nodeCount;
+ int lastGraphEdgeCount= g_assemblyGraph->m_edgeCount;
+ long long lastGraphTotalLength = g_assemblyGraph->m_totalLength;
+ long long lastGraphShortestContig = g_assemblyGraph->m_shortestContig;
+ long long lastGraphLongestContig = g_assemblyGraph->m_longestContig;
+
+ QString pathStringFailure;
+ Path lastGraphTestPath1 = Path::makeFromString("3176-, 3176+, 4125+, 3178-, 3283+, 3180+, 3177-", true, &pathStringFailure);
+ Path lastGraphTestPath2 = Path::makeFromString("3368+, 3369+, 3230+, 3231+, 3370-, 3143+, 3144+, 3145+, 3240+, 3241+, 3788-, 3787-, 3231+, 3252+, 3241-, 3240-, 3145-, 4164-, 4220+, 3368-, 3367+", true, &pathStringFailure);
+ QByteArray lastGraphTestPath1Sequence = lastGraphTestPath1.getPathSequence();
+ QByteArray lastGraphTestPath2Sequence = lastGraphTestPath2.getPathSequence();
+
+ //Now save the graph as a GFA and reload it and grab the same information.
+ g_assemblyGraph->saveEntireGraphToGfa(getTestDirectory() + "big_test_temp.gfa");
+ createGlobals();
+ g_assemblyGraph->loadGraphFromFile(getTestDirectory() + "big_test_temp.gfa");
+
+ int gfaNodeCount = g_assemblyGraph->m_nodeCount;
+ int gfaEdgeCount= g_assemblyGraph->m_edgeCount;
+ long long gfaTotalLength = g_assemblyGraph->m_totalLength;
+ long long gfaShortestContig = g_assemblyGraph->m_shortestContig;
+ long long gfaLongestContig = g_assemblyGraph->m_longestContig;
+
+ Path gfaTestPath1 = Path::makeFromString("3176-, 3176+, 4125+, 3178-, 3283+, 3180+, 3177-", true, &pathStringFailure);
+ Path gfaTestPath2 = Path::makeFromString("3368+, 3369+, 3230+, 3231+, 3370-, 3143+, 3144+, 3145+, 3240+, 3241+, 3788-, 3787-, 3231+, 3252+, 3241-, 3240-, 3145-, 4164-, 4220+, 3368-, 3367+", true, &pathStringFailure);
+ QByteArray gfaTestPath1Sequence = gfaTestPath1.getPathSequence();
+ QByteArray gfaTestPath2Sequence = gfaTestPath2.getPathSequence();
+
+ //Now we compare the LastGraph info to the GFA info to make sure they are
+ //the same (or appropriately different). The k-mer size for this graph is
+ //51, so we expect each node to get 50 base pairs longer.
+ QCOMPARE(lastGraphNodeCount, gfaNodeCount);
+ QCOMPARE(lastGraphEdgeCount, gfaEdgeCount);
+ QCOMPARE(lastGraphTotalLength + 50 * lastGraphNodeCount, gfaTotalLength);
+ QCOMPARE(lastGraphShortestContig + 50, gfaShortestContig);
+ QCOMPARE(lastGraphLongestContig + 50, gfaLongestContig);
+ QCOMPARE(lastGraphTestPath1Sequence, gfaTestPath1Sequence);
+ QCOMPARE(lastGraphTestPath2Sequence, gfaTestPath2Sequence);
+
+ //Finally, delete the gfa file.
+ QFile::remove(getTestDirectory() + "big_test_temp.gfa");
+}
+
+
+void BandageTests::spadesToGfa()
+{
+ //First load the graph as a FASTG and pull out some information and a
+ //path sequence.
+ createGlobals();
+ g_assemblyGraph->loadGraphFromFile(getTestDirectory() + "test.fastg");
+
+ int fastgNodeCount = g_assemblyGraph->m_nodeCount;
+ int fastgEdgeCount= g_assemblyGraph->m_edgeCount;
+ long long fastgTotalLength = g_assemblyGraph->m_totalLength;
+ long long fastgShortestContig = g_assemblyGraph->m_shortestContig;
+ long long fastgLongestContig = g_assemblyGraph->m_longestContig;
+
+ QString pathStringFailure;
+ Path fastgTestPath1 = Path::makeFromString("24+, 14+, 39-, 43-, 42-, 2-, 4+, 33+, 35-, 31-, 44-, 27+, 9-, 28-, 44+, 31+, 36+", false, &pathStringFailure);
+ Path fastgTestPath2 = Path::makeFromString("16+, 7+, 13+, 37+, 41-, 40-, 42+, 43+, 39+, 14-, 22-, 20+, 7-, 25-, 32-, 38+, 3-", false, &pathStringFailure);
+ QByteArray fastgTestPath1Sequence = fastgTestPath1.getPathSequence();
+ QByteArray fastgTestPath2Sequence = fastgTestPath2.getPathSequence();
+
+ //Now save the graph as a GFA and reload it and grab the same information.
+ g_assemblyGraph->saveEntireGraphToGfa(getTestDirectory() + "test_temp.gfa");
+ createGlobals();
+ g_assemblyGraph->loadGraphFromFile(getTestDirectory() + "test_temp.gfa");
+
+ int gfaNodeCount = g_assemblyGraph->m_nodeCount;
+ int gfaEdgeCount= g_assemblyGraph->m_edgeCount;
+ long long gfaTotalLength = g_assemblyGraph->m_totalLength;
+ long long gfaShortestContig = g_assemblyGraph->m_shortestContig;
+ long long gfaLongestContig = g_assemblyGraph->m_longestContig;
+
+ Path gfaTestPath1 = Path::makeFromString("24+, 14+, 39-, 43-, 42-, 2-, 4+, 33+, 35-, 31-, 44-, 27+, 9-, 28-, 44+, 31+, 36+", false, &pathStringFailure);
+ Path gfaTestPath2 = Path::makeFromString("16+, 7+, 13+, 37+, 41-, 40-, 42+, 43+, 39+, 14-, 22-, 20+, 7-, 25-, 32-, 38+, 3-", false, &pathStringFailure);
+ QByteArray gfaTestPath1Sequence = gfaTestPath1.getPathSequence();
+ QByteArray gfaTestPath2Sequence = gfaTestPath2.getPathSequence();
+
+ //Now we compare the LastGraph info to the GFA info to make sure they are
+ //the same (or appropriately different). The k-mer size for this graph is
+ //51, so we expect each node to get 50 base pairs longer.
+ QCOMPARE(fastgNodeCount, gfaNodeCount);
+ QCOMPARE(fastgEdgeCount, gfaEdgeCount);
+ QCOMPARE(fastgTotalLength, gfaTotalLength);
+ QCOMPARE(fastgShortestContig, gfaShortestContig);
+ QCOMPARE(fastgLongestContig, gfaLongestContig);
+ QCOMPARE(fastgTestPath1Sequence, gfaTestPath1Sequence);
+ QCOMPARE(fastgTestPath2Sequence, gfaTestPath2Sequence);
+
+ //Finally, delete the gfa file.
+ QFile::remove(getTestDirectory() + "test_temp.gfa");
+}
+
+
+void BandageTests::mergeNodesOnGfa()
+{
+ createGlobals();
+ g_assemblyGraph->loadGraphFromFile(getTestDirectory() + "test_plasmids.gfa");
+
+ DeBruijnNode * node6Plus = g_assemblyGraph->m_deBruijnGraphNodes["6+"];
+ DeBruijnNode * node280Plus = g_assemblyGraph->m_deBruijnGraphNodes["280+"];
+ DeBruijnNode * node232Minus = g_assemblyGraph->m_deBruijnGraphNodes["232-"];
+ DeBruijnNode * node333Plus = g_assemblyGraph->m_deBruijnGraphNodes["333+"];
+ DeBruijnNode * node289Plus = g_assemblyGraph->m_deBruijnGraphNodes["289+"];
+ DeBruijnNode * node283Plus = g_assemblyGraph->m_deBruijnGraphNodes["283+"];
+ DeBruijnNode * node277Plus = g_assemblyGraph->m_deBruijnGraphNodes["277+"];
+ DeBruijnNode * node297Plus = g_assemblyGraph->m_deBruijnGraphNodes["297+"];
+ DeBruijnNode * node282Plus = g_assemblyGraph->m_deBruijnGraphNodes["282+"];
+
+ //Create a path before merging the nodes.
+ QString pathStringFailure;
+ Path testPath1 = Path::makeFromString("6+, 280+, 232-, 333+, 289+, 283+", true, &pathStringFailure);
+ QByteArray path1Sequence = testPath1.getPathSequence();
+
+ int path1Length = testPath1.getLength();
+ int nodeTotalLength = node6Plus->getLength() + node280Plus->getLength() + node232Minus->getLength() +
+ node333Plus->getLength() + node289Plus->getLength() + node283Plus->getLength();
+
+ //The k-mer size in this test is 81, so the path should remove all of those overlaps.
+ QCOMPARE(path1Length, nodeTotalLength - 6 * 81);
+
+ //Now remove excess nodes.
+ std::vector<DeBruijnNode*> nodesToDelete;
+ nodesToDelete.push_back(node277Plus);
+ nodesToDelete.push_back(node297Plus);
+ nodesToDelete.push_back(node282Plus);
+ g_assemblyGraph->deleteNodes(&nodesToDelete);
+
+ //There should now be six nodes in the graph (plus complements).
+ QCOMPARE(12, g_assemblyGraph->m_deBruijnGraphNodes.size());
+
+ //After a merge, there should be only one node (and its complement).
+ g_assemblyGraph->mergeAllPossible();
+ QCOMPARE(2, g_assemblyGraph->m_deBruijnGraphNodes.size());
+
+ //That last node should have a length of its six constituent nodes, minus
+ //the overlaps.
+ DeBruijnNode * lastNode = g_assemblyGraph->m_deBruijnGraphNodes.first();
+ QCOMPARE(lastNode->getLength(), nodeTotalLength - 5 * 81);
+
+ //If we make a circular path with this node, its length should be equal to
+ //the length of the path made before.
+ Path testPath2 = Path::makeFromString(lastNode->getName(), true, &pathStringFailure);
+ QCOMPARE(path1Length, testPath2.getLength());
+
+ //The sequence of this second path should also match the sequence of the
+ //first path.
+ QByteArray path2Sequence = testPath2.getPathSequence();
+ QCOMPARE(doCircularSequencesMatch(path1Sequence, path2Sequence), true);
+}
+
+
+
+void BandageTests::changeNodeNames()
+{
+ createGlobals();
+ g_assemblyGraph->loadGraphFromFile(getTestDirectory() + "test.fastg");
+
+ DeBruijnNode * node6Plus = g_assemblyGraph->m_deBruijnGraphNodes["6+"];
+ DeBruijnNode * node6Minus = g_assemblyGraph->m_deBruijnGraphNodes["6-"];
+ int nodeCountBefore = g_assemblyGraph->m_deBruijnGraphNodes.size();
+
+ g_assemblyGraph->changeNodeName("6", "12345");
+
+ DeBruijnNode * node12345Plus = g_assemblyGraph->m_deBruijnGraphNodes["12345+"];
+ DeBruijnNode * node12345Minus = g_assemblyGraph->m_deBruijnGraphNodes["12345-"];
+ int nodeCountAfter = g_assemblyGraph->m_deBruijnGraphNodes.size();
+
+ QCOMPARE(node6Plus, node12345Plus);
+ QCOMPARE(node6Minus, node12345Minus);
+ QCOMPARE(nodeCountBefore, nodeCountAfter);
+}
+
+void BandageTests::changeNodeDepths()
+{
+ createGlobals();
+ g_assemblyGraph->loadGraphFromFile(getTestDirectory() + "test.fastg");
+
+ DeBruijnNode * node6Plus = g_assemblyGraph->m_deBruijnGraphNodes["6+"];
+ DeBruijnNode * node6Minus = g_assemblyGraph->m_deBruijnGraphNodes["6-"];
+ DeBruijnNode * node7Plus = g_assemblyGraph->m_deBruijnGraphNodes["7+"];
+ DeBruijnNode * node7Minus = g_assemblyGraph->m_deBruijnGraphNodes["7-"];
+
+ std::vector<DeBruijnNode *> nodes;
+ nodes.push_back(node6Plus);
+ nodes.push_back(node7Plus);
+
+ //Complementary pairs should have the same depth.
+ QCOMPARE(node6Plus->getDepth(), node6Minus->getDepth());
+ QCOMPARE(node7Plus->getDepth(), node7Minus->getDepth());
+
+ g_assemblyGraph->changeNodeDepth(&nodes, 0.5);
+
+ //Check to make sure the change worked.
+ QCOMPARE(0.5, node6Plus->getDepth());
+ QCOMPARE(0.5, node6Minus->getDepth());
+ QCOMPARE(0.5, node7Plus->getDepth());
+ QCOMPARE(0.5, node7Minus->getDepth());
+}
+
+void BandageTests::blastQueryPaths()
+{
+ createGlobals();
+ g_assemblyGraph->loadGraphFromFile(getTestDirectory() + "test_query_paths.gfa");
+
+ Settings defaultSettings;
+ g_settings->blastQueryFilename = getTestDirectory() + "test_query_paths.fasta";
+ defaultSettings.blastQueryFilename = getTestDirectory() + "test_query_paths.fasta";
+
+ createBlastTempDirectory();
+
+ //Now filter by e-value to get only strong hits and do the BLAST search.
+ g_settings->blastEValueFilter.on = true;
+ g_settings->blastEValueFilter = SciNot(1.0, -5);
+
+ QList<BlastQueryPath> query1Paths;
+ QList<BlastQueryPath> query2Paths;
+ QList<BlastQueryPath> query3Paths;
+ QList<BlastQueryPath> query4Paths;
+ QList<BlastQueryPath> query5Paths;
+ QList<BlastQueryPath> query6Paths;
+ QList<BlastQueryPath> query7Paths;
+
+ //With the default settings, queries 1 to 5 should each have one path and
+ //queries 6 and 7 should have 0 (because of their large inserts).
+ g_blastSearch->doAutoBlastSearch();
+ query1Paths = g_blastSearch->m_blastQueries.m_queries[0]->getPaths();
+ query2Paths = g_blastSearch->m_blastQueries.m_queries[1]->getPaths();
+ query3Paths = g_blastSearch->m_blastQueries.m_queries[2]->getPaths();
+ query4Paths = g_blastSearch->m_blastQueries.m_queries[3]->getPaths();
+ query5Paths = g_blastSearch->m_blastQueries.m_queries[4]->getPaths();
+ query6Paths = g_blastSearch->m_blastQueries.m_queries[5]->getPaths();
+ query7Paths = g_blastSearch->m_blastQueries.m_queries[6]->getPaths();
+ QCOMPARE(query1Paths.size(), 1);
+ QCOMPARE(query2Paths.size(), 1);
+ QCOMPARE(query3Paths.size(), 1);
+ QCOMPARE(query4Paths.size(), 1);
+ QCOMPARE(query5Paths.size(), 1);
+ QCOMPARE(query6Paths.size(), 0);
+ QCOMPARE(query7Paths.size(), 0);
+
+ //query2 has a mean hit identity of 0.98.
+ g_settings->minMeanHitIdentity.on = true;
+ g_settings->minMeanHitIdentity = 0.979;
+ g_blastSearch->doAutoBlastSearch();
+ query2Paths = g_blastSearch->m_blastQueries.m_queries[1]->getPaths();
+ QCOMPARE(query2Paths.size(), 1);
+ g_settings->minMeanHitIdentity = 0.981;
+ g_blastSearch->doAutoBlastSearch();
+ query2Paths = g_blastSearch->m_blastQueries.m_queries[1]->getPaths();
+ QCOMPARE(query2Paths.size(), 0);
+
+ //Turning the filter off should make the path return.
+ g_settings->minMeanHitIdentity.on = false;
+ g_blastSearch->doAutoBlastSearch();
+ query2Paths = g_blastSearch->m_blastQueries.m_queries[1]->getPaths();
+ QCOMPARE(query2Paths.size(), 1);
+ *g_settings = defaultSettings;
+
+ //query3 has a length discrepancy of -20.
+ g_settings->minLengthBaseDiscrepancy.on = true;
+ g_settings->minLengthBaseDiscrepancy = -20;
+ g_blastSearch->doAutoBlastSearch();
+ query3Paths = g_blastSearch->m_blastQueries.m_queries[2]->getPaths();
+ QCOMPARE(query3Paths.size(), 1);
+ g_settings->minLengthBaseDiscrepancy = -19;
+ g_blastSearch->doAutoBlastSearch();
+ query3Paths = g_blastSearch->m_blastQueries.m_queries[2]->getPaths();
+ QCOMPARE(query3Paths.size(), 0);
+
+ //Turning the filter off should make the path return.
+ g_settings->minLengthBaseDiscrepancy.on = false;
+ g_blastSearch->doAutoBlastSearch();
+ query3Paths = g_blastSearch->m_blastQueries.m_queries[2]->getPaths();
+ QCOMPARE(query3Paths.size(), 1);
+ *g_settings = defaultSettings;
+
+ //query4 has a length discrepancy of +20.
+ g_settings->maxLengthBaseDiscrepancy.on = true;
+ g_settings->maxLengthBaseDiscrepancy = 20;
+ g_blastSearch->doAutoBlastSearch();
+ query4Paths = g_blastSearch->m_blastQueries.m_queries[3]->getPaths();
+ QCOMPARE(query4Paths.size(), 1);
+ g_settings->maxLengthBaseDiscrepancy = 19;
+ g_blastSearch->doAutoBlastSearch();
+ query4Paths = g_blastSearch->m_blastQueries.m_queries[3]->getPaths();
+ QCOMPARE(query4Paths.size(), 0);
+
+ //Turning the filter off should make the path return.
+ g_settings->maxLengthBaseDiscrepancy.on = false;
+ g_blastSearch->doAutoBlastSearch();
+ query4Paths = g_blastSearch->m_blastQueries.m_queries[3]->getPaths();
+ QCOMPARE(query4Paths.size(), 1);
+ *g_settings = defaultSettings;
+
+ //query5 has a path through 4 nodes.
+ g_settings->maxQueryPathNodes = 4;
+ g_blastSearch->doAutoBlastSearch();
+ query5Paths = g_blastSearch->m_blastQueries.m_queries[4]->getPaths();
+ QCOMPARE(query5Paths.size(), 1);
+ g_settings->maxQueryPathNodes = 3;
+ g_blastSearch->doAutoBlastSearch();
+ query5Paths = g_blastSearch->m_blastQueries.m_queries[4]->getPaths();
+ QCOMPARE(query5Paths.size(), 0);
+ *g_settings = defaultSettings;
+
+ //By turning off length restrictions, queries 6 and 7 should get path with
+ //a large insert in the middle.
+ g_settings->minLengthPercentage.on = false;
+ g_settings->maxLengthPercentage.on = false;
+ g_settings->minLengthBaseDiscrepancy.on = false;
+ g_settings->maxLengthBaseDiscrepancy.on = false;
+ g_blastSearch->doAutoBlastSearch();
+ query6Paths = g_blastSearch->m_blastQueries.m_queries[5]->getPaths();
+ query7Paths = g_blastSearch->m_blastQueries.m_queries[6]->getPaths();
+ QCOMPARE(query6Paths.size(), 1);
+ QCOMPARE(query7Paths.size(), 1);
+
+ //Adjusting on the max length restriction can allow query 6 to get a path
+ //and then query 7.
+ g_settings->maxLengthBaseDiscrepancy.on = true;
+ g_settings->maxLengthBaseDiscrepancy = 1999;
+ g_blastSearch->doAutoBlastSearch();
+ query6Paths = g_blastSearch->m_blastQueries.m_queries[5]->getPaths();
+ query7Paths = g_blastSearch->m_blastQueries.m_queries[6]->getPaths();
+ QCOMPARE(query6Paths.size(), 1);
+ QCOMPARE(query7Paths.size(), 0);
+ g_settings->maxLengthBaseDiscrepancy = 2000;
+ g_blastSearch->doAutoBlastSearch();
+ query6Paths = g_blastSearch->m_blastQueries.m_queries[5]->getPaths();
+ query7Paths = g_blastSearch->m_blastQueries.m_queries[6]->getPaths();
+ QCOMPARE(query6Paths.size(), 1);
+ QCOMPARE(query7Paths.size(), 1);
+}
+
+
+void BandageTests::bandageInfo()
+{
+ int n50 = 0;
+ int shortestNode = 0;
+ int firstQuartile = 0;
+ int median = 0;
+ int thirdQuartile = 0;
+ int longestNode = 0;
+ int componentCount = 0;
+ int largestComponentLength = 0;
+
+
+ createGlobals();
+ g_assemblyGraph->loadGraphFromFile(getTestDirectory() + "test.LastGraph");
+ g_assemblyGraph->getNodeStats(&n50, &shortestNode, &firstQuartile, &median, &thirdQuartile, &longestNode);
+ g_assemblyGraph->getGraphComponentCountAndLargestComponentSize(&componentCount, &largestComponentLength);
+ QCOMPARE(17, g_assemblyGraph->m_nodeCount);
+ QCOMPARE(16, g_assemblyGraph->m_edgeCount);
+ QCOMPARE(29939, g_assemblyGraph->m_totalLength);
+ QCOMPARE(10, g_assemblyGraph->getDeadEndCount());
+ QCOMPARE(2000, n50);
+ QCOMPARE(59, shortestNode);
+ QCOMPARE(2000, longestNode);
+ QCOMPARE(1, componentCount);
+ QCOMPARE(29939, largestComponentLength);
+
+ createGlobals();
+ g_assemblyGraph->loadGraphFromFile(getTestDirectory() + "test.fastg");
+ g_assemblyGraph->getNodeStats(&n50, &shortestNode, &firstQuartile, &median, &thirdQuartile, &longestNode);
+ g_assemblyGraph->getGraphComponentCountAndLargestComponentSize(&componentCount, &largestComponentLength);
+ QCOMPARE(44, g_assemblyGraph->m_nodeCount);
+ QCOMPARE(59, g_assemblyGraph->m_edgeCount);
+ QCOMPARE(214441, g_assemblyGraph->m_totalLength);
+ QCOMPARE(0, g_assemblyGraph->getDeadEndCount());
+ QCOMPARE(35628, n50);
+ QCOMPARE(78, shortestNode);
+ QCOMPARE(52213, longestNode);
+ QCOMPARE(1, componentCount);
+ QCOMPARE(214441, largestComponentLength);
+
+ createGlobals();
+ g_assemblyGraph->loadGraphFromFile(getTestDirectory() + "test.Trinity.fasta");
+ g_assemblyGraph->getNodeStats(&n50, &shortestNode, &firstQuartile, &median, &thirdQuartile, &longestNode);
+ g_assemblyGraph->getGraphComponentCountAndLargestComponentSize(&componentCount, &largestComponentLength);
+ QCOMPARE(149, g_assemblyGraph->getDeadEndCount());
+ QCOMPARE(66, componentCount);
+ QCOMPARE(9398, largestComponentLength);
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+void BandageTests::createGlobals()
+{
+ g_settings.reset(new Settings());
+ g_memory.reset(new Memory());
+ g_blastSearch.reset(new BlastSearch());
+ g_assemblyGraph.reset(new AssemblyGraph());
+ g_graphicsView = new MyGraphicsView();
+}
+
+bool BandageTests::createBlastTempDirectory()
+{
+ //Running from the command line, it makes more sense to put the temp
+ //directory in the current directory.
+ g_blastSearch->m_tempDirectory = "bandage_temp-" + QString::number(QCoreApplication::applicationPid()) + "/";
+
+ if (!QDir().mkdir(g_blastSearch->m_tempDirectory))
+ return false;
+
+ g_blastSearch->m_blastQueries.createTempQueryFiles();
+ return true;
+}
+
+void BandageTests::deleteBlastTempDirectory()
+{
+ if (g_blastSearch->m_tempDirectory != "" &&
+ QDir(g_blastSearch->m_tempDirectory).exists() &&
+ QDir(g_blastSearch->m_tempDirectory).dirName().contains("bandage_temp"))
+ QDir(g_blastSearch->m_tempDirectory).removeRecursively();
+}
+
+QString BandageTests::getTestDirectory()
+{
+ QDir directory = QDir::current();
+
+ //We want to find a directory "Bandage/tests/". Keep backing up in the
+ //directory structure until we find it.
+ QString path;
+ while (true)
+ {
+ path = directory.path() + "/Bandage/tests/";
+ if (QDir(path).exists())
+ return path;
+ if (!directory.cdUp())
+ return "";
+ }
+
+ return "";
+}
+
+DeBruijnEdge * BandageTests::getEdgeFromNodeNames(QString startingNodeName,
+ QString endingNodeName)
+{
+ DeBruijnNode * startingNode = g_assemblyGraph->m_deBruijnGraphNodes[startingNodeName];
+ DeBruijnNode * endingNode = g_assemblyGraph->m_deBruijnGraphNodes[endingNodeName];
+
+ QPair<DeBruijnNode*, DeBruijnNode*> nodePair(startingNode, endingNode);
+
+ if (g_assemblyGraph->m_deBruijnGraphEdges.contains(nodePair))
+ return g_assemblyGraph->m_deBruijnGraphEdges[nodePair];
+ else
+ return 0;
+}
+
+
+//This function checks to see if two circular sequences match. It needs to
+//check each possible rotation, as well as reverse complements.
+bool BandageTests::doCircularSequencesMatch(QByteArray s1, QByteArray s2)
+{
+ for (int i = 0; i < s1.length() - 1; ++i)
+ {
+ QByteArray rotatedS1 = s1.right(s1.length() - i) + s1.left(i);
+ if (rotatedS1 == s2)
+ return true;
+ }
+
+ //If the code got here, then all possible rotations of s1 failed to match
+ //s2. Now we try the reverse complement.
+ QByteArray s1Rc = AssemblyGraph::getReverseComplement(s1);
+ for (int i = 0; i < s1Rc.length() - 1; ++i)
+ {
+ QByteArray rotatedS1Rc = s1Rc.right(s1Rc.length() - i) + s1Rc.left(i);
+ if (rotatedS1Rc == s2)
+ return true;
+ }
+
+ return false;
+}
+
+
+
+QTEST_MAIN(BandageTests)
+#include "bandagetests.moc"
diff --git a/tests/big_test.LastGraph b/tests/big_test.LastGraph
new file mode 100755
index 0000000..a44544f
--- /dev/null
+++ b/tests/big_test.LastGraph
@@ -0,0 +1,19930 @@
+4618 6344180 51 1
+NODE 1 6457 309198 303335 0 0
+GAATAACAACAATGTTGACGAAAACAATGAACATCGTGATGGCCTTGACGACGTCATAGATCCACGGGGGGGCAACGTGGTTCTTCATAAATGAAAAAATACACAACACAAACCCAGGTCAGAAGGAACAGGGCCCAGAACGGAAGAGCGGTGCGGAGAAATTCCATGCTGATGTGTTTCCTCTTTTATTGTTAATGAGGTGTCATTAACGGGAAACTGTAGTGATGCCGTGTTTTAATAAACAGGAATAAATCATTCAGGATGGAATGAATTTATTTGAACAGGCCTGGAACAGCGTGATGCAGAAACTGGCAATGCTGACCGCCCCTTTATCCACCCCCGTGTATTCTCCCGTAAAAATTTTCAGTTTTGCAAATAGAGTTTATCGCTGATCCCTCCCCCTGCCTTACGCATGCTGTACGCACCCATTGATTCTGACGGAGGTGCGTATGTTTTCTCTTCCTGCATTATCCCGGAAAACGGCCGGTCTGA [...]
+CGTATTCTCACCCACGGCATTTTTCGACAGCCGGGTAAACCGCTCCTCCAGGGTGTCCTGTGGCTGTACCACAATGGTCATGCACAGCACCGTTCCTTCCGGAAACGTATCCATCAGCGCATTCACCGTTTTTTCTCCCCGGGACATCTCACCGGTAATGGCGCCCGGCTCCGGTGGCGTACGGAGCTTCTCCACCACCACGGCACAATGTGGCAGATCATCAATCCACCACACCCCGTTCTCCGGATCGGAATGAGGCGGGGTAAACCACAGGCTTTCTGCAAAGTCCGTCATCACCGGCATAACATCCGCAGCGTTCTCACGGGGATCGGCTCTTGAGGCCATCCGGTACAAATCCTCCCGGCTAATCCAGGACGGTGCCGGATTAAATAACCGGAGTAACCAGCTGTGAACCTGCAGACCGTTCATCCGGTGACAGCGCACCCCGGCGCTCCCCAGTGCCGACACAACGCGATCGCAAACCTGATTCAG [...]
+NODE 2 4908 236432 233889 0 0
+AACGGCTTTAGTTCAGCATATTTCTAATGACATAGTGCAATATGCCGTCATTCTGGTAGTAAGTCAGCTCGGTGGCGGTATCAATTCGACAGCGACAAGGCACCGTTTCTTTGCTGCCGTCCGATCTCGTTAACGTCACCGGAATGGTCGCGCCAGGGCGCAGGTTTTGCAGATCCGCGATATCAATCACCTCTTCCCCGGTCAGTCCCAGCGTTTTACGCGTTACGCCCTGTGGAAACTCCAGCGGCAGGATCCCCATCCCAATCAGGTTTGAGCGGTGGATACGTTCGAACGACTCGGCGATCACCACGCGAATACCTAACAGCCGCGGACCTTTTGCCGCCCAGTCACGGCTCGATCCCGACCCATACTCTTTCCCGGCAATCACCGCCAGCGGCGTTTTTTCCTGCTGGTAGAGCATCGCGGCATCATAAATCGACATCGCTTCCGTACCCGGCAAATGCCGCGTCATCCCACCTTCGACGCCGGGCA [...]
+CTGGTTATCTATGCTCCTGGGAACTCACTCCCTTGTCGCCTTTAAGCAACTCGAATTATTTTGAGTATAGCGGGCTTATTATTTTATCGCGCTGGCTATACAGTTCAGATATAAATGATATAGTGGTTATAGTTAACACCTTTTTTATTATTAAATCGTATTAGCAGCCAGATTAAGTCTGCAGATAAACGATGGCCTGATGGCGCTAATTTGGATGATGTATTATGAAATTGCAGCAGCTTCGTTACATTGTTGAAGTGGTTAATCATAACCTTAACGTCTCCTCTACCGCTGAGGGGTTGTATACTTCCCAGCCGGGGATCAGCAAGCAGGTTAGGATGCTGGAAGATGAGCTTGGCATCCAGATTTTCGCCCGCAGCGGTAAGCATCTGACTCAGGTGACGCCCGCAGGTCAGGAGATTATTCGTATTGCGCGTGAGGTGCTTTCCAAAGTCGATGCCATTAAGTCGGTCGCCGGCGAGCACACCTGGC [...]
+NODE 3 7432 423552 419724 0 0
+CATAGACGGCATCCGTTACGCCGCCGTCGAGCAAGGCGGCAAGACGTTCCAGATCGCTGATAAAAGCGCTGGTTAAGTCATCTGCCGCGTCGGCGGGAAGCAGCCCGCTAATCAGATCGCACTGGTAGCGGCGTAACGTCTGTAATACCTGATGCGCAGAAAGGCGATCGGTCTGGCTTAACTTGAGCCAGCTAATCAACTGGTTGGTGGTACTGCCTGCGGCGGACACTACCATCATATCGTCAGGCTGCGAATACTCCGCCATAATGCCTGCGACACGCAGGTAACACTTCACATCCGCCAGACTACTGCCGCCAAATTTATGCAGTTGACGACCTTTCGCCCCTGCCTGCGCAATCACACTCATGTTTACCCCTTGTTTGCAGCCCGGAAGCCATTTTCCAGGTCGGCAATTAAATCTTCGCCATCTTCAATACCGGTGGAGATACGCAGTAGCGTTTCGGAGATCCCGGCGGCGGCACGCGCCTGCGG [...]
+CTGCGGAAAAAAGCGCGCCATCGACATCCAGCAACGCCACCAGCGTGACATCCGGAAAGTGATGGCCTTTCGCCAGCATTTGTGTGCCTATCAGGATGCGTGCTCCGCCGCGGTGAACTTCCGCCAGATGCTGCTCCAGCGCGCCTTTACGACTGGTGGTATCACGGTCGATTCGTGAGATCGGCACGCCGGGGAAGAAGGGCGCCAGCACCTGCTCCAGCTGTTCCGTCCCTAACCCAACCGGTAACATATGTGTGGAGCCGCAGGAGGGGCACTGACGCGGTACCGGACGCTGGCTGTCGCAGTGATGACAGCGTAAATGATGCTGCGCCTGGTGCAGCGTGTAGTAGTGATCACAACGCGGGCACTCCGCAATCCAGCCGCAGTCGTGGCAAAGCAGCGCGGGCGCGAATCCCCGGCGGTTAAGAAATAAAATTACCTGATTGTCGGCCTGGAGATGTTGGCGCATACGGGCGATAAGGGCGGGCGCCA [...]
+NODE 4 690 41447 38722 0 0
+TGGTCGCTGGAAACAAGTGAAGGTGAAGGTTACATTTACGTGGTTATTGAACATCAGAGTACGCCGGACGCGCATATGGCATTTCGGCTGATGCGTTACGCAATGGCTGCAATGCAACGGCACCTGGAAGCCGGGCATAAGACGTTGCCGTTAGTGGTGCCAATGCTGTTTTATCACGGAAACCGCAGCCCGTATCCGTTCTCATTATGCTGGCTGGATGAATTTGCCGACCCGGTGATGGCGCGTAAGCTATACGCCACCGCCTTTCCTCTGGTCGATATTACGGTCGTGCCGGACGACGAGATTATGCGACACCGACGGGTCGCGCTGCTGGAACTCATACAAAAACACATCCGCCAGCGTGATCTGATGGGGCTTGTCGAACAGCTGGTCGCCCTGCTGGTTAAGGGATACGCTAATGACACCCAGCTTCAAAGTTTGTTTAATTACATGATGCACACTGGCGACGCCGCGCGCTTCAATACGTTTATC [...]
+CAATGCGCAATGCGGCGAGCCGTTGGCCTTCCTGTTTGCCTTGCTGTAGCCCTTTCTGTAACCCGTTACGATGTCCTTCCTGACGTAATCTGTCTGCGATAGTCATGATCTTCTCCTTATGCTGTGGGATACGCATAGCCACTTGGCGGATAAACGTATTGAAGCGCGCGGCGTCGCCAGTGTGCATCATGTAATTAAACAAACTTTGAAGCTGGGTGTCATTAGCGTATCCCTTAACCAGCAGGGCGACCAGCTGTTCGACAAGCCCCATCAGATCACGCTGGCGGATGTGTTTTTGTATGAGTTCCAGCAGCGCGACCCGTCGGTGTCGCATAATCTCGTCGTCCGGCACGACCGTAATATCGACCAGAGGAAAGGCGGTGGCGTATAGCTTACGCGCCATCACCGGGTCGGCAAATTCATCCAGCCAGCATAATGAGAACGGATACGGGCTGCGGTTTCCGTGATAAAACAGCATTGGCACCACTAACG [...]
+NODE 5 11710 648027 642400 0 0
+TTCACCCCAGTCACATAGTTATCTATGCTCCTGGGAACTCACTCCCTTGCCGCCTTTAAGCAACTCGAATTATTTTGGGTATATATTAGATGTCGTCAGGTGTCTGAAACAAAACGGCTTCTAAGGCATTACGGTAAATATCAAGCTGCACTACGTCTTTTTCTGTTTCCAGTTTTTCAATAAGTTTGGCGATGATATCCTTATTTGAGACATGCTGCTGCGATTGCAATAGTTCGTAAGTAATTTCCTGAATAGCTCGCTGTTCACATAACATATGTGCAGAAAAAGGATTGCCAGTACTATTTTGTTCGTTGACTAGTGTAATGGTAGTCATATTTCACCATATTCGATGTAAATTGAAGCCGATCTCCCTGAGCGGGGGAGAGAAATTAGTGACCTATTAAAATTAGACCTATATCATAAAACCGTAATAAAAAATCATAAAAACGTGATGTACATCACATTTGTGTGATTTGTTGTATATTTTATACA [...]
+TTTGAGCCGAACGTATAAGAACGTAGAAGTGGTTTATATCCGCCACCATACCCAGGCGAAGGAAGTGGACGAACATGAGTTCTTTTATTCGCAAGAGACCGGCGGGACGATTGTCTCCAGCGCGCTTAAACTCATGGATGAAGTGGTTAAAGAGCGCTACGACCCGGGGCAGTGGAACATCTATGCGGCGCAAGCGTCAGACGGTGATAACTGGGCCGACGATTCACCGCTGTGTCATGAGATTCTGGCGAAAAAACTGCTGCCGGTAGTGCGCTATTACAGCTATATCGAGATTACCCGCCGCGCCCACCAGACCTTATGGCGCGAGTATGAACATCTGCAGGCGACGTTCGATAACTTCGCCATGCAGCATATTCGCGATCAGGAGGATATTTATCCGGTATTCCGCGAATTGTTTCAGAAACAGAGCGCCAATCAAAGCGCATAAATAAATCCGCCCGTTCATATGTCGGGCGGGTTTTAATAAGCCTG [...]
+NODE 6 3984 224696 223878 0 0
+AAGCTCGCCGCGCATCGCGCGCTCCGTCACTTCAGCCACCTTCTCACCGGTACCGGCCAGCTTAGCGATTTCATCGATACACTCAATCTGGATCGCCGTGGAATCCATATCCATCACCAGCAGCCCCGGCGTGCGCAGATGCGGAATTTTACCCAGCGGCGCGACATCCAGCTGCGCCTCATGCGCCAGCCGCGTCGCACGCGGCGTCAGCGACCCCGCCAGACGAATGACCTGATAATCCTCCACGCACCAGGCGGCGACAATCACCATTGCGGCGCCCAGTTTGGTCTGATATTGAGTTAAACGCTGCTTATCCAGCCCGCGCCCATACAACAGCCAACCGCTGCGGCCTGCATGGTAATCCAGAGGCATCACCTCGTCGCCGCTTAAAGAAAGAGGCAAACCAGGCCATAAAGAGACATCTTCAGGCAGATCGCACCAGGTAATGTTAGGCATTAAAGCTCCTGTAAATCGTTCAGGCCGGTAACCGCC [...]
+GTATCCTGAATGGCCAGTGAGGTTTTCAGCGGGAAAATGGCAAGAGTATACGGAACTGGTTCGGTGGTGCCTTTTGTAGCAACGGTAAACATTTCCATATTGCCGTTTTTGATAATCCCGGTGGTGGACTTCTGCCAGACTGGGCTATCAACGGTTCCTGAGATAGCGTCAGATTTTACACCATCAGCGGTAACGTTCGCGGTATCGGTGTAAATAGAGAACGCGCCGATTTTTACACCTTCGGTTGTTTTGCCAACGCCGTAGGACATTGTGGTATCAGATACTATACCATTAGTCATATTGCCATTGGCTATGGAGATAACGGATGCGCCTGGGTGGGTGTCCGCACGGTCATCGGTAATAGTCCAGGCTGCTTTGGTTGCAGACGGACAAGAGATACTCAGAGAGACATCTTTAGTGCCCAGTTGGTTTACATCGGTTGCGGAAAGTGTGGCGAGGCGGATAGTACCGTAATCAACCACACCGCCGTCG [...]
+NODE 7 13516 714057 707243 0 0
+GGAAAACATTTGCGGCCTGTGCGAAGAGCTGGCGCAGGAGAATATTTCCGCACGGACGTTTGACAAGCTGGTCTATCAAAACCTCACGTTATATCTCGATGCCTTAATGAATAAAGAGAGCCCTCGCGCTCGTCAGGACAAGCGGCTGCGTTTTATCGAAGATGTCGGGAAAGCGATCGCTGCACATTACGATCTCGAACTGAATGCGGAATTCGCTTATCTCACCGGACGTTACCTTACCAGCCTGCCGTTAACGCCGGTGGAGGCGTCGCCATCGGTTCGCCATGTGATGCTGCGCTGGCTGGAGGAGGCGCCGGGGCTGGCGCAGCGTGTGGCGCAAAAACTGCTGGACGTGGTAAATAATAAATATGATTTGTTAATCGACACGCTCGACAGACTGGTCGTGGCGGCCATCGTCAGTAATGCCATTGACGCCACCAGCGGCGGTAAGGTAAAAGCGCTTATCATCGCGCATGGTTATTCGACCGCCAG [...]
+TATTATGAATTTTGTATATAAAAGGTGAAATATATTGATAATATTATTGATAACTATTTGCATTTGCAATAGCGTATTGTCGCGCTATGGGACGCGCGAACACAATTTCACCACCCGGCCAATGCCTTTGACGGGCGCTTTGGCTTATGTGGCTAAAGAAAAGCAGGATATACAATGAACAAGAAGATTCATTCCCTGACCTTACTGGTCAATTTAGGGATTTACGGGGCCGCTCTGCCCGTGATGGCGGAAGAAAAAACCGATAGCGCTGCGCTCACCAATGAAGACACCATCGTGGTGACCGCTGCCCAGCAAAACCTACAGGCGCCAGGCGTATCCACCATCACCGCCGATGAGATCCGCAAAAATCCGCCCGCGCGCGACGTGTCAGAAATCATCCGCACCATGCCGGGCGTAAACCTGACCGGCAACTCCACCAGCGGTCAGCGCGGGAATAACCGCCAAATCGATATTCGCGGCATGGGGCCGGAA [...]
+NODE 8 3527 203456 200534 0 0
+CAGCGGAACGCCGTGGCTCAGCGCCATGCCCATCCCGTCGCCGGTGACGATGCCGCCGTTGGTGTTATAGCGGTATACGCGGCCTGCGCCGCCTGTCGCCATGACCACGGCGTTGGCGCGGATTTGCACCAGCGTGCCTTCCATCATGTTCATTGCCACCAGGCCGCGCGCATGGTTGTCATCGACCAGAATATCCAGCACAAAATGTTCGTCAAAGCGCTGGATTTGTGGGAACTGCAGGGAAGTCTGGAACAGAGTATGCAGCATATGGAAGCCGGTTTTATCCGCGGCGAACCAGGTACGCTCGATTTTCATACCACCGAAGCGACGCACGTTAACGCTACCGTCCGGACGGCGGCTCCACGGGCAGCCCCATTGCTCCAGCTGCGTCATCTCAGTGGGACAATGGTGGACAAAGTAATCCACGACATCCTGCTCACACAGCCAGTCTCCGCCTGCTACCGTATCGTGAAAATGGTAGTCAAAGCTGTC [...]
+AGAACAAATGGCCGCTCCAGATCCTGACGCGCTTTAAAGAAGGGAAATGCCAGCGCAAGGAACAGGTATGGCAAGGTCATTGAGACGTTCGCCATCAGCGTGAGTTTGTTATAAAACGCCGATGCGGTGTCACCGCCAAAAGAGACCAGCAAAATAAACAGACTCACCAGCACGCACTGTAGCCACATAGCGATCGCCGGCATACCGTTAGCGTTCAGTGTCGTCATCGGCGCGGGCCACAACGCTTTTGGCGTCCCCTGAATAATGGCTTTCAGCGGTGAATAGCTCAACGTAAAAAACGCGCCGGTATAAGCCAGAAACATAGAAAGGCCGGTGATACGCGCAAACCAGACGCCCACCGTCATCGCTGCGTCCGGAGAAAGGTTTAACGCGTTACCTAATGTCGTGCCTAAACTCGACATCAAAATGTAGGTAATATTCCCTAAGTTAACGGCGCTATTACTTAATATCTGTTGCCAGTTAGTGCTGACG [...]
+NODE 9 4769 274232 272558 0 0
+CGCGCGCGCCGGCGTTCAACGCCTGTTCCACCAGCGCCGGGCTATCGTGAACCGAGAGCATGATCGTCGCCATCCCTTTTGGCAGTTGGCTTAGCAGCTCCAGTCCGGAAATATCCGGCATCGAGATATCGCAGATACACACCTGTACGCCGCGCCCCGGCAAGCCTGCCAACGCTTCGCGCCCGGAACCAAATTCGGCGACCACCTGCAAATCAGGTTCCAGCCCCAGTAGCTGTGCAAAGCCGGAGCGGACGATAAGGTGGTCGTCGATAAGGGCAACGGTGATCATGGGTTCTGTCCTGATGGATAAAAAAAACGCGCTTACCTTAACGATAAGCGCGCGGCTGTTCAAGCCTTGAGCGGTCAGACAATGCCTGTCGTGACGGTGAACGTCCGGGTTTGCTGCGGTTCCAGTTGAAGCAAGGTTCCATTTCGCTGCGCCGCGAGAAAACCTTCAGGCCGACAGGTCGCGGGCAGGGCAAAGGCGGCTAC [...]
+GACAGTGAACGGCATAATCTGTCGGTAATGGGCGATCGCTAATCAGGACATCAAAGGCAGAAAGCGGACCAATGCTGGCAGGCGCGACCTCATCAAACAGGGCGTGACGCGCCAGCAAAATTTTGCGCAGACCGCGCTCCATCGCTTTACGTTTGGCGGCAAGATCATCCGGGTTAAACCAGCTCACGCCAAAATGTTCATGTACGCCGCTGGCGGAAATAAACACTTTGCGCGGATTGAGCGAATCCAGCGCCGAAGGATTATTGGCATCATAAAAGGCATCGCTCTTGGCCCGATAGGTGCCGCCGCACAGAATCGCCGTGGCATTAGGCTTTTCATTCAGCGCGATAAATACCCGATGCGAGTAGCAAATCCCGGTAAAGGTAATATCATCCGGTATCATGCTGATAACTAATGGCATTTCCGGACCGTTATCAAAAAAAACCAGATCGTTTTCACGCACCAGGCCGGCGGCCAGGATCGCAACGGGAA [...]
+NODE 10 15008 797746 790734 0 0
+ATCCGGATAGAGCGACTTATCATTGGCGACCTCCGGGCTTAACAGCTTACGCGCCGCCAGGTTGGGGGTAGGGTAGCCGATGGTTTCTGCCACCTCTTTCGCGACGTCAGGACGCAGCAGGAAGTTGATTAGCTTCAGCGCGCCCTCTTTATTTTTCGCGTTCGCCGGAATAGCCAGGCTGTCCATCCAGAAAATACCGCCTTCCTTCGGCCAGACGACCTCCAGCGGCGTGCCAGCCTGACGAGCAACGAAGGCCGAACCGTTCCACACCATCCCCAGGTTGACTTCCCCTTCCATATACGGATTCGCCGGATTATCGGAGTTGAAGGCCGCTACGTTCGGCATCAGTTTTTTCAACTCTTCATATGCCGCTTCAATCTCTTTCGGATCGGTAGTGTTACCGGAATAACCTAGCTTGCGCAGCGCCATCTGGAAGACTTCTCGCGCATCGTCGGTTAAAAGCAGGCTGTTTTTATATTCCGGTTTCCACAA [...]
+TACGCCGCCTTGAAGTTCAATGTCGCGAGTATTCCAATGTCAGAAAGCCCAAAAAAAGTGATCGTCGGCATGTCCGGCGGTGTCGATTCCTCCGTTTCCGCCTGGCTGTTGCAACAACAGGGTTATCAGGTAGAAGGCCTGTTCATGAAGAACTGGGAAGAGGACGATGGTGAGGAATACTGTACCGCGGCAGCCGATCTGGCTGACGCGCAGGCCGTGTGCGACAAGCTTGGCATTGAACTGCATACCGTTAATTTTGCCGCAGAATATTGGGATAACGTCTTTGAACTGTTCCTTGAAGAGTACAAAGCGGGCCGTACGCCGAACCCGGATATTCTGTGCAATAAAGAGATCAAATTTAAAGCCTTCCTTGAATTTGCCGCAGAAGATTTAGGCGCCGACTATATCGCCACCGGTCACTACGTTCGCCGCGCGGATGTAAACGGCAAAAGCCGGTTGTTGCGCGGGCTCGACGGCAACAAAGATCAGAGC [...]
+NODE 11 3480 191784 190203 0 0
+GGTCGGACTGGGTATCGCGCTCTATTCCGGCGTTAACTGGATGGGCAACCTGCGGGAAGCGATTCGCGCCCAGTCACGGGACGTCTGGGAGCGCAAGCCGCAGGATCAGGAGAAAATCTGGCTCAAATATCTGCGCGATTTTATCTCGCTGATTGGATTATTAATCGCTTTAATCATTACGCTGTCCATTACTTCCATTGCCGGTTCCGCCCAGCAGATGATCATCTCCGCCTTGTACCTCGACAGCATCGAATGGTTAAAACCGGCCTGGCATTTGATCGGTCTGGCCATCTCTATTTTTGCCAACTATCTGCTTTTCTTCTGGATTTTCTGGCGACTGCCTCGCCATCGTCCCCGTAAAAAAGCGTTGATTCGCGGGACATTTATCGCCGCTATCGGTTTTGAGGTGATTAAAATCATTATGACCTATACGCTGCCGTCACTGGTGAAATCGCCTTCCGGCGCGGCGTTTGGCTCCGTACTCGGTCTGAT [...]
+AATTGACGCCGAAAAGTCATCGGTATTTGATTATCGTGGTTTTAACGGGCGCATTGGCGACAGTGATATCCACGGCTCCCTCACTTATACCACCGGTAAACCGCGCCCTAAACTGGAAGGCGATGTCGAATCGCGCCAGTTACGACTGGCCGATCTTGGGCCGCTGATTGGCGTGGATTCCGGGAAAGACGCTGAGCAGTCGAAACGGTCTGAACAGCGCAAAGGCGAGAAGAATGTTCAGCCGGCGGATAAAGTGTTGCCTTACGATCGCTTTGAAACCGACAAATGGGACGTTATGGACGCCGATGTCCGGTTTAAAGGCCGACGTATTGAGCATGGCGGCAGTCTACCGATTAGCGATCTTTCGACCCATATCATCCTGAAAAACGCCGACTTACGTCTACAGCCGCTGAAGTTTGGTCTGGCAGGCGGCAGTATTGTCTCCAACATCCATCTGGAAGGGGATAAAAAGCCAATGCAGGGGCGGGCGGA [...]
+NODE 12 2311 103479 102697 0 0
+GCCTGGGAATCGAAAAGCGACTGGGAAATCTACAAAGGCATTGCGAAGAAATTCTCCGAAGTCTGTGTAGGCCACCTGGGTAAAGAGACTGACGTCGTGACGCTGCCGATCCAGCACGATTCTGCCGCTGAACTGGCGCAGCCGCTGGACGTGAAAGACTGGAAAAAAGGCGAATGCGATCTGATTCCAGGGAAAACCGCGCCGCACATCATGACCGTTGAGCGCGATTACCCGGCGACTTACGAACGCTTTACCTCTATCGGCCCGCTGATGGAGAAAATCGGCAACGGCGGGAAAGGGATTGCCTGGAACACACAGAGCGAAATGGACTTGCTGCGTAAGCTTAATTACACCAAAGCGGACGGTCCGGCGAAAGGTCAGCCGATGCTCAACACGGCGATTGACGCGGCAGAGATGATCCTGACGTTAGCGCCGGAAACCAACGGTCAGGTGGCGGTGAAAGCCTGGGCGGCGCTGAGCGAGTTTACCGGT [...]
+CGCATCGATCACGCTCTGCGGCACGCCGTCCTTCAGCGCCTGCTCAATGACAGCCGGATCGTTCGGATCGAGGAACACGTCCAGTTGACGCTGGTACAGATCTTTTTCGTTTTCCGTACTGGCGGCGCTTTCAATGGCATCTGCGTCATACAGCAGTACGCCAAGGTAGCGGATACGGCCCACGCAGGTTTCGGAGCAAACGGTCGGCTGACCGGCTTCGATACGCGGGTAGCAGAAGATGCACTTCTCGGACTTGCCGCTCTTCCAGTTGAAGTAAATTTTCTTGTACGGGCAACCGGTGATACACATCCGCCAGCCGCGGCACTTGTCCTGGTCGATCAGCACGATGCCATCTTCTTCACGCTTGTAGATAGCACCGCTCGGGCAGGTCGCCACGCACGCCGGGTTGAGACAGTGCTCGCACAGGCGCGGCAGGTACATCATGAAGGTGTTTTCGAACTGGCCGTACATCGCCTTCTGCATGTTTTCGAA [...]
+NODE 13 3823 188767 188365 0 0
+TACTTCATAAGGCACCAATTTCAAATCAATCAGCACTGCCCCGTATCCTTACCCCACAGGCAGACTTCACACCATGGTGCCATAGCTTATTGGTTATCTTATCAATACTTCTTCCTGGCAATCTTTTTCGCCTCCTTTGACTGGTCAATTTTTCGCCAGATGAGATTAAAGGCGGCATATGTCTCGCTAAGTTGATCTGGGGTAAGCGTTCCCTTGAGTCGGTTTCTTTCGGCAATGAGCGCTGAACAATCATCCTTAGATTTTTCCGTATACATACTTGCCATGTAATACCAAATATAGGCCTGCTTATTATCTTTAGGCACACCCTGGCGCCCATGAGCATAAATTTCCCCAAGCGCTGATTGTGCCGGAGTAAACCCCTGCTCTGCCGCTTTGAGGTACCACTTCAGCGCATTCCGGCTATTTTCAGGCACGCCTCTTCCCGTGCTATATGCTACGCCAAGCTGATATTGCGCTTTCGCAAAATCCTGT [...]
+GCCGCTGCATCCGGAATACCGCACGCTGCCGATGGTCTGGTACGTGCCACCGCTGTCGCCGATTCAGTCTGCCGCCGACGCGGGTGAACTGGGCAGCAACGGTATTCTGCCGGATGTAGACAGTCTGCGTATCCCGGTGCAGTACCTGGCGAACCTGTTGACCGCTGGCGACACCCAGCCGGTACTGTTGGCGCTGAAACGGATGCTGGCGATGCGTCACTACAAACGTGCGGAAACCGTAGACGGTAAAGTGGATACCCGCGCGCTGGAAGAGGTGGGCTTAAGCGAAGCCCAGGCGCAGGAAATGTATCGTTACCTGGCAATTGCTAATTATGAAGATCGCTTTGTGGTGCCGAGCAGCCATCGTGAACTGGCGCGTGACGCATTCCCGGAGAAAAGCGGTTGTGGCTTTACCTTCGGCGATGGTTGCCACGGGTCTGATACCAAATTCAATCTGTTCAACAGCCGCCGCATCGACGCTGTTGATGTGAC [...]
+NODE 14 14534 750144 745165 0 0
+ACTTGAAATCAGCAGGGATTGGTTTATCGTGATGCCCATCACTTCCCGGTAGTCCTGCCGTTGAAGCAACAAATTTCTGAGACTTGTAATGAACAGAACCGACGAACTCCGTACTGCGCGTATCGACAGCCTGGTAACACCGACCGAACTCGCGCAGCGGTATCCTGTATCGTCCTCCGTCGCCAGTCACGTTACCGACTCCCGACGCCGGATAGAAAAGATTTTAAATGGTGAAGATCCACGGCTACTGGTCGTCATTGGCCCCTGTTCGATTCACGATCTGAATGCTGCCATGGAATACGCGACGCAGCTCCAGGCACAACGCCAAAAGCATCAGGCGCGTCTGGAGATCGTCATGCGCACCTATTTTGAAAAACCGCGCACCGTTGTGGGATGGAAAGGCCTGATTTCCGATCCCGACTTGAATGGAAGTTACCGCGTCAATTATGGGCTTGAACTGGCGCGTCGCTTGCTATTGCAGGTGAACGAACT [...]
+CGGACGAAAATAGCGATTTTCGTCTGTGTCGAAGGTTGTGCGCCAATTTAGCAATGGTTGGCTAGATGGATACACAACTCACTGTCAATAAATTCATTTTCTCTTTGTATGTGATCTTGCGTATGGGTCACCACTGCAAATAAGGATATTACATGCCTGTTATTACTCTTCCTGATGGCAGCCAACGCCATTATGACCATCCTGTAAGCCCGATGGATGTTGCTCTGGACATTGGTCCTGGCCTGGCGAAAGCCACCATTGCGGGCCGTGTGAATGGCGAGCTGGTTGATGCTTCCGATCTGATTGAAAATGATGCGACGCTTTCCATCATCACCGCAAAAGATGAAGAGGGTCTGGAGATCATTCGTCACTCTTGCGCGCATCTGTTAGGTCACGCTATCAAGCAACTTTGGCCGCACACGAAAATGGCGATCGGCCCGGTTGTCGACAACGGTTTTTACTATGACGTTGATCTTGACCGCACGCTAACTC [...]
+NODE 15 4520 252856 249712 0 0
+TTCAGATGTACCTTCCGGAAAACGCCATGCCACCGAAAATCCTAATTCCTGGAATTCGTCAATGTGCATTTTTTTACGCAGACGACGACTACGGTTCTTTGCCATTATTTCACCCTCTCGAACATTAAGTCCCATACGCCATGACCAAGACGATGGCCACGTTGTTCAAATTTCGTTACCGGGCGCGATTCCGGGCGCGGTACATAATCATTGCTCTCTGACAGATTTTTGTACCCGTCGATAGAAGACATGACTTCAAGCATGTGTTCCGCATACGCTTCCCAGTCGGTCGCCATATGGAAAACGCCGCCCAATTTCAGCTTGCTCAATACCAGTTCAGCAAACGGCACCTGAACGATACGGCGTTTATTATGACGCGCTTTATGCCACGGGTCAGGGAAAAAGAGCTGAACCATCGATAAAGAATTGTCAGGAATCATTGTATGCAACACTTCTACCGCGTCGTGGCACATGACGCGCAGGTTTTCAACG [...]
+TCTTTATCAAAGCTATGCAGGAAGGTGTTGCCAAACATGTTGGTGATCTGCAGTTCCGCGCCCAGCATCATGGAGAAGATGAAGAAAATCGCCATCCGCTTATTTTTAAACAGCGCAAAAGCGTCAAGGCCCAGCATTGATGTCCAGCTCTGGTTTTTCTGTTGGTTCGCCACCGGAATGTGCGGCAGGGTAAAGGTAAACAGTACCAGCAGAACGGAAAGCGTCGCGCCGATATAAAGCTGCATATGGCTCAGCTCGAAACCGGAGAAACTCACGCCCCACATCGCCAGAATAAAGCCAATGGTGCCCCAGATACGGATAGGCGGGAAGTCAGTCACAATATCCATGCCGGCAGACTGCAGGCGGTAATACGATATGGTATTGATCAAGCCCAACGTCGGCATATAGGCCAACGAGTTAAGCAGGATCACAAAGAACATCGCCCCAGGCGTAGTGACTTCCGCGGCCATGAATAGCGTGATGGCGCCGACG [...]
+NODE 16 5393 303625 299570 0 0
+GGCGAAAGCCCAGGCGCTGGGGCTGCCGGTGCTGGCGCGCATCCGCGCGTTTGCCAGCGTCGGCGTCGATCCTGCGCTAATGGGGATTGCGCCGGTATATGCTACCCGGCGCTGTCTGGAGCGTGCCGGCTGGCAACTGACGGAGGTCGACCTTATCGAAGCCAACGAAGCGTTTGCCGCCCAGGCGTTGTCGGTAGGAAAAATGCTGGAATGGGATGAGCGACGGGTAAACGTTAATGGCGGCGCGATTGCGCTGGGGCATCCCATTGGCGCTTCCGGCTGTCGAATTCTGGTTTCACTGGTGCACGAAATGGTTAAACGCGACGCGCGAAAAGGCCTGGCGACGCTGTGTATTGGTGGCGGCCAGGGCGTTGCTTTAACCATTGAACGCGATTGATCCTACGCCAGCCATCCTTTTCCTGCTTCAGTATTCCGTCATAAAAAGCCCTCTATCACGAGGGCAAAGCCAGTGACAGACCCCCTTTTTCGTTA [...]
+GAACATCAGGTGAAGCGCAGAATGGTGGTGGAAACGCATAGCGCGGCCTCCGTCTGCGCGATGGTGCGCGCCGGGGCGGGCGTTTCGATCGTTAACCCGCTGACTGCGCTTGACTATGCCGCCAGCGGCGTCACCGTTCGCCGCTTCAGCATTGACGTGCCCTTTACCGTCAGCCTGATTCGCCCGCTACACCGCCCCGCCTCCGCGCTGGTTGACGCCTTCAGTAAGCATTTACAAACGCATCTTTCGCGCCTGGTCGAACCGCTGGAGGTTATTCTGGGGCCGATGACGAAAGCATAAAGCTCACGGCATCTGCGGCATGAATTGCCGTGGTATCGAAAACCGGTAGCGCGCTTTGCGTCTGGGGAACAAGCAAACCTATTTCAGTGCAGCCAAAAATAACGCCCTGCGCGCCTTGCGCAGCCAGTTGTTCGATAACCTGTAAATAATAGTGGCGCGACGCGTCAGTGAATGTCCCCTGACAGAGCTCGT [...]
+NODE 17 3478 196948 195273 0 0
+CCTGCTGGCTGGATGTGGATGCGATTACCCGTGTGTTATTGATAGGTTCCGTTTTACTTATCATGATTGTTGAAATCCTCAACAGCGCTATTGAAGCGGTCGTGGACCGCATCGGTTCTGAATACCATGAGCTTTCCGGCCGTGCGAAAGATATGGGATCGGCTGCGGTGCTACTGTCTATTTTCGTTGCCCTGATGACCTGGGGCATCCTGTTATGGTCACATTTTCGATAAAGGTTCCAAATTTTATAAATCTCTTGTTTTTTGCGCCGTTTGTGGTTCCAAAATCACCTTTAACTGTATATACTCACAGCATGACTGTATATACACCCAGGGGGCGGAATGAAAGCGTTAACGGCCAGGCAACAAGAGGTGTTTGATCTCATCCGGGATCACATCAGCCAGACAGGTATGCCACCGACGCGTGCGGAAATCGCGCAGCGTTTGGGGTTCCGTTCCCCAAACGCGGCGGAAGAACATCTTAAAGCGCTGG [...]
+TGCCATTCGAGGTGCTACATGGAAAAGACCACAACGCAAGAGTTACTGGCGCAAGCTGAAAAACTCTGCGCGCAGCGCAACGTGCGCCTGACGCCTCAGCGCCTCGAAGTGTTGCGCCTGATGAGTCTGCAACAGGGTGCCATCAGCGCATACGATTTGCTCGATTTGCTGCGCGAAACGGAACCACAGGCCAAACCGCCCACCATTTACCGCGCGCTGGATTTTTTGCTCGAACAGGGTTTTGTCCATAAAGTGGAATCCACCAATAGTTATGTGGTTTGCCACCTGTTCGACCAGCCGACGCACAGCTCGGCCATGTTTATCTGCGATCGTTGCGGCGTGGTGAAAGAAGAGTGTGCCGAGGGCGTGGAAGACATCATGCATACGCTGGCGGCTAAAATGGGCTTTGCGCTACGACATAACGTTATTGAGGCGCACGGTCTGTGCCCTGCGTGCGTAGAAGTGGAAGCGTGTCGCCATCCGGGCGACTGT [...]
+NODE 18 1180 70151 70066 0 0
+TAGCCAATAGTCAGGAAGTAGAGAATGCCGCAGATGAGCATCGGGAGACCGATTTTTGCGTATTCAAAAAAGCCAAAGCCGCCGCCAATATTCTGTAGCGCAGACTGCGCGATAAGATTTCCCGGCGCGCCAATTAACGACAGGTTACCGCCCAACGCAGCGGCGAAAACCAGCGGCATCAGTAGACGAGAACGCGAGAAGCCCGATTTTGCCGCCACGCCGATCACCACCGGAATCAAAACCGCAGCGGTACCGGTGTTAGAGAGGACGCCAGACATCAAACCCACCACCACCATAATGGTGAAGATCAGCTGTTTTTCTGTTTTCGCGAAGCGCGTGATGACGCCGCCCACTTTGTTTGCCATACCGGTCTCGAACAACGCGCCGCCCACGATAAACATCGCGACAAAGAGGATGACGTTAGTGTCGATAAAGCCAGCAAAGGCCTGTTTGATATTCAGAACTCCGGTGATCACTAAGGCCACGCAGACA [...]
+CGGATAGCCCAGGTGCATTATGCCGCTGAAAAGGCTCTCGCGGAAAATAACTCGGCGGAATACTCCGACCTGAATCAGGCATTTCATATGGAAATATGGAATGTTGCTGGCAACGAAAAAATGAAAATGTTGCTCTGTAATATGTGGAACGGCTTGTCGATGGGCCATAAGGTCACCGAAGAAGAGTATGCCGTGATTTCCATTCAGGAACATAAAAGTATTCTGCAAGCTCTTGAACTTCATGATGAAACATTGGCACGCCAGCGCATGCGCGAACACATTATTCGCTCGATGGAGAATATGCTGACCCGCTATGTTGGTGACCCTTCTGCCTGATCTTTTCGCCTGCGTGAGCATCGCAGGCGCTTCAACCAATTCTTCAATTCTATTAATCACGTCCAGTAACGATCTAACCACGATCTTGATGTAGATCTCACTCCTGCATCTTTCCTGAGAAACGATTTGACTTAGTTTTTGTATGGGAATAATTTC [...]
+NODE 19 5480 298687 294609 0 0
+AAATATTTATTATTTAATGCTGATGATCCTTTAAATAAAAAACACTTGTCTTTGGGTTTTTAATGGAAAATACTTTGCCGCGCCTAAGGGATGTTATTTATTAACGTGTTGTTTGCTTCTTTTGAATGTTGCATCGGGAATTTCATAACTCGTCATATAATATATATCTACCCATATAAACATGGGGTATTGAGTATAGCTCCGTGTGAATAGCGTAAAAATACTCACCAACTTTTAATAAGGATGAAAAATGAATACAGCAGTAAAAGCTGCGGTTGCTGCCGCACTGGTTATGGGTGTTTCCAGCTTTGCCAATGCTGCGGGCAGTAATACTGGTACGGTGACTTTTACCGGTACTATTGAAGATTCACCGTGTTCAATCGTGGTTGGCGACGAACACCAGACCGTTAACCTGGGCCATATCGGTACCGGTTCTCTGATGGGCGGTAAAGAATCTTCAAAAGTCGATTTCCATATCGGTCTGGAAAACTG [...]
+GGCTACCGGAAAAATGCAGGTTATCTGCCGCTGAGACCGGCAATATCAGCGCCCCACAGAGGATGCAGGCCGCGCCGTGTAATAACGCCTGTCTTTTAGCCATTACTGATAATCCACCTGTAATGTTGCCGTCGCATCGAAGCCGCCTTCTTTCAGCGAAGCACCGCTCTTTTTAACCGGTATGGCTTTCAGAACAGGTATCGATTGTTCATTCACCGTAATGGTGGACCCCAACGTAAAGGGTTGGTCGTTCTGCCTGAGTTCAATCCCCAGTCCCGCCACGCTGGTGTTTACCGCCGCCGGATTAAAATCACTCACGGAACCGCTTAGCGTCAGGGTCATCGCCATCGTCTCATCGCGCACCGTTGAATCACAGGTGATCTCATACGGAACATTCTGCGCATAACGCGTACCATCTATTTTATTAATCAGCAGGTTACCGAACTCAACGTCGATCGTCTGATCATTGTTAATCGTACAATTCGGCGGTGA [...]
+NODE 20 5560 280743 275115 0 0
+CGTCGGCACCTATCAGTCGATGCGCGGCGGGCTGGAAAATGAAGATGCGGACGGGGTTTTCGACGCTCTGCCGTTCCTGATCGCCAATACGAAGCAGATCATGGGGTTTGGCGAAACCAGCGACGAACCATATGTCAGCATGGAAGGCAAACGCGTGGTGGTGCTGGGCGGCGGCGATACCGCAATGGACTGCGTACGCACTTCCATACGCCAGGGCGCAACGCACGTAACCTGTGCTTATCGTCGTGATGAAGAGAACATGCCGGGTTCCAGACGCGAAGTGAAGAACGCGCGCGAGGAAGGTGTCGAATTTCAGTTTAACGTTCAACCGCTGGGCATTGAAGTCAATGCCAACGGCAAAGTGAGCGGCGTAAAAATGGTGCGCACTGAAATGGGCGAACCGGATGCCAAAGGCCGTCGGCGGGCAGAGATCGTCGCCGGTTCCGAGCATGTGGTTCCGGCTGATGCGGTGGTGATGGCGTTTGGTTTTCG [...]
+GACGATCTGGCGGGATGCGACGCCAAAACCCTATTTATTCGCGCTGGCGAAGGTCATCAGCAGGCGCGACATCTGGTAAGCCAATCCGCGCAGGTAATAGCGCGAATGATCGCCGATGTGAAAGCGATTACCGACTGCCAGTGTGTGGTCATTGGCGGCAGCGTAGGGTTAGCTGAGGGATACCTGGAGCAGGTTCGCGCGTTTTTGATGCAAGAGCCTGCGCCTTATCACGTGGCGCTGAGCGCCGCTCGCTATCGGCATGACGCAGGATTATTAGGCGCTGCGTTGTTAGCTCAAGGAGACACATTATGATGATGGGGGAAGTACAGTCGTTGCCTTCTTGCGGGTTGCATCCGCGACTGCTGGATGCCTTGACTCTCGCGCTGGCGGCAAGGCCGCAGGAGAAAGCGCCGGGGCGCTATGAATTGCAGGGCGACAATATCTTTATGAATGTAATGCAGTTAACGACGCAAATGCCGACCGAGAAGAAAG [...]
+NODE 21 5497 303244 301326 0 0
+ACGGCGACCTGCTGGTGGTGGATAGCTCACGGAACGCTGACCACGGTGACATTGTAATTGCGGCAATTGAAGGAGAGTTCACCGTAAAACGGTTGCAGTTGCGCCCGACAGTGCAGCTAATCCCCATGAACGGCGCCTATCGACCTATACCTGTCGGCAGTGAAGACACGCTCGACATATTCGGGGTGGTGACCTTTATCATTAAAGCGGTCAGTTGATTATGTTCGCGCTCTGCGATGTTAATAGCTTTTACGCCTCCTGCGAAACGGTCTTTCGTCCTGATTTATGTGGCCGACCGGTGGTGGTGTTATCAAACAATGATGGCTGCGTTATCGCGTGTAGCGCCGAGGCGAAACAGCTCGGTATCGCACCAGGTGAGCCATACTTCAAACAGAAAGAACGCTTCCGGCGATCCGGTGTTGTTTGCTTCAGCAGTAATTACGAGCTTTACGCTGATATGTCGAACCGGGTAATGACCACACTCGAGGAGAT [...]
+CATGTACGACACCAGAAAATCCGCATTACGCTGCGCCAGGTACTTGCCCCGTTCGGTCTGCATCGTCAGCGGCAGTTTCAGCAGCTTGGTTTGAAAATGGTCGAGCGCGAATTGCTTATCGTTAAGAGGCCGTCTGTCGGCAAAGGGATCGTCGGCATCAAACAGCGCGACGCCCAGCGCGCCGGAGACCGCGAAGACCCGCGCCAGACCAATGGCGCCCAACGCCTCCAGCCTGTCTGCATCCTGCACGATTTTTGCCTCTGGCGTGGTAGGCGCAATTTTTGCGCTGAAACTATGCGCTTCGATAGCATGACAAATGCCCGTCAGTTTTTCTGCCGGAAAGTCAGGAAAATCCCGCAGAAAAATACGCCGGGTTTCTGCCGCCGCCAGAATGGAAGAACGATGCCGCTGCGGATGATTTTTCGCCAGGCTGACGATGTCATGGAAATAACATGCCGATAGCACCACCAGCCAGTCGACAGGAACGTTTTC [...]
+NODE 22 3982 211514 209357 0 0
+ATCTCGTCGATCACGTCCGCATCTTTACGGCATTCGACATGCGCGGTGGCGCGAATCTGATCGTCAACGCTAAACAGTTTCTTCGCTTTCGTTCGGCTCATCACACGCCCGGCGCCGTGGCTGCACGAACAGAACGACTCTTCGTTACCCAGCCCGCGCACGATAAAGCTTTTCGCCCCCATCGAACCGGGAATGATACCGAACTCACCGCGCCGCGCCGAAACTGCCCCTTTACGCGTCACATAGATCTCTTCGCCAAAGTGCTGCTCTTTTTGCACATAGTTATGGTGGCAGTTGATCTCGTCCATATCGAGGGCGATCGGTTTTTCCACGCAGCGCTGGAGCGCCGCCAGCGCGTTTTCCATCATCGCCTCGCGGTTCAGGCTGGCGAATTGCTGCGCCCAGTGTACCGCTTTCAGGTAATCGTCAAAATATTCGCTTCCTTCATTAAAATACGCCAGATCGCGGGACGGCAGCGTTTCTAACTGCTCC [...]
+ACGGGCCGCTGAACTGGTGGCGGGCCAGTTTTAGTTCATAGATGCGACGGGCGAGAAACGACTTGCCCGCGCCGGTCGGGCCATTGAGCAGGATTGGCGAACGGGAGCGTATCGCGACGCGCTCAATTTGCTCAATCATCCGGTTGAAACACGGGTTGCGGGTTGCAATGCCGGACTTCAGGAAGTTGAGCGTCTCCTCCCGCTCCTGGGCGAAGCGGGTGGCGATGTCATTGTAGCGGCTGAGATCGAGGTCAATGATCGTCACGTCGCCCGTGCTATGCGGTTTATCTTTTTTGCGCGGCGGCGAGGTCTGCGCTAATCGCGCCGGTAGATAGCGCGCCTCCGCCAGCAGGAACCAGCAGATCTGCGCGACGTGGGTGCCGGTGGTGATATGAATCAGATAGTCTTCATCTTCGGGATGAAAGGTATGGCTGCGGGCGAAATCGTGCAGGCAGGCGTAAACCTCTTCGAAGTCCCACGGGTTGCGGATCG [...]
+NODE 23 675 36793 36379 0 0
+TCAACAACCGATCCCATAAAATGAATCTGAGCGGTCGGTTTCGCTGTCCCTTCATGAACGATAAAGGAAAGTAAAATCACCGGTATGACGCAACGCATAGACTTCATTTTACTTTCACTCCTGTGCGTTCTCCTCTGAGCGAATATCACCCCTTCGCTTTCTGAATCGCCATTTGCAACATATCCTGAGTCGTGCTTCCCGGGATCACGGTCACCCGTTTTACATCACCGTTTTGCGTCTGAGGCATGACGACAAAAGCAGGCGTGCCGCTAAAGTCCATATGCTGCGCCAGTGCCTGGTTAGTGAGGAGCGCATCATGTACTGCACCACTGCTTTGCGCTTCTTTTACGGCGGCCAGCTGCGTCGGCGTTAGATAATGTTGCGCCAGGGTATAGACATCGTGTTCCGTTAACGCGCCTTCCACCTTCCCTGTGGCATAAAGCGCATTATGCCAGTCGAGATATTTCGCCCCACCCTGGGTAAGCCATACCT [...]
+TGGTGCAGCAAAATGGCGCCTGTGGTCGAAAACCTGATTAAGACGAACCCGGATACCCGGTTTATTTTCAAAGAGTTTCCTATTTTTTCCTCCCGCTGGCCGGTATCCGGACTGGCGGCCAGAGTTGGCGAGCAGGTATGGCTTACCCAGGGTGGGGCGAAATATCTCGACTGGCATAATGCGCTTTATGCCACAGGGAAGGTGGAAGGCGCGTTAACGGAACACGATGTCTATACCCTGGCGCAACATTATCTAACGCCGACGCAGCTGGCCGCCGTAAAAGAAGCGCAAAGCAGTGGTGCAGTACATGATGCGCTCCTCACTAACCAGGCACTGGCGCAGCATATGGACTTTAGCGGCACGCCTGCTTTTGTCGTCATGCCTCAGACGCAAAACGGTGATGTAAAACGGGTGACCGTGATCCCGGGAAGCACGACTCAGGATATGTTGCAAATGGCGATTCAGAAAGCGAAGGGGTGATATTCGCTCAGA [...]
+NODE 24 40 2259 2216 0 0
+ACCCACCCGCTAACAAACACGGTGCACAGTACCGTCAGCA
+TGGATGGAAGATGCGCAGCGTTTACCGTTATCAAAGCTGG
+NODE 25 1411 81309 80153 0 0
+ACCACCTTGCCGATCACGTCATCTTTCTTCTCTGAGATGTAAAACTGATACAGCCAGCCGATCACTTCGACCTGTTCCCAGTCTTCTGCAGGAATGGTGTCTACCAGCCCACGTAGAATGGAGTCGGTGCGGGTCAGATTATCCGGCAGCACTAGCTCAATTTCATCATTAACTGCTTCGAACAGGAAAGGCATTGCACCGTGCAACGCATGACACTGGGCAAGCAACAGTTCCCGGTACAGCTCTTCGTCACGATCGCCCGCCAGCTTCATCTCCACCAGGCGCACTTTGTCCAGCCCAAGAGCATCAGCCACTTCCGGCACATGATCCAGCACCTCAAAACCCCCTGCCAGCGTCGGGTGAGACAGCATACGGAAACCGTGCTCCAGATAGCCATGTAGCTCCATATAGCGAATAGCGCAGAAGCGGTTAAACCAGGTGTAAGCAATGTGCTCCACCAGCACGTCGTAGCCCTGCTTTTCTGCACGCTTG [...]
+AATGCGCTGGATAAAGACGAAACGGCTCAAAAGGCGTTGCAGGATTTGGAGGGCATCTACAGTAAGGCACGACCTTACGGAGAGCTGCACCGGATTATCCCGCTGATTGAAACCGTTGAAACCATCAACCAGCGTCTGGTGGAAGAATACCGAAACCATGCGCTGCAGCAGATCGATGTCCATATCAATGAACTGAAGCAAAGCATGCTAGAGATGCTCGTCCCTGCTGACTTGCAGCACTCGCTTTTGCACCCGATGCAACAATCGCGTAAGAAAGTAGAGCAGAACGGTCTGATCCCGCAAATCATGGAAGAACAGGCTGAGGTTCGGGCGCTACAATTTAAAGCAAACGAACGACTGAACGGTTGGGTTGAAGAACAGCGTAAGAAAGTGCCAGAACCCAAACCCGCCCCTCAGCCAGGGGTTATCGACCCAGTAGTTAAGCCTGAACCCAAGCTGAAAAAGACCATCTACGTGAACACGCGTAAAACG [...]
+NODE 26 3882 207784 206721 0 0
+CCCGCCGCGGACGATATTTTGATTGTCGATGACGCGCTGGAGCATACCTGGCAGGGGAGGGCGGCGGTCGTCTTTTGCCGCCGTCATATCGGGATTCCATTGGAAAGAGCGCCGGGCGAGTGGGTGCATAGTGTGGCGTCGGTGCATGAGTTGCCCGCGCTGTTGGCGCGTATCTATAGTATTGAGCTGGATAGTGAAGCGCTTTCCAGCGCATTGCCGACGACGGATAAAACCGCAGATTCAAATGACGACATGATGATTCTGGTCGTTGACGATCATCCGATCAATCGCCGTCTGCTGGCCGATCAACTGGGATCGCTGGGATATCAGTGTAAGACAGCCAATGATGGCGTGGACGCTCTGAATGTGCTGAGTAAAAATGCTATCGATATTGTTCTGAGCGATGTGAACATGCCGAACATGGACGGCTATCGCCTGACGCAGCGTATCCGTCAGCTTGGGCTGACGCTGCCTGTCGTCGGCGTGACGGCG [...]
+GCCGCGACCACTACGCCATCGACAGGTGAAGGACTTCAGGAAACGCGTCTGAAGCAGGATGTGTATTATCTTGAAAAGCCGCGACGTAAAACTGAAGCGCTGATTTTCGGTTCCCATGACAGCGCCACGCTGGAAATGACGCAGCGTATGTCAACTTATCTGGATACGCTGTGGGGCGCGGAAAACGTGCCGTGGTCCATGTATTACCTCAACGGACAGGATAACAGCCTGATTCTTATCTCTACCCTACCGTTGAAAGATCTCTCTTCCGGCTTTAAAGAGTCCACTATTGGCAATATCGTCGATTCCCGCCGGGCAGAGATGTTGCAGCAGGCGAATGCGCTGGATGAGCGCGAAAGTTTCTCCTCATTGCGAAAACTGGCCTGGCAAAACGGTCACTATTTTACGCTGCGCACGACCTTCAATCAGCCAGGACATCTGGCAACCGTGGTGGCGTTTGATCTGCCCATTAATGATTTAATCCCGCCGGGA [...]
+NODE 27 11576 615819 612398 0 0
+TATTGTGCTTCCCGGTCTGCTGGACGGACAGAAAAAGCATTATCAGGATGAATTTGCTGCGATTCCACTGGTACCGAAGCCTGGCGACCGCGATGAGCCGGATATGATGCCTGCCGCAACGCAGGCGCTGCCGACACAGCCGCCGGAAGGGGCGGCTGAAGAGGTACGGGCGGGAGATGCGGCAGCGCCGTCTCTGGACCCGTCGCGCATGGCGTCTAACAATGTCGAGCTTGATCCGATACCGGTGGAGACGCCTAAACCGAAGCCGGTTGAAAAGCCGAAGCCGCAGCCTAAACCGCAACAGCCGGTTGTCGCCGCTTCCACGCCGACGCCCGCGCCGCAACCAGTCGCCGACGATAAACCTGCGCCGACCGGCAAAGCCTATGTCGTACAGTTGGGCGCGCTGAAAAACGCGGATAAAGTCAACGAGATAGTCGGCAAGCTTCGTTCCGCCGGGTTCCGGGTTTATACTTCCCCCTCAACGCCGGTACA [...]
+AATCGGAATAGATAAGATCCTGGTTGGCATAAGCCACCACATCCACACCTTTTGTGCGCCAGTTATCATTGGCGTAAGCCTCTTGCGTGGACCCTTGCAGCACGCCGACATGCTTGCCTTTCAGCGATTCCAGCGTCGGCTGAATGGGAGACCCTTTTGCCGCAATCAGGCGTGAATCCGCCGCGTAAAGTTTGTCGGAAAACGCAATTTCTTGCTGGCGTTTATCGGTGATAGAGAGCGATGAAATAATGGCATCAATTTTTTTCGCTTTTAGTGAGGGAATAAGCGCATCAAAGTCGCTGGCGACCCAGGTACATTTCACCTGCATACGCTTACACATTTCATTACCGAGATCGATATCAAAGCCAATAAAGTCGCCTTTGGCATCTTTCGATGAGAAAGGCGCGTAGGTGGTATCTGTTCCAATACGAACCGTTTGCGGAAGCGCGGCGTAACTGGCCGCCGTCGCGCCCAGACCTATCAGCAAAGACA [...]
+NODE 28 17891 957362 942141 0 0
+AGCTGTTTGTCGCCGGTATTCGCGAACTGATGGCCAGTGAGAACTGGGAAGCTTATTTTGCCGAGTGCGATCGTGACAGCGTCTACCCTGAGCGTTTTGTAAAAGCGCTGGCGGATATGGGTATTGATAGCCTGCTGATCCCGGAGGAACACGGCGGTCTGGAAGCGGGTTTTGTTACCGTCGCCGCCGTCTGGATGGAGCTGGGACGTCTTGGCGCGCCAACTTACGTGTTGTACCAATTGCCGGGAGGTTTTAACACTTTCCTGCGTGAAGGAACTCAGGAGCAAATTGATAAAATCATGGCGTTCCGGGGCACCGGTAAGCAGATGTGGAACTCTGCTATCACTGAACCGGGAGCGGGATCGGATGTTGGTAGTCTGAAAACCACTTATACACGCAAAAATGGTAAGGTTTATCTCAATGGCAGTAAGTGCTTTATCACCAGTAGCGCCTATACCCCGTACATCGTGGTCATGGCGAGAGACGGTGCAT [...]
+ACAAACGCTGGCGAAATATGCGACGTTATTTGCTGACGGATGCAGAATAGAGTGAATCTAATATTTAAACGCATTTATTTGCAAAAGGATGTATTGCGTCGCGAGTCGGTCGCCATGTTTCTGGAGGGCGTGGGACTCGCCCTGGAAGATGATTGTGAAATCGCGGTATGCGCATATTGGCAGGGTGAGATAGTTGGATGCGGCTCGCTGGCCGGAAACGTACTGAAATGCATCGCCGTTTCCCCGGTTTTACAAGGGGAAGGGCTCAGCCTCAAACTGCTGACTGAGCTGCTTACATTGGCCTACGAGTTAAACCGCAGCGAGCTTTTCCTGTTCACTAAGCCGCAAAATCGGTTGCTGTTTTCTGGCGCGGGGTTTTGGCCCATTGCGCAGGCAGGTGAGCTGGCGGTGTTAATGGAGAACAGCAGTGAACGGTTAGCGCGCTTTTGTCGCCAACTGGCGCTTTATCGTCAACCGGGAAAAACGATCGGC [...]
+NODE 29 111 6115 6115 0 0
+CGGATTTTCGGGAACGAAAGATAAAAGATTCGTTTCCGGCAACAGAATTTGCCTGGCGGCCGTAGCGCGGTGGTCCCACCTGACCCCATGCCGAACTCAGAAGTGAAACGC
+GGCCGCCAGGCAAATTCTGTTGCCGGAAACGAATCTTTTATCTTTCGTTCCCGAAAATCCGGAATCAGTGCTGAAAATCTTCTCTCATCCGCCAAAACATCTTCGGCGTTG
+NODE 30 14 6917 6664 0 0
+CGTAGCGCCGATGG
+GACCACCGCGCTAC
+NODE 31 3 1467 1450 0 0
+TAG
+TGG
+NODE 32 4295 254069 251439 0 0
+CGCGTTATCGATCTGGTCGAATGCGCGGGCGGCACCGCCGTAGGTTTTAGCCAGTACGGTAGTAATGGCAGCGGTCAGCGTTGTTTTACCATGGTCAACGTGGCCGATAGTACCGACGTTAACGTGCGGTTTTGTACGTTCAAACTTTTCTTTAGACATCGATTGTCCCTCTAAGACACGGATAAATCGGTGATATCACCACATCAACCAGGCAACACGCCCGACTTGTTGAATGCTAATAAACAGAAGAGAAAAACAGGAAGGAGAAAGGAAGTGGTGCTGATAGGCAGATTCGAACTGCCGACCTCACCCTTACCAAGGGTGCGCTCTACCAACTGAGCTATATCAGCACATCTTGGAGCGGGCAGCGGGAATCGAACCCGCATCATCAGCTTGGAAGGCTGAGGTAATAGCCATTATACGATGCCCGCATCCTGGAACTCGGCTACCTGATTTTCATTCTGCACTGAATATCGAGAGAAACTCTCTTTA [...]
+AAAGACTGGGCCTTTTGTTTTATCTGTAGTCTGCCGGATGGCGGCTCCGCCTTATCCGGCCTACAGGGACGCGCCGATCCACCCTCAATATAACCACAAGCCTTCCCAACACAGATACGGTAAACTATTGCCGATTGAGTATCAGGAAAGCAGCCATGACCCACTCCCTAAAACCCTGGAATACCTTCGGCATTGATCATTGTGCAAAGCACATCGTATGCGCTGAAAACGAACAACAACTACTGAGCGCCTGGCAGCAAGCAACTCGTGAGGGACTGCCGGTTATGATCCTGGGTGAAGGAAGCAATGTCCTGTTTCTGGAAAATTACGCCGGCACCGTGATCCTTAACCGCCTGAAAGGCATTGAGGTCAATGAAACCGCGGACGCCTGGCACCTACACGTCGGCGCAGGCGAAAACTGGCATCAGCTGGTTCGCTACGCGCTGGATAACAACATGCCCGGCCTGGAGAATCTGGCGCTCATCCCTGGCT [...]
+NODE 33 9595 474338 470715 0 0
+CGAAATTTCACCCAATGCGACTCCATGTTGATTGGCGCGGACTGCGGCGCGCATACGTTCCCGTATGTTGAATGCCGCAATAACAGCGCGCAGCTGGAGCACGAGGCGACAACATCACGCATCGGTGAAGATCAGCTTTTCTATTGTCTGCAACGCGGCATCAGCGAAGAAGACGCTATTTCGATGATCGTCAACGGTTTCTGCAAAGACGTTTTCTCGGAACTACCGCTGGAGTTCGCCGTTGAAGCGCAAAAACTGCTGGCGATTAGCCTTGAGCACAGCGTCGGTTAATGATGAAGGAAAAACCATGTTAAGCATTAAAGATTTACAGGTCAGTGTGGAAGAAAAAGCGATTTTGCGTGGCCTGAATCTGGAGATTCGCCCCGGCGAAGTTCATGCCATTATGGGGCCGAACGGTTCCGGGAAAAGCACGCTCTCCGCCACTCTGGCGGGACGTGAAGATTATGAGGTCACCGGCGGCTCGGTTACGTT [...]
+CGGAAGAAGCCGTTCATGTTCAGCGATCTAATGCGCAGTTCGCCGCCGACCCTACGGGTTATCACATTTTATGGGGAACCAATGAACTGGCGGCAAATGGCAAACTTGCCGACTGGGATATTACGCCCCATTTATGCCAGATACGCTGTCCTGTTCTGGTATTACGCGGCGAAAACGATCAGGCAACCGAGCGCGTCGTCTCTCCGCTGCTCTCTCACATTTCAGACTGCCGCGCGGTCACTATTCCCGGCAGCAGCCATAACCCACATGAAGAAAATATCGCGCCCTGCCTCGCAGCGGTAAGCGCGTTTTTACGCGATCTGGCATAAAAAGCCATTAAGGTATTTATCATGAAAAAAGTCAAAAAATTGTCTCTTACCGATTTAGTGCTTTATGGTCTGGTGTTTATGGTGCCTATCGCGCCAGTCTCTCTTTATGGCGTCGTTTATAATCTTTCGCACGGTATGGTTGCGCTGGTTTATATTATTGGCG [...]
+NODE 34 51 2884 2836 0 0
+TATATCTTTAAGCAAAAAAAAGAGCGACCTGAGTCGCTCTTACCAATGACT
+ACCCGTCATACTTCAAGTTGCAGGTGTGTTGGCTATGCTTTCTCACCCGAA
+NODE 35 2091 114298 113020 0 0
+GTGTCATCTCAACTTATTTGGAGATGTGAGCAATCAGGTCCAGTACTTTGTTGGAGTAACCGGTTTCGTTATCGTACCAGGAGACCAGTTTCACGAAGTTGTCGTTCAGCGCGATGCCTGCTTTAGCATCGAACACGGAAGTGCATACTTCGCCGTTGAAATCGGTAGATACAACGTCGTCTTCGGTGTAACCCAGAACGCCTTTCATTTCGCCTTCGGCAGCAGCTTTAACAGCAGCTTTGATCTGCTCGTAGGTAGCCGCTTTTTCCAGACGAACGGTCAGGTCAACAACGGATACGTTCGGAGTAGGAACACGGAACGCCATACCGGTCAGTTTGCCATTCAGTTCAGGCAGTACTTTACCTACCGCTTTAGCAGCGCCAGTAGAGGACGGGATGATGTTCTGAGATGCGCCGCGGCCGCCGCGCCAGTCTTTGTGAGACGGGCCGTCAACGGTTTTCTGGGTTGCGGTAGTCGCGTGAACAGTAGTCA [...]
+AAATCCGCTTTGAGCTGCTGCTTGCTTTTCATCACCATCTGACCGTGAGTATCGATCGTCATATGTTGCGCTTCGGTATTGTGCCGCGCCTGCCATAGCATCACCAGCTGCAGGCTGTTTTCTTTCTGTTCCGGCGTCAACGCCACGCCATCCGGCCATTTACCCAGCTCAACGGCGGTGGATAAACGTTGATACACTTCCGGCGTCATGCTGTTAATGATCTCATCAAGATTCATGATGTGTCCGCTCCTGTGGAATAATTTGCTGAATCGTTTTTTCAGCCTTTCAGTTGATCGCCGTTTTTCTCGTCAGAAAAGGCCAGCGAGGCCGAATTAACGCAATAGCGCTCACCGGTTGGCTGCGGACCATCCGGGAAAACGTGTCCGAGATGCGCATCGCAGTTACCGCAACGAATTTCGACACGCTGCATGCCATGAGAAAAATCGTCTATGTAACGAATCGCCTCTTCGCTGACAGGCTGGTAAAAGCTAG [...]
+NODE 36 7116 402455 398230 0 0
+CTAATTATAACCTGTTTTAGGGGGTAATACTGTTATTTTGTACAGGCATATAACGTAAAAGCCGATATCCGCTGTAATAAAAAGTTTCGCGCAGTAAGAAGCGGGTTTGCGCCCACCAGGATTTATAGCGGGTGGATCGCGTGGGTGATGAGCGGCTATCGATACCATTATCCTGAGCGATAGTTTTCAGACGCAGCATATGCAGCGGATCGCTGACCAGTAACGCTGTGCGCCATCTTAACTCCAAAGGGTACTCCCGCCGACATAAGGCGGGAGGGGAATTTGGACGGGCTTGAAAAGCCCGAAGGATCATCAGCCACGCTGTTGTTGAATGTATTGCTTCACAACTTCCAGCGGCGCACCTCCGCACGAGCCAGCAAAGTATGACCTCGACCAGAGCACGGCTTTTCCGTATGCTCCCCGCAAATCAATAAATTCGTTTCGCAGACGGCGGGATGTCACAGCTTTCAGTGAGTTAACCAGTACCGAAAG [...]
+ATCACTCGTCTGTGCCATAAGCCAGGCAAGGTCGACTACTCCCGCTATATTGGCGGCATTTACTCCAGCGAATGGTTCTGGGCGAAGATTCTGCACGTCACCCGCCAGGATAGCGCCGTCGCGCAGGCCGCCGTCTCGTGGATTGAACTGTGTGACTGGGTGCCGGCGCTGCTTTCCGGCACCACTCGCCCGCAAGATATCCGCCGTGGCCGCTGCAGCGCCGGGCACAAAACGCTGTGGCATGAAAGCTGGGGCGGTCTGCCGCCCGCGAGCTTTTTTGATGAACTCGATCCGTGCATTAACCGTCATCTGCGCTACCCGTTATTTAGCGAAACCTTCACCGCCGATCTGCCCGTGGGCACCCTGTGCGCCGAATGGGCGCAGCGCCTCGGCTTACCGGAAAGCGTGGTGATTTCCGGCGGCGCGTTCGACTGTCACATGGGCGCGGTCGGCGCGGGCGCACAGCCCAATACGCTGGTAAAAGTCATCGGC [...]
+NODE 37 4601 325811 324435 0 0
+GTGAATAGTATGTTAACTCAAAGGTATGATATTAAGGTAGCGATTGATGCGTTCAGATTTTACGCAGGCTATTTTATACAATTATTATTCAGTACTTCTCGGTAAGCTTAATACGCACCATCTCGCCGCAAAACAACTTTCGCTGTTTTAAACAGAATGGCAATATCATTCCAAAGCGTCCAGTTTTTAACATACCAGGAATCAAAATAAACACGAGTGTCATAATCAACATCATTACGCCCACTCACTTGCCATAGACCTGTCATGCCCGGCTTTGCCATCAAATAATAATCAACATCATCACAATAACGCTCCAGTTCATCCGAAACGATAGGTCGTGGTCCAACCAGACTCATATCACCTTTTAGTACATTAAAAAGTTGTGGCAACTCATCAAGGCTAGTTTTACGTATAAATCGACCTACAGCTGTGATTCGAGGATCATTTTTCAGTTTAAAATCTTTTTCCCATTCAGCTCTGGCAATAGGATCG [...]
+CTTTGTTAATGAAAAGTGGAATCTTTTCAAAACAGAACAGATTATTAAACGTTAATTATGGTTTATTGAATGTCTAAATTAATACCAGTAATAATGGCCGGTGGGATTGGTAGCCGTTTGTGGCCACTTTCACGTGAAGAGCATCCGAAACAGTTTTTAAGCGTAGATGGTGAATTATCTATGCTGCAAAACACCATTAAAAGATTGACTCCTCTTTTGGCTGGAGAACCTTTAGTCATTTGTAATGATAGTCACCGCTTCCTTGTCGCTGAACAACTTCGAGCTATAAATAAACTAGCAAATAACATCATATTAGAGCCAGTGGGGCGTAATACAGCCCCAGCTATAGCGCTGGCCGCTTTTTGTTCACTTCAGAATGTCGTCGATGAAGACCCGCTTTTGCTTGTCCTTGCTGCGGATCATGTCATCCGCGATGAGAAAGTGTTTCTTAAAGCTATCAATCACGCTGAATTTTTTGCAACACAAGGTAAG [...]
+NODE 38 2718 148567 144958 0 0
+CGACATCAAGAACGCCAACCTCGTCGTGGTGATGGGCGGTAACGCCGCAGAAGCTCACCCGGTCGGGTTCCGCTGGGCGATGGAAGCCAAAATTCACAACGGCGCGAAGCTGATTGTGATCGATCCGCGCTTTACGCGTACCGCGTCGGTGGCCGATTTCTATGCGCCAATACGCTCTGGTACTGACATTGCCTTCTTGTCAGGCGTGATGCTGTATCTGCTGACCAACGAAAAATACAACCGTGAATACACCGAGGCCTATACCAATGCCAGCCTGATCGTGCGTGAAGATTTTGGCTTCGATGATGGTCTGTTCACCGGCTACGACGCAGATAAGCGGCAGTACGATAAAACCAGTTGGCACTATGAGCTGGACGAAAACGGTTTTGCCAAACGCGATACGACACTGCAACACCCGCGCTGTGTCTGGAATCTGTTGAAACAGCATGTCTCACGCTATACGCCGGACGTGGTAGAAAATATCTGCGGTAC [...]
+TTCCACTTCCGAGAAGCGCATCACCGTCCAGGATTTCGCGGTTAAGTCCGCCGGGTTGTCATACACCCCGACGTTATTGCCCACTTCATCACGGATGTCGTTCCACTCGGAGCACGCCACCTGACACGCTTTACAGCCGATACAGGTGGTGACGTCGATGAGTTTCGCCACCTCTTCCTGGTGGTCCCGCGCCTGGGGCGCGGGGGTGAAACCGTTAGTGGCGGAACGACGAATGATGTCTTGCGATTGATAAGCCATAGGTCGTCTCCGTTACACCTTTTCCACGTTCACAAGGAAGGATTTAAACTCCGGCGTTTGCGTGTTCGCATCACCGACGAAAGGCGTTAACGTATTGGCGATAAAGCCTTTTTTCGCCACGCCTTCGTAGCCCCAGTGAATAGGAATACCGATGGTATCGATATCCTTGCCGTCCGCTTTCAGCGTGCGAATACGCTTGGTCACCACCGCTTTGGCTTTGATATAGCCGCGGTT [...]
+NODE 39 6333 369013 367271 0 0
+TTCAGCAGCAGATTAGCCATCGCGGCCACTGCGGGGCCAAAACGAAAACTCTGTGTCATCCAGAGACGGTCGGCACCGGCCAGAGACGGATGAGACAGGGCATCATCCGCGCCACGAAAACGGTAGATCTGCTGATACCGGTCACCGACCAGCACAATCCTGCACCGCTGTCCCAGTACAAGAGCGGAAGTCACCGGATTCGCATCCTGCGCTTCATCAAACAGAATGGTGTCCCATCTGCGCGAGAGATCAGGTCCGGAGAGCTGAAACAATTTGAGATAGGTATCATGGGTGACCGGAAACGTTCCATCCGGATCGCTCATGGCCTGCCAGAGCGTCCTCACAGCACGAAGTGCCTCATCCGGAGCAACGCCTTTCATTTCGTCCTTGTCCGGCAGATGCTGCCTGCCGGGGGTTGCATCCGCTGAGCCGATAAACTGATTCAGCCCTGTCATGGCCACCCGGGCCAGTGCCCAGTATCGGGTATTCAGT [...]
+AGTTGTCTTGTGACGGAGAGAAAACGGACAGATGGCTCGCTGAAGCGCTCTGCCAGCTGGTTAGCCGGGAGTAGCGTCTGTATCTGCAGGTCATACTCTTTCCACGGTGGCTGGATGATGTTTCCGTTTTCATCAGTGAAGCTGTTATTGACTTCCTGCCAGTCAATCTGCAGTTGAACTGACTGTGCGAGTGTGGTCAGTCGTTCCTGCAGGTCACTGGTTTCCGGAAGGGAATCAACCGGGACAGGATTATCCGGGAGCCGGAATGTGACCGGCAGTGCAACACCGCCAGAGTTCCCTTCAGGCATCACAATAAACGGCCGGGTGTCTGTGAGTTCAGTGATGCGCCGGATGAAGGCTGTCACTGTCGTGCCTGCTGTATTGGTGTATGAAGCCCGCAGATTACCGCTGTTACCGTCAGTAGAACATTCAGCCAGGGTATAACGCCATCCGGCAGCAGACAGTGGCGTCTGGTTCCATGTTGTGCTGCAT [...]
+NODE 40 13448 690578 681669 0 0
+GCTGGCTATGCGCCTCACTCACCGCTGGCGCGCCATAATTCAAACGCCGCGCAATAAAACTTTCGCTTAGCGGCGATAATGCGCCGCTGTGCAGCGCCTCGGCCCACAGCAAACAGGTACGCGCGCTTGAGCCGGGAATATACAGCAACGATTCGCCATCGATATCCACCTGCTCACGCCCCTCAACCGCCATCACCAGCAGCGGGAAAAAGTCCGGTCGATGCTGACGGCACCAGCGCAGCAACAGATCGTCAAGCTGGGTAGAAGGATGCGCCCACCACTGCGCGTAAAGTTCTGGCAGCAGGCTATCGCCTTCACCGCAAAATACGCGCTGGGCTAAGTAGTAATAACCCGGCGTTGCGTTATCGGGTTCGGCTTCCTGCCATGCCAGGGCGACAGGCAGCAGCTCCGCAATACCCCAGTGCAAGGTGCTGAACCAGCGTAACAGACGTCGTTGAAAGCGTAGATTGTCCGGGATAATCCAGGCGCCGT [...]
+TTTATCAGGCGCTTTGTCAGCTCCCCCTGCTGACGGTCTATCCCGGGCGGGCAAACTATCTGTTGTTACGCTGTGAGCGAGAGGATATTGATCTGCAGCGACGGTTGCTGACGCAGCGGATTTTAATCCGTAGCTGCGCTAACTACCCGGGGCTGGACAGCCGCTATTATCGTGTGGCGATACGCAGCGCTGCGCAAAACGAGCGTCTGCTGTCGGCGCTGCGCAATGTGCTTACCGGTATAACCCCTGCTGATTGATGTAGTTCAGCACGTTTTCCGGCAACAGATCGTCGCAGGATTCGCCTTTTTCCAGCCGTTCGCGGATGAGGGTTGCGGAGATATTAAGCCAGGGCGTTTCCGCCAGGTAAATTTTACCGGCTGGCAACTGGTGCAGATCGTCCGGCGTATGGGTCAGATGCTGTTCCAGCCACTGCTGGTGTTGCGCCTGCGTCATTTCAAGGGGGTAGCCGGGACGACGACAAACGATCAGGTG [...]
+NODE 41 6087 310668 308282 0 0
+GGAAATCGCCACCACATTGCGTTGCGGATCGGCAGCACAAACTCCTAATGCCGCCGGGATTGTCCAGCCAAGAGGCCCCGCCTGGCCGCAGTTGATCCAGTGTCTGTCTTTAAACACATGCAGCATCTGCGCTGCCGCGATTTGCGACAATCCAATGGTGGTGACATAGCACACATCGCGACCAAAGGCTTTGTTCATCTCTTCATAGACGCGCTGCGGCTTCACTGGCACGTTGTCAAAGTGGGTTTTACGCAGCAAAGTCCGTTTACGCTGCTGGCATTCGTCCACCCAGGTCTTCCGGCATGGCAAACGCCCCGCTTTTTGCATCTCCTGCGCGACATCGATCAGCAACGTTAGCGCCGCTTTGGCGTCCGAAACGATGCCCAGATCCGGACACAACACGCGGCCAATTTGCGTTGGTTCAATATCGATATGGATGATTTTTCGCCCCTGAGTATATTTCTCAACGGACCCCGTATGACGGTTGGCGAA [...]
+TTGCTGAAAATTTTGTTTATCGGCGATTCGGCGGAGCAGCCGGTACTGTCGGAGGTGGCGATCAAGTTTGGCGTCGCGGTCAATATCCTGCATGGCAAGATTGAATATATCGGCGAACGCGCGTTGGGCATTCTGGTGGTGCAATTAACCGCGCCGCATAATCCAACGGCGGTGGCCGCCGCCGTGGAGCATATCCGTCAACGTACCGCACAGGTGGAGGTGATCCGTGGATGATTTATTGCCGGATTTAACGCTGGCGTTCAATGAAACTTTCCAGATGTTGAGTATTTCAACGGTGCTGGCGATTCTTGGCGGTCTACCGCTCGGTTTTCTGATTTTTGTCACCGATCGTCATCTGTTCTGGCAGAACCGTTTTATTTATCTCGTCGCCTCGGTTCTGGTGAATATTATCCGCTCGGTGCCATTTGTTATTTTACTGGTGCTGTTACTGCCGCTAACGCAGCTTTTGCTGGGTAATACGATTGGCCCGAT [...]
+NODE 42 30481 1691282 1675149 0 0
+GCTTTGGCACTAATCTCAATTTGGCTGAGCATCAAACAGTTTGGTATCAAAACACCGAAAAGCGATGCTATGATTCTGGCAGGGATAATATTATCAGGATCATTTTCAGGGGTAATGACCTTTATCTTGTTTTACCTTCTGGAGTGGGCGTTCCAATATTTGAATAAGGATGCGATAAAGAAAAAACTTCCACTGGCGCTGGTCTCATTAACCCTGTTTTTGGTTGGGGTAATTATTGCATTTCCTTATATCGCGACACGACTTGGCGATTTAGGGACGGAAGGCTCATCTTCTTATTATCGTATTGTGGGCCCGTTAGTCATGGTCGGATATTCCTTGACCCATATTGATGGTGTAGTCAGATTTGGCTCACTTTATGAATATGTTGCATCATTCGGAATCTTTAACGGTGCGGATGTCGGGAAAACCATAGACAATGGATTGTATCTGCTGATTATTTATTTTTCCTGGTTCGCAGTGCTAATGACGCTG [...]
+AATTATATAAAGTGCGTAAATAAGCGCAGCAACAAGTATTGCTCCTCTAGTAAGACTCATGCAGATCGCTATAAATAGCACAAAACTAATAATAAGCATCAATAATCTTTTATATCCTTGGGAAAAACACTCCATACATAACAAAACACCTAATGTGAGCATATATCCAAAATTGAGAGCATCACTAAAACCGCCTGTAGCCCGGACCATCCCATCATAGCTATTAATTAAGTTTAATTGTTCTCCTGCATAATGCTCATCATATCCGAGCAATTTAATGAACTCTCCATTCATTAGTACATCAATAATAGATATTGTCGCAACTATAAACATTAGAAAAATTATGTAGCAAACTATTTTTTCAATATTTAAGGATTGCGGGTATGACACTTTTAAAATCACTAATGCTATGAAAACTGCCGGGAATAAAATATAACTCCGCCCCCCCATAATTGCTTGAATTTTATCCGGTGAGAATATAGTTAACGCTAT [...]
+NODE 43 7170 345404 340152 0 0
+GACGTTGGGCTTTCGTCAACTGGCGAACAGTCGCTGGCCTGCGACCCCACTCTATTGCCTGAGCATTAATTCCGCCGAACTGGCGAAAACCATCGCTGGCGACGGCGTACTGAATGTGCGACTGAAATTACGCGGCAGTAGCAAAGATAGCGCCCCGGAATCGTTCATATTAAGTGATGCCTGGCTCCAGGACGGGACGCCGGTCGCCGCCGATGCGCTGACATTAAAATTGAATACGCTGGCTGGCCGTCGCCACAGCGGCAGCCACTACTGGATAGATAGTGGGAGTGTATACCTGAAATGACAAAACCGTTAAACACCACCCAGGCTGTTATCGAGTGGGTTAACAACACGCGCCGTTACGCAACGCGACTGGATGACGAAGCCGACGCTCTGCTGGCGCAACTTACGCTTGCCGCGGCGGATGAGTCAGCGCTCAACGCCGCCTGCGCATCACATGGCTGCGTTGGTCTGTACGGGTATGCGCAATCC [...]
+CAGGCGGCGTAATGGTCATATAAGCAAAATATAACCTCTCCGTTTGTGATAAGGCACAGATTACAGGGGGGAATGATGTTTATTTTAACCATCTGTTTAAGCGCTGTCCGCTAATCTTTACCTGCTCAAATACATAATCACCCCTGTGACTCTCGCGAGGTGTAACATATGGTAAAATGCGTATCTTCTTTCCTCCTGTTCAGCCTGTTGTCCTTTCAGGCAATGTCAGCTGAAAGCCATATTGATCTCCACCAGCCAAAAGACTTTGTCGATATTACTACGGTCGCCCCCGACGTACAGGTAGACATGCGATACTTCACTTCCCATAACTTTATTGGTCGCCCCATTAAAGGCTATAACGCGCCTGTTTGCCTGTTAACACGACCAGCCGCAAACGCAGTGAAGCAGGTCGCCGATCGTTTACGCCCCTTTGGACTTACCTTAAAAATATATGATTGCTACCGTCCGCAAAGCGCAGTGAACGACTTTATC [...]
+NODE 44 11474 633319 623000 0 0
+AGATTTTTACCGAAACCGAATCCGGGGTCGAGCAACAATTTCTCTTTTGCGATGCCGGCCTTCTCACAACGTGCTATTTGCTCAATAAAGTAGCGATTCACCTCGGCAAAGACATCGTCATATTTCGGCGCCTCCTGCATGGTTTTGGGGTTGCCCTGCATGTGCATAAGACTGACCGGCAAGCCGGTTTCCGCTGCCGCTTCCAACGCGCCGGGCTCGGAGAGCGAACGGACATCATTGATAATATGCGCGCCCGCCCTTGCCGCTTCACGGATCACCTCGGGTTTAGAGGTATCCACAGAAATCCACACTTCAAAACGTTGCGCGATTGCTTCCAGTACCGGAATAACGCGATCCAGCTCTTCTTCCACGCTCACTTCTGCCGCGCCTGGTCGCGTTGATTCCCCCCCCACATCAATAATTGTCGCCCCGGCATTCACCATTAAATTCGCATGTTTCACCGCCTCAATCAGCGTGTTATGCGCGCCGCCG [...]
+GCGATCTCTCGCGGCAAAATCCTCTGCCGTAACGCGCAACCGGACACTCTGGACGCAGTACTGGCGAAACTGCGCGATGCTGGCGCGGATATCGAAGTGGGCGAGGACTGGATTAGTCTGGACATGCACGGCAAACGACCGAAGGCGGTCAATGTCCGTACCGCGCCGCACCCGGCATTCCCGACCGATATGCAGGCGCAGTTCACGTTGCTGAACCTGGTGGCGGAAGGGACGGGCTTTATCACTGAAACCGTCTTTGAAAACCGTTTTATGCACGTGCCTGAACTCAGCCGCATGGGCGCGCGTGCGGAAATTGAAAGCAATACCGTCATATGCCATGGCGTAGAAACGCTCTCTGGCGCCCAGGTTATGGCGACAGATCTGCGGGCATCTGCGAGCCTGGTGCTGGCGGGCTGTATTGCGGAAGGCACGACGATTGTGGATCGCATTTATCACATCGATCGCGGTTATGAGCGCATCGAAGACAAACTG [...]
+NODE 45 1247 63283 59502 0 0
+AGATCGCCATACGGCAGGACCAGCGGTAGCTCAGGTCTGGCGACAGGTTATCTTTGATGTAGCCCAACGCGTCCAGTAGCGATGTTGTTTCATCATAAGGAACTTCATAGAAAGCACTGTGCGGCGCGGTATCGGTTTCCGGGTTATAGCGCACCACCTCAACTTTCAGGTTTTTCATCTCAGCCATTCGCCTTCTCCTTCTTATCGGCTGCTTCCGCTTCACCGCCGTAAACACGCTTAGCTGGCGGCAGGGTGGTGATTTTCACGTCGCTGTATTCCAGACGGGTCGTGCCATCAGCATCGCGGAAGGCGAGGGTGTGCTTGAGGAAGTTCACATCGTCGCGCTCGGTACAGCCTTCATCCAGACGCTGATGCGCGCCGCGGGACTCTTTACGCGCCAGCGCAGAGTGCGCCATACATTCCGCCACGTTCAGACCATGACCCAGTTCGATGGTATACAGCAGGTCAGTGTTGAACACGCTGGAGGTATCG [...]
+AAATGGCTACCGTTACCTGCAAGACTACGGCATGGGCCCCGAAACGCCGCTGGGCGAGCCGAAAAACAAATATATGGAACTGGGGCCGCGCGACAAAGTATCCCAGGCTTTCTGGCACGAATGGCGTAAAGGCAACACCATCTCCACGCCGCGCGGCGATGTGGTTCACCTCGACCTGCGTCATCTCGGCGAGAAGAAACTGCATGAACGTCTGCCGTTCATTTGCGAACTGGCGAAAGCCTATGTCGGCGTCGATCCGGTTAAAGAACCGATTCCAGTACGTCCGACCGCGCACTACACCATGGGCGGCATTGAAACCGACCAGAACTGTGAAAGCCGTGTCAAAGGGCTGTTTGCCGTTGGCGAATGCTCCTCTGTTGGCCTGCATGGCGCGAACCGCCTCGGTTCCAACTCACTGGCGGAACTGGTGGTATTTGGTCGTCTGGCTGGCGAACAAGCAATGGAACGCGCTGCGACGGCAGGCGCCGCAAA [...]
+NODE 46 4799 260792 258898 0 0
+GAAAAGGCGATAACGCATGGCCCTTACACCCGTTATGATTTTTACGCATAGCCGCTAATAAAACGGCATTTTTTATATACACATCAAGTTGATAGTGTGTTTCTGACCTTGACGTAAATAAGCGGGAAAAGCGATGAAACACACCATTGGGATACTGGGGGGGATGGGACCTGCGGCAACGGCGGATATGTTGGAAAAATTTGTTGAATTGCGACATGCCAGTTGTGATCAACAACACATCCCGCTCATTGTCAGCTCTATCCCTGATATTCCCGATCGTACAGCATGTCTGTTATCCGGCGGGCCTTCGCCATACCGTTATCTGGAGCGTTATCTGCATATGCTGGAAGACGCCGGGGCAGAGTGTATCGTTATCCCATGCAACACTGCGCATTATTGGTTTGATGATTTACAGAACGTCGCGAAAGCGCGAATGATCAGCATCCTGGACGCTACCCTGGGGGATATTCCGCCATCGGCGCGGTACGTTGG [...]
+CTATATATCCCATTATGATGATTATCGCGCCTTTTCAAATCATCACAATTATAAATAAATCACATCATGAAATTAATTAGATGATTCGTTTTTTATTACCTGCCCGTAGGATTCTTAGGGCGCAAACTGACCCATCAGCGGCTACTGACCTGACCGTGACAATTCCTCTTAAGGCGTGAAAAATTACAGTAAAAAGTAAAATTTAGGTTAAAAAATCCTATTTTTTAACAACGATAATTAAGTGGCGTGAAATTGACTAACGTCAAATTTATTTCTCCTTTTTCCTGCTCCCGGCTCCGGCCTGCGCCAACACCTGTTTCTTTGCTTTTTTACCTCGCGTTATACCGTCCACGGTTCCCCGCGCCTCCGGCAGTAGCGAGGATGGTGATTTTTCGCGCTACTATGCAAGAAACGCATAGCACGATACATACTTGCATTTTGTCCTTACCCTTATGGCTGATAAGGTCTTTCTGTTTCGGGCTTTTTGGCCTG [...]
+NODE 47 17578 948420 936585 0 0
+CCTGGATTCACTGAACGTGCAGAAAGCGTATGATGTAGATAGTAAGGCTGTGACAGTAGCTGCCAATTTAGATATTACTGATCTTAATAAAGACGCAGCCCTTAAAGCAGGCACTGGTGCTACAACAGGTACTGCAGCAATAAAAGATGGCAAAGTTTATTATGATAGTGCTAGCAAAAACTACTATGTTGAAGTTACCGGTCTGACCACCCCTGATGACGGTAAAAATGGCTTCTATAAAGTAAATGTCGCCGATGATGGTAAGGTGTCTATGACCGCTGGTACGGCTATGGAGGCGGGTAAACCAGCTGGTGCGGTAGAAGTAACAAAAACTCAGGAAGAAAAAAATCCATTACCATTATCAACAGATCTCAAAACCTCCCTTAAATCTGGCGGGATTACAGACCCAGAAATTGCTGCTGCCCAGGTTGTCAAAATGTCTTACACCGATAAAAATGGTAAGACGATTGATGGCGGTTACGCTGTAAAGGT [...]
+ACCGATCCCGCCGGCAATAGCGGCCAGCCTTCGGACGGTTTTACGCTGAACATTGACGCGCAGGCGCCAGATGTGCCGGTTATCACGTCCGTGATTGACGATAACAATCAACCGACCGTTCCGGTGTTACCGGGGCAATCCACCGACGATCGGCAGCCAATACTGAACGGAACTGGCGAACCTGGCGCGACAATCACCATTTTTGATAACGGTACGCCGCTTGGCACGGCTCAGGTAGGCGAAAACGGTAGCTGGACCTTCCCGGTGCCCCGCAATTTGTCAGAGGGAAGCCATAATCTGACGGTTAGCGCTACCGATCCGGCGGGCAATACCAGCGCGGTCTCCGCGCCGTGGACGATCGTGGTCGATATTACGCCTCCGGCGATCCCGGTTCTCACCTCCGTCGTGGATGACCAGCCCGGTATTACCGGCAACCTGGTTAGCGGGCAGCTAACGAACGATGCGACGCCCACCCTGAACGGGCGCGGAGAG [...]
+NODE 48 5964 342736 338066 0 0
+ACGTATGTGGTTACTTGACCAGTGGGCAGAGCGTCATATTATCGAGGCACAGCGTAAAGGCGAGTTTGATAATTTGCCTGGCCGTGGCGAGCCGCTTATTCTGGATGATGATTCTCATGTGCCGGCGGAACTTCGTGCGGGTTATCGCTTACTCAAGAATGCGGGCTGTCTTCCCCCTGAACTGGAGCAGCGCAGAGACGCTATTCAGTTACTTGATATCCTCAACAGTATCCGGGAAGATGACCCTCGATACCATCAGGTTAGTCGCCAGCTCTCGCTGCTTGAACTAAAACTTCGGCAGGCTGGGTTGAGTACCGACTTTTTACACGGTGAGTATGCAGAAAAACTGCTGCATAAAATCAACGATAATTAACGGAGCTTGTATGTATCGCATTGGTGAGCTGGCAAAGCTGGCAGACGTAACGCCTGATACCATTCGCTACTATGAAAAACAGCAGATGATGGATCATGAGGTACGTACTGAAGGCGGGT [...]
+GCTGTCAATCAGGTGGGGATTTGTCTAGAATAGAGGTAATAATCTTTTCAACTCCTGAACACAACTCTGGATAATTATGTCAGTTTTGCAAGTGTTACATATTCCGGACGAGCGCCTTCGCAAAGTCGCAAAGCCGGTTGAAGAAGTGAATGCAGAAATTCAGCGTATCGTCGATGATATGTTCGAAACGATGTACGCGGAAGAAGGTATCGGTCTGGCCGCAACGCAGGTCGATATCCACCAGCGGATCATCGTGATTGACGTTTCGGAAAACCGCGACGAGCGCCTGGTACTCATTAACCCGGAATTGCTGGAGAAAAGTGGCGAAACGGGTATAGAAGAAGGCTGTCTGTCGATTCCGGAACAGCGCGCTTTAGTGCCGCGCGCCGAGAAAGTGAAAATCCGCGCGCTGGATCGCGACGGCAACCCGTTTGAGCTTGAAGCGGATGGTTTGCTGGCAATTTGCATTCAGCATGAGATGGATCATCTGGT [...]
+NODE 49 7978 419053 415058 0 0
+CAACTAATTAAAATGTTTTTGCGCACTTTCATATGAAAATTTACTTAAGGTATTGTCTGTAAGCGTCTTGTAAGACAAGGTGAAACAGGCGATTCTATCTTCGTCGACAGGGAGTCGTACAACGAAGCGAACGTCAGGATGATGACGCTTCAGCAGGACACGCCAGGATGGTGTTACAAGGAAAGGCTTCAGGATGAAGCAAAGTGGAAAGCGCAGGATGCGTTAAAGGACACCTCCAGGACGGAGAACGAGAGCCGATCAGGATGTTCGGCGGGTCTGGATGACCAGGGACGCTTCAGGAAGAAGCTATCACATCGGGCGATGTGCGCAGGATGCAAACGTTCAGGATGAACAGGCCGTAAGGTCACAGGAAAAGTTGTCACGGATGAGCAGGGAGCACGAAAAGTAGCTGGAATGCTGCGAAACGAACCGGGAGCACTGTTTATACAGTGCTCCCTTTTTTTTGTTATTCTTCGCGCCAGATTTTCATCA [...]
+TGGATAATGTCGCGCGTGAAGCGAAGAAGATATTAGGCTGATATTCGCCGGATGGCGGCGTGACCGCCTTATCCGGCCTACAACTCAGCGTAACTGTTGCCCCGCTTTCAGCGTTGCAGCCACGTTGCGCGCGGTCATTCGTACGTTTTCACTCGCATTCTTCAGCGCGTCCTCCAGCGTGCAGATGGTATAAATCACGCTGAAAACCGCATCAAGCCCATGTTCATGAACCACGCCAACGTCCGCCGTCAGGCTACCCGCGATACCAATTACCGGCTTGTTATACCGTTTGGCGATGTTTGCCACGCCAATAGGGACTTTACCGTGAATGGTCTGGCTGTCGATGCGTCCCTCGCCGGTGATGACTAAATCAGCATCCGCAAGACACGCTTCCAGATGAAGCGCATCGGTGACAATCTCAATACCACGCCGTAGCTGCGCGCCGCAAAACGCGTATAACGCCGCCCCCATGCCGCCTGCCGCTCCGCCGCC [...]
+NODE 50 2088 120640 118316 0 0
+GGTACCACGGTGGTAGATATTGAAGGGCGTCTTGGGCAGCCCGCCAACGCGCAGGTGGCGCTGGCGCTGGATGTGGACGGTTTTCGTCAGTGGGTGGCAGAGGTGTTTGCCTGTGCGCCGTAATTACATGTTGGCGCCATAATCTCATACTTTGCCGCGATAGAGTCTCTCCGGCCTGCCCACTTTCCCGTAGCTGATCTCCGCTTCGAGAAAGTTATTTTTCACGCCTTGTTCCAGATAGCGTCGGGCAGTGGTTTTACTGCTGCCCAGAATTTGCGCCAGAGTGTCTGCTGTATGTACTGCCTGCGGGTCGGCGAATATTTGTCGTACCCGGTTGAAGGTGTTTTCATCAATTCCCCGCAGTCCGCTATTCGGTTCTGCGGTTTGTTCTTTGGCCTGGATATTAAATAAGGCATCAACGTGCGTCTGGTTTGCCTGCTCACTGGAACGTAACGAACTGCGGTAACGGGTGAACCGCTCCAGGGTATGCTG [...]
+TCATTAGGCTCTTCCCTACGTGGTAAATCCCCGATTCAGGACAGTACCGGTAAAGTCATTGGTATTGTTTCCGTCGGCTATACTCTGGAACAGTTGGATAGCTGGCTTAACTTACAAATCAGCTCGTTGCTGTTCCCGATGGCGTTACTGCTGCTGGTGCTGTTGTACTGCGCCCGCCGCTTCTCGCTGCATATTAAAAAGCAGATGCTTAACATGGAGCCGCAGCAGCTTTCACAACTATTAATTCAGCAAAGCGTGTTGTTTGAGTCGGTATTTGAAGGGTTGATCGCCATTGACTCCCATCACCGTATTACCGCCATTAACCAAACGGCTCGCCGCTTACTGAATCTGAGCCAACCGGAGTCTGAACTCATTGGCTATGCAATCCACCATATCGTGTTGCCGGAGGCCTTCTTTTACGATGCGCCGCAAAAAAACAAAAAAGATGAGATCGTCACCTTTAACCAAATGAAAGTCATCGCCAGTCGCATG [...]
+NODE 51 5185 276735 275931 0 0
+AGCCCAGGAGCAGGAACAGAAATGAGCCAGGTGATCCTCGATTTACAGTTGGCCTGTGAAAACCACGCGGGCCTGCCGGATGAAGCTCAGTTTCAACGCTGGCTGGACGGCGTTATTCCGCAGTTTCAGGAAGAGGCGGAAGTCACAATCCGTCTGGTGGATGAGGCCGAAAGCCACGACCTTAATTTGACGTACCGCGGGAAAGATAAACCCACTAATGTTCTCTCCTTCCCGTTTGAAGCGCCCCCCGGCATTGAAATGCCGCTACTGGGCGATCTGATTATTTGCCGTCAGGTCGTGGAGCAGGAAGCGCAAGAACAGAGCAAGCCGCTGGAGGCGCACTGGGCGCACATGGTCGTGCACGGTAGCCTGCATTTGCTGGGTTACGATCATATCGACGATGACGAAGCGGAAGAGATGGAGTCTCTCGAAACGGAGATTATGCTTGCTATGGGCTATGAGGATCCGTACATTGCCGAGAAGATTGCAGAA [...]
+GGCGTGCGCCGAGTAATCCAACAGTTTGCCTGCCTGCGCTGCCATATCCACCAGACCGATGGTTGACGCGATGGCCGAGTTTTTCACCAGGTTCATCATCTCTGACGTCATTGGCGGCACGATAACGCGATAGGCATTCGGCAGCAGGACATAGCGATAAGCCTGCGGCAGCGTTAGCCCCATCGCCAGCGCCGCGTTCTTCTGCCCGCGAGGCAAAGACTGAATCGCAGCGCGTACCTGTTCGCAAACACGGGCGGCGGTAAACAGTCCCAGACAGATCATTGAGGAGAGGAAAAACTGAATATTGGGATCGAGTTCCGCCTTAAACCACATGCCAAGATCTTCCGGCAACAGTTCAGGCACCACCAGGTACCAGGTGAAGAATTGCACGATCAGCGGCACGTTACGGAACAGTTCTACGTACAACGTGCCCAGTCCAGAGAGGAAACGGTTGGGAACGGTACGTAAAATGCCGAAAATAGATCCTACCAG [...]
+NODE 52 3375 206483 202202 0 0
+GCTCGCCCAGTTCGTCCTGGATTACCCGCATCTCTTCCGCCAACATTTCGCGGAAAAGCGCTTTCGTTACGGGTTTTCCATTGCTCAGTGTTTTCTCATGGTGAATCCACTGCCAGATAGAGGTTCGTGAGATTTCCGCCGTCGCGGCATCCTCCATCAGACCGTAAATCGGTACACAGCCATTGCCGGAGATCCACGCTTCAATGTACTGCACTGCCACGCGAATATTGGCGCGCATTCCCGCTTCTGTGCGTTCGCCTTCACATGGCTCCAGTAACTGTTCAGCGGTAATCGGCGCATCTTCATCACGGGTAATGAACAGCTGATTTTTGTGCTCGCCCAGTACCTCGTTAAAGACGGCCATTGCGGTATCCGCCAACCCGGGATGCGCAATCCACGTGCCGTCGTGGCCGTTGTTCGCTTCCAGCGCTTTATCCGCTTTCACTTTGGCAAGGACCTGATTGTTGCGTTCAACGTCTTTGCTCGGGATAA [...]
+TCGCCTTATCCGGCCTGCATGCACTTATCAGGCAGCGCCACTACTCACGGATAAATTAAATTCAACAATGGATACGGTTTCCCAAGATCGTCAACCTCCGAACGTCCCGTCACCTTAAATCCCATTTTCTTATAAAATCCAACAGCTTGTGTATTTTGCTCGTTAACATTGGTTGTCAACCCCGGCGCCAGTGTTAACGCATGTTCAACTAATCTCTTACCGATACCCTGACCACGCACGTCCGGATCGACAAACAGCGCATCCATATGTTCGCCGGTAAGCAGCATAAATCCTACCGGCTCATCCTGATCGGTCACGGCAACCCATAGTGGCGCTTCTGGCAGAAAATCGCTCACCAGCTCTTCCAGTTCGGCCCGATAAGCGTTTGACAGAAAATCGTGCGTGGCATCGACTGAGCGACGCCAGATCGCAATCAGTTTTTCCCCTTCCTCATGCCTTGAACGGCGAATGTTAATCATCATCTTCACTCCT [...]
+NODE 53 3872 191051 188720 0 0
+TGACCTATATGACCGGCGACGCGGTGTTATTCAGCAACGACGCCTTTGGTCAGCACTACTGCGACGAGCGCCTGTTCAATGATGAAGTGGACCAAACTGAACTGTTTGAACAATGCCAGCGCTACTACGCCAATATCCTGACGCCGTTCAGCCGTCTGGTAACGCCAAAAATTACCGAAATCCTCGGCTTCAACCTGCCGGTGGATATGATTGCCACCTCACACGGCGTGGTATGGCGCGACAACCCAACGCAAATCGTGGAGCTGTATCTGAAATGGGCGGCAGATTATCAGGAAGATCGTATCACTATTTTCTACGATACCATGTCGAACAATACTCGCATGATGGCGGATGCCATCGCGCAGGGTATCAACGAAGTGGACCCCAACGTGGCGGTCAAAATCTTTAACGTCGCCCGCAGCGATAAAAATGAAATATTGACCAACGTCTTCCGTTCGAAAGGCGTGCTGGTCGGCACTTCTACCATGAACA [...]
+TGAACGCCGGAGGCATTATTGCCGTTAAAGGGCTGGGTGGTTTTCATCTGGCCTGCGATGCGCGCAACGATAACGCAGTGGCGATGCTGCGGGCGCGTAAACATCGCCCGGCGAAACCATTGGCGGTGATGTTGCCCACGGCGCAAACGCTGCCGAGCGCGGCGCGTTCGCTGCTGACCACGCCAGCGGCCCCGATTGTGCTGGTGGATAAGCAGTATGTACCTTCGCTGAGTGAGGGCATCGCGCCAGGACTTACGGAGGTGGGTGTGATGCTGCCAGCCAACCCATTGCAACACCTCTTGTTGCAGGAGCTCAATTACCCGCTGGTGATGACATCCGGCAACCTGAGCGGCAAACCGCCCGCCATCACCAACGAACAGGCGCTGGACGATTTACACGATATTGCCGATGGTTTTCTGTTGCACAATCGCGACATTGTACAGCGCATGGACGACTCTGTTGTGCGCGATAGCGGCGAAATGCTGCGTCGTT [...]
+NODE 54 9629 479478 475374 0 0
+TCCGCCAACTTTGACACGTTACCGTGGTACCAGAAAATCACCGATTATTTGTGGCATATTACGCTACCGGTGTTGGCGACCGTCATCGGCGGTTTTGCCGCCCTGACGATGCTGACGAAAAATTCGTTTCTCGACGAGGTGCGTAAACAGTATGTCGTTACCGCTCGCGCTAAAGGCGTGAGTGAAAAAAACATTCTCTGGAAACATGTTTTTCGTAACGCCATGCTGCTGGTGATCGCCGGGTTTCCCGCCACTTTTATCAGTATGTTTTTCACCGGCTCGCTGCTAATTGAAGTCATGTTCTCGCTCAACGGCCTGGGGCTGCTGGGTTATGAAGCAACCGTTTCGCGCGACTATCCGGTGATGTTCGGCACGCTTTATATCTTTACCCTGATTGGCTTATTACTGAATATCCTGAGCGATATCAGCTATACGCTGGTCGATCCACGCATTGATTTTGAGGGACGATAATGCCGCGATTAAGCCCGGTCA [...]
+GGCGGCGACCGGACGCCTGCGTGACGAGCTGGCGAAATATCCCTTTGCGGACGGCGGCATTGTATTGTTCTGCCATTATCGCTACCTGGCGGTGGAGTATCTGCTGGTTACGGTACTGAACAACCTGAGTAGTATGCGGGTCAATGAAAATCTGGACATTGACCCGACGCATTATCTTGATATCAACCATGCGGATATCGTGGCGCGTATCGATCTTACCGAGTGGGAAACTAATCCGCAATCGACCCGCTATCTGACGTTCCTGAAAGGTCGGGTAGGGCGCAAGGTCGCTGACTTCTTTATGGATTTCCTCGGCGCCAGCGAAGGGTTGAACGCCAAAGCGCAGAATCGCGGCCTGTTGCAGGCAGTGGATGATTTCACCGCAGAAGCGCAGTTGGATAAAGCAGAACGTCAGAACGTGCGCCAGCAGGTGTACAGCTACTGCAACGAGCAGTTACAAGCCGGGGAAGAGATTGAGCTGGAGTCCCTATC [...]
+NODE 55 405 19250 19099 0 0
+GCTTTGCAGCGATCGATCGCCTGGCGCCACACTTTCGCCACCTGGCTGACATAGGCCGGGCTGCGCTGGCGACCTTCGATCTTCACCGAAGCGATGTTCGCCGCCATGAGCTCCGGCAGCAGTTCCAGCGTGTTCAGGCTGGTTGGCTCCTCCAGCGCGTGATAGCGCTCGCCGTCCACTAAATAGCGGCCTTTACACAGCGTTGGGTAGCCCGCGTTTTCGCCATCCTGGTAACGGTCAATCAGGACATCATTCAGGCGCGATTCCAGCCCCTGCGGCGTTTGCTGCCAACGGACAAAGCGGGCGGGCGAGCAGGCGCCGACGGTATTGGGCGACTCCCCCGTCAGGTAAGAAGAAAGATAGCAGCGACCTTCCGCCATAATGCACAGGCTGCCAAACGCGAAT
+CTTCTTACCTGACGGGGGAGTCGCCCAATACCGTCGGCGCCTGCTCGCCCGCCCGCTTTGTCCGTTGGCAGCAAACGCCGCAGGGGCTGGAATCGCGCCTGAATGATGTCCTGATTGACCGTTACCAGGATGGCGAAAACGCGGGCTACCCAACGCTGTGTAAAGGCCGCTATTTAGTGGACGGCGAGCGCTATCACGCGCTGGAGGAGCCAACCAGCCTGAACACGCTGGAACTGCTGCCGGAGCTCATGGCGGCGAACATCGCTTCGGTGAAGATCGAAGGTCGCCAGCGCAGCCCGGCCTATGTCAGCCAGGTGGCGAAAGTGTGGCGCCAGGCGATCGATCGCTGCAAAGCCGCCCCGCAAAACTTCGTTCCACAGCGCGACTGGATGGAGACGCTCGGCG
+NODE 56 1523 90423 89345 0 0
+GCGATAAATAGATATGGTCGGCGGCAGCGCGCACCTCCGGGTATTCCTCCGGCCAGAAGTGGGTATGCAGTCGGTTAGTATTGGATAGCACCACCACGCGATGCCCCTGCTCGCGCAGTTTATGCATGATAGCAATCACTTCGGGCCGTAATCCGACAAATACCGCCTGCCAGCCGTGCGCAAATTGTTCATAACTGAGCGATAACGCCATTTCATGACAGAAAGCTTCAGCAAACGCTTCGTCCGTTATCTCACCGCGTTCATGTTGGTGAAAAGTCTCGCCCATCGTAAATTTTTGCTTCAGCGAAGCCAGCGGTACTCGACTCAGATCGCTCCACACACCTAATACGCGGTTAAAGTCGATGTCGACAATCACATTACCTAAATCAAAGATGTAGAGCATGTCATTCTCCTTGCTAACCGGGGATGAATAACTGTAGCGGGAAAGGAGAAGTTTGACTATGTATCCCTTTATAAATCAATTAACAAAAA [...]
+TGATTGTGAGCAAACCCGATCTTTCTTGTCACTTTTTGTATAATATGAGCAGTAGGAAGCTTTTAGAGGAATGCTCATGAGTCTTACCGAACTGACCGGTAATCCGCGACACGATCGGCTGTTAATGCTTATTGATGAGCGCGGCTATATGAATATCGATGAGTTAGCCAGTTTGTTGGAGGTCTCTACCCAGACGGTTCGCCGCGATATTCGTAAATTAAGCGAGCAGGGGCTGATTACGCGTCATCACGGCGGCGCCGGCAGAGCGTCCAGTGTGGTCAATACCGCCTTTGAGCAGCGAGAGGTCTCCTGGACGCAAGAGAAAAAAGCCATTGCGGAAGCCGTGGCTGACTATATTCCGGATGGCTCCACGATATTTATCACGATTGGAACGACGGTTGAGCAGGTGGCGCGCGCGCTGCTCAACCATAATCATCTGCGCATTATCACCAATAGCCTGCGCGTCGCGCACATTCTTTATAATAACCCTCG [...]
+NODE 57 5489 272521 270966 0 0
+CAAGTTATGAATGGTATTGAGACGCGCACCTAATATTTCGTTGCAACGGTCGAGATGATGCAAGTAAGCGCGTGAATAATTGCGACAGGTGTAGCAATCGCACTCGGCGTCAAGCGGGCTGGTGTCGCTTTTATGCTTTGCATTACGAATCTTCACCACGCCGTCGGTCACAAACAGATGACCATTACGGGCATTTCGCGTTGGCATGACACAGTCAAACATGTCAATACCGCGACGCACCCCTTCCACCAGATCTTCCGGTTTACCCACGCCCATCAGGTAACGCGGTTTGTCAGCCGGGATCTGCGGGCAAACGTGCTCCAGAATGCGGTGCATATCTGCTTTCGGCTCACCGACAGCCAAACCGCCGACAGCGTAGCCATCAAAGCCAATCTCTACCAGACCTTTCACCGAGATATCGCGTAAATCTTCGTAAACGCTGCCCTGAATGATGCCAAAAAGCGCATTCTTATTGCCAAGGCTATCAAAACG [...]
+CAATATCGCGTTAGGGCAGCCCCGTCGCCGTTACAGCTTTAAATTGCTTTGGCATGACCGCCAGCTTTGGTTTACGCCGCAGGGTTTTAACCGCTTCCCACCGGCGCGGCTGGAACAGTTTGCCGTTGATGTTCCGGACAGCGGGCCGCAGTGGGTCGCCGATCAAATTTTTTATCAGATCTTCCCGGATCGTTTTGCCCGCAGCGCGACGCGTGAAGCCGATCAGGACCGGGTGTACTACCATCATGCCGCGGGTCAGGAGATTGTGCTGCGCGACTGGGACGATCCTTTAACCCCCCAGGCGGGCGGTTCCACCTTTTACGGCGGTTGTCTGAATGGCATTTGTGAGAAGCTGCCGTATCTGAAAAAACTGGGCGTCACAGCGCTATATCTGAATCCGGTATTTACCGCGCCAAGCGTCCATAAGTACGACACGGAAGATTATCGCCATGTCGATCCGCAATTTGGCGGCGATCGGGCACTGCTACGCCT [...]
+NODE 58 14583 672073 665559 0 0
+CGGCGACGTTGGTTTTTACAGACGGCGAGCTACGCGGCGCGCTCAGCGGCATTCATCCTTGGGCTGAACTGCTCACGCTGATGCGTTCGATGGTTGACACTCCCGCAGCGCAGGAGACAGTACAATGAGCAACGCCTTTTTTCATCTGCTGGGGCCAGGTACGCAGCCTGATGACGCCAGTTTCTCGATGAATCCCTTACCGCTCACCTGTCAGGTCAATGGCGACCCAAGTATGGCGGCGCTGGAGCGCTGCGCTCACAGCCCGGCGGTGATGGCATTGTTGACCGATCTGCGAGGTCAGCTTGCCCGGCGCATTCCGGAAGTCGGCGACGTGCTGGGATGGGAGTTATCTCCCCTGAATGCCGATGATCTCTCATTCCTCAATACGCTATTGGGCGAAGGCGAAGTCTCGGTACGCATTCAGCATCCGGACGGGAGTGAAAGCGAGATCCAGGAGGCCATCTTCTGCGGCCTGTGGCGGGTACGCCATCT [...]
+CAAGAAACCAGCGCGGCGAATGCCGGACAAATTTCACCGGGATATGCGGCGCCCTGGGCGGCCCCTGGCGTACCGCTGAAGGCGATAAAATGGATGTTCCAGCGCCATGCGCCGCTGGCGGTGCGTCTGGATGGCACCCCGTTTCAACTGAAGTGGATGTGGCAAATGCTGCGTAACTGCGATACCCGGCATTATATGGAAAATAAAGGCCGCATGGTGCGTCTGGCGGAATATAGTCGCGACTGTCTGAAAACGCTACGCGCCGCGACCGGTATCGAATATGAAGGCCGCCAGGGGGGAACGCTGCAACTCTTCCGCACCGCGCAACAGTATGAGAACGCCACCCGTGATATCGCCGTACTGGAAGATGCCGGGGTGCCGTATCAGCTCCTGGAAGCCAGCCGACTGGCGGAAGTTGAACCCGCTCTGGCTGAGGTTGCGCATAAATTAACCGGCGGACTGCGCTTACCGAATGATGAAACCGGGGACTGT [...]
+NODE 59 4677 249396 246719 0 0
+CGCAATCGGGATGTGTCAGCATCAGCGTCACGATGGTTTCACCCTCTGGCAGGCAGGGGCAGATGACGCGCTTGCATTGTCCAAATCGTTAATCGTCAGGAGTAATTATGTTAAGGGTCTACCACTCCAATCGTCTGGATGTGCTGGAAGCGTTGATGGAATTCATCGTCGAACGCGAGCGGCTGGATGATCCCTTTGAACCAGAAATGATTCTGGTACAAAGCACGGGTATGGCGCAGTGGCTGCAGATGACCCTTTCACAAAAGTTTGGTATTGCGGCGAATATCGCTTTTCCGTTACCGGCGAGTTTTATCTGGGAGATGTTTGTTCGCGTGTTGCCGGATATCCCCAAAGAAAGCGCTTTCAGCAAACAAAGCATGAGCTGGAAACTGATGACCTTGCTGCCGCAGTTGCTGGATAAGGATGAGTTTGTACTGCTGCGCCATTATCTGACCGACGACACCGATAAACGCAAACTCTTTCAGCTTTCCG [...]
+GAGAGCGTCCCCGGGCTACGATTGCCAATCAGATAAGAGACCAGTTCATCGGTCTTGCTACGGAACTGCGCGCTATTGTTATCAATACGAAACTCCACGCGCAGCACTTTACGCGGTAGCGCCGGCACGTAATGAATAATGATGCCCTTCTGCGCCTCGGTGATGACAGGTACGGTAATTTCCGGTTTTTTAATCTGTTTATTCGGCACGCGACCATAGGTTGCGGCGGCAATACTCGCCAGTTCCGGCAAGGGTTTATTACTGTAAATCACCGCCTTCATCAGATTAGCTGAATAGTATTTTTCATGAAAAGCGATCAACGCCTGTTGCACCGGATTGCCCGGCTTATCGCTTAGCGTTTCCAGATTGCCGCCAGAAAAGTGCGAGCCTGGATGCGCTGGGTTAATGGTTTCGGCGCTTACCTGCGCCATACGCATACCGTCGCGGGTGCGCGCCATCGTCAGCTCGGCATTCACCGCGTTTCGTTCGCGT [...]
+NODE 60 3190 154730 149799 0 0
+ATTTTCAGCAACAGACATTATCAGTAAGCATCCCGCAACTCTACATCGCCAACAACGCGCGCGGCTACGTGCCGCCGGAAAAGTGGCAGGAGGGGATTACCGCGCTGATGCTGAACTACAGCTTCAGCGGCTATAAAGAGTACGGTTCCAGCGAAGATTCCGACGATGCGGAATCGAAGTATCTCGCTCTCCAGCCGGGTTTTAACCTCGGGCCGTGGCGTTTTCGCAACTACAGTAACTGGAGTTCAAATAACGGCGAGAGCGGTAGCTGGAACAGCGTTTATAACTATTTACAGCGCGACATTATCGCGCTGAAAAGCCAGTTCACCGCCGGAGACAGCAATACGCCATCCGACGTGTTCGACAGCGTACCTTTTCGCGGCCTCCAGCTCACCTCTGACGATCAAATGCAGCCCAACAGCCAGCGTGGTTACGCCCCGACGATTCGCGGCATCGCCCGCTCAAACGCGCAGGTTATCGTGCGGCAAAACG [...]
+CGGCGGTGAACTCGGTGCTGCCTTTACCGTCTGTGTAATCTTCAATCGGCAATTCGGCGCTACCGCCGGGAACGATGGTCTTATCGTATTTATCGGAAATCCGTATCCCTAAATTCTCATTGTCGGTTTTCAGGTATTCCGGGTTGTGCGGATCGGTTTCTCCGTTCAATGACATTGACAGGTTGGTGCCGTCCGCCACGTTGCTACAGGTAAAGTTTACTTGCGTGGTGACGTGCGAGTTCTGCGGACTGTCGCCGAGATTACGAATATCTTTGCCCTCAATATCCGGCAGCCTGACCTCGATAACCTGCCCGGCGTTGATGGAACAGGACTGCGGCACGGTAATAGTTCCGGACATGGTGACGTGCGCGACAGGGGGAACGGCGGGGGGAATATTATCTCCGCTGCTGCCCGGCGTTTTTGATAAATAGAGATTCATGATCGTTGTTTGCGGGATCGAGATTTCACCGACCAAAGGATGAGTAATATAAA [...]
+NODE 61 1770 84418 83212 0 0
+ATTTTTTCATTTCCTGTTGCTGTGTGGCGGGTCTTACAGCGCTGCTTCGTCAGCTTCGCCGGTACGAATCCGAATAACGCGCATGAGCTCCGCGACGAAAATTTTGCCGTCGCCAATTTTTCCGGTGTAAGCCGCTTTACTGATGATATCGATCACCTCTTCCAGTTGGTCGTCGGCGATAGCCACATCAATTTTGACCTTCGGCAGGAAATTCACGCTGTACTCCGCGCCGCGATACAGTTCGGCGTGTCCTTTCTGACGGCCAAACCCTTTCACTTCGGTGACGGTCAGTCCCTGAATGCCAATGGAAGAAAGCGCCTCCCGCACGTCCTCCAGCTTGAACGGTTTGATAATCACGGTAACCAGCTTCATAGAACCCTCCAGTCAGAATTAGGTAACGGCTGCCGCCGCGCATGGACTCTTCAGAATGGATATTGCAAAGGATGTGCCAGAAGCTGGCGAGCGAGGAAAAGCGCGGTTAGCGGCGCGTCT [...]
+TAATTCAGCAGTTTCGCCAGCAGGCGCGCTTCGGCGAACGCATGGGCGAGGCCAGCCGCTCGCACTACATGGCTCGGATGCAGACGCTGCGCTTAGACGGCTTTTTATTGCGTCCGCTGCTTAGCCTCTTTTCCGCGCTCATTTTATGCGGTCTGTTGATGCTTTTCAGCTTTACGTCTGCCGGCACGATTGAGGTCGGGGTGCTGTATGCGTTCATTAGCTATTTGTCACGTCTGAACGAGCCGCTCATTGAACTGACCACCCAGCAATCCATGCTACAGCAGGCGGTTGTGGCGGGAGAACGTGTTTTTGAACTGATGGATCGCCCGCGCCAGCGCTATGGCAGCGACGACAGGCCGTTACAAAGCGGGGCGATTGATATTGATCATCTGTCGTTTGCTTACCGCGACGATAATCTTGTTTTACAGGACATTACGCTATCAGTACCGTCCCGTAGCTTTGTGGCGCTGGTGGGGCACACCGGCAGCGGGA [...]
+NODE 62 2580 115746 115153 0 0
+GAGCGCGGAATTTGTAGTGCGTAATGAGCATGGTCTCCATGCCCGTCCGGGCACCATGCTGGTGAATACGATTAAACAATTTAACAGTGAAATTACCGTGACAAACCTTGATGGAACCGGCAAACCGGCAAACGGACGTAGTCTGATGAAAGTGGTGGCGTTAGGCGTGAAGAAAGGCCATCGTCTGCGCTTTACCGCGCAGGGTGAAGATGCTGAACAGGCGCTGAAAGCGATTGGCGATGCGATCGCCGCCGGTCTCGGGGAGGGCGCATAATGAGCAGGCGTGTCGCCACCATTACCCTTAATCCGGCTTACGATCTGGTTGGGTTTTGCCCTGAAATCGAACGCGGCGAAGTGAACCTGGTGAAAACCACGGGTCTGCACGCGGCGGGCAAAGGCATTAACGTTGCCAAAGTGCTGAAAGACTTAGGCATCGACGTCACCGTCGGCGGTTTTCTCGGTAAAGATAACCAGGACGGTTTTCAGCAATTA [...]
+GGCCATGATCGCCGCCATCGGCGCGTAAGTTTGCGTACTCAGCAGACCAACGCCAAACGCATACGCCGCTTTGTTCACCGGGCCGCCCATGTCGGTACACATCATCCCGCCGAGAATCGCGCCCAACAGTACCGCGTTTGCGGTTCCCATGGTTTGCAGCCAGTGGGTGAGCCCTTCCAGAATCCCGGCAACCGGTTTACCGATCAGGTAAATCATCGCCAGCCCCACCACCAGACTGGAAATTAACGGGATGATCAGGATTGGCTTCAGCGCTTCCATACTTTGCGGAAGTTTCAGTTTGGTACTGATAAGCTTCGCCATATACCCGGCAAGGAAGCCGGCAATGATCCCGCCGATAAAACCGGAACCGGTGCTAACCGCCAGCATACCGCCAATCAGACCTGGCGTAAGGCCTGGGCGATCCGCGATGGAGAAAGCGATATAACCCGCCAGTACCGGCACCATCAGCGCAAACGCCGAACCGCCGCCAAT [...]
+NODE 63 5573 286572 280239 0 0
+TGGGCGACTAACAGCGGCGGTACGGAAAGCACGCATATTGCGGCAATGGGCGAGGATTTGAATGCGCAGCATCAGCAGATCACCCACACGCATGAAGGCGTATGGGCGGCCAATTCCGGCAGCATTCAGGCTGATGAAGCCGCGCTGACCAGCAACAAGCCGCCGGTACAAGGCCACCCGGAATTAATGCCGCATCAGGGCTAATGATCATGGCCTGGCGATAACGCCAGGCGCTTACGGGTTATTCGGCGACCTGCCACTGCGCGTCTGGCGCAAAACGCGTGATAGCCTGAACTTTACTCTCCGTCTCCTTGCCTAAATCCGCCTGATAAATACGATCGTCCTGGTTGACCATAAAACTCATCACCCCGGTTTCGCCGTAATGCATCGGCCAGGCCAGAAGCGCCGCGCCGTGACCGTCGTTATCGCTGATAATACGGAAATGGTAGCCGTGGTAACCCTCGTCTGGCGCTGCGGGGCTAAAGTTTGGGC [...]
+GCGTCGGCAGTTTGCCGATCAGCGCCGCCACCGCCGCCAGCTCCGCAGAAGCCAGGAAGACGTTCGCACCGGTACCTAAACGGTTCGGGAAGTTACGGGTAGAGGTAGAAACCACCGTCGCACCGTCGGCCACACGCGCCTGGTTACCCATACACAGGGAACAACCTGGAATTTCGATACGCGCGCCGCTCTTACCGAACACGCTATAGTAACCTTCTTCGGTGAGCTGCGCGGCGTCCATACGGGTTGGCGGCGCTACCCACAGGCGGGTTGGCAACTGGCCTTTGTGGCTATCCAGCAGCTTACCAGCCGCGCGGAAGTGGCCGATGTTGGTCATGCAGGAACCGATGAACACTTCGTCGATCTTCTCGCCCTGCACGTCAGACAGCAGACGCGCGTCGTCCGGATCGTTCGGCGCACAGAGGATTGGCTCTTTGATATCCGCCAGATCGATGTCGATCACCGCTGCGTATTCCGCGTCAGCATCGGCTT [...]
+NODE 64 42 3382 3333 0 0
+AGAGCTGGTCGAAGTTCAGGTAACGGTAGGTATCCACCGCCG
+ACTGAGAAAGCGGACGGCGTGATTTTCCAGACTGCGGTGTAA
+NODE 65 39 1989 1989 0 0
+TCTTATCCACCTGCGCCACGTAGGTCTGGTACTCTTCCG
+ACCTACCGTTACCTGAACTTCGACCAGCTCTCTCAGTAC
+NODE 66 13902 662746 653123 0 0
+CTGGTCGCGATGCTGCGCCTGCCCAGCAACCTGAAATCGACGCAATGGCAAATTCTTGCCGGGCCGATCCTCATTCTGCTGATTTTGTCGATGATGGTGCTGCCGCTACCTGCTTTTATCCTCGACTTATTGTTTACCTTTAATATTGCGCTATCAATTATGGTGCTGCTGGTGGCGATGTTTACCCAGCGTACTCTGGATTTTGCCGCGTTTCCGACCATTCTGCTGTTTACCACGCTACTGCGTCTGGCGCTTAACGTTGCCTCAACGCGCATTATTTTGATGGAAGGGCATACCGGCGCGGCGGCGGCGGGAAAGGTGGTAGAGGCGTTCGGTCATTTCCTGGTCGGCGGTAACTTCGCGATCGGGATTGTGGTTTTTATCATCCTCGTCATTATCAACTTCATGGTCATCACCAAAGGCGCCGGACGTATTGCCGAAGTCGGCGCGCGCTTTGTGCTGGACGGTATGCCCGGCAAGCAAATGGCGATT [...]
+TAAAACGACGCACCAGGCTGGTAATTTTGGCGCGAGTTTTCAGGCGCTGCGCCATTTCCGGGCGACGCAAATCCAGATAGCGGTACTTGAGACGCGCCTCTTCGGTATTAACGTGGTTAGCGTCAAGCGGCAGTGAGTCTGCGCGGTTGATGATAGTGAGAGAGGACGCCAGCACTTCAATTTCGCCGGTCGCCATATCCGCATTGACGTTTTTCGCGTCACGCGCACGCACGGTGCCCGTAACCTGAATGCAGAACTCATTACGCAGTTCAGAGGCCAGCTTTAACGCGTCCGCACGATCCGGATCGAAGAACACCTGCACAATACCTTCGCGGTCGCGCATATCGATAAAGATCAGGCTGCCAAGATCACGACGACGGTTGACCCAACCACACAGAGTCACCTGCTGCCCCACGTGGGACAGACGTAGCTGTCCGCAATATTCTGTACGCATGAGATATCCCTTAACTTAGCCGCAGGCGGATTGTTGCC [...]
+NODE 67 1613 92651 91426 0 0
+GTGTATGGCCAGATGAACGAGCCGCCGGGAAACCGTCTGCGCGTTGCATTGACCGGTCTGACCATGGCGGAGAAATTCCGTGACGAAGGTCGTGACGTACTGCTGTTCGTCGATAACATCTATCGTTACACCCTGGCCGGTACGGAAGTATCCGCACTGCTGGGCCGTATGCCTTCCGCAGTAGGTTACCAGCCGACTCTGGCGGAAGAGATGGGCGTTCTGCAGGAACGTATCACCTCCACCAAAACCGGTTCTATCACCTCCGTACAGGCGGTATACGTACCGGCGGATGACTTGACTGACCCGTCTCCAGCCACCACCTTTGCGCACTTAGATGCAACCGTGGTACTGAGCCGTCAGATCGCATCCCTGGGTATCTACCCGGCCGTTGACCCGCTGGACTCCACCAGCCGTCAGTTGGATCCGCTGGTTGTTGGTCAGGAACACTACGACACCGCGCGTGGCGTTCAGTCCATCCTGCAGCGTTATCAG [...]
+TGCCGCGCTCAACACGATAAAACCGACGATGGCGCCGGCGAGATGAAGATAAGCGCGACGAATAAAGGTAGTACGATCAATCCTTGAGTCGGGTTGTGGACCCGCAAAGGATGGCTGAAATGACATAGTAATAATCCCTCATTTTATGCAATAAAAACGCATCCATTCCTTCCTTCTTCGCACAATGTGCAGATGCCAATGACAGAAAGAAGGATTTAATGAAAACAGCGCTGTCGCTGAAAACGCGTCGCCTTCAGCCGCTTGTTTTTGTCGTTGCTAGTTTATCGAATAAAAATTGAGAGGATAAAAAAAAACCAGTCCGCAATCAGACTGGTTTTATGCTTTCAAGCCGGTGTTACATCGCTTTTTTGGTCAACTCGATAACGCGCAGTTTAGCGATCGCTTTGGCCAGTTCCGCAGACGCCTGAGCGTAATCCACGTCACCGTGCGAGCTCTTAATGTGCTCTTCGGCTTTACGCTTCGCTTCCAGGG [...]
+NODE 68 995 46102 44013 0 0
+CGACGTCGGCAAAAGTGTGCTGGCGGCGGGTTTATGCCGCATTTTTTATCAGGATGGTCTGCGTACCGCGCCGTTTAAATCGCAAAATATGGCGCTTAATTCTGGTATTACGCCGGATGGTAAAGAGATGGGGCGGGCGCAAATTTTTCAGGCGGAAGCCGCGGGGATCACGCCAGATGTGCGTATGAATCCGGTGCTGCTCAAACCGACCAGCGATCGCCAGGCGCAGGTCGTGCTGATGGGGAAAGTGGCGACCAATATGGATGCGGTGAGTTACCATGACTATAAACCGCGTTTGCGTGAGCAAATCCTTGCGGTCTATAACAGCCTGGCGCAGGAATATGACGTTATTGTGCTGGAAGGCGCCGGAAGCCCGGCGGAAATCAATCTGCGCGATCGCGATATCGTCAATATGGGAATGGCGGAAATGGCCCAGTGTCCGGTTATTCTGGTGGCGGATATCGACCGGGGCGGCGTATTCGCCGCTATTTA [...]
+GGCACGCCCTGCCGATGTGTCTGCAATACCGCATCCGCCATCCCGCTTTCGCGCAGCCAGGCGAGGTCGCTCAGCGTATTCTTACTGCCCGGCAGGATCACCAAATCAACGTCTGCCAACGCTTCCGGGCGGCGAATATAGCGTATGCGCACATCCGGCTGCGCCGCCAGAGCGTTAAAATCCGTAAAGTTAGAAATATGTGGCAGTTGCACAATGGCAATAGTGATATCACGGGGGGCGTTACCGCGATATTTATCGTTTTGCAGCGCGACGCCATCTTCATCTTCCAGATCCACATCCAGCCATGGCATCACTCCCAGGACCGGGACGCCGGTAAGCGATTCGATTTGTTCGATACCGGAATAGAGTAGCGCCACGTCGCCGCGGAATTTGTTGATAATGACGCCCTTTACTCTGTCACGCTCCTGTTTATGCAGCAGCGCCAGCGTGCCATAAATAGCGGCGAATACGCCGCCCCGGTCGATATCCGCC [...]
+NODE 69 5960 318167 314642 0 0
+TGGCCCGATGCGGCCGCCGCCGCCGTGAAGCTGCCGCTATCTACCACGGCGATAAACAGCGACATACGCTGCAAATTGAGCATGGCGAGCTCCTTTACTGTCAAAATTATTTTGACAGTATATCGTTGAAGCGCGGACTTATCTGGCTTTCTCCGGACGGCTACATTAGCGCCTCTGACGGAGGATGCATAATGACGTATCGCAGTAAAGTGGCAGTGGTTTACCTGCTCGGCTTCTTTCTTGATCTGATTAATCTGTTTATTGCCAGCGTGGCTTTTCCTGCGATGTCCGTGGATCTGCATACGTCCATATCGGCGCTGGCATGGGTGAGTAATGGTTATATCGCAGGATTAACGCTGATCATTCCGTTTAGCGCGTTTCTTTCACGTTATCTCGGCGCACGACGGCTGATCATATTTTCGCTCATTCTGTTTAGCGTTGCCGCCGCTGCCGCAGGTTTTGCCGATTCATTACACAGCCTTGTTTTCTGGC [...]
+TCGTAAATTCCGTTGCCATCGTTCCAGAAATCAAGGTAGATGACGTACTTCTTGCCGCCACTGTGGCGCAAGATGAGTTTGTCGGATTGGTGGAGCAGACGCATTGATTCAAGCGCATCGTAATGGATAACACGATGCCCGGCCTGCAACGCGGTTTCGGTTAACGTCATCCTGCGTGGCGTAAACAGAAACAGAACTGTGACGCTGAATTTCCAGATGATAAACAACAGGCCCACCAGTAGCGATATACCGGAAAGCCGATAATTCACGGTGGCTGTTGCTATGCTGAGAATAAAAAAACCGATCCCGATAGCAAACCATTTCAGCTCCGAAAGCGAAAGATGCCGGGTGTATTGACGACTTTCCATGATGGTATGGTATCCCTGATTTTACTGTCGGCGTATTACGTCAGGTTGAGTAAGGAAGCTATATCCGTTATGTTTTAGGTTATATACACTTCATCCTTCAGGCTGCCGGAGCAACTATTGTACG [...]
+NODE 70 4776 257093 253410 0 0
+TTCTTCCGGATGCGAAAAAATACGCTCACGCAGCGCCCGGCGGCGTAACGTGCCGTCGGCGGCGATAAGTTCAGAACCAAAATGTTCCGCTATTGCGTTCAGGGCGGGCTGCCCTGGCTCAACCATCTGGCGCGCGATAATATCCGCGTCGATGACGGTTATTCCGAGGTCAGCGAAGGCATCAGCGACGGTACTTTTACCGCTGCCAATACCGCCGGTTAAGGCTACGGTATACCTCATATCTCCAGCTTCCGGAATTTTAGTTTGACAATCAAAAGGTTAAATTTCAAGCATGCAAAGACGATACGCTCTGAGCATTAACCTACTATTCGCCAGGTAAATTTATGGGATTGTAACGTAAAAAAAGAGAATTTCGCAGTCTTGTACGGCCATGATTAGTGCGTATGATAACGTCACTGGAGTTGTGAGTTTCGATTTTTCGCCATTAACCCCAGGAATCCGCACATGCGTATTGAAGAAGATCTGAAGTTA [...]
+CGTCGTGATTCGGTAAAATATTCGTAGCGCCTCGCAATAACGTTGCCGTGTCATGTAACGCAGCAAAAATCTTCAGAATCCGCCTTCCCGTTTTACCTTTTGCCGCTCGCCCGCTCTTCCCGCGTTTGCCACAGTAGCGCCAGCTAACTCAAGGAGCGAACAATGGAAAAACAACGCGGTTTCACGCTTATCGAACTGATGGTCGTTATTGGCATCATCGCCATTTTAAGCGCCATTGGCATTCCGGCTTACCAGAACTATCTGCGTAAAGCGGCGCTGACGGATATGTTGCAAACGTTTGTCCCCTACCGTACCGCCGTCGAACTCTGCGCTCTGGAACATGGTGGGACGAGCACATGCGATGCGGGCGTCAACGGTATCCCCTCGCCCGTCATCACCCGTTATGTTTCGGGCATGAGCGTGGAAAAAGGCGTCATCACGCTTACCGGCCAGGAGAGTCTGAGCGGGCTTAGCGTCATCATGACGCCCGCC [...]
+NODE 71 22413 1326752 1314179 0 0
+ATGGAAGCGGCCTCTGCGTTGGCTCAGGACCTGGATTCATTGTTGAATCAGCATTTTCGCGGTCGCGTGGTGCGTAAGGATCTGACTAAGCAACTTAAAGAAGGGGCTAATGTTCCAGTTTACGTACTGGAATATCTACTCGGTATGTACTGTGCCTCCGATGACGGTGAGGTTGTCGAGCAGGGGCTACAGTCGGTTAAGCGTATTCTGGCTGATAACTACGTCCGCCCGGATGAAGCAGAGAAGGTGAAATCGCTCATTCGTGAGCGAGGATCCTACAAGATCATCGATAAAGTGTCGGTAAAGCTCAATCAGAAGAAAGACGTTTACGAAGCCCAGCTTTCCAACCTCGGCATTAAAGATGCACTGGTGCCGCCGCAAATGGTCAAGGACAACGAGAAGCTGTTGACCGGCGGCATCTGGTGCATGATCACCGTGAACTACTTCTTTGAGGAAGGACAAAAAACGTCGCCCTTCTCTCTGATGACGCTT [...]
+GCGGTAGGCTTTAACGGTCTGGTTGAATTCCGCCAGGATCCAGCGGTCCGCCAGCGACAGAGTCATTTCGCCGCCGTTGAAGCCGCAATCCTGCTCTTCGGTGTTCATCAGCACAAAGCGGCTGGCGTTCCACAGCTTGTTACAGAAGTTACGGTAACCTTCCAGACGCTTCATATCCCAGTTGATGTCGCGGCCGGTCGAGGCCAGCGCCGCCAGGGTAAAGCGCAGGGCGTCGGTGCCGTGCGGCTCAATGCCGTTCGGGAACTGCTTCTCGGTACGCTTGCGGATTTTCTCCGCCATCTGCGGCTGCATCATGTTGCCGGTGCGTTTTTCCAGCAGTTCCGGCAGGGAGATGCCGTCCACCATGTCCAGCGGGTCGATAACGTTACCCTTGGATTTGGACATCTTCTGGCCTTCGTCATCGCGAATCAGACCGGTCATATAGACGGTATGGAACGGCACCTGCGGCTTGCCGTTTTCATCTTTGATGAA [...]
+NODE 72 758 39938 39653 0 0
+GAGCGACAAGTTAGCCATGTCATATTTAAAGCTCACACAAAGAAAGTCAACACCAAAATAAAAAGGGCACCGTAAAAACGGTGCCCGGGGTTACCAGCCCTGAAGTTTATCTCATCAAGCTCCGGGGATCGCTCCCGACGCGGTTTTCACGGAGTATATGCGCCTTGTGATCCCGTCGGTGTGAAAAACGGATCACCGGACCTCAGAGCTGCCCGCTCTTTTTACTGTGGTCAGCAGGGTACGCATCAAAGCGTATGCACTTTAACAAATAAAAAAAAGGAAGTAATCATCATCCACGCTTTTTAATTTTTCTGCCGCCGCGTTTACTGTGTGACGTTTTCTGCTCTGAAATCACGCCTTTACACTCCGGGTAACGCTGGCAACTCCAGAACTCTCCGTTCTTACCTTTCAGCTTCCGCATTCTGCCCTGGCAAAGTGGGCATGCCGGCGTCACTGGTGCCGTAATCTGCAACTGCTGCCGTCGGGCTCCCG [...]
+TGGAGACACTGTTCACCCGCAAATATATTGAGAAACAGGGTAAGCATATCCGGGCAACACAACTGGGGGCAGAGTTGATAGCAGGATTACCTGAGGTGCTGACCAGTCCGGGAACCACGGCACTGTGGGAGCAGGCCCTGGATGATATTGCACAGGGTAAACTGTCGCTGGCATCATTTATGGAGAAGCAGAAACAGTGGCTGAATCACCTCGTCTCGGGAGCCCGACGGCAGCAGTTGCAGATTACGGCACCAGTGACGCCGGCATGCCCACTTTGCCAGGGCAGAATGCGGAAGCTGAAAGGTAAGAACGGAGAGTTCTGGAGTTGCCAGCGTTACCCGGAGTGTAAAGGCGTGATTTCAGAGCAGAAAACGTCACACAGTAAACGCGGCGGCAGAAAAATTAAAAAGCGTGGATGATGATTACTTCCTTTTTTTTATTTGTTAAAGTGCATACGCTTTGATGCGTACCCTGCTGACCACAGTAAAAAGA [...]
+NODE 73 1975 372271 368729 0 0
+GTTTGCACTTACGCTCGATGTTTGAGCAGCGCAAGAAGACAAATGGAGAGTATGATGATGGTCTGTATACTTGTTGTGTCAAATAACGGTCGGGAAGAGTTGATTGATTTTAATCCCGATCATGATTTAGCGCACATTATCAAATCATACCGGACACCAGAAAACAGGATGGTATGTATTATCCAGGATGGTAAGCGCATTCTTCGTTGGGATCGCAGTTATGCTTCCCGTGCAAAAAATCACTGGCGTAAGGTCGATCCAGACAGTTTTGAGATTTTAGGGTCTGTTGAATATCTCCGCTATGTTGGTCAGGGTTAGTTGGGGCGTTGAAAACGGAAAATACCCCACGCTAAGACTGTTTTTTAACCAGGCTATGATAATGCTATCTTTGACGGATGATGGTCATTGCTCTTTTGTTAATGCTAACGGACGCGTACATTAGCATTAACTTTTGTGTTATGTTGCACGTGAATTTTTGAGTTTTAATATTTA [...]
+AGATAGGTGAATAATAGTTCGATTGTGATGATGGGATACTGTTGTTTCTAATGCCCCGAGCTTGCGAGGGGTGCTACTTTCGAGGCGCTTGCGCCGATGTTTTTAGGTTATTCACTTGTTAAAGGGGATAACAGTAATGTTTTTCTTTTTTGCTTCTCTTTTAGTACGTAAGTAACTAAAAGAGAAGCAAAAGAGTAATTGCGGCATATCGTTTGCACTTTAAGTATGATTATCCACAACCTGTGCATAGTTTACCCAATGATACAGCTTATACCTGCTCTTTTCTGTACATGGAAAACGGAAAATAACCCACGCTAAGACTATTTTTTGTACAGTTTTTTATTATGGACGTGCCGATACACCGCCCCATAAGGCGGTAAGTTAGCCTGTATCAGAGCGGAATAGGGGTAGGTGGGTGAGCGTAATATTCTTTTTTGCGTTGTCGAGCTGCGTCGCGTTTCGCTTTCATCCGGGCTAATCCGGCTGCCGCTT [...]
+NODE 74 83 15746 15542 0 0
+GTCAGCCCCCTGCTAAGCCTGACCGCACGGAACTTACAGCTATTCAGGTGGTAGGTGGTCGTAGACCGTCGATGTTACAGCAA
+GTTCCGTGCGGTCAGGCTTAGCAGGGGGCTGACGCGGTTCCTGGCGACATGAAACTCCCTGGTTAGGGGTATCGGCGCGACCT
+NODE 75 3106 170091 169732 0 0
+TGAACAGCCTCGCAATGAAAGAGAACGCTGGTTGATGAACACCGTAGCAACGCAAGCGCGCCAGGCCGGTATCGCCATGCCGCAGGTTGCTATCTACCATGCGCCGGACATTAACGCGTTTGCGACGGGCGCACGCCGTGACGCCTCATTGGTCGCTGTAAGCACCGGTCTGTTGCAAAACATGAGCCCTGACGAAGCGGAAGCCGTCATTGCGCATGAAATCAGCCATATTGCCAATGGCGATATGGTGACGATGACGTTGATTCAGGGGGTGGTTAACACCTTCGTTATCTTTATTTCGCGCATTATCGCGCAAATTGCTGCTGGTTTTCTGGGCGGCAACCGCGATGAAGGCGAAGGAAGTAACGGTAATCCGCTAATCTATTTCGCCGTTGCGACGGTGCTGGAACTGGTCTTCGGTATTCTGGCGAGCATTATCACCATGTGGTTCTCCCGTTACCGTGAGTTTCATGCCGATGCGGGATCGGCGAA [...]
+CGTTGTAACCCATTTGTTCAGAAATTTTACGCGCGGCGGTGTGTAACATAGCCACATATTCCTGCAGGCGTTCTTCTGAAAAGCGCAGCGTCGGGAACGAAATGCTTAACCCTGCGATGACTACGCCAAAACGGTCAAATACCGGTACGCCGATACAACGTAACCCTTCTTCCTGTTCTTCGTTATCTTCACCGTAGCCTTGCGCACGTACCTCATCCAACAGCGGCAGCAACGCCTCAGTGCTGGTAATCGTGCGTCCCGTGCTTTGCTTATACTCAACGCCGTCGAGAATCTGCTTAACCTCATCACGGTCGCGCCAGGCCAGAAGCACTTTACCGATGGCCGTACTGTACAGCGGATTACGACGCCCAATACGTGAGTACATCCGCAGATTGTACATAGAGTCAATTTTATGGATATAGACAATGCTGTCTTCATCCAGCGCGCCAAGATGGATAGTTTCTTTTGTCAGACGAGACAGTTCACGCATCT [...]
+NODE 76 2200 116804 116095 0 0
+TTAAAGGCCATCATATAGAGGCCATGCCAGTTGCCTTTATCGTCCCAGCGGGACTGACCAAAACCAACGCCCCACGGCCGCTCGTTATAGCGATCCGTTTTCTCTTTATCGTAGGCAAAGCGCGCATGCCAGGTAATGGCGGGGACATACAAATCATAATGCTCAGGCTGTCGCCACGTTTCTGCGACGTTATCGGTAAACGTGTTAAACCACCCTTTATCCGCCGCAGAGACTGAAGGAATAGCCAGCCATGGCATAACAAGGAGAGCAATAATAAGAAAATACTTTCTGATAATCATCACAACAGCCATACCGTTCAAAAATTCGACTGTGATAATAACAACATTAACCTGAATAAAATCTTAACAAACTATAAACAGAGAATAATCTGAGAAAGTATCGGGTTAACGGCGTTTGATTTAGCACTCAGAACCGTCGCGCGCTCCTTAATAAGCTTTCACAAAAACACAAAACAAAGCACAACAAACAAAA [...]
+AGCGTATTTACCACGGCGGCTAAGCCTGGTTTAAGATGCCGGGGCGATGTTTTCCCTCGCCCCGGCTTACCGGCTATCAGCCGCCAGTAACGGCGGAAGAGGCGCCTGGCACCATAATTTCCGTGGCGATAATGACGATCAACAGACCGACGATGACCGGAACGGACGTGCGTTTCACCACTTCAAACGGTGATATTTTAGCCATCCCGGCGACAGCGACCACGACGCCGGAGACCGGCGAAATCGTGCGCCCCAGGTTTGAGGCTTGCAGCATTGGGATGGATAAATAGGCAGGGTTGATGCCGGAGGAGTGCGCCAGTTTAGGGATCATCTCAACAAAGGCGTAAAAAGGCGCATTGCCTGAACCGGTGGTCATCGCGGCCAGCATGGTTAAAATCACTAAGACCAGCATCAGAATAATGCTGGCGGAGCCAAAAGAAGTGGCAATCGAGATCAGACTTTGGATAAAGCCAATGGTGCTCAGCCCCTGGG [...]
+NODE 77 2850 152059 150942 0 0
+CGTCTGGGCGGTGAAACTCACGGGGATGAGTGCCTGGATGGGTATGGCGGACTGGTCGATTCTGGCACCGCCGATGATGCAGGGCTTCTTCTCCCTCGGTATCGCCTTTATGGCCGTCATCATTGTAATTGCACTGGCTTATATGTTCTTCGCTGGCCGCGCACTGCGCGCAGAAGAAGATGCAGAAAAACAACTGGCAGAACAGTCTGCTTAATAAGGAGTTTTGATTATGACCGTACGTATTCTGGCTGTGTGTGGCAACGGACAGGGCAGTTCCATGATCATGAAAATGAAAGTGGACCAGTTTTTAACCCAATCAAACATTGACCACACGGTAAACAGCTGCGCGGTTGGCGAGTACAAAAGCGAGTTGAGCGGCGCGGATATCATCATCGCTTCTACCCATATTGCAGGCGAAATCAGCGTGACCGGCAACAAATATGTGGTTGGCGTGCGTAACATGCTCTCTCCTGCTGACTTCGGCCCGAAACT [...]
+AAGCGACGGATAGCGTTGATACAGCGCCAGATGGGTAGCGGTATCGGAAGAAGGACGATAACGTCCCTCCACCACTTTGCCATCCATATCCACCACCACCATGTCATCTACCTTCATGGTTTCATAGGCGACACCGCTTGGCTTAATTACCACCAGCCCGCGTTCGCGATCGATAGCGCTGACGTTGCCCCAGGTAAACGTCACCAGTCCATAACGGGGCAAATCCATGTTAGCGTCAAATACCTGCTGCTTGAGCTTTTGCATTAGGCTGCCTCCACCAGACCGGCGCTGGCCATGCGCGCTTTCACCCAGTCACGCGCTTTCGCTACCTCTGCCGCCGGGTTCTCTGCTGTTTCACTCCACATCTCAATCAGATAGGGCCCGCAATAGCCACTCTGTTTGAGCGTTTCGAAGCAGCGTTCGAAATCGACAACGCCTTCGCCAAACGGCACATTTTTGAACACGCCGGGTTTAGTATCTTTGACGTGTACC [...]
+NODE 78 2844 155476 154161 0 0
+TTCTTTCACGGTCAGTTCAACACCAGCCTGTGGCTGGCGCTGTTAAGCGGCGGTATTAAGCCAGCTCAGTTTTACTGGCATATCTGGGGCGCGGATCTCTACGAAGTGTCCCACGGGCTGAAATTCCGCCTTTTCTACCCACTTCGTCGTATCGCGCAGGGGCGAGTAGGGGGCGTATTCGCGACGCGCGGCGATCTCAGCTATTTTGCGCGTCAGCATCCGGACGTACGCGGCGAGTTGCTCTATTTCCCGACGCGCATGGATCCTTCCCTGAATGCTATGGCAAAAGAGCGCCAACGTGCGGGGAAATTGACCATTTTGGTAGGGAACTCCGGCGATCGCAGTAACCAACATATTGCGGCGTTACGGGCGGTGTATCAGCAGTTTGGCGACACGGTAAACGTGGTGGTGCCGATGGGCTATCCGGCCAATAAGCAGGCCTATATTGATGAGGTTCGTCAGGCCGGCCTGGCGCTATTTAGCGCCGAAAAT [...]
+ACCGGTAAACACATCATAGGTACCGCCCACCCCCATATATAGCGCATGGGGATGCACTTCCCGACAATCGCGCATGAGTAATTCCTGTTTTGGCGATCCCATCGCAACGGTGACAATTTTCGCGCTGCTGGCATGGATACGCGCAAATAGCGCCTGACGCTGCTCCGGCGTAAAGTAACCGTCCTGGCTACCCACAATATTGACGTTCCACTGCGTCCGCAGTTTTGCTTCCGTCTGCGCCAGCACCTCAGGCTTGCCGCCGACAAGAAATACCGGTGTGCCTTCTTTCCCCGCGCGCGCCATTAACGCTTCCCAAAGGTCGGCACCAGCCACGCGAGAAACCTGCGCCTGCGGAAATTTTTTACGTATTGAACGCACCACGCTGATGCCATCGGCATATTTAAATTCCGCCGCCGCTATCAACGCGCGGACTTCCGGATTATCTTCCGCCGTCAGCAGTTTTTCGGCGTTGATCGCCACCAACGTGCCTTG [...]
+NODE 79 4595 939791 915565 0 0
+AAGCAACATAAAAAACGACGAAAAACGCCCAGGAAAACATGATCTTTTGAGCGGATTTTTCAGATCTGACAACGAACTGTGATCCGGTGGTGCTGATAACGTCCATTATGTTAAATAGCCCCGTTTTCCTTGAAATAATAACCCGTAACTTATATAATCATCAATAAGCTATAACTTATAGGAAAAGGGACATGTGGACTGTTTATTTTGGCAGATTATTTGATGAATGGTTTGAAGAACAGGAACTAGCCCTAAAACGAAAAGTGCTGGCTGAACTTAGACATCTTGAAGAGTTTGGCCCCTCTCTTTCACGACCACATGCAGATACTGTGAAAGGGTCACGTCATAAGAACATGAAGGAACTACGTATACAATATGAGGGACACCCAATCAGGGCATTCTTTGCATTTGATCCGATTAGGCAAGCAATCATTCTTTGCGCTGGCGACAAAAGTAATGATAAAAAATTTTATGACAGAATGATTCGTATTG [...]
+TGATATTCAGGCAGCATTTCCACTTCTTAAGTTTAATTTGAAAGAGAAACAGAAAAACCGTCTATCTCTGGTTTTGAAAAATGATGGATGGTCCGCTGAACGATAGGTAGATAAATGACGTTGCTACGTGGTCTCCCTCTTTTGCTGATTTCACGTAGCACTCTCACTCTGCCGCTACTTCTCGTTATGCTGAACAGATGATTGAAAAATAAGGATAATTAAATAATCTCTTGATTTTGTAATCCTATGATTATAAGATTATTGTGTATGAGTGTTTGGATAGAGAATTATTGTAATCAAGTGGGAGATATTATTTATGAATAATTTACGTGATAAAAAATCAAATCCTGTTATTACATTAATTGCTGTCGTGATTTCTTTATTCTTCCTTCCTGCAATCGCCGCAGGACTGGGGACTATGGGAGAAATTTACATTGATGGTCTGCGTGAATTACCGTCTTTTGGTATAAAGGCGATAAGTGTTGCAATCTG [...]
+NODE 80 6296 308062 303734 0 0
+GCATGAAAACGGCGATCGTACGGATCGCGGTATTCGCTGTCGCATTCCGGACACAAGGGAAACGCCGCCATCACCGTAAATGGCCGGTCATAGGGCATAGCGCGAATAATGGTGAAGCGTGGTCCGCAGTGGGTGCAATTGATGAAAGGATAACGGTAGCGCCGCTCGCCTGGGGTATTCATCTCGGCAAGACATGCCGGGCAGGTCGCCGCATCCGGCACGATTTGCGTGTTCATCGAACCGCCTGCGCTCTGACGAATGGTGAAATCCGTCGGTGCGCGCTCCCATACCAACGACGCGTGTTCAACGCTGTCAATGCGCGCCAGCGGCGGGCAATCCTGATAGAGCGCGGCAATAAATTGCGACGGCTCTTCCAGCAGCCGAACGACGACGCCGTCGCCGTCATTACACACGTCGCCGTGTAATCGCAACTGCTGCGCCAGCTGCCAGACAAAAGGACGAAAACCGACGCCCTGTACTTTGCCCCGAATG [...]
+TTGCGCCACTTCACGCGTGACCTGGGCCGGTTTTGGGTTTGCGTTTTTAGCCTTCGTCTCCTTGCTGGCGGCGTGATTTAAGAGAGTTTGAGCATGTCTGAAGAAAAATTAGGTCAACAATACCTTGCGGCGCTGCACCAGGCGTTTCCGGGCGTCGTGCTGGACGAAGCCTGGCAGACCAAAGATCAGCTGACTATTACGGTGAAAGTAAACTATCTGCCGGAAGTGGTGGAGTTTCTTTACTACCAGCAGGGTGGGTGGCTGTCGGTGCTGTTCGGTAATGACGAACGCCAGTTGTGCGGCCACTATGCCGTTTATTACGTACTGTCGATGGAGCAGGGCACGAAGTGCTGGATTACCGTTCGCGTTGAAGTGGATGCCAATAAGCTGGAATTCCCATCCGTTACGCCGCGCGTGCCGGCTGCCGTGTGGGGTGAGCGCGAAGTACGCGACATGTACGGTTTAATCCCGGTCGGTCTGCCGGACGAGCGC [...]
+NODE 81 2085 95009 92291 0 0
+ATGACGCCCGGCCTGACGCTTATGCAATAGCGTTTTCTTCCAGTTGCTGCATAAACTGGCGTACCCAGTCTATACGCGTTTTACGTTCGCTTAAATCCTGAATAAACTTGAGACGCGTCGGGCCATCCAGACGGAAATGCTGCGGCTGTTTTTGCAGCAACCCGATAAGCCAGGCGGGGTCAACGTGGTTTTTCTCGGCGAACTCAATCGTTCCGCCTTTCTCGTTACCCTCCAGTTTTCGGATGCCGAGCTTTTGCGCCTGTTGGCGCAGGCGTGCGATATCCAGCAGATTACGCGCCGGATCGGGCAGCAGGCCGAAGCGGTCGATCAATTCCACTTTGATCTCTTCCAGCTCGTTTTCGTTCTTCGCGCTGGCAATGCGTTTATAGAATGACAGCCGGGTATTAACATCCGGAATAAAATCATCCGGCAGTAACGACGGCATTCGCAGCTCGACTTCCGTTTGCTGACTGGTGAGATCTTCCAGCGAGG [...]
+CACGTCGGTCAACCGGTAGTGCATCTGGAGCACGGCGTCGGACGCTATGCCGGCATGACCACTCTGGAGGCTGGCGGCATCAAGGGTGAGTATCTGATGCTCACCTACGCCAATGACGCCAAACTGTATGTGCCGGTCTCCTCATTGCATCTGATTAGCCGCTATGCCGGCGGCGCGGAAGAAAGTGCGCCGCTGCATAAACTGGGCGGCGACGCCTGGTCGCGCGCCCGGCAGAAAGCGGCGGAAAAAGTGCGCGATGTCGCAGCGGAACTGTTGGATATTTATGCGCAACGGGCGGCAAAAGAGGGGTTTGCCTTTAAGCATGATCGTGAGCAGTATCAGTTATTCTGCGACAGCTTCCCGTTTGAAACGACGCCCGATCAGGCACAGGCGATTAACGCCGTATTGAGCGATATGTGCCAACCGCTGGCGATGGACAGGCTGGTGTGCGGCGACGTCGGCTTCGGCAAAACCGAAGTGGCGATGCGCGCC [...]
+NODE 82 18451 959080 950014 0 0
+CTAATGGCGATTCTCGGCCTGGGAACGGATATTGTAGAGATTGCCCGCATTGAGGCAGTGATCTCCCGTTCCGGCGAACGTCTGGCAAGGCGTGTGCTCAGTGACAACGAGTGGGCTATCTGGGAGACGCATCAGCAGCCGGTGCGTTTTCTCGCCAAGCGTTTTGCGGTCAAAGAGGCGGCAGCGAAAGCTTTTGGCACCGGCATCCGCAACGGTCTGGCGTTCAATCAGTTCGAAGTGTTTAACGATGAGCTGGGAAAACCACGTTTGCGGCTGTGGGGCGAGGCGTTAACGCTGGCGGAAAAACTCGGTGTGGCGCACATGCATGTCACGTTGGCCGATGAACGCCATTACGCCTGCGCCACGGTCATTCTGGAAAGTTAGATTTGCCGGATGGCGGCGTAAACACGTTATCTGACCTACAGGCCGATATATTGTCGGCCTGATAAGCATAGCGCCATCAGGCATTGTTGCGTTGGAAGTGCGTTAACC [...]
+GACTTCGGTGACCGTCATGCCGGTAATACCTACCTCGGCCAGCGCTTCACGGACATCGTCCAGCTTGAAGGGTTTAATAATCGCATCAATCTTTTTCATGCTATTCCTTGAAAAGGTCGCCTGTGTTTTGATCGGTTAAACGTAACATATTTCGCGCTACTTTACGGCATGAAAACTACTCTTTGAAATCATTCGCATCCAGTTCGTGACGGGAGAGTAGCTTATAGAATTCCGTGCGGTTGCGCCCCGCCATCCTTGCCGCGTGCGTCACGTTACCTTTGGTAATTTGCAGTAACTTGCGCAGATAGTTCAGTTCAAATTGGTTTCGCGCTTCGGCAAAAGTTGGCAGCGCGGTGTTTTCGCCTTCCAGCGCCTGCTCGACCAACGCATCGCTGATCACCGGCGAAGAGGTTAACGCCACGCATTGTTCAATGACGTTGACCAGTTGGCGCACGTTGCCCGGCCAGCTTGCCGTCATCAGCCGTTTCATTG [...]
+NODE 83 710 45380 45322 0 0
+CAGATGATACAGTGATAGAATCTATGAGTAGAGAGGAGAGACAATTATTTTTACAAATATGCGAGGTGATTGGTTCGAAGATGACCTGGCACCCGGAATTACTTCAGGAGTCGATTTCAACTCTACGAAAAGAAGTGACGGGCAATGCACAAATCAAAACGGCGGTTTATGAGATGATGCGTCCCGCAGAGGCTCCAGACCACCCGCTTGTCGAATGGCAGGACTTACTTACTGCAGATGAAAAATCGATGCTGGCCTGTATTAATGCCGGTAACTTTGAGCCTACAACTCAGTTTTGCAAAATAGGTTATCAGGAGGTACAAGGTGAAGTCGCTTTTAGTATGATGCATCCGTGCATCTCCTATTTACTACATAGCTATTCACCGTTTGCAGAGTTTAAACCAACAAATTCCGGTTTTTTAAAAAAACTTAATCAGGATTATAACGACTATCATGCAAAAAAAATGTTTATTGATGTAATTCTTGAAAAAA [...]
+CGAAGGGTGATTGTCCTTACGCGGTATGATTATACTTGCTGCTATGAAAAATCCGGCAGGCAGCCGGATTTTAAATTGGTTATTTTACTGACTATCTTTATGTCAGTAATATATTACGACTGCACCCATCTTTACCAATGTGCAAAGAACGTTCATGGGTTAGATATATTTTTTCAAGAATTACATCAATAAACATTTTTTTTGCATGATAGTCGTTATAATCCTGATTAAGTTTTTTTAAAAAACCGGAATTTGTTGGTTTAAACTCTGCAAACGGTGAATAGCTATGTAGTAAATAGGAGATGCACGGATGCATCATACTAAAAGCGACTTCACCTTGTACCTCCTGATAACCTATTTTGCAAAACTGAGTTGTAGGCTCAAAGTTACCGGCATTAATACAGGCCAGCATCGATTTTTCATCTGCAGTAAGTAAGTCCTGCCATTCGACAAGCGGGTGGTCTGGAGCCTCTGCGGGACGCATCATCTCAT [...]
+NODE 84 9824 521113 513853 0 0
+AAAATCATGCTTTATGTCGATTATCAGGTAAGAATATGGTCAGTATCCCCAGAAGCGGCAGGAAAGCACAGATTTTATAAACTAAATAGATACTGGTATGGTCGGCAATCAGCCCCAGCACCGCTGCGCCCAGGCCTCCCATCCCGAAGGCAAACCCGAAAAACAGGCCGGAAACCATACCGATGCGTCCTGGCAGCAGCTCCTGAGCATACACCAGAATGGCGGAAAACGCCGACGCGAGAATAAAGCCGATAATCACCGTTAAAATCCCCGTCCAGTACAGCGTGGCGTAGGGTAAAACAAGGGTAAACGGCGCGACGCCGAGAATAGAGCCCCAAATCACATATTTTCTGCCGATTTTATCGCCCACAGGCCCGCCGATTACCGTCCCGGCAGCCACCGCAAACAGGAAGGCAAACAGATGGAGCTGCGCGTTTTGTATTGATAATCCGAATTTTTGCATCAGATAAAAGGTGTAATAGCTACTGATGC [...]
+AACCTGACCATGACCAATATCCGTACGGTGCTCGGTTCGATGGAGCTGGATGAAATGCTCTCCCAGCGCGACAGCATCAACACGCGGCTGCTGCATATTGTCGATGAAGCCACCAATCCGTGGGGAATTAAAGTTACCCGTATCGAAATTCGCGATGTCCGCCCGCCCGCGGAATTGATCTCCTCTATGAACGCCCAGATGAAAGCGGAACGTACCAAACGCGCCTATATCCTTGAGGCCGAAGGGGTACGTCAGGCGGAAATCCTCAAAGCCGAGGGGGAAAAACAGTCGCAGATTCTGAAAGCCGAAGGCGAACGTCAGTCCGCTTTCCTGCAGGCGGAAGCGCGCGAACGTTCCGCCGAAGCGGAAGCCCGCGCTACGCAGATGGTATCTGAAGCCATCGCCGCCGGGGATATTCAGGCGATAAACTACTTCGTGGCGCAGAAATACACCGAAGCGTTACAGCAAATCGGCTCGGCGAATAACAGCAAA [...]
+NODE 85 9243 504191 499248 0 0
+GGCGGTCATGCTGGTACTAACGCTGGCAAGTTATCTGATTATTCGTAAAAACTACGGCTGGGCGACGGTCGGCTTTACGGTGACGGCGGTATACACCATCCAGTTACTGACGTTAAACGGAGAACAGTTTATTGTGCCGAGGCTGATCGATACGCTGATTGGCTGTTTAATTGCCTTTGGCGGCATGGTCTGGCTGTGGCCGCAATGGCAAAGCGGGCTATTACGTAAAAACGCCCATGATGCGCTGGAAGCCGATCAAGAAGCTATCCGACTGATCCTCAGTAACGATCCGCAGGCCACCCCGCTCGCTTATCAAAGAATGCGGGTCAACCAGGCGCATAACACGTTATTCAACTCGTTAAATCAGGCAATGCAGGAACCCGGATTCAATACCCACTATCTGTCGGATATGAAACTGTGGGTCACGCACAGCCAGTTTATTGTCGAGCATATCAACGCTATGACGACGCTGGCGCGGGAACACACCATGCT [...]
+TGGCTCCCATCACCAAAGGACGCACGGACGGGTCGAGCAGATTGCCGAGGGTGAAAATAAGAATGATGCCGAGACCGACATAAGCCCCGGCCATTGCTGAACTGACCCAGAAGCCGAGCGGATTATTCGCCGACAGGCGTGCGATGCGTGTAGCGTTAGCCGCACACTTATTAATAGTGTCTGTAAACATTTGATTATCCTTTTCTCACTTCATCCTTTGCACTGCCTCTTTGTTGGCTGCCCTCGCTCACCCCAGTCACATAGTGAACTATGCTCCTGGGGATTAATGAGGGACATCCTTGTCCCTCACCGAAGGCAGCCAGCGGCTGTTCAAATTCGTTCCTGACGAATTTGTTGCTCAGTTGCCGCCGCGATGCAGTACAAATGATTTTGTGATAACAATTAAAATGAAAAAAATACAAAAAAGGGGAGGCGTTGCGCCTCCCAAAAATAATTAACCGCGCAACTGCACCACGCCGTCTTTTACCCGCG [...]
+NODE 86 715 49714 49714 0 0
+ATTCCCATTCCTGAACCATGGCAACCGTTACGCCCAGCGCTCTGGCGAATTCATCTGTTTTTAGTCCCGTCCCTCTCCGTAACTGTTCAAATTCGGTAAAAGGATTGGGTTTTTGCGTCAGGGTGATCTTTCGCGTTTCATCTTTAAAAACAATTTGTTCCAGGCTGCTCAGCAGCTCAAACATCGGATCTTTATATTCCATTGAGAACTCCTGTAAATCACACAGCGGGATCGTGAAGTGCATCGAAGCCTCTTAAGAATAGTCGGGAAACTTGCGGGTGGGGGGCGACGCGCCGCCAGGAAGCGCTATCGATTCGTTTCGATGCCTTACGCTACGCGACTTTTAGGACGCTAACAATTTGATCCAGGAAGGTATATCCGTCTTTCAGAAAATAATTGTAAAGATTAAAAAAATATTACACTCCCCGCTGGAAAGCTTTCTTGCCGCGTTTTTTATCGCAGTGTCAGGCCAAAAATTAACAATAAAATAAC [...]
+GAGAGCAGGACTTACCTGTCGCCATTGTTAATACTCCTTTCACCCAAAAATGCGCACAACGACACCTGCGTGCCTGACGGCTTACAAGGATAGTCCAGGTCAGGCTTGCAGGATACCCTTTCCACGCGATCTTGTAGCGGAAAATTATGTTTATCTGCATCAATGCTTAATTTGTTATTTTATTGTTAATTTTTGGCCTGACACTGCGATAAAAAACGCGGCAAGAAAGCTTTCCAGCGGGGAGTGTAATATTTTTTTAATCTTTACAATTATTTTCTGAAAGACGGATATACCTTCCTGGATCAAATTGTTAGCGTCCTAAAAGTCGCGTAGCGTAAGGCATCGAAACGAATCGATAGCGCTTCCTGGCGGCGCGTCGCCCCCCACCCGCAAGTTTCCCGACTATTCTTAAGAGGCTTCGATGCACTTCACGATCCCGCTGTGTGATTTACAGGAGTTCTCAATGGAATATAAAGATCCGATGTTTGAGCT [...]
+NODE 87 12835 735060 722455 0 0
+GAAAGAAGCAGGGCAGAAATTAATGCCGTTTGAAAGGTGGCAACGCCCAGCGCGCTGGCGGATGCGCCTTCAGAAAATACGACCATAGCCCCGCATAATCCTGCAAACCAATTCCATAGCGGGATTTTTCTCTTTTTAATCAGAGTAGGGATTGAGGCGAATTGCTGGCGTGTTTCTTTGCGCGCAATAATAATAAAAAACATGACGACCAGACCGCTGGCAAACGAGATTACTGCGCAAGCATTACCGTCTTGTAACCAATGTCCTAACTGCCCATTAACGGCAGACTGCATCGGGGAAAGCATACCGGCTAAGATGGTGGCAAGCATCAGTAAGGGGGTTGAGTACTTATTCTTGTTCATACATCAATCCTTATATTTTATAAAAGGAGTAACTTTCGTTACTCCATTGTTTTTTATTTTCTGGCGATGAATTGAAGCGTGTTGACCCACAGGTCGGTATAAAACGGCCATGACATAAACTGCTGGGTTC [...]
+ATTGAGAATTTCACGCCAGCGTCCCGGCTGGTTGATGCCAAAGCGGTAGTCGTGGCGAGGCACGGGCGTAAAGTTGCTGGCGACGATGATCTCGTTACCGGCTTTATCACGGCGTACAAAAATCAGTACCGAGCGTTCATTGTCATCGACCACCAGCCACTCAAAGCCGTAAGCATCAAAATCCAGCTCATGCAACGCTTTATGGTGGCGATAGGTGTGGTTGAGATCGCGTACCAGACGCTGAACCCCGTGGTGCCAGTTATCGCCCCCCTCCAGCAGGTGCCAGTCGAGGCTGGCGTCATGGTTCCACTCGCGTCCCTGGGCAAACTCATTCCCCATAAACAGCAGTTTCTTGCCGGGAAAGGCCCACATCCAGCCATAATAGGCGCGCAGGTTGGCAAATTTTTGCCACGCATCGCCCGGCATACGATCGAGAATGGATTTCTTGCCGTGAACCACCTCATCGTGCGACAGCGGCAGAACAAAGTTTTC [...]
+NODE 88 10975 619026 605925 0 0
+GCCAGGCCTGGTAAGCGCTACGCCATCAGGCAAAAGTGTGAACATCTCATCCGGCCTACGATCATCTGTAGGCCGACTGTTCACCATGCGCCCTTAAAACGTTTCCCAATTATCGCTGCCGTCGGCCACTGCGGCCTTTGGTGACGACACGGCTGCCGGGGTTTTTACCGCAGCCACATCACGCGCACGCTGCTGTTGCTGGTGAATACGGAACACCGCGACGGCCTGGGTCAGACGGCTGGCTTGCTCTTCCAGCGCCGCAGCCGCGGCGGCGGACTCTTCCACCAGCGAGGCGTTCTGCTGCGTTACGCGATCCATCTCCGCTACCGCCAGGCCCACCTGGTCGATGCCACGGCTTTGCTCGTCAGACGCCGAGGCAATCTCGCCCATGATATCGGTCACGCGGGTCACTGCATTGACGATCTCATCCATGGTTTCACCGGCGCTTTCGACCAGCGTCGAACCTACATCAACACGGCTCACGGAATCCTC [...]
+GCAATACGCTCCAGAAGTACCGACGCCGGTTCGTCGTTCGGATCCTGCGGCACCAGCTTGCCGCGCACCGCCAGCTCCAGAATTAGCTCGCGCAGCTTCTTAATGCCGTACAGGTCAATCTTACCCGAGCTGCCGCGCCCCGCCGTGGAGCGGGTTTGCTGCGCCGTGGTCCAGGTGTCGATATGGTCGACAATCAGTTTTTCCACCGCCATCAGTTGGCCTCCTTACCGGAGAGCGCCGCGCCGAGGATATCGCGCAGCTGGTGGCGCAGGGTCTGAATTGCTTCCTGCTGCTTCGCGTACTGTGTGAGCAGTTCGTCCGGGTCGTGGCTGACGGTTTCCGCTTGGTGCGGGTTCTTGATATCGAGGTTAAAGTTGCGGGCAATCACCTCGTCGATGCTGACCTTCCACGCCTGTTCGTTCTCGACGCGGCTGGCGAAGCCGTCGGCCTCGTTGCCCCACCAGTCGATCTCGGCCTGGAATTCCTCAAACT [...]
+NODE 89 9935 485201 479696 0 0
+CGGAATTTGTCCCACCGAACGCGGGAAGGAGATCGGCAGCTTGCCTGACGGGTTGTAATCGCCAAACAGCACATCGGCAATGGCGTTGCCGCCTTCCGTCCCGGCAAACCAGGTCTCCAGAATCGCATCGGCCTGTTGATCTTCTTTTACCAGCGCCAGCGGTCTGCCGTTCATTAATACCAGTACCAGCGGCTTACCGGTGGCTTTCAGAGCGGTGATTAAGTCGCGCTGACTCTGCGGAATGGTGATATTGGTACGGCTGGAGGCTTCATGCGCCATCCCCTGCGACTCGCCTACCACTGCGACCACCACATCGGCCTGTTTCGCCGCCTGCACCGCCTCATCAATCATCGCCTGCGGTGAGCGCGGATCGATTTTCACTGCCTCTTCATACAGGTTTAAGAAATCGACGATATCTTTATCGTTAGTGATATTCGCCCCTTTGGCATAGAGGATCTTCGCCCCGTCGCCGACGGCATTTTGAATACCCGC [...]
+AAAAGTGTTTCATCGCATCTGCCCGGAGTTGCATCACGCCAGCCGCACGCCGTCCGGCACGCCGGTGCGTATTCAGCTTCTGGGCCAGCACCCGCAGTGGCTGGCGGAAAACGCCGCGCGGGCGACGGCGTTGGGATCGTATGGCGTGGACCTGAACTGCGGCTGTCCGTCAAAAGTGGTGAACGGCAGCGGCGGCGGCGCGACATTGCTCAAAGATCCCGAACTCATCTATCAGGGCGCGAAAGCGATGCGGGCCGCGGTACCGTCGCATCTGCCGGTGACGGTAAAAGTGCGTCTCGGCTGGGATAGCGGCGATAGAAAATTTGAAATCGCCGATGCGGTGCAGCAGGCCGGCGCCAGTGAACTGGTGGTGCATGGCCGTACCAAAGCGCAGGGCTACCGCGCCGAGCATATCGACTGGCAGGCGATCGGCGAAATACGCCAGCGTCTGACTATTCCGGTTATCGCGAATGGCGAAATCTGGGACTGGCA [...]
+NODE 90 1966 123289 122129 0 0
+TCACGCACGGTACGAACATTTTTCCCATCAGGGCGTTTATAGTTAGAGCTGGCTACACGCAGGAAGTAGTGACCGTTGGCCGCGTTATCCATTGAGTGTGAAAAATCGTTATAATTATCCGGCAGGCGGCGGTTAAAGATTTCACGCCCCATGATATCGTATTTCACATAACGCTGACCGTAGCCCCACGATAGTGCGCCATCCTGGTTTTGTTTAAAGCCCATCATAACGCCAGCACGATAAATTGACTTTAAATCATAAATTGAACTTGGATTCATAAACCAACGAATATCACCGGAGGTGTCGATAATAGCGTTAGCTGTAGTGAAGTTCCATTCTAATGCACCCCCAGTAGGGTTATTCCAGACAGTACGCGTTCCATTCCCAGACTTATCTTTCGTATTATTCAAAAGATACAAGCGATCTTTAAATTCTGGGGAAACCTTTTTAACATCGATAGTAAAGAGTGCTGATTGTTCTTCTTTTGTACCC [...]
+TTGAAAAATGTCGGTATTGACCCGACACCCGACAGAGGGAGCGCATGACAACCTTAAGCTGTAAAGTGACCTCGGTAGAAGCTATCACCGATACCGTATATCGGGTTCGTTTAGTGCCGGACGCGGCGTTTACATTCCGCGCTGGTCAGTATTTGATGGTCGTAATGGACGAGCGTGACAAACGCCCGTTTTCGATGGCCTCAACGCCGGACGAGAAAGGGTTTATTGAATTACACATTGGCGCTTCCGAGCTCAATCTGTATGCGATGGCGGTCATGGATCGAATTCTGAAAGACCGGGAAATCGTCGTCGATATTCCGCATGGCGACGCCTGGCTACGTGACGATGAAGAGCGTCCGTTGATTCTGATCGCGGGCGGTACGGGCTTTTCTTATGCGCGCTCCATCCTGTTGACGGCGTTAGCGCGCAACCCGGCCCGCGATGTTACCATTTACTGGGGCGGCCGCGAAGAAAAGCACCTCTATGATCTCT [...]
+NODE 91 9539 533453 526929 0 0
+GTCATTGGTAAATACACGATGGATCGCATCCTGACCGAAGGTCGTACCGTTATTCGTAGCGATACCCAACGCGAGCTGGAAGAGACTATCAAACCGTACAACATGGGGATTACCCTGCTGGACGTGAACTTCCAGGCTGCGCGTCCGCCGGAAGAGGTGAAAGCCGCCTTTGACGACGCGATTGCCGCACGTGAAAACGAGCAGCAGTATATTCGTGAAGCGGAAGCGTATACCAACGAAGTTCAGCCGCGCGCCAACGGTCAGGCGCAGCGTATTCTGGAAGAGGCACGCGCCTATAAAACCCAGACTATCCTGGAAGCGCAGGGTGAAGTCGCCCGGTTTGCGAAGATTTTGCCGGAATATAAAGCCGCGCCGCAGATTACACGCGAGCGTCTGTATATTGAAACGATGGAAAAAGTGCTGAGCCATACCCGTAAAGTACTGGTTAACGACAAGAGCGGTAATTTAATGGTGCTGCCGTTAGATCAGATG [...]
+AGTATATGCATAATTTCCCTGTATGTGCTTAACCAATAACCGTCAGTGAAGTGAGCGGGATATCCACGCCGAGGGCGCGTGAAAACACCCATTCAGGCTCACCGCGCTCGTTAAATGATTCTTCCCCGTTCAATAGAAGATACTCCCAGGCGTCATCCGTCACCTGGCGCTGGAAGCCCATCGTAAAATTGTGAACGTCCCATTTCTCTGCCTGCTGATTTTCAACCTTTTCCAGCATGTAGACAGGTTCAATATTGCCCGGCTCTTCATGGTTAAAAAAACGCTGCCAGCGCCGTTCTTGCCAGTTGAGCGTCATCGGCCCTATTGCCGCTGGCGCAATGGCTGAACGCCAGTGACGTTCCTCGTTAATACCGAAACTTTCCTCATATACAAAGAGTTTGATGTCATCAATGTCGTCAACATCCGTGCCGCCAGTGGTGTTAATTTGTAGAAACTCATCGCCAGAGGTGTAGTAGCGAAAAATCTGACTGC [...]
+NODE 92 3761 206140 204698 0 0
+TCGTCGCACGCGACGTTCAAATCTGCTCCCCGCAGATTTGTCGCTCCCCCCCAGTCACATCGTTATCTATGCTCCTGGGGATTCACTCCCTTGCCGCCTTTAAGCAACTCGAAATCCATAGCGTATATAGCGTATTGCGTATCTCAGTAACCGCGGTGACCCTCACGGTGGCTGACCTTATACAGAAGTGAATATTTCAGCACAATAATAGATTAACCATTCAAAAATCATCATCAGAGCTTTATGCTAAAAATAAGCCTGCAATATCTATAATTATGCTGAGAAAAGTAGAGCGCGCGCCGTTAGCCGAGAATACATCGCATCTGACAACATTTGGAATGTGGCTGAAAATCGCCAGAAAAACAATGCATTATAATACATTGATTTAAAAGTAATTAATGACTAACAACAACGAAAATCTCGCTGCGGGCAAAAAACACACAGTCACAGAGTATTTTATCGACAAAAAGCCCATAAATAAAAATATTACAC [...]
+CAGGCTAACGCCGCGCACTCTTGCTCGCTGAAATGGTGACTTACCCGCCATCCTGCCAGCGCATCTAATTTAGCTTGATTTACGCCAGCCTTACGCAGCGCTTTACTGTGCATCTCCAGGCAAAATGCACAACCATTTATTTGCGAAACACGCAGGTAAATCAGCTCCATCAGAGTGAGGTCAAGCGTGCTCTTTTCCAGCGCGTTTTTCGCCTGCACCAGAGCGCTGTAAACCTCCGGGCTCAGTTCATAATAGGGTTGGCGTAACGTCGTCATCATGTTTCTCCTCGTGTTGATGACGAGCACTGTAGCACTATAATGGTCTGTAAAAGAGAGCCATATTTTTACAGAAAAAGCAGACCATATGCCGCGCTATCAGCACATCGCTCGTCAGTTAAAAACGGCCATTGAGCAAGGAGAACTCGCGCCAGGAACGCGTTTGCCTTCCAGCCGAACGTGGGCGCAGGAACTGGGCGTTTCTCGCGCCACGGTG [...]
+NODE 93 1782 107296 107021 0 0
+AGCGCACATCCCCACGCAGCTCACATAAGATGCCCCAGGACGTCTGTCAGGTTGCGCAAACGGCGTTCCTCAACTACTACTTAATAGGTTCTCATCGCTGAAGTAAGCAGATGATCTTATGCGGGCCATCGAATGGATATTTCCCCATGGCTCTCGTTTTGTTGAGGTGGATATGACTGGTTCCGCATCATCTGTTTTAAAGACAGATACAAGACTATTGAGCGAAAACCTGTTTCTTAATTATGGTCTGGAGTCCTTATTTAAGGACGTCGCAATAATAGCTGGTAACGTAAATTATATTATTTTTGATATCGACGATTACTACACCGTACAGCAGTATATTACTTCCGCATTTAAAACGGTACTCATTGGAATTGTTACCCATAATGAATATAACTTTATTGATGAACATCATGCTATATATCGAATAAAGGTCGACGCCTCTATTGCTGAGTGGCGTGAGTTACTGATTTTGGCCGCTGCTGGCCAATT [...]
+AACAAGGGAGGGGGTTACTCCTCCCCTGTTCGTTAATAATGCAGATGCCTCAACGTGCGGTGCCTGATTTTTCGTAGCCGTTTGCATGGATTTGCGGTGCAACATGCTGCATGCTTTCTGGCATCTCATGCTGCCGATATACGGCTGGCAGTAATGTTAAGCATGAGCCATTTTTCACATGAAGACTAAATTTACCCGATTCTTTTAAAGCCTGAATAAGATTTTCCTGCGCGGGAGTTAATGTCTCATCATGCCACAGAACAATATGCTCGAAAGACGTTGATAAAAGATCGGGCATCGGCGCCTGCCAGGGGATGACTTCAACTCGCATACCTTCACTACAATATTTAATCGTTTCCAGCCATAGCTCAATGGGGTCGTTCAGCGAAAACGCAGCAATAAGCATTGTGCCTGCTGGCGCCTTTCGTACGCTACTTAGCTGGAACGTGGCGTATTCAATAATCGCAGTATCCAGTAATGCCTTTTCAAATC [...]
+NODE 94 87 24151 21026 0 0
+AGTTCCCGAAGGCACCAGTCCATCTCTGGAAAGTTCTGTGGATGTCAAGACCAGGTAAGGTTCTTCGCGTTGCATCGAATTAAACCA
+AGAACTTTCCAGAGATGGACTGGTGCCTTCGGGAACTGTGAGACAGGTGCTGCATGGCTGTCGTCAGCTCGTGTTGTGAAATGTTGG
+NODE 95 14 5476 5326 0 0
+CATGCTCCACCGCT
+GTCTTGACATCCAC
+NODE 96 21650 1279693 1266231 0 0
+AGTTACCGATCATGGTCGCCAGGACTTCGTTATCACGTGGGTTCAGGCAATAGAGGATAGTCTTGGGCAGTTCATTAGTCACATCCATACTGTCGAGCAAACGGGAGAGCGCCCAGCTAATGTTATTATCGCCAATGGAGTCAAAGCCGGTATCCGGCCCCAGCAGGCGGAACATCCGGGTATTATTATTACGGATCGCGCCAATATGTAGCTGCATCACCCAGCCGCGCGCGGCGTACTGGCGGCCCAGCCAGACCAGCACCGCCGTGGTAAACTGGGCGATCTCAAGTTCGCTCAGCGTTTCGCCAGCCAGACGTTTGCCCAGAATGGCGTCAAGCTGCGCGTCGTCGGGCACCGGCGCAAATCGCAGCGTTTCAATGCCATGATCGGACGCGCGGCAGCCGCAGGCGGCGAAATGGTCGAGACGGCGAGTGAGCGCCTGACGTAAATCGTCGAAACGGGTAATGCTGACATCTGCCGCCGCTTCCAGTT [...]
+CTTTCCTTTTTATACTTCCTTAAAAATCCCCATGTGTTTTTAATTCAATGATTTAGCGTGGAAATCTTTTCAGGTGCGTTTTGATTTATCCCTACGTATCCGGAAAATTGTGGGTCAGATTAAGGGTTCATTCAGTTCGATGAACGGAGAGACCCTCATGTTAACTGATAGCAAGATCTGCGCCGCGCCTCCTCGAAAAACCCTACAAAAATCACCGATTCACAAATTCTGTACCTGACGGCTCTAAGCTATGGTATTTCCGCTATCGCTTCGGCGGTAAAGAAAATCGTCTGACTTTCGGCCCCTATCCGCAGGTTACGCTTGCAAAAGCCCGCGAAAAGCGCAATGCCGCGCGTAAGCTGCTGGTATCGGGTATCTGCCCTTCTCTGATGCCAGTGAGCGTCAAGGAGCGCAACGGCGTGCGGGCGGCGTATGTACATGGAGGCGCGTATGGAGATGATGCAGTGGTGGTCAGATTATCTGGACGTGAGC [...]
+NODE 97 645 33164 30853 0 0
+GCCAGTAGCTGCGCTACGATTTTGCCCACGGTCAGACAGATAGCAATCAGGGCGATGGTTTCGATTAGCACCAGAGAGGTGATCATACGGCCCACATCCGGCTTTTCAAAGGCCGTCGGCACGGCCTGATCGTCAGGCATTCCATCCGGCGTGGTGGAGTGTTTCACCAGATAACGCGCTACCGGGCCGCCAATCAACCCGCCCAGCACCAGGCCAAAGGTTGCACATGCCATCGCAACTTCGGTGGCACTGGCAAAACCATAACGTTCGACAAACAGTTTACTCCACGCCGCGCCGGTACCGTGTCCGCCGGACAGCGTAATTGACCCGGCAATCAGCCCCATTAACGGGTCCAGCCCCAACAGACTCGCCATGCCGATACCGATGGCATTCTGCATCAGCAGTAATCCGACCACGACGACCAGGAAGACGCCAACAACACGCCCCCCCTTGCGCAGGCTGGCAAGGTTAGCGTTAAGGCCGATCGTCGCG [...]
+GGGGGCTACTGGTCGCGGTTGCGCTGCTGGTGCTGAAAAAAAGCGTCGGTTGGGAGGTCAACTTTGATATGACCCTGCGCGATCCGTTGATGCTGGCGTTTTTCGCGACGATCGGCCTTAACGCTAACCTTGCCAGCCTGCGCAAGGGGGGGCGTGTTGTTGGCGTCTTCCTGGTCGTCGTGGTCGGATTACTGCTGATGCAGAATGCCATCGGTATCGGCATGGCGAGTCTGTTGGGGCTGGACCCGTTAATGGGGCTGATTGCCGGGTCAATTACGCTGTCCGGCGGACACGGTACCGGCGCGGCGTGGAGTAAACTGTTTGTCGAACGTTATGGTTTTGCCAGTGCCACCGAAGTTGCGATGGCATGTGCAACCTTTGGCCTGGTGCTGGGCGGGTTGATTGGCGGCCCGGTAGCGCGTTATCTGGTGAAACACTCCACCACGCCGGATGGAATGCCTGACGATCAGGCCGTGCCGACGGCCTTTGAAA [...]
+NODE 98 4189 229228 223033 0 0
+TGATTATCTTGATCGCCAGTACATGCTGGGAGATGCGGTCATGGTAGCGCCGGTATTTAGTGAAGCGGGCGACGTGGAGTTCTACCTGCCAGAAGGCCGCTGGACGCACCTGTGGCGCAACGATGAAGTGCAGGGCAGCCGCTGGCATAAACAGCAGCATGACTTCCTGAGCCTGCCAGTGTATGTGCGTGACAATACACTACTGGCGCTGGGCAACAATAGCCAGAAGCCCGATTACGCCTGGCATGAGGGTACGGCCTTCCAGTTATTCCATCTGGATGACGGCTGCGAAGCGGTCTGCGAAGTCCCTGCTACGGATGGTTCGACAATCTTTACGCTGCAGGCGAAACGCACAGGCAATACCATTACGGTGAGCGGCGAAGGCGAGGCGCGCAACTGGACGCTGTGTCTGCGTAATATTACGCAGATTAGCGGTACCAAATGCGGTTCATATGCGGGAAGTGAACTGGGCGTAGTGGTCACCCCGCAGGG [...]
+ACCAGCTTGCGACCCAGTAGCAGCACCAGCGTGGCGGCGACAAGGGTCGATAAGGTATCGAGTTCAAACATTTAAAGCTCCTGTAGTGCGCTGTGACATGTGCGCACAAATCATTTCCTGAGTCAGTTTTTTAGCTCTTTGCGAGTCTTCGGCATGGATTTTAAGCAGAAAAAGGCAAAAAGTTATATAAAAAGGTGCATTTATCTTTTTTAAATATTAAGAATATTCGCTCGCAATCGTTTGCTTTTACCATCTGGTCAGATAAAATCACCGCTTTTCCACCACGAGAATGTCCCTGATGTCCGTTAACGCCATCGAGCCGGCAGATGCGCAACCGGTTGCGCAGACGCAAAACAGCGAATTAATTTACCGTCTTGAAGATCGCCCGCCGCTCCCTCAAACCCTTTTTGCCGCTTGTCAGCATCTGCTGGCCATGTTTGTCGCGGTAATCACGCCAGCGCTGTTAATCTGCCAGGCGTTGGGTTTACCGGC [...]
+NODE 99 9040 465535 461158 0 0
+GGATGCTGACTGGCGCGGGATGCGCGCTGTTTACGTTGTGCTTTGTACCCGGTAAACGCGGTAGCGTACTGACGCTGATGATGGCGCAGACGCTTTTTATTGTCATGCTGTGGGGAGTCGGCAGGGCGGCGACCCAGTTGGCGCAGGAGGGCAGCCCGCTGGCGCGTACCAGTCTGGGAAGTGGACTGTGGCTGGGCCTCGGTCTGATGCTGCTGGCCTGTAGCGATGCGATCCGCCGTATTACCGTTGGGCCGCTGTGGCGCTGGTTGCTGCACGCGCAAATTGTCATTGTCCCGCTGGCGCTGCTGTTTTCAGGCACGTTCGACAACCTCTCGCTTCTGAAAGAGTATACCAATCGCCAGGATGTTTTCGATGCCGCGCTGGCGCAACATTTAATGTTACTGGCGGGCACGGTGCTGCCGGCGCTGGCGATCGGACTACCGTTGGGCGTCTGGTGTTATTTTTCCGCCTCACGCCAGGGGCCGGTGTTTA [...]
+CGCGTAACGCCGGTTTTATCAATAAGCGTTTCGACGGCGTGCTGGCGGCTGAACTGGCCGATCCGCAATTGTACAAAACCTTTACTGACGCCGCTGCGGTGATTGGCGAAGCATGGGAAAGCCGTGAATTCGGCAAAGCTATCCGTGAGATTATGGCGCTGGCCGACATCGCTAACCGTTATGTTGACGAGCAAGCGCCGTGGGTGGTGGCTAAACAAGAAGGCCGCGACGCGGATCTGCAGGCCATTTGCTCAATGGGCATCAACCTGTTCCGCGTGCTGATGACGTATCTGAAACCGGTACTGCCGACGCTTTCTGAACGCGTTGAAGCCTTCCTGAACAGCGAACTGAACTGGGATGCCATCGAACAGCCGCTGCTCGGTCACAAGGTCAACACCTTTAAGGCGCTCTACAATCGCATCGACATGAAGCAAGTTGAAGCGCTGGTTGAAGCGTCTAAAGAAGAGGTGAAAGCCGCAGCTGCGCCGGTTA [...]
+NODE 100 1706 74829 72905 0 0
+AATAGATATGAAAGAAGGATGACGACAGCCAGGAGTCCAAAGCGAACAGGCCGCCATAAGAATGTCCCCATACCCCGCGCCGTTCGGAGTTGATGGTTATTCCTTGTTCCACCTGCGGCGCGATATGTCTCTCCAGTAGCTGGCGGAACGCTGGCCCGCCGCCGGTTTTACGATGAAAACGCGGGTTATTTTCACTGTCATCGCGATCGATTCCCGGCGCCGGCGTATAGTCATAAGCTCTGCCGTTAAGATCAAACGGCAGGTTAGTCTGATAGCCAATCGCCACAATCACCGGCGGCGAGTGGTCTGCCAGCTGTTTGAGCAGCGTCTCCGGCAGCCTGTCCATCACTGCGTTGCCGTCCAGCATATATAAAACAGGATAACCCGACGGCGGGGCGGCTTTATTGGGAATAGCGGTCCATACCCGGTAATGTCTTGCGCCATCGGTAGATTGAAAGTCATTGACCCTAAAATGGTAATATCCCGAACCTT [...]
+TAAAGATAACGTGGCGAAAGGTATGATGACGCAACTGCCCACAACGGATATCTGGCATCTGACGCTTCGCTTACCGGCGTCCTACTGCGGTTCCTATACGATGGTCGAAATACCACCGGAAACCCCGGACGAGACGGTGTTGCAGCTTGGAAGCCGTTTCGCCTCCCTTGTCGGGAAGGCGGACCCGCTGAACAGCACGCCGGGAATAAATGTTCGGGGTAATACGCAGGAGTCCGTTCTAGCGTTGGATCATGCCCCGGCACAGGAGGAGTGGTCAGGCTGTCGCGCTTACGCCGGGCAGCTTTTCACCTCAGAACATCGGCTCGCCGGACAACGTCGCCGTGTGCGGCTGTATCTTCCTGACGTTCCTGTCGTACAACCGCTGGGCTTACTGGTACTCACGGATGGCGAGATCTGGTTCGACCATCTTGGGGTAAGCGCCGCCATTGACGCCGCCATCCGCAGCGGACGCATCGCGCCGGTGGCCGTACT [...]
+NODE 101 1692 92789 92136 0 0
+GGCGGCGCGCTGCTTAACCTGAACGGCGAGCTAATCGGGATTAATACCGCGATCCTCGCGCCAGGGGGCGGGAGCATCGGCATTGGCTTTGCTATTCCTTCCAATATGGCGCAGACGCTGGCGCAGCAGTTGATTCAGTTCGGCGAAATCAAACGCGGATTGCTGGGAATTAAAGGCACTGAAATGACCGCTGATATCGCTAAGGCATTCAAACTGAACGTTCAGCGTGGCGCTTTTGTCAGCGAGGTTTTACCCAATTCAGGTTCGGCGAAGGCCGGGGTGAAATCCGGAGACGTGATTATCAGTCTTAACGGTAAGCCGCTGAATAGCTTTGCCGAACTGCGTTCACGTATCGCCACCACCGAACCGGGTACGAAAGTGAAGCTGGGCCTGCTGCGCGATGGTAAGCCGCTGGAGGTGGAAGTCACGCTGGATTCCAATACCTCTTCTTCCGCCAGCGCCGAAATGATCGCCCCGGCGTTGCAAGGCGCG [...]
+CTACCCTGCTGCGCGTGCAGCGGCGCGATTTCTCGTCCGCCAATACCGATATAGCCGCGAATCACGCGACCGTCGCGGATAAGCTTATCCATAATTTTCGTGGCTAGCTGGAAGGGAATCGCAAAACCAAGGCCTTCCGGCGTTTCGCCATCGTTACTCTTATCAAAAGAGAGGGTGTTGATCCCCATCAGTTCGCCTAACGAGTTGACCAGAGCGCCGCCGGAATTACCGTGGTTAATCGAGGCGTCGGTCTGGAGAAAATTCTGTCGCCCCGTCGGGTTCAGGCCGATACGACCCGTTGCGCTGATGATCCCCTGGGTGATGGTCTGTCCCAGATTATATGGGTTGCCGATAGCCAGTACGACGTCGCCAATATGCGGTGTACGCTTTGTATTAATCGGGATGGTAGGCAGCCCGCCAGTGGCGTTGATCTTCAGCACCGCCAGGTCGGTAAGCGAATCGGAGCCAACCAGTAGCGCTTCAAAGACGCGG [...]
+NODE 102 542 26698 26026 0 0
+TATCGTAATCACTGAGAAATTAAATCATGCTTCGCTTGATTTATGGCATATCCTTAAGTTATGCCTGTGGCATTACGGTATCATCGCAGGGTTTATTTTTATGGCGGAGTATACGTTAAGTAAAAGTATACGGCAGGTTCAGCGCTTGTCCAAAAAGTTTGGGGCACAGGATTTTTCTTCACGCCCGTGATCCGCCGCTGCAGCCTGCGTTCTTACTGAATAATGGCTATGACTAGCAGACCGAATTATCTCGGTTCGAGGGGGATTCTATGTGTTTGCACAACTGCGGTGAATCGTAATTTCAGATGCATTATCGCCGACAATTGACGCGTTCCTCACTAATTGCCTTCCTGACTATATAGTGGTCTTATCTTTGACAAAACAATGTTATTTAGTTATGGAAGGCGACAACAACTGTACTACTGATTATCAAATAACCTTTCTGGTCAGGTAGACTCGCCTTTGTGAAAACACATCGTTATCTGTGTTCCT [...]
+AGGAACACAGATAACGATGTGTTTTCACAAAGGCGAGTCTACCTGACCAGAAAGGTTATTTGATAATCAGTAGTACAGTTGTTGTCGCCTTCCATAACTAAATAACATTGTTTTGTCAAAGATAAGACCACTATATAGTCAGGAAGGCAATTAGTGAGGAACGCGTCAATTGTCGGCGATAATGCATCTGAAATTACGATTCACCGCAGTTGTGCAAACACATAGAATCCCCCTCGAACCGAGATAATTCGGTCTGCTAGTCATAGCCATTATTCAGTAAGAACGCAGGCTGCAGCGGCGGATCACGGGCGTGAAGAAAAATCCTGTGCCCCAAACTTTTTGGACAAGCGCTGAACCTGCCGTATACTTTTACTTAACGTATACTCCGCCATAAAAATAAACCCTGCGATGATACCGTAATGCCACAGGCATAACTTAAGGATATGCCATAAATCAAGCGAAGCATGATTTAATTTCTCAGTGATTACGATA [...]
+NODE 103 4702 262809 257507 0 0
+TCGCTTCGCTGCGCGTTTCCGGGCTGCGCCTCAATCTGTTTGCCATTCTGATTGTGATTATGGGCGGGTTGGTCACCGCGATTCTGCATAAAATTTTCGCTATTCCGCTGCCGGTGGTGCTGGGGATTTTCTCCGGCGCAGTCACCAATACGCCTGCGTTAGGGGCGGGTCAGCAAATCCTGCGCGATCTGGGAACGCCAGTGGATCTGGTGGATCAGATGGGGATGAGCTATGCGATGGCGTATCCGTTTGGCATCTGCGGTATTTTGCTCACCATGTGGCTGATGCGGCTGATTTTTCGCGTTAACGTCGAGGCGGAAGCGCAGAAGCACGAATCCTCTCTCGCTAACGGTCATTCATTAATTCAAACAATGAATATCCGTGTCGAGAATCCGAACCTCAATAATATGGCTATTCAGGATGTGCCGATCCTGAACAGCGATAAAATCATTTGCTCACGCCTGAAACGCGACGACACGCTGATGGTGCCGT [...]
+ACGATCGTGACCGATTCCCTGTTCTGGCTGGTCAAGCAGTATTGCGGCGCTACGCTGAATGAAACGTTTAAATACTATACGACGGCCACGTTTATCGCATCTGTCGTTGCACTGGCTGGCACATTCCTGCTTTCCTTTATCATCTGATCGTAAAGAGACGTACTATGGAAAACATACAAAAGCTCATCGCCCGGTATCCTTTGGTCGAGGATCTGGTCGCCCTCAAAGAAACCACCTGGTTTAACCCGGGCGCCACCTCTCTTGCACAAGGTCTACCGTATGTCGGCCTGACGGAGCAGGACGTAAACGCCGCCCATGACCGTCTGGCGCGCTTTGCGCCGTATCTGGCGAAAGCGTTTCCGCAAACCGCTGCCGCTGGCGGCATGATCGAATCTGACGTGGTCGCTATTCCGGCCATGCAAAAACGGCTGGAAAAAGAGTATGGGCAAACGATTGACGGTGAAATGCTGTTAAAAAAAGACAGTCACCTGG [...]
+NODE 104 1696 85420 84401 0 0
+CTGCCGTTACTGGAAAAACTCACCACCGGCAGGATTGCAGAGCTGCTGGCGCCGGACTATCTGGATATGAGCGATGCGCGCCCCATTTTTGACTGGGAACAGGTGATCCGCAAAAAGGCGGTGGTTTATATCGGCCTCGATGCGCTCAGTGACAGTGAGGTGGCCAGTGCCGTGGGAAATTCGATGTTTGCGGACCTGGTGAGTGTGGCAGGGCATATATACAAACACGGTATGCATGCCGGTCTGCCCGGTCTGCCGGCTGGCGGGGCGGGTAAAAATGTGGTGAACCTGCACTGTGATGAGTTTAACGAACTGATGGGCGATGAATTCATTCCGCTCATCAACAAGGGGGGCGGCGCCGGAATGCAGGTGACCGCGTACACCCAGACGTCATCGGATATTGAAGCGCGTATTGGTAATGCGGCCAAAACGGCGCAGGTTCAGGGGAACTTTAACAACATGATCATGCTGCGCGTCAGGGAGAACCGGACG [...]
+CCTCTGTGGATTATAAATATTTCTTGAAGGATGCCATTGTCACGGTGACAGCCATACCCAGCAGCATGGCCGCCGGCCATATCAGCAGATTCGGGTACACGGCCGTCGGCCAGGAAAGATAGAGAATACAGGGAATATATATCGCCGGTTTAATGGACTTTTTCGCATGGTGATAAACAAAGCTGGATTCATACGCGGCACCATACCGGCGCAGATCACGTCTGCCCAGCCCCTCAACCACGGCCACCAGGATCACCATCACGAACAGTGGCACGGACAGCACGAGAATAATCACCCTGACCATCGTCACCACCGTCACATAAACCGTTGCCAGCAGGTAATCATGAAGATGATATGCCAGCCACTGGCTCAGCTCTCCGCTGAACTGCGACACACTACGCCCCGCCGCCGTTACCGCCTGCTGCGACTGCAGCCATGACTGCATACCACTTTCCACAAACAGCCACTGATACGCCAAGGAAATCCAGCCCG [...]
+NODE 105 105 37578 29629 0 0
+TGTGCGGGCCCCCGTCAATTCATTTGAGTTTTAACCTTGCGGCCGTACTCCCCAGGCGGTCTACTTAACGCGTTAGCTCCGGAAGCCACGCCTCAAGGGCACAAC
+CTGGGGAGTACGGCCGCAAGGTTAAAACTCAAATGAATTGACGGGGGCCCGCACAAGCGGTGGAGCATGTGGTTTAATTCGATGCAACGCGAAGAACCTTACCTG
+NODE 106 3019 139603 138421 0 0
+AGGCGGTAGAGATAGAGCGGCCCTCCCGCTTTTGGCCCGGTGCCGGACAGGCCTTCGCCGCCAAACGGCTGGACGCCGACGACCGCGCCCACCATATTACGGTTAACGTACAGGTTGCCGACATGGGCGGAACCGGTGACTTGCGCAATGGTTTCATCAATACGGGTATGTACGCCCAGCGTTAGCCCGTAGCCGGAAGCGTTAATCTGTTCGATAAGCTCCGCCAGTTGGTTACGGTTATAACGCACGACGTGCAGCACGGGCCCGAAGACCTCTTTTTCCAGTTCTGCGAAGTTTTCCAGCTCAATAAGCGTGGGCATAACAAACGTACCGGTCTGCCATTCCTGCGCGTCATCGCTGTTTTCACGCGCGGCCTGGAAAACCGGGCGGCCTTTGGCGCGCATCGTCTGGATATGACGTTCAATGTTGGCTTTGGCCTCGCTATCGATCACCGGCCCGATATCGGTCGTCAGACGGCCTGGATTCCCCATC [...]
+GTCGCTGAGCAGGCGCATAAACTGGCGTATCAACTGGCGGAGAAATTGCGCAATCAAAAATCCGCCAGCGGTCGCGCGGGTATGGTGCAAGGCCTGTTGCAGGAGTTTTCCCTCTCTTCGCAAGAAGGCGTAGCGCTGATGTGTCTGGCGGAAGCGCTGCTGCGTATTCCCGACAAAGCTACGCGCGATGCGTTAATTCGCGACAAAATCAGTAATGGCAACTGGCAGTCGCATATTGGCCGTAGCCCGTCGCTGTTTGTAAACGCCGCCACCTGGGGGCTGCTCTTTACCGGCCGACTGGTCTCAACACATAACGAAGCCAATCTTTCACGCTCGCTGAACCGCATTATCGGCAAGAGCGGCGAACCGTTAATCCGCAAAGGCGTCGACATGGCGATGCGTTTAATGGGCGAGCAGTTCGTGACTGGCGAAACCATTGCTCAGGCGCTGGCGAATGCCCGAAAACTGGAAGAGAAAGGGTTCCGCTATTCT [...]
+NODE 107 6748 340303 333504 0 0
+GTGCGCGTTTCAGGGAATTAGTTGAAAAACGGCAACGGTTTGCCACGATTCTGTCGGTTATCATGCTGGCGGTTTATATCAGCTTTATTTTACTGATCGCCTTCGCGCCTGGCTGGCTGGGCACGCCTCTACATGCGGGAACCAGCGTCACCCGAGGAATTCCCATTGGCGTCGGGGTGATTGTGATTTCTTTTGTGTTGACCGGAATTTATATCTGGCGGGCGAATGGCGAATTCGATCGTCTTAATAACGCCGTACTGCATGAGGTGAAAGCATTATGAAGAGAGTTCTGACGGCGCTCGCCGCCGCACTCCCCTTCGCCGTTCATGCGGCGGATGCCATTAGCGGCGCGGTTGAACGCCAGCCCACCAACTGGCAGGCGATTATCATGTTTTTGATTTTCGTCGTGTTTACGCTCGGTATTACCTACTGGGCCTCTAAACGCGTACGTTCCCGTAGCGACTACTACACCGCAGGCGGCAATATCACCGG [...]
+GAAAAGCTGAAAGTCCCCGGCGGCATTCTGTTGACCATTATTGGCATTTCTATTGTGGGTTTGCTCTTCGATCCTAACGTCCATTTTTCCGGCATTTTCGCCATGCCTTCGTTGAGCGATGAAAACGGCAACTCGCTGATCGGCAGCCTGGATATTATGGGCGCGTTAAACCCTGTCGTTCTGCCAAGCGTACTGGCGCTGGTGATGACGGCGGTGTTTGATGCGACCGGAACGATCCGTGCGGTCGCAGGGCAGGCTAATCTGCTGGACAAAGACGGACAAATTATCGATGGCGGTAAAGCGCTAACCACCGACTCCCTGAGTAGCGTTTTCTCCGGCCTGGTCGGGGCGGCGCCCGCCGCGGTGTATATCGAGTCTGCGGCCGGTACGGCGGCGGGCGGTAAAACGGGCCTGACGGCGATTACCGTGGGCGTGCTGTTTTTGCTGATCCTGTTTCTTTCGCCGCTCTCTTATCTCGTTCCCGTCTACGCA [...]
+NODE 108 773 39470 39220 0 0
+GGGATACCCGGATTCGAACTGAATCTCCGCCAGTGTTTGAAAAAAGCCACGGGCGTTAATATAGGTTTTACGCACGTGCGGATCGGCAATTAATTCATCGTACCGTTCGCTAATGGCGATATCGCCAAACGGTTTGCCGTAGCGTCGTTGTACGTCATAGGGCGAAAAGAGCGCCATTTGCGCGTTTTCTTTCGCCAGCCGGAAGGTGATATCCGGGATCACCACGCCGAGAGAGAGCGTTTTGATCCGGATTTTTTCGTCGGCATTTTCCCGTTTGGTATCCAGAAAACGCAGAATATCCGGATGGTGCGCATGGAGATAAACCGCGCCGGCCCCCTGGCGCGCGCCAAGCTGGTTGGCATACGAAAACGCGTCTTCCAGCATTTTCATCACCGGGATCACGCCGGAAGACTGATTCTCAATGCGTTTGATCGGCGCGCCCGCCTCGCGCAGATTGGAGAGTAAAAACGCGACGCCGCCGCCGCGTTTGGA [...]
+GAACACTTTGAAGATCGGGTGACAATGGTGGCGTTGACGCTGGCGCAGGGTGACGAAACGCTGGCCACCCAACTGACCGATGAAATGCTTTCTGGTCGCTTTCAGCCCGCCACCCCGACTTTTTTAAATTGCGGCAAACAGCAGCGTGGAGAACTGGTCTCCTGCTTCCTGCTCCGTATCGAAGACAATATGGAGTCGATCGGGCGGGCGGTGAATTCGGCGCTACAACTCTCCAAACGCGGCGGCGGCGTCGCGTTTTTACTCTCCAATCTGCGCGAGGCGGGCGCGCCGATCAAACGCATTGAGAATCAGTCTTCCGGCGTGATCCCGGTGATGAAAATGCTGGAAGACGCGTTTTCGTATGCCAACCAGCTTGGCGCGCGCCAGGGGGCCGGCGCGGTTTATCTCCATGCGCACCATCCGGATATTCTGCGTTTTCTGGATACCAAACGGGAAAATGCCGACGAAAAAATCCGGATCAAAACGCTCTCT [...]
+NODE 109 6394 298141 295131 0 0
+AGACGATATCGGAAAACAGACAGGTACTGGACATACGGAAATCAAGCGTGACCAACAGATCGAGCTTGCCCTCAATCGCGGCGGACTGCCATTCCACCTCTTCAGGCTGAATTCCTTCGCTGGAACCCAGCGCTTCGCCCTGGATACCGCTGTCGGTGCCCAGCAGATATTTGAGCATGTACTCATGACCTTTCCCGGAGGAGCCGAGCAGGTTAGAGCGCCAGACAAATAAATTTCGCGGGTGATTATGACCACTGTCAGGCTGTTCGCAGGCAAAACGGATAGCGCCTGATTTCAACGCCTGCACGGTATAATCCGCCGCAGACAGCCCGGCTTTATCGGCGCTCGCTTTCACGCTGAGCGGGTTAAGATTAAGCTGCGGCGCCGAGGGTAGCCAGCCCATACGTTCCGCGCGCACGTTGAAATCGATCAGGTGTCCGGAAAATTTAGCCGGATCGGCCAGCGGCGACAGCAACTCTTGCGCAGTCAGTT [...]
+CCTTTTGGCGACTGACGGGGCAATACGCACGCCTCAGCGGTAAAGAGGTTGAGGAAATGGACTCCCCCTGCCAGCTAGCGCATTAAGCGCTTATCTCACCAGGCGTTATGTTATCGGCGTTGGGCTTTTGCCAGGCTGAACCACATCCCTACCGCCAGCAAAAGAAGCATGCTCCCGGCGCTGCTTAACGCCACGCTATGCGACCAGATAAAGGCGTGTCTGGCGGCGTCCAGTATTGTCTGCCCCAGCGTGGGCGGCAGGCTATTCGCCAACTGCACGGCTTCTCCCATTGAAGATGACGCTCTGGCAATCTCTTGCGCCTCAAGCCCGGCAGGCAGACGGATAGACGCGGAGAAGCTACGGCTTAACAACAGGCCGAAAATGGCGATGCCCAGTCCCGCGCCCAGTTCATAAGCCATCGTTTCTATCGCGCCGGCCGCCGCCGCTTTTTCTGCCGGCACAGCGGCCATAATTGCCGACGTGGAAGCCAGC [...]
+NODE 110 3024 172223 170884 0 0
+ATAGATAGGCAACCAGCTAATCATGCCAAACCGCACCATATAGACGAAGACATCCACCAGCGAAATATACCAGGCATTTTTATTGCGCAGCACATAAGTACAGAAGATTTGCCATGCGCTCATATTTTCCGGCGCTTTTGCCGTATTCTTCGTTTTCAGTATGACTTTTTCTTCCGGCATCATCTGTTCCAGGGAGGGAAGACCTTCTTCGCGCGGCGAACCTTTTCCCAAGACCAGAACAATTAAGGCAAAAATGACGGCGACGCAGGCCGGAACGATATAACTGGCGCTTTGCCAGTGTTCGTTGCCCAATATCGCAAAAGCCGCACCGACGATAGGCGCGACGATCCCGCCGCCAACGTTATGCGAGATATTCCAGAAGGCGCCTACGCGTCCGCGTTCCCGACGAGGGAACCAGTTTGCAATGGTAATAAACGAGGGGCCGACGCCCATGCCCTGAAAAAGGCCATTGAAGACCACCAGAGCGGCAAA [...]
+TGTACCAGCGAATTTAGCTCCGTGGTGAAATCATCATGGAGCCAGTCAATGCGAGCGGAAAGCTCGCTGACTTTCTCCCGCACCAAAAACATGTTGTAGAGGGCGTTGTCCAGTTCCGCCAGCAAGGTCCGGCTATCCTGTAAAATGACGGCCAGTTGCCGGCGTTCAGCAAGCTGAAGCCCCTGACTGAGACGCTCAATCTTATCCAGATGCTGAATAATCTGCGTACGTAACTGCAAACGTACTGTCGTGTTCGGCGCCAGCAAAAATTCATTGAGCTGATCCACGGCCAGATTCAGGTTCCCCTCAATTAAAAAAGCGGAGTGGATGCGAGGAAAATATTCATCAAGCGAATAGCGAACCTGCGAACTTTGCTCATGCCAGGAATAAAGGCTGACCATACTGACAATCAGCGTCAGTAATGCGCCCGTTAAAAATGCGCCCCGTAAACTGTTGCTGATGCTGAGCTGACGAAGCCGTTGCAATAATCTC [...]
+NODE 111 11549 656878 644834 0 0
+GCGATTGGCGCAGGGATCGTTTTTCTTCCTGTCCAGGTTGGCCTGATGGGACTTTGGGTCTTTTTACTCTCTTCTATTATTGGCTATCCGGCCATGTACCTGTTCCAGCGGCTGTTTATTAATACGCTGGCGGAATCCCCGGAATGTAAAGACTACCCCAGCGTGATCAGCGGCTATCTGGGCAAAAACTGGGGTATTTTATTAGGCGCGCTGTACTTTGTGATGCTCGTCATCTGGATGTTCGTCTATTCTACGGCGATTACTAACGACAGCGCCTCTTATCTGCATACTTTCGGCGTAACGGAAGGATTACTTTCCGATAGTCCATTTTATGGTCTGGTGCTGATCTGCATCCTTGTAGCGATTTCCTCACGCGGTGAAAAATTACTGTTCAAAATCTCCACCGGCATGGTGCTGACCAAGCTACTGGTAGTGGCGGCGCTGGGCGTCTCTATGGTGGGTATGTGGCATCTGTATAACATTGGCGCGCTG [...]
+GGAACGCTTCTCGATGCTGAAATATGGTCTGGCGGTCATTCTGGTCTTTATCGGCATTAAGATGCTGATCGTCGACTTCTACCATATTCCTATCGCGATTTCGCTGGGCGTAGTGTTTGGCATTCTGACCATTACGCTGGTGATTAACGCTTGGGTTAACCATCAGCGCGATAAGAAACTACGAGCGCAATAATCTTTTATCGGGGTAAACCTGCCCCGTCAAAAACGCCCGGCAGCGCACAGCTGTCGGGCGTTTTTGTTTAACATGTCACAATACTGTTAATGTAAAGTTATAAAACATGATCACAGCAAAAAATCCAGGATATTTCGCTTCCCGAACCTTCAACTTTCCTTATACTCAACCAGGCAAACACTTTGTTACATCCTGAAAGATGCGCCGTAAGAGCGTGCAGGGGATGACCAGCAACACAATACAAGGAATATGAAATGGCTACGCAACGAGCATCAGGGCTACTGCAGCGTTTAGCGCAA [...]
+NODE 112 171 9541 9541 0 0
+CAGGGATGGTGGCTTTATCCTTCACCAGAATGCTGGTGATCCCCAACTGGTTGGCCCCTTCTATATTATCGGCATTGTCGTCGAAAAAGACCGCATCGGCAGCGGAAAAACCTTCTTTCTGCAGGACGTGCTGATAAATACGCGCTTCCGGCTTACGCATTCCCAAATCCT
+CAGAAAGAAGGTTTTTCCGCTGCCGATGCGGTCTTTTTCGACGACAATGCCGATAATATAGAAGGGGCCAACCAGTTGGGGATCACCAGCATTCTGGTGAAGGATAAAGCCACCATCCCTGACTATTTCGCGAAGCTGTTATGCTAAAAACCGTTCACCAAAAAGCTGGAC
+NODE 113 8838 448642 443514 0 0
+CTTCCAGCATGGTGGAGAGGCCGGGAACATCAACGTACGTCTGGCCTTCCAGCCCCTGCGGGTAGATTTCCTCAACGGCTGGCGCAAAGACATAATCGACTTTGCGTTTGTTCAGCTTTTCACAATCTTCCTGCAGCGTGCGCGGATAACGCGCCAGATCGTCCGGCCGGTCAAACTGCATCGGGTTGACGAAAATGCTGACGATCACCACATCAGCCCGGGCTTTTGCCTCATCGACCAGCTTCATATGGCCGTCGTGCAGGTTGCCCATGGTGGGAACCAGTGCGACGCGTTGACCTTCCTGACGCAGACGACGAATATGCTGGCGCAGCAGCGGCAGGGTTTCAATGATTAGCACAACAAAACTCCTTGAGTTGCTTGATGATCCTGCCCGATGGCGCTGCGCTTATCAGGCCTACATCCGTTGAGGATCGGTAGGCCGGATAAGACGCGTCGCGTCGCCATCCGGCACGGTCAGAAAAATTAGTGAAA [...]
+TAACACGTCACGAATACTTCTTCGTGCGCCGCGTTGGGGCCGTATTCGCCGGATCGTCCGGCCAGACATGTTTGGGGTAACGGCCCTTCATCTCTTTTTGCACTTCGCGATACGCCCCCTGCCAGAAAGCGCTTAAATCGCGCGTAATCTGTAGCGGTCGCTGCGCAGGCGAAAGCAGTTCCAGCACCAGCGGCACGCGGCCCTGAGCGATGGTTGGGGTCTTCGCTTCGCCAAACATTTCCTGCATTCTGACCGCCAGAGCGGGCGGGTTATCTTCATGATAACGAATCGTTATTCGGCTTCCCGTCGGCACAGTGTAATGCCCAGGCAGTTCACTATCCAGACGTTGCAGCATGGCATAGTCAAGCAGTCCCCGTAACGCCTGAGTCACATTCAGAGATTTCAGACTCCGTAACGACTGTACGCCTGTCATGTGCGGCAGCAACCAGTTTTCCAGAGTCGCCAGCAGCGACGCCTCATCCACGGCAGGCC [...]
+NODE 114 11099 611865 604134 0 0
+TTTCGCCATGTTCATGGTTTGCTCTTCGAGCGACTCGCGTACGCCCATACGACGTCCATCAATCACCGGGCGGATACCGATTTTCGGTAAGCTGATTTTTTTCATGACAGATTCCTCACGTTATTCGGATAAATGTTCAGTTTGTCGCCGCTTGTGAACGGAAACGGGCAAAAATGAAGATGACGGCAAAGCACAATGCCGGAACCAGTTCGGCGGTCGGGATTTTGCCTGCGGCGTCGCTAACGAAGCCCATTACTGGCGTGACAATACCGCCGCCAATAATGGTCATGACGATAAAAGACGAGCCGTACTTAGTGTCCTGTCCCAGATTTTTGATACCCAACGAGAAGATGGTCGGATACTGGATTGACATAAATGCGCTACACAACGTCAGCGCCAGCAGGCCGATATGTCCGCCGCTAAAGGCGGAAATCAGACACAGGAGCATGGCAAACAGGGCGTAGGCGGCCAGCACTTTATGCGGCGCGAAGC [...]
+GAGGATTAAGTTGCGTAAGGAATTCCGCAAGCGTTGCGGCAAGAACGGTACGATTACGGGTGCCCAGCGTTTCTTTAATCACCTCGCCGGACAGATTACAGACCGAAATGACCTCAAGCTCATTTTCCTGCGTCGCAATAAAAAGCGTGGGAGGAAGCTTGAGCCGCTTTTGCGTGACCAGGTGGCCTATCAGATTTTCCTGCACGCGCCGAAAGTCATCCTGACTCCAGGTTTGCAGTAGCGTAAGCTTTTCATCCGCAAACTGCGCGGGCATGTCGCCAGCAAACTGCGTGGTGTAAAACGCGTGGAGCGCAGGTTGTACCATAATATCAAAGGCGCGTTCAACCGCGTTTACATTTTCTTCGCCTTCAAAAGGCTGCGGCTGCCAGTAAACGGCATCGCGGGTTGAAGAAATAATGCACGGAGAAGGTACGCCATACAGTTCTTCGCTCAACGGCCAGCTACCGTGTTTCTCTTGCCACGCGTCGCAGT [...]
+NODE 115 2275 117792 116717 0 0
+CCAGCCGATAAAAATGCGCCGCCGCCGACGAAAAAAGTCGATTCGCAAACGCAGTCCACGATGCCCGATAAGAACGATCGCGCAACGGGAGATGGCCCGTCCCAGGTCAATTACTGAGGATAGTTTTCTGTCCCCGCGTGAACGGAGTGAATGATGCAATTCTCTAAAATGCATGGCCTTGGCAACGATTTTATGGTCGTCGACGCGGTAACGCAGAATGTCTTTTTTTCGCCGGAACTGATTCGTCGGCTATCCGACAGACACCTGGGCGTAGGGTTCGATCAGCTGCTGGTGGTTGAGCCGCCCTATGATCCTGAGTTGGACTTTCATTACCGCATCTTCAACGCCGACGGCAGTGAAGTCTCGCAGTGCGGCAATGGCGCGCGCTGTTTCGCGCGATTTGTTCGCCTGAAAGGGCTAACCAATAAACGCGACATTCGGGTCAGTACCGCGAATGGCCGGATGGTATTGAGCGTCACGGAAGATGAACTG [...]
+TCGGCAGGCGTCGCTCTTTGCTGCCTTTACCCATTACCCACACTTCGCCGGTATCAAGATCGAGGTGCTTTATATCCAGGCCAACCAGTTCGGATAAACGCAGCCCCGCGCCGTACATGACCTCCAGCATCGCCCGATCACGTACGGCGAGCGGATCGTTAAGATCGATGTCCAGCAGGCGGTTAACGTCGTCGACATCAATATTTTTCGGCAGATGACGCGGCGCTTTCGGTGCGGAGACACCCTTCGCCGGGTTAGCTTTCAATTCGCCCTGACTGACTAACCAGTCAAAAAAGCTTCGCAATGCCGAGAGACGTAGCGCCAGACTGGCAGGGCCAAGCCCTTTGCGCCGACTGCGCACCGCAAAACTGCGCACAATCGCAGCGTCACATTGTTGCCAGCTTTTCAGCCCGGTTTCTCCGGCTAAAGCGATAATGGCATCAAGCTGACGCTGGTAGTTCAGCAGGGTAATGGGGCTAAGCTGGCGCTCCA [...]
+NODE 116 32429 1712175 1699053 0 0
+ATATCTAATACGCCAAGCCCAGATTTAACAGTTATGAGTATAGATAAGTCTGTATTATCGCCGGGTGAAAGTGCCACCATCACAACTATTGTTAAGGATATCGACGGGAATCCTGTAAATGAAGTTCACATTAATAAGACTGTAGCGCGTGAAAATTTAAAAGGCTTATGGGATTATGGCCCTCTTAAGAAAGAAAATGTTCCAGGTAAATATACACAAGTTATAACCTATCGTGGGCATAGTAATGAACGTATTGACATATCTTTTAAATATGCAATGAGTTTCACGAAAGAAATTTCCATCAGAGGAAGACTATAAACTATATTAATTATTATGTCTAATATAATTCTTTTTATCACCATCATCTTATTATGGATGTTCACCTGGTTTTTTAGCGGATTGCTAAATAATTATTATGGCTAAAATAATACAAACGTTAAAAGGAGAAGTTTTTATGACGCCAACAACAACACAGGATTATATCTCATTGGG [...]
+TTCAGATGCTCGGGCACCTGATCCCAATGCCAGTCCTCCCGGTCGACCGTGACGCCGGTCATCCGGCGCAGTTCACGCTCCAGAGCGTCCAGCAGCGGCAGCTCCAGCGGCGTTACGCGACCTAAAAAAGCTTCAGCATAGTTTGGCGCCGGAACAAAGTTGCGACGTACCGGTTTTGGCAACGATTTAATCAGCGCAATCACTAATTCACGGCGCAGCCCCGGGATCTGCCATTCAAAACCGCTCTCGTCAACCTGGTTAAGTAGCGGCAACGGAATATGGACGGTCACGCCGTCAGCATCCGCGCCCGGTTCAAACTGATAGCTCAAACGCAGCTTGAGATTGCCCTGGTGCCAGAAGTTCGGGTAATCCAGTTTGCTGATTTTTTCCGCGCCTTCTTTAATCAGCATACTTTTTTCAAAGTTGAGCAGATCCGGCGTCTCGCGGCTTATTTTTTTCCACCAACTATCAAAGTGGCGGGCGGAAATAACG [...]
+NODE 117 14067 764321 753619 0 0
+CGCTGGTGCGGGCAGGGGATGAGGTTATCTGTTTCGATCCCAGTTACGACAGCTATGCCCCGGCCGTGGCGCTTTCCGGCGGCGTGTTAAAACGCATAGCGCTTACGCCGCCGCATTTTCGCGTCGACTGGCAGGCGTTTTCGGCGTTGCTTAGCGAGCGCACGCGACTGGTGATCCTCAATACGCCGCATAATCCCACCGCTACCGTCTGGCGCCAGGCGGATATCGAGGCGCTGTGGCAGGCTATCGGCGAGCGGGAAATTTATGTATTAAGCGATGAAGTGTACGAACATATTTGTTTTGCCGCCGAAGGTCATGCCAGCGTACTGGCGCACCCTCAGTTACGAGAGCGGGCGGTTGCCGTTTCATCGTTTGGTAAAACCTTTCATATGACGGGATGGAAGATTGGTTACTGCGTTGCGCCTGCGGCCATTAGCGCCGAAATCCGCAAAGTTCACCAGTACCTGACGTTTTGCGTCAATACGCCGGCGC [...]
+ATGACTCCCGTCGCCTGTTTCTGCGCCGCTTGTGCCGACGTCGCTCCCGGCACCAGGATAACCTTCCGGCACTCTTCTTCGCGTTTTTCGAAAATTTCGTAGCCGCGCGCCGCCTCTTCAAACGGCATATAGTGCGTGACAATCTCCTCCGGCTTCAGCAACCCTTTTTCAATAAGCGGTAATAATTCCCCCAGCCACGCGTGAACATGGGTTTGACCCATTTTAAAAGTTAGCCCCTTATCAAAGGCGTCGCCGAATAAAAAGCCGTGAATAAAACCGGCATACACGCCGGGCACGCTGACCACGCCGCCGCGTCTGACCGCCGCGATACATTGTCGCAGCGCTTTGCCGCTGCTGCCTTCCAGTTTAAGGTTCGTCAGCACCGTCTCCGTCATGCTGCCTTTCGCTTCAAAGCCTACGGCATCAATTACCGCGTCCACGCCGCGGTGGCCTGCCGTCTGCTCGATGATTTTTTCCGCCGGATCGTTCTCA [...]
+NODE 118 1381 70349 69993 0 0
+ACTGAGTATATAGCAATGATGCATAAGATTTATTTTTGGTATAAATTCCATTAAAAAAATCAAAAAATGCTAAGTTACATTTTTTTTGTTTACTCGTGGCAATTAATTTATTTTAATAGAGTTGTTTTTTATTACTTCGATAAAAAAACAATATTTTATTATCGAAGTTTTATAATGAAAACTTATTATTAAATTAAAATTGATTTACGGGATGCATTAAAGATGCGGCATCTACATCTTAATATTTAAAAAGGCTTAATACCGAAACCGGTAATACTTATTATTGGATAGATCATGCCGCAATTTATCATCAACGTTTCGGGCCTGGATATGTTGAAATTAGTCACCCTGTTCAGGAGACAGCGGCGCGCCACTGAAATAGCACATGACTTATCGATACAGAAATAACACCTGCTTTTTGCTGAACATACAAGCAGAGTTCCCTCGATAAAACGTGACAGGACAGCTTTCGCACGCTGATAGCGTTCAGCT [...]
+GTAATCCAATGGCCAGTCCGGAAGTGCTGGGGATCAGTTCCGGAGCCGCGTTTGGCGTGGTGTTGATGCTGTTTTTGGTGCCGGGGAATGCTTTCGGTTGGCTACTACCTGCCGGAAGCCTGGGCGCGGCGGCGACACTGCTGATTATTATGATAGCCGCCGGGCGCGGCGGTTTCTCGCCGCAACGGATGTTGCTGGCGGGGATGGCGCTCAGCACCGCGTTTACCATGGTGCTAATGATGCTCCAGGCGAGCGGCGACCCGCGGATGGCGGAAGTGTTGACCTGGATCGCAGGATCTACCTATAACGCCACTGGCGGGCAGGTTACGCGAACCGCGATCGTAATGGTGATTTTGCTGGCCATTGTGCCGTTGTGCCGCCGCTGGTTAACGATTTTGCCTCTGGGCGGCGATGCCGCGCGCGCGGTGGGCATGGCGCTTACGCCGTCGCGTATCGCGCTGCTGGCGCTGGCGGCTTGTTTGACGGCAACCG [...]
+NODE 119 1216 71677 71157 0 0
+GAATTTGCCGCTGGTACGCATTGGCGAGGATGCCCATCGCAATCCATTAATGCTGAAAGGCGATCGCAAAAACCTGACGATTCTCATCGTTGGCGAAACCTCGCGCGGCGATGATTTCTCTCTTGGCGGCTATCCGCGCGACACCAATCCGCGGCTGGCGAAAGACGATGTGATCTACTTCCCGCATACCACCTCTTGCGGTACGGCGACCGCGATCTCCGTTCCCTGCATGTTTTCTGATATGCCGCGCAAACATTATGACGAAGAGCTGGCGCATCACCAGGAAGGGCTGCTGGATATTATCCAGCGCGCGGGGATTAACGTACTGTGGAATGATAATGACGGCGGCTGTAAAGGCGCATGCGATCGCGTTCCGCATCAAAATGTCACCGAGCTAAACCTGCCCGGACAATGTATCGACGGCGAGTGCTACGATGAAGTGTTATTTCACGGTCTGGAAGACTATATCGACCATTTGAAAGGCGATGGCGT [...]
+AGCCCTAAATCCAGCACCATCAGACTGTAATGACCAGACTCCAGACTATGCTCGGCGGCACGCGCTGTCGAAACGCCATCACACGCATAGCCTTCGGTTTGCGCGGCGAGTATTAACCCCTGTAATAATAGCGTGTCGTCTTCAACAATCAGTATCTTCATTCGCTTAGTCTCCTGCACGGTTGCAGAATATCATCTGCGGCCTGGTAATACGTCGTTTGTACGCCGGTTAATCCCAGCATGGTTGAGAAAAGATTGTCCTGTGAATAATCCAGCGTGCTCGCCCGTTTTTGCAGGCAGGCCTGATCCACCTGATAACGCTGTTGATAATCTTTAGAAAGCCAAATGAGCATCGGGACATGTTTTTGCGTATCCGGCGCAATGGAATACGGCAAACCGTGTAAATAAACGCCATTTTCACCCAATGATTCGCCGTGATCGGAAAGATAGACCAGGCTGGTGGTGAATTTATCCTGATGAGATTTCAGCAGGT [...]
+NODE 120 8767 421187 414046 0 0
+GCGCGCTACATTCGCGAGCTGAAAGCATATCCGTACGGGTGCCTGGAACAAACCACCAGCGGGTTATTCCCGGCGCTGTATACTAATGCCGCTCAATTGCAGTCGCTCGGTATTACCGGCGATAGCGATGAAAAACGGCGCGCCGCGGTGGATATCGGCATCTCCCGCATACTACAGATGCAGCGTGATAACGGCGGTTTTGCGCTATGGGATGAAAATGGGGCGGAAGAGCCCTGGCTAACGGCCTACGCGATGGATTTCCTCATTCGCTCGGGCGAGCAGGGATATAGCGTCCCGCCGGAGGCCATTAACCGGGGCAATGAGCGACTGCTGCGCTATCTGCAGGATCCCGGCACGATGCTGATGCTGATTCGTTATAGCGATAATACCCAGGCCAGTACTTTTGCCGCTCAGGCTTACGCCGCGCTGGTACTGGCGCGTCAGCAGAAAGCGCCGCTCGGCGCGCTGCGCGAAATCTGGGAGCGCCGTAGT [...]
+CAATAGCCATGTTTACCTCTGAAATATGTTCTGTTGTTATGTCAGGCGCGGATTATAAAGAGCATCCCATCAATTGCCTATGGATGCAGGTAACATTTTTTTAAAATAAAATGAGCATTAGCAACAAAAGTTAAAGGCGCACAGCAAACTCAGGGGACTGACACAGCACGCAGTGCGTGTGTTCAGGCGTGAGAGCATGGAAAGTACGTTTGCAGCTTTCGCAGGTGAGCGTATACGCCGCACTATGCCGCGTTGAGGCGGGTTCCACGTCAAACCGCAGCCGCAGCGCCTGATGCGGACATACCGCCGCACAGCCGCCGCATCCCGTACAACGCGCCGCCGCTATCGTCAGGGTATTGTCGTCAAACTGGATAACATTTTCCGGGCAGCTTCGCCAGCAGGCGCCGCACATCCTGCACTCTTGCGGACTGATTTCGGGTACGCATTCGCTGAACGCGGAAAACGCCTGTCTGAGACGCCGTTTCCCCGGCT [...]
+NODE 121 8788 489953 485496 0 0
+CCTGTCCATGACGACCACAGCCGTGTCCGTGACGGTGTTCGCCGCCGCAACTGGCGTTCTCATGCTGATGCGCGCTATGGCAGCCTTCATGCTGATGTTCTCGATCTTTACAGCAGCCGTCGTGCTTATGATCCTGGTTTTTGCAACACCCTTCATGTTGATTTTGCATCATTGCCTCCTGCTTATTTAGATATATCTAATTTATATCTAAATGATGGGTTTTAGCAAGGGTAAAAGCCATTTTTGATATAATCTATTAATTTATAACATTTTATCCTAAGGTTATAGTTAGCGACGCGTTGCCAGAACACTATCAAAAAACAGTTGCATTTTTACTGATTAACAATCATTATCATTTAAAACTTTAATTTAGATATATCGTATTACTTCACGAAGGCAAAAAATGACGACATCATCCGCACGCTATCCACAGCGTGTTCGTAATGAACTGCGTTTTCGCGAGCTGACCGTTCTGCGGGTAGAACGTATTAG [...]
+CGAACCCACGGAGAATTGAATCGGCTAAGCAGTAGATCCGCCACCTCTTCCGCCACACGCTCGACCAGAGCAAAACGCCCGCCTTCAACATGATTTATCACCGTGTCGGCGATATCCGCGTAACTTAGACAATCTGCGACATCATCGCTTTTCGCCGACTTGCGGTTATCCCATGCCATTTCGATATCGAACACCAGTTTTTGCTCGATAGTCTGTTCCCAGTCGTAAACACCGATAGTGGTGATTACCGAAAGTTGCTCTATAAATACAATATCCATCACGACCTGCCTGCTTTTTGGCTAACCCGGATACCACTTCCGGCGAAATGTGCGTATTATCCACAGAAATAGTAAATAAAACGACACTTTCAATACGGAACAGCTTATGAGTGCAATCGCGCCTGGAATGATCCTCTTCGCGTACCTCTGCGGCTCAATTTCCAGTGCCATTCTGGTTTGCCGCATCGCCGGGCTGCCCGATCCGCGTGAAAGC [...]
+NODE 122 4768 240277 238992 0 0
+GATTATAAAAAATACTCGGAAGCGGACTACGAGTTCCATCTGGCGATTGTCAGGGCATCGCACAACAGCGTGTTCTACAACGTGATGAGCTCGATTAAAGACATCTATTACTACTATCTTGAAGAGCTTAACCGTGCGCTGGGTATTACCCTTGAAAGTGTGGAAGCCCATATCAAGGTCTACATGTCGATAAAGAATCGCGATGCCAGCACGGCCGTCGAAGTGCTCAATGAAGCGATGTCAGGCAATATTATTGCGATCGAAAAAATCAAATCTACAGAGACATCAGGGACAAAATAACCGTTGGTTACAAGCTCAAGTAGTAGAACAATTTAACATATCTGAATCCGAAATAGTTGCCATCAACTATTTAGTGACATAGTCCCACTTTAAAATCGTGGCAGTGCGGCCTGAAATCAGCGAAGCTTCAAATAGCCGATCCCCCTTAACATACAATAATTTTCATCATCATTCCCTTTATTGCTTAACCGC [...]
+CGGAAGAACGCAGTAAACGCCGTTGCGGTCTGCTTTAAAAGCGGTAAGCTTCACAGGCTGTGAGGATACTGTAAAAGGAAGGCGTTATGTTGAATCCCTCCATCCCGCTGGTGGCGACGCGTCACGGTAAAATCGTGGGCGTCGTACAGGAAGAAATCCATATCTGGCGCGGTATACCTTATGCCGCGCCGCCAACAGGGGAGCTACGCTGGCGTGCGCCGCAGCCTGTCACGCCCTGGCAGGATGTGCGCCAGGCGGATTGTTTCTCCTGCGCCAGTTGGCAGGATATTACCTGGTGTCGCGAACTCGGTGGCGGCGATCCGGGAAATTTTTCCGAAGACTGTCTCTACCTGAACGTCTGGGCTCCCGCCGTACGTCATGAACCGTTGCCGGTCATGGTCTGGCTACACGGCGGCGGTTACACTATTGGCGCGGGAAGTTTGCCGCCCTATGACGGTCATGCGCTGGCGAAACGCGGCGCGATCGTGGTGA [...]
+NODE 123 11525 666730 659206 0 0
+AGACAGTCCGCCAAACCACGGGCCGCTAAATTTCTGCTGTACATAGCCGCTTAGCAGCGCGCTTATCACCGTAATGACGATTAATTTACCGCTGCCCAGGCGCTTCTCTACCGCCCCGCCGAGATACCACCACCACAGCAGGTTAAAAAGAATATGCATCAGTGAGAAGTGCATAAAGATATGGGTGAAGTAGCGCCAGACTTCAAATTTTAAAACCGGATCGAACGGCCACGCCAGCCACACCATCACCGTCTGATCGCCGATGAGACTCATCGCGATATAGACCACCACGCAGGCGAGCATCACGATCCAGGTAACAGGGCCGGCTCGTTCACGCAGCGTGGCGAGAAAGGGAAAACGGCGGTAGCGTAGCCCGCTGTTAGTCTGCCCGGACTGCCAGCTAGCCGCCAGATAACGCGGATCGCCGGGATTTTCTATAAACCGCGCCAGCTCGACCCGCACACGTTCGGCCTGCGATTCATCTGCCAACCA [...]
+ACATTGCCAATATGGGCTACTTCTCATCGGACAGAACCATCAAAGAGTATGCCGAAAATATCTGGCATATTGATCCGGTGCGGTTGTAGCGGTTTAACGCTTGAGAACGGGGCCAAACGGCCCCGTTTTTTATCGTGGTATATTCGGGGGGTATGCCGATATTCGTCTGCTGAATCTGTTAGCGGCACTTGGTCTCTGTCATGGAAAAAGGGTTGAGTACTGGTGTATAGTATTAGCAGAAAAATCCATAATTAATTGATAATAATATGAAAAAGATTACGACATCTATTCCGGCTCTCGATAAAATTATGCGCGTATTTGCTTACCTTCTGGAGTGCGATGGCGCAACGTTTACCCAGATCCATCAAAATTCAGGGATTGCGAAAAGCAGTACCTCATCTTTGCTCAACGGCATGGTGGAGCATGGGTTATTACGCCAGGAAAAAGACAAGTATTATCTGGGGCTACGCCTGTATGAATTAGGTAATAAAG [...]
+NODE 124 7578 393940 390739 0 0
+TCACGCATTTTATCGCGCTGTCCGGCCACATCCAGGCCGCCTTCGGTGGTGACTTCCTGGCGTTTTTCCGGCACCAGACAACAGAAATGCGGCCTGGTTTCTACGGCGATCGCCAGCATCTCTTCGGTCACCGCCATCTCCAGATTCATACGCGTATGCAGCGTCTGACGCAGAATGCGCACATCGCGATCGGTAATGTGGCGACGATCTTCGCGCAGGTGTACGGTAATGCCGTCCGCGCCTGCCTGTTCAGCAATAAACGCCGCCTGTACCGGATCCGGATAGTCGGTGCCGCGCGCATTACGTAACGTGGCAATGTGGTCAATATTGACGCCTAACAGTAATTCAGCCATGACAATCCTCGTTAATCTTTCTTCGTTTTTACTGTGCGTTTGGGCATAAATTGCCGGAACAGCTCCCGGCTTTTTAACGGTTTTCCCCCAAGATACGGCTTTAATGCCATACGGGTAAAGCGTTTAGCGGCACGCAGGG [...]
+TGCACTCCGAACAGCTTCAGTTTGAGCAGGCGCAAACCCAGCAAGCCGCGGTACAGGTGCCAGGAATCCAAACTTTAGGAACGCAATCGCAGTAATGAAGCAACTTTGGTTTGCCATGTCCCTTGTGGCGGCTAGCCTGTTCTTCTCAGCAAACGCCTCGGCCGACCCTGCGTCCGGGGCGTTATTGCAGCAGATGAACATCGCCAGTCAGTCACTGAATTACGAGCTGTCATTCGTCAGCATCACGAAACAAGGCGTTGAATCTCTACGTTATCGACACGCACGCCTGGATAGTCGCCCGCTTGCGCAATTGCTACAGTTGGACGGTCCCCGCCGGGAGGTCGTACAGCGTGGTAATGAAATCAGTTATTTTGAACCGGGCCTTGAGCCGTTCACCCTGAACGGTGATTATATTGTCGATTCTCTGCCTTCCCTGATTTACACCGATTTCAAGCGTCTGGCGCCTTACTACGACTTTATTTCCGTCGGACG [...]
+NODE 125 1777 96920 96335 0 0
+GGTGAAGCCTTCACCTAATAGCAGAGCTGCATTAGTCATAAAATAGCCTTCAGGCAGGAGGCACGATAATGGGGCTATTTATGACGATGAAATAATAAGGGTGGATTTCCCTGAGCCGCCCCGGCCAGAGCCCTTGGTTATTATTATCGTCATAACGTATTACCACCATTATCGTGCAATTTACGTAATCAGGTTTATTTGATGAAACTTACGTTCTGGCATATTTCATCAGCGACGATCTCTTTACGCTGATTAAAAATAATTTTGTTCTGTTCAAACAGATTATTCCCATGGGTATCAATAGAAACAATCAGCGGGCCAAACTCTTTAACCCGACAGACCCACAGCGTTTCCGGCATCCCCAGATCGCGCCATTGGGCATCTTCAATTTCTTCCACGCACACGGCGGCTACAACCGCACAACCGGCAGGGAATACGCAGTGCAGCGCTTTGTGTTCAGCACAGCCCTCTTCCGTGCCTTTGCCCATTCCG [...]
+TGACTAAGGAGCATTTATGAGCAAAAGTGAACAGATATCCCATATGACCGACGTTATGGCCAAGTTTGTGGGATATACCGGCAAAGTTTTGCCTGATGATGTCACTGCAAAACTGGAAGATTTGCATAAGAAAGAGACCAGTAAACTGGCCGACGTCATCTTTACTACCATGATTGAGAACCAGCGTCTGGCGAAAGAGCTGGATCGACCTTCCTGCCAGGACACCGGTGTCATTCAGTTTCTGGTGGAGTGCGGGACGAACTTTCCGCTGATTGGCGAGCTGGAAGCGTTGTTGCGTGAGGCGGTGATCAAAGCAACTGTAGATTCTCCGCTGCGCCACAACAGCGTAGAAACTTTTGATGAATACAACACCGGTAAAAACGTGGGTAAAGGTACGCCGACGGTCTTCTGGGAAATCGTTCCCAATTCCGATCAGTGCAGCATTTATACCTATATGGCGGGCGGTGGTTGTTCTCTGCCGGGGAAAGCGAT [...]
+NODE 126 286 18255 18091 0 0
+CAGATTTTCAGGCGATGTCACATCAAATCGTTGGTTACATCCAAATGGTGGCGGCTTCACCATGACGGACAACCAGTGGATACGTGCTGTTAACAACAAAGGGATCACAACCGGTGGTGAAATCAAAGGGGGTTCTGTCAGTGGTAACACAGTCCGGTCTGATGGTCGTCTTACTGCCGGCGAGTATTTACAGCTAAACGGAATCGCCAACGCAGGCACTCATTGCTCACCAGACGGGCTTGTAGGCCGCGACAACAGCGGGGCCATACTTCAGTGCCAATCCGGT
+CGTCTGGTGAGCAATGAGTGCCTGCGTTGGCGATTCCGTTTAGCTGTAAATACTCGCCGGCAGTAAGACGACCATCAGACCGGACTGTGTTACCACTGACAGAACCCCCTTTGATTTCACCACCGGTTGTGATCCCTTTGTTGTTAACAGCACGTATCCACTGGTTGTCCGTCATGGTGAAGCCGCCACCATTTGGATGTAACCAACGATTTGATGTGACATCGCCTGAAAATCTGGCGTTTTTACCACTGGCTTCATTGATATTGGTGATGCTGTTATTATTCAT
+NODE 127 8566 406610 402951 0 0
+GTACATGCGTGGAGAAGAGGGTTACTCCCGCTTCTTCGCTTATACCAACCTGTTTATCGCCAGCATGGTTGTTCTGGTGCTGTCCGATAACCTGCTGTTGATGTACCTCGGCTGGGAAGGCGTGGGCCTGTGCTCTTATCTGTTGATCGGCTTCTATTACAGCGATCCGAAGAATGGCGCAGCGGCAATGAAAGCCTTCGTGGTGACCCGTGTCGGTGACGTATTCCTCGCCTTCGCGCTGTTCATCCTCTACAACGAACTGGGCACGCTGAACTTCCGCGAAATGGTCGAGCTGGCGCCAGCGCACTTTGCTGACGGCAACAACATGCTGATGTGGGCGACGCTGATGCTGCTGGGCGGCGCGGTCGGTAAATCTGCGCAGCTACCGTTGCAGACCTGGCTTGCCGACGCGATGGCCGGCCCGACGCCGGTCTCCGCGCTGATCCACGCCGCTACCATGGTGACCGCCGGTGTCTACCTGATCGCTCGTAC [...]
+CGTCGCCGGATTTCACCACCTGGCCGCTGCCGCTGATGGCGTTGTCAAAATCGCCGCCGGTGTTCATCTCCAGCGTGGCGTTGTCGGTGACGTTGCCGGTACCCAGCGCCTCAACGTTGGTGGCAATCAGCGTACCCTCGCTGATGGTGGTGCTGCCGGTATAGGTGTTTTCCGCATTCAGGATCAGCGTGCCTGCGCCGGTTTTGGTAAGCGACTGGCCGTTCCAGCCGCTGTTGGCGTCAACGTCTTCCAGCACCGTGTTGACCGTAAAGCTGTCGTCGGCATCCGCCAGGTTGAAGGTGCCGTGGGCGTCGATGGCGGCGTTGTCGCGATCGGCATACCACGTCAACGTCTCGACCAGATCATAGTGTGTGTCATTGACGTTTTTCTGCCCCACGACGGTAATGAACGCGTCCGGGTTCATGGCGTTGCCGTTGATAGTGATGTCGTCAAAATCGCCGCTAATGGCGTTGTCCGATTCGATAAGCGCCA [...]
+NODE 128 6176 299900 298685 0 0
+CGACAGGCTGCGAGCGAACAGCGACTTCGTGCCGCTGTGCGTCTCCGCGCTGGCGCGAGCGAGAGCGGACTGGCTGTATGGCATTAATATGACCCGCGCTTACACGATCCTGGGCCGTAATGCCGGCTATCAGGGCGTGTTATCCGTGGGACGCGTGCAGACGCCGGTACTGGGGCTGGTGGTGCGGCGAGACGAAGAGATTGAGAACTTCGTCGCCAAAGACTTCTTTGAAGTGAAGGCGCACATCGTTACGCCTGCCGAGGAGCGTTTTACCGCTATCTGGCAGCCGAGCGAGGCGTGCGAACCTTATCAGGATGAAGAGGGGCGCTTGCTTCATCGTCCGCTGGCGGAGCATGTAGTGAACCGAATCAACGGTCAGCCCGCGCTGGTAACCAGTTATAATGATAAACGGGAATCAGAATCCGCGCCGCTGCCGTTTTCGCTCTCGACGCTACAGATTGAAGCCGCTAAACGCTTTGGCCTGAGCGCGCA [...]
+CACACAGCCAAGCAGTAGCCCCAGCCCGCGAATTTCACTGAACATGCCAAAACGTACATTAATGGTATTTAGACGTTCAATAAACGCATCGTGGCGCTGTCTGATGCCGTTTTGCATCTCCGGCGTATTGATGATATCCAGTACTTTTCCGGCAACTGCCGTCGCCAGCGGATTACCGCCGTAGGTGGTGCCATGGGTGCCTGGCGTCATAACGCTGGCATAGTCTTGCGTGGTCAGCATCGCGCCGATCGGGAAGCCGCCGCCCAACGCTTTAGCAGTCGTCAGGATATCGGGCGTAACGCCATAATGCATATATGCATACAGTTCGCCGGTACGTCCGACGCCCGTCTGCACCTCATCAAAAATCAGTAACGCCTGATGCCGGTCGCACAATTCACGCAGCCCCTGTAAAAAAGCTTTCGTGGCGGGGATCACGCCGCCCTCGCCCTGCACAGGTTCTACGATCACGGCGCAGGTATTGTCATCAATTAG [...]
+NODE 129 917 62972 62755 0 0
+CGGCAGCGTAGCACGGCTACCTGACTTATTTAGGTCTCTACCACTTATTGAATCTTCTAAAACATAAAAATGCGGCATAGAAAAACAAGCCTCCCATTAAAACCCGCACCAACAATTTTGTAGAAAAATAAATAGGTTGCTCAATATGAACAGTAAGAAAACCTTTGATTAAAACATAAGACATCCATATAGACTCGATGGATAAAAGCAAAAAAAATATAGACACAAATAAAATGAAATACTTCACAAAAACCTCTCTTCAATATGAACTATTCGCACAGATAGCATCTGGTGAACTAATCAGTTCTTTCCCATATAACAGCAATTCCTTCTTCCACCGCTCTATAAACTGTCCTGTGTTTAGAATTCTATCTACCCAAATAATTGTCGTCATTCCAGGTATTGGAATTGATGGTTCCTTGAGTGGAACCTTTACGGGCATCCTATCTACTGGCACCATAGCTCCCACCTTCCACTCTTTCAAAACACGTT [...]
+TGAAGGGTGAGGTTTACCTCGTTTTGCGCATCAGACTTTTATTAATCCCGGTTATTCCGGGATTAATATTTTTAGTAAAGATAAAGGTCTGTTTTCGTACATCGAGTAATTGGCATGAAAGCATAATCTGTTGATACAAATCATAAGTTCGGAGAAAATGTCAACTTACACCAAATCCTGTATCGATTCCTGATTCGCAGGGATTCAATGTTACTGGGAAAATAGATAGTATAATTCCATCTATTTCAGATGCGGAATATATGGGGTTGGAACCCGTGATACGACAAGAAGGGTTGCAAGATTATATTGCTGATATGAAGTTTAATGTATTAGGTAAATTGAGTGTGACACTTACATGTAAAGTTTCTGACAGAGAACGTGTTTTGAAAGAGTGGAAGGTGGGAGCTATGGTGCCAGTAGATAGGATGCCCGTAAAGGTTCCACTCAAGGAACCATCAATTCCAATACCTGGAATGACGACAATTATTTGGG [...]
+NODE 130 6630 371661 369077 0 0
+CTTTGTATGCACATGCAAGGCAAGCTCCTGGAAAACCGCAATAAGATGCTGAAGGCTCAAGGGATTAACGAGACGTTGTTTATGGCGTTGATTACGCTGGAGTCTCAGGAAAACCACAGTATTCAGCCGTCTGAATTAAGCTGCGCGCTGGGTTCATCTCGCACCAATGCGACACGCATTGCAGATGAGCTGGAAAAACGCGGCTGGATTGAGCGTCGTGAGAGCGATAACGACCGCCGTTGCCTGCATCTGCAATTAACGGAGAAAGGCCAGGCATTTTTGCAAGAAGTGCTTCCGCCTCAGCATCATTGTCTGCATCAACTCTGGTCATCACTTAGCACAGCCGAAAAAGATCAACTTGAGCACATCACTCGTAAACTCCTGACGCGTCTTGATCAAATGGAGCAGGAAGGCACTGTTCTTGAGGCGCTGCGCTAAAGCGCCGACCCGCTCAAAAATCCAGATTAATAACAGGAAAGCGGACAGGCCGGC [...]
+GCTGCGTTTGAGTGATTTGGGCTATACCAATAAGTCGCAAAGCAATCTCGGAATTACGTTTAACGATTTGCATGAGTATGTGGCAGGTCTGAAGCGGGCGATTAAAACCCCTTCCGAGGAGTACGCGCGGATTGGTGTGGAAAAAGACGGTAAGCGGCTACAGATTAACAGCAACGTTCTGCAAATTGAAAATGAGCTGTACGCGCCCATTCGTCCCAAGCGCGTGACGCGCAGCGGCGAATCGCCTTCTGACGCGCTTCTGCGTGGTGGTATTGAGTATATTGAAGTTCGTTCTCTCGATATTAACCCGTTCTCACCGATCGGCGTAGACGAGCAACAGGTGCGCTTCCTCGATCTGTTTATGGTCTGGTGCGTATTGGCCGATGCGCCGGAAATGAGTAGCGATGAGCTGTTATGTACGCGTACTAACTGGAATCGCGTTATTCTGGAAGGGCGTAAGCCGGGCCTGACGTTAGGCATTGGCTGTGAAAC [...]
+NODE 131 1358 79347 75885 0 0
+TCGGAACGGATACGCCCATGCCGGAAAGGTTAGTAATCATTTCACCCAGGGAGGCATTTTTGCCCCCAACTCTGTCTACATCATTCATGCCGAGTTGGTTATACCAAAGCACCAGCGGTGACGAGCCATTGTTGGACATCGAACAATCCTTTTGTGATAAATGAACGAGTTTAAGAAACACATAGTTGCGTATTTATCCTGGCATACTTAAACCCGCGAAAAAAACGGTGAATCGTTCAAGCAAATTTATTTTTTCATTTTTTCAGATTGTTTACGTAGTTGCGCAAACCCGCGCATAGCACGGCATTCCCTTAATCACCCACGGTATAAACTGCGTTTCCAGGAAATGAAACATGCTTTTCATTAATTATAAAAAGTGTCTGTCATTTTATAAAATAAGCGACAAGTTATACGTTTCCCGTTACTTTTAATTTATGCTTTCAGATAATTATGTTTACTCTTCAGGATGAACAGAATGGATAATGTTGTTGA [...]
+TAGTACATCCTGCGGTTAAGCCCCATAATGTCGAGAATTTTGGTGGCTATCTCTTCAACGGAATAATTGGTGCTGTTCAGGCAGGGGATCTGATTCTTACGATACAGCGCTTCGACCTCCGCCACTTCCATGCGGCACTGACGCAACGAGGCATAGCGACTGTTTTCACGGCGTTCTTCGCGAATTGCCGCCAGGCGTTCAGGGTCAATTGTCAGGCCGAACAGTTTATGTTGTAGCGGTTTTAACGATGTGGGCAGCGTCAAATTATCCATATCATCGGCGATGAAAGGGTAGTTAGCCGCACGAATACCGAATTGCATCGCCAGATAGAGGCTGGTGGGCGTTTTTCCACAGCGCGAAACGCCAAGTAAAATGACCTGGGCCTGATCGAGGTTGCGCAATGAAATGCCATCATCATGCGCCAGGGTATAATCGATAGCGGCAATACGGGCGTCATACTTGTTCAGGTTACCCGGATTAAGCCCATGAGTA [...]
+NODE 132 1203 69408 67467 0 0
+CGCCGCTGACAACTGCGCCCGTATTCTGATAGCGCGCGTAAAACTGATAATCCGTTAAATACAGCGAACTGCTTTTTCCGCTGACGTCGTAAACCACGTTAGAACTGCCATCGCTGTTTAAGACGTTAGTTTTATAGTCTGCCGAGAAAATGACGATACCAACGTTTTGCGCCGCGCCTGTTGTGGCATCATTTTTGAAAACCTGGTTTTGGTTGCTCCAAAAACCGGATTGCGGCGTAAAACTGAACATCAACTGCTTGATGCTACTGTTATCTGCACAGTTTTCGAGACGCACATTAAAAGGCGTGCCGCCCGCTTCGTCGGTAGGCGCATATTTACTGCTGCCGTCGTTATTGTAAAACCATGCCCGCGTGACGTTGGGAAGGTAGACTTCCCCCCCATTTTCCAGACTGAGTTTGCAGGTGCTGTTAACAATACTGGCGGTCAGATTGATATCCAAATTGGAACCCGCCTGGCTGATGCCAGACCAAA [...]
+GATCTACGGAGCATCACTATGAAATTTACATCAGCTTTAATCACATTATCCGTTTCTGCCGTCTTATTCTCTGGAGTGGTCAGAGCCGCTATTACCGGTACCGACAGTGTACAAATGACCTTTAAGACCACAGTGACAACCGGTACCTGTAAAGCTATCGTCGTTAATGGTGACGGAAAAAATGTCAGCACCATTGGCTATGGTGAGACATATAAATCGGATCTTAACAAGAAAGCGATGCCGCTGAGCATTGTCTTGAGCAATTGTTCCGGCGTAACCATCGCAGAAGTAGAAGCAAAAGCGGGCACCGGCGGCACCTGCTCCGGTGATAATTTAGACGGCGATTCTTACGCGGCGGGCCTGAATACCGCCTTCGAAATTTGGGGCGGCGATGCAGACACGGGGGTGAAACTGTCTTGTAAAACGCCACCAGCCGCACAGAAGGTGACCATTACCAACGGTGCGGGTACCTACCCAATGACGTCACGCATT [...]
+NODE 133 2985 152881 152593 0 0
+GTCCCCTGAAAGTTACGCTGTACGCCGGTTCCCACCTGGAAGAAGGGATCGAACAGGCGAACCACCTCTTTTGCCGGAATACCAACCCCGGTATCCCGCACGCGAATGCTGAGATAATCCCCATCACAGCGCACATGCAGCACGATGCAGCCAATATCGGTAAACTTAATGGCGTTGCTCAACAGGTTTGAAATGACCTGCTGTAAACGCATCGGGTCGCCGTTCAGCGATACCGGCACGTCAGGCTCAATAAAACAATACAGGCCGAGCTGCTTACGCACCACCAACGGCAGATAATTGGCGGTGATATGGTTCATCACCTCTCGCGGTGAAAATTCACGCGGCTCAATCTTTAGCTGTTCCGACTCAATTTTCGAGAAGTCGAGAATGTCGCTGATAATTTTCAGCAACAGACTGGAGGAGTTATTCATCGCCGTGACCAGACGATCCACGCCTTTTGGCAGCTCTTTGGTTTGCAGCAGATCGAGATTG [...]
+CCAGCCGGGGCCGTCTGTACTGGATGAAGGTCTATCAGCTGCCGGAAGCCAGCCGTGGCGCGCGCGGTCGTCCGATCGTCAACCTGCTGCCGCTGGAAGCCAACGAACGTATCACCGCGATTCTGCCGGTTCGTGAGTACGAAGAAGGCGTCAACGTCTTTATGGCGACCGCCAGCGGTACCGTGAAGAAAACGGCGCTGACCGAATTCAGCCGTCCGCGTTCCGCCGGTATTATCGCGGTGAACCTCAACGACGGCGACGAGCTGATTGGCGTTGACCTGACTTCTGGTTCTGACGAAGTCATGCTGTTCTCGGCCGCGGGTAAAGTGGTGCGCTTCAAAGAAGACGCCGTCCGTGCGATGGGGCGTACCGCGACCGGTGTGCGCGGTATTAAGCTGGCGGGAGACGATAAAGTCGTCTCTCTGATCATCCCACGCGGCGAAGGCGCTATTCTGACCGTAACGCAAAACGGCTACGGGAAGCGTACCGCAG [...]
+NODE 134 4525 265956 259679 0 0
+TTTCCGCCAGCTCGGAACGCAGACGAGCCAGTTCCTGACGGTTGTTGGCGGACAGTTGCGCCAACTCCAGTTCGTCGACTAACGCTTTTAGTTTGGCGGACTCCGCCTGCATATTGAGACTTTGCGCCTGGCTAAGCGCGGCACTTCCGCCTGCGGCGCCGAGCCGTCGCTCAATCTCATTAAGCTGGCGGCGGGCGTCGTTTTGCTGTTGGGGAAGCTGGCTGAGCGAGTCGGCGATCTCCCTGACGCGCTCCTGCTCCTGTTGCGCCTCGCGGGTTTTATCCAGTAGCTGGCTGCTAACCTGCAAGATCTCCTGATTTAACGCTTCGGTGGACATCTCTGGCGGTACGCTGCGAGGTTCATCGCGCAGATTATTCAACTGGGCGCGCAAGGTGGCGGATAGCTTAGGGAAATTATCAATAACGTGTTGATATTGTTTCGCGCGCTCAAGCGAGCCTTTTCGCTCTTCAAGCGCGTTTAACGCAGTCTGGA [...]
+GCATTTCTGCGTCGTTACGGGAGGCGCATTATACGAGAAATCCATTTAGCTGCAAGCCCCTGAACGCATTTTTTCGCGATTTTTGTTTGAATGCTGATTAAATCACCAAACAAGACAAAAAACGAGCAAAGCGTGCGCTATGCAACAAAAAACTTTTCACGCCACGCCTAAAGGCACAGAATCAGAATAGCACCCTGCGCCAAAAAAAGAATAGCACGGTGACCACAACATCCAATTGATATCAGGGATCAAGATGAAAAAAAAACTTATTGTCATGCTGTTAGCCAGCCTCTCCGTTCACGCCGCTTCCGTTTCCGCCAGAACATTACATTTTGGCACCTCCGCCACCTATGCGCCCTATGAGTTTGTCGATGCCGATAATAAAATTGTTGGTTTCGATATTGATGTCGCCAACGCGGTCTGCAAAGAGATGCAAGCGGAGTGCTCATTTACTAACCAGAGCTTTGATAGTCTGATCCCCAGCCTACGCTT [...]
+NODE 135 8138 423415 418303 0 0
+CTCATCAAACGCCAGACGGACATAATCCAGGGTGTACGGACGCTGCGGATGGCGCGCCAGTTGGGCTACCTGCCATGCGCCGAGATCGGCGAAGATTTTGCGCGTCAGTTCTACGCTTTTTTCGCGCAGGCGATGGACTTCTTCATCGATATTAATATCCAGTTTCTCATCCTGGCGGCTTACCGCAGTCAGAGAATCGATTTTCGCTTCCAGCTCTGCTATCGGCTGTTCAAAATCAAGGAAATTCAGACTCATAGTATTCCTGTATTAGTCAAACTCCAGTTCCACCTGCTCCGAACCAATGAGGCCACGCAGATCGTTAAGTAAACGATCGCTCGGAGAGACACGCCACGTTGCGCCAAAACGCAGCCGCGCACGCGCATCCGCCCTCTGATAGTAGAGATGTACTGGAATGGTCCCCGAGCGGTGGGGTTCCAGAGACTGACGGAGTCGGTTTAAAAGCTGGTCATCAATTTGCCTGTCCGTCAGCGA [...]
+CAGGCTTTTGAGAAAGATCGCGCTCGTCGTTCCAACGAAGAACGCAACAAACTGGTGACTCGTATCCAGACTGCGGTGAAAAAAGTGGCTAACGACCAGAGTATCGATCTGGTGGTAGACGCAAACACCGTTGCTTACAACAGCAGCGATGTGAAAGACATCACCGCTGACGTACTGAAACAGGTTAAATAAGTAATGCCTTCAATTCGACTGGCTGACTTAGCAGAACAGTTGGATGCAGAATTACACGGTGATGGCGATATCGTCATCACCGGCGTTGCGTCCATGCAATCTGCAACAACAGGCCACATTACGTTTATGGTAAATCCTAAGTACCGTGAACACTTAGGTTTATGCCAGGCTTCTGCGGTTGTCATGACGCAGGACGATCTTCCTTTTGCCAAGAGCGCGGCGCTGGTAGTTAAAAATCCCTACCTGACCTACGCGCGCATGGCGCAAATTTTAGATACTACGCCGCAGCCCGCGCAGAAT [...]
+NODE 136 12077 703233 698449 0 0
+CCGGTAATGCTTGTATCGCCGCCGCCAGTTGGGCATTCACCGGCACACTGTTTTTTTGCCGTACTACGGTATAGCCATACGGTCCTTGCTGTAGCGCCCCGAGAAAATCCGGGTTAAGCACAAAGGTGGCCGGGACAGGATGCGTCTCATCTTTGTATGACTGCGCCGCCAGACACTGGGTAATAAAGTTACCAAAATGGTTACGTAGCTTTTGCGCATCCTGTAAATCCGCCAGCGCGCTACCGCCGCTGGCATTCGCGGTATAAATGACCATTACCGGCATGATGCTACGCCCGGCTTCTTTTTCTATCTGGCGCACCAGCGCAACGGTTTTATGGATCGGTAACGTCGCGTAATCCAGAAAACCATCCCCGTTCACGTCAACCTCCGCGGCCGGAACCGGATCGCCGCCGCCGTCAAAACCATCGTATTTAAACAACGCGCTAAACGGTATATCGCGATAAAGAGAAACCGTCTCTGGCGCGTTAACCG [...]
+CTCATTGCGGCATGGGTACGTAAAATGCGGGTAAGCTGGGTGGAAAGCAGGTGGGAGACCCCTTTTGCCAGACTGCGATCTTTCATGAGCAGCGGCAGCAGCTCTTCCAGTTCAGAAACTTTGGCGTCTACGGCTTGCAGAAATTCCTGCTTATGCGCCGCGTCCATCTTCTGCCAGGTATGACGTAAAAAATGCTCCAGCAGTTGCTGTTCTATTTCAAACGTCGACATGCTTTTATCTGCTTTGAGTTTTAGCCGTTTTGCGACATCCAGCAGAATCGCGCGGTACTGTTTTCCGTGCCCGCGTAATTTGTTGGCGATACTGTCGCCGCCGTAATGCTGAAACTCGCCGGCAATGAGCTGCCAGTTACGGCGGTGTTGCTCCGGGTGACCTTCCATCGCTTTGAACAGCTCGTTATGACTAAGGACGCTTGACAAGCGAGCCTTGCCCTTTTCGTTATGCGTCAGCAAACGGGCGAAATCGGCGAGTTGT [...]
+NODE 137 547 29971 29971 0 0
+GCTATCCGCAAACGACTCATCCGGCGCTGGAGAATGTGAACTTTCGTCTTAAACCGGGTCAGATGCTGGGGATATGCGGTCCGACCGGCGCGGGGAAAAGCACAATATTGTCGCTTATCCAGCGCCATTTTGATGTGACGCAGGGAGAGATCCGTTTCCATGACGTGCCGTTGACGCATCTGCAACTGGATAGCTGGCGTAGCCGACTGGCGGTCGTCAGCCAGACGCCGTTTTTGTTCTCGGACTCTATTGCCAATAATATTGCGCTCGGACGCCCGGAGGCGACTCAGGAGGAGATTGAACAGGTGGCGCGTTTAGCCAGCGTACATGAGGATATTCTCCGCTTGCCTCAGGGCTACGACACGCAGGTAGGTGAACGTGGCGTCATGTTATCGGGAGGGCAAAAACAGCGTATCTCGATTGCCAGAGCGCTACTGTTAAATGCGGAAATTCTGCTTCTCGATGATGCGCTTTCTGCAGTAGATGGCCGCA [...]
+CTCCGTGCGGCCATCTACTGCAGAAAGCGCATCATCGAGAAGCAGAATTTCCGCATTTAACAGTAGCGCTCTGGCAATCGAGATACGCTGTTTTTGCCCTCCCGATAACATGACGCCACGTTCACCTACCTGCGTGTCGTAGCCCTGAGGCAAGCGGAGAATATCCTCATGTACGCTGGCTAAACGCGCCACCTGTTCAATCTCCTCCTGAGTCGCCTCCGGGCGTCCGAGCGCAATATTATTGGCAATAGAGTCCGAGAACAAAAACGGCGTCTGGCTGACGACCGCCAGTCGGCTACGCCAGCTATCCAGTTGCAGATGCGTCAACGGCACGTCATGGAAACGGATCTCTCCCTGCGTCACATCAAAATGGCGCTGGATAAGCGACAATATTGTGCTTTTCCCCGCGCCGGTCGGACCGCATATCCCCAGCATCTGACCCGGTTTAAGACGAAAGTTCACATTCTCCAGCGCCGGATGAGTCGTTTGCGG [...]
+NODE 138 2229 121927 120937 0 0
+CGTATCGCGCTTCGCCGTCATATTCTGCGTCGTCTTAATCCGGAAGGAAAACCGCTGCCGATTTTGCGGATCGGCGAAGGTATTGAGAACCTCGTGCGTGAATCCATTCGCCAGACGGCAATGGGGACCTATACTGCGCTGTCGTCTCGTCATAAGACGCAGATCCTGCAACTTATCGAGCAGGCGCTGAAGCAGTCAGCCAAATTATTCATTGTCACTTCTGTCGACACCCGACGTTTCTTGCGAAAAATTACAGAAGCCACCTTGTTCGACGTACCGATTTTGTCATGGCAGGAATTAGGAGAGGAGAGCCTTATACAAGTGGTAGAAAGTATTGACCTTAGCGAAGAGGAGTTGGCGGACAATGAAGAATGAATTGATGCAACGTCTGAGGCTGAAATATCCGCCCCCCGATGGTTATTGTCGATGGGGCCGAATTCAGGATGTCAGCGCAACGTTGTTAAATGCGTGGTTGCCTGGGGTATTTATGGG [...]
+CTTATTCAATGCTGCAGGAGGATTATTCTCACCAATGGGTAATGCCTGGTGCATGAGTTGTTCAAAGTCCATACGTTCCGCCTCCGCCTCGTTATCATCCTGATAAGACTGGCATGGCAACCCAAGACTTCCCTCAACTTTGGTAATACGCATCGCTTAATACCATAGTAATTTTTTCTTTCTTTTTCATAAGCGCATTAAAATTCTTTTGTAATTCGCTTCGCCGGGAGACAAGCTGCTGATACTGATTCTCTAACTGCTGCCGTTGCGTCAAAAAGCTCTGCGCCTGAGTGAATAACCCGGCCATTTGTTGTTTCTTATCCAACAATAAATGACAAGATAACGTACCTTGCCAGCCCATTAATTCTTTCAGTCTGGTAGACACTGCTAAAGCGCGCGTCTGGCAAATCTGCTGTTCAGTAATAATCGCCTGTTGCTGCTGATCAAGTACGGTAAGTTTGCCGCGTAATTGCTTTTCACGCCGCGCGATTA [...]
+NODE 139 3710 185383 182877 0 0
+CGAGAGCCGGGGCGGAAATCATCATCGTCGTAAGTGCGGATAATGCGAGGATGCCTACGCCAGTTTTAATCTTCATATCTCCCATCCTTTTTGGTGATGTACACAGAGGTGGTTTAACGGTCTCTAGTTTCTTTATACGACAACCTCTTTCCATCCTCCCCGCCCCTACGCCCCACCCCGGCTTTATGTGATCTGTGTTACATAAATGTGAGTAATGCGTGCTGGCGCACATAAAAACACGCCGATTTTTGCGGGCGGCATCACGAAATTCCTTTTCTGCCCGCACCCGTGGTCTCAGGCGCTGTGTCCTCATCCTCCCGCCTCCTCCCCCATAAAAAAGCCGGGGGGTGGAGGATTTACCCCAGTCAGGGATCGCGCATAGTCAGGCCATCATGAATGTTGCTGTCAATGACAGGTTGTAACGAAGGGAGAAAGGCATGGCGAGCGTACAGCTACGAAATGTAACGAAAGCCTGGGGTGACGTGGTGGTAT [...]
+AAGATCTTTTTCGGTCGTAAACACCAGAACATAGAGTTTCTGCTGCCCCAACGCAGGCGTCAGGCGCATCACGCCTTCCAGCCGGTCTGCGCTCATGACGCCCGGCTGCTGATAAGTAAAGTAACTGCTGGGGAAGAACGCCGAAGGCGTCATATTTTGGTCAAGAATCAACACGTTTGGCGCAAAAACGCTGGCTTGCTTATTGACCTCGCTGGTCAGAGTTAATGTCAGCTCGCCGATATTCGCCGGAACGCTATAAGCGGCGACCGGGCCGGTAATGCCGGCGACGTCAAGGCGCTGGCCGCCCGTCGCCAGTTGGGTAGACTGCGTTTTTGACTGATCTACAGGCGTCCAGGTTAATTGCTGTAGCGCAGCAGCAGGAATAGCGGGCGCGGCGCTGGTATTTTGCGGTACATAGTTCACTTCCGCCAGGCTGATACCCGGCACGCTGGCGAACAGCCCTGCGGTTAAACAGAGGGCGACGAGACTTTT [...]
+NODE 140 7809 375612 364069 0 0
+CGCTGCTGACCGGTGGTTTTCACCTGGATGGGTTGGCCGATACCTGCGATGGCATTTTTTCCGCGCGCCGTCGTGAGCGAATGCTGGAGATTATGCGCGATAGTCGTCTGGGAACCCATGGCGGGCTGGCGCTTATTTTTGTGCTACTGGCAAAAATTCTGGTGGTCAGCGAACTGGCGTTACGTGGAACGCCAATGTTGGCGGCGTTGGCGGCGGCCTGTGCGGCCGGACGCGGCAGCGCCGTTTTATTGATGTACCGTCATCGCTACGCCCGTGAAGAGGGGCTTGGCAATGTATTTATCGGTAAAGTCAGCGGACGGCAAACCTGCATTACTCTGGGATTGGCGGTAATCGTCGCCACGGTATTACTGCCTGGTATGCAAGGACTGGCCGCAATGGTGGTCACATGCGCGGCGATTTTCATCCTTGGCCAGTTGCTTAAACGTACGCTTGGCGGTCAAACCGGCGATACGCTGGGCGCGGCGATCGAAC [...]
+GATTACCGACAGTTCAGGACTCTACCTGCTGATCAAACCTAACGGCTCGAAACTCTGGTACATGAAGTACCGCATTGGCGGGAAAGAGAAGAAGCTGGCTTTTGGCCCCTATGCGGTGAAAAAACAGTTAATCAGGTCGAACCCTGCGCGAAATCTGGATGGTGAGTTCACGCCGCCTGAAACACAGCATTACCCGGCCCTGCCCCTTGAGAAACTGCCTGAATGTTTGCCGCGAACGGATAATTAGAGAGGGATAATATCTCCGCTAAGCTCTCTCATACCACCCTTTCGAACGATTCACCACCCGCACAACCAGCAGCATCACCGGCACCTCAATGAGCACCCCAACCACGGTCGCCAGCGCCGCACCGGAATGAAAACCAAACAGGCTAATTGCCGCTGCGACAGCCAGTTCAAAGAAGTTCGATGCGCCGATCAGGCTGGATGGACAGGCAATATTGTGCTTTTCGCCCACCAGTCGATTCAACCCAT [...]
+NODE 141 4773 269686 266745 0 0
+CCGATTTTTGCCCAGTCTTTGTAATAACTGGCAATCAGCAAGACGTCCGGAAGATAAACCTGTTCGCAGAACTGGCGAGCTTTTTGGATGATGGAACTGACAAGATTCAGACGTTCCATATTCACTGCGCCGACCGCGCCCGTTTCGTCAAGGTTGATGGCGCAAGGAACGCCGCCCACCAGCCAGTTAGGATGCGGGTTTTTACCACCGAAAACGGTGTGAATTTTTACGATTTCTTTTTGAAAATCGAGCGCTTCAAGATAGTGGGCGACCGCCAGCAAATTGGCTTCCGGCGGAAGTTTCATCGCCGGGTGTCCCCAGTAGCCATTACGGAAAGGGCCAAGTTGACCGGACTCGATAAACCGCTTCAGTCGATTTTGCAAATCGCGGAAATATCCCGGCGAGGATAGCGGCCATGCGGAAAGGCTTTGCGCGATGGCGGAGGTCTGATGCGGGTCGGCTTTCAGGGCGGCAACTACATCAACCCAGTCC [...]
+CGTGATAGAAGCTTCCGGCGCAAATAGCGCTATTCGAAATACGCTTGATTTAGCATCGTTTGCTGGTCGTATTTCGTTTACCGGATGGCCAAAACAGGAAACGTCGCTGCCGACGAACCTGATCACCTATAAAGAACTGGATTTACGCGGTTCCCGCACCAGTGCCGGTGAATTTGATGAGGCATTACGTATGCTGTCTACGCTGGAGATTAATCCGCAAGATGTCGTCAGTAAGGTCGTCAATCTTGATGAGATCCCTGATGCAGTTAAAGAACTTGATCGCTATCCGGAGCGCTACTTAAAGATTAATGCTGTTTTCCATTGATTTACGGCAAGCTCCACCGCATGGCATGACCGCCATGCGGTGTTATTCATCGACAAAATTAGCCGCCGACAATCTTTCTCACATAGCGTAAATGTTCCAGCGATCCCTCATAGGCGCTGTCAGCATCAGACTGGCGCATCGCATCCACTATCGCTTTATGTTGTTTG [...]
+NODE 142 2484 126775 125437 0 0
+GGCAGCATCTTTGCGCGCTTTGAAGCTGCAGGGTTCAAAATTGTTGGCACTAAAATGCTGCACCTGACCGTTGAGCAGGCGCGCGGCTTCTATGCTGAGCACGACGGTAAGCCGTTCTTTGACGGTCTGGTGGAGTTCATGACCTCTGGCCCTATCGTGGTATCCGTGCTGGAAAGTGAAAATGCGGTACAGCGTCACCGCGATCTGCTTGGCGCCACCAATCCGGCGAACGCGTTGGCGGGTACGCTGCGCGCCGACTACGCTGATAGCTTAACTGAAAACGGCACCCACGGTTCGGATTCGCTGGAATCCGCGCAGCGCGAAATCGCCTTTTTCTTCGGTGAAGGCGAAGTGTGCCCGCGCACCCGTTAATCTCCTTCGTCTTTCACGCTGCAAATGCGTTGGCGATAAATTATCGGTTCAAATATTATTTTCGCTAATGCCGCGTGCAGACGTGGCATCCTTACGCCAGAATTTGTACAATGCAGCGCC [...]
+CACCACCAGGCGCCGGTCAGCCCTACGACCACAAACAGTACCAGCCAGGTAAAAGACATTAACCAGCCGTCGCGTTTTTTACGACGCTTTCCTAATGAGAAACTCTGCATCGGGGCGACTTTGGCGGCGCGCAGCGGGGCCTGCTTTTCCAGCCCCGGCAGCAGTTCCTCTTCTGGAACATGCACCAGACGCGCATATGAGCGGATATATCCGCGCAGGAAGGTTGAAGCAAGATCGGACGGCGCCTTATCTTCTTCAATATCGCGTACCGTAGAAACCTTCAGGCAAAGTCGCTCAGCGACAGCCTGCTGGCTGAGTCCGAGTTGTTCACGGGCATTGCGCAGACGAACGCCGGTGGTTTGTGCTTCATTTTGGTCGTGCGTGGCTTCAGTATTCATTCGCTACAGCTACAGGTACGTGTAAATTAGGATTCAGGCGCCGACGAGCCGTAATGCCCGCCCACACCGCGAAACATCAGGTTAGTTAACCTTA [...]
+NODE 143 3035 148092 146899 0 0
+TATGCCGCCCTGCTGCTGGCGACAATGATTTGGGGCGTGTGGGAAGTCGGGTTCGACTTCTGGGCGCTCACGCCGCGTAGCGATATTCTGGTGTTTTTCGGCATCTGGCTAATATTGCCGTTTGTCTGGCATCGGCTGGTGGTTCCTTCCAGCGGCGCAGTGGCGGCGCTGGTCGTGGCGCTGCTGATTAGCGGCGGCATTCTGACCTGGGCTGGCTTCAACGACCCGCAGGAGATCAACGGTACGCTTCGCGCCGACGCCACGCCCGTCGCAACAAGCTCGTCGATCGCCGACGAAGACTGGCCGGCCTATGGACGTAATCAGGAAGGCCAACGCTATTCGCCGCTGAAACAGATCACTGCGGATAACGTTCACCAACTGAAAGAAGCGTGGGTCTTCCGCACCGGCGATCTGAAACAACCCAACGATCCGGGCGAAATCACCAACGAAGTGACCCCGATTAAAGTCGGCGATACGCTTTATCTGTGTACA [...]
+GCCGGTCAGCCAGATGGGAATGGCGATCGCTCCGTTTGATAAACCGCATCCGGTGATGCGTATCCAGCCGCTGCGGATTACCGCCTCCGGTACGCTGCCGGATACGTTGACGACGATGCCAGCGCTGCCGTCGCTGGAAGGGCTGACGGTGCGCAACCTGAAACTGTCGATGGACCCGCGCCTTGATATGATGGGGATGCAAATGCTGATGAAGAAATATGGCGCTCAGGCGATGAGCGGCATGGATCATGACAGCATGAACGCGCATATGCAGGGCGGCAATATGGGGCATGGCGAGATGGATCATGGCAACATGGATCACAGCGGGATGAATCATGGCGCGATGGGCAATATGAATCACGGCGGAAAATTCGACTTCCATAACGCTAACTTTATCAACGGCCAGGTCTTCGATATGAACAAACCGATGTTCGCGGCGCAAAAAGGCCGACATGAACGTTGGGTGATTTCCGGCGTGGGCGACATGATGCT [...]
+NODE 144 3939 221112 217457 0 0
+AACTTTAATAAATCTTTCACGGATTTGCTCCCGTCGGAGTTAGCACAATCTGGTGTCGGGTTTTACCCCGACACCAGTGACCTGTTTGAGCGAGAATTACTCGTCTTCCAGTTCGATGTTGATGCCCAGCGAGCGGATCTCTTTCAACAGAACGTTGAAGGATTCCGGCATACCCGGTTCCATCTGATGGTTGCCGTCCACGATGTTCTTATACATCTTGGTACGACCATTCACGTCATCAGACTTAACGGTGAGCATTTCCTGCAGGGTGTAGGCGGCGCCGTAAGCTTCCAGCGCCCACACTTCCATCTCCCCGAAGCGCTGACCACCGAACTGCGCCTTACCACCCAGCGGCTGCTGAGTAACCAGGCTGTAAGAACCGGTAGAACGCGCATGCATCTTGTCATCAACCAGGTGGTTCAGTTTCAGCATGTACATGTAACCGACGGTTACCGGACGTTCGAACTGTTCACCCGTACGGCCATCGAACAG [...]
+GTTTGACGTTCAGGAATGTCAGATCCGTGGCGTGACCTATTCCGCACCGCTGCGCGTAAAACTGCGTCTGGTGATCTACGAGCGCGAAGCGCCGGAAGGCACCGTTAAAGACATTAAAGAACAAGAAGTCTACATGGGCGAAATCCCGCTCATGACCGACAACGGTACCTTTGTTATCAACGGTACTGAGCGTGTTATCGTTTCTCAGCTGCACCGTAGTCCGGGCGTCTTCTTTGACTCCGACAAAGGTAAAACCCACTCTTCGGGTAAAGTGCTGTATAACGCGCGCATCATTCCTTACCGTGGTTCCTGGCTGGACTTCGAATTCGATCCGAAGGACAACCTGTTCGTGCGTATTGACCGTCGCCGTAAACTGCCTGCGACCATCATCCTGCGTGCGCTGAACTACACCACTGAGCAGATCCTTGACCTGTTCTTTGAGAAAGTCGTCTTCGAAATTCGCGACAACAAGCTGCAGATGGAGCTGATTCC [...]
+NODE 145 51 3012 2974 0 0
+TAAAACCGAGGCGACGCCGGCCGCCAGCAGTCAGCCTGCGACGCCAGCGCC
+AACATTATTGTCATCACATCCTGTTGCGCCCAGGGTCATTAGCGCAATGAT
+NODE 146 1870 117603 115962 0 0
+ATGCCGTATTCCCGGCAATCTTACTGGCGCTGGTGATCCCGGCGTTTAAAAACCGCACCACATTGATTCGTGGTTGCAGCGGCGCCGCGCTGTCGCTTGCCGCCGTTCCCTTTGTGGCTGCCGGATTGCCAGTGTTGCTTTCGCTGCTTGGCCTACTGGCGAGGAAAAAATAATGGGCAATATGACGCTATTTATTATCGGTATTGCTCTTTTGTCTGCGGGAACCTATTTGATGCGCCTCGGCGGCGCGAAACTTGGCAGCCGTCTGGCGCTGTCTGAGCGTTCACAGGCGCTGCTCTCGGATGCGGCAACGGTGCTGCTATTCTCCGTCGCGCTGGCGACCACCTTTTACGAAGGCGAACATTTTGCCGGAATGGCGCGCGTTCTTGGGGTTGGCTTCGCCGTATTTTTAGCCTGGCGTAAAATGCCGCTTATTGTGGTGATTATCGCCGCTGCAGTGGTGACCGCGTTATTACGAATGGCGGGTATTAA [...]
+TTCTCAGACTCCGGAAACGCAATCTGGCGAAAGTCCAGCGCAGCCCCCAGCAGCGAAGCCAGAAACGGCAACTCAGCCCCCGGCGGCGAAACCAGAAACGCCAGCTCAGCCGGAGGTTGACGCTGAAGAAGTTTATAGTGAAAAAATGGATGTCTATATCGATTGTTTTAACAAACTTCAATTGCCCGTTCAGCGTAGTCTGGCGCGTTACGCGGATTGGGTGAAAGACTTTAAAAAAGGTCCGACAGGGAAAGAGAGCCTGGTTTATGGCATTTATGGTATTACGGAGTCTTACATAACGAATTGCCAGAAAGAGATGAAACAGGTGGCCGCCTTAACGCCATTACTTGAGCCTATTGATGGCGTTGCCGTTAGCTATATTGATAGCGCCGCCGCGCTGGGTAATACCATTAACGAAATGGAAAAATATTATACCCAGGAAAACTATAAAGATGATGCCTTTGCTAAAGGTAAGGCGCTGCATCAGACATT [...]
+NODE 147 4929 247275 245986 0 0
+AAAATTATCCACAACGAATATCGCGTTGGGGCACGTTTTGTTCCGCTTTCGTCAGATCCTTGTAAACAGACTTATCCACAGGGCGGCCCATTACTCCTGGAATGCAAAAAATTATACCTGACGCGTAGAATTTCTATAATTTACTGAAAAATATAGAAAAAATAAGATTTCAAAACGTTAGCGTTATTGACTATTCCTTTTTTCCCTCTTGAATCGCAATGTGTTTTTATTTTTATACACAGCCTGTGAATAATTCAGGCATCGCGCACCAGCCCTTTTTCAATCACCCTGACCAGACGCTGTTTTTTCGGTAGCTGCACTTCAATGATGCAGGCGTTCCGCTTTTCAATTTGTTGCGCAATCGCCCATTCGATATGCTCATCGAGAAGTGGATGCTCACCCTTGCGGCTTTCCAGCGCCGTAATGACGGCATTACTCCACGGCGCATTCCCCAGCGCGACGGCAACATTGCGCAGCCAGCGTAAATGACCA [...]
+ATAAGCTTCGCGCCGCCACGCTCGATGTCGATATCAACGCGGGTGGCGCCTGCATCCAGACTATTCTCTACCAGCTCTTTAACAACCGACGCAGGGCGTTCCACCACTTCGCCAGCGGCGATTTGGTTCGCAAGCTGCGGCGGCAGAACCTGAATCGGCATGAAATCTCCTTAATTCGCGGCGGTTATGGCGCCAGGCTGGTTGGTACTGGCCGTCTGGCCTGGGCCGCCCTGCGGCGCAGACTGGATCGGATGCGCTGCAAAGTACTTACGCAACCCCCGGTATATAGCGTCAGCAATCTGTTGCTGATAGCGGTCGCTCGCCAGCAATCGCTCTTCGCCGTGATTACTGATAAAGCCCGTCTCCACCAAAATGGACGGGATATCCGGCGAACGCAGCACGCCCAGGCTAGCGTGTTCCGGGCGGCGTTTATGCAGCGACCCCACGCCGTCGAGTTGGCTTAGTACGTTCGTCGCCACATCATACCCTACC [...]
+NODE 148 1977 80332 77525 0 0
+TGATACGCGTCATTACTATGGCCTGTGGAACGCGGCGCGCGAGCAAATCGCCCGCCATCTGGGACATGCGGTCAAACTTGAGATCGAACCCGGACGTTTTCTGGTGGCGCAATCGGGCGTGCTGGTAACGCAGGTGCGTAGCGTAAAACAGATGGGAAGCCGCCATTTCGTGCTGGTAGATGCGGGTTTTAACGATCTGATGCGCCCGGCGATGTACGGTAGCTATCACCGTATTTCGGCGCTGGCGGCGGATGGTCGCGCGCTTGAAAATGGCCCGTGGGTCGAGACGGTGGTCGCCGGGCCGCTATGCGAATCAGGCGATGTTTTTACGCAGCAGGAAGGGGGAATGGTTGAAACACGCGCCTTACCTGCGGTCATCCCCGGCGATTACCTCGTATTGCACGATACCGGCGCGTACGGCGCGTCTATGTCATCGAATTACAATAGCCGCCCGCTCCTGCCGGAAGTGCTGTTTGACAATGGACAGGCGCG [...]
+TATTAGGTCGCGGCAGAAATTTTACCGCGGTGGCCTGCTATAACGACTCGATGGCGGCTGGCGCGATGGGAGTATTAAATGATAATGGCGTGGGGGTGCCGGGCGAAGTATCGCTCATCGGTTTTGATGATGTACTGGTCTCACGCTATGTGCGTCCCCGACTGACCACCATTCGGTATCCGATCGTCACCATGGCGACACAGGCGGCGGAGCTGGCGTTAGCGTTGGCGGGGAAATGCCCTACGCCAGAAGTAACTCATGTATTTAGTCCGACACTGGTACGCCGACATTCGGTATCCACGCCGACGGATACCGGACACCTGTCGACAACCGATTAATCAGGGTAGCATGATGGCGACAATGCTGGATGTTTCCCGCCATGCGGGCGTATCAAAGGCCACCGTCTCACGAGTGCTGAATGGGACGGGGCAGGTAAAAGAAAGCACGCGCCAGAAAGTGTTTACGGCGATGCAGGCTCTGGACTATCGCCCC [...]
+NODE 149 1688 96163 95651 0 0
+AGCGATAAACTGGATGCTTTTCTGGCCTCGCTGCGCGACGTGGCGAAAATTGTTGAAGTGGCGCGTTCAGGCGTCGTCGGGCTTTCGCGCGGCGATAAGATTATGCGCTGAGCAGATTCGCCGGATGACGACGCGCTTGCGTTTTATCCGGCCTGCAGGCTGATATCTGGCCCAGATCCTATAAGCGTAGCGCCATCAGGCAGGTTTGCCGGATATCAGCCAACAGGAATTATCGCCCAACCCAATATCACCGGTTGGGCTTTTTTTTGCGAAATCCGTGGTAACCCGGAATAAAAGCGGTTGCCGGAGTGATCAAACTGCGCTTAGATGTTAACGATTTTAACCCATGCCGACATAAAGGTTATGGTTTGTACAATTTACACAAGGGGCAATTGTGAAACTGGATGAAATCGCTCGGCTGGCCGGTGTCTCGCGCACAACTGCAAGCTACGTTATAAACGGTAAAGCAAAGCAATACCGCGTGAGCGACAA [...]
+AAAGACAAAAAGTGGCTGTTAATTCGACGATTTCTTGCCTGCTTGTAACAAAACAATACAAAGGAAAAGACTCGTTACGTCTTAATTAGTGGAATGTGGACGATTTCGGACAAAAGAAAGGTAATAAAAAAGAATTTTCGGATAATTTTAAGGAATAATCTTAATTATTTAAGGGATATTTTTACTGATACGCATTTGTTTGACGGCGGCAGAAGAGAGAGTCTTTTACCGCCGGTCCTTTAGCTACGGCTCAGAATGCCGCGACGATACAGGTTTCGCCGAATACGCGTTAAGCCAGGTTTCGGTTTACGCGGTTCATCAAGACTTGCCAGCACAATCTCCAGCACGCGTTCCGCGACATCACGATGACGCTGCGCCACCGCCAGTACCGGGCATTGCAGAAAATCCAGCAGCTCATGATCGCCGAAGGTCGCAATCGCCAAATCCGAGGGCAGTTTTCCATCGCGCCGCAGCGTAACGTCCATCACGCCC [...]
+NODE 150 1164 57371 56902 0 0
+GGCCCGCGTATCGAACAAAGTGGGGCTGGAGTCGGACCCGCAGAACTTCCTGCTGATGCACGCGATGGGCCCGAACGTGGCGGGGGTTATCGGTTCGGCCATTGCGGCGGGCGTGATGCTCAAGTACGTGCTGGCAATGTAATCCAATCTAATCGGGAGCAGTGATTCTGCTCCCGCAAAATGAGGACACAGTAATGAGTGAAATGGTTGCGTTTCGGCAAGGTACATCCATGCCATCCAGAGAAACCATCTTGCATTATGTTGTTGAGACGGTGAATCAGATAACTGAGCTTGAGCCAGCGCTGCATTTGCTGCCGTGGTCTGGCGTCAACTCAGCAATATATGAGCAACGTTTTGCACAGTGTTACGACGAGGGGCTTTGTGCCGCACAGACGTCGGCACCGAATGTTCCGCAGGGGATTCTGCCATCGACCGATTGGGCTCAGGGTATCGGGTTACTCTGTTTTGCCGCAGGGTATATGAGCGCAGGCG [...]
+CGCTTGCCGGTATTCAGGTTAATGATTTGATTATTTCGGTCAATAATAAACCCGCTGTGTCCGCGCTGGAGACGATGGATCAGGTGGCGGAAATCCGCCCGGGCTCCGTCATTCCGGTCGTGGTAATGCGGGATGATAAGCAGCTCACGTTCCAGGTGACGGTGCAGGAATACCCGGCGTCGAACTAAAACGACGCGGCTTTTGCCCGCGTCGTTCGACGGCTAGTCAATAAAGACTGGCCCTGCCGGAAAATGCGCCAGGAAACTCGTGAAGATCAGCAGAGCGGGGAGACTTTTCTCCCCGACGGCCTCTTCACGCAGCGCCTTATCGAGTGCCAATAAGCCAGACTCGCCTCCTTCCCCCAGAATGCCGCCCATCCAGAGCAGTCGTTGCGCCTGTTGACGCGCATACTGCGATGCGCTTTTCCAGGCGATCAGATGCAGCAACGTTTGTAACAGCAGGATCCGAGATGCGTGACCATCGCGTTGTAAT [...]
+NODE 151 8119 455850 447174 0 0
+TTGCTGAATCTCGTCTGAGCGACGCGTACCGCATTACCGATAAACAAGAGCGCTATGCTCAGGTTGACGTAATCAAATCCGAAACCATCGAGCAGCTTATTGCAGAAGATGAAACTCTGGATGCTAACGAGCTGGGCGAAATCCTGCACGCCATCGAGAAAAACGTGGTGCGTAGCCGCGTACTGGCAGGCGAGCCGCGTATTGATGGCCGTGAAAAAGACATGATCCGTGGTCTGGACGTGCGCACTGGCGTACTGCCGCGTACTCACGGTTCCGCTCTGTTTACCCGTGGTGAAACGCAGGCGCTGGTTACCGCGACTCTGGGTACTGCCCGTGACGCGCAGGTGCTTGATGAACTGATGGGCGAGCGTACTGACAGCTTCCTGTTCCACTACAACTTCCCTCCGTACTCCGTAGGCGAAACCGGCATGGTCGGTTCTCCGAAGCGTCGTGAAATTGGTCACGGTCGTCTGGCGAAGCGCGGCGTGCTGG [...]
+CGATGTCCGAAGGCACTCAAACCACGCTTGGCGCATATCACCGTAAATGGCAGTGAGAGGAGCTATGAAATATTCCTTAGGACCGGTGCTTTATTACTGGCCGAAAGAGACGCTGGAAGATTTTTATCAGCAGGCCGCAAAAAGCAGCGCTGATGTCATTTATCTGGGCGAAGCTGTGTGCAGCAAGCGTCGCGCGACTAAAGTCGGCGACTGGCTGGAAATGGCGAAATCCCTCGCCGCCAGCGGTAAGCAGGTGGCGCTCTCCACCCTGGCGCTGGTACAGGCGTCATCTGAATTAAGCGAGCTGAAACGCTATGTGGACAACGGCGATTTTCTGCTGGAAGCCAGCGATCTTGGCGTGGTGAATCTGTGCGCCGAGCGCAAACTGCCGTTTGTCGCCGGCCATGCGCTGAATTGCTACAACGCGGTCACGCTGCGCCGGTTGCTGAAAGAAGGCATGGTACGCTGGTGTATGCCGGTGGAGCTGTCCCG [...]
+NODE 152 11711 714235 709340 0 0
+TTGGTCCAAAATGGCAAGTAAAATAGCCCCATTAAATGGGGCTATTTAGCCTCTTCAGGGCGTTATTTATGCGCGTTGAGAATCCAGTAGTTCATTATTTTTTACTACTTCCTGCGCTTTGGTATAACTTTCAATCAGTAGCTGATAGGCCGGGAATATTTTGGTATATACATCCGCCCATTCTGCGGCATCTTCCCGATTCCAGGTACGTTGCAGCTCAGAGGCTACCGCCGCGGTATCCATTGGTACTACGCCCGCCTGCACCACGCGGGCCATCGTAATTTCCTGCGCCATTTTACTGTACGTACCGGAGGCATCAATTACCGCAAATACCTTGTACCCTTCCGCGACGGCGCTGATGGCTGGAAAAGCCATACAGACACTGGTAATAGTGCCGGCTATGATCAGCGTTTTACGGCCTGTCGCTTTTACCGCTTGTACAAAATCGGCATTATCCCAGGCATTAATTTCCCCTTTACGCGCGACATATTG [...]
+CCGCTTCCCGATACAGATACGGCATCATCCGGCACTTCTGTTCGGTGAAGAAGCGCACCACGTCACAGGACTCCTCGTCATAGGCCCACGGAACCCGGTAGGATTTGCTACCGTGCAGGCGGCTGTGGCTGGAGAGCAAGCCGAATGCGCACCACCGCTTGTAGACATGCGCCGGCGCGGTATTCTCGAATCCGCCAATATCATGACTCCAGAAGCCAAACCCTGACAGGCCGATGGACAGCCCGCCGCGCAGGCTTTCCGCCATCGATTCGTAGTTGGCGTAGCAGTCGCCGCCCCAGTGCACCGGGAACTGTTGCGCGCCCACCGAGGCGGAACGGGCGAACAGCACCGCCTCTTCAACGCCGACGGTCTCTTTCAGCACGTTCCACACCAGTTCGTTGTAGATGTAGGCATAATGGTTGTGCATTTTCTGTGGATCTGAACCATCAAACCACTGCACATCCGTTGGAATGCGTTCGCCGAAGTCAGTTT [...]
+NODE 153 7444 396787 392439 0 0
+TCTGGGCACTGCGGATATGAAAGGCTTCTTCGCTTTTATTCTGGACGCGCTACGTGACGTTGACGTCACAAAGTTGAAAAAGCCGCTCTACATTCTGGCGACCGCCGATGAAGAGACCAGCATGGCGGGGGCGCGTTATTTTTCCGAAACCACGGCATTACGTCCGGACTGCGCGATCATTGGCGAACCGACGTCGTTGCAACCGATACGCGCGCACAAAGGGCATATCTCTAATGTCGTTCGCGTCCTGGGGCAGTCCGGTCATTCCAGCGACCCGGCGCGTGGGGTTAACGCCATTGAACTGATGCACGATGCGATTGGCCATATCATGCAACTGCGTGACTCGCTGAAAGCGCGGTATCACTACGAGGCGTTTACCGTTCCGTATCCAACGCTGAATCTGGGCCATATCCACGGCGGCGATGCCTCAAACCGTATCTGCGCCTGCTGCGAATTGCATATGGATATTCGTCCACTGCCGGGCATGACGTT [...]
+GCCCAGCGTCACGATGCCTTCTTTTTTCAGCAATTTAATCGCTGCAAGACCTTCGGCGGTCACCGGAATTTTCACCACAATGCCGGGGATGGCGTTATTCAGTCGTTTGGCTTCTTCCACCATCCCTTTCGCGTCGCGGCTCATGGTCTGCGCAAATAAAGTGCCTTCTTCACCGATGGCGTTTTGCAGCCTGGGCAGCACATCCCAGATAGATTCTTTGCTGGCTGCCACAATGCTTGGATTGGTGGTGACGCCGGCAATCGGGAAAATGCGCGCCAGACGTTCAACTTCCGCCACGTTAGCGGTATCCAGATAGAGTTCCATAGTCTTTCTCTTCGTGAGTTTTCGTTATGGACAGGATAAAGGAGCGTGCCCCGGATGCGCTATGTGACAAATCTGCCAAAAACTGGACAAATGTGATGCTCTTGGTAAAGTGTGATTTACTTCACAAGTTGGTGATGATTAACGTATAACGTGCTGTTGTATGCCATG [...]
+NODE 154 11679 601105 592206 0 0
+AATCACTCTCGGTCAACTGGTTGTCGAATTTGAAAATGAGACCTGGTTCGCTCTTACCGGCGCAGGCTGCGAGGCGCAGTTGGATGATCAACCGGTCTGGACCGGCTGGCGATTGCCGGTAAAAGCGGGTCAGCGTCTTACGCTGCATCGACCGCTTCACGGGATGCGTAGCTATCTGGCGGTAGCGGGCGGTATTGCTGTGCCGGAGGTGATGGGATCGTGTAGTACCGATCTGAAGTCCGGTATCGGTGGGCTGGAAGGGCGGCTGCTAAAAGATGGCGATCGGCTGGCGACGGGTAAACCATCGCGACAGTTTAGCGGGCCGCAGGGCGTGAAGCAGTTACTGTGGGGGAATCGCATCCGTGCGCTGCCGGGGCCGGAATACCGTGAATTCGATCGCGCCTCGCAAGAAGCGTTCTGGCGTTCGCCATGGCAGCTCAGTCCGCAAAGTAATCGCATGGGCTATCGTTTGCAGGGACAATCGTTAACGCG [...]
+GAGGAGTGCTCCGGCCCCTGCCCTTCATAGCCATGCGGCAACAGCATCACCAGACCGCACATCCGGCCCCATTTCTGCTCGCCGGAGGAGATGAACTGGTCAATCACTACCTGCGCGCCGTTGGCAAAATCGCCAAACTGCGCTTCCCAGATAGTCAGGGTACGTGGTTCCGCCGTGGCATAACCGTATTCAAAAGCCAGTACCGCTTCTTCAGACAGCACGGAGTCCCAGACTTTAAACTGTCCCTGACCGCTGTGAATATGCTGCAACGGCGTATACGTTGAGCCGTTCGTCTGGTTGTGGATCACCGCATGACGATGGAAGAAGGTGCCGCGACCGGAGTCTTCCCCGGACAGGCGCACCGGAATGCCTTCATCGACCAGCGTGGCGTAAGCCAGATTTTCCGCGCCGCCCCAGTCAAACAATTTCTCGCCTGCCGCCATTGCCTGACGGTCGCCATAAATTTTCGCCACGCGAGACTGCATTTCAATG [...]
+NODE 155 2987 143609 140979 0 0
+TCAGTACCGGCATCGACCGCCGAGGTGGTGTCATCGAGAATCAGCAGTTCCGGCGCGGTAATCAGTGCCCGGGCTAGCGCAATACGCTGGCGTTGGCCGCCGGAGAGGTTGCTTCCGCGTTCGGTCAGTCGGGTGTTGAACCCCTGCGGTAGCGCATTGATGAACCCGCTGGCGCCTGCGGCATCGGCGGCGCGTCGAATGTCGTCCTGAGTCGCTTGCGGGTGCCCATAGGCGATGTTTTCCGCCACCGTACCGGCAAACAGAAACGCGTCTTCAAACACTACGCCAACGCGACGACGAAGCGCCGTCAGTTTCAGGTCGCGAATATTCTGTTGACCCGTAGTGGTGTTGAGCCATACTCCGCCGGAGGTGGGATCGTAAAAGCGCGCCAGCAACATCAGCAATGTTGATTTTCCGGAGCCGGATGCGCCAACCACCGCCACGGTTTCACCGGCGTGAATGGAAAACGAGATCTCATTGAGGATACGGTTA [...]
+CATACGCGCGTAAATAAGTCTGAAACTAAACTTCACCGCTTAACGCTCTCCTCTTCCCCGATTTTTATGAAAAAAATCATCACATGATCAAGGGTCGTATTTGTTATTGCATTTTTCAAATGATATTGTTAATTATTATCATTCTCATTAACGACTTGTTCGATTTATGACGTGGAGAGAGAGGATTTCTCATGCGTATTCTGTTTGTCGGTCCGCCACTGTATGGACTGCTATACCCTGTGCTGTCCCTGGCGCAAGCGTTTCGTGTTAATGGCCATGAAGTGCTGATTGCAAGCGGTGGAAAATTTGCACAGAAAGCAGCAGAAGCTGGGTTGGTGGTATTTGACGCTGCGCCTGGTTTCGATTCGGAAGCGGGTTATCGCCGTCAGGAGGCATTGCGAAAAGAAAATAACATTGGAACAAAAATGGGGAACTTCTCATTCTTCAGCGAAGAGATGACTGACCCACTGGTCGCGTTCGCCGGGCAGTGGC [...]
+NODE 156 26 5954 5917 0 0
+CGGTTCGATCCCGTCATCACCCACCA
+TGCTCTCCCAGCTGAGCTAATCACCC
+NODE 157 2 553 542 0 0
+CT
+GG
+NODE 158 4 472 257 0 0
+CGGG
+GGGA
+NODE 159 12 1404 759 0 0
+TCGTTAGCTCAG
+CCCTCCTTGTAA
+NODE 160 35 4006 2229 0 0
+TTGGTAGAGCAGTTGACTTTTAATCAATTGGTCGC
+GAGTGGTGGGTGATGACGGGATCGAACCGCCGACC
+NODE 161 3033 147859 146195 0 0
+CGCCATTTATGAAGAGTATTATCAGAAGCTAAAAGCAGGACGCTAATTCAGCCAAAGCGCCTGTCGGGCCTACAGATGAACGTAACGTGAAATGTAGGCCGGATAAGGCGTTACCGGGCAAACAGCACTACAGCCCTTTCAGGAATTTATCAACAAATTCCGGCACAACCTGGCTTGCCGGGCCGTAGTGCTTCTCTTCAAACTCGCTGCCGACCTGGCTTGGCTCAAGATTCAGTTCCACCGTATGTGCGCCGTGCAGTTTTGCTTCATGCACAAAACCCGCAGCCGGATAGACATGACCGGATGTGCCAATGGCGATAAAAATATCCGCCATCGACAGCGCCATATAAATTTCATCCATGCCAAGCGGCATCTCGCCAAACCACACCACGTGCGGACGTAGCGGCGCCGGGAACTGGCAGCAGTGACATTTATCTTCCGGCATCACATCGCCGTTCCATTCCAGAATCTGGCCGCTTTGCGAACAGCGCA [...]
+ACCGTATTCTGGCGGTGGTTCCGCACGGGGAGATTGAAGCGGTCAATCAGCCGTGGACCAACTGGCGTGAAGCGCTGGCAAAAGTGCAGAAGGTGCCGGGCATTGCCGCCGCCGCGCCGTATATCAATTTTACCGGCCTGGTAGAGAGCGGGGCGAATTTGCGCGCCATTCAGGTTAAAGGCGTCGACCCTAAGCAAGAGCAGCAGCTTAGCGCGTTACCGTCATTTGTGCAAAATCACGCCTGGGATCATTTCAAAGCGGGCGAGCAGCAGATCATTATCGGTAAAGGCGTCGCCGATGCGCTGAACGTGAAACAGGGCGACTGGGTGTCCATCATGATCCCCAATGCGAATGCCGACCATAAGCTGCTCCAGCCCAAACGCGTGCGTTTGCATGTCATCGGGATTCTGCAACTGAGCGGCCAGCTCGATCACAGCTTCGCCATGATCCCGCTTGAGGATGCGCAGCAGTATCTGGATATGGGGTCCAGCG [...]
+NODE 162 4338 213662 212243 0 0
+TCTTTCACCTCAGCAACATGTTGCGCGCTATAGTTTGGCGCTTTACCGCCGCGCAGAATGATATGGCAGTCGCCGTTGCCGCTGGTATTCACAATCGCCGAATGACCCCATTTAGTGACGGAGAGGAAGCAATGCGGCGCGCCGGCGGCGTTGATGGCGTCAATGGCGACTTTAATCGTGCCATCAGTACCATTTTTAAAACCGACCGGACAAGAGAGGCCAGACGCCAGTTCGCGATGAACCTGGGATTCAGTAGTCCGCGCGCCAATGGCGCCCCAGCTCATCAGATCGGCCAGATATTGCGGCGTGATCATATCGAGGAATTCGCCGGCGGCAGGCAGGCCGCTGTCGTTAATATCCAGCAGCAGTTTGCGCGCAATACGCAGACCGTCGTTAATCTGGAAGCTGTTATCCATATGCGGATCGTTAATCAGCCCTTTCCAGCCGACGGTGGTACGCGGTTTCTCAAAATAGACACGCATGACAATTTCA [...]
+AGCGTAATGTTTGACCCACAAGCCGCAATCTACCCGTTCCCGCCGAAACCAACGCCGTTGAACGACGATGAAAAGCAATTTTATCGTGAGAAAATCAAGCGCTTGCTCAAAGAGCGCAATGCCGTCATGGTGGCGCACTACTACACCGATCCGGAAATTCAACAGTTGGCAGAAGAAACCGGCGGCTGTATTTCCGACTCACTGGAAATGGCCCGTTTCGGCGCGAAGCACGCCGCATCCACGCTACTGGTAGCGGGCGTACGGTTTATGGGGGAAACCGCCAAAATCCTCAGCCCGGAAAAAACCATTCTTATGCCTACCCTGGCGGCGGAATGTTCGCTGGATTTAGGCTGCCCAATAGACGAATTTAGCGCTTTTTGTGATGCGCATCCTGACAGAACCGTAGTGGTCTATGCTAACACCTCGGCTGCTGTTAAAGCGCGTGCGGACTGGGTTGTGACCTCCAGTATCGCCGTAGAACTGATTGAGCAT [...]
+NODE 163 8046 420462 417658 0 0
+ATTTTTAATGCTTTCAGTCCTTCAATGGCGCTGGCAAACGTCGTGTTATCCACTTCGAAAGCCATATAGGTATACGGTAGCCCCGCTTTTTCTAACGCTTTGTTTTGCATTTCGGGCGATAAGCTATGACGGATAGGATACGCCATAAGACCAATTAATTCATATTTTGCGGTAACATCCATTTTATACTCCTTAATAAGTGGACAGTGCAGAGCAGGGCGCATGCCTGTTGCGCATAGTTAACATTTTTACTGGAAATAACGCTCGCCAAATCGGACATCGTTTTGCGGGATCTTAAATACGCGATAATAGCGAATAAATACAATAATGGCGGTGATAAATGTCAGTAGTGCAAAGGCAAAATCTAACAAAATGATATATTGCAGGCCAATAGTAGAGAGATAACCGGTGATCAGTGGAATAATAAAGTTAGCTACGCCCCCCATCATCATATATATACTGGTGACTTTAGCTTTACTCTTAGGGAAAAAT [...]
+GGATCGACGCCCACCATCGGCATCCCCAACGCGGCGATCCGATTAAGGAACTCAGAGGTTTTTTTCGCCGTTTTCGCAAAGCGATTAAGAAAACCTTTAATATGCTGCGCCTTACCATTCGGCGAGAACGGTAACAATACCGGCCTCCTGCCCAGCTTTTCCGCCAGGCGGATAAAGTCCGCCACGACCCGGGCGTCGTAGTAGCTGGTAAACGGATCCTGAACCACCAGTACCGTTTTCGCTTTTTGCTCGGCGCTCATGCGTTCCAGTTGCTCAAGCGTCATATTGGCAGACGGATGGCCCACCAGTTGCTGTTGCAATGAAGGGGCAGAAAGCAGAGGTAAATCCACCATACCGATATGTTTTTTCGCCAGATTGCGAACCATCGGTTGGTTAATAAAAAAGTTAAAGGTCTTTGGCGCACGCGCCATCAGCGGCGCGTAGGTCTCGACCGTCGCCACCAGATGATCGCGTACCGGACGCAGATAACGC [...]
+NODE 164 238 102748 95755 0 0
+CCCTCCCGAAGGTTAAGCTACCTACTTCTTTTGCAACCCACTCCCATGGTGTGACGGGCGGTGTGTACAAGGCCCGGGAACGTATTCACCGTGGCATTCTGATCCACGATTACTAGCGATTCCGACTTCATGGAGTCGAGTTGCAGACTCCAATCCGGACTACGACGCACTTTATGAGGTCCGCTTGCTCTCGCGAGGTCGCTTCTCTTTGTATGCGCCATTGTAGCACGTGTGTAGC
+GCAAGCGGACCTCATAAAGTGCGTCGTAGTCCGGATTGGAGTCTGCAACTCGACTCCATGAAGTCGGAATCGCTAGTAATCGTGGATCAGAATGCCACGGTGAATACGTTCCCGGGCCTTGTACACACCGCCCGTCACACCATGGGAGTGGGTTGCAAAAGAAGTAGGTAGCTTAACCTTCGGGAGGGCGCTTACCACTTTGTGATTCATGACTGGGGTGAAGTCGTAACAAGGTAAC
+NODE 165 2784 136146 132841 0 0
+TACCTGCTCGACTATAAATCTAACTGGCTGGGCGAGGATAGCGCCGCTTATACCCAGACGGCGATGGCTGCGGCGATGCAGGCGCATCGCTATGATTTGCAGTACCAGCTTTATACGCTGGCATTGCATCGTTACCTTCGTCATCGAATGGCGAATTACGACTATGAACGCCATTTCGGCGGCGTCATCTATCTCTTTTTACGCGGGGTGGATAGCGAACGTCCGCAGCAGGGTATTTTTACCACTCGTCCTGCGGCGGCGTTAATTAACCAACTGGATGATATGTTTGCAGGTGAAATGAGTGAGGAGGCGCAATGACAATCCAGGAGCGGTTGCTGGAGGCCGTTGAACAAAAACTCTTACGGCCCATTGATGCCCAGTTTGCTTTAACCGTCGCCGGTAACGACGATCCCGCCGTGACGCTGGCGGCAGCGCTGCTTAGTCATGACGCAGGTGAAGGTCACGTGTGTCTGCCGTTGTCGCGTTTAACGT [...]
+ATGGTATCGGTACGCAGATCGTCATGGAGAGCGCCGAGCAGATCCGCCGCGCCACCATCAACGATATTGGCGGTATTCTGGAGCTTATCCGCCCACTGGAACAGCAGGGCATTCTGGTACGCCGTTCCCGTGAACAACTGGAGATGGAGATCGATAAATTTACCATTATTCAGCGCGATAATATGACTATCGCCTGCGCGGCGCTGTATCCTTTTTTGGAAGAGAAAATAGGCGAAATGGCCTGCGTTGCGGTGCATCCGGATTATCGCAGCTCATCGCGTGGAGAAGTGCTTCTGGAGCGGGTTGCCGCCCAGGCGCGGCAAATGGGGCTGCGTAAATTGTTTGTGCTGACGACGCGCAGTATTCACTGGTTCCAGGAGCGCGGTTTCACGCCTGTCGATATTGAGTTACTGCCTGAGAGCAAGAAAAAAATGTATAACTATCAGCGACGTTCAAAGGTGCTGATGGCGGATTTAGGATAACAAGGTGGGC [...]
+NODE 166 3689 209036 204496 0 0
+AGGCAACCACTTCGCCTTTCACCAAACGCTGCATCTCGGTTACTTCTTCCGGACGTTCGTCAATCAGCAGCACCATCAGCACGCAGTCTGGGTGGTTATACGCGATGCTCTGCGCGATGTTCTGCAGCAGCATGGTTTTACCCGCCTTCGGCGGCGCGACAATCAGACCGCGCTGGCCGCGACCGATCGGCGAAGCCAGATCCAGAACGCGCGCCGTTAAATCTTCGGTAGAACCGTTACCACGCTCCATACGCAGACGAGAATTTGCGTGCAGCGGGGTTAAGTTCTCAAAGAGGATTTTGTTACGGGCGTTTTCCGGTTTGTCGTAGTTAACTTCGTTAACTTTCAACAGCGCAAAATAGCGTTCACCTTCTTTCGGCGGGCGAATCTTACCAGAAATGGTATCACCAGTGCGGAGGTTGAAACGGCGGATTTGGCTGGGGGAAACGTAGATATCATCAGGACCGGCGAGGTAGGAGCTGTCTGCAGAAC [...]
+TCCCCTGCGCCATCATAATTTCCTGCAATGCCTGTACGGTGCCGGAGGCACCCACGCAGACCTTCCAGCCATGAAAACGCAGTTCATCGGCGACCGGACGCAACACATCGCGCGCGGCTTTCTCCGCGTCATCAAAATTTTCTTGCGCCAGATTACGATCGCTAAAATAGCGTTCAAGCCACGTTACGCAGCCCATCGACAGGCTAAACAGCGACGTGGTTTGCGCGCCAGTGCCGGTAACCAGTTCAGTGCTGGCGCCGCCGATATCCACCACCAGTCGCTGATCTGCGCCGCCGGTGGTATGAGCGACCCCCTGATAAATCAGCCGCGCCTCTTCTTCGCCGCTGATAACCTGCACCGGACAACCAAGGATAGTCTGCGCTTTCGCGATAAATTCACCTGCATTGACGGCGAGACGCAATGTTGCGGTGGCAACCACGCGGATTTGTGGCTGCGGGATATCCTGCAAACGTTCAGCAAACAGACGCAGGC [...]
+NODE 167 11391 630562 626120 0 0
+AAGTCGTATGATGATCTTCACATTTATCATCATCAGCGTTCATATTACTCAACCTGTAATCAACCTCTGGCGTTTTTCTGTATCCATCACAACCATTTCCGGTAAAGGTAAAAAAGGGATTTGAACCTTTCCGGAGATGATAATGAAGGTAAATGCATGGACAATTTTGCTTATGTCGGCGCATCTGACGGCCTGTGCCGTCCCTGGCACAGAAAAATATCAGACCAGCATGGACAGCGTTACGGCAGAAAAAGTAAGCCGGATTATCCAGTCGGATGTCATTCCTTATAAAGGCGAAAACCATGGAGAAGTTATTAGCCGCGTATCGTCTGCTTTTCTCGGAACACCTTATCAGGCGGATACGCTCATCGGTGGGCCCGGAACCCCCGAAGTCCTTGTAGCGAATTTCAACGGCGTGGACTGCTTTACCCTGGCTGATTACGTTGAGGCCCTGGCCCGCAGCGATAATCAGAAATCGTTTCTGCATAATCT [...]
+CCGGCTGGCTTTGCCCGCCAGCAACCAAAGCGCGCGTTTATTGGCGCCGCGGAATTTTGCCCGTGCGACCATCTCCTGTCCGGTGTAGCAGCCTTTCTTGAAGCTGATGCCGCCCAGCGCCTGTAGGTTAGTCGCCTGGGGGATAAACTGACCGCTGTTCGCCGCGTCAATCACCGGAATGCCTGCTTCAATATCCAATGCCAGCCACTGTTGGCTGTTATTCAGTTCGGCTTCGCCATGCAACTTCTCTGTTAACATGTTGGCCGTCGCGACATCGGTGACAAGCAGGAATCGTTCCGCAGGATGTTCAAACCATAGCAGCGTGGAGGCGCCGTCTCTGACCACCTGATTTTCGCTATTGGGCAGTACGCTAAAGACATTAGCCAGCGCCGCGCGGGCCTGAAAACCTGCCACGCCAAGCAATACGCGTTCGTCATCCGGCGCGATGACCACTTTGGAAAATACGGCGTACTTTTTCAGCTCCGTTAATTG [...]
+NODE 168 43 8807 7109 0 0
+GCTTAAACCGGGACAACCGTCGCCCGGCCAACATAGCCTTCTC
+CTGGTTTTCCAGGCAAATCCGGAAAATCAAGGCTGAGGCGTGA
+NODE 169 14 5295 5252 0 0
+CGTCCCCCCTTCGC
+TTTAAGCGTGTAGG
+NODE 170 71 24365 19658 0 0
+ATTCCCGTACTTGGTGTTACTGCGAAGGGGGGACGGAGAAGGCTATGTTGGCCGGGCGACGGTTGTCCCGG
+AGTAACACCAAGTACGGGAATATTAACCCGTTTCCCATCGACTACGCCTTTCGGCCTCGCCTTAGGGGTCG
+NODE 171 9790 496977 492490 0 0
+GGAGCAGTACAAGCACGTCGATATGGCCCGTGAGTTGGGCGAACATAACGGCGCCGAAGGTTCTCTTGAAGCGGATTACCAGGCGGCGAGCGATCACCTGAATCTGGTGCAAACCGCGCTGCGCCAGCAGGAAAAAATTGAACGCTACGAAGCGGATCTTGAAGAGCTGCAGATTCGACTCGAAGAGCAAAATGAAGTGGTGGCGGAAGCCGCCGAAATGCAGGACGAAAATGAAGCGCGTGCCGAAGCCGCCGAGCTGGAAGTCGATGAACTCAAAAGCCAGCTTGCGGATTACCAGCAGGCGCTGGATGTACAGCAAACGCGCGCGATTCAGTATAACCAGGCGATATCAGCGCTTGCCCGCGCTAAAGAACTTTGCCATCTACCGGATCTAACGCCGGAAAGCGCCGCCGAATGGCTGGATACTTTCCAGGCAAAAGAGCAGGAAGCTACGGAAAAACTGCTGTCGTTGGAACAAAAAATGAGCGTGGC [...]
+TGGCAGCGGTGATCCCTGCCCTGCTGGCTGCTGCAACCGCAAACGCAGCAGAAATTTATAATAAAGATGGTAATAAGCTGGATCTGTACGGTAAAGCCGTGGGTCGTCACGTATGGACAACGACCGGCGATAGCAAAAATGCCGACCAGACTTATGCCCAGATTGGTTTTAAAGGGGAAACGCAGATTAACACCGATCTGACCGGTTTCGGTCAGTGGGAATACCGTACTAAAGCAGACCGCGCTGAAGGCGAACAGCAGAACTCGAATCTGGTCCGTCTGGCTTTCGCGGGTTTGAAATACGCGGAAGTGGGTTCAATCGATTATGGTCGTAACTACGGTATCGTTTACGATGTTGAATCCTATACCGATATGGCCCCCTACTTCTCCGGCGAAACCTGGGGCGGCGCCTATACCGATAACTACATGACCAGCCGTGCTGGCGGTTTGTTGACCTATCGTAACTCTGACTTCTTTGGTCTGGTGGACGGTC [...]
+NODE 172 6126 283064 280272 0 0
+TTTAATATTGCTGAATACCTTCACAAAAGGTATTGTTTTTATGTTAAAAAAGAAAAAGAAGAAGAAATTAAAATTCATTATAAAACATAAAGATAAATAAAAAATCATCATACATTGTTAGCCCACCCCACCTCTCCTTAACACAAACTCCGTTATATTTCAGACGCACTAACACCTTTATCAATAGATCTTAATTTGCAGAAAGATTTTTTTCTGACTATATCATCTAATACGAAAGCACTAGTCAGGCACAAAAAATAAAGGGTTATTCGGCGAGAAAACCAGACCTTCACCTACGCTCATAAAAAAGAATATGGCTACGGAAATTCATCTCTCATGATGAACGGGAAGGCTCGTCTACGCATTTTGCCCTGAACGTCGTGCCCGTTAATTAATACACAGAGCAAATCCATCAGGAGCTAATTTATGCGTCTACTCGCCGTGGTTTCGAAATTGACTGGCGTCTCCACCACTGTGGAATCCTCAGCGGTC [...]
+CGTTATCCAGAATGCGGATGGTGGCGCCTGCTTCTCCCGTTCCGTTGAGCGTCGGGCGTGAATCATTGGTGAGCGCGCTGTTATCCAGCGTACCGGTCATGCCGGGGACATCATCCGTTGCGCTGGTAATAACCGGTTGCGCCGGCGCGCTAAGATCGACAGTGATCCCGACCGGTGCGGACAGGCCGCCCTGGCCATTCGCATTGGTTGCCTGGACGGTGAAGTAATGTGTACTTTCGCTTAATGGCGTCGCGATCTCAAAGATCCAGTTCCCGCTGGCGTCAACGGTGGCAAAGCCTGCCGAATCGCCATCAATGAAAACTTCAACGGTAGAGCCGATATCCGTGGTGCCGCGCAGCGTCGGCGTGGTGTCGTCCGTGGCGCCGCCCGCCGCAATATTCCCCTGTACGCTCCCGACATCATCTTCAATCGCCGTGATGGCCGGGACGGCGGGCAGACCGCTGTCGGAAGCGGGAAAATTCGTAGCCGGGC [...]
+NODE 173 51 2504 2462 0 0
+ACCCCGAACGCGCCGCTGGAGAGCAACGCGCACATCTTTACCGCCGTAGCG
+TGAAGCGCCAGTTGCCGCTTTGATCTACCGTGGCGGAACCGATTTCTACGC
+NODE 174 12090 715220 703709 0 0
+GCGATCTGCTGGCACGAGGCGACAACGTGGCGGCCAACCGGTTACTGGAGGCGCATCTGCTGCCCTGGGGATTCCGCTATCTGGAATTGCTGCAACGCAATACCGTTAGCGCCTTCTATGCCCGGCTTGCCGTCGTAGCGACCTGTTATCTGCAGGATGTTCAGCAGCAACAGGGACTACAGCCTGAGAATAAACGGTTGTTTTTTTGAGGTATTGGTCGGGTTTTGATGGCGTGCCGTAATACTTGTGCCGCCATCGTGCCCGCTGTTGCGTCAGCGGGCACAGTTTACTATTACAGCTCCGGCGTCTTTTTGAAACCGGTCAGCATCAGCACCAGGCTCTGTTTTGAGTCCGCTGGCGTGAAGTCGTAGTGATTTCCCTGACGGTCGCCGCCGATATACCAGGATATTTCCGTTTTCCCTTCCGCCAGCGCTTTGCGCACCGCTTTATCGACATCAACCATGCGATACTCATGTGAATGGTCCAGATATA [...]
+TCAGGGAATCCACCTTCACCACATTCCCCTTCACCTGCACCTCATCCCCCGGCATAAACATCAGCAGTTTCTGAGCAGTGTCGTTGTCCACCGCAACTTTTTTACCGTTCGCATCCAGCAGGCTGCCGATGGCGTAGATATACGGCGTGGTGTTGACCAGCATCGTCCGCCCGTCCGGACGGACCTGCAGGCTGATGCCTTCCTCGGCGCCTTTACGGTCCTTCAGCAGCGCCTCCGGGCGGTAGAACAGCTTCAGCTTCGTGCGCAGGGCAATGGCAATTCCGCTGCCCTTCAGCGCCGGCGGAATATCCTGCAGGTTCAGCCAGTACACTGACTCTTTATCCTTCGGCAGGTGGTCAGAGGCCATGATGATACGCAGCGTCTGCTGCCCCTGCGGTTTCACCTTAAAGAAGGAGGGCGTCACCACAAACGTCGGGCGGGTGTCTTTCTCCACAATATTGTCCACCCACGCCTGGCCGCCGAAAGTACGCT [...]
+NODE 175 14575 769755 762974 0 0
+GGCTCGCGGGCGGGCTGGCGCGGTCAGCGCTTCCCGGTGTTGTATAATCACCTGCCGGATCGCAATGCGATCGTGTTCGCCACCAACGATCGACGCCCCGATTTCCTACGCGATCATCCTGCGGTTAACGCGCCGGTTATCGAGATGATGAGCCATCCGGATAATCCGTATGTGAAGTTGCTGGTCGTGTTTGGTCGAGATGATAAAGACCTGTTGCAGGCGGCAAAAGGTATCGCGCAAGGGAATATTCTCTTTCGTGGTTCCAGCGTGGTGGTTAACGATGTAAAACCGCTGCTGGCGCGCAAACCGTATGATGCGCCGAACTGGGTGCGTACCGATCGCCCGGTCACTTTTGGCGAGCTGAAAACCTATGAAGAGCAGCTCCAGTCGAGTGGGCTGGAGCCGGCGCCCATCAACGTTTCTTTGAATCTGCCGCCGGACCTCTATTTGCTGCGTAGCAACGGTATTGATATGGATCTCAACTACCGTTAT [...]
+CACGCCGGTTAAATCATATAAATCGCCCAGTGAATCGCCAGAGAATTTAAGCCGCAGATCGACGCCGCCCATTTTCATCGGCTCGTTCACCACGCCGCTAAAAGCCACCCGCGTATTGCCAGAGCGGAAATCGGCTTGCACAGGAAAAGGCGTACTTTCGCTGCGTAGCGCCAGCATACCGCCTATTTTGCCCGTACCGGTCAACGGTTCCCCGTTATAACGCCCCTGCGCCTTCAGGCCGAAGACATAGTCGCCCACGGTGGATTTGTCTGCTTTGCCTTTCGTTCCCGTCACTTCGCTGAACGGCAACGGTTTGCCTAACGGATCGACCAGAATAGTGATATCCGCTTTACTGACCTTATCATCGATCGCGATTCGCCCCTGGTCGAAGAGAATATTATCCAGCCGGAAGGACCAGGCGGAAGGTTTAGCATTGGGGTCCGTATTCTTGTCTTGCGCGAGGTTAAAGGTCCAGTTATTGGTTTTCTCAGA [...]
+NODE 176 9382 513245 506776 0 0
+AATAAGATAAGTTTCACAGGATTGCGTAATCAGCGTGAGCGAAAGCGTATTCAACGCTTTCAGGCGGCGGTTAGCGCGTACCCAGCGCGAAGATTCCATATTCAGATTACTTCGCATCCCCTCCAGCGCCGCCGTGCGTCGCACCAGATCGCCCCAGGCGTTGTCGACTTCTTCGCTGTCGCCATGCTTAATACAAAGTTGCATTAGCTGATATTGCGCTACCAGTAAACTGTCCAGTTCGCGATCAACCTCCTGCTTTATCGATCGCGGCGAGAAAAGCAGATCCGCTAAAATAGCGCAGCCAATGCCGATGACGATTTCGCTACAGCGCTCAAGCGCAAATTGCGGCGTGAGCAGCGGCTCCGTCTGAATGGTAATCACAATGATCAGCGCAGTATAACCTGACAGTCCCCACGCATAAGAGTTTTCGATCCTTACTAAAGAGGAGATCCAGGTACAAAAACCGGCCCAGACACAGCACACCAGAATCAT [...]
+AGCCGATCTTCGATCTTTATGACGTGGAAAATGAGATCCAGCGCGCGCTGGAGCGTAAGGTTGAACTCAAGTCCGGCGGTTATCTGATTATCGACCAAACCGAAGCGATGACGACGGTAGATATCAATACCGGTGCGTTTGTTGGACACCGTAATCTCGACGACACCATTTTTAATACCAATATTGAAGCGACTCAGGCCATTGCCCGCCAGCTACGCCTGCGTAATCTGGGCGGCATTATCATTATCGATTTTATCGACATGAATAATGAAGATCATCGCCGCCGGGTGCTGCATTCGCTGGAACAGGCGTTAAGTAAGGATCGCGTGAAAACCAGTATTAACGGTTTTTCGCCGCTGGGACTGGTGGAAATGACCCGTAAACGGACTCGTGAAAGCGTGGAACATGTGCTTTGTAACGAGTGTCCAACCTGTCATGGCCGCGGGACGGTAAAAACGGTGGAAACCGTCTGCTATGAGATCATGCGTGAAA [...]
+NODE 177 14619 783009 775199 0 0
+CGCTCCAGCATTACTGGAACGGGCGCTAATGTAGGGAAATATCCATTCTACGTCAATCAACTTTTTTCAAAAAAAAGCGCGTTTATACAAACTTCCACCAATCTGTGGCTTTAATAAGCGAAAACTGCTTTTTTTGCCCGCGCCGGGAAATTTGCTATGCTGCACATCCCGTTGAAAACGCTGATAACAGGCGCAATCACATTCCGCACAATACTGCTCAGGAGATAACATGGAGATAATTTTTTATCACCCGACATTTAACGCCGCCTGGTGGGTAAATGCGCTGGAGAAGGCTCTCCCACATGCGCGCGTTCGTGAATGGAAGGTCGGTGATAACAACCCCGCAGACTATGCGCTTGTATGGCAGCCCCCGGTTGAAATGCTGGCCGGAAGACGCTTAAAAGCCGTCTTTGCGCTGGGCGCGGGGGTGGATACAATTCTGAGTAAATTAAATGCGCATCCGGAAATGCTGGACGCCTCCATTCCTCTATT [...]
+GTCGCGTTTAAGCTCATCCAGCAGGTTTGGCGGCAGCTCTTCATAGGAACCGGGGAGATCGTAGGCAATCCAGACGCCCCACCCTGCCCGACGCATTAGCGCCGCCTCCACAAAGTCGTGGGAAAGAATCGATCCGGCGAACGAACCTTCTCCCGGCAGCGGCGCCAGAGCGCAGTGCTCGATAAACGGCTTCACGCGGATAATGGCATTGTGCCCCCAGTAGTGCGACTCCCCCAGCTGCCAGAAATGCAGCCCGGCGGTAAACAGCGGCCCATAAACACGGGTCGCGAACTGTTGGCAGCGGGCATACAGAGTATCCATTCCCGACGCTTTCGGCGAAGACTGGATAATCCCGGCGTTTGGATTCGCTTCCATCAGGCGCACCAGCCCGCTCAGACACTCGCCGCTCATCACTGAGTCCGCGTCCAGCACCACCATATAGCTGTACTGATTGCCCCAGCGGCGGCAAAAATCGTCAATATTGCCGCTTTT [...]
+NODE 178 581 32716 32527 0 0
+CAGCAAAAAATAGCTGCCAGCGAATGGCTTTCACTCTGAGCGCCTATAACGGCGGGCAAGGCTGGGTTAACAGAGATAAAAAGCTGGCCGCCGCAAAGGGGTTGGATGCGTCCATCTGGTTTGAACATGTAGAACGCGTTAACGCCGGGCGCAGCGCCGCAAACTGGCGCGAGAATCGTCACTATCCCAAAGCGATTTTATACCAACATGCTCCCCGTTATTTGCAATGGGGGCAGGCTAGCTGCATTCATTAATCAGAGGGAGTAATGAAACTCAGTATCGATTTTTGGGAAGTCATCTCCCTCTTACTTTCGTTTGTTGGATTAATGTTTGCTGCCGGTAAATTGCTGCTGGCGCAAATTGAAAAACGGCTGAATGAACGTTTTGAAGCACTGGAAGCTGCCCGACGCGAATCAGAAATAGGTTGGTCCAGGCTGGAGAGAGAATTTCTGGAGTTCCGCGCCGATCTGCCGCTGCATTATGTCCGCAGAG [...]
+GTTTTGCTTCCAGAACGGCCTGGCCGCGCAGATAGTCGTCTCTGCGGACATAATGCAGCGGCAGATCGGCGCGGAACTCCAGAAATTCTCTCTCCAGCCTGGACCAACCTATTTCTGATTCGCGTCGGGCAGCTTCCAGTGCTTCAAAACGTTCATTCAGCCGTTTTTCAATTTGCGCCAGCAGCAATTTACCGGCAGCAAACATTAATCCAACAAACGAAAGTAAGAGGGAGATGACTTCCCAAAAATCGATACTGAGTTTCATTACTCCCTCTGATTAATGAATGCAGCTAGCCTGCCCCCATTGCAAATAACGGGGAGCATGTTGGTATAAAATCGCTTTGGGATAGTGACGATTCTCGCGCCAGTTTGCGGCGCTGCGCCCGGCGTTAACGCGTTCTACATGTTCAAACCAGATGGACGCATCCAACCCCTTTGCGGCGGCCAGCTTTTTATCTCTGTTAACCCAGCCTTGCCCGCCGTTATAGGCGC [...]
+NODE 179 2324 140188 139285 0 0
+AGAGCGTTGCGCTGACGCCGTGAAAGAATACGGTATCAAGAATCTGGAAGTTATGGTTAAAGGTCCGGGTCCAGGCCGCGAATCTACTATTCGTGCTCTGAACGCCGCTGGTTTCCGCATCACTAATATTACTGATGTGACTCCGATCCCTCATAACGGTTGTCGTCCGCCGAAAAAACGTCGCGTATAACGCTTCGTTTTCCAGGTTAGTTGGAGAAAGAAAATGGCAAGATATTTGGGTCCTAAGCTCAAGCTGAGCCGTCGTGAGGGCACCGACTTATTCCTTAAGTCTGGCGTTCGCGCGATCGATACCAAGTGTAAAATTGAACAAGCTCCTGGCCAGCACGGTGCGCGTAAGCCGCGTCTGTCTGACTATGGTGTGCAGTTGCGTGAAAAGCAAAAAGTTCGCCGCATTTACGGTGTGCTGGAGCGTCAGTTCCGTAACTACTACAAAGAAGCAGCACGTCTGAAAGGCAACACCGGTGAAAACCT [...]
+AGCAGCTTCTGTTTTCTCTGAACGATCAACCAGCTCGATGTATGCCATCGGCGCGTTGTCGCCTGCACGGAAGCCACACTTCAGAATGCGAGTGTAACCACCGGCGCGGCTCGCGAAACGCGGGCCCAGCTCGTTAAACAGTTTTGCCACGATCTCGTTATCACGAGTACGGGCGAATGCCAGACGACGATTAGCAACGCTATCAGTCTTGGCAAGAGTAATCAGCGGCTCAACTACGCGACGCAGCTCTTTCGCTTTAGGCAGGGTCGTCTTGATGATTTCATGACGAACCAGTGAACCTGCCATGTTGCGGAACATAGCCTGGCGATGGCTGCTGTTGCGGTTCAGTTGACGACCACTCTTACGATGGCGCATGACCTTATCCTTCTCAGTAAAACCTTAACCTGTGATCCGGTTACTCGTCAGCGATGCTTGCCGGTGGCCAGTTTTCCAGGCGCATACCCAGAGACAGTCCACGGGAAGCCAGCACGT [...]
+NODE 180 3351 158220 152620 0 0
+ACGCGGGTCGTCGCCGGGTATCGCGCTGTCAGCCACCGGATGAGCGGCTTGTTTAGCGCGCGCTTGCGCTTTACGCGCTTCACGGGCCGCGATGACGGCGCTATTGTCTGGCAGACTACCCGCCTGAATAACCACCGGTTGCGTGGCCTGCGCCTGTTTCTCTTTTACCCGCGCCAGCGCAGCGGCAATGGCATCCTGATCTTTTGCCGCTGGTTGTACCGCTGCGCTCTTGTGACGTGCAAGGCGGGCGGCTTTTTCGCGCTCCAGTCTTGCCTGACGAGCCTCAAAACGTGCTTTGGCTTCGGCGGCGCGTTTTTCTTCAAGCCTGATCGCAGTAATCTCCGCTTTTTCCTGACGGAAATATTGGACGAGCGGAATATTACTCGGGCAGACCCAGGCGCAGGCGCCGCATTCTATACAATCAGCAATATGGTGAGCGGTAGCCTTGTCATGCTGCTGCCCTTTGCTGAACCAATAAAGCTGCTGCGGTAA [...]
+TGGCTTCTTGGCCCGTTAGCCTGGCTGTTAGTCGCGTTGTTGAGCGCCTCGCTGGCGTTATTACTCTACGTTATGGCGCTTGCCACACCGCAAACGTTCAAGACGCTTAGCGGACAGGAAACCGGTAATTTACTGCTATGGGGCATTTCATTTATTACCGCTATCGCCATGTGGTACTATACCCTGTGGTTGACGATCGCATTCTTCAAGCGCAGACGCTGCGTGCCGAAGCATTACATTATCTGGCTGCTGGTGTCGGTGTTACTGGCGGTTAAAGCATTTGCCTTTTCGCCCGTCTCAGATGCCTTTGCCGTGCGTCAGTTACTCTTCCCACTGTTGGCGACGGCGCTCATTGTGCCTTATCTCAAACGTTCAGCGCGCGTTAAAACAACGTTTGTTAATCCGTAATAACCCTACAGTTAACCTGTTGTCGCCTGTGGTAGTTTGACAGATAATAGGCGGCTTTTTTATTTCAGGCCGAAACATGACTGA [...]
+NODE 181 5945 287637 285918 0 0
+CAGTTGTTCATTGAGCCGGTCTGGACTTCTTCTGCAAATTGACCTCTGACTTTATCACTTCACCGCAGAGGTAACTTCCTGATGAAAACATCCCTTCTTCTTTCCGTGCTGTCCGCCTGCGTACTTCTGACTGGCTGTCAGGGGCAGCAAAAACTGCTGCAGCGGGATGCGGCTGTTCCGGTACCGTCGGTGACGGTCAGCAATAATGTCCGTCCGGCCAGCCCTGATATGTACGCGGGGACGACCGTGCCCGAGGTGGTGCGTTATGACCGCTATCTGCTGGTTAACACTCATCCGGATGCGGTACAGCGGGATCCCCTTTCCCAGATGATTGACATCCGTATTCCGGCATCCCTGAAGCCGACGGTGGCAGATGCGATGCGTTATGCCCTGAAACAGTCGGGCTACACGCTCTGTGCCACCGGACCGGCCAACGGGGTGCTTTATCGTCAGGCGTTGCCGGCAGTGCAGTATCAGACGGGGCCGCTCAGG [...]
+TGCGCAGTCCATCCAGAATCGGATCGTATATTTTTTTACCTTCCTCACTGCTCAGTGCCATTTCAATCGACCAGATCCGCACCGCATCCGGCTGGTTCTGCATGGTCCTGGGCACATCGTCCTCGCTGAGAACACTCTGGTTATTCGCGATAATCTGCTCCAGTCCGGGCAGACGCTCACGGATCACCTTCCCCGCATAGCGAATGTAGAGGTCCGCGATGTTGTTCACATACCGCATAATCAGCATATAGTCCGGACGCTCACCGAGGGCCACCAGGGCGCGGGCAATGATATTGACAAAGCGCCAGGCAAACTCCCGGAAAGCCGCCGAATTACCTTCACCGGACAACTGACCGGCAACACGGGAAGCCACTTCCGATACACGACCAAAGCGTCCCACCGCATTGTAACGGGCTGAAATTTCAGGCCAGCCAAGATGAAAGATATACAACTCATCCCCCCGCCCGGCCCGGTGCGCTTCAGCCCAGACCC [...]
+NODE 182 859 42009 41861 0 0
+GAACTAAAAGGCGAGGTTCCGCTGATTGGCTTTTCCGGCAGTCCGTGGACGCTGGCGACTTACATGGTGGAAGGCGGCAGTAGCAAAGCCTTCACGGTGATTAAAAAGATGATGTACGCCGACCCGCAGGCGTTGCATCTGCTGCTGGATAAGTTGGCGAAAAGCGTCACGCTGTACCTCAACGCGCAAATCAAAGCGGGCGCGCAGTCGGTGATGATTTTCGACACCTGGGGCGGCGTGCTGACTGGCCGCGATTACCAGCAGTTCTCCCTCTACTACATGCATAAAATCGTCGATGGCCTGCTGCGTGAAAACGACGGTCGCCGCGTGCCGGTAACGCTGTTCACTAAAGGTGGCGGTCAGTGGCTGGAGGCGATGGCGGAAACCGGCTGCGACGCGCTGGGTCTCGACTGGACGACAGATATCGCCGATGCGCGCCGTCGCGTTGGCCATAAAGTGGCGCTGCAGGGCAATATGGACCCCTCGATGCTG [...]
+GTCACCTCGCCGCCCTGCTCAAAACCGACGTCCGCCCCGCCGATAAACGCTGGCGGATCTTTGTCCAGGCGATCTTCGCGGCAAACCGATGAAGCAAGTTCTATCTGTTGAGCGCGTAGCGACGCGAGATCCATACTAACTCCTTAGCTGTGATACTGCGCAGAAAGTCGGTGCACTGCCTCCACAAATGCGCCAGCATGTTCTGGCGGCACATCCTGATGGATGCCATGTCCAAGGTTAAAGACGTGCCCTTCTCCCTGACCGAAACCAGCAAGTATAGTCGCTACTTCGTCTTCGATCCGTGCCGGCGGCGCATACAGCATCGAGGGGTCCATATTGCCCTGCAGCGCCACTTTATGGCCAACGCGACGGCGCGCATCGGCGATATCTGTCGTCCAGTCGAGACCCAGCGCGTCGCAGCCGGTTTCCGCCATCGCCTCCAGCCACTGACCGCCACCTTTAGTGAACAGCGTTACCGGCACGCGGCGACCG [...]
+NODE 183 16175 855099 844727 0 0
+CGTTAGAAATCTCTTTTTTGCGCTTCCACATCACATTGGTGACAAATCCGCCTTCGCCAAAAATCTCATCCATCATTAATTTAAGATTGGCGTACTCATTATCGTCGATAGAGATAAAAATAAATCCGGTATCTTTCAGGAGCTTCCTGGCCAGGAAAAGACGCGGATACATGAAAGATAACCACGCGGAGTGCGTCGATTTACCCTGAATGGATTTTAAACGTGCCAGTTCGGTATCATTAAGACCAAACATATCCTGCAACGCCCGATCGCTATATTCAAAATGATCGGGATAGACAAACCCGTCCGATCCGGTGTTATAAGGGGGATCGATATAGATCATATCGACGGTATCGGCGTAATTATTTTGCAGATGGCGTAAAACATCCAGATTATCTCCGGTCAGAAAAAGATTATGGCTGTTTTTATTTTCTGCCAGAGTATTGTGTTCCGCGTCAGGAACGATAACGGTAACGGATTTTTCACCCGCCT [...]
+TTTTTAATGTTAAACACGGTAGTTGCGGCGGCGTGGAGGCGCTAATGCGCTGGCCGCAACCGGATGGCCGTTTTATAACCCCGGATATTTTTATTACCGCCGCAGAAAATGAAGGCATGATTATTCCTCTCTCTCGTCATCTGTTCGAACTGATTGCTCATGACGCGATAAACTGGACTGTACCGGATGATTTCTATATCAGCGTAAATATATCGCCTGCGCATCTTATGGATGACGGTTTTATACAAGATATAGAGGCGCTCAGGACTCGTTTGGGAACGATAACGCTTATGTTGGAGCTCACCGAGCGTAGCCTGATTGTAGAACCTTCACAGGTCGCAGAAAAACTTTCAACGCTCCGTGAAAAAGGCGTGTTAATAGCGATTGATGATTTTGGGACCGGCTATTGCTCACTCTCCTATCTCCAGCAATTACCTGTAGACTCTCTTAAAATAGACAGAACGTTTATCGATACCATTGATACCAGCAGCG [...]
+NODE 184 2383 127617 126403 0 0
+GCGCACAAAGGTATCGCGTGACGGCGCGGTCAATGCAGCTTTATCACTGGCAACCTCATTGAGTTGCAGCGTCAGGTTTTTCTCTTTTTCCGCCAGTTCGTTTTTCAGAATATCCTGGTAAGCGTTCACTAATGTTTTCAGAGCGCCTACGTTGTCTGCGGCAACGGCGAGGGTAGCGAACGCTTCGCGCGGAATCGCGTTACGCAGCGTGCCGCCGTTGAAATCGATCAGACGCAGATCCAGTTCTTCTGCGTGCCCGGCCAGAAAACGCGCCAGCAATTTGTTGGCATTGCCAAGGCCTAGGTGAATTTCACCACCGGAGTGGCCGCCTTTCAGGCCTTTCAGGGTTAGCTTAAAGCATGCAAATCCTGCGGGTACAGCTTCACGGGTCAACGGCAGATTAGAGGTAAAATCGATGCCGCCTGCGCAGCCCATATAGATCTCACCTTCTTCTTCAGAGTCGGTGTTGATCAGGATGTCGGCCTGCAACCA [...]
+TCCCCTTTCGGCATATGTAAAAACGCGGTGACAGGCGAACCGCCAGGAACGGCAAATTCCATTTCACGTAACGAGCCGGGCAACCGCTGCGCGGCCTCTTCATAGGCGCGATTCGCCAGCGCCTGCGCCTGCTCCGCCAGCTCATCGCCCTTCAAATGCGGGTAGGCGGCAATGTTATAGAGCGTTGAGGCATGAAGCCAGTAGCGTCCGCTGCGCATGGCGTCCTGTTCCTGACAGGCTTTCTGCTGCCAGTCCATCGCCTGCTTTGCCCACTCATAAATCCAGTTGCCGCCGCGGTAACCGATGACCGTATCGTATAAATCATCATCCGTTCGCTCTGCGTCGCTCATCACAATGCGCGCCTGCACATCAAGGATTTCTCGTGGGTCAACGCCGCGCCAAATCCACATCAGGCGGTTTATCATGCGATACCAGTGCGGAACGTTCTTACCGTCCAGCGCGGATTGCATGGGCGGCTGCGACCCACGATTG [...]
+NODE 185 6260 322623 315130 0 0
+ACATACAGCGCCAGATCGTAATCATTGCGGTTGCGTGACCATATCGGAAAGCGCAGATCGTAACAGATCAGCGGCAGAATGCGCCAACCGCGCCACTGCACGATGATGCGTTTATCGCCTGCGGCATAATGTTGATGTTCATCCGCCATACGAAAGAGATGGCGCTTATCATAGAGATGAACCTTGCCTTCCGGTTCAACCAGTAAGAAGCGATTTACGGCGCCGCGCTCAGTTTGTAGCGCCGCGCTGCCGGCAATCAGAGCGTCAGTTTGTCGGGCTTTGGCCTGCATCCACGTAATCACGCTATCTTGCGAAAGTGAGTTATTAGCGGCCTCCATCGCGAAGCCGGTGGTAAACATTTCAGGCAGAACAATCACATCCCGGCCAGATACGAGCTCTAGCTGTCTGTCAAAATGACGCAGGTTTGCCGGGCCGTCCATCCAGACTAAAGGTTGTTGCAACAGAGTAATTTTCAAACCAGACACGATCGGA [...]
+GGCGGTGAGTTGCAGTTCATTGAAAATAGTCTGACGAATCTCCCTGGCGATCAGCGTCGCCGATCCATAACAGTGCGGGCTGTCAGTCACATCCAGCCAGGCTTCATCCAGCGAGAGCGGTTCAATCAGTGAAGTGTAGCGGGAAAAGATGTCACGTACATGCCGCGAAGCCTCTTTATAGGCGACAAAGCGGCCAGGCAATAGGGTGAGGTGGGGGCACAGCTTTAGCGCCATGGCGGTCGGCATCGCGCTACGTACGCCAAACTGGCGCGCAGGATAGTTGGCGGTACTGATAACGCCTCTTCGCTCACGACTCCCGCCAATGGCAATGGGAATATCGCGTAACGCCGGATTATCACGCATCTCTACCGCGGCAAAAAAACAGTCCATATCAACATGTATGATTTTGCGCATCGCTCGCCCCCACAATACTGTTTAAGTGTACAGTATGTTTTATTGCGCGCAAAGAGACATTCGCGTTAAAAATGCGAC [...]
+NODE 186 1651 104291 103943 0 0
+ATAACTTCAGCCGGGTGGTGCAGTTTAAAATAAACCTAAACACGATGACCGTAACGCGTCCGTATGAATATGGTAAAACGGAAGTCGGGAACCGGGGCTATAGCAGTTTTGTGAGCGCTAAGCATTTATTGACTAATGGTCACCTGGTTATTCACTTCGGCGCGACGACGGTTGATGAGTTTGAACATACCATTACCGCGCAACCAGGTTCCAGCGATCTTGTCGATCCGGATGAAGGGCAACAGGCGTTAGGCCGACTGGTATTACAAGAAATCAATAAAGAGACGAAAGAGGTTTTATTCGAAGCGATGGTGACGTCGGGCTATTTCAAGAACGAAGAGACGAATGGCACGAATTATCGTTATGATATTTCTGCATTTCGGGTATACAAAATGCCGCTGTTTGCATAACTAAGTATGTTATGCGGCCGGTTATCGACCGCATAACATTATGGCTTATTTGCTAATATCATCCACGCGCATGGTGTGGTCA [...]
+GTTTTTTACAGCGGCACAGATACGCCATTAATTAAAGAACCGTATACCATCGTGGAAAAAGATGGATTCAAGATCGGCGTCATCGGTATGCACGGCGTTTCCGCATTCTATGAAGCGATTGCCGCAGGCGTGCGTGAAGGCGTTGACTGCCGCGATCCGATTCCTTATGTGAAAAAACAGCTGGAAGAGTTAAAAGGGAAAGTTGACCTGACCGTGCTGCTCGCCCACGAAGGCGTGCCGGGTATGCAGTCCAGCGCGGGCGAGGCTGATGTCGCACGCGCACTGAAAACCGACGTTGATATGGCGAAATCGCTGGAAGGCTATGGACTTAACGTCCTGATTACCGGCCATGCGCATAAAGGTACGCCAGAACCGATTAAAGTGGGCGATACTCTTGTCGTTTCCACGGATGCGTACACCATCGAATTAGGTAAACTGGTGCTTGACTGGAACCCGGAAACCAAAAAAGTGGACAGCTACAATGGTAAGTTG [...]
+NODE 187 51 4115 4115 0 0
+AATCTGGTTAAACAGCTCAGCAAATTGCAATTCCCGGTATTGTTGGATAAT
+TCTCATGGCCATGGTCAAATTCATGGTTACCGACAGAGACGGCGTCGTAAG
+NODE 188 9159 422596 419587 0 0
+TCATGGCGCTCTCGCAGTCGCTGGGCGACTTTGTGGTCGCCAGCGCCGGGCCGCATCTGGAATCAGTCATTGCCGGTCACGGCGCCGGAGCGCAAAGCTTGTCTGAGCAGCGGATGTGCCGGGTGCTGAATATTGATATCGGCGGCGGCACGTCTAACTACGCGCTGTTTGACGCGGGAAAAGTCAGCGGCACCGCCTGCCTTAACGTCGGTGGTCGCCTGCTGGAAACCGACGCTCAGGGGCGCGTGGTTTATGCCCACCAGCCGGGGCAGATGATTATCGATGAGGTGTTCGGTTCGGGTACTGATGCTCGCGCCTTAGCTGCCGCACAGTTGGGGCAGGTGGCGCGGCGGATGGCGGATCTCATCGTCGAGGTTATCACTGGCGCGCTCTCGCCGCTGGCGCAATCGCTGATGCAAACCGGGCTACTGCCCGCCGATATTACGCCGGAGGTGATTACCCTTTCCGGTGGGGTAGGTGAATGCTACCGCA [...]
+CGCCACACACCAGGAACCGCTTCACGCCGCCCGCTGAGTAAAAATGCCACTACCGCCGGAACGCCGGGCAACAGCCCCAGCCAAAAATTGTCATGGTCGGGATAAAAAAAGTTTAACAAAGTATTACCCTGTCCACGGGATGAACCGGCAATGACAAAGAGTACCCAGGCGCGCGCCTGAAGTAGCAGTACGCACCAGAACAGAAACGGCAGGCGTAAACGTCCGTGTACATCATAATCGGCTGGATGAAACTCAGTACTCTTCATCTTCAATCAGGCGTTTACCCAAACTTAGGGCGTCAGAATGCTCATACCCCAGACGTTCATACATGCCCAGCACAACGTCGTTATCATCGCGCACCATAATTTGGATTTTCGGACACCCGCGGGCGATGAGTTTTTTTTCCAGCCGGTTAAGCAACGCATTCGCAATGCCGCGCCCGCGGAACTCCGGGTGAACGCCCAGGTAATACGCCGAGCCGCGATGCCCGTC [...]
+NODE 189 7819 370778 366914 0 0
+TCGTAAGTTCGACAAAGCGCAGCAGGAAGGCGGTAAAGCGGCGTTGGTGCTGGGGCTGTGCTTTATCACTGAAGGCGCTATTCCGTTTGCGGCACGCGACCCGATGCGTGTACTGCCGTGCTGTATCGTTGGCGGCGCGTTGACCGGGGCTATTTCTATGGCGGTAGGCGCAAAATTGATGGCGCCGCATGGCGGTCTGTTTGTTCTGCTTATCCCAGGCGCAATTACGCCGGTATTGGGATACCTGCTGGCAATTGTGGCCGGTACGCTGGTGGCAGGGCTGGCTTATGCCGTCCTGAAACGTCCGGAGACGGAAGTCGCGGCAAAAGCGGCATAAGAGAAACACGCTAAAAAAGGCAGAGCGCGCTCTGCCTTTTTTATTACCTGAAGAACATTGAGCGTCAGGCCACCGCTTCGGCAATTTGCTGGGCTTTTAACCACGCAATCTCTTCCGCCCAGATATCAGGATTGATGGTCTCCAGTATCAGCGGA [...]
+GCTGGATGACCGGGTTAATCTTCGCGTTAGCGCTGTGCATATGCATCGTGCTGGTGCCGCTGGTTCAGGATACCTCTTACACCCTCACCGCGATTCTGTTCACCATCATGGGCTTCGCCTTATACGGACCGCATATGCTTTTTGCCGTCGGCTGTCTGGATGTGACCCATAAGGATGCGGCGGGATCGATTACCGGCTTTCGGGGATTGTTCAGCTATGTCGGCGCGGCAATGGCCGGTGTGCCGGTAATTATGGTGAAAAATAGCTGGGCGTGGTCGGGCGTTTATATCTATGCGTTAATCGCCATTCTGCTAACGACTCTGTCGCTGGCGCTGCTCTCCAGGCTGCATCGGTTATAACATTCTGGCGACAGCGGCAAAACGCGGCTGTCGCCAGTCTCTGTCAGAAACGGTAATCCACCGCCATAAAGTAACGACGTCCGTCTTCGGTATAACCGTAGTCGTCGCGTTTGAGATCTTTATCGCCCACGTT [...]
+NODE 190 1894 110479 109992 0 0
+CGATTACTGCCGGATTAACGCAGCGCATCAAAAAACCTGAGCCAGTCAGATACGGACAAACAGGGAGCAATAGCCCTAATCATCCATCTTGCCGTTGCGGTATTCGGTAAAGTACATCAAAAATAGAGGTGTCAGGGAAACGAGAAATGCAAAAATGTAGTCTTATTACGGTATTTAGCTTATCAGTGTTGATGCTAGCCGGATGTACAACGACCTATACCATGACGACCCGGACGGGAGAGATTATTGAAACGCAGGGTAAGCCGGAGGTTGACACCGCAACCGGAATGACGAAATACGCTGATGTTTATGGTTATCATCGCGTTATTAAAACCAGTGAAATAGTGCAGACGACAGAAGGCGCATCGAAGCTGGACTGGTAATGCGCTAAAGCAGTTGGGAGGCCGTGTCCAGTATGGGTACCGGACTGTTTCTGGGCCAGAATTGAATAGAGCGCCTGTATAGCCGAATTCCGGGTATCGGCTTGATTTG [...]
+AGTATGCTGGCCGGGCGGCTTGCGGGGCCTTCATGCTCCCACATTTACAATGTTGGTATGATTACATTCTCTCTATACTTTACTGTGCTAACCTTTTATCTCGTTGAGATAACGTTTAATTAAAATGCTCTCTTTTTGATGTACATTATAAGAGGAGACATTATTCATATTTTCGAAATCAGGGCAGACGATATGTATACAACCATCAGAAACACAACGCTAGCAATGGTAGCTTGTTTTTCGTATATCGCACATGCCAGTACCCACCCTCCTCTTATTATCACCAGGGGAGCCGGAGGAGACGCCTCCGGAGCCGCAGTCATTCATGATAATTGGCGGCATGGCACTCCTGACCTGGTCAATCTTACCGATATCCCCATAGATAAAATCAGACCAGAAAAATACCGTTGCGTACTGATTATTGGGCAAGGAGCTATAAAAGAGATGCTTCTTGCGAACAATGCCTCAGCAATACTTTCCGGAAAAACGGTT [...]
+NODE 191 1154 56166 55887 0 0
+ATCTGGGGACTGTGCCAGTTGAGATTGTCGGCAAGCTGCGCGATAGCGGGGTCTATTCTTATAAAGTGCTGTGGTTTGAAAATGACCTTGAGAAAAACTTCCGCGCTCCAGGCGCATATCCGCAACAATCGATGGCTGTCGCCTCGACGCACGATCTCCCCACGCTGCGCGGCTATTGGGAATGCGGTGACCTGACGTTGGGTAAAGCTCTGGGGCTTTATCCGGATGAAGTGATTCTGCGCGGGCTGTATGAGGATCGCGAGCGGGCGAAACAGGGGCTGTTGGACGCGCTGCATAAATATGGCTGTCTGCCAAAACGCGCCGGGCATAAGGCATCGTTAATGTCGATGACGCCAACGCTAAATCGCGGACTTCAGCGCTATATCGCCGACAGTAACAGCGGTCTGTTGGGGCTTCAGCCGGAGGACTGGCTGGATATGGCCGATCCGGTTAACGTACCGGGCACCAGCGATCAGTATAAAAACTGGCGAC [...]
+GGCGCATTCAAGCAGGTGCTGGTCGATAGCGGCGTGGATAAATACATCGCTTCAATGATGCATGAAACCAATGTCTCTCCGCTGTTGATGGCGTGGTCTATCGCGGCGGTTCTGCGTATCGCGCTGGGCTCTGCGACTGTCGCGGCGATTACCGCAGGCGGCATTGCGGCGCCGCTGATCGCCACTACCGGCGTTAGCCCTGAACTGATGGTTATCGCAGTCGGTTCCGGGAGCGTGATTTTCTCTCATGTCAACGACCCGGGCTTCTGGCTGTTCAAAGAGTATTTCAATTTGACTATCGGCGAGACCATTAAATCCTGGTCGATGCTGGAAACGATCATCTCCGTCTGCGGCCTGATCGGCTGTCTGCTACTGGGTATGGTGGTTTAAGCGAGGCGGCTTGTAGGCCGGATAAGGCAGCAATGTGCGCCAGGATTGCCTGATGGCGCTGCGCTTATCAGGCCTACGTGCTCTCTCCATAACAAAGCCGGG [...]
+NODE 192 948 48058 47544 0 0
+CGGTGGGCGCAGTCTGGGACGAACTGGGGCGGATACTGGCGCGTAAACGCCGTATTCCCGGTATCTCATTTATTCGCGATTACGCGGATGACGGCGCTTATATCGATGCACTGGCGAAAAGCGCGCGTGAGTCGTTCGCCAGACACGGCGAGCCGGATGTGCTTCTGCTCTCTTATCACGGCATTCCACAACGTTATGCGGATGAAGGCGATGACTACCCGCAGCGCTGTCGCGATACCACGCGTGAACTGGTTTCCGCATTGGGACTGCCGCCGGAAAAGGTAATGATGACGTTCCAGTCGCGCTTTGGCCGTGAACCGTGGCTGACGCCGTACACCGATGAAACGCTAAAAATGTTGGGTGAAAAGGGGACTGGCCATATTCAGGTCATGTGTCCGGGATTTGCCGCGGATTGTCTGGAGACGCTGGAAGAGATAGCGGAACAGAACCGCGAGATTTTCCTTGAAGCGGGCGGTAAAAAGTATGCGTACA [...]
+GGCGCGTGGGACGGCCTGACGCGTGAAGATCTGGACATGTACGAAAAGGCCTATCTGCGTAACGAAGAAGATCGGGAATCGCCCTGGTATTGTCTGTTTAATAACGATCTCACGCGCGATGTGCCGCCCTGCTTTATTGCCAGCGCGGAGTTTGATCCGCTCATTGATGACAGCCGCTTGCTGCACCAGACATTACAGGCGCACCAGCAGCCCTGCGAATACAAAATGTATCCCGGCACGCTGCACGCCTTTCTGCACTATTCGCGAATGATGACAATCGCCGACGATGCCTTGCAGGACGGCGCGCGATTCTTTATGGCGAGGATGAAGACGCCGCGTTAACGGTACGGCGCCGTGAGTTTCAGCATCATATCAATATGTTCCGGCGTCGCGTTCAGCGCCGGAATGTACGCATACTTTTTACCGCCCGCTTCAAGGAAAATCTCGCGGTTCTGTTCCGCTATCTCTTCCAGCGTCTCCAGACAATCCGCG [...]
+NODE 193 2112 105153 104738 0 0
+AAATGCTGACCGGACGAAAACCATTATCCATAACGAAATTACAAAAGTGCATATTGATCGCACGGAAGATGTTTTTGGTAAACACACTGAAACCATTAAGGGCGATCGGGATATTACGGTCACGGAAGGCAAGCAGTCGCTGACGGTGAAGACGGGCAACCGGACGGTCACAGTGGCAACGGGCACCAGTACCGAAACAGTACATGGGGATATTTCCATTACCTCCACCACCGGAGCCATTCACCTGACAGCAAACACGCAGATTACATTGACGGTGGGACAAAGTACGCTTGTCATGAATGCCAACGGCACCATAAAGCTGGATGGCCCCACCCATCTGGCGCTTAACCCGGAATCAAAATAACAGGGCATATTTCCATGCAATACCTTATTAATGAAGGACATTTTTCCCTGCCCGGAAACTGGCAGGATAACACGATGAACATCCTGACACCGGTGCTGAGCGACATTGCAGGCGCAAACCTGGTGGTC [...]
+GGTTACCCGTCAGGCGGTAGTGCGGCACCAGCAGGTTGCGGCAGTTGTATGGCTCCTGCACCGTGGCATAGGCCGGACATAAACCCTCAACATCAAAATAGGTGACATTCTGCCCGTCGCTGTCAAATTCCAGGTACTGCGACCAGTTACACAGCCAGCGAGTGCCCAGAAAGCCGCTCACGGTGTGGCGGCCAGTGTAGGCGCGTTTCAGCGTTAACGGCAGGATATGGGGCCAGTGGAAATCAGTACGGTAGTCGAGGTATTCGCCGGTTCCCGCGTCCACCGGGTCGCTGAATCCCTGGCTGATACGCTCATTGGCTGCCCGGTTTAACTGTTTTGCGCCCCACAGAGCTGTCAGAACCTCTAAACCGGACACGATAGATTGTTCTGTAACAGACATATCCGCATTAATCGGCCCGTACTGCCCGGTAGTCTTATCCGCCGTGATGGTTTTACACCCGTCCTGAATCACTGCCGAACAGGTGATTTTAT [...]
+NODE 194 6047 301208 299059 0 0
+GCGGGGGGCAAAATCGGTACGCCGTTTAGCGACCTTTACAGCAAAGCTTTTGGTCACTGCGAGCCGGTTTCCAGCGATAGCCATACCAGCGTCGAATGTAAAGCCGAGGGAAGTCAGCATATTAGCTATGTTTTCTCCGGCGAGTGGAGCGGACCGGAAGGCTTAATGCCTCCTGATGACGTCTTAAAAAACTGGGACGTGCGCAAAATTATCTGGCGTCGTTAATTTGCGCCTGAACAAACCGCTTCGCTTAAAAACAAGGTAAAATAGCCTCCATTAATGCCACGACTGCGTGGCATTCTCATTTTCAGGAGGAATCATGTCTCAGGTTCAAAGTGGCATTTTGCCGGAACATTGCCGTGCGGCAATTTGGATTGAAGCCAATGTGAAAGGCGACCTGGACGCCCTGCGCGCGGCCAGCAGAACATTTGCCGATAAACTGGCGACCTTCGAAGTCAAATTTCCGGACGCCCATCTTGGGGCCGTTGTGGC [...]
+GGTAGCGGAGAATCCAGGCTGGTGCGGCGGCTAATATCCACCTCCCACGGACGCAGGAACAGATCGACCGGCCCCTGGTACGCGGGCGTATAACCCAGCGGCCAGCGATGCGCGCCAACGTGAAACTGCCCGCCGCGGACGGTGCCTGTCAGGCGGTTCACCTCGCCCATAAACTCCAGTACGAAGCGGGTTGCCGGTTCACGCCACACCCGATCCGGCGCATCAGCCTGTTCGATATTGCCCTGACTCATTACCACCACCCGATCCGCCACTTCCGTCGCTTCTTCCTGATCGTGGGTGACAAAGACGCTGGTGAATTTCAGTTCTTCATGTAGCTGGCGCAGCCAGCGACGCAGCTCTTTACGTACCTGGGCATCCAGCGCGCCAAAGGGTTCATCCAGCAGTAGAATTTGCGGTTCCACGGCAAGCGCGCGCGCCAGCGCCACGCGCTGTTTTTGTCCGCCGGAAAGCTGGGCGGGGAAGCGATCCGCG [...]
+NODE 195 174 8681 8500 0 0
+ATCATTACGCCAAATACCACAAAATCATTCAGGGACTGCACCTGAGTCTTCTCTTCGGGGCGATGATAATCAATGATCTTCGCTGAAGCGCCGGTAAAGCCAAAATTCCAGCCAACTCCCAGTAATATCAAAGAGAGCCAGTAGTGGAAGATATCTGTTCCGCTGAGCCCGGCA
+TACTGGGAGTTGGCTGGAATTTTGGCTTTACCGGCGCTTCAGCGAAGATCATTGATTATCATCGCCCCGAAGAGAAGACTCAGGTGCAGTCCCTGAATGATTTTGTGGTATTTGGCGTAATGATTGTCGGGTCGTTTTCATCCGGTGCGTTGCTGAATCTTTATGGCTGGAATG
+NODE 196 6003 354450 352577 0 0
+AGAACAGAACCTGCCGTAATAAGCAATCCAGTTGCGGAAATCCGCAGCGCGCCGAAACGGTTAATTAACCTACCGGTGAAGAATCCAGGCCCATACATAGCAATAACGTGCCATTGAATACCCAGATTGGAGGCTTGTTGAGAAATTCCATGCATATGCATTGAAAGGGGAGCGGCGGTCATCAGGAAATTCATCACCATATACGCAACCGCGCCGCTAAACACGGTCTTCATGAAACCCGGCTGCCGAACAATTTCCTTCAGAGAACGCCCTCCTGATTTGGCTGCCACGGCTGGCTCGGCAGGAATTACGCCCTTAAGAATGAAGGCTGAAATGGTTGCTACCAGAGCCTGAGCTATAAAGGTAATAACAAATGTGTGTGGTGGTAGAAGATTCATTGTTCCCGTCACCAGCATTGGCCCAATGACACCAGCTACCACACCGCCCCCCATTACCAGGGATAATGCACGCGCTCGCCTTTCGGATGTCACT [...]
+TTCATTGGTGTTCATTCATTAACAGTGACAGTATATTTAATGTAATAATTTTATATTTTAGGCGATATTATGGAATGGACTTCACTGAATATAGCGCACCATATCACCGCTCCGAATCCGTTAGCCATACGGAAAGAATTTATACCTGCAGCTCATTGTTTTCCTGAGCATAAGCATAAATGGCATCAGGTCGTTTATGCAACAGCAGGTGATTTAATGGTTAAAACAATTGAACAATCATTTTTGATTTCGCCGAAATTACAGGCTGTCTGGTTGCCTGCGGGAACTCAACATCAGGTCGGCTCATCACAAGGGGCTTATTTTAATAGCTTATGGATAGCTAACGATGCTCATAATCAATTTGACATGTCGGAACCTACCATTTTTGATGTTTCCCCATTCCTTAAGGCGCTTATCTTAGAAATATCAGACAGAAGAATAAATGATGAAGTTTATATAGAGAAACTAATACAGTTAATTTTATACCATCTG [...]
+NODE 197 10037 528922 525141 0 0
+GCCCGTCGCCAGTAAAGCCCATCATCAGCGCAGGGATACCCATTGGCAGGGTTTTATCCCGGTCGGTATGCCAGGTGTGCCAGGTCTTGCCATAAGTATTAACAATCTTACTCATCAACGCCTTATCAGCGACCTGCGGTAAGCCAGGCGCCACCAGGCTACCGGATTTCACCTCGTACTGGTGGCTGTGCCACAGTTTTTTCTCCTCGGGAGGAAGCGTTTTAAATAAACGTTCGCTGATAATGTACTCCACCCCCATCAGGCGCGCGTTTTTCGTGTTGCCGTCGTAAATCACCGCCTGCATGACATCTTCGTTCAGGACGGTAACGTAATGGTGCGCTTCCATCTGTCCGTTTTTATCACCGCTATAAAAATGGAACCCGTCAAGGTAGGTACTGATGGCATCGACAGGTGGTCTGGATTGAATGGCCGCCGCGCCTGTTTCCAGGGTACGTAATTTGGCAGAGGTTTTTTCCCCGGGAATAGGCGTTT [...]
+GGATATTAAAAACGCCAACGTCGTGATGGTGATGGGCGGCAATGCCGCAGAAGCGCATCCGGTGGGTTTCCGCTGGGCGATGGAAGCGAAAAACAATAACGATGCGACGCTGATTGTCGTTGATCCACGCTTTACGCGTACGGCGTCGGTGGCGGATATCTATGCGCCAATACGTTCCGGTACAGACATTACCTTTCTGTCCGGCGTTTTGCTGTACCTGATCGAAAATAACAAAATCAACGCTGAATACGTTAAGCATTACACCAACGCCAGCCTGCTGGTGCGGGATGATTTTGCCTTTGATGACGGTCTTTTCAGCGGCTATGACGCCCAAAAGCGTCAGTACGATAAATCCTCCTGGAACTACCAGTTCGATGAAAACGGCTATGCCAAACGTGATGAAACGTTGACGCACCCACGCTGTGTGTGGAATCTGCTGAAGCAGCACGTTTCGCGCTATACGCCGGACGTCGTGGAAAACATCTGCGGTAC [...]
+NODE 198 720 44168 44108 0 0
+CTAGCTGGTTTGCAGTACCTCACTACTTGGCGGTAGGATGACGGTGGTTAGTTCGAAGAAGTTGCGGAAAACTCAATAGAATACAAGCAATAAAGTGGATTCTTGCAGTGTCCCGGTATAATGATAGCTGCCTGAATCATTGGTATATTTAACAGCAGACCCTCGCTTTTTCGCTTAAAATCTGTTTTTTGTCACAAGCGGCAAGTGTTTAACATTTTCTCAGATTATAGATTAGCGTGCTAGCTAAAGATGTCGAGTGTGGGATGTGACATCTACTATATGAATTTAAAGTGAATTTTTATTTTTAGCAAGAACAGGAATCGAATTCGGTCTCTTTTTATTTCTATTGTAAATCAATTGTTTATGTGTTTCCCCTCGAAATTTCCTCAAATTTCTGTATTCCGGTCTTTTTGGTTAGATCACATCCAAATCCGAGTTAACATTTCTTTTACAGTAAAATCAGAGCATCACGTAAGCTTTATTATTGCGTTC [...]
+CACAAAGAAATTTGTAAAAGCCAGAAAAATTTCAAGTGTTAAATTCAGTGATAACCCACCGACATTTCACGAGATCCGTAGCCTGGCTGGTCGGCTGTACAAAGACGAATGCGGCGAGGAATTCGCTCAAAAACTCCTGGCCCACACCTCAGAGAACACCACGAAACCCTATCTCGATGAACGCAATAATAAAGCTTACGTGATGCTCTGATTTTACTGTAAAAGAAATGTTAACTCGGATTTGGATGTGATCTAACCAAAAAGACCGGAATACAGAAATTTGAGGAAATTTCGAGGGGAAACACATAAACAATTGATTTACAATAGAAATAAAAAGAGACCGAATTCGATTCCTGTTCTTGCTAAAAATAAAAATTCACTTTAAATTCATATAGTAGATGTCACATCCCACACTCGACATCTTTAGCTAGCACGCTAATCTATAATCTGAGAAAATGTTAAACACTTGCCGCTTGTGACAAAAAACAGATT [...]
+NODE 199 1201 83124 82167 0 0
+GCTAAATAGAGTGGTTAAAGAAAATAAACTGCTAATTGGATCTTCAGTTTTAATTTTATTCTTCATTGGTTGGTGGATTGTAAAAAGTAATGCAATTGCTAATAATCCCTACATAAACACTCATATTCCAAACGCACAATACTTCGTCTATTTGCCGTTTTTCTACATAGGCTATGTATTTAAAAAATTTGGATTCAAATCCTTGAGCAGCATAAATGCTATGCTGCCAGCGCTAATCGTCATAGTCCTTAGTTACATTGTAATACGGCCAACTATGTATTTATACGGAAGCATTGATCCGTATTGCTTTATCTTTTTATCGCTTATTAGCATTTCTCTCGTAATTGGTATTTCTTACCACATAAAATCTAACATACTCGTTAGATTTTTCACAACAATAGGCGAGAATACAGTACACATCCTCGCTATGCACTTCTTCTTTTTCAAGATAGCAACTCTTCTATTAACCATTGTAGGGCTCAAGCAAATTGA [...]
+AGGGGAATAGCTATTTTCATTCCGGTTTTAATCTGAGTTACGTGTAAGCGGTTGTCAAAAACATCATTAAATTTCATGTTTACGATATCCTCCCTACGTTGACCTGTAACGAGTGCTAAATCCATCGCGAGAGGGAACCATGAGGGCATATGCTCGTGTAGCATTATAAACCTCTATTCGCAAGCGCTCCCTTGCAACTTCAATTTTTGGTACCTTGGCTTTTTCAACCGGATTCAGTGTTATTCTTCCTTCTACAACAGCTTCACAAAACATGTCAGATAGTACAGACCTCGTCGCCCCCGCCATCGTGTTTTTACCTTCCGCGATCCATAGCTCAAGAAATTCTGCAACATGACGCGTGCTTACTTCTGCCAGAATCATTTCTCCTAATCCGGGCAGTCCGTTTACGGGCCGTAAGTAACGAAGCTTAATGTAAATGTTAGATCGTATGCGCCTGTTAGGGGCTGTGGGTAAGATAGCCTTACAGACGCA [...]
+NODE 200 4837 263459 261287 0 0
+TGGAAGGACTCTTCAGAAATAGTGCTTTGGATAGGTTGAACGGTAATGCCTTTGCCAGGCAGGTCGGCAGCGAAAGCGCTGGCGGTGACAAGGGTGGCAAACGCTGAGGCAAATATCACAGTATGTCGCATCGTTGTTCCTTTAATTATGGTAGGGAGTTGTAAGCCCGGTAAGCGCAGCGTCACCGGGCGTCAGGAGAGTTATTTAACGAAAGGGCGGGTGATTAGCCCAACAGGACCGGTGGTATACCAGCGACGGTTACCGCGGCTACGCGAGTCACGCCCGACGGCCTGCGTCAGACGGTCCAGAATGATGGCGAGAATCACAATGCCGACGCCGCCGACGGTTGCCAGCCCCATATCAAGACGACCAATGCCGCGTAGTACCATCTGACCAAGCCCGCCGACCGCAATCATCGAGGCGATGACGACCATCGAGAGAGCCAGCATCAGCGTCTGATTAACGCCTGCCATAATGGTGGGCATCGCCAGC [...]
+CATTAATATGAGTAATCTGTGCTCGGAAATTTTACAGGTCAATAGCGCTTCCCGTTACGACGATAACCTTGACTATACCCACATCGGGCATGACATCTCCTGCAATCTCGGCTCGCTGAATATCGCTCACGTCATGGATTCACCGGACATTGGCCGTACCGTAGAAACCGCTATTCGCGGCCTGACGGCGGTGTCGGACATGAGCCATATACGCAGCGTACCCTCAATAGCCGCCGGTAATGCCGCCTCTCATGCCATCGGTTTGGGCCAGATGAATCTGCATGGCTATCTGGCGAGAGAAGGCATTGCCTACGGTTCGCCGGAGGCGTTGGATTTCACCAATTTCTATTTTTACACCATTACCTGGCATGCCGTGCATACTTCAATGCGGCTGGCCCGCGAACGCGGCAAAACCTTCGCCGGATTTGCGCAGTCGCGTTATGCCAGCGGCGACTATTTTACGCAGTATTTACAGGACGACTGGCAACCGAA [...]
+NODE 201 3904 199209 198332 0 0
+TCAACACCCCGACCAATATCAGTCATGGAAAGCGACGTCAGAACAGTCTGCCCGTGAAGATGCGCTGGCGGAAGACCCTCGTCTGGTGATCCTGTGGGCGGGCTATCCCTTCTCCCGTGACTACAACAAACCACGCGGCCACGCGTATGCGGTAACTGACGTGCGCGAAACGCTGCGTACCGGCGCGCCAAAAACGGCGGAAGACGGCCCGCTGCCGATGGCCTGCTGGAGTTGTAAAAGCCCCGATGTCGCGCGCCTTATCCAACAAGAAGGCGAAGACGGCTACTTCCATGGCAAATGGGCGCGAGGCGGCCCGGAAATTGTCAACGATTTGGGCTGTGCCGACTGTCATAACACCGCGTCGGACGATTTCGCCCAGGGGAAGCCAGCATTAACGTTGTCGCGCCCCTATGCCGAACGGGCGATGGAGGCTATCGGCAAACCGTTTGATAAAGCCGGTCGCTTTGATCAGCAATCGATGGTCTGCGGCCA [...]
+AGTCCCCATGACAACTGACTATGGCTATGCTGCGCAACATAAACGACCGAAAAATCGCTGGTCAGAAAACAGCTAACCAGAATCGCAAACGCCAGTAGCAGCAGCGTGAACGCCGTCCACGCGCCGCAGGTCGTCAGGCGCATGACGCCGCGCCAGTGCAGCCCCATCCCGCACCACGTCGCCAGCGGGGTCAGCACGTTGACCCCGAGACTCAACAACAGCGCCAGAAATCCGGCTTCAGGAAGGAAGATGTCCAGATTATGCAACCGTTAGCTGTCCCGCATAAAGAATGAAAAAGCGCAGCAGCAGCACGCCGGTCAAACTGGCGCCGCAAACGGCCAGCACGCCGTGAAACGTGACGCTACGGTTAGCCCAGGGTTTCAGCAGCAGCGGGATAATCAATCCCAGCCCTACGACCCCAAGCCAGAACCACCAGCTCCAGAATCCGCCGCCCAGCGCCGCCGCCAGCGCGCGCATTTTGCCGTCATCGCC [...]
+NODE 202 3 167 167 0 0
+CGT
+TTC
+NODE 203 1078 67428 67428 0 0
+CAGGTATGGTGCCTGTGTCGAACCTTGTAGAGCCTCGATGATGGGCGTATTATAACCAACTAAAATAGTCAACTATTAGGCCATTACTATGATCCGTATTTCCGATGCTGCACAAGCGCACTTTGCCAAACTGTTGGCAAATCAGGAAGAAGGGACGCAAATCCGCGTATTTGTCATTAATCCCGGCACTCCTAACGCAGAGTGCGGTGTTTCTTATTGTCCGCCCGACGCCGTAGAAGCCACCGATACTGCACTGAAATTTGACCTGTTGACCGCTTATGTTGATGAACTGAGCGCGCCCTATCTGGAAGACGCGGAAATTGATTTCGTGACCGACCAGCTAGGTTCTCAACTCACATTGAAAGCGCCAAACGCGAAGATGCGCAAAGTGGCCGATGACGCGCCGCTGATGGAGCGCGTGGAATATGCTCTGCAATCGCAGATTAACCCGCAGTTGGCGGGCCACGGCGGTCGCGTCTCGCTGATGGAAAT [...]
+CTTTACTTTGTTATGGGTAACGTCATTGTTTCGACGACAAATTCCTGTTGTTCCCGACGGGAACAGAGTCGCAATAGCACCAATACTGATTACCGTTGAAACGAATGAGCGTAGTCAGATGTTATATGGATGTTAGGTGCCCATAAGAATGATACGGGTAACATGTGGGTGTTGAAAATGACCCTGGCAGGCAAAATTTAAATTATGAGACACAGGTCATGTTATCGGCGGAAGAAGAAGGACCATTGTTCTGAGATATGGCTGATAGCGCCGGATGGCGGCGTATACGCCTTATTCGGCCTACGGTGGGGCAGACAAGGCCCGACAGGCGCAAGCGCCATCGGGCATGGATGCGGGGAAAATCTTAGTAGTATGAGTGCTCGCCGCGCTGGTGTTCGGTCAGATCGCGAACCCCTTTCAGTTCCGGGAATTCATTCAGCAATTGTTTCTCGATCCCTTCTTTCAGCGTGACGTCAACCATCGAGCAACCGT [...]
+NODE 204 2554 168850 166343 0 0
+AGTAAACAAGGCTCCCAGTGTTTCCGAGCCATTAAGGCTGGCAAACAACAACATCTGCGGCGGCACGGCACTGCCGCTTACCGTAACGTTATGCACTCCCGGTCCGGAGATAAGGGATGACATTACGTCCTGTGCGGCACCAGCTATATCCGATATCCCTGCCGCCACAGCGGCGGCCTGCGCCGCTGCCACCGCGGCTTTTACCAGTCCTGATGGTTCCGGCAACTCGCCAAACAACAATTCCACTGCCTGTTCTGCCATTTGTTCGGCTGCGTCAGTAACGCTGGCTACGGCGGCACCTGAACTAACACCGTTATTTTCTCCGACAATTGGCGGCGTAGTGATAGCTGGCCCATCGCTCCCGACAGTTTTATTACCCGTGGATACAAAACTCATAATGGATCCTTCTGAAGAATGTAGTCATCTGCTAATAACAAATTTCTTTTTCAAGCTGAACACTATTTTCTGTATAGTTAACTGAAAGATAAAACG [...]
+CGAAAGTCAATATGGTACAGGTCGTATTGCCAGGGAATATAATAATTACTTTTCTCTCCAGGCTCCTGCATCATTTCAGTCAGGTCGGGTTCATCCAAAGGATAGTAACAAAACTTGGGTGGCTATTTTTTCTTCGTTTTCAGTTTGTGCGCGATCTTTTGCTGTCAAGTATGGTGACGCTGTTCGGGGGAAAAAAGATGCTCTGGCCTTCTCTGAAGCTCTGGTAGCTGCTGGGTTTAATTCAGGATCTCATATTACTGGTGGTACGGATAATTACGCCAGGATAACTGCTGGAATAATTATTATGGTCGGACGGAGAATAGCATGCCCCGTAAAATAATGCTTGTTTTTTTTCTCTTTATATCTGAGTTCTGTTATGCCCAAGTGGTTGTATCTGAATTTAATTTGTCAGATATAAATCGCGGTGGAATGACGAAAGCACAGGCAGAAAAACTACTCATTATTGCACTTAAATATCAAAAATATGATTTA [...]
+NODE 205 57 5097 4433 0 0
+GAAAGACGATGCGGCAGGTCAGGCGATTGCTAACCGTTTTACCGCGAACATCAAAGG
+GTCTTTCGCGCTGTTGATACGCAGACCGGAAGACAGACGCTCGATAGCGGTGCCCAG
+NODE 206 59 6706 6702 0 0
+CCTTCAGTGGTCTGCGCAATGGAGATACCGTCGTTAGCGTTACGGGAAGCCTGAGTCAG
+CACTGAAGGCGCGCTGAACGAAATCAACAACAACCTGCAGCGTGTGCGTGAACTGGCGG
+NODE 207 51 4436 3250 0 0
+ACCTTTGATGTTCGCGGTAAAACGGTTAGCAATCGCCTGACCTGCCGCATC
+TCTGACTCAGGCTTCCCGTAACGCTAACGACGGTATCTCCATTGCGCAGAC
+NODE 208 10767 554218 547304 0 0
+CCACGCCCATTTCAGTGATGAAAGCAGGAGACGAGTTCAATGTCGCATAATGAGAAATCCCCCCATCAGTCCCCCGTGCATGATACCCGTGAATCACAGCCCGGCCTGGACTCCCTGGCGCCGTCAGACGGTTCACATCGCCCCACGCCAGAACCGACGCCGCCGGGCGCGCAACCGACGGCCCCCGGCAGCTTAAAAGCGCCCGAGACCGCGAATGATAAGCTCACCGCCCTCGACGCCTTTCGTAAAGGCAGCGAAAATTATGCGCTGACCACCAATCAGGGCGTGCGCATCGCCGACGATCAAAATTCTCTTCGCGCCGGCAGCCGCGGCCCTACGCTGTTGGAAGATTTTATCCTGCGCGAAAAAATTACCCACTTTGACCATGAGCGTATCCCGGAGAGGATCGTTCACGCCCGCGGATCTGCAGCGCACGGCTATTTCCAGCCATATAAAGACCTGAGCGACATCACGAAAGCCGCGTTTCTGTGC [...]
+GGCCCACATCACGATATGATGTTTAAAAACCTGAACCTGACGGACGCACAGAAGCAACAAATTCGCGACATTATGAAAGCGCAGCGCGAGCAAATGAAACGTCCGCCGCTGGAAGAGCGTCGCGCCATGCATGATATTATTGCCAGCGATACCTTCGATAAAGCCAAAGCCGAAGCGCAAATTACGAAAATGGAAGCACAGCGCAAGGCCAATATGCTGGCGCATATGGAAACCCAGAATAAAATTTATAACGTTCTGACGCCGGAGCAGAAAAAGCAATATAACGCTAATTTTGAGAAGCGTCTGACAGAACGCCCGGCGCAAGAAGGTAAAATGCCTGCTGCGGCAGAATAACTTTCCGCATAATTTAAGACCGCCGGTCTTGTCGACAACACAATCGTTGAGGTGGACAGGATCGGCGGTTTTCTTTATGACTGGCGACAGTCGGTGTGCAGTTCAATGATCTCATATTGACCTGACATTAGTGGCTTA [...]
+NODE 209 14413 728766 719728 0 0
+GCCGCCGGGAAAGTAGAGCTGCGCGAAGCTCACGCAGCCCATACGACGGCTTTCAACCAGCCTGGGTTCGAAGTTTTCGCCAATGACCAGCTCTGTTGACCCGCCGCCGATATCGATCACCAGCTTGCGGCCTTTTTCCGGCTGCGTATGTTCTACGCCCATAAAAATCAGGCGCGCTTCTTCGTTACCGGAAATAATCTCTATCGGGTAGGGAATAACCTTTTCCGCACGTTTGAGAAAATCAGCGGCATTTTGCGCCTGACGTAACGTATGGGTGCCTACGATACAGACGCTGGAAGGGGAGAAACCTTGTAAGCGTTCAGCAAACAACGACAGACAGCTAAGCCCACGTTCCATGGCTTCTTCGCTGAGGTTGTTATCTGCGCCCAGCCCGTCCGCCAGATGGACGCGCTGTTTTAAGCGCCCGATAATCTGCATTGCGCCGTCAACCACGCGGGCAATGACCATATGAAAGCTGTTTGAGCCGAGATC [...]
+CTGATAAATATGTCGGCCCCAGTTTTCCAGCGCCGCGTCCAGGGTATTCACCATTTCCGCTGTCGCCCCTTTTTGTGGGCCAAAAATGGCCGATGCGCCCTGGGGACCACACAGCGGATTGTTGACATCGCACGCCACGGTTATCGATACCTTACGCAGCAATGGGTGACAACCGGACAGATCGATAGAGGCCAGCGCCGCCAGCGCCTCGCCGCCCGGAGAAAGCGAGCGCCCCTGTTTATCGCGCAATATAACGCCAAGCGCCTGCATCATCCCCGCGCCGCCGTCATTCGTCGCGCTGCCGCCAATTCCCAGAATAATACGCTTTACGCCACGCTCCAGCGCCGCGACGATTAACTCGCCGGTGCCGTAGCTGGTGGTATTAAGCGGGTTGCGCAATTCAGGCGAAACGTGATGCAGCCCGGATGCCGCCGCCATTTCAATCACGGCGGTATCGCTATCGCCCAGCATTCCCCAGCGCGCGGCCACCGG [...]
+NODE 210 6753 374712 369119 0 0
+AAGATTTCCGTGCCCGTATCGATAACATTAAAGAGTGGTTAGGCGACGGCGTTATTGCCGATTACGATGATGACGATATCGCGCAATTATTGGCCGATGTCGACGTACCCATTGTCGGGGTCGGCGGTTCTTACCATCTTGCTGAAAATTATCCTGCCGTTCATTACATCGCCACCGATAATCATGCGCTCGTTGAAAGCGCTTTCCTGCATTTAAAAGAAAAAGGCGTTAACCGCTTCGCGTTTTACGGTTTGCCCGACTCCAGCCGCAAACATTGGGCGGCGGAACGGGAATACGCCTTTCGCCAGCTGGTCGCCGAGGAAAAATACCGCGGCGTAGTCTATCAGGGGCTGGAAACCGCGCCGGAAAACTGGCAGCACGCGCAAAATCGCCTCGCCGACTGGCTTCAGACGCTGCCGCCGCAAACCGGCATCATTGCCGTAACGGATGCCCGCGCCCGTCACGTATTGCAGGCCTGTGAACACCTGCATA [...]
+GCTGTACTGCTCGGCGATGGGGAAAATTTATATGGCGTTTGGTCAGCCGGATTATGTGGCGTCTTACTGGGAAAGCCATAAAGATCAGATCCAGCCGCTGACTCGCAACACCATTACCGATTTACCAGCAATGTACGATGAGCTGGCGCAAATTCGTGAAACCAGCATGGCGATGGACCGCGAAGAAAATGAACTGGGCGTCTCCTGTATTGCCGTGCCTGTGTTTGATATTCACCATCGGGTGCCTTACGCCATTTCTATTTCACTGTCGACGTCACGGCTAAAACAGATCGGCGAGAAAAATCTGCTCAAACCGTTGCGTGAAACCGCACAGGCTATCTCTAATGAGCTGGGATTTACCGTTCGCGAATAAGACAGCTCGCCAGGTTTTATCAGGCATCTGACAAAATTTGTCCGTTTGCGTAGTGGGATCAAAGCGGCGGGGAATGGCTCTCTGGCATTCTGGCGTTTTAACGCAGGGGGAGAACAATG [...]
+NODE 211 692 40241 39615 0 0
+GGAGCAGGTTGCGACCGAGAAAGCGGAACTCGCAAAACTGAAAGATCTGCCGGCAATCACGCTGGATGGACATCAGGTCGAAGTTTGCGCCAACATCGGTACCGTTCGCGACGTTGAAGGCGCTGAGCGTAACGGCGCGGAAGGCGTTGGTCTGTATCGTACTGAATTCCTGTTCATGGATCGCGACGCGCTGCCGACGGAAGAAGAGCAGTTTGCCGCCTATAAAGCGGTCGCTGAAGCGTGCGGCTCGCAGGCGGTTATCGTCCGTACCATGGACATTGGCGGCGACAAAGAGCTGCCGTACATGAACTTCCCGAAAGAAGAGAACCCGTTCCTGGGCTGGCGCGCCGTGCGTATCGCCATGGATCGCAAAGAGATCCTGCGTGACCAGGTTCGCGCGATTCTGCGTGCCTCCGCTTTCGGTAAATTGCGCATTATGTTCCCGATGATCATCTCTGTTGAAGAAGTTCGCGCGCTGCGCAAAGAGATTGA [...]
+GTTAAATCATTGGTGCCGATACTAAAGAAATCAACTTCTTTGGCTAAATGACGCGCAATTGTCGCCGCAGCCGGTGTTTCCACCATCACGCCAATCTCAATGCTTTCGTCAAATGCTTTACCTTCGTCACGCAGTTCCTGTTTGTAGATTTCAATCTCTTTGCGCAGCGCGCGAACTTCTTCAACAGAGATGATCATCGGGAACATAATGCGCAATTTACCGAAAGCGGAGGCACGCAGAATCGCGCGAACCTGGTCACGCAGGATCTCTTTGCGATCCATGGCGATACGCACGGCGCGCCAGCCCAGGAACGGGTTCTCTTCTTTCGGGAAGTTCATGTACGGCAGCTCTTTGTCGCCGCCAATGTCCATGGTACGGACGATAACCGCCTGCGAGCCGCACGCTTCAGCGACCGCTTTATAGGCGGCAAACTGCTCTTCTTCCGTCGGCAGCGCGTCGCGATCCATGAACAGGAATTCAGTACGATACAGA [...]
+NODE 212 45 2668 2319 0 0
+ACCAGCCAATGTCACCGTCCGTACTGAACTTGATCAAGCAAGTTA
+TGTGAAATCATATCATTACCACGGTCAACTGCCAGGGTGTACTGC
+NODE 213 2157 119002 118722 0 0
+AAACGACAGCCCCGATTGAATTTTCAATTAATTGTCTGATTTTAAATAATTTTATCCATCACGCTTGCGATGGATAAAAATCCTCTGCGATAAATTTTTGTTATATTGATCACGTTCTAACCACAAGAGAGGTGATTTGAAAATAACCTTAAAATATTGTGGTCAGGCCGCTAGACCACAATAAGAGGATTAATCATGAAAAGAAAAACAATGGGATGGCTTATCGTTTTTCTTCTATTTATAGTTTACATGCTCAACTATATGGATCGTTCAGCATTGTCGATAACTGCCCCCTTGATCGAAAAGGAGTTAGGATTTAACGCCGCGGAGATGGGAATGATCTTCAGCGCATTTTTTATCGGATACGCCCTGTTTAATTTTATTGGTGGCTGGGCCAGCGATAAAGTTGGGCCAAAAACGGTTTTTCTCATCGCAGCGTTACTATGGTCTGTATTTTGTGGCTTAACTGGTTTAGTCACCGGATTGTGGACA [...]
+ATCGTCAGCGGCGTTCAGCACATAAGGAACGCCAAGCTTTTGCGCATAGCGTAGCCTTTCCTCCACAATATCGATCAGAATAGGCGTTGCCTTGTAATGACGCGCGCTTAATGCCGCCATAAGACCAATGGCCCCCGCGCCGATGATGGCAACATATTCCCCGGCCTTAACGTTTGCCCGGTGCAGCGCGTGCAGTGCGATGGTCAGCGGTTCTGCCAGCGGCGCCATTTCAGAAGGTACATTATCTGGTATTTTATGAATTAAATGTGCGGGATGAGTAACCACCTCCTGCATTGCGCCATCGACATGCACGCCAATGACGTTTAAATTTTCACAACAGTTAGTTCTGCCGACAGAGCAAGGGTAGCAGTGACCACAATAAATATAAGGGTCAACAATCACGCGGTCGCCTTTTTTAATATTGTCTGGCATTCCGGCGCCTTCCTGAAGAACAATTCCGGTCACTTCATGCCCAATAATTCTTGGGTAAGT [...]
+NODE 214 3703 196687 189958 0 0
+GTTGACCGTATCGTCGGGCTGGAAATCGGCGCCGATGACTACATTCCTAAACCGTTTAACCCGCGCGAGCTGTTGGCGCGTATCCGCGCCGTGCTACGTCGTCAGGCAAACGAACTGCCCGGCGCGCCGTCGCAGGAAGAGGCCGTTATCGCGTTCGGTAAGTTTAAACTGAACCTCGGTACGCGCGAGATGTTCCGTGAAGATGAACCGATGCCGCTGACCAGCGGGGAGTTTGCGGTACTGAAAGCGTTAGTCAGCCATCCGCGCGAGCCGCTCTCTCGCGATAAGCTGATGAATCTGGCCCGTGGCCGCGAGTATTCCGCGATGGAACGCTCCATCGACGTCCAGATCTCCCGCCTGCGCCGTATGGTGGAAGAAGATCCGGCACATCCGCGTTATATTCAGACCGTATGGGGCCTGGGCTACGTCTTCGTACCGGACGGTTCTAAAGCATGAGGCGAATGCGCTTCTCGCCGCGAAGTTCATTTGCCC [...]
+GCCATAATAACCGCCGCTGCGTGACAGGAGTCACAGTGTTTTTCGTCAATCGTGATTTTGTCCAGATACGTAAATCTATGAGCCTTGTCGCGGTTAACCAACCTCAAAAAACCTTACTATTTTCGGTAATATATATTGGCTAAGGAGCAGTGATATGCGCGTTAACAATTTAACCCCGCAAGATCTCAAGGCTTATGGTATCAACGACGTCCAGGATATCGTTTACAATCCCAGCTACGACACCCTTTATCAGGAAGAACTTAATCCTGGTCTGGAAGGCTATGAGCGTGGCGTGTTAACTAACCTGGGCGCTGTTGCCGTTGATACCGGTATTTTTACCGGTCGTTCGCCTAAGGATAAGTATATTGTTCGCGACGACACCACGCGTGATACGCTGTGGTGGTCCGATAAGGGTAAAGGTAAAAACGATAATAAGCCGCTTTCCCAGGAAACCTGGCAACACCTGAAAGGTCTGGTGACGCATCAGCTTTC [...]
+NODE 215 14847 800970 795771 0 0
+CAGCGCCGGGCGTCCTTCCATAACTCCCAGCGCCTGTGCGGCCTGCGCAGGCATGGCGGTGGGGTAGAACGACAGATGCATGCTGGTATAGACGAGGTTGTAGTGCGACTCGTATACCTCGGTCAGGCTGCCGTTGAGATCGTACTGCAGCAGCTCAGGCACGCGGGCGGGCAAACAATGGTTTTCGCAGTAGCACACGGCGCGGCCATCGGCGTAACGCAGACGGGTCAGCAGATAGATTTGATCAAACGGCTGGAGCTGGAGGGGCTCCATGACCTCGACAGGCACGGTGGTTAACACGCCGCTCAGTAGCGCGGTTTTTGGCTCCCGCCCCTGCTCGCGGCAAAGCTTATGGAAGTTGGTGTTCTGGGTCGGATCCAGCCACAGGCGTTCCGGCGTAACGAACCAGCCGCGACGATCGGCGCGCCAGATAAGCCCACTGGACTCCAGCTGCGCCAGACTTTCGCGAATAGTAATGCGCGTGGTGTTGAA [...]
+AGTGTCTTAAAGTTATTTCGACATACTTGGCAACATATGTGACATGCGCGGCAGAACTTGGTAACACAGAACCAATCATGTTTACAGTAATGTAACCTTACCGTAAAATGCCCCTACACTTTAAACGCCACCAGGTCCCGTGGAATTGAGGTCGTTAAATGAGACTCAGGAAATACAATAAAAGTTTGGGATGGTTGTCATTAATTGCAGGCACTGCATTACTCAGTGGCTGTAATTCTGCGCTGCTGGATCCCAAAGGACAGATTGGACTGGAGCAACGTTCGCTGATACTGACGGCATTTGGCCTGATGTTGATCGTCGTTATTCCCGCCATCTTGATGGCTGTTGGTTTTGCCTGGAAGTATCGTGCGAGTAATAAGGATGCGAAGTATAGCCCGAACTGGTCACACTCCAATAAAGTGGAAGCCGTGGTCTGGACGGTGCCTATCTTAATCATCATTTTCCTTGCCGTACTGACCTGGAAAACCACGC [...]
+NODE 216 6030 303112 298430 0 0
+CAGGTGGCTGAATAAATTATTCTCCTGAAACAGCATTGAGACCGGACGGCGTGAGGGCGGCGTAAGCGTATGATCTTCACCGGCAATCAGTAACGTACCGCTGGCAGGCGCAAGAAAACCGGCAATTAAATTCAACAACGTGCTTTTCCCCGCGCCGCTGGGGCCAAGAATCGCCACCTGCTCGCCGCGTTCTACCGCCAGCGTAAAACGCATCGGCAAATGATGGTAAAGCCAGGTGATATCAATCAGTTTTAGCATGTCGGCCCGGTAGTTTCTCTATGAGGGTAAATAACGTAAAGCAGAGCAGCAGCAGTATCAGCGCGGTCACCGCGCCGTCCTGGCTGCGGTAGGAGCCGATCTGCTGATACAGATAAAACGGCAGCGTGCGGAAATTGTCATTGCCGAAAAGCGCGACGACGCCAAAATCACCGATAGAAAGTACGCAGGCAAACGCCAGCGCCTGCGCCAGCGGACGTTTCAGCGCCCGCAGTT [...]
+TATCGAAGCAGGATTTGAATGGCGCTTACCGGGCTGTTCCATGTGCCTGGCCATGAATAATGACCGCCTGAACCCGGGCGAGCGCTGCGCCTCCACCAGCAACCGTAACTTTGAAGGTCGTCAGGGCCGCGGGGGTCGCACGCATTTAGTCAGCCCGGCGATGGCCGCCGCTGCCGCCGTTACCGGCCACTTCGCCGATATTCGCAGCATCAAATAAGGAAACTACCATGGCAGAGAAATTTACCCAGCATACCGGCCTGGTTGTCCCACTGGATGCCGCCAACGTCGATACCGATGCAATTATCCCTAAACAGTTTTTGCAGAAGGTTACGCGCACCGGTTTTGGCGCCCATCTGTTTAACGACTGGCGCTTCCTGGACGAAAAGGGCCAACAGCCAAATCCGGAATTCGTGTTGAACTTTCCGGAATATCAAGGCGCGTCGATACTGTTGGCGCGGGAAAACTTTGGCTGCGGCTCGTCACGCGAGCACG [...]
+NODE 217 5267 267349 263265 0 0
+TGGCTGCTGGGATTCGCCGCGTTTACCCCCTACGAGATTGAAAATGGAGTCAAGCTTCTGCGGGCTGCATTATGCGCCGAAAACGCCCGCCAAGCCGGGTCATAATCTCATAAGGGATGGTATCGCAGGCGGCGGCAACCTCTTCCAGCGTCTGGCTCACGCCAATAAACTCCACAACATCGCCAGGCGTTGGCATGATGGCGCTGGCGTCCACCATAAAGCTGTCCATGCAAACCCGCCCCAATACCGGTAACCGAACCCCGCGCCAGCACACGCCCGCCGGAGGACGCAAATTACGTGGAATCCCATCAGCGTATCCGGCGGATACCGTGGCGATACGCAGCGGGCGAGTAGTAGTAACCGTACTGCCGTAGCCAATCGGCGTCCCAACTGGCACGTCTTGCACACGCAGAATGCTCAGCGTCAGCGTAAATGCCGGTTTTAACGGCGTTGAAAACCACGGCTGGGCGACGCCGAACAGCGCAACGCCCG [...]
+GCCTAACAGTTGCCACTCTGCGCGGCAATCGTCATCGTTTATCTCTTCCTCAACGAACCACAGCGAGGAGAGACGCTGGCGAAACCGCTCCGCCCATGCCGTAATGACCGCGCCGCGCAAAAAACACTCATGGGCAATGATGTGTGTCGTGACATCAGGAAAACGGTTTTTCAGCACCCGAAAATGACCATGCGCCGTAATGACCGGGCGAAGTATTGTCCCTTGCGCGTTCCGTTTAAGCGCCGCCGGGCCATACTGAATCTCATCGAACTGGCTGCGCTGTAAAAATTGCCGTTCTTTAGTGGCGATACGGTGAATAATATCGCCATTCTCACCCTCGGGCGGCGCAATTCCTTTCCAGTGGTAATGCAAACTCTTTCCGGCAGAAAGTAACGTGAAATTGCTGGAAAGGTGAAGAATATTGCCGCGAACAGCGTCAAAACTGAATAAAAAATACAATTGCTGGAAGGCATTCGCTCCCTGAAACGGTAC [...]
+NODE 218 7364 376229 368366 0 0
+CTGTCCCGCGTGGTGCTGAGTACCGGCGCGCGCCGCCATTTGCTCAACTATGGCTGGCCGGGCAACGTCCGGGAGCTGGAACATGCCATTCACCGTGCGGTTGTACTGGCGAGAGCGACCCGGGCAGGGGATGAGGTGATACTGGAGGCACAGCATTTTGCCTTGTCAGAGGACGTTTTACCCGCGCCGCCTGCGGAAAGCTTTCTGGCGCTGCCGACTTGCCGCAATTTGCGCGAATCGACGGAGAACTTCCAGCGAGAGATGATTCGCCAGGCGCTGGCGCAAAATAATCATAACTGGGCGGCCAGCGCGCGGGCGCTGGAAACCGACGTCGCCAACCTGCACCGGCTGGCGAAACGTCTGGGACTGAAGGATTAGATAATCCCCGCCTGGTAGAAATCCTGCAGGTTAATGGCGCCGGTGAGTTTGCCGTTTTCATCGACCACTGGCGCGGCGGTAATTTTGCGTTTCATCAGGAGCTCTTTGGCGTCA [...]
+TCGCCCCGCGCGCTTTTAACGCCAGCCCGACCTGCTCGCTAAGCCGCATCAGTTCACTGTCAGTCATCATGACCTCTGTCAGTTAGAAATCCTGCCGCACAAGATAGCACTTTCTCACCAGAGATGGGGACGAGCAGTCGATTTTACGAGTCGGATTCCGAAAAAATGCCAGCAGGTTATTTATGCAGAATGAAATGAGGTAACACATGACTAAATAGCAGTACCATGTCGCTAAATTTACACGCACGGAGAGAAAGCAAGGATGTCACTCAAAAAAACGGAAAGCACACAGCACAAACTGAAACAAACCTGTCAACTACGGCTGTGGTTAATTGTGGGTGGAGTATGTTCATTAGGAATGGGAGTACTGAATATATTGTCGTCAGGCTATTTTGAACCGTATGATGGCGGTCAAATTATCTTAGGCCTGGGATGTCTGGGATATAGTCTGGCACTATCAAAGAAGATATCCCACTTGCAGGCAGAGAATCA [...]
+NODE 219 8383 481750 477156 0 0
+CCAAATGTGACTTTAAATTTATCCCATAAATCTAAGTTATTAAAGTCTATTGGCTCGCCATTATAAAATGCCTGCTGTTCATACATTAAATGATAAACCTGTTTTATTGATTGTTTACGCGGGACATTTTAAATCATTAAATGAAGGATTTAATTCCATTAAGGTCTTTGTTTGCTCTTATTACAGGAATTATAAATATGATGCCATTTCTGGAATAAAAGTAAAGTTAATACATTATTTATTTAATTGCTCACTGGTAGGGTATTTATGTATCCTCCGGTTAATGCTTAGTTTAGCAGCTTTTAGCTGACAGCGATTGCAACGCTAAAAAACATGTGCTAATAATCATCATGTAAAATATGTAATGAAGTAAGTATGGAGCATTTAATTGTTATGATCCCACCATTAAATAGATATGTTCCCGCGCTTTCAAAAAATGAATTGGTTAAAACTGTTACCAACAGGGACATTCAGTTTACAAGTTTTAATGGA [...]
+CAACAATAATGCAGGGGGCGATTTGCGGGTAGTAACGCTCGCGGCAATGGCTGCACAGCATCGCCCATTCGGTTTTACTCGGGTGCATAGGGTGCCCGCAATAGCCGCAAAATTTATGCGACCGATAAAACTCCGCCAACTGTACGCCACGTCCCGCCAGTTGGAACAACCCGGCATCCTGATCGATAATCTGGCGAACCGATCCCATATCATGGCGTCGATGCTGTAACACCAGCCAGACGGGCTCGCCTTGCCATTCACCTATCCGGAGTGCGCGCTGCCCCACAAGATCGAAATTTGCCGCCAGCCCGTGTGGTAATTCCCCATACGGCAACCATAATTTTTGTTCATGGCTGACGATCCACCAGCCACTCTCTAATTTTTCAATTATACGATCCATAGCTCTTGCACTACCTTTGCTTCACTGGCATGTTGTTAACATTATTTTTACATTCATGGCGAGCAGCCTTTATCTAACTTGCGGAGACAATC [...]
+NODE 220 6394 319405 315061 0 0
+TCTGAGACGCGCTAACCGGTTCTGCGGCAAAAGTGCCAAAAGAAAGGGTGGAAAGCGCGATGGCTGCAACAGCATATTTAATGGTTTTCATGATTAATCTCTCGCAGGTTATTCTGTTTATGGGACGATGTTCCGTCGATGTGATGAGTATCACGGTTTTTTGCGAAAGATAAAATCGAATAGAATTGACTGCCTTGCTCAAAATTTTTGAATGACAAATAACCTATTGATTATTAATTAATTCAACGGTTGAATTTACCTTTCTTGTCATCTGGCTTTACAGAGTCGAGGTTAACGGCACATTCTGCGACGCAGAACGCTAAAAAGCATGAGCGTAAAGGAATGGATAATACTGGCGGTTTCGGTAAAGAAAAGTCAGCGTAACTGGCTGTCTTTTGAACCTCTACGATTATATCCTGAAAATGTTGCGTTATGTAAATCTTTCTCCTGTTGGCAGGCTATGCATAACCGAACGCCCGGCACGGCTTTACG [...]
+CCCTGGCTTTTGCGGTGTCTTCGCACGCTGCGGATAAGAAACTCGTGGTGGCAACCGATACGGCGTTCGTTCCGTTTGAATTTAAACAGGGCGACAAATACGTCGGTTTTGATGTTGATCTGTGGGACGCTATCGCGAAAGAACTGAAGCTGGACTACACCCTGAAACCGATGGATTTCAGCGGCATTATTCCGGCATTACAAACCAAAAATATCGATCTGGCGCTGGCGGGTATTACGATTACGGACGAGCGTAAAAAAGCGATCGACTTTTCCGATGGCTATTACAAAAGCGGTCTGCTCGTGATGGTGAAAGCCAACAATAACGATATTAAAAGCGTTAAAGACCTCGATGGCAAAGTCGTTGCCGTGAAGAGCGGAACCGGGTCGGTGGATTACGCGAAAGCGAATATCAAAACCAAAGACCTGCGTCAGTTCCCGAACATTGATAACGCGTACATGGAATTAGGCACCAACCGCGCAGACGCCGTTC [...]
+NODE 221 10753 600117 593266 0 0
+CTCAAGTGCCTGGTATTTACCCAAAACGCCATTAAACCGCCAGTTTTTCGAGCGTTTCAAAGCCATAACGCTGTAAAACGGGTAATAATTGTTCAGCTCCTGGCGTCATTGCCATGCAATAAGCAATATTGGCATCGGTTGATTTCGCATCCGGCGCTTCATGTTCCAACAGCCAGGCTGTACGACGCGCTATCGCCGCGCCGGAATCCACTAACCGCGTCCCTTCGGGCAGGACTTGCAAAAGCTCGTCCCGTAATAGAGGGAAATGCGTACACCCCAGAACGACCGTGTCAGGCGGCTCCGGCATTCGTAGCCATGGGCGTAATATGCGGCGCAGTTCTTCCAGCGATACCGAATCGCCATGTAATTTAGCTTCCGCCAGTTCCACCAGTTCTGCCGACCCCAACATCGCTATCTGACATTCATTAGCGAAGCGCGCAATCAGCTCGTGAGTATAAGGACGTTTGACCGTGGCTCTCGTCGCCAGTAGCC [...]
+CGGGGCGCAAAGCGGCAATATCGAACAGTTTCTGTGAAGTGAGTTTGCAACCGTATGGCGTGTTTACGCATCGTCATCAGCCGGAAATCGCCGTCCATCTGGGCGCGGAGGTCATCTTCACCCCGCATCTGGGGAATTTCCCGCGCGGGATTCTGGAAACCATTACCTGCCGCCTGAAAGCGGGAGTAACCCATGCGCAGATCGCCGACGTGTTGCAAAAAGCCTATGGCGACAAACCGCTGGTGCGCCTGTATGACAAAGGCGTTCCGGCGTTAAAGAACGTCGTCGGGCTGCCGTTCTGCGATATTGGTTTTGCCGTCCAGGGCGAACATCTGATTGTGGTGGCAACCGAAGACAACTTGTTGAAAGGCGCAGCGGCGCAGGCGGTGCAGTGCGCTAATATTCGTTTTGGCTTCGCTGAAACGCAGTCTCTTATTTAAGGGTGAAATGATGAATCCATTAATTATCAAGCTGGGTGGCGTATTACTGGAT [...]
+NODE 222 2722 145519 142311 0 0
+CGACAGGCGTCGTCGAGGCTTGCGCTGGCTTCGCGGTTTGTACCGGCGCAGCGCTTGCCGTCGCTGTCGGCGCAGCCGTCGTGGTGGTCGCTTTCGGCGTCGCGGCTGGCGCTGCCGGTTCCGTGCGTTTCACTGGCGCGACCGGTTTCTTCGGTTCCGCAGTCGTGGTTTTCGCCGTGGTCTGCGGTTTCTTAGGTTCAATGACGGCCTGTTTACGTTCCGGACGCGTGGTATGACGCTCGGCAGGTTCGCTAACCGCCGCCTGACGCGTCGTGCTGCCATTGCGAACTGGCGCGACGGTTGCAGGCTCTGTCGGCAACGTAGAGTTCACCGCAACATTGTTCATCTGCTCTGGATTCTGCGTCAGCGCATTATTCAGATCGCCCTGCACTTCCACGCGCTGCTGACCGTCAGCGACCACAGGCGACTGTCCCTGCGTCGGCGTTGAAGAAATCGGCGGCAACGAAATATCCTGCGACGTATTGCCCGCGG [...]
+CCAGTTAGCTCAACAACTCAATATGGAATTTTACGATTCTGATCAAGAGATTGAGAAACGAACCGGAGCTGATGTGGGCTGGGTCTTCGATGTTGAAGGTGAAGACGGCTTCCGTAATCGTGAAGAAAAAGTTATCAACGAATTGACGGAAAAACAGGGTATTGTGCTGGCAACCGGCGGTGGCTCTGTAAAATCGCGTGAAACGCGTAACCGTCTCTCCGCGCGTGGCGTCGTGGTCTACCTTGAAACGACCATCGAAAAACAACTGGCGCGCACGCAGCGTGATAAAAAACGCCCGCTGTTGCAGGTTGAAGCACCGCCTCGCGAAGTTCTGGAAGCGCTGGCTAACGAACGCAATCCGCTGTACGAAGAGATTGCCGACGTCACCATTCGCACCGACGATCAAAGCGCTAAGGTTGTGGCAAACCAGATTATTCATATGCTGGAAAGCAACTAATTCAAGCAGAATACGCTGGGTAAGCGGGCACAAGT [...]
+NODE 223 1374 68171 67528 0 0
+CACAATGACGACCGGACGCAGAGAAGGACAAAGCGTTTTGAACCCCTTATCATTTTCGCTGGAGTAAGATTCGCGCATTACCCGGCGCAGGACATCTTCAATGAGATCGGGCGGGACACCGATCGCTTCTGCTTCCGCCCGTCGTGAAGCCAGCATAGAGGCCTCACGCTCTGGCACGTAAATAGGCAGGCCAAAACGGCTTTTCACCTCGCCGACTTTGGCAACCAGTTCCAGGCGCTTAGCCAGTAAATTCAACAACGCTTTATCGACATCATCTATTTGATCGCGTAATGCGGTCAATTCAGCAACCATAACAACCTCTTATGCGACGCGCACCGCCAGCTGGCCGCTCAAATCTTTATGAATTTCACGCAACAGGGCATCGGTCATCTCCCAGCTAATACAAGCATCGGTGACGGAAACGCCATACTTCATTTCGCTGCGCGGCTGTTCGGAAGACTGATTACCCTCATGAATATTACTTTCAATCAT [...]
+TAAAGCGGCCTTTCCGTTGAGTCTGGCGCAGGAAGCGCAGATAGCGCAGTCCCGGGGAATCATTTCTGACATTATTGCCGGGCGCGATCCGCGTCTGTTGGTGGTATGCGGTCCTTGTTCTATTCACGATCCTGAAACCGCTCTGGAATATGCCCGTCGATTTAAAGCCCTTGCCGCAGAGGTCAGCGATAGCCTCTATCTGGTAATGCGCGTCTATTTTGAAAAGCCGCGGACTACCGTCGGCTGGAAAGGGCTGATTAACGATCCTCACATGGATGGCTCATTTGATGTGGAAGCCGGGTTGAAAATAGCGCGTCAGCTACTGGTGGAACTGGTGAATATGGGGTTGCCATTGGCGACCGAAGCGTTGGATCCGAATAGCCCGCAATACCTGGGCGATCTGTTTAGCTGGTCGGCGATAGGCGCGCGCACAACCGAATCGCAAACCCACCGCGAAATGGCGTCTGGTCTTTCTATGCCGGTCGGCTTTAA [...]
+NODE 224 9020 465235 461224 0 0
+GAATCACTACCACGGAGGCGCATTCTAGTGGTTTTCAGCTATTCGTCAATAGTTAATTGCATGGGATAGATTGATTGCTGCAAAAATGGGCGCGAGACGTAGGTTGGATAAGACGCTTTGCGTCGCCATCCGGCACATGCAACCAGATGGCGCTGCGCTTATCAGGCCAACTATTTCTTCGCCTGACGGGTCATCACGGTACGATAAACCTTAAAGCGCCCGGTTTGCGCGATGACTTCATGGAAGCCAAAAGTCTCATCCAGAATCTTAGGATAGGGCAGAAAGGCGTTCGCCACGATGCGTAACTCCCCGCCGCTGTTGAGATGACGTACCGCGCCGCGAATGAGCGTTTGCGCCGCATCGAGGCTGGTTTGCATTCCGTCGTGGAACGGCGGGTTGGAGATGATCATGTCAAAACGTCCTTTGACTTCCGAAAAGACGTTGCTGGCGAATACCTCGCCTTCAAGACCATTAGCGGCAAGCGTAGCGCGG [...]
+ATGCCTTTTACCATGCCGGGATCAGCGACATTCTGACGCTGGACGAAACCATCAAGCGTAATCCGCAGGCGCTGGTTCAGCTTTGTCTTGGCGCGTTCAAAGCCGGGATGCGTGAATTTACCGCCAATGTCAGCGGCAACGATCTGGTGCGCGTCACCGGCTATATGGTGCGCCTGTCGGATCTGGCGAAATTTCGCGCCGAAGGCTCGCGCACGAATACCACCTGGCTGGGAGAAGAAGCCGCACGTAATACCCGCATCCTGGAACGACAGCCACGCGTAGTCAGCCATGAACAACAGATGCGCTTTAGTCAGTAAGATCATTGCGTTTTCCTGCGTCGATGGGCCAGGCAGCCGCCTGGCATTATTCTTACAGGGCTGCAATTTGCGCTGCAAGAATTGCCATAACCCGTGGACGATGGGACGCTGTAACGACTGCGGGGAATGCGTATCGCAGTGTCCGCACCACGCCCTCAGCGTTGATGGCGGGAAA [...]
+NODE 225 25075 1761650 1744970 0 0
+GGGCAGCGCAAGTCAATCCTGGCGGATTCACTACCCCTGCGCGAAGGCCATCGGTGCCGCATCGAACGGCCGGTTGCGGAAAGTCCTCCCTGCGTCCGCTGATGGCCGGCAGCAGCCCGTCGTTGCCTGATGGATCCAACCCCTCCGCTGCTATAGTGCAGTCGGCTTCTGACGTTCAGTGCAGCCGTCTTCTGAAAACGACACAAGTTGATTGGAATTTAATCTATATACATGTTAAAATACTTGTATAAAATTCTATGTTAAAAAAACGTACATGAATCAAAAAATTGGCTACGCTAGGGTTTCAACCGACGATCAGAACCTGCATTTGCAGAGAGATGCGTTGGCTGCTGCTGGTTGCGAGATCATTTACGAGGACAAGGCCAGTGGGAAGAATGCCGCTAGACCCGAACTTGATAACTGCTTAAAGGCTCTTAGACCTGGGGATACGTTGGTCGTTTGGAGGCTGGATAGGTTAGGCCGTAGTTTGGC [...]
+CGTTTTGCTAATTATTGATCCACATTTGCTCCCGAGTTAAAATTTTGGAGTAACGGGAGCAAAGCGGAGCAATTATGAAGGTATCAGTAAACAAGCGTAACCCTAACTCGAAGGGGCTCCAGCAACTTAGGCTAGTGTACTATTACGGAGTTGTTGAAGGTGAGGATGGCAAAAAACGAGCAAAGCGCGACTACGAACCTTTAGAACTCTATCTCTACGAGAACCCAAAGACACAAGCAGAGCGTCAGCACAATAAAGAAATGTTGCGTCAGGCTGAGGCTGCGCGGTCAGCAAGGCTCGTTGAATCTCACAGTAATAAGTTCCAACTGGAAGACAGAGTAAAACTTGCTTCGAGCTTTTACGATTACTACGACAAGTTAACTGCCAGTAAAGAGTCTGGAAGCTCTTCAAACTATTCTATTTGGATCTCAGCAGGTAAACATCTTCGGAGCTATCACGGAAGAGCAGAGCTCACTTTTGAAGAAATTGATA [...]
+NODE 226 22 1392 1300 0 0
+ACCTGCCAATAAGGTGGTAAGC
+TTTATGACGATCAAGGGCGACT
+NODE 227 8769 506505 502908 0 0
+TAGTCACCGTGGTGCAGCCCTTTTGCACGATGGTGCGCATGATAACGCCTTTTGGGGGCAATGTGAAAGTTGGCACAGATTTCGCTTTATATTTTTACGGCGACACGGCCAGCAGAATTGAAGATCTCGTTACCACGACGACCGACCATGACCAATCCGGGAGAGTACAAGTATGTCCGCTGAACACGTTTTGACGATGCTGAACGAGCACGAAGTGAAGTTTGTCGATCTGCGCTTCACCGATACCAAAGGCAAAGAACAGCACGTCACGATTCCTGCTCATCAGGTAAATGCCGAATTCTTTGAAGAAGGCAAAATGTTTGACGGCTCCTCTATCGGCGGCTGGAAAGGCATTAACGAATCCGACATGGTGCTGATGCCAGACGCATCCACCGCAGTGATTGACCCGTTCTTCGCGGACTCTACCCTGATTATCCGTTGCGACATCCTGGAGCCTGGCACTCTGCAAGGTTATGACCGTGACCCACGTTC [...]
+CGCGTAAAGAGGCGCAGAAGTATATGGATCTCTACTTCGAACGCTATCCTGGCGTGCTGGAATACATGGAGCGCACCCGCGCTCAGGCAAAAGAACAAGGCTATGTGGAAACGCTGGAGGGACGCCGCCTTTACCTGCCGGATATTAAATCCAGCAACGCGGCGCGGCGCGCGGGGGCGGAACGCGCGGCGATCAATGCTCCCATGCAAGGAACGGCTGCCGATATCATCAAGCGCGCCATGATTGCCGTCGATGCCTGGCTACAGGCCGAGCAGCCACGCGTGCGGATGATTATGCAGGTACACGATGAATTAGTGTTCGAGGTGCATAAAGACGACTTAGATGCGGTAGCAAAACGTATCCATCAGTTGATGGAAAACTGCACGCGTATTGATGTGCCGTTGCTGGTGGAAGTCGGTAGCGGAGAAAATTGGGATCAAGCGCACTAAGCATTTAAGGAATAACGCGCTTTTTTCGTAATTAAGCAACATA [...]
+NODE 228 7668 408131 400923 0 0
+GGGGCTGCCTTTTGGCATTGCCGATACCAGCGCCAGAATCAAATTGGCCCCCTTTGGGTTGGCGGTCGCGGTGATGTGTTTTATCCTCGCGATGATTATTTTCCTGCAACAGCGTATCTCCCGTTACGCGTTACTGGTAGGGACCGTGGTCGGGTGGGGGCTATGGCGGTTATGCTTTCCTTCATCACACTTACCGCCGGGTGAATTAAGCTGGCGATGGTTTCCGCTGGGCAGCCACGGCACGCTGATGCCGGGTATTATTGTGACGGCGGTGATGACGGGGTTAGTCAACATCAGCAACACTTACGGCGCCATCCGCGGTACCGATATCTTTTATCTGCATCAAGGGTCGGGCAGTTCTCGTTATCGCCGAAGCTTTATGATTTCCGGACTGATGACGTTAGTGACGGTGCCTTTCGCGGTCGTGCCTTTTTCGCCTTTTGTGTCTTCCATTGGTTTATTAACGCAAACCGGCGACAGTTCTCGCAAATC [...]
+GTTGCTGAACATCCTCGCCATAGGCGCCGAAACGCATCACTTTGCCGATCCCTTCGTTGAGATTGCAGTACGCGCGATTGCCGTCGGTGATATTTTCCACGACCAGCATCGGCATACTGGCTGAGGTAATACCGCCCATCGGCCCCACGGCGTTAACGTGATGGCAGGGAATAAAGTTGACCTTTCCCTGCTCTAACAGCGCGAGCGCGCTCATTTCATCTTTGGCCCATCCTTCAAACAGGCATGCGCCGATACAGGCGCCTTTCATCGGGCCGGTCATCTCTTGCCAGCGCATCGGCGGGCCGGCATGAAGAAGCGTTTTCCCCTGATTGAGCACGCTAATTAATGAAGAAGCTGGCTTCACATCCAGCCAGTGCGGACGTGCGCGACGAATTTGTTCGATGACTGCAGCGTTGGCTTGCGCCACTGATGTAAACATGGGAACCCCTTATTGCAAACGTTCTAACAGACGAGCCAGTTTTTTATTACCGC [...]
+NODE 229 6417 319468 312897 0 0
+GTCGATTTTTCGTCGCTTGACAGTTCTGATTTCACTCCCGACGGCCAGTCTGCTCGTAAGCCTCTGGTGTTTGAGCTCACGGATTGCGATTCGGCGCTGAGTAACGGGGTGCAGGTGACTTTCACTGGAACCGAAGCGACCGGAATGCGCGGTATCCTGGCCATCGATAGCCACTCAGGCGCTTCCGGGATCGGGATTGGTATTGAAACGCTATCCGGCGTTCCCGTGGGCATGAACGATGAAGAGGGTGCGATATTCACGCTGGTGACGGGGAATAACGCGCTAAGCCTGAATGCCTGGGTACAACGCCTTCCTGGCGAAGATCTGGTTCCGGGAACGTTCTTCGCAAGCGCACTAGTTACATTTGAGTATTTATGATGAGAAACATACAGATTTTATTTTTACTGTTGGCGGTCGTTTGTTGCCGTTCAATAGCGGCGGGACCCATGCTGAAAGCGACATTTTCAAGCACCACGATGTATTATGGTATTG [...]
+GACGCGGTCGCCGTAGAGATGGAAGCCACCGCTATCGCACACGTCTGCTATAACTTCAACGTGCCGTTCGTGGTGGTACGCGCTATTTCTGACGTGGCCGATCAGCAATCGCACCTCAGCTTTGACGAATTCCTCGCGGTGGCGGCGAAACAGTCGACTCTGATGGTCGAAACGCTGGTACAGAAACTGGCGCATGGCTAAGCAAATGTTCAGGGCGCTGGTCGCCCTGCTGCTTACGCTCCCGGTGTGGCTTTACGCTGCGCCGCGCGTAATTACCCTCTCTCCCGCCAATACGGAGCTCGCTTTTGCCGCCGGGATTACGCCCGTTGGCGTCAGCAGCTATTCCGACTACCCGCCCGAAGCGCAAAAAATAGAACAGGTCTCTACCTGGCAGGGAATGAATCTGGAACGCATTGTGGCGCTGAAGCCGGATCTGGTCGTCGCCTGGCGCGGCGGTAATGCGGAACGCCAGGTAAACCAACTGACGTCATT [...]
+NODE 230 12488 687380 674457 0 0
+GAATAACTTATCAATGCCGGAATGGATTGCCGTTATTGCTGTTGGCGCGAGCGGCGGTCGGCTGTACTGCCGGCGCGGCGCTATGAGCATTATAACCGTCTGCGGCAGCATCCTGCTCTGGCGTTTCCGGCGCTACGCTTTCCGGCGACGTCGGGATAGGTTTACCCAACGTACTGTTAAGCGCGAGCAGATCCTGCTCGTTCAGCGTACCGAGCGCATATTTGATATTTAACTGATTAATCAAATAGGTATAACGCGCGTTGGCCAGTTGCTGCTTGGCATCATACAGAGTGGTGGTGGCATCCAGTACGTCAACAATGGTACGTGTACCGACCGAGTAACCGGCTTCCATTGCATCCAAAGAACTTTGCGCGGAAACGACTGCCTGTTTATACGCGTTGATGCTGCTGATGGAGGCGTTAATATTGTTAAAGGAAGAACGTACGGTCTGCACCACGCTACGGTGCGCGCTTTCCAGCTGTTCGCTTGCGC [...]
+AGCTGTCGCCCGCTTTATAGTTAAGCCCCGGCGCATCAATATCATGACCTTTGGCGCTGCGCACCCAGCCCATCTGCGACAGCACGATAGTCACCGGTTCGGACGGCAGCATATCGTGTTCGCTCATCGCTTTAGCTTCTTCGCGCTCACGCAGCGGAGAACGGCGATCGTCGCCATAGGCATCGGAATCTGCCTGTAGCTCTTTTTTCAGCAAGGTATTCATTTTGCGTTCGGACGCGAGAATGCCCTGCAACTGGTCCCGCTCTTTTTCCAGCTCGTCCTGCTCACCGCGAATTTTCATCTCTTCCAGTTTGGCGAGATGACGCAGTTTCAGTTCGAGGATCGCTTCCGCCTGGGTTTCGCTGATGCCGAAACGCGACATCAGCGCGGGTTTCGGCTCATCCTCGTTACGGATAATCTCAATCACTTCGTCGATGTTGAGAAACGCCACCAGCAAACCTTCGAGGATATGCAGGCGCTTGAGAACCTTCT [...]
+NODE 231 3644 174879 172549 0 0
+TAAGCGGCGTGGCGCTGTCGGTGTTGGCGGCGCTGTGTCCGCTGACGAGCCGCGGCGAAAGTTATTTCAACCCTGCGTTTTTGTCGGCGGATACCGCGTCTGTGGCGGATTTATCTCGCTTTGAAAAAGGTAATCATCAGCCTCCCGGTATTTACCGGGTGGATATCTGGCGTAACGACGAATTCGTAGCGACGCAGGATATCCGTTTTGAGGCGGGCGCCGTGGGCGCCGGCGATAAATCCGGCGGCCTGATGCCTTGTTTTACACCGGAGTGGATTAAACGGCTGGGCGTGAATACCGCGGCGTTCCCTGTCTCAGATAAAGGCGTCGATACCACGTGTATTCACCTTCCTGAGAAAATCCCGGGCGCGGAGGTCGCGTTCGATTTCGCGTTGATGCGCTTAAATATTAGCTTGCCGCAGGCGTCATTGCTCAACAGCGCGCGTGGCTATATCCCGCCGGAAGAGTGGGATGAAGGGATACCCGCCGCAC [...]
+ATTATGCCTCCTTAATCATAATCGACTCGTAGATAGCCGCGCGCAGTAAACGGCCCTTCCGCCGGTTTATTCCCCGTCACGCTGATCGGCCAGGCGCGAATACCTACGCGAGCGGCGGCGTTATCATCAAGATGAAACGGAATTTTACTCGACAAATTATTGGGTGTGAGCGGCGTACCGTTGCTATTAGCAACCACAAAGCCTAAATCCGGATTATCGGACACCATCGCCTGCCCTGAGGCCTTTTCGGCTTCAAGCCGCATCGATAAATAGGCCTGCGCCGCGACGTTGGTACATTTGATAGCGATGGTTTTCGTTTGCGGCGTGACGCCTTGCGGACGATTACCCGCTCCCGCCTGACTAAATAACGACGCGCCGATATCGCCGAAATCAAACTCCACGACCTGTCCGGCATTCACTTCGCAGTTTTGCGGCACTTCTACTTTGCCACTGTAGCTAATGGTATATACCGGCGTGCTCAACGCGTCGCCG [...]
+NODE 232 2153 104539 101703 0 0
+ATTTTTCTCAATAACTACGTTTTGCCGTGCTTACTGACTGAACAGATTTAAACATCGCCAACCTGCTGTCCAGCGCCTCGGTGTAGAGCATCGTATCTACCCCGACCGCGACAAAATTCGCGCCCCACGCCAGACATTTCTGCGCCATTGCCGGATCGACCGCCAAAAAACCCGCCGCTTTTCCGGCGGCGCGAATACGATAAATACACGCTTCAATGATCCGCTGCACTTCCGGGTGTCCGGCATTATCGGGGTAACCCAATGAAGCAGAGAGATCTGCCGGACCGATAAAGACGCCATCAATGCCTTCAACCTCCAGAATCGCGTCAAGGTTTTCCAGCGCCACTTTGCTTTCAACCTGCACCAACAGGCAGAGCGACTCATTGGCCTGTGCCATATAGTTGTCGATTCTCCCCCAGCGCGCCGCACGCGCCACGCTCGCGCCAACGCCTCGTTGCCCCAACGGCGGGTATCGGGTAGCGGAAACGACCT [...]
+CGTAGTGAAGAAAAACCGCGCACGTTTAATTCCTTTTATGTTGGCGCTGTATGTACTGGCGTTTCTGGATCGTTCAAATATTGGTTTTGCCAAAGAGACCTATCAGATAGATACCGGGCTAAGTAATGAAGCCTACGCGCTAGGGGCCGGTATTTTCTTTGTGGTTTACGCTTTCCTTGGCGTACCGGCTAACCTGCTGATGCGCAAATTTGGCGCAAGAACCTGGATCGGCACGACTACCCTGCTGTGGGGCTTTCTCTCTGCTGCGATGGCCTGGGCGGATAGTGAAGCAAAATTTCTGATAATCCGCACGCTATTGGGCGCGGCGGAGGCTGGATTTTTCCCCGGCATGATCTATCTAACTTCACAATGGTTCCCGCAGCGTAACCGTGCCAGCATTATGGGGCTATTTTATATGGGCGCGCCGCTGGCGTTAACGTTGGGTTCGCCGCTCTCCGGCGCTCTGCTGGAGATGCATGGTTTTATGGGGCA [...]
+NODE 233 8999 465798 461586 0 0
+GCGCTGGAGGTGGTCTTGCCAACGCCCCCTTTACCCGAAGTAACAACAATAATGCGTGCCATAAAAATTCCTTGTTAAAAAGGGATCAATTCAACGGTTGAACTGTCAAAGCGTTGTCTGCTAAACGCAGGCGCGCCGCTTTGCCATAAAATTCTGCTGGGATTTTATCACTCAGCCAGTAAACACCTGCGATAGAGACCAGTTCTGCCGTCAGATGGGTACAAAAAATTTGCGCTTCCCGATCGCCGCTCGCCCCTGCCAGCGCGCGACCTCTCATCATGCCATAGACATGGATATTGCCGTCAGCGATAAGCTCTGCGCCAGCGCTGACGTGACTTGTAACAATCAGATCACATTGTGGAGCATAAATGCGCTGACCGGAACGAACCGGAACATCAATTAATCGCGTTTTTGTGATGGGATTAGCGTTTTGCGGCGGTTCGCTGGGCGTTGCCGGCTCAACGGGCGCAGGCCGAACCGCTTTCTCTTTAC [...]
+TCAAATACCAGGCGCTGGTCACGCCAACTACGCCACTCCCCAGGATGACAACTCGCATAGCCACTCCGTTAATAGTAAAAGAACAATCTTCTGATTACATCTTGATAACCCAGATGAAAATATTATTCAACATATGACTTTTTTATGGTGACGTGCTTCACATATACCCTAAAGACAAGCGATCCCACTGGTTTGGGATCTCCTGCTACGCGGCATGGCTATGCAGCATAAAATGATGCCAATACCCGTTTTTTTGCCGTTCAGATTGGAGGAAATCGCAAAGAAAAGTTTTCACGATCAAGTCGTTTTTTAACATGGTGTTCTATGCTTGAAAGGAGGCGCTCCATACAGAGAGCGTCGCCAACAATGAGGGTGCGCGAATGGCAACGATTGATTCCATGAATAAGGACACCACACGTTTGAGCGATGGACCCGACTGGACATTTGATCTGCTGGATGTCTATCTGGCAGAGATAGACCGCGTGGCGAAAC [...]
+NODE 234 14338 823363 811316 0 0
+TATCGCTCATGGCGTCAGCCGTTATAACAGTGATGCTCTGCGGCGGATAGCCGGTCACCACTCTCAACAAATCGATGCGATTCTGGGCTATGAATATGGCCCGGTCGCTGTTCATCGTGATGACATGATTACTCGATAAGGAACAGGCATATGCTGGAACAAATGGGCATTGCTGCTAAAGCGGCGTCGTATAAGCTGGCGCTGCTCTCCAGCGGCGAAAAAAATCGCGTGCTGGAAAAAATAGCCGATGAACTGGAAGCGCAAATGGAAAGTATCCTCAGCGCGAACGTACAAGATGTTGAGCAGGCGCGAGCCAATGGCCTGAGCGAAGCGATGCTGGACCGCCTGGCGCTGACCCCTGCGCGTCTGAAAGCGATTGCTGACGATGTGCGCCAGGTCTGTAATCTCGCCGACCCGGTCGGGCAGGTGATCGACGGCGGTCTGCTGGACAGCGGGCTACGTCTGGAGCGCCGCCGCGTGCCGTTGGGCGTG [...]
+TCTACAACAGAACACCCGGTTTGGCGCACTTCGCGCCAACTATGACCAGGGTGATAACTATCGTCAGGAAGGGCTGGGCGCGTCCGGCACCCTAGTACTTCACTCTGGAGGTCTGACGGCTGGCCCCTATACCAGCGATACCTTTGCGCTTATTCATGCCGATGGCGCGCAGGGCGCGATCGTACAAAATGGCCAGGGCGCTGTGGTTGATCGCTTTGGTTACGCCATTCTGCCTTCGTTATCTCCTTACCGCGTCAATAACGTTACGCTCGATACCCGTAAGATGCGCAGCGATGCCGAACTGACGGGAGGAAGTCAGCAGATTGTGCCCTATGCCGGCGCCATCGCGCGTGTCAATTTCGCCACTATCAGCGGCAAAGCAGTGCTGATCTCCGTGAAGATGCCGGATGGCGGCATACCGCCAATGGGCGCTGATGTTTTCAACGGTGAAGGCACAAACATCGGCATGGTCGGCCAGAGTGGGCAGATTTA [...]
+NODE 235 2100 407554 404672 0 0
+ATAATCAGAAATGGCCGTAAATGTGGTAATGGCATTCAGGACCGTACCTACTGGCAACTTCATCATTCCATCAACACTTGCCCCGTAAGGATTACTGGCTGTATATCCCACAACACCAGACGGTACGCTCTGGGTACTCCCCTTAGTTACCGATGTCGCGCTACTTCCTGCTCCACCCTGTCGGGCTTCTGCAAATTGCTGTTCCCCACGTATCCGGGCTTCTTCCAGTCGTCCAGGCAAAGCGGCTTCATCAGCACGAACTTTTGATTCCATCATCTGGATACGTTCCTGCAATCCATTCTGCTCTGCGTTTATATCGCTGATACGCTGCGCATTAGTCCGGTTTCCGGTAAACGATGCTGCCGGGGCATATGCATTACCACTACCCGCAACCGTATTTTTAGTGCTGTCAAAATTTGTTTTATCTGACCTTGCACGCAGTGCTCGGTTAATCTCATCAGCCTTAAAGCGTGCCCTGATTTCATCAGGTGA [...]
+ATGTCGCTCAGAAAGTTGTGGATATTCAGGCCGATATGGCAGCAAAAAGGATTTATATAGAAATAAAAGATATTGACCATTATGACGCGATAGAAGGTCAGTTTGATGGTGATGTTAAACCTGTAATTCGAACGCTTGTTACTTATCAGGAGATCACAAGGGATTATCAGGGTAAAGAAATTTCATCGGTTCAACAAATGAGGCGTCTTCAATGGACGTTGTTACAACGTAACGAACTTAGTAAACAATCGCTGGACTGGCTTAACATCAATCCGCTGGGAATCCAGATTATTGATGATAAATCCGTACAACAGTAAAGGAACTTAATCATGTTAGCGAAAAGAACTCTCTTATTTTCTGGAGTCCTGGCTGTTGTCATGACTACGTTCAGTGCAACAGCACAGCAATGTAGGGTGGTTAACTGGCGGCCTGGAACAATAGTTAAAGTGCAGTCCGCTTTATATCTGGGAACTCGTATAGAACTGCCGGAAG [...]
+NODE 236 12934 749246 744588 0 0
+TGGAAATGATATGTTTTTGATATAGCGGGTTAGCCATGTTTATCTCCTGACGCCTGGGCAAAAAAAAGCCCCTCAATTGAGGGGCTTGGTATTGGTTTTCAACGGAAAGAAAAACGGCAGGCCTGCGTCTTTTTTCAGACGCGGTAAGACAGAATGTCGTACACACTGAACCATGCTTCCTCCCGGCAAATTGTCCGCGATTATACCCAGCTCTGTTTTGGGATCAAGCGAATTAATGCATGATTTACTTGTCGCAAACGGTTCTTATGAATTTAAATTCATTTTAAGCAAATAATTAATTTGTTTGTGTACCAGCGCCGTGCGCTGAACGACCCGCGGTGCGACCCAGACAATACTGCTACCGGCAACGACGCCGAGAATTTCCGGCAATGCGTGGTAATCCAGAATTCTCGCGACGGCGCGACCATAACCTGCCGCCGTATGGATAAGGATAAATTCGCTATTATGTTCAACGCTAACGACCATTTCGGC [...]
+GTTCACCTGGAACCAGTTCTGCGACTGGTATCTGGAGCTGACCAAGCCGGTAATGACCGGGGGTTCCGAGTCTGAACTGCGCGGCACCCGCCATACGCTGGTCACCGTACTGGAAGGTCTGCTGCGCCTGGCGCACCCGATTATTCCGTTCATCACCGAAACCATCTGGCAGCGCGTGAAGGTCATTTGCGGTATTACCGCCGATACCATCATGCTACAGCCGTTCCCGGAATATAACGCCGCACAGGTGGATGAAGCCGCGCTGGCCGATACCGAGTGGCTGAAGCAGGCGATCGTCGCGGTACGTAACATTCGTGCGGAAATGAACATCGCCCCGGGCAAACCGCTGGAACTGCTGCTGCGCGGCTGTAGTGAAGAAGCCGTTCGTCGTGTTAACGACAACCGTAGCTTCCTGCAAACCCTGGCGCGTCTGGAAAGCATCACCGTGCTGCCAGCCGATGACAAAGGCCCGGTTTCCGTGACCAAAATCAT [...]
+NODE 237 10813 546997 541745 0 0
+CCGCCGAGGTAAACGTCGCCAGCGTTGCGCCGGGCCGCGCCAGCCGCGCCATCGCGTTAAACAGGTTTGGCGTCCACATATCCGGATTTTTCGCCGGGGCAAAACCGTCGAGGAACCAGGCGTCGACTGTTTGATTCAGCGTGGCGTCCAGTTGGTCGGTCAGCTCATTAATATCGCCAAACCACAAATCCAGCGTCACCCGGCCCCGATCCAGCAATAGGCGGTGGCACCCCGGGAGCGGCAGCGGCCATTGCGCCTGCAGCTGCTCTGCCCAGGGCGCGAGCTCCGGCCAGTGTTGGTGCGCCAGCGCCAGATCGTCGCGCGTTAACGGGAATTTCTCAAAACTGATGAAATGTAACCTTTGCAGCGTCGCTTGTGGGTGCGCAGAACGAAAGCCGTCAAACGCCTGCCACAGCGTCAGGAAGTTGAGTCCGGTGCCAAAACCGCTTTCCGCGACTATAAATAATGGATGTGAATGTACGGGAAATCGCT [...]
+ACGTTCCAGCTCAGCGCGGTATAAAACCTGACCGCAGCTATCACACTTGGTCCACACCCCTTCAGGAATGCTTGCCTTGCGGGTGGGAGTAATGTTGCTTTTAATTCGTTCAATCCAGCTCATTGGTGACCTTTCTGCCTGAACCTTAGTCAGCTTTATTATAAGGGGCGCATAATGCCATTTTTGCCCCCAACAGACCATGAATGTTGCACATTAAAACATAACAGCCCGAAACTTTGGATAAAAAAGTGGTCGAACCGCTGAGTTACTTTCTATTTTGCGGCACGCGACGCAGCGCGCTTATGCCGGACAATCTCAATGACGCCAGGTAATATCGAAACCACGATAATCCCCACAATCAGCAGCTTAAGGTTATCCTGAATCAACGGTATCGTACCGAAGAAATAACCGGCGTAGGTAAAGAGCAGCACCCACAGCAGCGCGCCGATGACGTTATAGGCGGCAAAATGCCGATAGGACATGTGCCCCATC [...]
+NODE 238 2547 139236 138190 0 0
+GTCCGCTGCCGCTTTTACCGCCTCGGCCTCTGCTTTCTTCTTCGCGTCCGCCGCCGCTTTCGCCGCTTCGGCCTCCGCTTTTTTCTTCGCGTCCGCCGCCGCTTTCGCCGCTTCTTCGGCCTGTTGCTGCTGCTGTTGCGCCAGTTTTGCCGCTTCTTCAGCCTGCTTTTGCTGCTCCTGAGCCGCTAAACGTTCTTTCTCAAGTTGTTTCAACCGCTCCTGTTCGGCAGCCTGCTTCTGCTGCAGCTCCTCTGCTTGCTGCTGTTGCAGCTTTTTACGCTCTTCTTCCGCGCGTCTGGCGCTGGCCTGTTGATCCTGCTGACGGTTGTACTGTTGCACAACGGCGCCAGGATCGACCATCACCGCGTCGATAGCGGAACCGCCGCCGCCGCCGGCAGAAGCCTCTATATGCTCATCAAACGAACTCCAGATCAGCACTGCAAATAAGATGATATGCAGCACGGCTGAAATAATTATCGCCCGTTTGAGCTT [...]
+GCTTGAAATCTGGCACGGATTATTGCTGATGTGGGCGGTTTGCGCAGGCATAATCCACGGCGTGGGTTTTCGCCCTGAATCCGTACACTGGCAAGGGATTTTTTGTCCGCTCCTTGCGGATATCGTCCTTATCGTCGGCCTGATTTTCTTCTTCTTGTGAATAAGAAACCTCCTTAAAAATATAGGGGCTTGCATAAGCCCATATATTTTTACTCTCCCTTAACTTCCCCCCATTCCCAAGCCTCATTCCCACGCGTATAGTAGCAACGTTTAAAAGCTCTACTTTTGTTGCATTACCGGGATGTAAAGTGAATACAAGGCGATATACAACGGCATTCTTGAGGCATTACGGCGGCAAGCGGATGACGCCAACAAAGAGGCTGCAGGGATGAATAAGTATATGTTTCGATGGCCAATTCGAGTTTATTACGAAGACACGGACGCCGGCGGTGTGGTTTATCACGCCAGCTATGTCGCTTTTTATGAAAGAGC [...]
+NODE 239 10559 633191 627653 0 0
+GGAGCATATTCGTGGAGCAATGGCGCGTTATATTTGTCATAAATTCGCCAATGGCGGCGAATTACGAGCAGTAATGGTATCTGCTGAAGTTGAGGATGTTATTCGCAAAGGGATCCGTCAGACCTCTGGCAGTACCTTCCTCAGCCTTGATCCGGAAGCCTCCGCTAATTTGATGGATCTCATTACACTTAAGTTGGATGATTTATTGATTGCACATAAAGATCTTGTCCTCCTTACGTCTGTCGATGTCCGTCGATTTATTAAGAAAATGATTGAAGGTCGTTTTCCGGATCTGGAGGTTTTATCTTTCGGTGAGATAGCAGATAGCAAGTCAGTGAATGTTATAAAAACAATATAAGGGCTTAATTAAGGAAAAGATCTATGCAACATTTGGATATCGCTGAATTAGTTCGTTCCGCACTGGAAGTAAGTGGTTGCGATCCTTCACTCATCGGAGGAATAGATAGCCATTCAACAATTGTTCTGGATTTA [...]
+CTTTAATACCCAGACTTTCCGTGGCGCTGGTTCCGGCATTAGATTTAAGCGTCGCATCATTAAGATTTTTCGTCGCATCGGTACCGGTTTTCTTCATATTTAACGATTTCAGAGAATCGACGCCTTCAGCACCGAGTTTGACGCTATTCTGCCCGTTCAGCACGTTTTTAATACTGTGGCTTTCAGTGGTCAGTTTATCGATCTTCGCGGCATTATGTTTAAGCGCGCCTCTTTCATTCTGCAGCCCCTTATATTCCAGTTTGGCGCCCACGCCAGTGATCCCCAACTGAAGCGCGCTCTGGGAAATACTACCGGACAACGCATTCATCCCTTCGCGCATCATGGAGCTTGCCGTCGTTTTAGCTGCATCAAAGCTGACTAATGACAACTTACCAGACAGTTTGCTATCAGCCTGGTTCAACGTCAGCATTAACGTATTCGCGGCAGCCAACAGCGCAACGGCACTGGAAGACATTCCGCTAATATCAAAAA [...]
+NODE 240 3593 194368 193446 0 0
+TTAGCGGCGTCTCATAACTTGGGATCGCATCATAATCATCTTTTCCCCAAACGGAATACCTTCCCGCTTCGATATCAAAACGATGTTTGAGCCATCCCGCAACATGACTTGCGAAAGCTTCTTTTCTTCTTAATGGCCAATCAACAGAAGCCAAATTAACATCTAATAAGTACCGCCCTTCTTTATTAACGTTGATCATTCCAGCCTGCAGTAACGCCCGTACCACCTGGGATTGGTTATCATGAATCCAGACCCAGGCATTTCCAAATTCCATTGCATAACTATCATTTAGAAAATCTTTTTTTGAGTATAATTCACTTACATAATCATTGATAGAGTCAGCATAATTTTTTACTTTAGATGCAGATAAATCAAAAAAAGATTCAAATTCGAAAGTATTGTCATTAATACAGGACAGTAACGCACCCGGTTCCGAGAGCTGGGTCCATGATTGTAAACTCTCTACAGCTATAATGAATTTGAAAGTATTTC [...]
+CACGGCATCCCGCCGACGATCCAGTTAGGATGGGGGTTCTTACCGCCAAATATGGTATGGATTTTGACGATCTCTCGCTGGAAGTCGAGGGCTTCAAGATAGTGGGCAAAACCCATCAGATTAGCCTCTGGCGACAATTTGTACTGTGGATGTCCCCAATAGCCGTTACGGAATATCCCAAGCTGGCCGCCATCGACAAATTTCTTTAATCGATTTTGTACGTCAAAGAAGTAGCCCGGCGATGACATCGGCCAGGTGGAAAGGCTTTGCGCCAACTGCGAGGTGGCGCGCGGATCGGCTTTCAGCGCATTCAGAACATCAATCCAGTCCATACCGGCTAACTGATAAAAATGGACCAGATGATCGTGACACCACAACGTAGCCAGCATGATGTTACGTATAATATTGGCGTTATCCGGCACCTGGATACCAATCGCATCTTCGATAGCGTACACCGATGCCAGAGCATGTACCCCGGTACATACACCACAA [...]
+NODE 241 12532 726633 713620 0 0
+GCTATTCCGCCGCATTCTCGCCTTTTCTCGCTTCAATTTCGACCAGTCATCCTCTATTCTGAACGCATGTTGTATTTACCACTGGGTCCTGGAAGACAAATATGAAACGGACAAAATCCATCCATCACGCATCATTTCGCAAAAGCTGGAGCGCGCGGCATTTAACGCCGGTCGCCCTGGCGGTTACGGCTGTTTTTATGCTGGCTGGCTGTGAAAAAAGCGATGAAACCGTATCGCTGTATCAAAACGCTGATGACTGTTCAGCGGCGAATCCGGGCAAAAGCGCGGAGTGTACAACCGCGTATAACAATGCGCTGAAAGAGGCCGAACGTACTGCGCCTAAGTACGCTACACGCGAAGATTGCGTCGCTGAGTTTGGCGAAGGCCAGTGCCAGCAAGCGCCCGCACAGGCTGGCATGGCGCCGGAAAATCAGGCGCAGGCCCAACAATCCAGCGGCAGTTTCTGGATGCCGCTTATGGCAGGTTACATGA [...]
+AGTCATGGTGCTGAACTTCGAAGATGGTTGTTCCACGACCAATATCATCAAAAAGATCCAGACCGAGAGCGAGAAGTAAAACCGCGACATCAGGCGTTACAGACGCGGCGGGCGCTGATTTTGAAGGCGCGTCGGACATTTTGTTTCGACGCGTATCTCGCGGTTGACGCTGCTTTTTTTTCGACCTAAAGTAAAGGAATAAGGGTGAGAGGGGATCTCTCCCCCCTCTGATTGGCTGTTAGTAAGCTGGGAAACTTATCAGTAACAGAACAATCAGTATGATGACCTGGTGCATCATAACCCTTTCCTTATTAAAGCCCCTTCCTCGGGAGGGGCTTTCCCGTTTCAGCCCCTTGCTGACATCGCGATTGTTGGTGAGTGGCCTGTCTGGCGCAAGGGCTTTATCCCGCCGATTTTGCGTTACTGGATCGCCTACGCAAAATGGCCTGCTGGTCATAACGCTTTGTACAGACAAGGTGGAAAAAAGATAAA [...]
+NODE 242 46 4542 4433 0 0
+GACTTTGGTACAGGCCGGGTCTTCGCAGTGGTTGCACGAAATGGAG
+CGAGCGGCGCGATGCACAAGCGCGATGACGGTTTTGTGGTGGTGAA
+NODE 243 6871 352539 346777 0 0
+CAGTGCACGTCGATGCGGCCGTGAAACATGGCGCAACCCGGGAAGAGATTTCTGAAGCATTGTCCGTGGCTATAAAAATGAACACTGGGGCAGCCCTCACCTACACAGCACGCGCACTGGATGTGTACGACAACCTGCCGAATAAATAACGGTATCTCTGCTCTAAGCTACCGCCATTTTAGGGGAAATGGATGGTACTATCCGTAATTTAGTGCAACCGTTTTTCCTTGAATACGCCAGTAATACTGTCAGGAAAGTACAGTTTCAACTTTAGCAGGAGATGGTCAGAAGAAGAAACTGGCGCTGCAAGCCGCGCCAGTTCTGAGTTTGGCAGTGGTTACCTTTCATCAAAAGGTAACCAGTACGCATCAGTGCTTCACGATATACATTGTACGGCTATAGGCCACATCTTCCGGGTTAGTAATGGGGTATCCCTTTACCCACGGTTTAATTAACCGGCCATTGGTATACTGATAAATAGGCGCTATAGGC [...]
+CAGGCGGGGATTGATCAATCACATCCGGCATTACAACGTTGGTATGCCGCTATTCACGAAACGCAAAACGACAGGGAAATCGTCGGTTTGTATGCGCATCTGGTACAGCCGGTACTTGACGCGCAGGCGCGACGTGAGATTAGCCGTTTCGCCGCGGAATCGACTCTGATGATCGCCGTCAGCCCGTTAGCGTTGGTGGATATGGCGTTTATTGCCTGGCGTAATTTACGCCTGATTAACCGTATTGCAACGCTATATGGCATTGAACTAGGCTATTACAGCCGCCTTCGTCTGTTCCGTCTGGTGTTGCTGAATATCGCGTTCGCGGGAGCCAGTGAGCTGGTGCGTGAAGTCGGTATGGACTGGATGTCTCAGGATCTGGCCGCACGCTTGTCCACGCGCGCGGCGCAGGGGATTGGCGCAGGCCTCCTTACCGCTCGACTGGGAATAAAAGCGATGGAGCTATGTCGACCATTGCCGTGGATCGACAAC [...]
+NODE 244 907 47385 46794 0 0
+GGCGGCTTTCGGCGCATCCACCACGTTGCAGAAGATACGGCGTGACTCCGCCGCGTCGCTGACGCGCTGGTTGACGGTATCGTCGTCAGTGGCCGCGATCGCCAGCCAACACGAGTCGAGAAGCGTTTCGTCGAACGGCCCCTCAACCAGAGTCAACATGCCTTCATTTGCCCATACGGTGAACTGTGGAATAAAGTTCAGCGCATTGACCGTTAAACGTGCGCCTGCTTCCAGCAATAACCGTGCTTTGCGTTCTGCGACATCGCCACCGCCGACGATCAGACAGTCGCGGTCGCGTAATTGACAAAATATAGGCAAATGGTCCACGACATTACCCCTTAATGGTTGGCTGTAACCTTAATTTGGTTGGTTTTTTGCGGAACAGGACGCTCCGATTTCGGCGTAGCATACCAATAACCCAATCCCATGAACACGACGCCGGACAAAGTATTACCCAGAGTGACCCATAACAGGTTGTGTCCGATTCCGGAC [...]
+CACGGTCAAATGTGGGCTATCCTGCCGCAAACCTGGCTCGGCAACCTGGTCGGTTCCGTCTTTGTCGCCCTGCTTTACAGCTGGGGCGGCGGCAGTTTGTTGCCGGTCGATACCAGCATCGTTCACTCAGTCGCGCTGGCAAAAACCACCGCGCCCGCCACGGTACTGTTCTTCAAAGGCGCGCTGTGTAACTGGCTGGTTTGTCTGGCAATCTGGATGGCGATCCGCACCGAAGGCACGGCAAAATTTCTTGCTATCTGGTGGTGTCTGCTGGCGTTTATCGCTTCCGGCTACGAGCACTCCGTCGCGAATATGACGCTGTTTGCCCTCTCCTGGTTTGGTCATCACAGCGACGCCTATACCCTGTCCGGAATCGGACACAACCTGTTATGGGTCACTCTGGGTAATACTTTGTCCGGCGTCGTGTTCATGGGATTGGGTTATTGGTATGCTACGCCGAAATCGGAGCGTCCTGTTCCGCAAAAAACCAAC [...]
+NODE 245 2315 113813 110991 0 0
+GGCGTGGGTTACTACATGGACGTACAGGAAGCGAAACTGCGTGACAAAATGCGGGGCACAGGCGTTAGCGTGACGCGAAGCGGCGATAATATCATTCTGAATATGCCGAATAATGTCACCTTCGACAGCAGCAGCGCGACGCTGAAACCGGCAGGCGCTAACACGCTGACCGGCGTGGCGATGGTGCTGAAAGAGTATCCCAAGACCGCCGTCAATGTGGTGGGCTACACCGACAGTACCGGTAGCCACGATCTGAATATGCGTCTGTCGCAGCAGCGTGCTGACTCCGTCGCCAGCTCGCTGATCACCCAGGGCGTCGACGCCAGCCGTATCCGTACCAGCGGAATGGGTCCGGCGAACCCGATCGCCAGCAACAGTACGGCAGAAGGTAAGGCGCAAAACCGCCGCGTCGAAATTACCTTGAGTCCATTGCAGTAAACTATCGTACCGGGTAAGGCGGTATGCTTTACCCGGCCTGCATTATTCCCTCGC [...]
+AATACAGCAATGCGTAGCGGAGAGCGTTTACCAACGCTGACGGCCGATCAGAAAAAACAGTTTGGTCCGTTCGTGTCTGATTACGCGATACTGTATGGCTACTCGCAGCAGGTAAACCAGGCGATGGATTCCGGTCTGCGCCCGGTGGTCGATAGCGTTAACGCCATCCGCGTTCCGCAGGATTATATGACGCAACGCGAGCCGCTGCGGCAGGCAAATGGTTCGTTAGGCGTGCTGGCGCAACAGTTGCAGAATGCAAAACTGCAGGCTGATGCCGCGCATGGCGCGTTAAAGCAGGCCGATGACCTGAAACCTGTGTTTGATCAGGTCTACAAAAAAGTAGTCACCGTGCCGGCAGATGCTTTGCAGCCGCTGATCCCGGCGGCGCAGATCTTTACGCAGCAGTTGGTACAAGTGGGCGATTATATTGCGCAACAGGGCGAGCAGGTGAGCTTCGTCGCGAACGGCATTCAGTTCCCGACCTCACAGCAG [...]
+NODE 246 7162 326538 321518 0 0
+ACAAAATTATTTCTGCTTCCTGGCAGGCGAAAAACAACGCCGCCCGTACGCTGGTGATGCCGGTAGTAAAAGCTAATGCGTTAACCGAAGGCAACAATAACAGCTGGAATCTGGTACTTCCTGCCTGGGTTAACGCCGATACCGAAGAGCAGCGCACCGCCCTGAACACCTGGAAAGTACGCATGACGCTGGAAGACGGAAAGGGCAATAAGCAGAACTCTGGCGTGGTGGAAATCACCGTCCAGCAGGATCGCAAAATTGAGCTGATCGTCGACAACATTGCCGATACCGATCGCAGCGATCACAGCCATGAAGCCAGCGCGCTGGCCGATGGCGAAGACGGCGTGGTGATGGATCTCCTGATCACCGATTCCTTTGGCGACTCCACGGATCGCAATGGCAACGAACTGGTGGACGATACCATGACGCCTGAGTTGTACGACAGCAATGATAAAAAAGTCACCCTGGCCCAGACGCCCTGCACCACGGAAA [...]
+TCAGCATCATATTCGCTGGCGAAGTTGTAAACGGAACCGGCTCGCCAATCACGCCGGGATCAATGTATTGCTTATCCACCGCACCGCGCGAATAAGCGTATCCACGCGTCAACAGTACGGCCACCCCGGCCTGCGGCTGCCCGTCGTCGTTAGTCACCGTTACCGTCATCGGTATCGTTTCGCCTTTTTTCGCCACGGCCGCTGATTTATCGGCGTTCCATGCGTCGGAAGAGAGCGCGATATTCAGCCCGCTGCGCGATGTTGTCAGGCAGAGTTGTAAGTAGTAGTTACCCGGGTTTTCCGACATGCTGTAGTTTTTCCCCGTCTTGAGATCTTTATACTGCCAGTAAAGGGTTGAGCCTTTCAGCAGGCTATCGCCAGCCCACCACCGCTTCCCGACGGGCAATCCAATATCGGTCGCTACCTTGCCGCTTGGGTGATCGTTGTACAGCGCCGTGAAATCATCCATCGCAGCCATCTGGTTCATCGGGC [...]
+NODE 247 5308 335034 331485 0 0
+ATATTAAAATGATTTTTAACTGGTGCTGACAACTATGCTAAATACGCAGGAAGTACTTAAAGAAGGAGAGAAGCGGAAAATCCGCAGCCCGGAAGCATGGTTTATACAGACGTGTTCCGCGCAAAAGCTGCATATGTCATTTTCTGAAGGCCGACACAATGAAAACTGCCTGATTCAGGAAGGCGCGCTGCTTTTTTGCGAGCAGGCCGTTGTCGCACCAGTATCAGGAGACGTGGTTTTTCGACCGTTAAAAATTGAAGTACTCAGCAAATTACTGGCATTTATCGATGGCGCAGGATTAGTGGACACGACATATGCTGAATCCGATAAATGGGTTTTGCTGAGTCCTGAGTTTCGCGCTATTTGGCAAGATCGTAAACGCTGCGAGTACTGGTTTTTGCAGCAAATTATTACGCCTTCTCCGGCCTTCAATAAGGCACTGGCGCTGTTACGAAAAAGCGAGAGTTACTGGTTGGTTGGCTATTTACTCGC [...]
+CATAATTAATTTCATATTACGCACGGAAACACGTTCGCTTAACAAACGCTGCAAAACTTCAGATATACGTTGTACCGTGGCATGTCTGAGCACTTCTTTAAGTAAATCAGGAAATTTCGCTTCCAGTTGGTCCAGCATATGTTTTGTTTCCTGAATACCGAAATATTCATTGACGTTGCGTGCCAGCGTCACCGCCAGACAGTGGTAAAGCTCATCAAGCGCGTTCCGCAACACATAGCCAAGCTCCCGGAGTTTCTCCCCCTCTTCATGCGTTACCCAGAAATACTGACTGCTACCTTGCTGATGGATTGTTGGATTAATACCAAAGGACACGACTTCATCGGAATAATTTACCACTCGCATCAAATCAAAATAGACCGTAAATTGTTCAACACGGATCTCATTAATCAACAATACGATGCTGTTATCGTCCAGGCCCTCGCCATCGCGTAACAATACTTCCGGCAGGCGCACGCCATAATCAATAAAGAA [...]
+NODE 248 15199 753752 745215 0 0
+TGCAGCGTGTCGCAAAAAGACCGACCGTTGCGGCAGCGCTTAAAGCGGAAGGACTGAATTAATGTCATGTTGCCGGATAGCTCGCTGTACCGCCATCCGGCCTCTTTTTAGCAGCAATAATTACAGCCGCGTTGCGCTGAAGTAATGTTCAGGGTTAGCGATCCTGTCCTGGGCCGCCACGACCTGCAGTTCGTACTCCTGCATCGTTTTGGTGGCGATCATAATCTCATAGACTGCCGCCGTAACGTGCTCCAGCGCCTGCTGCAACGTCGCGCCCTGCAAAAGTTTGACCAGCAATAAACCACTGGTGACATCGCCAACGCCAACCGGCTGACGTGAGCCGAAATCCACCAGCGGACGGCTAATATGCCAGGCTTCCTGCGCTGTCACCAGCAGCATTTCAAAGCGTTCTGAACTGTAACCGGCGCGGGCGAGATGTTTTACCAGTACAATTTCTGGCCCCTGAGCAATCAGTTCTCGCGCCGCCTGCAC [...]
+GGTTCTGTTACGACGATGCGTCGTATGACGAGATTTCGTGGAGGCGGTGGTACGTTTTGGCGTAGAAGCGGAAGAAGAACGGCTGGTTTTTGAGGTTTTTTTTACGTTTTTTTTGTTGGTCTTACTGATCTTTTTCGTTGTGCTTTTCTTTTTATCTGCCGTTTTCGTGACATGAGAAACAGCAGGCGTCGCTTTGGCTTGCCTGGAAGCATGGGCCATTGGCGTAAAAGGGAGAGTAGTAAAAAGTAAAGCACAGAGCGTGATCGAGATTTTGTTTATCCGCGCCACTGAGCAATCCTCTGTTAAAGGCAGGCGATTCATGCCTGCGTATGATTTACAAAACCTGATAATTCTAATCTACAAAAGCACAGATTGGTAATTGCTTTTGGTTTCTGAAGCTGTGTTTCGTTAACAGATGTAAAAAAAATAGCAATTAATGCTAAACACGAACGCGTTATCTACAAATCACAGCGTGGCAACCCGCTTAAAAGA [...]
+NODE 249 1177 78405 78014 0 0
+CGAGCAGCCTATCGGTACGCGTATTTTTGGGCCGGTAACTCGTGAACTTCGTAACGAGAAGTTCATGAAAATTATCTCTCTGGCACCAGAAGTACTCTAAGGAGCGAATCATGGCAGCGAAAATCCGTCGTGATGACGAAGTTATCGTGTTAACCGGTAAAGATAAAGGTAAACGCGGTAAAGTTAAGAATGTCCTGTCTTCCGGCAAGGTCATTGTTGAAGGTATCAACCTGGTTAAGAAACACCAGAAGCCGGTTCCGGCTCTGAACCAACCGGGCGGCATCGTTGAAAAAGAAGCTGCAATTCAGGTTTCTAACGTTGCAATCTTCAATGCGGCAACCGGCAAGGCTGACCGTGTAGGCTTTAGATTCGAAGACGGCAAAAAAGTCCGTTTCTTCAAGTCTAACAGCGAAACTATCAAGTAATTTGGAGTAGTACGATGGCGAAACTGCATGATTACTACAAAGACGAAGTAGTTAACAAACTCATGAC [...]
+ACCGCATTCCAACGATCTTCGTCGGTTGCGTTCACATCAGAGATGATCGCTTTCAGTTCAGCGCGTTTCGCGAAGTATTTATCAGCTAAAGCTACGCGTTTTACTTCGCGTGCTTTCATTGATTGCTTAGCCATTTAGTAACCCTACCTTACTTGCGGAACGGGAAGTCAAAGGCAGCCAGCAGAGCACGGCCTTCTTCGTCAGATTTCGCAGTAGTGGTAATGGTAATATCCAAACCACGAACGCGGTCGACTTTATCGTAGTCGATTTCTGGGAAGATGATCTGCTCACGGACACCCATGCTGTAGTTACCACGACCGTCGAATGACTTAGCGGACAAGCCACGGAAGTCACGGATACGAGGAACAGCAATAGTGATCAGGCGCTCAAAGAACTCCCACATGCGTTCGCCACGCAGAGTTACTTTACAGCCGATCGGATAGCCCTGACGGATTTTGAAGCCTGCAACAGATTTGCGTGCTTTGGTGATCA [...]
+NODE 250 2307 123059 122507 0 0
+AATTATTTTCTGAAAATTATTGATCTGATAAATGATTATTAATCTAAATGTTATAAGCGTCAGGTCAACAGGAGACAATTATTTTCATGCCTATGGAAAACAAGTCAATTTTCTTTCTGGCGGTCTGCTTCCCCCACCAGCAGTCGAATGTAACAGAAAGCAATTAAATATGTGCGGTTGCTCATATTATTACATACTGGTTACAGAAAGAGATTGATAATTCGCATCGCGAAAAATAGTCTATTTAACGTAGTAAATGAGGTTTCTCAGCGCTACTTTTTATTTTTATTTTTTCGCTGTTCGCTTTTGTCGGCAGCAATTTATACGTCAAAGAGGATTAACTTATGCGTACGTTTAGTGGCAAACGTAGTACGCTGGCTCTGGCTATCGCCGGTATCACAGCAATGTCGGGGTGGATCGTTGTTCCGCAGGCGCAAGCCTCCGGCTTTTTCGACGACTCCACGTTAACGGGCGGCATCTATTATTGGCAGC [...]
+ATGTGGACTTGCCGCGACGGCGATGCTATTTGTACGTCTGAGTCGCGGCTATATCGCGGCAGAAAATAAAGCCTGAAAAAACCACGGGCGGAAAACATTCGCCCGTGGGTGGCAAGGCAGGGTTTTATTGCACGTTATTATGACTGCGAATTTCCTGCCAGACCTTATCGCAGTCAGCCTTGACCGCCTGATCGTTACCCGTGCGCGTCGCCTGAATGCACTGCTGATAGTCCAGTACCCGCACGCTTTCTTCGTTAGCAAATTGCTGATGTTTGCGGTCTTTTTTAAGGACATTCAGTACGCTTTGGCAGGCCTCTATCTTCTCAGGCGAGCCCTGTGCGGTATTGATACAGGCGCTGTACGCCTCTTTCAGCTGGCTATCTTCTTCCGGCGCGGGTGATGACGCGCAGGCCGTCAAACCGGCGGTCATGCTGGCGATGAGTAAAATTTTTTTCATAGGTCGTTCCTCAACAACGCGGCAGACCGGCAGCC [...]
+NODE 251 122 6637 6472 0 0
+ACCACCACATTTGACGCCACGAAAGGCACAGGCGGATGGACCTTTACGCCGCCGGCATTATGGGCGGATGGGGATTATACCCTGAGTGTGTCAGTCGAAGATAAAGCGGGGAACACCAGCCA
+CCCATCCGCCCATAATGCCGGCGGCGTAAAGGTCCATCCGCCTGTGCCTTTCGTGGCGTCAAATGTGGTGGTGACGCCGCCATGCTCCACGCTGACCGTAACGCGAACGGCATCATCATCAA
+NODE 252 13339 705539 698117 0 0
+AAGTCTTCCAGGTTCAGGTCGATGTCGTCAATGCGTGAAGAAAGCTTCGCGGTGTAGTAGTAGCGCAGGCTGTCGGCGTCAAAGTGTTTCAGCCAGGTGCTGGCCTTAATAAAGGTGCCGCGAGACTTAGACATCTTCGCGCCGTTCACCGTCACGTAACCGTGAACGAACAGGTTGGTCGGCTTACGGAAGTGGCTGCCTTCCAGCATGGCAGGCCAGAACAGGCTGTGGAAATAGACGATGTCTTTGCCGATAAAGTGGTACAGCTCGGCGTCGGAGTCTTTTTTCCAGTACTCATCAAAACTGGTCGTGTCACCGCGCTTATCGCACAGATTTTTGAAGGAGCCCATATAGCCAATCGGCGCGTCCAGCCAGACGTAGAAATATTTGCCCGGCGCGTTCGGGATTTCGAAACCAAAATACGGCGCGTCGCGGGAAATGTCCCACTGTTGCAGGCCGGATTCAAACCACTCCTGCATTTTGTTCGCCACC [...]
+TCGGCGGCGTGATGATGGAAAAAATGTTTGCTTATCCGCAACCGGTTAACGGTCTGACATTCAACTGGGCGGGCATGTGGACGTTTGGCGCAGTGATGATTGCCGTCATCGCGCTACTGTTTATGATTTTCTTTCGCGAATCGGACAAAGAGATCACTGCTATTGACGATCGCGATATTGCGTTGACACAAGGGGAAGTAAAATGAAAGCAGAACGTATTCTCGGTGCTCTTTACGGGCAAGCGTTAGGGGATGCGATGGGAATGCCCTCTGAGCTGTGGCCGAGAACGCGCGTCAAAGCGCATTTCGGCTGGATTGACCGCTTTCTGCCCGGGCCAAAAGAGAATAATGCCGCCTGCTATTTTAACCGCGCGGAGTTTACGGATGATACCGCAATGGCGCTCTGCCTGGCCGACGCGCTACTCGAATGCGAAGGCAACATTGATCCCGAGATTATTGGGCGTAACATCCTCGCCTGGGCAGAACGCTTTGA [...]
+NODE 253 6849 384826 382842 0 0
+CAGCGCGTCTTTTTGCATGATGGCGATCCTGTCTTTTCTTGTTTGCGATAGTTGATCCTCCACGAGGATGTTTAAACCATACCACAAAAAGTAAAGATTTCAATCCATATTACGTAAAATAAACTTTACACCATGCGCAATCGTCGATTAAACCCCTTCATTTCGTATCAAAAACTTTACACAACAAGTGAATTATTTTATTCCCAGCCTCAGAAAAGCGGTAAAATGAGCGATGCTCGCTATTTTTTGATTATTTTTTCTCCGCACACATATTTTTACTTTCTGATATAGGGTGATTAATACCATTATCACAAGAATTTAATATCAGGGATGCCATTTAAATTATTCATATTATCAATAAGAAATAATGACGATATGGCAAAATAATGTTATTTTGCTACAAACAATCACGGATGTATTTTAATGCTTTACGACTGAAGATGGTGGGGACTTGTTAATGCGTTTTTCTCACCGATTTATCCTTCTGTTATC [...]
+TAGACAAACCATGCCACGATAGAGAGCACGGCTTTATCAATATTTTCAGTACTGAACAGGTTATGCATGTAAAACAGGCCGGTACACAGAGTAAGGGTCAGCAGTACGACGCCAATCTGCGTGATATGAAACATTTTGCGCTCAATGCTCATCAATGGCGGCATTTCATTACTAAACGCCAGCTTTTTGTTCTTCAACTGATAGTCGATCCACGCCAGCTGTAGCGCATACAGCGCGGCGATTATCAGCGTCGCGTAAGAGAAAAGCGACAGACCGATGTGCACCATCATGCCTGGGGTCGCTTCCAGATGCGTAATATATTCATTAGGCATGAATGTGGCGAAGGCCAGGTTAATCAGCGCAAAAGCATAGACAATGGGCAGAAGTAACCAACCGCGATTACGCGACGCGACAATGGTCATTACCGTGCAGATCATCAGGCTGACCAGCGAACCGACATTCAGCAGGCTCAGGTTTTGTCCACTGTCGCCG [...]
+NODE 254 2258 99950 99248 0 0
+ATCCATCATTCGGCGCAGATCCAGCGGCGAAGTACGATAGTGCGCCCCCGACAGTAACTGATACACAGCCCTCGGCAACGCGGGCGTCTCCCCCCAGGCCTGTTGGTAAAACGCCGAGATTGCTATCGCGCCATGTGGCGCCTGCGCAAACGCTTCATCGTCGAATATCAGCGCCTCGCTGACGATATTTTCCAGCGGGCATTCTGGCGCCCAGCGGACAGGCTGACGAAGCGTGAAGCGGTGAAGCTGCGGAAAACGGGCGCAAAACTTAAGTAAAAAACCTCGTCCGGTGCCTTCGTAGCCCTGAACGGTGGTGGTGAGTAGTATGCGGGGAAAGCGCGAAACCAGTTGCAGCAGCAGCGGCGCGGGGATTGCCGCCGCCTCGTCAACCACCAGCCAGTCGGCTCTTGCCCCGCTCGCCAGCAGCGCATCCGGCGCCATAAAGCAGAACCGCTCACCGGCAAACGCTGCCAGGATATCCGTTGCCGTTTT [...]
+CGCATCGCCTGGGCGTGAAATTAGATTAATTCCGCTTCTGACCGGGGGGCAACCGCTCTCCGGTATCATCCTTTCCTCATTCTGATAGCGTTTACCTGTGGTAATCCTGCGCCTGACCGCCTACGATCATCTGTATAACAAAGAGAGAATGAGGTGATTATGCGCTGGCAAGGGCGTCGTGAAAGTAACAATGTAGAGGACAGACGTAATCGGCCAGGCGGCCCCTCGCTGGGTGGCCCAGGCTTTCGTCTTCCGCGCGGAAAAGGCGGCATCATTCTGTTGGTGGTGGTGTTGGTCGCAGGGTACTATGGGGTGGATTTAACCGGTCTGTTGACCGGTCAGCCGGTTTCGCAGCAGCAGTCGACGCGTTCGATAAGCCCCAATGATGATGAAGCGGCAAAATTTACCTCGGTGATTCTGGCGACGACCGAAGATACCTGGGGGCAACTCTTTCAAAAAATGGGGCGCGGCTATCAGCAGCCAAAACTGGTG [...]
+NODE 255 9469 511414 505635 0 0
+AGACTCCAGTACGCCCGCACGGTGACCGCCGGTCGCCGCCGCCCAGGCTTTCGCAATCGCCATACCTTCGCCTTTCGGGTCGTTTTCCGGGTGTACCGCGATCAGGGTCGGTACGCCGAAACCACGTTTGTACTCTTCGCGCACTTCGGTGCCCGGACACTTCGGCGCTACCATCACCACGGTGATGTCTTTACGGATCTGCTCGCCCACCTCCACGATATTGAAGCCGTGGGAGTAGCCCAGCGCCGCGCCGTCTTTCATCAGCGGCTGTACGGAACGCACCACGTCGGAGTGCTGTTTGTCTGGCGTCAGGTTAACCACCAGGTCGGCCTGCGGGATCAGCTCTTCGTAGGTACCCACTTTGAAGCCGTTTTCGGTCGCTTTACGCCAGGAAGCACGCTTCTCAGCAATCGCTTCTTTACGCAGGGCGTAGGAGATATCCAGACCGGAATCACGCATGTTCAGGCCCTGGTTCAGCCCCTGAGCGCCACA [...]
+TCGTCGCGATCACGGGTCAGGTTTCCGCCCCGTTCATCGGCACTGATGCGTTCCAGGAGGTGGATGTGTTAGGCCTGTCGCTGGCCTGTACCAAACACAGCTTCCTGGTGCAGTCGCTGGCAGAGCTGCCTCGTATCATGGCAGAGGCTTTTGAAGTCGCCAACGCTGGCCGTCCTGGCCCGGTTCTGGTGGATATCCCGAAAGATATCCAGTTGGCCAGCGGTGAGCTGGAACCCTGGTTTACTACCGTTGATAACGAAGCGACCTTCCCGCAGGCTGATGTTGAACAGGCGCGCCAGATGCTGGAACAGGCGAAAAAACCCATGCTGTACGTCGGCGGTGGTGTTGGTATGGCGCAGGCAGTTCCGGCGCTGCGTAAATTTATCGCGGTAACGCAAATGCCAGTTACCTGCACGCTGAAAGGGCTGGGGACTGTTGAAGCTGATTATCCGTACTATCTGGGCATGCTGGGAATGCACGGTACTAAAGCGG [...]
+NODE 256 14313 744537 737919 0 0
+TGGCGCGGAGAAAGTGAATACGATGTGCTGAGCGTTGGGCATTCCTCCACCTCCATCAGCGCCGGTATCGGTATTGCCGTGGCGGCGGAGAAAGAAGGCAAAGATCGCCGCACCGTCTGTGTGATTGGCGACGGCGCCATCACCGCCGGTATGGCGTTTGAAGCAATGAATCACGCAGGCGATATCCGGCCCGACATGCTGGTCATTCTGAACGACAATGAAATGTCAATTTCGGAAAACGTCGGCGCGCTCAACAACCATCTGGCGCAGCTACTTTCCGGTAAGCTTTACTCTTCTCTGCGCGAAGGCGGAAAAAAGGTCTTCTCCGGCGTACCGCCAATTAAAGAACTGCTCAAGCGTACCGAAGAACATATTAAAGGCATGGTTGTGCCGGGAACCCTGTTCGAAGAGCTGGGCTTTAACTACATCGGGCCGGTCGATGGTCACGATGTCATGGGGCTTATCAGCACATTGAAGAACATGCGCGACCTG [...]
+TTACCAACGTCAGGGGCGACCCGTTCCACCTTTGAACGTTGATTAATTTTAATAATGAGGGAATTTGAATGAGCTTTTTTATTTCTGATGCGGTAGCGGCAACAGGTGCTCCAGCGCAGGGCAGCCCGATGTCTCTGATTTTAATGCTGGTGGTGTTTGGTCTGATTTTCTATTTCATGATCCTGCGCCCGCAGCAGAAGCGCACCAAAGAGCACAAAAAGCTGATGGACTCCATTGCGAAAGGTGATGAAGTTCTGACGAATGGCGGTCTGGTCGGTCGAGTGACCAAAGTAGCGGAAGCCGGCTACATTGCCATCGCGCTGAATGACACCACGGAAGTGGTTATCAAACGTGACTTCGTAGCTGCCGTTCTGCCGAAAGGCACCATGAAGGCGCTGTAATATTTCGTTTTCCCAAAGGGAACTGCCGTGTTAAACCGTTATCCTTTGTGGAAGTACATCATGCTGGTCGTCGTGATTATCGTCGGCCTGC [...]
+NODE 257 5590 297287 293188 0 0
+GAGCTTCAGATCGTCAGCCTGAAACTGGGTATCACCCGTCAATGGCCAGGCAATGCGTTGGCTGACGACTTCAAGATTGAGCGGTAAACCGGCCTCCGCCAGCCGCGTCTGGGCGCGAAGCGCGACATCCATCGGCCCGGAAAGGTTCACCCCGACCTCCAGTTGTTCGCGTAACGCGCCGCCGACCTTGAGTTTTATCTTTTCACCCTTTAGCGGATCGATATTCAGCGTACTGTTGAGCGTAATATCAACCGGCCAGTTATTGGCGAGCTGCGCCGTACCGGAGGCCTTCACCGTGCCCTGGTTGGCGTCGATATCCAGAGTATCCAGCTTCATATTACCGTCGATACTGCTGACTTTAAGCAGCATCGTGCGCACCGTCAGATCGGTATCGCCGGTGATGCGTAGCTGCTCGCCGCGAAATGACTCGATATTCAGATTGAGCGGCAGGTGAACATCAGTCATCTCCGGCATTACCGGTTTTGCAAACAG [...]
+AGACAACAATGAAAATTTTCCAACGCTACAACCCGCTACAGGTGGCGAAGTACGTGAAGATCCTGTTCCGTGGACGGTTATATATCAAGGATGTTGGCGCTTTTGAGTTCGATAAGGGGAAGATTCTTATCCCAAAAGTGAGAGACAAGCAGCACTTGTCTGTGATGTCTGAAGTTAACCGTCAGGTTATGCGTCTGCAAACTGAGATGGCGTAACCAAAAGTGCTATGCAGTAGGTTAAAAAAGTAAAAAAAAACGGCTCCTGAATCAGGAGCCGTTGATGTTTCTGGCAAACGGATTTCAGGCCGCGCTGTCTTCTTTACCTTGCGCATCGGGCAGTTTCGGTGCCGGTACGTTGCTTTTATTGTCGAGACGCGTCACCAGCAACTGATCGATACGGTAGTTGTCGATATCCACCACTTCAAATTTGTAGCCGGAAAACTTCACCGAATCAGTACGTTTTGGAATCTTGCGCAGCATAAACATCATAAAG [...]
+NODE 258 940 57662 57000 0 0
+CTGAACATGAGGATAGCGGCTAATTTCTGCCAGCGCCGCCATGTAATAACGCAAGCGTAGCGCCTCGCCATAGGGCGTAATCATCACATTCAACGGCGTACCTAAAAGAGGCAAATGGTCAACCATGCGCCATAGCGCGGCTTCGTCGCGTTTTTTATCGTTACGGGCGTGTTTATGGAACGGGCAATAGCCGCAATGATAATTACACGATTTAAGATAGCCGCGATAAAACAGCGTGTGAATATCGCGCAGGGCGGGGATGCTCATCTCTGCCGATTCTCCCGTAGCATCACCTCAGGCGAAACGAACACAGGAGCAAGGCAATCGGATAATGCCATACCGGTCTCCGTTAGCCGGAGGCGACTGCCATTCTGATGGCAGTAACCCTGCCGTATGAAGAGTTCCAGGTCGGGGAAATCCCTTAGCGCATCGCTGGCAAAATATTGCTGATAATCGCTAAGAGAAAGTCCCTGCCAGAAAAATAGATTTTTA [...]
+AGCCTGACGGAATCGTTACATCAGGCGCTCGTTTATCAACCGGAAGAGCTGTTTCTTTATCCGCTTTATAATATGCCTCGCCAGGAAAATATGCATAGCTACTACGTTGTAGCCCGCGATCTTTTACGCAACGCGGGCTACACCCAAACGTCCATGCGCCGTTTCGTCCTTAATCCAGCGCCATCCGCCGCGGCGGAAAGCTGCGGATTTGAAAACTCACTGGCGCTCGGCGCGGGCGGCAGAAGTTATCTTGGCAATCTGCATTACTGTTCGCCGTGGTCGTCGAACCTGCAAACATCACGAAAAATCATTCAGGCGTTTATCGACAGCGCGGATAAAACCGTCATTAACCACGGTTATCTGCTCCCCCCTGATGAAATGAAACGCCGCTTTATCATTAAAAATCTATTTTTCTGGCAGGGACTTTCTCTTAGCGATTATCAGCAATATTTTGCCAGCGATGCGCTAAGGGATTTCCCCGACCTGGAACTC [...]
+NODE 259 3608 185002 183967 0 0
+GCAAAAGCAGTTTGAAAACGTGGATGCATGGCGTTGCCTCATAACAATGTAATGGAACCGTAGTTTACGGGCCTGCTATGTCTTAATATGTGATCTAAATCTCATTGCTTGTGCAACTTGTGAAACTTAAATGAAAAATGCGCGACGTATCGCAAATTTTAACCCGGTCTTTTGTCCCGTCGTTAGCGCATTACCGCCAGAATGAGCGGAAACAAAAAGGGCGCTACCAGCGAGGTAATAATGCCGCAGATCACCAGCGCCAGGGAGCTAAACGCGCCTTCCTGGTAATCCAGCTCGGCGCAGCGCGCAGTACCGAGCGCATGTGAGGCGGTCCCCATTGCCAGCCCGCGTGCGGCCTTAGTACGGATGTGCATCGCGTTTAACAGCGTGTGGCCAAACACCGCGCCCAGAATACCGACAAAAATTACGCATACCGCGCTGATCGCGGGGATGCCGCCGATGCTGCCGCCCACCGCCATCGCGATAGGCGTA [...]
+TGGGGTACAGCGTCGCCGTCAGAGCATTAAGCCCGACCTGGGAACCGCTAATACCGATGCCGGTACCAAAAATCGCCAGCGCCATCAGCCAAAGGCCGTTTTCGCTCAGGCCTATCATGACAATGCAAACCGCGCCCAGCGCATAGCTCACCGCCAGTACCCGGAACGGGTTAAGCCGGTCCATCAACACGCCGAGTAACAGCGCGCCAAGCGTGCCGCCAACCTGGAATGCGGCAGTCACCCACGACGCCTGTTGCAGATCAATACCGCGATGGTTAAGTAACGTCGGCATCCAGCTGGAAAGCAGATAGATAATGAGCAGGCTCATAAAGAACACCACCCATAACATCAGGGTAATGACAAGCTGTCGCCCGGCAAAAAGCTGGCGAATACTGCCTTTGGCGACGGCTGCCGCCTCATGCAGAAAGAATTGCGTATCGTGATAGCGCTCGCCGGTAATGGCGCTGACCGTCCGGGCGACAACGGCTTGCG [...]
+NODE 260 2226 135181 134606 0 0
+ATAAATATCCAGATGCTTACCGTTCCGTTTTTTCTAAAAAGTATGGCTCTTTGGAAATACCTTCTGCCGGCATTCATTTTACCTGGGATCTTATCCAAAGAATCAAAGATAAAGGTGGGTTAATATCTTTTATTACTTTACATGTTGCATCAACAGAAATGTTGTCCAACAGAAAAATACAAACAAAATGTGTAGAGGAAGTGACTATCAACGAAGAATACTACGAGGTTCCGCAAGCAACAGCGGATATCATTAATACTGCGAAGCAAAATGGCGGACGTATTTTTGCCGTAGGAACTACCGTTACACGATGCCTGGAATCCGCGTATTCGAGGGAGCACAATTGCCTCAAAGCAAGTTCTGGCTGGACTGCGCTTTATATACATCCAGGTTATCAACTGAAAGTGGTTGACTGCCTGCTAACGAACTTACATCAGCCAAAAACGACGCATATGGTGTTAACCGGTCAGTTTGCTGGGGTTGATCTACTCA [...]
+CAAATCTGTTGACGGTGTCAGTTCTTTTTTCTTAAAGAGGTAAATTCCATCATGGCTTCTTACCAGTTCATAAATCCGCTGTTCAAGAGCATCACTTACCATATTTTATCGCTTCCTCTGGCAATACGGTTGTAATCCCTTCCTGTACGATATGCAATCTGCGACACGTCAGAGGCCAGAATAATCCATCCGACTGTTCAGCAAGGCCACCAAGTAAAATAATATCACCATCTGCAAGGCTGACTTCGGTTGTTACATCACGCTTGATAAGGGTTGGCGAGTTATTAACGCCGGTTTCAGTGGTCACAAGTTAGGTTCTGGACATCTGAAATTAGCCTTGAAAAAACCGTCAGCTGCCCGCATCACTGACCGGGCTGGAGCTGAATCCCCTTCGTGAAGGATGCTTTTATTAGTACTATTAAAGGTGCTATATTTAGTCATCAACCAGGAGGTAAATTATGGCATTTCAAATTTTAACGACTACTGCAGCAA [...]
+NODE 261 4879 259387 256657 0 0
+CGCGAACCTGCATGAAATCCAGCGCAGGGCAACCTGCTGAAAGCGGGTCGTACCGACGAATCAACGCATCCAGCTCTCCGGCGGTAAGCGGCTGGGCAATCGGCAGATAAAACTCCATTTCGACCTGTTTTTCACGCTCGGTCAGCACGCTCAGACTAACGCCCGTCTCGTTAAGGGGAACGTGCAACACGGTGTCCAGCCAGCGGGTAAGTACGGGCTCCCATCGCGTTTCAAAACCACTCAGCTCCAGTTTTTCCTGTACCCATTGGGGGTTTATCGGTTGAGTAAAATCAAGCTCTTCAAACAGGCTGTGCAAAAATGTTCCCGGCGATGCCCCGCGAGGAAAGTGATGCGGCGTCATTGCCGGCGCTTCCGCCGCTTCGCCAACGCCTGCGGCGTCAATGTCGAGACGAGGAATAAGATCTTGCGCCACGCTATGTCCCCGCTGCTGCAAACCGGAATAACTAGTGACGCGCCAGCTATCATAAAGCA [...]
+TATGTCGAGTGGCTGGCGGACACTATGATCCGCGTCCCGGTAGCGCATACGCTGGATGCGGCGAATATCGCCGATCGTTACGATCCTGCCGCTATCAAAAATCGCCTGGCGATGATGACGCCGCAGAATGCGCGCATCTGGTACATCAGTCCCCAGGAACCCCATAATAAGATTGCGTATTTTGTGGATGCGCCTTATCAGGTCGATAAGATTAGCGAACAGACGTTTAAAAACTGGCAGCAAAAAGCACAGGGCATTGCGTTGTCGCTGCCGGAGTTAAACCCCTATATTCCTGATGATTTTACGCTTGTTAAGAATGACAAAAACTACGTGCGGCCAGAACTGATTGTCGATAAAGCGGATTTGCGCGTGGTTTATGCGCCGAGTCGTTATTTCGCCAGCGAGCCAAAAGCTGACGTGAGCGTGGTATTGCGTAACCCGCAGGCGATGGACAGCGCCCGCAATCAGGTACTGTTCGCCCTTAATGATTAT [...]
+NODE 262 1787 91026 89496 0 0
+TGAATACTGTTCTCCCGCATCCACTGGCGCAGCGCCAGTGTGGATTCACCAAATAAAACGTTCTCACGATCCAGCCAGACGGAGCCCCATGGCGGTGACGGTAAGGCATAAGGCCCGATAAATAAACGCTGAAAGGACTCAGTAAGAGAGTCATCGCCGCCATCTTTAAACATTCTTGCCAGTTGAGGCAACTCCTCCGACGGCAGCGGCCATTGTGTTTGCCATTCATCAGATGTGAATGCTGAAACCAGCGGAGAGGCTTCAGCACTCTCTGGCGCAAAGTAAAAGAGGGCGCCCAGTACGCGTGCCGTCATGGAAAAATTGTCACATTGTGTGAAATCAGTCATAAAACCATTCCGTAAAGTGCGGGTTCCCCCGCACTAATTTGTTAACCTGCCACTGCCATACCGACAGTCATATGTAGCCCATAAAACAGGCCGCGGCCTAAAATTTCGCCGCCAAGCACCAGGATAAGACCCAGTAGTAACCCAA [...]
+GGGTGGTGACTGGCAGGAGAATAACGGCGTCTGGCATCAGAATGTCTTTGCCTATTATCTCTCCATTTCGTGCAACCATTGTGCCGACCCGGCATGTACCAAAGTCTGTCCGAGCGGAGCAATGCATAAAAGGGAAGATGGTTTTGTCGTGGTGAATGAGGAGGTCTGTATTGGCTGTCGCTATTGCCATATGGCCTGTCCATATGGCGCGCCACAGTACAACGCCGCCAAAGGTCATATGACCAAGTGCGACGGCTGTTACGACCGGGTGGCGGAAGGCAAAAAACCTATCTGCGTCGAATCCTGTCCGCTGCGAGCGCTGGACTTTGGTCCTATCGACGAGCTGCGCAAAAAACATGGCGATCTGGCGGCGGTAGCGCCATTGCCGGGTGCGCACTTCACCAAACCGAGCATAGTGATTAAACCCAATGCCAATGCACGTCCGTGTGGCGATACCACTGGCTATCTGGCCAATCCGAAGGAGGTGTAAAA [...]
+NODE 263 91 9317 5660 0 0
+GTCCTTGCAGGCCAGTTCGCAGGTTTTGCAACCGGTGCAACGGCTGGAATCAATAAAAAATCCATACTGGGTTGTCATCGGTTACTCCTTA
+GTTGCACCGGTTGCAAAACCTGCGAACTGGCCTGCAAGGACTACAAAGATTTGACCCCGGATGTCAGCTTCCGCCGCATTTATGAGTATGC
+NODE 264 11828 653890 638418 0 0
+CTACGCCGGTAAACACCTGGTTGACATGCTGCGGCTGTACCTGACGCGAGATTTCGCTCACCATCGCCGACTGGTTAGGATCGCCTGCCCCCAGTCCGACGGAGAGCGCATTGTCGATAAGCGCCGCATATTCACGCATATCCGCGACTGCGCTTGCCACATCCGGATAGTTTTTGGAGAGCACGCCAACCAGCACATGACCTTCCGCCGCCGCGTAGATTTCCCGGGCGTTATCTTTCGAACCGGCCAGCACGTTCAGGCAAACGCGATCGCGGTAAAAGTTAGGGGTCAGTTTCATGCTTGTTTCTCCTGATTAATCACCTCGCCAATACGACGCGCCACAATCGCTAACTGCGCGCGATCGACGCTGCGGACATCCGCTTCAATAATCCCTTCGTTGGCTTTGTATCCGCGAAAGTAAATCGCGTATTCCCCTTGCTTCAGCGCGTCGACCAAGTCGCCAGTGGCGATGCCGACAACGGCTTCATCAAA [...]
+TGAGAAAAGTGAAAGAGAAGGGGGTGACGCTGCAGGTTGCCTTTAATCGCCGTTTTGATCCTCAGTTTCACGAGGTCTTTGAGCTGGTGCGCAGCGGCAAGATTGGTCGGCCCCAGATGATAAAAATCACCTCCCGCGATCCGGACCTGCTACCCCATGATCTGATCAAACGTATTGGCGGCCTGATTTTTGACTTCACCATGCATGACTTTGATATGGCTCGTTTTATGATGCAGGATGAAGTCAGCGAAGTCTATGTTAAGGGCAATACGCTGATTGATCCCAGCCTGAAAAATATTGATGATGTTGATACGCTTGCGGTGATGCTGACTTTCAGAAACGGCGGCTACGCGCTCATTGATAACAGCCGTCGGGCGGTATATGGCTATGACCAACGGGTGGAGGTTTTTGGCTCAGAAGGGATGGCGTATGCGGATAACGTTAGTGAATCGACGGTGAAAGTTTTCAACAGCCAGCACTGCATAATGAAAA [...]
+NODE 265 2394 121564 120483 0 0
+GCGCATCATGGATGAACAGCAGCAGCAGGTGAAAGACGATATCGCACAACTGCTGAATAAAGACTGGCGGGCGGCGATTTCCAGCTGTGAACTGCTGCTTTCCGAAACGTCCGGTACGCTGCGCGAGTTGCAGGATACGCTGGAGGCGGCGGGCGATAAGCTGCAGGCTAACCTGCTGCGCATTCAGGATGCCACGATGACGCACGACGATCTGCATTTTGTCGACAGGCTGGTGTTTGACTTACAAAGTAAACTCGACCGCATTATCAGTTGGGGTCAGCAGTCTATTGATTTATGGATCGGCTACGATCGTCACGTGCATAAATTTATCCGTACCGCGATCGATATGGATAAAAACCGTGTCTTCGCCCAGCGGTTGCGCCAGTCCGTGCAGACTTATTTTGACGATCCGTGGGCGCTAACCTACGCGAATGCCGATCGTCTGCTGGATATGCGCGATGAAGAGATGGCGTTGCGTGACGATGAAGTCAC [...]
+CTGATCAAGGTGAACTCGACGCTCATTGGCGTGGCGCATATAATCCGCCGCCACATAATCGGTGGCTTCGCTGATCAAATGCTTAAACAGATCGCGATCGGATTGGGTAACACGAATCGCTTCCAGCGTGAGTCGGTTCTCGCGCAGCGCCGCTTCCATATCCTGGAACGCCTTGCGCACGCCGCTGTTTTCCGGCAATAAATAATCGCGTAGCGATCGGGTAATGGCGCTGGAGATCCCGCCGTACAGCGAGGCCTCTATCAAACGATAGAATTTACTACGATCGGAAGCGGAACGCAGACGACGGGCGATAATCCCTAAGTCAAACATCAGCGAATGATAATCGGTGATGGAGTTAAACTGCTTAAACTGCACGCCTTCCATCTCGTCAAGCTTGTCTTTCAGCTCAGCAAGCGACAGTACGCGCGCCTGACGTTCGTTTAATGTCTCCGTCACCAGTTGTGTCGGCTGTACCGACATCGGCAGCCCCTG [...]
+NODE 266 1361 88352 88284 0 0
+TATGAATAGCGTGGGTGATATCGACAATTTGATAGCTTTTGTCTTTCAACCAGGCGTTGACGGCGCTCTGTACCATAACGCCCATCGTTACCAGCAGCACAATGATCAGCAATAAGAAGAAACGGGTAATGCTTCCCGGTAGAAGGGAGAATCGGGTAGAGACCGTTGTGTCAGACTGACTCATTTATGTTTACGACCTGTAAAAGCAACGCTGAAGGTGAAGGGCAGTATAAAGGGTAATGAATGAATTTCCAGACTCTTACGTCATGCCGGGCAACTTAACACGCGCTCCGTCGGCGGGACGGGAAAAGCGTACAACCTTCGCAGAACGGTACAAATATAAAGACTACTTATAAATGTTTAGCACTAAATATCAAGAAATTATTTGCTAATGTCTTACGAACGGTAGAGCAGCGAGGGTAGTGAATAACCGTGATAATTTTAGGCAGGTAGCATAAATCAGCCGGGTGTGTCTGAAAAAGGGTAAAAAAA [...]
+CGCCGCCGAACTCCGGCAGAACGTCGGTCCAGGAGGTCACATCATAGGTTACGCCGTAGTTACGACCATAATCGAAGGAACCTGCGTCAGCGAATTTCAGACCCGCAAACGCCACACGCGTCCAGGAGTCGTTGCTGCCTTCAGTCTGGTTGCCCTGAATCTGATATTCCCACTGGCCATAACCGGTCAGTTGATCGTTAACCTGCGTTTCGCCTTTGAAGCCGATACGCATGTAGGTCTGGTCGCCGTCGCTGCCTTTGTCGTCAGAGAAGTAGTGCAGGCCATCAACTTTACCAAACAGGTCTAATTTGTTGCCGTCTTTATTATAAATTTCAGCCGCATTCGCTGCGCCCGCCACCAGCAGAGCTGGTACCAGGAGGGACAGTACTTTAACTTTCATGTTATTAACCCTCTGTTATATGCCTTTATTGCTTTTTTATGCCACTGCTTACTGGTTAACCCTCATTAACCAGTCGGCAAGTCCATTCTCCG [...]
+NODE 267 228 3012 3012 0 0
+TCCCGGCGTCTGCGCCGTTGCCTGCTGCCAGGCCCTCACCTGCGGATAGCTGCCGGTCAGGGCGTAGCTGCCGGCGCCGACCGCCAGCGCAATGACGGCCCCCGGCACGTAAACGCCCCACCCGGCGCGCGCGCCGCAAACCGGGGTGTCCGCCGGCAGCGGCTCCCGGCGCAGGCGTACCCGCCGGCGCGTGCGGGCGACGATTATCCACCCGCCCGCCACGATGGC
+ACGCCTGCGCCGGGAGCCGCTGCCGGCGGACACCCCGGTTTGCGGCGCGCGCGCCGGGTGGGGCGTTTACGTGCCGGGGGCCGTCATTGCGCTGGCGGTCGGCGCCGGCAGCTACGCCCTGACCGGCAGCTATCCGCAGGTGAGGGCCTGGCAGCAGGCAACGGCGCAGACGCCGGGACTGCTGGCGCGGGCGCTGGACCCGCAGGCGCAGCCGCTGAATGAGGAGGA
+NODE 268 136 7789 7789 0 0
+CTTGTCGATTAGCCGGTTATTACGGCTTTCAGCAATAGCCAACGCATTATCCAGTGCCTTTTTGACTGCGCCAGAACGATACCTTCACGCCGGAGTGGCAGTTTGTTGAGGTATAGGGAGTTTCAGACTGTACGCG
+GAAGGTATCGTTCTGGCGCAGTCAAAAAGGCACTGGATAATGCGTTGGCTATTGCTGAAAGCCGTAATAACCGGCTAATCGACAAGCCGGATCTGAAAAGCGCGATGGACTACTGGCACAACCAGGCGGCGCGTAT
+NODE 269 14 1496 1496 0 0
+GTACAGGCTGCCTG
+TGCCACTCCGGCGT
+NODE 270 3305 173104 171108 0 0
+CGTGAGCAGTGGATTCTCCGGGGCGTCAGCCCCCCTCGGTATCGATCTTTTTCTCCTCTTTCTTGCTGACAGCGGCCCCAAAAAAGGCGTGTCAGATTCGGAAATGAGCGCCGGAACCCCAAAAACAGGGGCATGGCGCGGTGTGGTGGTTGTGCGTCACTTTGTCGCTCTGCGCGACGAAAGTGACGCACTGGTCGGGTGCAGTGCGTGAAAGATCGCGGATTCTGGTGCAGTTTTACGGTCACGCGGCAGCAAATGCCTTGCGGCAAATGCAGGCCGCAGCCCGTAAAAGTTAAAGGCGCTGGTAGTCAGCAGAAGTGAGTCAGCCGGATAGTTTCGGCAACGTTAATGCATCAGCCAGTAAGGGCCGACGGCGTAAGGTGGTGGCGGTGGATCTGTCTTGTGTAGGAACTTCTGGCCTCTGGCGCAGATGCTTTTGCGTCCCGGTGTTTTCAGAGGTATGCACCGGTAAAGGGAGGTTTAGCCATACTG [...]
+AGTGCGTGAAGGGGCCGATCCTGCCGCTGATAAGAAGATTGCTCAGCAGAAAAAGAAAAACGGACATACCTTCCGCCAGATCGCCATGAACTGGCACGCCGATCACCGACGCTGGTCTGAACATTATGCGATGACCATCCGGCGCAGGCTGGAAATGTATGTTTTCCCGGATATCGGGGACAAATTCATCGATCAGATCGTCACGGAAGATTTGCTGTTTACCTTGCGCAAGGTCGAGAGCAAAGGCTTTCTGGAGATCACCGCACGGCTGAAAAACTACGTCACGGAGATCATGCGCTATGCGGTGAAAAAGCAGCTAATCAAATCAAACCCGGCGCTGGATCTGGACGGTGAATTTACGCCGCCGGAAACGCAGCATTACCCGGCCCTGCCCCTTGAGAAGCTGCCTGAACTGTTATCCCGGACGGATAGCTACCCCGGCAGGCTGCTGACACGCTATGCCCTTAAATTATCGCTGCTGTTTTTCGTGCG [...]
+NODE 271 2930 143168 142115 0 0
+AAGCTGCATTTATGTCTGTTTGGCGACGGCGGCGTAAGTTTACGCGACCTGTTACAGGATGATGCGCAGCAATACGCGCTTGAGGAACGTATTTCCGACGCGTTGCGGGAGAAAAAGCAGACCCACTTCCTTCATCAGAGCAATACTGGTATTACGCAAAATTTATCTTACATTGGCGGTTAATCCTTAATAAGGAGATTTCAGATGAGTCAGGTCAGCGCTGAATTTATCCCGACCCGCATCGCTATTCTTACTGTTTCCAGCCGACGCGGCGAAGAAGACGACACCTCCGGTCATTATCTGCGTGATTCGGCGCAGGAGGCCGGGCATGAAGTGGTGGCGAAAGCCATCGTTAAAGAGAACCGTTACGCGATTCGCGCCCAGGTTTCCGCCTGGATCGCCAGTGATGAGGTGCAGGTCGTATTGATAACTGGCGGGACCGGTTTGACCGAAGGCGATCAGGCGCCGGAAGCGCTGTTGCCGCTGTTCGAT [...]
+AACGCAGTATACCAATAGGTAAGGGATAACATTGTCGCGGGAATAAATGCTATTTGTCGTATACGTATTGCAGCCAGAGGTCCCACTTGTCATTTATCACTCTTCACATGATCACGGTGATAAGAATGGCAAGCGCAGGAAAACATTTCTAAGATATTTATGCTGTTTCGCCCTAAATATAGTCCTAAAAAAATCCTGGCGCAGGGCCAGGATTTTAAGAGATCGCTATAATTAGCGGCGATTACCAAAAATACGCAGTAACATCAGGAACAGGTTGATAAAGTCCAGGTACAGCGTTAACGCGCCGAGAATCGAATATTTACGCAGATTAGCGCTATCGCGGGTATCTATTTGCTCGCCGATATTTTTCAGTTTCTGCGTGTCATAGGCGGTCAGACCGACAAACACCACCACCCCGATATAGGTTACCGCCCACATCAGCGCTTCACTCTTCAGCCAGAAATTGACCAGCGACGCCAGAACGATACCAAT [...]
+NODE 272 51 3104 3104 0 0
+TTTTGATAACCCACGTTCAACCTGTTGTTGTTTTGTGGATATCAGCACTTT
+AAATGAGTATACAACGTTAACCATATAATGCCGGCGGTACACCATAGTCCC
+NODE 273 65 4273 4273 0 0
+ACCCCAGACCAAGCAAAAGTGCTGATATCCACAAAACAACAACAGGTTGAACGTGGGTTATCAAA
+TGCTTGGTCTGGGGTATGGGGCCATTACCTGTCTTTCCCGCTTTGGCACTGTTGTCACAACGTTG
+NODE 274 2345 110262 109332 0 0
+GTACCTATGTTGAGGAGGTGACCGACTACGTGCTGATGATGAAAATCGACGAACAAAATATGGAAGGCGGTAATTCGCTGCTGCTGCACCTTGATGACTGGGAACATCTGGAGTCGTTTTTTACCCATCCGCTGGCGCGTCGCGTCATGCGCTGGGCGGCGCCGCCAAGCAAGAATGTTAGCCATGACGTCTGGCACCCGGTGTTTGATGTCGACCAACAAGGCCGCCCGGTCATGCGTTATATCGACCAGTTCGTCCAGCCAAAAGACTTTGAAGAAGGCGTCTGGCTCAGCGAGCTTTCAGACGCGCTGGAAACCAGTCAAAACATCCTCTCCGTACCGGTACCGGTCGGCAAATTCCTGTTGATTAACAATCTGTTCTGGCTACATGGACGCGATCGTTTTACGCCGCATCCTGACTTGCGTCGCGAACTGATGCGCCAGCGCGGTTACTTCGCCTACGCCGCCAGCCATTATCAAACTCACCAATAAG [...]
+GATCATTGCCGAGGGAAAGTTCCACGGGGTAATCGCGGCGGTGACGCCGATGGGCTGTTTAATCACCAGCAGCCGTTTATCGGCCTGATGACCTGGAATCGTGTCGCCATAGATACGCTTCCCCTCTTCGGCGAACCATTCAATAAACGAGGCGGCGTAGCTAATTTCGCCTTTCGCTTCCGCCAGCGGTTTGCCCTGTTCCAGCGTCATCAGACGCGCCAAATCGTCCTGATGTTCCATCATCAGATTGAACCAGCGACGCAGGATATTGGCTCGCTCTTTAGCAGTGAGCGCGCGCCAGGCGGGCAGGGCGCGATTGGCGGCGTTGATGGCGTCGCGCGTCTCTTCCGCCCCCATTTTGGGCACATTGCCAAGCGGTTTCCCGTTGGCGGGGTTGCTCACGGGGATGACATCGCCGCCGCGCGCGTCGCGCCAGTCGCCATCGATAAAGGCCTGCTGGCGGAACAGGGTAGAGTCGTTAAGTTGCATAAT [...]
+NODE 275 530 22135 21969 0 0
+CTGGATTTAACGGTATCAGAAACCGCGTTGACGCCTTTTGAGTCATGGTTAAAGCCCGCTCGCCAGTTGGCGGATGTCTTATTTCCCCGCACGGTTCTCAACGACCGGCTTCATACGTTTAGCACCTATGAACGTATGTGCACCGCGCTGACCGCCGCTCAGGTATTTGGGGTTCAGCGTTTGTGCCGCCATTATGCCGCGCGTCTGGCGCCGCTACCTGGCCCTGACGCCTCAAGAGAGAGCAATCAACGGCTGGCGCAAATTACGCAATACGCTCGTCAGCTTGCCGGCTCCCCCTCCGTTATCAATACGCGGGCCCGCGAACAGCTTGCAGAGGTGGGATTAACCGCCCGGGATACCGTACTCATCAATCAGATCATTGGGTTTATCGGTTTTCAGGCGCGGGTAGCGACGATATTTCAGGCGTTTTGCCGTCTGCCCGTGCGCGAACTGCCCGGCCAGGAGATGCAGCGCTTTGCCAGGGCCGCGCGG [...]
+GGCAAAGCGCTGCATCTCCTGGCCGGGCAGTTCGCGCACGGGCAGACGGCAAAACGCCTGAAATATCGTCGCTACCCGCGCCTGAAAACCGATAAACCCAATGATCTGATTGATGAGTACGGTATCCCGGGCGGTTAATCCCACCTCTGCAAGCTGTTCGCGGGCCCGCGTATTGATAACGGAGGGGGAGCCGGCAAGCTGACGAGCGTATTGCGTAATTTGCGCCAGCCGTTGATTGCTCTCTCTTGAGGCGTCAGGGCCAGGTAGCGGCGCCAGACGCGCGGCATAATGGCGGCACAAACGCTGAACCCCAAATACCTGAGCGGCGGTCAGCGCGGTGCACATACGTTCATAGGTGCTAAACGTATGAAGCCGGTCGTTGAGAACCGTGCGGGGAAATAAGACATCCGCCAACTGGCGAGCGGGCTTTAACCATGACTCAAAAGGCGTCAACGCGGTTTCTGATACCGTTAAATCCAGTAAAAAACGATC [...]
+NODE 276 2441 113208 111462 0 0
+AAGATTACTGTGTGACGGATTACCTTTCGCCAGTGGGGAAGGCCGGTGCGACGTCAGAATGTTAATGGAGCCGCCGCGATCGATTTTGTCGCCAAACATGTCGGCATTTAACCAGGCGCCCTGGCCGATAGCGGTGACGCCAGGCAATATGCGCGGCGTGACTTTTGCCGGAATGAGCATCTCTCCGTTCTGGTTAAAGACCCGCACGGTGTCGCCGTGCTGAATGCCGCGTGCTTGCGCATCAATCGGGTTGATCCAGATCTCCTGCGGACATGCCTGTTGCAGGACGTCGATATTGCCGTAGCTGGAGTGGGTACGCGCTTTATAGTGGAAGCCGGTTAGCTGTAGCGGGTAGCGCTGACGAAGCGGATCGTCCCAACCGTCAAAGCCTGGCGTATAGGCGGGTAAAGGATGGATAATCTCATCTTTCTTCAGCTCCCATGTGTCGGCGAGGGTTGCCAGACGCTCGGAATAGATTTCGATTTTACCGGA [...]
+TTAATGGCGGCCAGTATCAGCCGACGAAGCCTGGTAAAAACCTCCGCTATCGGTAGCCTTGCGCTTGCCAGTAGCGCTTTCACCCTTCCATTCTCCCGCATCGCCCACGCCGCAGCAGGCCTCGCATCTGGCAATGTGGCAGAAAAAGCGGTCTGGAGTTCATGTACCGTTAACTGCGGCAGCCGCTGTCTGCTACGCCTGCACGTAAAAGATGACACCGTATATTGGGTTGAGTCGGATACCACGGGCAACGATGAATATGGCAACCATCAGGTACGCGCCTGCCTGCGCGGTCGTTCTATTCGTCGCCGGATGAATCATCCCGATCGCCTGAAATATCCGATGAAACGCGTTGGTAAACGAGGAGAAGGCAAATTCGAACGTATCAGTTGGGATGAAGCGTTGGATACCATCGGCGATAACCTGAAACGTATCCTCAAGGACTACGGCAACGAAGCGGTACATGTCCTTTACGGTACCGGCGTGGACGGC [...]
+NODE 277 50 2787 2749 0 0
+CTTCCGGAGCCGGTGCCGGTGCCGGAGCGACTACCGGAGCAGCTTCTTGC
+TACAGACCAAGCACTTCACTCTGAAGTCTGACGTACTGTTCAACTTCAAC
+NODE 278 14 789 756 0 0
+TGGCCGAAACGGTA
+ACCGGCTCCGGAAG
+NODE 279 2457 141656 139574 0 0
+TTTAAAGCAGCGAGTTCAGTCACTGGAAACACGTCCGGACAGCAAAGAACCTCTGGTTGTTCAACAAATTGGTTTGCTCATTGCCTTACTGCCCGAGATTGGACGCTTGCAACGGCAAATTTCACCGCCGACTTCTACATTAATTACCCAGCCGTAAGCGAATGAGCCCAGTCGGCAAGCTCCTGGCGACGACTCGCCGGGAGCGCCGCTTCATGTACGCCGACAATTGCGCCTTCCAGGGCATACAAAACTTTCACCGTCAGCAAGGGATTGCTTTGTCGCAACCTTAGCCAGCACATTTTCGCGCCCAGTATGCGTAACATATTTTCGTCCTTTATCCCTGACTCATTGAGCAATGTTTCCAGATGGAAGGTCATATTGGGGAGATCTTTGAGTCTGTGCTGTAAAATACGGCTGTGTTTTTCCTTCATTGCCGCGTCAAGAGAATACTTCGATAAACGCACCAGCTGCTGCTGATCGCGCCACAGGCTT [...]
+GGAAACACCTACGCTCAGCAGGCCGTTGTCCGGACGGGTGCCGATGGTGTTGGCATCACCGATGTTGTTAGTCCACTGGTATTCCAGACGGGTTGCGATTTCAGGGGTGATAGCATACTCGATACCGCCCGCGAATACCGGGGAAACGCCGGTGTCGTGGTCTTTAGTAGACGGGCCGCCAGGGACGTTAGACTTGGTGTCTGCACGCCATACCATACCACCCAGACGGGTATAAACGTCCAGATCGTCAGTGATTGGATAACCCAGTTTAGCGGTCAACTGAACGCCCTGAGCTTTATAAGCGCCATTGATGTTGTCGCCTTTGTACGGCATACGGCCTAACCAGTCGTAGCCCATTTCAAAGCCAACGTACGGGTTAACCTGGTAACCACCAAAAGCACCTGCGCCCAGTTGGTTTTCATGAGTCGGGCCATCATTGTTAATGAAGCCGGTGTCATGGTACTGAGACCAGCCCAGTTTAGCACCAGCGTA [...]
+NODE 280 150 10107 10107 0 0
+GGTTAATAAGAATTACTTGTCTTTCCAGTGCACTTTGGCGTCTTTAATAAAGGACAGCGTCACCATAATGTTGACGAAGAACAGCGGACATCCTCCGGCGATAATCGCGGTCTGAATCGGCTTCAACCCACCCAGCGCCAGCAGAACGAT
+CGCCGGAGGATGTCCGCTGTTCTTCGTCAACATTATGGTGACGCTGTCCTTTATTAAAGACGCCAAAGTGCACTGGAAAGACAAGTAATTCTTATTAACCCAATTGATCAAGAGGCTGAAAGATGGATTTCAACTTAAATGACGAACAGG
+NODE 281 13 629 629 0 0
+ACCGATGATGCCG
+AGACCGCGATTAT
+NODE 282 6 257 257 0 0
+ACCAGC
+CGATTC
+NODE 283 32 1038 992 0 0
+ACCGACCAGCCGATACGCACTAACAGAGGCGG
+TATCGTTCTGCTGGCGCTGGGTGGGTTGAAGC
+NODE 284 12675 614975 605272 0 0
+TATCCTGGCGCAGGTGCCTGCGGGTCGCCTCGGCGGCGCTCAGGAAATCGCCAGTGCGGTTGCATTTTTAGCCTCTGACGAAGCGAGTTACATCACTGGTGAGACTCTGCACGTCAACGGCGGAATGTACATGGTTTAATCACGATTGAAAAATATTTGCGTTATTAGGGCGAAAGGCCGCAAAATAACGTAAAATCGTGGTAAGACCTGCCGGGATTTAGTTGCAAATTTTTCAACATTTTATACACTACGAAAACCATCGCGAAAGCGAGTTTTGATAGGAAATTTAAGAGTATGAGCACTATCGAAGAACGCGTTAAGAAAATTATCGGCGAACAGCTGGGCGTTAAGCAGGAAGAAGTAACCAACAATGCTTCTTTCGTTGAAGACCTGGGCGCAGATTCTCTTGACACCGTTGAGCTGGTAATGGCTCTGGAAGAAGAGTTTGATACTGAGATTCCGGACGAAGAAGCTGAGAAAATCACCACCGTT [...]
+GTCGATTCGCGCGCGCGCTGCATAAGCGTCTGCCAGTTGTCGGTGCTGGCGTTCATCCTCAACCCATACTGCCGCCAGCTCCAACGCAATATCGCCGTCGCCGGCATACTCCCAGTCAATCAGTCTCAACCCGGCGGACGTTAATACTATATTGTCGCCATGGACATCCATATGCAAAGGCGCGAGCCGCAGCGGGCGAGGTTCACCGTTTTTTTGCAACTGTTTGAGCCGCCGCAACCAAAACGGCGTACGCCTTGCCGGATCGCAACACGACCAGTACTGCGCCAATAGTGGCGATAGCGCGATACGCCAGCCAAAACGCGGCTGTTGATGCAAATGATACAGTAAGGCCGCCAGTTCGTCGGCATCTGGCAGAGCGGAATTTACCACACCATGCAGATATTCTACCGCCATCCAGCCTGGAGTATAAAAAAGCGCTCGCGGCGCAAGACTGGCCGGCAATTGGGATAAGGCGCGGTAATGACGTAAAAA [...]
+NODE 285 3811 211415 208278 0 0
+ATAGCGGTAGTTCCCCGGCAGTGATGGTCACTCACTATGGAGATCGCGAATGGTAATGTCCGCACCAGGACACATTGTTTACAGTAGTTACAACACCCTGTACGGACATTCTCTCTCCGGTGGTGGTCTTGTCACCTTAAAAGCTCTCATCATTTCTCTTACTGTCCATACCCATGACGTCATATGTGGTGCGCGTAGCCGTGTGTGGCGTCGTTTCAAAAAGCAAGCTAAGGCTTACAAGGAAGCCAACCCTCAGATGTGTGTGCGCATAATCGCGTTCAAGAGAACGCGGGTGATGTATACCTACAACTCAAGGTGCTATCCATGGGAAGACAAAAAGCAGTGATCAAAGCTCGTCGTGAAGCAAAGCGTGTGTTGAGACGAGATTCGCGTAGTCATAAGCAACGTGAAGAAGAATCGGTCACGTCACTGGTACAGATGGGCGGAGTAGAAGCCATTGGCATGGCGCGCGATAGTCGCGATACCTCTCCT [...]
+GTGGTGGCCGGGTTCCTGGTTGGGCGGCTGGGGTCAGTGTATTTGCTACTACGTTAAGCTCAATTACATTTATGTCAATTCCTGCCAAAGCGTTTACTTCCGACTGGACGTTTATCATTGGTCAGTATCTGGCTATCGCAATTTTACCGCTGGTTTTTTATTTCTATATTCCGTTTTTTCGGAAATTGAAAGTCACATCAGCCTATGAATATCTCGAAGCACGGTTCGATGTGCGCTGCCGTCTATTCGCCAGCATGTCATTTATGTTGTTTCATATCGGACGTATCGCCATTATCACTTTCCTCACCGTGCTGGCCTTGCGCCCCTTCATCGCTATAGACCCGGTGATTTTGGTACTGTTGATTAGCGTGATGTGTATCATTTATACCTGGATGGGGGGAATTGAAGGAGTAATATGGACTGATGTTATTCAAGGCCTCTTACTTTCTGGCAGCGCGATACTGATTTTTATAGTGATATGTCTCAAAGTCC [...]
+NODE 286 894 86383 80380 0 0
+CGATACCCCGACCCGCCACTACGCACACGTAGACTGCCCGGGGCACGCCGACTATGTTAAAAACATGATCACCGGTGCTGCGCAGATGGACGGCGCGATCCTGGTTGTTGCTGCGACTGACGGCCCGATGCCGCAGACCCGTGAGCACATCCTGCTGGGTCGTCAGGTAGGCGTTCCGTACATCATCGTGTTCCTGAACAAATGCGACATGGTTGATGACGAAGAGCTGCTGGAACTGGTTGAAATGGAAGTTCGTGAACTTCTGTCTCAGTACGACTTCCCGGGCGACGACACGCCGATCGTTCGTGGTTCTGCTCTGAAAGCGCTGGAAGGCGACGCAGAGTGGGAAGCGAAAATCATCGAACTGGCTGGCTTCCTGGATTCTTACATTCCGGAACCAGAGCGTGCGATTGACAAGCCGTTCCTGCTGCCGATCGAAGACGTATTCTCCATCTCCGGTCGTGGTACCGTTGTTACCGGTCGTGTAGAACG [...]
+TACCATCTCTACGCCTTCCGGCAGTTCGATGGTACCAGTCACGTCAGTAGTACGGAAGTAGAACTGCGGACGGTAGCCTTTGAAGAACGGAGTATGACGGCCGCCTTCATCTTTGGACAGAATGTACACTTCAGATTCGAACTTGGTGTGCGGCTTGATGGTGCCCGGCTTAGCCAGTACCTGACCACGTTCGATTTCTTCACGTTTGATACCACGCAGCAGAACACCTACGTTCTCACCGGCACGGCCTTCGTCCAGCAGTTTGCGGAACATTTCAACGCCAGTACAGGTAGACTTCTGAGTCTCTTTGATACCAACGATTTCAACTTCTTCGCCCACTTTGATGATACCGCGTTCTACACGACCGGTAACAACGGTACCACGACCGGAGATGGAGAATACGTCTTCGATCGGCAGCAGGAACGGCTTGTCAATCGCACGCTCTGGTTCCGGAATGTAAGAATCCAGGAAGCCAGCCAGTTCGATGATTTT [...]
+NODE 287 8114 425442 422156 0 0
+TAAGCCAGTGGTGATCCCGCCCTATCACGCTGAGCAGGAAGAGATTGCCATTGAGGCGAAAGATCTGACCATGCGCTTCGGTAAGTTCGTCGCGGTTGACCATGTTAATTTCCGCATTCCGCGCGGCGAGATTTTTGGCTTCCTCGGTTCAAACGGTTGCGGCAAATCGACCACCATGAAAATGCTGACCGGTCTGCTTCCCGCCAGCGAAGGCCAGGCCTGGCTATTTGGCCAGCCGGTAGACCCGAACGACATCGATACCCGTCGCCGGGTCGGGTATATGTCGCAGGCATTTTCGCTCTATAACGAACTCACCGTGCGGCAGAATCTGGAACTTCATGCCCGCCTGTTTCATATTCCGCCAGCGGAGATCCCGGCGCGCGTCGCGCAGATGATCGAACGCTTTATGCTAACGGAGGTGGAAGATACGCTCCCCGCTTCGTTGCCGCTCGGTATCCGCCAGCGTTTATCGCTGGCGGTAGCGGTGATCCA [...]
+ATGCGGCGGTTCTTTATTGGGTTCCCTCACCCCATCCAACAAAAAGGTCACAATATGACTCCGTTTACACAATCACAGCGCGTAAAAGCGTTGTTCTGGCTATCGCTATTCCATTTACTGGTGATCATTTCCAGTAACTATCTGGTGCAGCTCCCCATCACTATTTTTGGTTTCCACACGACCTGGGGCGCGTTTAGTTTTCCTTTTATTTTTCTCGCCACCGATCTTACCGTGCGTATTTTTGGCGCACCGCTGGCGCGCCGCATTATCTTCGCCGTCATGATCCCCGCGCTGCTGGTGTCGTATGTGGTGTCATCGCTGTTCTATATGGGCGCCTGGCAAGGTTTCGCCGCGCTGGCGAACTTTAATCTGTTTGTCGCCCGTATCGCCGCCGCCAGCTTTATGGCCTACGCGCTGGGACAGATCCTTGATGTCCATGTGTTTAACCGCCTGCGCCAAAATCGTCGCTGGTGGCTGGCGCCGACCGCTTCA [...]
+NODE 288 2514 120907 120224 0 0
+CACGCGACCGGGTCAGCCTGCCCGACCTTTTTTTGGTCGTCGGCCCACCGCACGATACGATTTTGCTGGTAGTCGCGCTTCACGCTTGCCGCAATCCCGGCGGCATCCAGCCCTTCGCACTGCGGAAACTTAACCGATTTACTCTCGGTGGATGCCGCAAATACCGATACGCTGGCGGATAACAGCAGCAGGCTCAACAACGCTCCTCTTTTATTCATACTTTTCTCCTTAGCACAATGATTCAGGAAAAGCATGGTACAAAACGCCGGGAGCGCAAGTGTGGGTTCAGGCGGCTTGCTTTTTCGTTTTACTCGCGGCGTCCTTTTCAACCGCCTGCGGAGAAGGCAACTTACCGGTTTTGAGGATAGTGCTTAGCACCTCTTTATGTTCCGCCAGCCACAGCGACAACGCCTCGCGCTGCCCATCTTCCAGCACGACTGGCGACTGCTCAAGCCAGGTATCAAGAAGATCGGCAGTATCGAGCATTTTGTC [...]
+GATGCTATTCGCGCTATCGCTAAAGAAGTACCGGAAGCGATTGTCGGCGCCGGAACCGTTCTCAATCCGCAGCAGTTGGCGGAGGTGACGGAAGCGGGCGCGCAGTTTGCGATTAGCCCGGGACTGACTGAGCCACTGCTGAAAGCCGCGACGGCAGGCACTATCCCATTGATTCCCGGTATTAGCACCGTTTCTGAACTGATGTTGGGCATGGACTATGGTCTGAAAGAGTTCAAATTCTTCCCGGCGGAAGCGAATGGCGGCACTAAAGCGTTGCAGGCGATTGCCGGTCCGTTCTCTCAGGTACGTTTCTGCCCAACCGGCGGCATCTCTCCGGCAAACTATCGTGACTATCTGGCGCTGAAAAGCGTGTTGTGCATCGGCGGTTCCTGGCTGGTGCCGGCCGACGCGCTGGAAGCGGGTGATTACGATCGCATCACCAAACTGGCGCGCGAAGCGGTAGAAGGCGCGAAGCAGTAAGCCGTTAAATGC [...]
+NODE 289 90 4499 4499 0 0
+ACTACTTTATGTAGTCTCCGCCGTGTAGATAAGAAATTGAGAAGTGGGTGATTAGCTCAGCTGGGAGAGCACCTCCCTTACAAGGAGGGG
+TCAATTTCTTATCTACACGGCGGAGACTACATAAAGTAGTTGGTGGGTGATGACGGGATCGAACCGCCGACCCCCTCCTTGTAAGGGAGG
+NODE 290 83 5285 5213 0 0
+GGTACTTCACAATAAGAAATTTAGCTGGCGAGAAAGTGGTGGGTGATGACGGGATCGAACCGCCGACCCCCTCCTTGTAAGGG
+TCTCGCCAGCTAAATTTCTTATTGTGAAGTACCGAAGTGGGTGATTAGCTCAGCTGGGAGAGCACCTCCCTTACAAGGAGGGG
+NODE 291 5 541 541 0 0
+ACTTC
+GTCGG
+NODE 292 88 3900 3900 0 0
+GGGCGTGACCGGCTCCGGGAAGACATTCACCATCGCCAACGTCATTGCGGACTTGCAGCGGCCAACGATGGTGCTTGCGCCCAATAAA
+TGGCGATGGTGAATGTCTTCCCGGAGCCGGTCACGCCCAATAACGTCTGATGCGCCAGCCCGTCCTCCAGCCCCTCTTCCAGACGACG
+NODE 293 7556 428848 426004 0 0
+GGAAATCATTATTCAGGCGAAAGGTAAACCCGCGTTTCGTGACAAAAATCTGCCAGGCTTTTCTATCTCCTACGCCGGAAATATGGTTGGCGTGGCGTTGACCACCGAAGGAGAGTGCGGGCTGGATATGGAATTACAGCGCACCTCCCGCGGCTTTCACCATCCGCATTCGCTCGAACGCCACCCTTTCTCCCGTAATGAAAACTTATGGGTAGCCAATCAAAACGATCCCAACGAAGCGCGGGCGCAACTCATTACATTGCGCCAGAGCGTGTTAAAACTCACCGGCGATGTCATGAATGACGATCCGCGGGAGCTGCAACTTTTACCCGTTGCCGGACGCCTGAAGTGCGCGCATGTCACGCAGCTTGAAGCCGTGTGCGATGCGGAAGATGTACTGGTATGGTCCGTAACCGTTACGCCAGCGATAGAAAAATTAAAAGTGTGGGAGTTCGATGGCAAACTGGGCTGGAAAAGCCTGCCCGATATCCA [...]
+TCAGTTTCGGCATTGCCCTGTTTTTAACCGAGCTGGCGCCAGGCTGGCTAAAGCGTCCGCTCGGCATCGCCATTGAGCTGCTGGCGGCGATCCCCAGTATCGTGTACGGCATGTGGGGGCTGTTTATCTTCGCGCCGCTGTTTGCGACGTACTTCCAGGAGCCGGTCGGCAATATTCTTTCCAACATTCCGTTTGTCGGCGCGCTGTTCTCCGGCCCGGCGTTTGGTATCGGCATTCTGGCGGCGGGCGTCATCCTCGCCATCATGATCATCCCCTACATTGCGGCGGTTATGCGCGACGTCTTCGAGCAAACGCCGGTAATGATGAAAGAGTCCGCTTACGGTATAGGCTGTACTACCTGGGAAGTTATCTGGCGCATCGTGCTACCGTTCACCAAAAATGGCGTGATCGGCGGCATTATGCTGGGGCTGGGCCGTGCTCTGGGTGAAACGATGGCGGTCACTTTTATCATCGGCAATACCTACCAGCTCG [...]
+NODE 294 2959 138904 138027 0 0
+TGCGTGTGACGTTATTCCTCTTCGTCGTGGGTAGGCTGTTCTTTAACAATCCGAACCAGATCGACACGGTAGTCGTTGGCCTCGACAATGGTGATCCGCAGTGGCGGAACATCAATGACATCGCCTACACGAGGAATATGGCCATTAGCGGCGATCACTAACCCCGCGACCGTCGCAATATCGCCCTCTTCGTTCACCAGATGGTCAACTTCCAGCGCCTGCTGTAGCGCATGGAGATCGGTGCCGCCCTTCACTATCCAGCCCTCGGCATCGGCAACGATTTCCGGCGTTTCATCGGCATCCGGGAACTCACCGGCAATCGCTTCCAGCACATCCAGCGGCGTAACCAGCCCCTGCACCACGCCGAACTCGTTCGTGACGATAACGAAACTGCCGCGCGCGCGACGCAAAACGCCTAACAGATTGATAGGATCAAGCGTTTCCGGCACCACTATCGCCGGAGAAGACGCGGCGATAGCCGCAACGTCCGCG [...]
+GCTTCGATATCCTTTTCATCGACGGAAACGGCGTTGTTCACCTGCGTTTTACCTTGACGATAGGCCATACCGCCAATGTTCACGGAAGTGACTTTCACGCCGCCCTCAACGATGCGCTCGACGTCGGTAGGATTGGTAAACAGAAGCATCACGCGTTCACCGGCGTATTTCGGGTTATTGTAGACGCGAATCATCTTCGCGACGTCAACCACATGCGCCGTAACGCCCGGCGGCGCAACTTGCGTCAGCAGCGTTTTACGAACGGTATCCGCCGCCACTTCATCGCTCACAACAATAATACGGCTGACATTGGTCTCTTTGGTCCAGCGGGTAGCGACCTGACCGTGAATGAGGCGGTCATCAATACGGGCAAGCCCGATAACCATATAATCATTCGGGCCCATCGGTTTTGCTGGCGTGGCCGCTTTTGGCGCGGCGGCGACTGGCGCTGGCGCGGCTTTTTCTACCGGTTTTGCTTTCAGCGCTTTTACG [...]
+NODE 295 6443 362796 359962 0 0
+CGCCAGATGGCGATTTTCAGTTTGCCGATGCACCTGTTTCTCTCCTGGCCGCTGGATCGCGATCTTATCAACCATGTCACGCACGGGATGGTGGTTAAATCACTGGCGACCCAGCAGCTTAGCACCTTTGAAGTGTTGCGCTGGCAGCAGGAAACAAGCAGCCCGAATGAGCAAATTCGCCAGTTGGCGATCGATGAAATCGGCCTGATGCTTAAACGCTTTAGCCTTTCCGGCTGGCAGCCCATTTTGCTCAATAAAACATCACGCACCCACAAGAATAGCGTCTCACGCCATGCGCAGTTTTACGTAAGCCAGATGCTGGGATTTATTGCCGATAACTACGATCAGGCGCTCACCATTAACGACGTCGCGGAGCATGTCAAACTCAATGCTAATTACGCGATGGGAATATTCCAGCGGGTTATGCAATTGACGATGAAGCAGTACATCACGGCGATGCGCATCAATCACGTACGTGCCTTATTGAGCGAT [...]
+TGGGCTTAACGCTTTGATCAACTGTTTATTATTTCGAAATAGCGAGGCGTAATCTTTATAGAAAAAGGCGGCGACCAGAATAACTAATAAAATAGAGATCAGGACGCTGGCCAGGCGGTAAAGCCCGCTACGTAAGCGCGGCGTCGCCGGACGGATTTTGACCCAGAAGGCAATCACGGCTGCCAGAACGCCGCTTAATCCCAGCGTCAGCACCATTTGCGGCGTCATCAGCGCAAAGGTTTCCGCGGGCGTGGTATCCATCATATTGGCGATCATGGAGCGATCGATGATGATGCCGTAAGTCAAAATAAAATACTGCGCGGCAGCGCCGACCAGAATAAAAACGCAGGCCAGCAGTCGGTTTAGCCAAATAAATGAGGCCAGCGTCAGCACACTATTGACCACGCTAAACGCGACGACCGGCATGGAAATAAACACCAGCACATTGCGCAGCGAGTTTAACGGTAGGTCTTGTAGTACCTGCTTGTAGAA [...]
+NODE 296 7 3037 2920 0 0
+TAACGTC
+TAATACG
+NODE 297 4 1677 1270 0 0
+CGGT
+CAGC
+NODE 298 8 3213 1197 0 0
+TATTAACC
+CTCCGTGC
+NODE 299 1 391 222 0 0
+A
+A
+NODE 300 8 3054 1621 0 0
+CAACACCT
+ACCGGCTA
+NODE 301 15 5509 2984 0 0
+TCCTCCCCGCTGAAA
+ACCCGCAGAAGAAGC
+NODE 302 110 44969 42132 0 0
+ACCGCATAACGTCGCAAGACCAAAGAGGGGGACCTTCGGGCCTCTTGCCATCAGATGTGCCCAGATGGGATTAGCTTGTTGGTGAGGTAACGGCTCACCAAGGCGACGAT
+GCACATCTGATGGCAAGAGGCCCGAAGGTCCCCCTCTTTGGTCTTGCGACGTTATGCGGTATTAGCCACCGTTTCCAGTAGTTATCCCCCTCCATCAGGCAGTTTCCCAG
+NODE 303 10 3842 3069 0 0
+CCCTAGCTGG
+TCCCATCTGG
+NODE 304 7 2627 2128 0 0
+TCTGAGA
+AAGCTAA
+NODE 305 8003 426768 424284 0 0
+AAATAACCGCCGGCATTTAATTAGCTTTCACACTTAAGATAGCAATAGGAGAAGTACAATGGAGATTACCACTCTTCAGATTGTGCTGGTGTTCATCGTCGCATGTATCGCGGGTATGGAGTCGGTACTTGATGAATTTCAGTTCCACCGTCCGCTGATCGCCTGTACCTTAATCGGCGCCGTTTTGGGGGACATGAAAACCGGTATTATCATCGGCGGTACTCTGGAAATGATCGCTCTGGGCTGGATGAACATCGGTGCTGCCGTTGCGCCTGATGCCGCACTGGCGTCCATCATCTCTACCGTTCTGGTCATCGCCGGGCATCAAAGCATTGGCGCCGGTATCGCGCTGGCGATACCGCTGGCGGCGGCAGGCCAGGTACTGACCATTATCGTTCGTACCATCACCGTGGCATTCCAGCACGCGGCGGACAAGGCGGCTGAAAACGGCAACCTGACGGCGCTCTCCTGGCTGCACGTTTCTTCTCTGTT [...]
+CACCACGGTGGCGCTTTTTCTGAAAATGGGACAGTCGGAAAAGCCAATAATGCCGCTGTTGGTATGGAGATATTGCGCCGTGCTGGTGCCGCGTGCGGTCAGGTAATGGCACTGTAAACCCAGCCCCGCAGCGTTCACTTTACTTCCCACCAGGATGCCATAGCCGCTCATCAGCAGGCCTATCCACACCAGGGCAAACAATACAATTGCGCGAATGATCAAACGCATTACTACCTCTTTTCTTTTTTAGTTAGAATAAGAGTAGCGTGTACATTGATTGAAACAAGTGAATCATTCCTAAAAACATATAATGCCGCTACAGTTACTCCTGGTTTAAGTAACTCATGATAATTTAGCGACATAAGATGTAAGATCGGAGAGTGGAGTGAAAAAATTTCGATGGGTCGTCCTCGGCATCGTGGTGGTAGTATGCCTGTTGCTGTGGGCGCAGGTGTTTAATATCATGTGCGATCAGGATGTACAATTTTTCAG [...]
+NODE 306 4179 264473 263397 0 0
+CATCAATCCACTGAGAACGCCATACATAAAACGGTCGAAACCGTTAGCATTATTAACAACATTTTCCTGTCTGGAATTTTCCTCTGGTGAAACCAAAGGAGATTGCTGCTGTTCTGGTTGGGAATCAAGCACAAAGCCATCAGGAAGTTGTGAGTTATCAGGCTGTTCATCCAGAACAAACCCCTCTGGTAAACCTACATTGGTTGCCATTGTCCGTTCCTGTAAATAATTTTCTGACCAGTTTTAGGATTTTTCGCGGTCATACCTTCTCGAAATGTTTGACCGCCAGATGTTGCTTGTTGTGTCTGTTGTTGCGCAGGCTGCTGAATATCTTCATACAGCTTGGCTTTTCTGGATTGCAATTGCTTAGTTAGTCCGCTGGGGAGAGAATCTCCATAAGTTGAAAGATAATCATCCATTTGCTGGTTAAACTTTTCGCCTTCAGTATTTGCCATCAGTTTTGAGGTATTGATTAAGTCCTGGACTTGCTCA [...]
+ATTGCCGGAACATACTGTAAAACGCCATTCGCTGATTCATATGCATTCATCAGTCACCCGGCTACTGGCGCACCTTCCGTCTACATCATCGGGTCAGGGCAGGCTTCACCAATTGCGACGGCCAGTATTGAGAAAATTATCCGCTCATACACGGCTGATGAACTGGCAACCGGGGTGATGGAAGCGTTGAGGTTCGATTCGCATGAACTGCTGATTATCCATCTCCCGCGTCATGTGCTGGTTTACGATGCCTCATCAAGCCAGAACGGGCCGCAATGGTGCGTACTGAAAACAGGTTTATACGACGATGTTTATCGTGCCATCGATTTCATGTACGAAGGAAACCAGATTGCGTGTGGCGACAAGTCAGAAGCGGTGACAGGGCAGTTGCAATTCGACATTAGTAGCCAGTACGACAAGCAGCAAGAACACCTGTTGTTTACACCCCTATTCAAAGCGGACAATGCCAGATGCTTCGACCTCGAAGTTGAA [...]
+NODE 307 2350 160399 159553 0 0
+TATGGGGTCGACAGGTGGCTTCGGAGAAAAGTCCAATGCTTCGCCTCCAGTTACCAAGAATGATATAACCAAAAACAATAATATCGCTTATCTTGGAAAACAATACACTGAGGAGCATGCTATGGGCAGCCCATCAAGAGAAGAGATTGACGCGAAGCTTGGTCAAAACAAAGCAGAAATTGAGTTAATATCTGCTAACATGCGCGCTGAAATTTCAGCTTTCAGAGAATTCCAATCTAAGCAATTTACAGCTATGAATCAGTCACTTAATGAAATTAAGGGACAGATATTCGCTAGCAATGGCGAAGTTGCAGGGCTCAAAGGTCAAATTGATGGCATTAAAACATCCATGACCGCGACCCAATGGCTCGTTGGTGCGGTTCTCGCTATGCTTGCGGTAATCATAACGCTTCCGCAGATTCAATCTTACTTCAAGGTTTCTGAGCCGACTGCGAAGGAAGCCGCTAGTGAAACCCATGATACCAAAATAAA [...]
+TCGTTCATCCGTAGGGATGGGTAGTAAATCATCTAAAGCAACGTTAAAGAAAGCTGCTGGCGCAATGGATAATAAATTTATTGGTGGGCAACGTGCTATTCAAGATTTCGCCGATGAAGTTAATCCTGATTTTAACGCGATAAATGCTATTCGTGAGCTAGAACTGGAAAATTATGCCACTCCAGGCATGATCTCTAATAATCCTTCTGTCAGGGCTCTTGATAATGCAGTGGCAAGTCTTCCTGGAACGGAGATTAGTGAGGCGCATAAGCGTTTTATTACTGAATTAGGAAGAAAAGCTGATGAAATGATAACTTCATTTGGGGGAAGCCTTGATAAGCAACTGGTTTCTGACAGGCTTGCAGATAATTTTGATAAAACCATTTCATCATTACAAAATCAGTCAGATAACATCTACAACAAAATTGCCGAAAAGGTTCCGGTAAGAGACCGGATTGAGGCAACTAATACGTTGAATTTTTTAGAGGATTT [...]
+NODE 308 1054 48425 47950 0 0
+GTCGGGCGGGGGCTCATTATGGGCAATGCCATGCCGCAGCTTATCGCCGCGCTGCCACACCTTTCGGTTATCGGACATTGTGGTAATCAAGCGGTATCACACTTTTTGACGCATTGGCTGGACAATCCGCATCTACCTTATTCCCCCGAATGAGAGATCTCTTCCAGCAAGCCAGACATTCAGTCTGGCTTTTTTTTGGTTTTTAGTCGCCGGTAAGTAATTTTTCGATGGCCGCTGACCACGGCGTCAAATCGCCGATATGGTCGCTAACCCAGGACGGATGGTAATAGGTATCCAGATAGCGATCGCCGCTATCGCACAATAACGTCACGATAGCGCCGGTTTCTCCAGCCTCGCGCATCCGGGCCGCAAGCTGCAGCGCTCCCCACATATTCGTGCCGGTAGAGGCGCCGACTTTACGGCCTAGCTGCGTTTCCAGCCAGTGTGCGGTGGCAACGCTGGCGGCGTCCGGCACGCGCAGCATCTCATCCA [...]
+GATTTCCGAAGCCTGGTTCGCGCGTTTACTGGGACTGCCGTTCATCGCCGTCATGCCCGCCTGTACCGCAAAACGTAAAATCGAACAGATTCAATTTTACGGCGGCCACTGTCATTTTGTGGAGAGCGCCTGCGAAATTTATGCCGCCTCCGAGCGGCTGGCGCATGAACTGAACGGTCACTATATGGACCAGTTTACCTACGCAGAACGAGCTACCGACTGGCGGGGCAACAATAATATTGCCGACAGTATTTTCCGCCAGATGCGCAACGAACCCCATCCGGTACCGCGATTTATCGTCATGAGCGCCGGAACGGGCGGAACCTCTGCGACGATTGGGCGCTATATTCGCTGCCAGGGCTATGATACTCAGCTCATGGTGGTGGATCCGGAAAATTCCGTCTTTTTACCTTACTGGCAGGATCGCGACGCTTCATTACGCAGCCCGGTGGGCAGTAAAATTGAAGGAATTGGTCGTCCGCGAGTAGAGCC [...]
+NODE 309 2293 129722 128647 0 0
+GTTTACACACCGGCAAAAAAGTCACCCTGACATTACGCCCTGCGCCGGCCAATACCGGGGTCATCTATCGTCGCACCGACTTGAATCCACCGGTAGATTTCCCGGCCGATGCCAAATCTGTGCGTGATACCATGCTCTGTACATGTCTGGTGAATGAGCATGATGTACGGATTTCAACCGTTGAGCACCTGAACGCTGCTCTGGCGGGCTTAGGTATCGATAACATCGTTATTGAGGTTAATGCCCCGGAAATCCCGATCATGGATGGCAGTGCCGCTCCGTTTGTCTACCTGCTGCTTGATGCCGGTATTGATGAACTGAACTGCGCCAAAAAATTCGTACGCATCAAAGAGACAGTTCGGGTTGAAGATGGCGATAAATGGGCTGAATTCAGACCGTACAATGGTTTTACGTTGGATTTCACCATCGACTTTAACCATCCGGCGATCGATTCCAGCAGCCAGCGCTACGCGATGAACTTCTCTGCGGATG [...]
+GTTAGTGCCGTAAGTGATGTCGGCAGCGTAAGCTTCACGTTTGGCGGGCGCAGGCATACCTGGCAGGTTGATACCAACGGACATACCGAGGAATTCGAATAGCGGGCGGTTGTTTTCGGCGTCACGCTGCGCCAGATAGTCGTTCACGGTTACCACATGAACGCCTTTGCCGGACAGCGCGTTCAGGTAGGCTGGCAGCGTTGCGGTCAGCGTTTTACCTTCACCAGTACGCATTTCGGCGATACAGCGATCGTTGAGCACCATACCACCCAATAGCTGAACGTCGAAGTGACGCATCCCAAAGACGCGTTTACTGGCTTCACGCACCACCGCGAACGCTTCCGGAATCAGGCTCTCTACACTTTCGCCTTTTTCAATACGGGCGCGAAATTCGTTGGTTTTCGCTTTCAGTTCGTCATCGGAGAGTTTTTCCATCTCCGGTTCCATCGCATTAATAAGGCTGACGGCCTTACGCATACGACGCAGCGTACG [...]
+NODE 310 6 517 496 0 0
+ACCACC
+AGGTGC
+NODE 311 5147 307788 306441 0 0
+TAAAGGAATAAAGCCTTTATCGCTACGCAGTAATTCCAGAATCAGTGAGCGACCTTCATCGGTTTCAAAATTCACCAGCACGACGGCGCCGCTACGCGGTACGGTAACCGTGCTGGTGCTTTTGATTTCAACATCGTTCTCCAGCGTGCTGATATCCAGCGACACCCGGTTTTCGCGGTAGGCTGACATATACGGTAAAATGCCATAGCCCGAACTGCCGATTTCGCTGCTGCTGTAGCCCAGTCCTGCGCCTTGTGCGCCGCTGGCTTTCACCATGGCGACAGCGTCGGTTTCGCCAATGCTGCCCGGCGCGAACGCCACGCCGCCAGAATGCAGCACCATGCCACCGCTGTAACTGGCGGAATATTGCTGGCTATTGTCGTCGCCAAACGAGGCGGAAAGCCCTAATGGGCCATAGCTGCTGTTAAGGGAGCCAAAGCCACTTACCTGATTCAGGTTGCCGTAATTACCGCTGCTGGAGGTGGCGCTCAC [...]
+CTGTTCAACCTGATCCAGCCGGATATCGCCTGCTTTGGCGAGAAGGATTTCCAGCAACTGGCGCTGATCCGCAAAATGGTGGCGGATATGAGTTATGACATTGAGATCGTCGGCGTGCCGATTATTCGCGCCAAAGACGGTCTGGCGCTCAGCTCACGTAACGGTTATCTGACCGCAGAGCAGCGCAAAATTGCGCCGGGTCTACACAACGTGATGAATAGCATCGCTGAAAAACTGATTGCGGGTAATCGTGAGCTGCAAGAGATTATTGCCATTGCCGAACAGGAACTGAATGAAAAAGGCTTCCGTGCCGACGACATTCAAATCCGTGATGCCGACACGCTGCAGGAGCTGACGGAAACCAGCAAACGCGCAGTGATTCTGGCCGCCGCCTGGCTGGGTCAGGCGCGTCTGATCGATAATCAAAGCGTTACATTAGCCCAGTAGACAGGGGTTAAAAATCGGGCAATACTGCCTGAGAATTTCCAAAGC [...]
+NODE 312 565 32312 32312 0 0
+TCACCCGGCAATTCAGGTAATACGCGTCTGTCAAAACTGGCATTGTGAGCGACATACCACTCACTACCGTAATAAAGCGGTATGACATCTTCAATCCACGGCTTATCGGCGACCATGGCTTCGGTAATACGGTGTATCGCCATTGCCTGCGGCGTAATAGGGCGATCGGGGCGTATCAGGTGACTCATGGGATTGACAATGTTGCCATCAATGACATCAACAGAGGCTATCTCTACGATCCCGCCCTGCAGCCCGCAGGTTTCCGTGTCTATAATCCGCAACATGATTCATTCCTCACCGAAAGACCTTAGCGTAATGGAATGATATCGCCTTGCCAACCCTCCGTTGTGCGCAGGCCCGTCAGTAATAGCGAACCGCAATCGGCACGAACAATAAGTTGCCCGCTTTCATCCCACAGCGCGCTACTGCCACAGGCATTGGCCATCAGTACGGCCAGCGCATATTTATGCGAAAAACGTTGTAAGCGTGAGG [...]
+CGAACCTGAACTCCATGCTTCTACCTCACGCTTACAACGTTTTTCGCATAAATATGCGCTGGCCGTACTGATGGCCAATGCCTGTGGCAGTAGCGCGCTGTGGGATGAAAGCGGGCAACTTATTGTTCGTGCCGATTGCGGTTCGCTATTACTGACGGGCCTGCGCACAACGGAGGGTTGGCAAGGCGATATCATTCCATTACGCTAAGGTCTTTCGGTGAGGAATGAATCATGTTGCGGATTATAGACACGGAAACCTGCGGGCTGCAGGGCGGGATCGTAGAGATAGCCTCTGTTGATGTCATTGATGGCAACATTGTCAATCCCATGAGTCACCTGATACGCCCCGATCGCCCTATTACGCCGCAGGCAATGGCGATACACCGTATTACCGAAGCCATGGTCGCCGATAAGCCGTGGATTGAAGATGTCATACCGCTTTATTACGGTAGTGAGTGGTATGTCGCTCACAATGCCAGTTTTGACAGACGC [...]
+NODE 313 1633 96406 93241 0 0
+TACGGCAGACGTGCGCCCGGCGTAGTGCCGATATCGGAACTGATGCCAGACTGGGCATGGAGCAGCGCCCGTTGCTTCCAGCCATACTTCACTGGCGTATTTTCGACGAAATCCGCCAGTTGGGCGCTAATACGGTAGCCCAGCTCGTTCGCCGTTTCATTTTTGCCATAACGGGCGTTCAGGCCCGCGTTTTCGCACAGCAGATTCACGGCTTCCGCCAGCCCGTACATACCGAACATCGGCGCAAAACGTTCGGGATCGATCAAACCTTCCTGTACAAGAAAGCTATTCTCAAAGAAATGTGACTTTTCATAGAGGAATTCACATCGTGAATTAATGATGGCGATCTGCTGTCGGCAGTAGTGCGGTAGCGTGCGTGAAAAGAAGTCATCGACAGACGTACTGCGTTCTGCCACGGCTTTCAGGTTGAGACGTACCAGCGTACTGCCGCCGCCGCCAAGCGGTAGCGAGTTATAACAACTGACGATGCCA [...]
+CAAATCGCCGCCGTATTCCCGACCGGGGTTTTTGCCTGATGACACAACGCGATCACTTTTTCATTGGTGTCGTCATCGTTCAGAGTGGTCAGATCCATCAGTTTGAGCGCACGCAGGCTGCTTGCTTTTAAATCAGTCATGACATTCTCCAACGGCATTGCCGTATAAAATTTCACCTTGCGAGTCTGTTAATATTCTAACATTCACTCGCGATTACACTTCGATATACATCACAGTTAATGAAAACTACGTACAAATTTGCATTACTGTAATGAGATCTGAATCAAATTATCCCGCCGTCACCGCCTGTTCTTCGAGCGATAAGCGCATCAGGATCAAAGTCGGTTTGCCGCCATTTTCTACAATAGCGCATCGTCCCGGCATAAAGAGGAAACGAAGATGCCTGCCTCATGCGAAACTGCGCTCCAGCAGCGTTGCCAGCAAATTGTGACCAGCCCGGTGCTCACGCCTGAACAAAAACGCCATTTTCTG [...]
+NODE 314 5753 278493 276386 0 0
+CTGGATGGCCTGGAAGCTAAACTGGCTGAAAAAGCCGCCGCTGCTGGCGCAAGCGCTTATAACATCACCTCCGCCGTAGGTAATGACAAAATGAGCGGCACTGCGGTGATTTATAAATAATTTACCTGCCCGCCAGATTTCAGGCTGTAACATCGCTGTTGTTTGAATTCTGACGGGTATTACCCTCGTCTGTTTGCCAACAGACCCACTGCTCCAACCCTCATTAACCCTGTTTGTTACCCTTATTTGCCCGTCCGTCACTGGACGGGCTTTTTTTATTCGCTAAAAGCCTGTTCGACGCGCGCAATCCCGTCTTCTAACGTCGCCGCCTCTCCCGTCGCAACCAGACAACAGGCCATTTGCGTTTTTAATGATTGCGGCACCGGCTCGCGGCCGGCAAGGCAGCGCTCAATCCAGCGCGCGGTGATTTCAGGATCTTTAGTCGCAGGCAGTGAAAGCGGCTCGTCGTGCGTGTCGCTCTGACGCTCATGC [...]
+TGGCGTCGCAGCCGGTATAAGCGGCAACCAATCTTGTCAGATGGGTGTGCAACGGATCGATAACCTGTTCATGAACCAATTGATAGGCCGACGTGGGAGAGAGCTGCTCGCGTGAAATAAATTTGCTCAGGTTAACGGTGTCTTCCTGCGTCAGCAGCATAATCATGTTCTTGCAGGCGAGCAGAATAAGCTCGCGTATGGCGTCCCGGTCAGGGACAGGCTGGCTAAACAGACGTTCCGCTTTTTCAGCATGGGGGCGAAATTTTTCGCCAAGAAAATCGGCAATCCACTGGGCGCAGGCGAGGTATAAATCCTCTTTTGAGCCGAAATAGTAAGTAATAGCGGCAATATTTTGCCCCGCCAGCGCGGCGATATCGCGCGTGGTGGCATGGAGGCCATACTCGCCAAACTGCGCCAGCGCGGCGGCAATGAGCTGACTTTTCGCCTGCTCGCCCTTGGTGGTCGTGGTGGGAATATTCATCACACGCCCTA [...]
+NODE 315 747 136620 135523 0 0
+AGTCTGCATAATACCAACTCGTTCTTCAACTGCAAGAACCGTATTTACTGGTATATAGTAATCCTCTTCCTGTCCAATCATTCGTCGTCCCTTCCATGTTTCCGCGCCATAACCGTCAGTTTCGACTTCTTCAAGTTTTGTCAGACTCTTCGCAGTTGTACCAGAATTTTTGGCAACCCATTCAGCCGTCTCGTCATTACAACGATAAACAAGTGTCAAATTGGTATTTGTTTCCGTCCCTTTTTTTATTGACTGAGCAATCTGCGGTTTTTCATCCGGTATATTTAAAAGGTCATCTCTCTCTTGATATGCAATAGACAAACTTGCATTTGATGATAATATAGTTGCCAGACTATCAGCAACCTCTGACGAGATAACAAAACGGGCCTCATCAATTATCCCCAGCACATGATTTTTTGGTTGTTCACGAATAACAGCCGCAGACCACTCACGCAACATTGATTTTAAGACAGCCCTGACAACCTTATCTTT [...]
+AAACGATTTACAAAAATTGTTGTCTGGTAGTGATGATAGAATACCGGAGGAAAAACAGGAATGGATAGCTAAAAATGGAGCTAATATTCGAACGCAGCTTAATAAATGGTTAGAGCTTCCTTGTCTATCTCCCGCTGATGGTCAGGGATTAAATGTAACTGAACTGGTTAAGTCAGGTGCGGTTATTTATGTAAAAGGTAGCACAAAAGATAAGGTTGTCAGGGCTGTCTTAAAATCAATGTTGCGTGAGTGGTCTGCGGCTGTTATTCGTGAACAACCAAAAAATCATGTGCTGGGGATAATTGATGAGGCCCGTTTTGTTATCTCGTCAGAGGTTGCTGATAGTCTGGCAACTATATTATCATCAAATGCAAGTTTGTCTATTGCATATCAAGAGAGAGATGACCTTTTAAATATACCGGATGAAAAACCGCAGATTGCTCAGTCAATAAAAAAAGGGACGGAAACAAATACCAATTTGACACTTGTTTA [...]
+NODE 316 4294 259673 257627 0 0
+GGAACCACCGGCTGTTGCCCAACCCAGCGCATTACCCTGACGATCGGTAATAGTCACGATGGTGTTGTTGAAAGAAGCATGGATATGAGCCACGCCGTCAGAGACTTGTTTTCTTACACGTTTACGTGCGCGAACTGGTGCCTTTGCCATTATTCAATCACCCCGATTATTTCTTGATCGGTTTGCGCGGACCCTTACGGGTACGAGCGTTGGTCTTGGTACGCTGACCGCGAACCGGGAGACCACGACGATGACGCAAACCGCGATAGCAACCAAGATCCATCAGGCGCTTGATGCTCATGCTGATTTCACGGCGCAGATCACCTTCAACGACAAATTTGGCAACTTCGTCACGCAGCGTGTCGATTTGTTCTTCAGACAGCTCACTGATCTTAACATTTTCAGCGATACCCGCTGCAGCCAGGATGGCTTTAGAACGGGTCTTGCCGACACCGTAGATCGAAGTTAACGCGATCACGGCGTGTTTCTGAT [...]
+GGCTGGTCTTGGTGGCGAAATTATCTGCTACGTAGCCTAATCGGAGGAAAAAATGTCTCGTGTTGCTAAAGCACCGGTCGTTGTTCCTGCCGGCGTTGATGTCAAAATCAACGGTCAGGTTATTACGATCAAAGGTAAAAACGGCGAGCTGACTCGTACTCTCAACGATGCTGTTGAAGTTAAACATGCAGATAATGCACTGACCTTCGGTCCGCGTGATGGTTACGCAGACGGTTGGGCACAGGCTGGTACCGCGCGTGCCCTGCTGAACTCAATGGTTATCGGTGTTACCGAAGGCTTCACTAAGAAGCTGCAGCTGGTTGGTGTAGGTTATCGTGCAGCGGTTAAAGGGAATGTAGTAAACCTGTCTTTAGGTTTCTCTCACCCGGTTGACCATCAGCTGCCGGCAGGTATTACTGCTGAATGTCCGACTCAAACTGAAATCGTGCTGAAAGGCGCTGATAAGCAGGTGATCGGTCAGGTTGCAGCAGA [...]
+NODE 317 5992 321537 315430 0 0
+TCTCCCCGCAGAACATGGCGGATGCGAAAGCGCAGAACATTCCGGTACTTTCCTACCTGGCCAACCATTTCGCCTCTTTGTCGGGGACAAAATCCACTTTTGCAACGGTGCTGGAGTATGGCGCGTCTATCATCGCGCTGGTTGCTATTTTCAAATCTTTCTTCGGCCACTACCTGGGGACGCTGGAAGGGCTGAACGGCCTGGTGCTGAAATTTGGTTATAAAGGCGATAAAACCAAAGTCTCTATGGGCAAGCTTAATACCATCAGCATGATCTTCATTATGGGGTCTACCTGGGTCGTAGCTTACGCAAACCCGAACATTCTGGACCTGATTGAAGCGATGGGCGCGCCGATTATCGCCTCGCTGTTATGCCTGCTGCCGATGTACGCCATTCGTAAAGCGCCGTCGCTGGCGAAGTACCGTGGTCGTCTGGATAACGTGTTCGTCACCCTGATTGGTCTGCTGACCATCCTGAATATTGTCTACAAAT [...]
+TGGCTTCACGCCATTCGCTTTCTGTCATCCCTGCCCGACGCGCCGGGGCTGATGCGTCGAGGATTACGCTGGTATTACTAGCCGATTCCATAGAATTCTCGCTCAATGTGTAGGTAGAGGTTTTTTTATTTTTCGTGCCGCAGCAAGGCGATATGCAGAACGTGAGGTGCAGGTACTTTCTTGTAATAAGAAAATCATACGCGCACGATAAGAGAAAAACTTACCAATAAAACGCCTGTATTTATTGTGGGTTAAGAATTATTTTCTATTTACTATTGGTTTAATATTGTTATTTTCTCTATTTGACGCGTATCACAACAAAAAAGGACGCACTTTGGTGCGCCCTTTTCTCAGCTTCTGTCTTCTGCGTTATCCCATAGCCTGCTCACTCTGCGCCTGTCGGGCCTATCCACAAACGACTTTAATCGCCAGACCGCCGCGCGACGTCTCGCGATATTTGTCGTTCATGTCTTTACCCGTTTCGTACATGGT [...]
+NODE 318 4715 235683 234487 0 0
+TGGCGAGGCCCATGGATGGGCCGAGTAATCCGTAGCCAACACATAAGCCACTTGAAATATGAAGGGGATATAAAAAAGGGCCGCTTACGCGGCCCGCTTGACTATAGTGGCGACAGGCAGGGGGTATTTCTTGCCTTCAACCCACTTGCCGTCGACGAAGAACGCTGACCATCCCGTCGCCTTCCCGTCTTTTTCCGCCGCAACGTACTGCTGTTTTGTTTTGCGGCTAAAGCGAACCACGGTTTTATTACCTTCCGGATCCTGCTGCGGCGCATCCGCCAGATACCGCAGTTTTTCCGGCAGGCGATCGCGGAACCGGTAAAGCTCCTCGACTAATGGCGCGCGCGTTTCGCGTGATTTCGGGAACGTATTGGCCGCCAGGAATATCCCTGCGGCGCCATCGCGCAGCACAAAGTACGCGTCCGATTTTTCACACGGCAGTTCCGGCAATGGAACAGGATCTTCCTTCGGCGGCGCAACTTCGCCGTTACG [...]
+AGGTTGTCTTATCTTCGCGTTAACTTTTCGGGTTTATGCCTGAAAGCGCCTTTTTTTTCAATCAGACAGGGGCGATAACGCCGTAAAATGAACGTCTTGTCATACTTTTTCTTCCTCAACAGGCATACGGATGAAGAGAGACTGACTTCGATGCCTGTTGTACACTGAGCGCAAGTCGCGTTATTTAATCAAGGTGGGAGTCGTGGAATTGTTGTCTGAATATGGCTTATTTTTGGCAAAAATCGTCACCGTTGTGGTGGCCATTGCCGTCATTGTGCTGCTGATCGTGAATGCTACGCAACGCAAACGTCAGCGCGGTGAGCTGCGCGTGACCAATTTGAGCGAGCAGTATCAGGAGATGAAGGATGACCTTGCTGCGGCGTTGATGGATGGCCATCAGCAAAAACTGTGGCATAAAGCGCAGAAAAAAAAGCATAAGCAGGAGGCGAAAGCCGCCAAAGCAAAAGCGAAGCTGGGGGACATTGCGACATC [...]
+NODE 319 5614 276155 272484 0 0
+ATCGCCAGTGAGATTTCTTCATTATCGAATTCTGAGCGCAACGTCACGCGAAACGGCGGATTTTCTCCGCTCAGCCACAGCGTAATGGTTAATTTATCGTTATGTTGCTTCACAAATGGGGCAACCGGTAAGTGCCAGGCATTCAACATCTCGTATCCCCTCTACTGAAAATGGGGCCACCTTGCCATAGAGATTTAAAGGATAACTCATCATCCAGGGGTTTATTAGGGGAGGAGACTCCAGGAGGAGAAGCGGCTCCGCTTATCCGGCCTACCGTTGCCTGCAGACCGGATAAGGCAGAGAAAAACGACTACGCCTGCGCCAATTGACGGTCGCGACGGCGTTTAAACATCCAGCCAATCAACAGCAGAACTATCCAGGCGAAGCCCACGTACAGTGAGATGCGGGTATCCGGATGGTAGCCGATAAGCGCAATAATGAAGACCAGGAAAATCAGGCCCGCTATCGTCGTTACGACACCGCCCGGCACCT [...]
+ATAACTAACGACTAACAGGGCAAATTATGGCGAGACGTATTCTGGTCGTAGAAGATGAGGCGCCGATCCGTGAAATGGTGTGCTTCGTGCTCGAACAAAATGGCTTTCAGCCCGTAGAAGCCGAAGATTATGACAGTGCGGTGAATAAACTTAATGAACCCTGGCCGGATCTCATCCTTCTTGACTGGATGTTGCCCGGCGGGTCAGGGTTACAGTTTATTAAACATCTCAAACGTGAGGCCATGACCCGGGATATTCCTGTGGTTATGCTGACCGCGAGAGGTGAGGAAGAAGATCGTGTGCGCGGGCTGGAAACCGGCGCTGACGATTACATTACCAAGCCGTTTTCCCCCAAGGAGTTGGTGGCGCGCATTAAAGCCGTTATGCGGCGTATCTCGCCGATGGCGGTCGAAGAGGTGATCGAGATGCAGGGATTGAGCCTTGATCCTGGCTCTCACCGCGTGATGACCGGCGACAGCCCGCTGGATATGG [...]
+NODE 320 164 9164 9065 0 0
+CCCACCACCAAAGCATTCTCTGGTGTTGAAGGCCCTGCAAAGCAGCATCGCGGTGGCGGAGCGTCGTTTGCGACGCCCAACACACAAAACAAGCGGTGAGTGCTTTGGGGTGGGGTGACTGCGTACCTTTTGTATAATGGGTCAGCGACTTATATTCTGTAGCA
+CCCACCCCAAAGCACTCACCGCTTGTTTTGTGTGTTGGGCGTCGCAAACGACGCTCCGCCACCGCGATGCTGCTTTGCAGGGCCTTCAACACCAGAGAATGCTTTGGTGGTGGGGCTCCCACTGCTTGTACGTACACGGTTTCAGGTTCTTTTTCACTCCCCTC
+NODE 321 51 19939 19193 0 0
+ACCTGCCCATGGCTAGATCACCGGGTTTCGGGTCTATACCCTGCAACTTAA
+TTGAAGGTTGGGTAACACTAACTGGAGGACCGAACCGACTAATGTTGAAAA
+NODE 322 13 4698 2514 0 0
+AATTAAGACTCGG
+GATCTAGCCATGG
+NODE 323 3 1103 604 0 0
+TTT
+GGT
+NODE 324 6528 314446 311273 0 0
+ATGTGATTGCGGAAGAGCTAGGTATTTCCCGCGTACAGTTCGATCAGTTTCTGCGCATGATGCAGGGCGGCGCGCAGTTTGGCGGCGGTTATCATCAACAGTCCGGCGGCGGCTGGCAGCAGGCGCAGCGCGGCCCGACGCTGGAAGATGCCTGTAATGTGCTGGGGGTTAAAACCACCGACGATGCAACCACCATTAAACGCGCTTATCGCAAACTGATGAGCGAGCATCATCCTGATAAGCTGGTGGCCAAAGGGTTGCCGCCGGAAATGATGGAGATGGCGAAGCAAAAAGCGCAGGAAATTCAGAAAGCGTATGAGCTAATCAAAGAACAGAAAGGCTTCAAGTGATTGAATTGCCGGATGCGGCTAGCGCCTTATCCGGCCTACGTTAATGAATGTAGGCCGGGCAAGCGAAGCGCTCCGGCATAAATTGGCTCAGAATTTAAAAATCTGCCGGGACTTTAAACGTCATGCTGTTACCGTAAGCGGG [...]
+TGGCTGGCGACAGACAACGGCCCTGTGCAGGCGACGCTGGCGCCGCAAGAGTCCGTGGCGTTTATTCCGACCAGCCAGACCTCCCGCGCCGCCTCGCTGCTACAGGCGGAAAAAAACTATCGCCTGACGCCGCTCCAGCTGCGAGACTTTCATCGTCAGCCGGTATCCGGTCTGTATTGCCGTACTCACCGCCAGCTTATGCGGATGGAGAAACTGCTGCGCGAAAACGGCGTCACCGTTTATGAAGCGGATGTACGCCCACCGGAACGTTACCTGATGGAACGTTTTATTACGTCGCCCGTTTGGGTAGACGGCGAGATGCGCAACGGCGTTATCCGCAATGCGCGTCTTAAACCCCACCCCGACTATCGACCGCCGCTAAAATGGGTCTCGCTGGATATCGAAACCACGCGACACGGCGAACTGTATTGCATTGGTCTGGAAGGCTGCGGCCAGCGTACCGTTTATATGCTGGGCCCGGCGAATGGCGAT [...]
+NODE 325 10504 575661 569537 0 0
+ATCGCTTTACGCGCGCCCTCGGCGTTACCGTCCAGAATGGCGTCCATCACTGCCTGGTGTTGTTCCGTCAGCTTTGAGAATACGGGCGGAACGAGATACATACGCTGGCGACTCTGTTTGACGGAGGATTGCAGGACGTCGAAGAAACCGCGCATGGTTTGCAACAGCACCACATTGTGCGAAGCTTCCGCGATCGCCAGATGAAAGCGCACGTCGGCCTGGGAGGCGAGATCCGGGTCTTCGCTGAGCGTCGCATCAAAGCAGAGTCTGATTTTCTCTTTGTCGGCAGCGGTGGCACGCATGGCGGCGTGCCAGGCCGTACTGGCTTCAATGGCGTGGCGGGCCTCCAGAATGTCGAAACTGTAGTCCGGATCGTTCGCCATCAGCATTTTCAGCGGTTGCACGATATTCTGTTCAGACCAGGTTTCGTGCTGCCAGCGGACAAATGTCCCGCCGCCGCGACGGCTCACCAGCACGCCTTCGCTGACCAGC [...]
+GTAAACGCACGGTCGATAGCCAGACGGAAGCGATGCTGCGCGGCGTGCGAACGTGCAGGAAGTTGCTGTAAATGAGCGCGAAGTTCTGCAATACCGCGTCCTTCATTGGCGGCGGTGACAAATAAAACGGTATCGGCGAAGCCATAGTTGTCGAGCGCCGCCAGTACCTCTTCACGTACTTCACCGATACGCGCCTCGTCCACGCGATCGGCTTTGGTCAGCGCGACGGTGAGCTGGAGATTGCCCGTCAGTTGCAGGATCTGTAAATGCTCGCGCGTTTGCGCCATAACGCCGTCATCACAGGCGACCACCAGCAAAGCGTGATCGATACCGCCTACGCCCGCCAGCATGTTAGAGAGGAATTTTTCATGCCCAGGCACATCGATAAAGCCCAGCACACGACCATCCGGCTGCGGCCAATAGGCGTAACCCAGATCGATAGTCATCCCGCGTTTTTTCTCTTCCGGCAGACGGTCGGCATTAATGCCGGTA [...]
+NODE 326 8777 444176 441746 0 0
+CTTTGCCAAACAGCAAACCGGCCACCTGACGATCGGCGAAGGCGCCGCGTAAACTATCAATAAGTTGCTGCTGCGCCTGCGACTCACCCTGCACCATCTCTCTGACCCGATCATACTCTTTCATTTGCAGCAGGCCGTTCAGAGTCGACATCCAGTTCAGGTGCTCATGGCGTAGCGTGCGCAGGCTCTCAACATACTGTTTAATCTGGGTTAGCTGCGCGTTCAACGTCGCGATTTCATCTTTGCTGCGAAAACTAATAATAGCGCCCAGCAGCTCCTCGCCGGAACGGATAGCCTCACGATTGGCGATGACGCTCAGGCCATTGAAGTTGGCCATCACGTCCTGGCGTCTTTCTGCGATCTGGCAGGTAAAAAAGTCTGCCGGATTGACGACTTCCGCTATCAGCTTGCCCAGCCACTGACGCCCCGGCGACGGCAGCCCCAACATTTTTCTCGCATTGCGGTTAATCGCAGTGATATGTCCCTCCGGAT [...]
+GTCGCTGGTCAACACCGCGTGCGGCGATAGATTTGGGTAATCCAGGCCACAGGCCGTGGACGGTCAGAAAGTCTGCTTTGTTGGCTGGCTCTTTTTGCAGACGGCACTCATCGGGTTCCCGATGGCGGCGTTCATGCTGGCTTTGACAAAAACCGGTTTGCCAGGAAAGCGCCAGCACATAGTCAGTGAAATCACCGTACTGTTGCGCCTGAAGTTCGTCGGCGTTGGCGGCAAAAATTGGAGTTAAGAGGGCAGCCAGCAGCGGACTGTAATGCCATATTGTGTTCATGATGAATTCGATAATTTATACACATTATGAATGTTACCCATTTAATCATAAAAAATGCCGCTCAGGTGAACCTGAACGGCATCATTTTTAACCTACGTTGGCGTAATGTTTAATTCCACATTGCCAGAATCGGCCAGCCCACCAGCAACAGCATCGCGATATAGATAACGCCAAAGATTGCGCCAAGCCGCCAGTAGTCTCTG [...]
+NODE 327 1137 59516 59373 0 0
+TGCTGGCGGTGAATATTCCAGGCCTCAAATCCGGCGAACTGGTGCTGGATGGTAAAACGCTGGGTGACATCTACCTCGGTAAAATCAAGAAGTGGGATGATGAAGCCATCACCAAACTGAACCCAGGCGTGAAGCTGCCTTCTCAGAACATCGCTGTGGTGCGTCGCGCTGACGGTTCCGGTACTTCCTTCGTGTTCACCAGTTACCTGGCGAAAGTCAACGACGAGTGGAAATCGAAAGTGGGCGCGGGTTCTACCGTGAACTGGCCAACCGGTCTGGGCGGTAAAGGTAACGACGGCATCGCGGCATTTGTACAGCGTTTGCCAGGCGCTATTGGCTACGTTGAATACGCTTATGCCAAGCAGAACAACCTGGCCTACACCAAACTGGTTTCTGCCGACGGCAAACCGGTAAGCCCGACGGAAGAGAGCTTCTCTAATGCGGCGAAAGGCGCAGACTGGAGCAAAACCTTCGCGCAGGATCTGACCAACC [...]
+ATGTGCACCAGCGCGCCGTAGATATCGTTTGGCGCGTCCCATTCCTTAGTCCAAAGAAATGAGAAACCAAATTTCTGAATACTTGGCCAGGAGGAGATGATCAATGAGACGATAATACCGCCCAACATCAATAGCACAATCAGCGCAGCCAGTTTTACCAGCGCGCTGAAAATCATGTCGCCTTTTTTACCCGGCGGGTTAAAAGCAGGCTTGGTTGCAGCCATAAATTACTCTTTCCATTAAACGCGTTTTACGACGTTGCCCCTGCCGGATGGCGCTACGCTTATCCGGCCTACAACGTGGGCCTGCGGTCGAAACCGTAGGGCGGATAAGCGTAGCGCCATCCGCCAATTCGTTAATTAATACAGCGCCTTACCGTTGCTGTCTTTTATACTGGTCTTCCAGGCGGTACGAACCTGCTCAACAACGTTATCCGGCAGGCTGGCGTAGTCCAGATCATTCGCCTGCTTAGCGCCATTTTTGTAGGCCCAG [...]
+NODE 328 341 15882 15488 0 0
+ACCACCCAGCATCTGCATCACGCCGCCGATCTGCGGAACGTTAATTTCAGTCGTATAGCGTTCCTGGCCACTCTGATCGGTCCACTTGCGGGTACGCAATTGACCTTCGATATACACCTGAGAACCTTTACGCAGATATTCGCCGGCCACTTCCGCCAGTTTGCCGAACATCACCACCCGGTGCCATTCAGTCTGCTCTTTCATTTCGCCGGTCTGCTTATCGCGCCAGGATTCAGAAGTAGCCAGCGTTAAGTTGGCGACAGCGCCGCCACTCGGCATATAGCGTACTTCCGGGTCCTGGCCCAGATTACCAACGAGAATCACCTTGTTTACGCCTCTGC
+GAAGTACGCTATATGCCGAGTGGCGGCGCTGTCGCCAACTTAACGCTGGCTACTTCTGAATCCTGGCGCGATAAGCAGACCGGCGAAATGAAAGAGCAGACTGAATGGCACCGGGTGGTGATGTTCGGCAAACTGGCGGAAGTGGCCGGCGAATATCTGCGTAAAGGTTCTCAGGTGTATATCGAAGGTCAATTGCGTACCCGCAAGTGGACCGATCAGAGTGGCCAGGAACGCTATACGACTGAAATTAACGTTCCGCAGATCGGCGGCGTGATGCAGATGCTGGGTGGTCGCCAGGGCGGCGGCGCACCGGCAGGCGGTCAGCAGCAGGGGGGTTGGGG
+NODE 329 2139 130291 129423 0 0
+ATAATCACCACGTTAATGCATTGTCAGTATTCTGACTGGTTTGGTCTGGTCGGACTGAGTGAACACATTGATGCCGAAGCCTGCTGGAGCCGGCTGTCGGATTACCCGGAACAGGCGCAGCCCTGTGACATGCTGATGGTCATACCCCCCCGTCTGGCCACAGAGCTGAACGGTTCAGGTGGACTGCTGCAGGGCATTTCCACCACGACCAGCCTTTACAGCCGGATATACGGTGTGGAGTGGCCATCAGGTCACAATGTCCGCTGGGTGCGTGATGAGATGAGCAGTCTGGTGCTGCTGACAGACACGCCCTGGTATCCGCCTTCAGGTGAGCTGGTTGGTGAAATCTCGAAGGTGTTCGACTGTGAGATACGGCACTGGTACAGCGAACCTGTCCGGGGCATACAGGGTTACAACTGTTATGACGGTGGTGAACATACGGACAGTGACCCGCAGGCCGAATGGCCGGGGAGGGAAAAACTTCCACAGCCC [...]
+CTTTTTTACATTTTCAGGACTAAGTCCTCCATTAATCCATTTTTCAAGATGATGTTTATGAATAACAAAGTCAAACTCAGGATATGCTCTCTCTAAATCCTCCAGTGAAGTTTTCTTCCACAGTGGATTCCTGTTTCCCTCAAAAGAGGCGATATGAAAGTGATCATTCAGAAACAATGATTCATTATGGTTATAGTATTCAAACCATATTGAATTAGCATTTATGTAATCCCATAATTGCGAATCAATTTCTTTATCTACTCGTTGTGATGTTTTTAATATATCCAGAAATTCTTTTTGCTGCGTGTATGACAATACCCCCTCCCTGAAGAGAGCATTAACCGCAGCCTCTCTGACCTGCTCAATTGCATTTGTTACTGACGTACGATAATAGTTCAATAATTGAGCGCATGAGAAAACAATAAATCCATGTTTAATCTGAACCCTTAAATAACAGTACCCATTCCGGCCATGAAAACCAGAAAACTCCAG [...]
+NODE 330 2364 113690 113106 0 0
+AGGCCGCTGAAGGAGATAAGCTGCCCCACCGCGATCTGAATGATGAATATAAGTAAAGCCGCAATTTTAAAATTTGCACATTTTTATGGCGACATAATGCCGCCATTTTTTCTTTACGCATCGTCCGCTAAACGTATCACGACTTTGCCAAAGTTCTTCCCCGCCAGCAGCCCCATAAACGCTTCTGGCGCATTTTCCAGCCCATCAGTAATCTGCTCCCGGTAATGTATTTTCCCTTCTTTGATCCAACGCCCCATTTCTTGCTGAAACTCATGTATCCGGTGACCATAGTCCTGGTTGATGATAAAACCTTGCAGGCGAATACGCTTTTTAAGTAATGTCGCCATCAGCAGCGGCAGTCTGTCTGGACCGTCCGGCAACGCTGTCGCATTGTAGCCGCTGACCAGACCGCAGAGCGGAATCCGCGCCGACGTATTCAGTAGCGGTAAGACGGCGTCAAAGACTTTACCACCGACATTCTCATAATAGATA [...]
+TTCGCAATCAGCCATGCGCCAATGACCAGCAACAGCGCGCCAAACGCCGGCCCGACCATTGCGCGTAACGTGACGCCGTGGCTACGCGCGATATCCAGCGCCAGTCCGCCGATTAACTGGCTGGCGACCAGTACCGCGATAGTCGTCGCGGCGCCAACGTTCTGATACCCGCTAATGCTGGCAAATACAAAAAATGACCCCAGCAGACCGGGGATCAATGTCCACCAGCGCACGCTGGCGACCAGCTCGCCGAAGCCCGTAGCGCCTTGCTTAAACCACAATATCGTCACAAATAAAACGATCCCTACCAGCGAGTTCAACAGCATAGCGATCAGAATCGTCGATGATGTCTGCGTAATACGCACCATAATACTGTTTTGTACCACCAGCCCGACGCCGGCGGCGATCAAAAAGATAAGCGTCAGCGACTGGTTCATCAGCAGGCGTCCGGCGCGGCGTGTTCATCAAGCTGGAGCTGCATAAACGTAAGAT [...]
+NODE 331 8613 468067 461075 0 0
+CGTCAGGATAGAGCGGCAGCATGGGCGCAACAATCGCCGTGGCGCCCATCATCGCCACCGTCGCAGAGCCGACCGCCGCGTGCAGAATCAGCGCTACCAGCCATGCCAGCAGAATCGGGTGCATATGCATATTTGAGAGGATCACCGCCAGCGTGTCCGCCAGCCCGCTACTTTTGAGAATGGCGTTGAACGCGCCGCCCGCGCCGATAATCAGCAGGATGTTCGCAATGGCGCCAAAGCCGTTTTCGGTGTGGGTAAGTAGCGCGCTCATACCCATATGCTGGCGCAGACCGAGTATGTAATACGCTACAAAGACAGCGATAAACATTGCGGTGATCGGATTACCGATAAACTCCAGCAGCGTATACAACGTGCCGTCTTTCGCCATATTCAGTTCAGCGACGGTTTTCACCAGCATCAGGCCAATCGGCAGCAGAACGGTAAACAGCGTTGCGCCCAGCGATGGCAGGGTGTTTTCGGCGCGCACTTCAA [...]
+GTACCACCTTCGCCACGTCTTCCAGTTTATCGATCTGGCTTATCATCTGTTCAAGCCGCTGATCGTCATTGACCAGAAGCCAGATGCGGCTCTGATCGCTACCCTGAATCGGTAAACAGAGAATACCCTCAACGTTGAAAGCGCGTCGGGCGAACAGCCCGCAGACGTGGGTCATCACGCCAGGATGGTTGCGAACGGTCAGCTCCAGAATAACGTTATCATGTGATTGTTTCTGCATGGCTTATTCCCCCACCATCTCTGTATTTGCCGCGCCCGGCGGCACCATCGGATACACTTTTTCTTCTGCATCAATGCGCACATGGATCAACGCCGGTCCAGGACGACGAATGATAGCCTGCAACGCCGCCTGCGGATCGGCTTCGTTATTCAAATCACAGGTGTCCAGACCAAACCCGGCGGCAATCTGCATAAAATTGATGCTTCCCGGATAGGTTGCCGCAAAAACGCCCTGTTTATAGAACAGACTCTGTT [...]
+NODE 332 8103 430887 421876 0 0
+GACAGCCTGCTCTTCCGGACGCCACTCTACGCCGCCTTCACCCAACATAATCAAAGGACCAAACACCGGATCGTGCTCGACCACCACTCGAAGCTCCTGCGCGCCGGCGCGGTTAGCCATGCTTTGTACCAGCAAACCGTGAATCCGCGCCTGCGGCCAGGCCATCTTTACACGATCGAAAATGGCGTTCGCGGCCTGTTGTACCTCGCTTGCGGTCCGCAGGTAAAGCATGACCCCCTGAACTTCAGATTTATGCGGAATGTCGGGCGAGCGCAGCTTGAGAGCTACCGGATAGCCTATCTGTTCGGCGATATGCACCGCTTCAGCGCTGTCGCTGGCAATCCAGGTTGGGAGCGTATGCAGCCCATAGGCGTGTAAAATCGGCTGTACTTCATGGGTATCCAGTGAGGTGGCGCCTTCCGCAATCGCCCGCTGTAACAGATTATGCGCCTCAGCGGTATTGGACGTCAGGTTACTCGGCAGCGCTGGCGT [...]
+AACGTGAACGCGTCCATGAATTGGCTGAAACGCTGCGTCTGGCAGGGATCAACAATTGCTATCTTGAAGGTGAGATGGCGCAGATCAAACGTAACGAAGGTATTAAGCGTCTCACCGACGGTCGCGTTAACGTGCTGGTCGCGACCGACGTCGCGGCACGCGGGATTGATATTCCTGACGTCAGCCACGTCATTAACTTCGACATGCCGCGCAGTGGCGATACCTATCTGCATCGCATTGGTCGTACAGGCCGTGCGGGTCGCAAAGGCACTGCAATCTCGCTGGTAGAAGCCCACGACCATCTGTTGCTGCTGAAAATCGGTCGCTACATCGAAGAGCCGCTAAAAGCGCGCGTCATTGATGAGCTTCGCCCGACCACGCGTGCGCCAAGCGAAAAGCTGACCGGCAAACCGTCGAAAAAAGTGCTGGCGAAACGCGCCGAGAAGAAAAAAGAGAAAGAAAAAGAGAAGCCGCGCGTGAAGAAACGTCACC [...]
+NODE 333 367 19570 19570 0 0
+GTTGGATATGGAGGTAAGCGTTGATCGGGGCAGCGTATTTAATCTGTTTATTAAAAAGTTTAGCTCGCCCTCGCTGCTGGAAGAATATCTTCGTTCTTCTCCGTATGTCATGGATCAATTAAAAGGCGCGCAAATAGACGAGCAGGATCTTCACCGGGCGATTGTCCTGCTGAGCGAAAAAATGAAAGCGGTGGACAGCAATGCCGGCAAGAAAAATGAAACGTCGTTATTCACGTCGTGGACATTGAGTTTTACCGCGCCGACGCGGGAAGAAGCGCAAAAAGTGTTAGCTGGCTATATTCAGTACATCTCTGATATCGTCGTGAAAGAGACGCTGGAAAATATTCGTAACCAGCTGGAAATCAAA
+TATCAGAGATGTACTGAATATAGCCAGCTAACACTTTTTGCGCTTCTTCCCGCGTCGGCGCGGTAAAACTCAATGTCCACGACGTGAATAACGACGTTTCATTTTTCTTGCCGGCATTGCTGTCCACCGCTTTCATTTTTTCGCTCAGCAGGACAATCGCCCGGTGAAGATCCTGCTCGTCTATTTGCGCGCCTTTTAATTGATCCATGACATACGGAGAAGAACGAAGATATTCTTCCAGCAGCGAGGGCGAGCTAAACTTTTTAATAAACAGATTAAATACGCTGCCCCGATCAACGCTTACCTCCATATCCAACACGCGCAGCGCGGTCAACGTTCTCTCCAGCCCCTGCCACTGTACCGACTC
+NODE 334 51 3198 3198 0 0
+TTTTGATTTCCAGCTGGTTACGAATATTTTCCAGCGTCTCTTTCACGACGA
+ACCCGCTACGAGCAGGAAAAGCTGGCGATGGATCGGGTGCGTCTCAAAAAC
+NODE 335 3932 237531 234539 0 0
+GCATGAGTCCGTTTGAACGCATTCCGGCTTATTCGGTTTACCTCCCCCATCATACGGAGGCGAAAGTGACAGCCGAAACCGACCTTGAGCTGGCCGTATGCAGCGCGCCGGGATTCGGAGAGCTTCCGGTACGTCTGATCTCGCCACAAGAGGTCGGGGTAGAGCATCGGGGAAAAGGGCGCAATCAGCGCCTGGTGCATAACATCCTTCCTGATAGCCAGCTCGCCGACAGCCTGCTAGTCGTTGAAGTGTACACTAATGAAGGCGATACCAGCTCCTGGCCCGCGCACAAGCACGATACGGCAGTTGAAGGTCAGGAGACCTATCTGGAAGAGACGTACTATCACCGTTTCAATCCACCTCAGGGATTCTGCTTACAGCGCGTCTACACCGACGATCGCAGCCTGGATGAATGTATGGCGGTCTATAACCGGGATGTAGTGAAAGTACCTAAGGGCTACCACCCGGTTGCCACCATCGCGGGTTACGATA [...]
+TTGCCTGGCTGTACAGCGCCCATGAAGTGAGCAACAAGCCGATGATGCTGCCGATAGTGCCTTTACGCATCAGCGACAAACGCCCCATCTTATCCATGATCATTGCGCCAATAATGGAACCGATAAGCTGAATCACGCCGATCCAGATTGTCTGGAACAGGGCCTCCTGGGCGCTACCGGTCACATCCTTAAGGACGATTGGCGCGTAATACATCATGACGTTAACCCCTGTTACCTGTTGCAGCATAGCGATCATGCAGCCCAGGATCAGGATGAAACGCACGTTCCCGTCGCGGTAATTGAGTTTTTGATGGGCGTTTAGTTGGTCATTTTGCAGTGAGGTTTTTATATCGGCAAGAAGATGTCTGGCATGTTCTTCGTTGGATATTTTGGTCAGTATTTTTAGCGTCTCCTCCTCGCGACCAATCATCATCATCCAGCGGGGAGATTCCGGGATTAAAAAGACTAAAATACAGAACAAAATGCAGGGAA [...]
+NODE 336 3779 245259 244008 0 0
+AAACTCATCCAATGCTAATAAGGTTGCAGCTTATGCAATATCGGCATCACCTCGAACTAACATGGCTCGAAGACTGTCTGGCTCTAAAAGAAACGTTGAATTTCTCAAAAGCGTCTGCCTCAAGATATGTGACTCAACCCGCATTTAGTCGTCGGATACAATCTCTCGAAGAATGGGTGGGTACGCCCCTTTTTGAAAGAAGTAAACGGGGAGTCACCCTTACCAAGGCCGGAGAAGTATTTACAGACCAGCTTCCCGAACTGATCCACTCCTTGTACACATTGAAAAGTGATACCCTTGAGGCCGCAGGTAATAAACAACCCAGTCTTGTTTTTTCAGCAACGCATGCTTTGTCTTTCTCTTTTGTACCGCATTTGTTAAAACAGAGTGATAAAATTGCAAAATTTGGTTCATTTCGTCTTTTATCTGACTCATTGAATGCGTGCGAAAAAATGATGCGGCAGGGAGATTCACAATTTTTGCTGTGTCACC [...]
+ATGCCAACTCCTGTAAGCAATTTCAAAAGCAGATGGAGGTTTGCGCCGATGTCTGCCAGCAGATAGCGGGCGGTGAAAAAGCGATTATTGGCGTGATGGTAGAGAGTCATCTGGTAGAAGGAAACCAGAGTCTGGAAAGCGGTCAGCCGCTGACCTACGGTAAAAGCATTACTGACGCCTGTATTGGCTGGGAAGATACCGATGCGCTGCTTCGTCAGTTGTCGGCAGCGGTAAAAGCCCGTCGCGGCTAAGTTTAGTTTCTATCCTGTGGTGAAGTGCAGGATAGAAAACATATCGGTCCGGTAACAGCCTACCGGACCGATATTGCCAATATTAATGTATTATTATTTGGCGTACTTAGGTACTTCCTGCTTCTGGAGGGTATTTCCTTCCGAATCAATTCCTACAATGACTCTATAGCGGTCAAAATATAACTTCTTAATGGATTCTGTTCCTAATTCTTCGTAGGCAACAATTTCTACTGATTTAACA [...]
+NODE 337 2680 136402 134944 0 0
+GTCGACGTCCACTGGTTATCAATGGCGATGACCGTTTCCAGCTTGCGCCAGCCTTCAATTATGCGGTTAATTTGTTGGTGTCGGTGGAACGGGTTGGTCCCGGCGAACACGCACATCTTCAGCGGCGGTAATTTAACCGATTTGCCGTTCCAGTTAATGACCTTGCCCGGTTCAAGAATGGCATCCATAAAACGCGCAATAGGAATGGTGCTGCTGTAGCCTTTGTAATCCGTGCTGTCGTGTACTGGCGGAACGGTCGTCGAACCGGAAAAGCCGCTTAAAATGATCCCTTTACGGCCAGGCGTCCCGGCGCCGTTGTAGTGCCAGCCAAAACCAAAGCCGCCGCCCGGTAAACCAATCTGTCCCAGCATTGCCGCCAGCACGACGACCATCCATGACCACTGTTCGCCATGCTGCATACGTTGTACGCACCAGCCAGCGATGATTTGCGTTCTGTCGCCCGCCATCTGCCGCGCCAACGCGCGGATGGTG [...]
+TCGTGTTACCTCACGTCGGTATCAAACTGACCAGTACGACAGAGTTTTGCGTCAGCTGCCATAGTATGCAGCCGGTGTATCAGGAATATAAACAGTCCGTACATTTCCAGAACGCTTCCGGCGTACGCGCGGAATGCCACGATTGCCATATCCCCCCTGATATTCCAGGCATGGTGAAACGTAAGCTGGAAGCCAGCAACGATCTTTACCAGACATTTATCGCCCACTCGATTGATACCCCAGAAAAATTTGAAGCCAAACGCGCCGAGCTTGCCGAGCGTGAATGGGCGCGCATGAAAGAGAATAACTCCGCGACCTGTCGTTCCTGCCATAACTACGATGCGATGGATCACGCGAAACAGAACCCGGAAGCGGCGCGGCAAATGAAAATCGCCGCGAAAGAAAATCAGTCCTGCATCGACTGCCATAAAGGGATTGCCCACCAGCTACCGGATATGAGCAGCGGTTTCCGCAAACAGTTTGATGAACTGC [...]
+NODE 338 6159 302234 295646 0 0
+TGGAAGCCCGTGGTCTCAACGTGACCATCATGAAACTGGATCCGTACATCAACGTCGATCCGGGTACTATGAGCCCAATCCAACACGGGGAAGTGTTCGTTACTGAAGACGGCGCTGAAACCGACCTGGACCTGGGGCACTACGAGCGTTTCATCCGCACCAAGATGTCTCGCCGCAACAACTTCACGACTGGCCGTATCTACTCCGACGTTCTGCGTAAAGAACGCCGTGGCGACTATCTGGGCGCAACCGTACAGGTAATCCCTCACATCACTAACGCGATTAAAGAGCGCGTGCTGGAAGGTGGCGAAGGCCACGATGTGGTACTGGTGGAAATCGGCGGTACCGTCGGTGATATCGAATCGCTGCCGTTTCTTGAGGCGATTCGTCAATTGGCGGTAGATATCGGTCGTGAACACGCGCTGTTTATGCACCTGACGCTGGTACCTTACCTGGCGGCTGCGGGCGAAGTGAAAACTAAACCGACTCAGC [...]
+TACACGCAAAAATTCCAGTCGTTGGCGCACGGTTTATCCCCGCTGGCGCGGGGAACACCCAGCCTCCCGTTACGCATATTTGAGGGTTTTCGGTTTATCCCCGCTGGCGCGGGGAACACGCGGCGCTGATTATGATTTCCCGATAATTTATCGGTTTATCCCCGCTGGCGCGGGGAACACCTTTCGGGTTGAAAGCAGTAGCACTCATGCCCCGGTTTATCCCCGCTGGCGCGGGGAACACCATTCCGGCGAGACTGAGCAGCGGGCGAACCGCGGTTTATCCCCGCTGGTGCGGGGAACACGGCCGTCTGCATTGAGCGCAGTTTTAACGCGTCGGTTTATCCCCGCTGGCGCGGGGAACACTACGGATGTGTGACGGAGTCGCGTTTATGGCGCGGTTTATCCCCGCTGGCGCGGGGAACACACCGTTTCACGGATGAGAGTTGGCGGAAGCGCCGGTTTATCCCCGCTGGCGCGGGGAACACCAGGAAT [...]
+NODE 339 2545 141787 139268 0 0
+TAATAAACTGGCGTTTGACGGCAGCGGCTACCTGGCCTGGGAAGGGCTGATTTGTATGCAGGAAATCGGTAAATGTACCGAAGAACATCAGGCGATTGTGCGTAAGTGGCTGGAAGCGCGCAACCTTGAAGAAGTCCGAACCAGCGAACTTTTCGACGTTTGGTGGGACTAATGAGTACAGGGTCGGCAAATGCCGGCCCGCTTTGTCTTGAGGGAAAGTTATGATGCGCAAAACGCTGCTGGCGGCAGTGCTAACGTTTACGGCGATGGCCGCTCATGCAGATTACAAATGCAGCGTCACGCCGCGTGACGATGTGATCCTGAGTCCACAAACGGTGCAGGTGAAAGGTGAAAACGGCAACCTGGTGATCACGCCGGACGGCAATGTGATGTACAACGGCAAGCAGTACACCCTTAGCGCCGCGCAGCGCGAGCAGGCGAAAGATTACCAGGCGGAACTGCGAAGCGCGCTGCCGTGGATTGATGAGGGAG [...]
+ACCAGGTGGCCTGATTGCCCCTCGAATCAAGATTTTTTAAGGTAATGGAATCCAGTTTAAGTATGCCGTGGTACTGCTTACTAAACTGTTCTTTTAAGATGTTATTGGAGGGTTGAGCAACCTCTGCCCAACTATAGCCTGAAATCAGGGCAAACAGCGCTGCGCCAGCAATCCATTGTCGAACCACTTGTGGACCTCCCGTCCAGAGACATGACGCCCACGATTATCATAACCATGATGATAATTAGCAAGATAATAGTGTTGATTGTGCGAGAGGTCTTCCAAAGATAGCCCCGGCCTTCCGACCGGGGCATTATCTTTAATACTGATTGAACATCGTCTGGATCTGTTTTGGATCTTTAGTCTGGGTTAACGCCAGTTGCAGTAAGACACGCGCTTTTTGCGGGTTCAGCGTGCCAGAGGCGACAAAGCCGTATTTTGCATCGTCCACTTCCGCATCCTGCGTGGTTGCGCCAGTCGGCACACGTGAAG [...]
+NODE 340 3533 202183 201141 0 0
+TTTAGTGTTATTTCTATGGGTACTTAAAACGCATATTAAAAGGAATCAATATGAATAAAATGACATTCGCCGCCGCGGTCGTCTGTTTCTCATTTTCCCACGCCAGCTATAGCGAAGAAATGTCTGCCACTGGATGGTATGCGGCATCGTCTGCGGTTGTCAGCGTGGGCAGTTCCGCACTGGTTAGCGGAATTATACTCTCCCCCGTACTGCTGCCGCTCAACCTGAGCATTGGATCTGTTGTCGAAAATAAAAAGCAAAAAACCGCGCTGTTAACCACTAAGTCCCCCGATAACAAAGACATTAAAATGCAAGTTCCGCTAAATGTCGTCAAAGAAGGCAACCTCAAAGCAGGTGATAAAGTCACTCTGGAAAAAACGCAGGAAGGCACCGGCGCTTATTTGAAAAAAGAGGGCAAAGTCCTTGCCCATATGGTAAATCAGGACGACGCAGGACTTTCCAGCAACCAGACGGTACCGGCCAAATGAAGCG [...]
+AAAAACGCAGAAAACCGGCGACGATCGCCGGTTCTTCCGTTTGCAGATGCAAGTCTGCAATAAACAGTGTCGCCACGATTACTCGCTGACGGTCACGTTTTCAATGATGACGTCTTCTTTTGGTACGTCCTGGTGCATACCGCTACGGCCAGTGGCGACGCCTTTGATTTTATCTACCACGTCCATACCTTCTACGACTTCCGCAAAGACGCAGTAGCCCCAGCCCTGCAGACTTTCGCCGGAGAAGTTCAGGAAGTCGTTGTCTGCCACGTTGATGAAGAATTGCGCGGTAGCCGAGTGTGGCGCCTGAGTACGCGCCATTGCCAGCGTACCACGGGTATTTTTCAGACCATTGTTGGCTTCGTTTTTGATCGCCTCTTTGGTGGCTTTCTGTTTCATGCCCGGCTCAAAGCCGCCGCCCTGAATCATAAAACCGTTAATCACACGGTGGAAAATGGTGTTGTTGTAAAAACCTTCGCGGCAGTAGTCCAG [...]
+NODE 341 2372 113559 112432 0 0
+CGGCTAACAAAAGATTGCAGCTCGGCAATTTGCGCTTTTTTCTTCGCATTATCGGCCAACAGACGTTCACGCGCCTGGGTCGCCGCCGTCATATACTCATCATAGTTACCCGGATAGACGCGCAAGTCGCCGTAATCCAGATCCGCCATATGCGTACAAACCATGTTCAGGAAGTGACGGTCGTGCGAAATGATGATCATCGTGCTATCGCGCTCGTTCAGCACCTGCTCCAGCCAACGGATAGTATCAATATCCAGGTTGTTGGTCGGTTCGTCGAGCAACAGGATGTCCGGATTAGAGAATAACGCCTGCGCCAGCAGCACACGCAATTTCCAGCCTGGCGCGACTTCACTCATCAGACCGTAATGCTGCTCCAGCGGGATGCCCACCCCCAACAGCAGTTCGCCCGCGCGCGCCTCAGCGGAATAACCGTCCATCTCGCCGTATTTTACTTCCAGATCGGCGACTTTATAGCCGTCTTCTTCGCTCATT [...]
+AACGCAATTGCCGGCGTTGCAGGGCGTTTTCAACCAGGTTGGCGCACTGTCTCACCTGGGACTTTGGCTAACCGCTATCGGCCTGTCGCAGGTTATCAGTAATGTGCCCAGTACCATTCTCCTGCTGAACTATGTACCGGCCTCGACGCTGCTGGCGTGGGCGGTGAATATCGGCGGGTTTGGTCTGCTGCCGGGGTCGCTGGCAAATCTTATTGCTTTACGGATGGCGAACGATCGCCGAATCTGGTGGCGATTTCATTTCTATTCGCTGCCGATGCTGGCATGGGCGGCGCTGGTGGGATATGGATTATTGCAACTGATGCCGTAAGAGAAGCCCGATAGTATCTATCGGGCTTCGCAGGCAGAGTCTGTCAGTTCAGACGAACCGGCATCCCGGAACGATCCTGAACTGCCTGTTGTACGACGGTCTGATCAACGTCAGGCTCGTTGGTGACGGCCAGGATACTCTTATTAAGCGTGATCGGCACCGCT [...]
+NODE 342 948 49221 47677 0 0
+AGGAAAGCCGCGAGCGGCATCAAATTGTCGAAAATTTTTTACTGGTATTAGGCGTAAGTCCGGAAATCGCGCGTCGTGATGCGGAAGGGATGGAACACCATGTCAGCCAGGAGACATTGGATGCCTTTTTGGCCTTCACGCAGCAGCATGGAACATCTGTAGAATGAATCTGGCCTTTTTACGGGCGCTGCGGCGTGACCGTTTTTTTCAGTTGTTGATCATTGTGGGGATGGCGTTAAGCCTGTTTGTTCCTTTTGCGCCTCGCGCCTGGCCTGGCGCGATTGACTGGCACACCATTATTACCCTCAGTGGGTTAATGTTGCTCACTAAAGGCGTTGAGCTGAGCGGCTATTTTGATGTGCTGGGACGCAAGATGACGCGCCGATTTCATACCGAGCGGCAACTGGCGATGTTCCTGGTGCTGGCTGCGGCGGCGCTGTCGACCTTTCTGACAAACGATGTCGCGCTGTTTATCGTTGTGCCGCTGACGAT [...]
+GTCCACGCTGACTATCACCCTGCGCGCCAGCACAATAAACCCAGCCGCCACCAACACCAGTCCCCATAACTCTTGCCTGAGCTCCAGCGCGGTAAGAAAAACGACATATAATGCCAGGCAACTCCACACCAGACGGGGCTGCCACTGCGGCGAACGCGTACCGGTATGATACTGTAACGCCCTACCCGGAAAACAAAACCAGCACAGGAGCAGTAACGTCAGCATCATCATGACGGCAAGCGGCGCCATTTGCCCGCTAAATTCAGCAAAGGTTAAGCCGGAGCGTCCCCACAACAGAATATTTTGCGGATTACCGACAGGCGTCAGCAGCGAACCGGCGTTCACCGCCAACGCTTCAAAAATAATCAATCGGTTGACCGGAATCGCGCACAGTTTTTTTAACGTTATCGTCAGCGGCACAACGATAAACAGCGCGACATCGTTTGTCAGAAAGGTCGACAGCGCCGCCGCAGCCAGCACCAGGAACATCGC [...]
+NODE 343 771 44177 43920 0 0
+TACGGGATCAGCTCCGCCGCTGCTTCTTTCTGCTGAATATCCCCTTCAACAGCCAGACGATACAACCCATCCAGGAACGCTTTCAGCGCCGCTTCATCTTCATGTGAAACCTGAATCAGCGATCCCAACGTTTTTGCGCTGGTAAACAATGCCAGCGTTCGCATCAGCAGCTTATATTCCGCGCTGTCGGTATTGGTCAGTGCCGCCCCTTCTGCAAACATATCTCCCATGCTGCCACGCTGCACCTGCTGGTGGAAGTTCAGCTTGGTCCACAGTTCTGCAATATCCAGTTTACTTTCCTGCAGGGAAACGATATTCAGGCGAACGCCACGGCCCAGAATACGACGATCGTCCTGACGTGCCAACATCAGCATCGCAAAACCGGAGAGCTGTGCGGCACGGTCGTCGATGTCCAGGCCGAAAATATTGTTTTCCAGAATCAGCTGCGGAATGTCACGGGTACGGTAACCGCGCTCTTCGTAAATGGCCTTC [...]
+TTGTGCAGTATCTGGTGCAGAACTCGGTGGGTCGCCAGTGGCTGCAAACCTACCCTGATTCCAGCTTGAAAGGCAAAATGCCGTACTACATCGAGCCAGCGGAGCAAACGCCAGAGGTGCAGGCACAGCTGGCTGAGATCACTCCATCCAGCATTGAGCCTGAAAGCATTAAGGTACTGGACCCAGCCTGCGGTTCCGGGCATATCCTGACAGAAGCCTATAACGTGCTGAAGGCCATTTACGAAGAGCGCGGTTACCGTACCCGTGACATTCCGCAGCTGATTCTGGAAAACAATATTTTCGGCCTGGACATCGACGACCGTGCCGCACAGCTCTCCGGTTTTGCGATGCTGATGTTGGCACGTCAGGACGATCGTCGTATTCTGGGCCGTGGCGTTCGCCTGAATATCGTTTCCCTGCAGGAAAGTAAACTGGATATTGCAGAACTGTGGACCAAGCTGAACTTCCACCAGCAGGTGCAGCGTGGCAGCA [...]
+NODE 344 1327 92981 92131 0 0
+AGCCGAAAGACGTCCCGAAACGCAGTAGCCGCCTTTCGGCGGCTACTTAAAAAGGGATAGTGATCCGTGCCGCCTTCAGGAAGGCAGCCACCAGCGGAGATGACGTTGCGTAGCGTTGGATCGTTTCGTGTTCATGTGATCTAACGTATCACGACTAAACGTAAGGGTAAAGCGGCTGGCGTGTCGTCCGGGCATAAAGTCATATCGCCTGAACAGAGAACATGTTACTGACTTTGAAACGCGATTTTATAATTTGCTGCCCAAAAATACGTGGCGCTGAAAGGCGCATTTTTGATGCAAATCATTTATTACTGTGATAACACTGCGCGCGATAAAAACATTAAATATATTCACATAGTAAATATGTTCTATTGGAATGGTTGTTTTCGATATGACAAAAGTCTAAAAAACCCATTGATGTGAAAAGGAATAAGAATTGTCTATATTCCGATTCGGTGGAATTAAGTAATTTCTCGGATAAAAATAAGAAAT [...]
+ATGCCATTTCGCTATACAGCATCGCCCACTGCGAGTCCGCAAGCTTGTTTTGTTCTCATCGCCACAGCGCCTGTCGGTGAAGGGGCCGCCGTGTTTTGCTTTTCGACGCTAATGCGGGAATATCCCAGCGAATATGGCTATAAACCAAATCCACGGTCTCCGTGGCGCTGCCTTCGGCGTCGCCATGATTGCTCATGCGTGAAATTCGCACATTAGTGAGCGTATAAATAATAAATGGCAGCATTGCGCCCTTATCACGACGGCATAATGTCAGCACGCCTTCTTTCACCGTTTTCCCGTTACAATAGTGCTCATAGAGGCCAGGCGTAGCAAGATCGACTGGCTTTGTCAGCGTCAACCCTCCAATATATGTCCCTCTCGCTTCGCCGGACTCCCGTTTCGTCGGGTTGTGGTTGTAAGCAATAAGTTTTATTTGGTTTTCAAAACCTTTGATCTGGCTTTCGCCTTCAATACCGTCCAGTTTTAAATAGA [...]
+NODE 345 1735 84176 83778 0 0
+CATCATCGCCGCGCTCGCGCAGCGGCGGCACAAAGAGCGGGAAAACGCTCAGGCGATGGAACAGATCGGCGCGAAAACGCCCTGCCAGCACCTCTTCACGCAGGTCACGGTTGGTTGCCGCCAACACCCGCACATCCACGCGCAGGCTACGATCGTCGCCGACGCGCTGAATATCGCCATACTGCAACACGCGAAGTAGCTTGGCCTGTAGCGCCAGCGACAGTTCGCCAATCTCATCCAGAAACAGCGTACCGTTATCCGCCATTTCGAACTTACCGCTACGATTACTGATAGCCCCGGTAAAAGCCCCTTTTACATGACCAAACAACTCGCTCTCCGCCACGCTTTCCGGCAGCGCGGCGCAGTTGAGATAGACCAGCGGATTGACCGCTCTGGGGGAGCCCTGGTGAATAGCTTTCGCCACCAGCTCTTTACCGGTCCCCGTTTCACCGCCGATCAGCACGTTAAGATCGGAGCCCGCCACAATCTCGA [...]
+TTGCCGTTGCCGATATCCAGCGTATCGCCGGTTTTCACCACCTTAAAATTCCATTCCGGGTGATGGTGATGGCCGTTGATAGAGTCAATGGCGTTGGCGGTACAGTAGATAGGCGTGTCCGGGATCTGCGCCATCAGTTCGGTCAGCGCGCCTGCATGGTCTTCTTCGGCATGGTTAATGATGATGTAGTCGATGTCCGCGAGGTCGATTTCACTGCGCAGATTTTGCACAAACTCACGGCTAAACTTATGATCGACGGTATCGATCAGCACATTCTTTTCTTCACGAATGAGATAGCTGTTATAGCTGCTGCCACGCAGCGTTTTGTATTCAGTGCCGTGAAAATCACGTACTTCCCAGTCGCGTTGGCCAACCCAATGAATATTATTTTTAACCAGAATAGACATAACCACCTCAATTCATTCAACGTTTGCAAAAAGTTGTTTTGCTTATTGCAGGTAGTGTGCCAACTTTACATCTTATTGATTTATA [...]
+NODE 346 3198 165986 164206 0 0
+TAAAGTGTGGGTTGGTCATGCCGATTTCTTCGCCCTGATAGATATAAGGCGTCCCTTGCATACCGTGCAGCGCCATCGCCAGCATTTTCGCGGCTGGAACCCGGTATTCCCCCTCGTCGCCAAAGCGGGAAACGATGCGCGGCTGATCGTGATTACACCAGAATAACGCGTTCCAGGCGACGTTATGCATCCCCTGTTGCCAGTGGCGGAACAACGCTTTCAGCGCCACATAATCAGGTTTTGCCAGCGTCCACTTTTCGCCATTGGGGTAATCCACCTTCAGATGATGAAAATTGAAGGTCATCGAGAGTTCGTCGCCGCTAAGCGCGGCATATTGCTGGCAGTTTTCCAGCGTGGTAGAGGACATTTCGCCTACCGTCATCAGATTACGCGGCGTAAAAACGTCACGGTTCATTTCGCGTAAAAACGTATGCGCGCGCGGTCCGTCGGTATAAAAGCGGCGTCCGTCGCCCGTCGGATCGTCAGGAAAAT [...]
+CACCGCAACATTAGCTTTCTGGGCGTTCCCCATAGCGATATTACCACCGGCAAACGTCGGCATGACGCATACCTGGCGTTTTGCAAAAAACATAAACTTCATCCCGTCGCCGCCCTGCCCGGTCTTGCCATGAAGCAGGGCTATGAGCATACGGCAAGCGTCATCATGCCGGATACCACCGCGTTAGTCTGCGCCACCGATACGCTGGCGTTGGGCGCCAGTAAGTATTTACAGGAGCAACGTATTGAGACGCTGCAACTGGCAAGCGTCGGGAACACGCCGCTGATAAAATTCCTGCACCCGGAGATCGTCACTGTCGATCCTGGCTATGCTGAAGCCGGACGACAGGCGGCTTCGCAGCTGATCGAACAGATCAATGGCCGCTGCGATCCGCGCCGGATCGTCATTCCTTCTACCCTCGCCTGAGTGACTAATTAAACGGAATACCACGAGTAATTTGTGATCGTCGCTGCGTTTCGGGAACGTTCCCAT [...]
+NODE 347 24 2764 2459 0 0
+TATCGGTTCGGCGGGGGTGTCGGC
+CAGGTTCATCAGCTTCGCCATCAG
+NODE 348 603 31477 31382 0 0
+TATCGCCGCCCTCCATATATTTGCCGATCTCATCCGGGTTGACGTGATACAGTCGCTGACCTTTTTCGTTGCCAACGGTAATGTAAGTCGCATCCGAAAACGAGCGCATTGGGTCAATCAGCGCTTTGATGCGTGACAAATCATGCGCCTCTACGGCTTCAACTAATTCTGGCATAGCGGATATTTGCATTGCCTGAATAAGCGCACGTTGGCCCACCTGATAATGCAGGCGCTCTTTCGTGATATCGGTCAGATACCAGGTGATTGCCAGCATCACGATGGTGGATGTAAACAGGATCAGTAGAAATATCCGGTTTTGAAACGAGCGTCTGGCAAACCAGTGTGTAATTTCCCGTATAAACATATTGGTAGTTAGATATTTAATTACGGTATTTTCTTGCATTCGGCATCACCGGAACCTGAACCAGTTCATACTTACTTTTCTTTCAGAAAAAATTTGGATGAAAATGGGATACGACATGCGTATCCCAT [...]
+TATCGGTTCGGCCATTGCGGCGGGCGTGATGCTGAAGTACGTGCTGGCGATGTAATAGTGGATGGGATACGCATGTCGTATCCCATTTTCATCCAAATTTTTTCTGAAAGAAAAGTAAGTATGAACTGGTTCAGGTTCCGGTGATGCCGAATGCAAGAAAATACCGTAATTAAATATCTAACTACCAATATGTTTATACGGGAAATTACACACTGGTTTGCCAGACGCTCGTTTCAAAACCGGATATTTCTACTGATCCTGTTTACATCCACCATCGTGATGCTGGCAATCACCTGGTATCTGACCGATATCACGAAAGAGCGCCTGCATTATCAGGTGGGCCAACGTGCGCTTATTCAGGCAATGCAAATATCCGCTATGCCAGAATTAGTTGAAGCCGTAGAGGCGCATGATTTGTCACGCATCAAAGCGCTGATTGACCCAATGCGCTCGTTTTCGGATGCGACTTACATTACCGTTGGCAACGAAAAA [...]
+NODE 349 1103 70035 69541 0 0
+TCATAACGACAAATAATTTTGTGGAGAGCACAGTGGATACGGAATTGTTAAAAACTTTCCTGGAAGTTAGCCGGACACGCCATTTCGGGCGGGCCGCAGAAGCACTTTACCTGACGCAATCCGCGGTGAGCTTTCGTATCAGGCAACTGGAGAATCAACTGGGCGTAAACCTTTTTACACGGCACAGAAACAATATCCGTTTAACCACGGCTGGCGAAAAACTTTTACCGTATGCGGAAACGCTGATGAATACGTGGCAGGCGGCACGTAAAGAGGTGGCGCATACCTCACGCCATAACGAGTTTTCCATCGGCGCCAGCGCGTCTTTATGGGAGTGTATGCTTAACGCCTGGCTGGGGCGACTGTACCAACTACAGGAGCCGCAAAGCGGCCTGCAATTCGAAGCCAGAATCGCTCAACGGCAATCGCTTGTGAAGCAACTTCATGAACGCCAGCTTGATCTCCTCATTACTACCGAAGCGCCCAAAATGG [...]
+CCTAATTAGGGGCGTAGTTCAATTGGTAGAGCACCGGTCTCCAAAACCGGGTGTTGGGAGTTCGAGTCTCTCCGCCCCTGCCAGAAATAATCCTTAGCATCTGCTAAGGATTTTTTTTTGCCTGAAATTACCTGATTATCTGATCAGGTAATCGTAAGTTCCCTTCTTTTTCTTTTCATCATTTTCATTGTTCATCCAGCACATCCGTTTTTAACAGATCGCAGATCAGCGAGTATTTATCGCTGTTTTGCAGCCAAATGGCGTATAGCGGCCGTGAAAGCGTTGCGCTGTCGGCAACGGTATGTAATCCGCCCTTTTCATTTGCCCAGTTTACAGGAAGCCAGCTACAGCCATTTAATGCGCTAAGCTGCTGTCGGGCGAGTTCGGCTGAGCTGGTTGTTAATACCGGCACTTCATCTGCTGCGATCAGCCCGGTTTCATGCTGTTGGAAGTCTGGTCCCCACTCCAGCCGCAGATAATTGAGTTCTGATT [...]
+NODE 350 1544 87180 86392 0 0
+AACAACGGAAAGTTCCACGGGATTATCTGCCCCACGACGCCAAGCGGTTCGTGAAAATGGTAGGCCACGGTTTCGCTATCAACTTCGCTGATCCCGCCCTCCTGCGCACGTATACAGGAGGCGAAATAGCGGAAATGATCGATCGCCAGCGGTACGTCGGCGGCGCTGGTTTCACGAATCGGTTTACCGTTATCCCAGGTTTCCGCTGTCGCCAACAGTTCGAGGTTTTGTTCCATCCGATCGGCGATCTTAAACAAGATAGCGGCACGGTCTTGTACTGACGTATGCGCCCACTTATCTTTCGCCTTATGCGCGGCGTCGAGCGCTAAATCGATATCTTTTTTACCGGAGGAAGCGACTTCACATAGCGGCTGGCCGGTCACTGGCGTCAGGTTTTGATAATATTCGCCGTCGGCGGGCGCAACCCAGTCACCGCCAATAAAATTGTCATAGCGGGCTTTTAATTTCAGTGGGTACCCGTATTCACCTGGC [...]
+TCGGCACCTGGAGCGCCTCCCACATTTCAAACGTTTCAAGATGCCGCGTCAGGAGCGGGTAGAGCTTTTCCTGTTCGCTTATTCCTCCGCCGATCAGCACCACGCCCGGATCAAACATAGAGATCACGCTGTAAACGCCGCGTGACAGATAACGCGCCCAGTCATTGACCGCCTCACGCAGATGAACATCGGTCGCCATTCGTTCGAAGATCACATCCGCAGGCGGCATCTCTTCGGCGGGCAGCGCCAGCGCCTGGCGGCACGACGCCATTAATCCGCTGGTTGACGCGATTTTATGCATACTTTCGCCATTATTCCCGACCGGCATGACGCCGAATTCACCGGCATGGAAATGTGCGCCGCGATACAGTTCTCGTCCGACGATAATACCGCCGCCAATGCCGGTTCCAATGGTAATGCAGACCATGTTTTCGTAATGCTGCCCGGCGCCTCGCCACATTTCGCCCAGCGCCGCGCAGTTCGCGTCGTTCT [...]
+NODE 351 45 2366 2366 0 0
+TTTGCATGTGGACGGTACGCTGCATCTGCTGCTGGGCGGCGACGG
+TAGCGCCGCTTCGGTACTGCCGACATTGGTCGCTTTCGAGTCGTT
+NODE 352 6844 329043 324085 0 0
+TTGCTTACCATGACCGCCCAGCACAAACAGGGCGAGAGCGGGGTCAGTCAGAATAACCTGGGGCTGACGCTTAACTACCGCTTCGGCGTGCCGCTCAAAAAGCAGCTTGCCGCCAGTGAAGTGGCGCAAAGCCAGTCATTACGCGGTAGCCGCTATGATACGCCGCAACGTAACTCGCTGCCGACAATGGAGTATCGGCAGCGTAAAACGTTAACGGTTTTTCTGGCGACGCCGCCCTGGGATCTTACGCCTGGTGAGACGGTTGCGTTAAAATTGCAGGTGCGCAGCGTGCACGGTATTCGTCATTTGAGCTGGCAGGGCGATACACAGGCATTAAGTTTGACGGCAGGAACGAACACCCGCAGTACCGAGGGCTGGACAATCATTATGCCGGCCTGGGAGCACCGCGAAGGCGCGGCAAATCGCTGGCGTTTATCGGTGGTGGTTGAAGATGAAAAAGGTCAGCGTGTCTCTTCCAATGAGATCACGCTC [...]
+GCGATAGTTCATATCGAGGTGATACCAGTGGTTCAGACCGGCGCCAACGATAATCATTGAACGCCCGTGCGTTTTGTCCGCGTTATCGGCGAACTCCCGTGCGATACGGATGATCTGCGCCCGCGGCACGCCAGTGATCTGCTCGGCCCATGCTGGCGTATACGCTTTGGTATCATCATAACTGGCGGCACAATTTTCATCGTTCAGGCCGCGTTCCAGACCATAGTTCGCCATAGTCAGGTCATACACGGTGGTGACTAACGCGGTAGAACCATCGGCCAGTTGCAGACGTTTAACCGGCAATTTGTGCAGCAGGACGTTATCCAGCGCCACATGATTAAAGTACTCTGAACCTTCGCCGCCGAAATACGGGAAGCCCACGTCAGCAATCTCATCCTGGCTGCCCAGCAAGCTGAGCTGCAATTCAGTTTCTGCACCGGTAGTCCCGTCGCGCTGCTCGAGATTCCATTTGCCTTTTTCGCCCCAGCGGAA [...]
+NODE 353 12956 640292 633161 0 0
+ATTTTGATATCGGACTGCGTAACCTCGATCTGATTATGGGGTGCGAACGTCGTGTCGTTTACGATTTTGTAAACGTCATTCAGGGCGATGCGACACTGAATCAGGCGCTGATCAAAGATAAGCGTACTGAAAATCTCTTCATTCTTCCGGCGTCGCAGACCCGGGATAAAGACGCGCTAACGCGCGAAGGCGTCGCTAAGGTACTGGACTCACTGAAAGCAATGGACTTTGAGTTCATCGTTTGCGACTCGCCGGCGGGTATCGAAACCGGGGCGCTGATGGCGCTCTATTTTGCCGATGAAGCGATCATCACGACTAACCCGGAAGTCTCTTCTGTCCGTGACTCGGACCGCATTCTGGGTATTCTGGCATCGAAATCTCGTCGCGCAGAAAATGGCGAAGAACCGATTAAAGAACATCTCCTGTTGACGCGCTACAATCCAGGCCGCGTCAATAAAGGCGACATGCTCAGCATGGAAGATGTACTGGAGA [...]
+CATCCGGTGAGATCCAGCCCTGGCGAGGGTTGTTCCAGCGTAACAGGATCTCAACGCCGGTACACTGTTGCGTGCGGGCATTAAGCAACGGCTGACAAAATAGCTCAAACTCCCGTTCGGCAAGGGCCAGATTAATCTCCCAGGAAAAGCTCATTCTGCTGGCCGTCGCCAGCCAGGCGATATAACCGATCAACAGGCTAAGCAATACGGCCAGCGGTAACTGTGTCGGGAGATGTTTGAACGCCAGTACGCCTGCCGACGGCCCGCTGACGCTGATAGTAAAAGGGAAATGCCGCGATGAAAGCTGGTAACGCTCTTCATCTTTTTTTAATTCCGGAAGAGTATCGACCACGCCCCGACCATATAACAGGTGCCGTTTGCCGACCGTCAGGCTGGCGCTGGTAATTTGCGGCTGCTGCGGCTCAAGTAGCATGGTCGTCAGCAAGCCAATATTCACAATTTCCATCACGCCATCCTGGCCATCGGCAGAGG [...]
+NODE 354 2354 118634 116011 0 0
+AAGTTGGATTAAGCTATCCGGTCACTAAACATGTCCGGCTTTATACCCAGGTGTACAGCGGCTATGGCGAATCGCTGATCGACTATAATTTTAATCAGACACGTGTCGGCGTCGGCGTGATGCTTAACGATATCTTCTGATTGGATCGTGTTTTAAACATTGCAGTTTCTCTCGCAGGCGCTGAAAATAGCGCCTGTTTTGATTTATGGTGAACGGGGTTAATGTGGCGCAGGCGGAAGTGTTGAATCTGGAATCAGGGGCCAAACAGGTTTTGCAGGAAACCTTTGGCTACCAACAGTTTCGCCCGGGCCAGGAAGCGATTATTGATACTGCGCTCTCCGGTCGCGACTGTCTGGTCGTCATGCCCACCGGCGGCGGCAAATCTCTGTGCTATCAAATCCCGGCGTTGTTGCTGGACGGATTGACCGTCGTCGTTTCGCCCCTGATCTCGTTGATGAAAGACCAGGTCGATCAGCTACTGGCGAACGGGGT [...]
+ATGAGATGCAGGCCAAGCAGCGCCACGCCCGCCCATACCATCACGCCGCAGGTGATGCCCAGTACGCCCATCATCGCTTCTTTACGCGAACGGCTGACAGCAGTTTGAGACACGAAGAAAAAGTCGGGGCCGGGACTCATTAGCGCAACGATGTGCACCATTGCCACGGTGAAAAATAGCATCAACATAAAAATGGCTCGCGGGGAAATAGTTCAGTGAGTCACCATCCTGGCACTTTTTTGCCGGGCTGACTACTCTTCGTCATCACCATCGACATGCGCGCGGATGAGCGCCATGAATTCTTTCCCGAAGCGCTCCAGTTTGCGCATCCCAACCCCGTTAACGCTTAACATCTCGCTGGCGGAAACCGGCATCTGTTCCGCCATTTCTATCAACGTGGCGTCGTTAAAGACCACATACGGCGGGATATTCTCTTCATCAGCGATAGCTTTACGCAGCTTGCGCAACTTAGCGAACAATTTGCGATCGTAA [...]
+NODE 355 4753 276510 272581 0 0
+TCGTGAGTCCATGCGGCGCGAAATCCTTTCCAGGAATATCCTGCCGCTTTGATAATTCTGGTGAATCCAGTGGTATTATTGGCCATCAAAAGAACCTTTTTACATTATTAACGTCAATGACATTATACGGTTGCCCTGCACGATTCGGACTGCCGTAACGCAGCGCGAAGTATGACGGGATACAACAGAAATTCGCTAAACTTTCTGATATCCTTGCACCGCATTTGCATTATTAACCAGAGGCTTTACATCGTTTATGTCCGGCTGGCCACGAATTTACTACAAATTACTGAATTTACCATTAAGCATACTGGTAAAAAGCAAGTCTATTCCGGCGGAACCCGCCCAGGAATTGGGGCTCGATACTTCTCGCCCCATTATGTATGTCTTGCCATACAACTCAAAAGCGGACTTACTGACGCTGCGGGCTCAATGTCTGGCGCACGATCTCCCGGATCCGCTGGAGCCGCTGGAGATCGACGGCGCGCTGCT [...]
+CGGTAACTCTATCCCGGATATTCCCGATCCAGTTGCTCGCCATACCACTGACGGCGTGGTGAAACTGAAGGTGAAAACCAACAGCAGCTCCAGCGTATTGGTCGGGCCGTTGTTTGGCTCGTCCGGTACCGGGCCGGTAACGGTAGGCAATACCGCCGCGCCGGTCGCGGCGCCAGCGCCAGTCGCGCCGAAGAAAAGCGAACCGATGTTGAACGATACGGAAAGCTACTTTAATAAAGCGATTAAGGATGCCGTAGCGAAAGGCGACGTCGATAAAGCGCTGAAACTGCTTGATGAGGCCGAACGTCTGGGATCGACATCTGCCCGTTCCACCTTTATCAGCAGTGTAAAAGGCAAGGGGTAATTATTTCCCCACAGTGCTGATTTTGCAGCAACTGGTGCGTCTCCTGGCGCACCTTTTTTTGTCATTTCATGCGAATTGTTATTTTTTTGTTGCGCAACAGATCACTTAATTGTGATTGCGCCCCCCGT [...]
+NODE 356 9317 528017 523462 0 0
+CTGGCCAATCTTATCCTGCGCGCCTTTAACGTCCATACCCTGGCCAAGCATCATGCCAAAACGACGGTTGCGCGACTGGTTGTCGGTACAGGTCAGCACCAGATCGCCTAAACCCGCCATCCCCATAAAGGTGGCGGGATCGGCACCAAGCGCTGCGCCAAGCCGCGACATTTCGGTCAGTCCACGCGTGATTAGCGCCGTGCGGGCGTTCGCGCCGAAGCCGATGCCGTCAGACATCCCCGCGCCAATCGCAATCACGTTTTTCACCGCGCCGCCAAGCTGCACGCCGATAAAATCCGCATTGATATAGACGCGAAAACTTTTTCCGCAGTGCAACAGTTGCTGGAGATCGTCGGCAAAGGTCTCATCGGTTGAGGCCAGCGAGATTGCCGTCGGCAAACCCGCCGCCAGCTCTTTAGCGAACGTCGGACCGGAAATCACCGCCAGCGGGATTTGATCGCCTAACGCCTCGCGAGCGACATCCTGCAACAG [...]
+GCTATGCCAACAACGATATGGCTGAGCTGGAAGCGCGGCTGAAAGAGGCGCGTGAGGCCGGCGCGCGTCATGTCCTGATCGCCACCGACGGCGTGTTCTCAATGGATGGCGTCATCGCCAATCTGAAAGGCGTCTGTGATCTGGCCGATAAATACGATGCGCTGGTGATGGTTGATGATTCTCACGCGGTAGGCTTTGTCGGCGAAAACGGTCGTGGTTCCCATGAATACTGCGACGTAATGGGCCGCGTAGATATTATTACCGGTACGCTGGGCAAAGCGTTAGGCGGCGCATCCGGCGGCTATACCGCGGCGCGTAAAGAGGTCGTTGAGTGGTTGCGTCAGCGTTCCCGCCCATATCTGTTCTCCAACTCCCTGGCGCCGGCGATCGTGGCGGCTTCTATTAAAGTGTTAGAGATGGTGGAAGCGGGCGCAGAACTGCGCGATCGCTTGTGGGCGAACGCCCGGCAGTTCCGTGAGCAGATGTCTGCCG [...]
+NODE 357 45 3237 3237 0 0
+TAAACAAAGAATATATTCTTGTTGTGGTGTGGTATTTATTGCTAC
+ATTTTATAGCCTAATAACACAATACTTCAAATGATTTTTATAAAA
+NODE 358 5082 336348 334583 0 0
+TTAAAATAGAAAATCAGCTCATAGTGTATAAATTCTGGATTATTATTCTACAGCAGCAAAAATTCAGATATTGTCATCGGGATGGATGAATTAATTATTTATATCAGGAGTTTTTTTTGCTAGCATTCCTGAAACGCATTCGCCCCCTTATCACTATTGTCAGATAACGTGCTGACGGTTGTGTAAAAACATTGCGCCTCATTCTTCTGTAGTTGGAGTTAATATGAAAAAATTTTATAGCTGTCTTCCTGTCTTTTTACTGATCGGCTGTGCCCAGGTGCCCCTCCCTTCCTCCGTGAACAAACCGGTACAGCAACCTGGCGCTCAGAAAGAGCAACTGGCCAACGCAAATAGTATTGATGAGTGTCAGTCTCTTCCGTATGTGCCGTCAGACCTTGCGAAGAATAAATCATTATCAAACCAGAACGCTGATAATTCCGCATCAAAAAATAGCGCAATCAGCTCAAGCATTTTTTGCGAAAAATATAAACA [...]
+TCTTTGAGGACGTTTCAACCTCTATGATGTGAGGACGCTGCTTAAAAGTTAGTAATAGTTCAGTGGCTTCTTGCCTGTCTTTTTCGGTGACCGAGTCGTACCAGTAACCACCGTTTACATACCAGAAATTGCCATCCTGTGTTTCAAAAGCGTCAAGCGCCATAGCTTCATGATTACCCACTACAGAAATAAACCATGAGGTATTTAACAGTCTCAGTGTTTCAAGGTTTTCTTTTCCTCGATCAATGTTATCTCCAGTGGAGATCAAGAGATCGGTATCAGCAGAGAAATGTAATTGAGCCAGTCTGGTTAACAATAAGGAGTAACATCCATGAATATCACCAACGACCCAAATGTGGCGATAGAGATCGCTGTTGATGTCAGCATAACGGATTAATTCCATGATGTTCCTATAGCACAATTTTGGAGTCTGGTATTATAACAAAAAAGTAGGGTAATATTAATTTTTATTGTTTAAAATACACAGTTATT [...]
+NODE 359 1262 55154 54702 0 0
+CTTTCTCGCCGGATGGCGGCATACCTGCCTTATCAGGCCTACACGATCGTTCAACGGCAGGCCTGATAAGCCGCCATCCGGCACTTTCTCGCGGGATGCCAGTTCCGTCAAATATCGCGATGAATCTCACTTTTCGCTTTTTTGGCGATAAATCTTATCCAGGCCGTTGCATGCGGTCCCTTCTCTCCGTAAAATCCCGCGCCTTAGTGGCTTTCACCATTTTTATGCGTTTTGCCATAATAATTATTCTTCCAATTTCATTTTTATAGCTGGATACCAATGGAAAAAAAACTGGGACTGAGCGCGCTGACCGCGCTGGTTTTAAGCTCAATGCTTGGCGCAGGTGTTTTCAGTCTGCCCCAGAATATGGCCGCCGTTGCCAGTCCGGCTGCGTTGTTAATTGGCTGGGCCATTACCGGCGTGGGGATACTCTTACTGGCATTCGCCATGTTAATCCTTACGCGCATTCGCTCCGAGCTTGACGGCGGTATC [...]
+CGCCAGAAATGGCACCTCCGCCGCCATAATAGTCCAACTTAGATAAGCCCCGCAGACAGACACAATCAGTCCCGCTGCAATAATAATTTCTCCCCACGGCCCCATCATTTTTACCATCAGTCCGGCCATCGACGGGTTGCGCATCTCCGCCAGTTCCGGACGCGCCAGAACGCCAAGAGAAAGCAGCGTGACCAGGAGATATATTCCCAGCGCTGCGAGTACTGCCAGTAGCGTGGCGCGGCCTACATCGCGTTTATTTTTCGCTCGGGCCGAGACGACGACGGCGCCTTCAACGCCAATAAACACCCACAGCGTAATAAGCATGGTGTTCTTAACCTGTTCCCATACGGGAATACCGAGTTCAACACCAGTGAAGTCCAGTGTGAAGGTATCCAGTTTGAACATCATGATAGCCAGCACAATAAACGCGCCGAGCGGCAACAGTTTCGCCAGAGTCGCAACCAGATTGATGCTGGCTGCCGTTTGTACGCC [...]
+NODE 360 2900 170252 168676 0 0
+GCCCATATCCGTAACGGCCGTCTGCGCTGGCCGGTTTCAGACGAAATTTATCGTCTGAGCGATACACCCGTCCTTAGCGTTCAGCGTCGTGCTAAATATTTACTGCTGGAGCTGCCTGACGGCTGGATAATTATTCACCTGGGGATGTCGGGAAGCTTGCGGATACTGTCGGAAGCGCTGCCGGCGGAAAAGCACGACCATGTCGATTTGGTGATGAGCAATGGCAAAATTCTACGTTATACCGATCCTCGCCGCTTTGGCGCCTGGTTATGGACCAAAGAGCTGGAAGGGCATAACGTACTGGCGCATCTGGGACCGGAGCCGCTAAGCGATGAGTTTAATGGCGAATATTTGCAGCAGAAATGCGCGAAGAAGAAGACGGCGATTAAACCCTGGCTGATGGATAACAAGCTGGTGGTCGGCGTGGGGAATATCTACGCCAGCGAGTCGCTGTTTGCCGCTGGTATTCACCCTGACCGCCTGGCGTCGTCA [...]
+GCTAATACCGCACTCATTTTAGATGCGCTAGTGTAACACTTCTTTCGCAGCAATCCGATACGAATAATTTTTATACACAATCATTTTTTTAATCATAAATTCAAAGAGATATTAATTTATCCCTCTCTTGTGAATGGTCATTCCCATTGTCTGGGGCGACAAGGGCGGCAAATTTCAATGGATTGCGTAAAAATGCAAAAATAATGGGGTTCAGCGCCTGGAATCCTCGCTTCTGAGCCAATTTGGCGCAAAAATGGGAAAAGTAATGGTAAAGCCCAGGCTAAATACATAGAATCCCCAGCACATCCATAAGTCAGCTATTTACTATGCTCGAATTGCTTTACACCGCTCTTCTCTACCTTATTCAGCCTCTGATCTGGATACGGCTTTGGGTGCGTGGACGTAAAGCGCCGGCCTATCGTAAACGCTGGGGTGAACGCTACGGATTCTACCGCCGTCCGTTGAAACCGGGCGGAATCATGCTGCATTCCG [...]
+NODE 361 577 26957 26957 0 0
+CGTCAGCACCTCTTCGGCATCGACATGCAGACCATGCGTTTTCAGCAGCGCGGCCAGCGCGTCGGCATTCGCGGGATCGAAGCCCGTATGTACGTTGTAAATACCGAAACCGAGCTTATCGCGCAGTACGCGCGCGGCGCAAAGGTTAGCGGCGATCATCGACTCTTCTACGATACGGTTAGCGATACGGCGCGGTTCCGCCACAATATCCAGTACTTCGCCTTTTTCGCCAAGCACAAAGCGGTAATCCGGGCGGTCTTTAAAGACTAACGCATGATGATGACGCCACTCACTGCGGCTTAGACAAATACGGTGCAACAGACGAATCTGCTGGGCAATGCCTTCGTTATCCGGCTGCCAGGTGCCGTTATTTTCCAGCCAGTCGGAGACATTGTCGTACGCCAGCTTGGCCTTCGATTCGATGGTGGCCGCAAAAAAGGCGATATCATCGTCAATGGTGCCGTCCGCGGCGATTATCATGCGACAGGCGAG [...]
+TGTGCTCACTGCGCGCCAACGAAGTGCGTCCGGCGCTCGCCTGTCGCATGATAATCGCCGCGGACGGCACCATTGACGATGATATCGCCTTTTTTGCGGCCACCATCGAATCGAAGGCCAAGCTGGCGTACGACAATGTCTCCGACTGGCTGGAAAATAACGGCACCTGGCAGCCGGATAACGAAGGCATTGCCCAGCAGATTCGTCTGTTGCACCGTATTTGTCTAAGCCGCAGTGAGTGGCGTCATCATCATGCGTTAGTCTTTAAAGACCGCCCGGATTACCGCTTTGTGCTTGGCGAAAAAGGCGAAGTACTGGATATTGTGGCGGAACCGCGCCGTATCGCTAACCGTATCGTAGAAGAGTCGATGATCGCCGCTAACCTTTGCGCCGCGCGCGTACTGCGCGATAAGCTCGGTTTCGGTATTTACAACGTACATACGGGCTTCGATCCCGCGAATGCCGACGCGCTGGCCGCGCTGCTGAAAACGC [...]
+NODE 362 3773 202735 200805 0 0
+CGTTGATGCGCAGGGCGGCGATGGCATTCGTATGGTTCAGGAGCTGCAAACGCTACTGGAACATCACGCTCCCGACAGCATGGTGCTGGCGGCCAGCTTTAAAACACCGCGGCAGGCGCTGGATTGCTTACTGGCAGGTTGCCAGGCGATTACCCTTCCTTTAGATGTAGCGCAACAAATGCTCAATACGCCTGCGGTAGAGTCAGCAATAGAGAAGTTTGAGCAAGACTGGAAAAACGCTTTTGGTAATCTGAACCTGTAGGAGAGAAATGTATGGATCGCATTATTCAGTCACCAGGTAAGTATATTCAGGGTGCAAACGTCATCGCGCGTCTTGGCGATTATTTAAAACCAATGGCGAACAACTGGCTGGTTGTGGGCGATAAATTCGTGCTGGGATTTGCCGAAGAGACGCTGCGCAAAAGCCTGACGGGTGCCGGTTTGTCAGTAGAAATCGCCCCGTTTGGCGGCGAATGTTCGCAAAATGAGATC [...]
+ACCGTGGCGTTGATCGCTGGCGGGCATACCCTCGGTAAAACCCACGGCGCGGCAGCGGCATCCCATGTAGGGGCCGATCCGGAAGCCGCGCCGATTGAAGCGCAGGGCTTAGGTTGGGCCAGCAGCTATGGTAGCGGCGTTGGCGCGGATGCTATCACCTCCGGGCTGGAAGTGGTCTGGACGCAGACGCCGACCCAGTGGAGCAACTATTTCTTCGAGAACCTGTTCAAATATGAGTGGGTACAAACCCGTAGTCCGGCTGGCGCTATCCAGTTTGAAGCGGTAGACGCGCCGGACATCATCCCGGACCCGTTCGATCCGTCGAAAAAACGTAAGCCAACCATGCTGGTCACCGACCTGACGCTGCGTTTTGATCCGGAGTTCGAGAAGATTTCCCGCCGTTTCCTTAACGATCCGCAGGCCTTTAATGAAGCCTTTGCTCGTGCCTGGTTCAAACTGACGCACAGAGATATGGGACCAAAAGCGCGTTAC [...]
+NODE 363 2537 99770 98930 0 0
+AGGACTGAACATCATGAATCAACAGGATATTGAACAGGTGGTGAAAGCGGTACTGCTGAAAATGAAAGACAGCAGCCAGCCGGCCAGCACTGTTCATGAGATGGGCGTTTTTGCCTCCCTGGATGACGCAGTGGCGGCAGCAAAACGGGCCCAGCAGGGGCTGAAGAGCGTGGCGATGCGCCAGCTTGCCATTCATGCCATTCGCGAGGCGGGCGAAAAACACGCCCGAGAATTAGCGGAACTTGCCGTCAGCGAAACCGGCATGGGACGCGTTGACGATAAATTTGCTAAAAACGTGGCGCAGGCGCGCGGCACGCCGGGCGTCGAGTGTTTATCTCCGCAGGTGCTGACCGGCGATAACGGCCTGACGCTGATTGAAAATGCGCCGTGGGGCGTGGTGGCCTCGGTCACGCCGTCCACCAATCCGGCGGCGACGGTGATTAATAACGCCATCAGCCTGATTGCCGCAGGCAACAGCGTCGTGTTTGCCCC [...]
+GCCCTTCATCGCCAGGCTACGTGCCAGCGGCGCGGTCATTCCCGCCTGATGCAGGAAGCTGTCGACCATCACAAACAGATGGCTTACGCCTCGCGCTTGCGCTTCCTGGCCGCAGGCGCCGAGCGCCCCAAGTCCGCACAGCGTGACCGGCGGTACGCTGAACGTTTTCACCCGTTGCAGATTCAGGGTGTCGAATGCCTGAAACAGCGCCGTCTGTAGTTCAGCTTGCATAGAGTCCCTCCGCTTTCGCTCTCCCGCTGTTGGCTATCGCCAGCGGGGTCATAAACAGGCTGTGCTGCGGTAAATGCACCTGTAACTCCGGGAAACGCTGGCGAAATAACGCCTCCACGCCCGGCTGCATACAGGAGCCGCCCGCCAGCCATAAATCTGTCACTCCCTGCCCGGCAATATGGCAAGCGACGATTTCCGCCATCTTTTCGTACACCGGCTTCACTACCGGCCAAATCTCCTGCGCATTGCTGCGCTTGTACT [...]
+NODE 364 3685 221027 219745 0 0
+AAACGGCGACCATTATTGGGTGCGGGCCAACGCGGTACCGATGATACGTGAAGGGCGTGTGACGGGATATATGTCGATCCGTACCCGCGCCACGGATGATGAGATTGCCGCCGTCGAGCCTTTATATCAGGCGCTAAATGAAGGGCGGTGTAGTAAACGTATTCATAAAGGCCTGGTGGTTCGTCAGGGCTTGCTGGGCAAACTGCCCGCTATGCCTGTTCGCTGGCGAGTGCGTAGTATTATGGGGCTAATGGCCGTAATGCTGGCGTTGGCGCTGTTCGGTACGGATGCCTCATGGCAGGCGTTGTTGTTGGGCGCGTTGGCGATGCTGGCAGGTACGGCGCTATTTGAATGGCAAATTGTGCGTCCCATTGAAAATGTGGCGACGCAGGCGCTGAAAGTGGCGACCGGCGAACGCAACAGCGTACAACACCTTAATCGTAGCGATGAGTTGGGGCTGACGCTGAGGGCCGTGGGGCAGCTTGGCTTGAT [...]
+ATTCTTGATATCCTGACCCGGGACGCCAGCCACGGCTATGAACTGATTAAAGCGATAGAAAACCTGACGGGGGGCGGCTATACGCCAAGCGCTGGTGTGATCTACCCTACGCTGGATTTTTTACAGGATCAGCAATTTATCACGATTAGCGACGAAGAAGGCGGGCGGAAAAAAATCGCGATTACCGCGAACGGCGCGCAATGGCTTGATGAAAATCGCGAACACCTGACGCATATTCAGGCGCGGCTAAAAGCCCGTTGTGTGGGCATGGAGTTACGTAAAAATCCGCAGATGAAGCGGGCGCTGGATAACTTCAAGGCCGTGCTGGATCTGCGGATAAACCACAGCGATATCAACGACGCGCAAATCAAACGCATTATCGGCGTGATTGATCGCGCGGCGCTGGAAATCGCCGAACTGGATTAAGCGGGCTGCGTGTCCTCTTCGCGGACGCGGAACACGTTAACCAGCTCTTTTAAATGTAACGCCTGT [...]
+NODE 365 2978 157226 152110 0 0
+TCGTGACCTCCGGTATCCGTATCGGTTCTCCGGCGGTCACTCGTCGCGGCTTCAAAGAAGCGGAAGTGAAAGAGCTGGCTGGCTGGATGTGTGACGTGCTGGACAACATCAATGATGAAGCCACCATTGAACGCGTGAAAGCGAAAGTGCTGGATATCTGCGCCCGCTTCCCGGTTTACGCGTAAGCGCTTGTGTTGTGAGAATGGCCCGATGGCGCTGCGTCTGTCGGGCATTACTTATGCGCCATAACGTGACGCCGCCGGAAGTCATTATCCGGCGGCGTTGCCGTTTGAACTTCTCCCTCCGCTTGTTAATCTTATGTTACCCTTGCCAGCGCAACCGTTTACCGCCAGACTATCGCCTCCAAACGGGAGGGAATCATGGCATTGCATTCCACGCGCTGGCTGGCGCTCAGTTATTTCACCTACTTCTTTAGTTACGGTATTTTTCTGCCCTTCTGGAGCGTCTGGCTCAAAGGTCTTGGGCTAACGC [...]
+ACTGGCTTCATCTGTTCCTCGCGATAAAAATTCTGTGACGTTCCTCAGCATTCCTGGCCTAAAAGCACGCTTATCACATTTTTCACACGCAAACTTTAGCTATCCTTACCAGACAAACTAACGGGAGACCTGACAGATGATGCCGACAATTGCCCCACCATCTGTACTTTCCGCTCCCCAGCGCCGCTGTCAGGTATTGCTGACGCTTTTCCAGCCGGAGCCAATTGCCACGGTGGAAATCTTCAGCGCGCTTAATGGCGTTGATGATGATACTGCCCGTGAGGATATCACTGAGACAAGCCTGGAGATCCAGCGCTATCATCGCCTTGCCATCACAACATGCCAGAACGGTTGCTATCGGATCGAAGGTACAGCACTCGATCAGCGCCTTTGCCTTTTACACTGGCTCAGGCGCGGCCTGCGTTTATGCCCGACCTTCGTCACGCAACAGTTTACCCCGGCCTTAAAAAACGCGCTAAAGCAGCGCGGTAT [...]
+NODE 366 42 2738 2662 0 0
+GTAAACAAGGTGATTCTCGTTGGTAATCTGGGCCAGGACCCG
+TGGCCATAATTGAGTCTCCTGAATACGTTTCATAAATAGTGT
+NODE 367 6852 313629 308976 0 0
+ATGCGCCGGAAATTGACGGCGCGGTCTATTTGAACGGCGAAACCAACGTCAAGCCGGGCGATATCGTGCGCGTGAAAGTGGAAAACGCCGACGAATATGATTTGTGGGGCAGTCGGGTTTAACGCCACCTCCCCCGGCGCGGGTGCCGGATGTGTTATCCCGCCTGACGAGGCCGTTCCAGGCCCGCCAGGCGTCAACGCCACCGGGCTGGCTTACCCCTTAATCTTCGGGTCCAGCGCATCGCGCAACCCGTCGCCTAACAGGTTAAACGCCAGCACAGTCAGGAAAATCGCCACCGCCGGGAAGAGCGCTACGTGCGGCGCGATGACCATATCCGCCCGCGCTTCATTGAGCATCGCTCCCCACTCCGGCGTTGGCGGCTGCGCGCCTAATCCGAGAAATGACAGGCTTGCCGCGGAAATAATTGACGTACCGATACGCATCGTAAAGAAAACCACAATTGACGAGACCGTTCCCGGCAATATATGGCTA [...]
+CCAGCGGCAACGTTTCTACGGCGGTGAGCGGGGTAATACGTGAAAGCATCTGGGTCAGCGCCGTTTCAAGCGGCATCAATCCGGCGGAAAATTCCATGAACATACTCCTGCGAGGCAAAATCGAATCCGGCTATTATGTCAGAAAACAGTGGCGGGCAGTATGCTACCTCGGTCTTAGAGACGGCCTTGCGCCTTTACATACCTTACGCATCTTTCTATATTCAAAAATCGAATGAATAACTCACAACAATTCTGATAGTTATAGTAAAAGTTGTGTGCCACCGTTAATGGACCCTAAAAATGAATAAAGCAGTGATTGCGATTCACGGCGGCGCAGGCGCGATTGCTCGCGCGCAAATGAGCCATGAGCAGGAGCTACGCTATATCCAGGCGTTGTCAGAGATTGTTGAAAGCGGGCAAAAGATGCTGGAAGCGGGTGACAGCGCGCTTGATGTAGTGACGGAAGCGGTGCGCCTGTTAGAAGCGTGTCCG [...]
+NODE 368 3747 199158 193588 0 0
+AAATTGGCTGCCGGATCGAGCTGCACGTTGCGGAAGAATTTGCCGGAACCGGTAACGATAAACGGCGTATTCGCCAGCAGCGGCATGGGTTGACTTAGCGCGATGTAGCGCGGTTTTTCGTGGAAATTAGCTGCAAACGGTGCGATATCGGCTTCATCCAGACGCAGCGTCAGGTTACCGCCATTACGTTCGTCCCACCCTTTCAGCCACGCATCAGACGTGGCTTTAATCATGCCCTGGACGAACCAGGAATCGGTAATATTTTGCATGTTCGTGTTCCCATTTATTGCCCGAAGGTTATTCGGGTCTTACGTAGGCCGGATAAGCGCAGCGCCATCCGGCAATCGTGTTTCATTTATTGCCGGATGGCGACGCGGGCGTCTTATCCGGCCTACAGATCAGGTGTCGCTGTCAGCTACGTTTGCTCAGGATCTCTTTTTCATAGACGCGAACGCTGTCCAGCCACTGGCTGCCAGCCGGCGTGTCGTGACG [...]
+GGCGTCCGGTGAACGCCACAGTACATTCGTCAGGCATAGGTTGTCGGTATGTTCATATAAATGCCGGTCGTGATCGCGAACAAAACACACGGTACCGCCGCTGATGGTATACGGCTGCCCGTTGAATACATGAATGCCCGTACCGTGTTCCACAATCACGATTTCATGAAAATCATGATGATGTTCAGGAAAAGCGGCTTGCGGCAGACGAGGTTCAATCGCCACGGGCGCTTTACCTGATGGAAAAAAATCCACGCTATGCAGTACGGTCATGGTTGCTTCCTCCTGAATTCAACATGTCCGAATAGTAATTAAGGGTTATCGGCCTCACCTTAAATTTTTGACGCTAAAGCGCGCAAACATGGTCTTTTTTTCAAGAAAAGGCGGGAAAAAGCGGGAAATGCGGACGACATCACACCGGCCTATTAGTAGAAACTGTGAACGCTATCACGTTCATCTTTGCCTTGTTGCCAGCGGCTCATTTTCCTGTCA [...]
+NODE 369 2215 125874 125093 0 0
+GCACGTGAGTGAAGCGGTGCCGGCGGCCTTTGGCCTGTTCGCGTGTTGTCCGAATTCTGCCGTAGATGCTATTATCTCCGGCGTTAATATCGGCAATGATACTGATACTGTCGCCACCATGGTCGGGGCGATTTCCGGCGCATTCCATGGCGTGGAGGCTTTTCCCGCCGATTATTTAACGACCTTGGATCGTATGAATCATTTCGATTTGGCAGAACTGGCCAGGCAAATCGCAGGGTAGCGACTTCACCCTGCCGGGGACGGTAAAACGTCCCCTGCTGGCGAAGACGTGAGGTGCGCAGCTTGCAGGTTGATAAAACGAGCTTTACTCCGCTTTATAAGCAACTATTTTTTATCATCTGTCAGCAGATCCAAAATGGATCCCTGCCTTTAGGCAGCCAGCTGCCGACGCAAAAAGAGATTGCCAGAGCCTACAACGTCTCGCTGATTGTGGTTAAACAGGCCTGGAGCGAACTGATCAATGCGGGCATT [...]
+ACGTTACGGGACTCACCGTTCACGTACCTGTCGTCAAAGAAGCTACCGCGCTAGGGTGCGCTATTGCCGCAGGCGTTGGCGTGGGTATCTGGCCATCGCTGGCGGAAACGGGAGAAAAGCTAGTGCGCTGGGATCGGGAGCATAAACCTAATCCTGAAAATTTCGCTGTCTATCAGCAGGCCAGAGAAAAATGGCAGGCCGTTTATCAGGATCAACGCGCGCTGGTCGATGGTGGCTTAACGACATCCCTCTGGAAAGCGCCAGGCCTGTAACAGGAGAATAAGCATGCAAAAAACGAATGAGAAGAATCATGAATACCGCTTTGGCGATAATGGCCCTAAATACTTAATCCGTGGGCCGGGCTGCGATATGGGTGTCGTCATACTACAACCAGGGCAGTCATTCCCTAACCATCGCCATAATACCGCTTGTGAGGTTTTTTATACCCTAAGCGGTGAAGTGTGCCTGTATCTGGAAGGAACACCTCATATC [...]
+NODE 370 5289 253763 250513 0 0
+ATCCTCTTCGGTAAAGCCAATGTCTTTAGCGCCCGAAATAATATTATAGAGATATTCCACCAGAGAAGACTCCGCCAGCCAGAATTCATTACGTTCCATGCGGGCAATAGGGTATTCGCCGTTGGCATCCCGTTCTGTGATATAGATAAAAATGGCCTGATCGCCGACATGATCGATACGAATTAATGCCGGAAGACGGGGATCGTTACTCCAGACAGGCATCAGATCTTCAATATCAATACCTGAGCCATCCATGCCAACGCCGTAATACGCCTCTTCATCAGGGGAGTAAGAATGAATTACTCCCTCTTTATCAATAGATCTTTGTAATGTTTCAATCACAGGCATATTATAATTGCTAAGTAGATCGCGGTCGTAGGCCAGTAGCGCCTTCAGGCTTTCAGGTAACTCAGTGGTTTCCGTATTTTGCGGATCGCGATACTTACGCACTCGCAGACGACTTATTTCCTCGGCAGGCATAGGATTAGGCAC [...]
+GCGCCAGCGCAATGCCGCTATTTACCGTTTGGGCAGGCCAGGCCGGACGCACGCCGATTTGCCACTGCTTATGCTGCGCGCCGAGGGTTTCTCCCGGCAGATTCAGACCGCTAATGGTCGCCTGGATTTCGCCTTCGCCAAAACCTTCCAGCGCGCGTACCGGAACGAATAAGGTGGTGCGCACGCCCGGCGCCAGGTTGACCGGTTGCGGCTGCTGGCTAAGCAGTTCCAGTAACCCACTGGCGGCGAGCGCAATATTCAGCGTCTGCGGACGGTCGGTCAGATTGGTGACGTCCAGCACCAGTCGCGAAACATCCCCTCCCGCCAGAAAACGCGGCATATTCAGCTCGGCAATCACTGGCGCGGCGACAACGACTTTGCTTTCGCCGCGACCAAAATCGTCCGCTGTCCATGCCTGCGCCATAACCCGCAGTTCGCCGTTAAAGTCGCCAATCGGCAGCGTTACGACCCCTTCGCCCTGCTCATTGAGCG [...]
+NODE 371 26 1035 1035 0 0
+CGCCGGTGTGACAATCGCCTGGCTGG
+GAGAGAACGTTGACCGCGCTGCGCGT
+NODE 372 25 982 982 0 0
+TCCATTTTTGCGGCAGCAGAAAGGA
+GGAGTCGGTACAGTGGCAGGGGCTG
+NODE 373 2779 130218 129443 0 0
+CCAGAGGCTTCCGCGTTGGCAGATGCGCATTATCATTTTACCTACCGTGAAATGCGTGAACAGGTTGTGGCGCTGGCGTACGCGCTGCGGGAACGCGGCGTTCAGCCTGGCGATAGCGTGGCGGTGGCGTTGCCGCGGTCGGCTTTTCTGACCTTAGCGCTGCATGGCATTGTCGAGGCGGGCGCCGCCTGGCTGCCGCTGGATACCGGTTATCCTGACGATCGGCTGCGAATGATGCTGGAAGATGCGCAGCCGAAACTGTTAATTACGACTCAGGCGCAGCTGGCGCGCTTTCACGATATTCCGGGGATGGAATATTTGTGTTATAGCCAACCGCTACCGGTCAGTGACGCCACTCCGCTGGGGCTGTCGTTACCGCATCATACCGCTTACATCATTTTCACCTCTGGCTCGACGGGCAGGCCGAAAGGGGTGATGGTGGGACAAACGGCGATAGTCAACCGGCTGCTGTGGATGCAGGATCACTATCCG [...]
+CCGTATGACCTGAAAACTTTATCCAATGAAAGAACACATTCCTGTCAGAGATTCTAACAGCAAGTCAGAATTATCCGAAACACTCTTTGCGCGCCAGTGCCCGAAAAGCTAAATATTCGGAATTAAACTTGCCTGTAGCATGTATCACTTATGTTAAAAGAATTAATAGTTGCAATAAAAAACCCATAATAATTAGTCATTATTATGGGTTTCAGGATTTAATTTGTTAAAGCTAGAAACAACGCCCGTTATTTATTAATAAGCTCGCTGATGATGGGCCCGATAGTTTCAAAAGCGGAGGGAGAAATAATATCTACATGCGCGCACGGCTGGCGATAAATAGCCAACGACGCTATCCACGGCGACCAGCTCTGTTCAGGCGATACGCCTTCCGGCACCGTTTTATCCGCCACAAAGAGCGTAGCATGTCCATCAAACGGTACGCTATGCGCCGTCGTCAGCAAACGGACGGCATCCGCATAATTGCCTTCA [...]
+NODE 374 51 3446 3446 0 0
+ACTCACTGCCGCCCGCCAACAGTCATGAAATCGATTTGTTTAGCCTTATAG
+TAACCTGCAAGTGACTGATTTTTTTCTTGTTTTACATTAAGAGATGGCATG
+NODE 375 2152 111376 108491 0 0
+ATAATATTTTTAATTTTCGCGTAGGCCATTGGGGCCATCACACGATAGGTTTGCAGCGCGGCGTGGTCCGGTAGCCAGGCGCCGTTTACCCACGGGGTTGCTTCAGAACACATAGAATCGCTCAATGCCCAGAACATATTGCGCCAGGCCACGACTTCGCCGAGATCGGCCTGCACGCCCCGGAACTCTACGGTACCCGTACATTCGAGCGATTTTTTCAGCAGCGCGGTAATGAAATCAAGTTTAACCGCCAGACGAACACAGGCTTGCAGTGGATACATACGGGCAAAGCCGCCTTCCATCGTCCAGCGACGGCAACGATCGAAATCACGGTAAATCAACACGTTTTCCCACGGGATCAACACCTTGTCCATCACCAGAATGGCATCGTTTTCATCAAAGCGGCTGGAGAGTGGATAATCAAACGGCGAGCCCGTCGCGCCCGCGACCATTTCATACGAGGCGCGCGAAATAAGTTTTACGCCTTCGGCA [...]
+TCCTCAGGCCGATTTAACGGGCTGTGATTTCATTAATATATTAATGATTAGATTTATGCTTTCGCTGTACATTTAGCAAGCTGAAGTAAAGTATTTGTGATGTGATTAACAATATTTTCACAAATTTATTATTAAATATATACATATCAAAGAGTTAAATAAAACCCCTTGTTTCTGTTAAACTTTGGGCATAAAACAGATTTCATAGCTCACATCGGTAAACACGATTATTCAGGTATTAATAATTCTGCAAAAGAGAAACGCTTATGCATGATTCATTAACCATCGCCTTGCTTCAGGCGCGCGAAGCGGCAATGACCTATTTCCGCCCCATCGTTAAAAGCCACAATCTGACCGACCAGCAATGGCGCATTGTGCGAATCCTGGCCGATAGCCCCTCTATGGATTTTCACGAGCTGGCCTTTCGTACCTGTATTTTGCGTCCAAGTCTGACCGGAATATTGACGCGCATGGAGCGAGACGGACTGGTGT [...]
+NODE 376 1346 65966 65759 0 0
+AAAACCGTACCCGCGTGACGCAGTGGGAGACGCTGGATTGGGTGCAAGAGGTACAACAGCGCGGCGCGGGGGAAATCGTCCTGAATATGATGAACCAGGACGGCGTGCGTAACGGTTACGATCTGACGCAGTTGAAAAAAGTCCGTGACGTTTGCCGCGTGCCGCTGATCGCCTCCGGCGGCGCGGGCACGATGGAACACTTTCTTGAGGCATTCCGTGATGCCGATGTCGACGGCGCGCTGGCCGCCTCCGTTTTTCACAAGCAAATCATCAATATTGGCGAATTAAAAGCGTACCTGGCAGGCCAGGGCGTGGAGATCAGGATATGTTAACAGAGCAACAACGCCGCGAGCTGGACTGGGAAAAAACCGATGGCCTGATGCCAGCCATCGTGCAACATGCGGTATCCGGCGAAGTATTGATGCTGGGCTATATGAACCCACAAGCGCTGGACAAAACCATTGAATCCGGCCATGTCACGTTCTTCTCACG [...]
+CTAAAATCGATGATACAGAACGAAGCGACGCGTCCACTGGTCTTTTCTCCGGCCTATTACCAGACGAAGCAGACACTGCTGGACATTAAAAATCTGAAAGTGACTGCCGATACGGTGCACGTCTATCGTTATGTGATGAAGCCGACGCTGCCGGTCCGTCGCGATAGCCCGAAAACAGCCATTACCCTCGTGCTGGCTGTGTTGCTGGGCGGGATGATCGGCGCCGGGATTGTGCTGGGGCGCAATGCGCTACGTAGCTATAAGCCAAAAGCCTTGTAAGCTTCTTTGCCGGATGGTGGTCGGCTTCGAAAGGTAAAATTTCTCATTAAAAAACCGGGCATTGCCCGGTTTTTTTACGCTTATTGATGACGCTTACGAAGATTGTCGATCACGGTGGTGAGGTTGAGATCCTGATCCTGCAACAGCACCAGCAGGTGGTACATCAAATCAGACGCTTCATTGGTTAATTCAAAACGATCATTGACGGTGGCC [...]
+NODE 377 3612 209247 206537 0 0
+CGCAACCTCGCGCTCAACATCGAAAGCCGTGGTTATACCGTCTCCGTTTTCAACCGCTCCCGTGAAAAGACCGAAGAAGTGATTGCCGAGAATCCCGGCAAAAAGCTGGTGCCTTATTACACGGTGAAAGAGTTTGTTGAATCCCTCGAAACGCCTCGTCGTATCCTGTTAATGGTGAAAGCGGGCGCAGGTACTGATGCAGCTATCGATTCGCTGAAACCGTATCTGGAAAAAGGCGATATCATTATTGATGGCGGTAACACCTTCTTCCAGGACACAATCCGTCGCAATCGCGAGCTGTCTGCGGAAGGTTTTAACTTTATCGGTACCGGTGTTTCCGGTGGTGAAGAGGGCGCGCTGAAAGGGCCATCTATCATGCCTGGCGGTCAGAAAGATGCCTATGAACTGGTGGCGCCGATCCTGACGAAGATTGCTGCTGTGGCGGAAGATGGCGAACCGTGCGTGACCTATATCGGCGCCGATGGTGCTGGT [...]
+GCTGAATCTGCGGCTGCGTGATTTTGGCCTCATCCGCATAGCGCAACGCTTCTTCGATTTGCTTAATACGCAGATCTTTTTGTTCCTGCGCCACAACTTCCTGCGTCTCAAGAGACTCCTGCAACGTTTTGGTTTGCAGCGTGATGTTATCTTTCAGGTCAACTTCCAGTTCCTTAGCGACCTCTTCATCCACCTGTTGGATATATTCCGCCAGCCGACGCTGCGCCCCTTCAGCGGTAGTACTCACATAAGAAACCGAGAGTGGCAGCGCCTGCCCCTTTACCGACTGTTCAATGGTGAGCTTTTCCCGCTCTTTCTGATTATCCAGCGCTTCCGATAATGCGGAAAACGCAGAGCTAAAGCGGCTTATAAAATTCGCCTGCACTTCAGAGATTTTGGGGGCATTCCCGCCATACAAGACGTTGAGCGCGTTGGTATAGGTGGCAACCTGCGCGGCATCAGGTTGGGTAATAATCGCCGTGGATGTCCATT [...]
+NODE 378 109 111 111 0 0
+ATACCAGTAATGGCAGCTACAAACATGTAAAGTAAAAAGGCCGCGTTTTCCCGGGGAGGCTTTTAGACAGAAGAAGGCCATGGCGTTAAGGATCAGAGTATTGCTCGAA
+CCTCCCCGGGAAAACGCGGCCTTTTTACTTTACATGTTTGTAGCTGCCATTACTGGTATACAGATTATGATTATGCAACGGCTATCCTTGTTGGCGCGGGGAACACGGC
+NODE 379 14617 768574 754489 0 0
+TTAGCGCTGCTGTTGTCAGAAAAAGTTTCATATATCAAACCTCATAATTAGCTCGCTATTATTTTATAGCGTTACTAATTTCAGGGTGATGACAAAGTAAGGAGAGGTATTTCTTATGAAACAATTAGTTGGTCGAAAATGACAGACAAAGGCACTACCGACGGCATAAGCTTTGAAAAACGCACTGCTGCGGAAAAGATAAATTTTGCGGTTTCGTTATCCTTCGCCATCATTTGACACATCTGATTTGCCATGCATAAAAAAAGCGGCTGTAAAGCCGCTTTTTTGTATCGGGTGGCGCATTGCCACCTACAGAAGATTATTTCTTCTTCGCTTTCGGGTTCGGCAGGTCGGTAATACTACCTTCGAACACTTCAGCAGCCAGACCGACGGACTCGTGCAGCGTCGGGTGCGCATGAATGGTCAGCGCGATGTCTTCCGCGTCACAGCCCATTTCGATCGCCAGACCGATTTCACCCAGCAGCTCGCCGC [...]
+GGTCAGCGCGCCAACGGAGATGAAATCCACCCCGGTTTCAGCAAATTCGCGTAAGGTTTCCGCGGTGACGTTGCCGGATACTTCCAGCCGCGCCTGGCCGTTGACGCGTTTCACCGCCTCGCGCATCTGGTCGGTGTTGAAATTATCCAGCATGATAATATCCGCGCCTGCTTTCAGCGCATCGTCCAGTTCATCCAGATTTTCGACCTCGACTTCTACCGGCACGTCCGGATGTAGCCAGAACGCTTTTTCCACCGCCTGACGAACCGAACCGGAGGCGATGATATGGTTTTCTTTAATCAGGAACGCGTCAGTGAGGCCCAGACGATGATTGGCGCCGCCGCCGCATAAAACCGCATATTTGAGCGCGGTGCGCAGACCCGGCAGCGTTTTACGCGTGTCGAGCAACTGGGTTTGGGTGCCAGCCAATAGTCCAACGTAGCGGCGTACTTCACTGGCGACGCCGGAAAGGGTCTGGACAAAGTTTAGCGC [...]
+NODE 380 2018 111700 110607 0 0
+AACGTCAGAGCAATACCGTAACCGACGCCCCTCAGGGAATTACACTCACCCTGACGAAGAAAGTGACCGACGCGACCGTGACGGTAACGAAAGATGATACCAAGGCGAAAGAGGCGATTAAATCCTGGGTGGATGCCTATAACTCGCTGGTGGATACCTTTAGCTCGTTAACCAAATATACCGCCGTTGAGCCGGGCGAAGAAGCCAGCGATAAAAACGGCGCGCTGTTAGGCGATAGTGTGGTTCGTACTATCCAGACCGGGATTCGGGCACAATTTGCCAATAGCGGCAGTAATTCTGCGTTCAAAACAATGGCGGAAATTGGCATCACCCAGGATGGGACTTCCGGCAAACTGAAGATTGATGATGATAAGCTGACCAAAGTACTGAAAGATAATACAGCCGCAGCGCGTGAGCTGCTGGTGGGCGATGGTAAAGAAACGGGGATCACCACCAAAATTGCCACCGAAGTGAAAAGTTATCTGGCGGATG [...]
+AGCCTTCGCATTCAATGATGTTGTCATCGATTTGCGTGCGGTCATCCTGATTCACGCGCTGAACGCGAATACGTTCTTTTTCGTCTGCGCCCATTTTGTGGTTCACGACGACGTCGAGCAGCACCGCAATATTATTTTTTTTGAGCGCGTCTATCGCCGTCAGTAACTGGCGTTTATCGCCGTACTTTGTCGCGATAGTTCCTTTTTGGTCAAATTCGCCGAGGTCAAACAGGTCGTAGGTATCATAGCCTACGGAATAGCCGCCGGAGGCGCCTTTACAGGCGGGCGGTAGCCAGACCATATTGATACCGATATCATTCAGCCCATCAGCACGTTCCGCCAGTTCAGGCCAGAGTTTACCGCCGTCGGGATAATACCAGTGGAAGTACTGCAATAACGTGGGGTTTTTCATCTTCCGTGCTCCAGAAGTCGTTTAGCCGACCTCTGGAGTATGGAAGAATTTTCATACGAGACGGGAAAATATTATGAGGC [...]
+NODE 381 5083 270755 266793 0 0
+CCTGTTTTTCCCTCAGCAGACGAAGAGACTCTCTGATCACTTCACTTTGTGTTCTGTAATCACCTGATTCTATGAGCGATTCAATAAACTCGCGCAGTTCATCGCCAGGATCAACGGTCATTGTTCTGACCATAACAGCCTCCACTGTAAGTATAAATCTTACATAAGAGTACACCGGAAATGAAATGTACGTCGAAAACATACCCCATATCTCATGCTTATGGGGTTGGCTAATGCGGCTTTGCTGAACGAGTAGCAAAGCCGCTACATTATTACTGTCTGGGGTTTACCCCCCGTGCAGTCGCCGTGCATCAATCACATCCGGCACCTGGTTCAGCTTACCGAGCACGCGGCCCAGCACCTGCAGGTTGTAGATCTCGATGGTCATATCAATGGTGGCGATCTGCTGTTTAATGTCGCTGCGGCTGGCGACGCCCAGCACGTTGACTTTTTCGTTAGCCAGAATGGTGGTGATATCGCGCAGCAAGCCGC [...]
+TGCGCAGTGGAAAAGGGATACTTTCCAGAATGAGCTTACCGGCTTCCAGCTTGGAGAAATCAAGCACGTCATTAATGATCGCCAGCAGATTATTCGCGGAACGCTCAATGGTGTTCAGATGGTCGCGCTGGGTGGGGTTCAGCTCCGTTTTTAATGTCAGGCGGGTAAAGCCAATGACGCCGTTCAGCGGTGTTCGCAGTTCGTGCGACATGTTCGCCAGGAACTCCGACTTAATACGCGCCGCTTCCTGGGCGCGCTTTTTCGCCAGATCCAGCTCAACGTTTTGGATTTCCATCTGCTCAAGGGTTTCACGCAGGTCCGAAGTGGCCTGATCGATATTATGCTGCATCTCTTCGTGATAGGCGGCAAGCGACATCGCCATGGAATTAATGCCGTTTTTCAGCATGTCCAGCTCGCCCAGCATAAATCCTTCCACCCGGCTATCCAGTTGTCCGCGGCGAATGCGGTCAACGGTATTCACCATATTACGGA [...]
+NODE 382 2333 104652 102679 0 0
+GCCCCGGAGTCCACCGATTCAGGCGCGATGCCTGCGGCCTGATACTGGGCCAGAATCAGCGCTTTAAGTTCGGCCTCTTTCAGACCGCCCTGCTTATCCACGGGCGTAAAGAAGACCGGGCTTTGCCAGCTAATGTCGCGTTTGATGAATTCGTAGCGCGGCACCTGCGACACCGCCGCACGGTTAACCAACTCCAGGTGCGAGAAGATCACCTGCGTGGTGGTGGTGCCGATATCGATACCGACGCTCAGTAGCTGGCGAGTGTTCACGATTGCGCCTCCACTTCGGTTTTCACCTGGGCGGCGTCATCTTTCGGCACCAGCATCATCGCCACGCCAATCGCCGTCACGCCGCCGATCAGCTTGCCAACGATCATCGGGAAGATCATGGCGTTCATGTTGGCGGCGGCGAAGCCTAAATGGTCGCCCAGCGCGAACGCCGCAGAGACGGCAAATGCGCAGTTAATCACTTTGCCGCGGGTATCCATCTGCT [...]
+GCGGTCAGCGGGCGCAAGCAGGTGCTGGCGCACGCGTCACTAATGCCGGACGTGGCGATTCTTGATGCTGCCGTGACCGAAGGCGTTCCGCCAAACGTGACGGCGATGACCGGTATCGATGCGTTGACTCATGCGATTGAGGCCTACAGCGCGCTCAACGCCACGCCGTTTACCGACAGCCTGGCGATTGGCGCGATAGCTATGATTGGCAAATCGCTGCCGAAAGCCGTGGGTTACGGCCACGATCTGGCGGCGCGTGAAAATATGTTACTGGCCTCCTGTATGGCGGGAATGGCCTTTTCCAGCGCTGGTCTGGGGCTGTGTCATGCGATGGCGCACCAGCCAGGGGCGGCGCTGCATATTCCGCACGGCCAGGCCAACGCCATGCTGCTGCCAACAGTCATGGGCTTTAACCGGATGGTTTGCCGCGAGCGCTTCAGTCAAATCGGTCGGGCGTTAACCAATAAGAAATCGGACGATCGCGATGCAATT [...]
+NODE 383 6881 360134 353681 0 0
+TATGGTGGATCGCACTAAAACCATTATTAAAAATGAAACCAACAGTATTGGTGAGGACAGAAACACCACGGTAACGAAGAATGACGGCCTTTCCGTAAAACTGGCGCAGACGATCAATATCGGCACCACTTATCGTTTAGATGTTGGCGATCAATTCACGCTTCGCTGCGGCAATGCGGCGCTTGTTTTACATAAGGACGGCTCCATTGAGTTTTGTGGCAAGCAACTGATGTTACATACCAGCGATGTCATGCAACTGATTGGTAAAGGTATTGATATGAACCCGGATGGCGGCACAGCCGTAACCGCCGATGATATTGCCCCCCTTCCCACCTCTGAGTGATCTGAATTAAACCTGGAGTTCTCATGGATCGACCATACCGCATACAGGAAGGGTGTTTTGTCCTGCCTGAAACATTTACGGATCGCAGCGTTAATATTTTTATCCTGGAGGGCAATGAACGAACATCGCCCAGCCTGAATATTTCCCGC [...]
+GCACCTTAAGGGTGACTGGCAGGAAGAAGCGGGATTTAAGACCGGGCGCGGCGTCACCGTGAAGATTTCACAGGGGTGTATTGTGCTGATGGCGGACAGTAACGAGGAGCAGAAGCTGCGCGAACAGCTTTACAAGGCTGAACAGGTGGTTAAGGGGATGCGGGACGTGATTGTTTAGTGGAATGAACGGGGATTAATAATAAAAGAGGTCCGAGAATATCTCTCGGACCAATATACTAACGACCACCATATATAGAGATGACTTCTTTAGTCTTTACGTTTATGTTAACATTTATCTCTTTAACCTCAATACCACCAGAACCTATATCCATCCAGTTATCTTGAGTAATTTCCTCTGATAAAAATGTAATAGTATAGAACTCTACATTTTCTGTTTTACGGATAATAGGATTGAAAATTAAATAAAAATTTTCCACATCGTATAATTTACTCCACTCACTATTTTTAATTGCTATAATTGCATTAAATAAG [...]
+NODE 384 11455 600282 591953 0 0
+AAAAAGCATCAATGTGATCGCCGTCAGGAATGAAGATTTTTTGTTTGGGCTCCCGGGCGAGGGCATACAATTTCTCACTGTCCTGCCAGGGAATAACATGGTCTGCCGTGCCATGAAGAATCAATACCGGAATGGGGCTGACGCTGGCAATATTGCGATCCGCGCTATAGCGGTCATCAAGCAAATAGCCGCTGCCCGGGATCATCTGGTTGGCGATGGAGGAATAGGATAAAAACGTTGAGTCGAGGATAATCGCACGTATGCCCGCCTGGTCGGCGTAGCGCATATTTGCGCAGCCTACGCAGTGGCCTACGGCGGCCAGCACATTATTACCGCCCAGGCTCTGCCCCAGCAGTACCAGGCGCTCGGGGTTAACGTCGGCACGATGCCGCACATAATCTATCGCGCTTTTCGTATCATCCAGTAGCCCTTCTTGTGATGGGGTGCCCTCCGATTCGCCAAAACCACGGTAATCAAACATAAACAGGTTTA [...]
+TGCCGCTTTACTTGACCTGGAGGATTATCATGAGGCGTTTTGGGCAAAACTGGACGCGCTCGGCGATTAATCGACATGCTGTCGGGTGGCGCTCACGCTTATCCGGCCTACCGTTCAGGCTGATTTAAAACGAATCTACATAAATTCGGTTTAAGCAGGTCACAAAAAAACCGCTCAATTGAGCGGTTTTTTTGTGCTGGTCCGGTTCGCGGCCTTTCCAGCAGGCTTTGTTGCCATAGCAACGCAGGCACACCACAGTAGGTAAATACTCCCTTTTAAGGAGAGCAAAGTCAAGTTAATTCACGACGAAACTATTCAGCATTTGAGGTATTATCTTTCCCGGCCCTCTCCGCCGTCTCGCAAACGGGCGCTGGCTTCAGGAGAGGATAACCCATGGCCGTAAGCGCAGGCACACCACAGTGCCTGCTATCACGGCATTATCGCCAGCGGTGCTGCCGTGATGCGGTCTTCGCAAGGACCGCAACATGAAGG [...]
+NODE 385 51 3185 3078 0 0
+TACGCACAACAGGGGGAGGACGAATGCGAAAAGTAAAGAGTGGGTAAATCC
+ACTCGCGGGACGACGATGGTTTCGAGCGGGGCAGGTGCGCTGCTGGCTGTT
+NODE 386 5668 323950 319869 0 0
+AACGTTCTGAAAGATAAAAAAGAGTATCTGGACGCTGGTATGGACGATGTGCTGAGTAAGCCGCTGTCGGTGCCGGCCTTAACCGCGATGATTAAAAAATTCTGGGATGCCACCGATAAAGAGGAGAGTACCGTGACGCCTGAAGAGAGCGATAAAGCGCAAGCGCTGCTGGATATCCCGATGCTGGAACAATACATCGAGTTGGTTGGGCCTAAATTGATCACCGACGGTCTCGCGGTGTTTGAAAAAATGATGCCTGGCTATTTAAGCGTGCTGGAGTCCAATCTGACGGCGCGTGACAAAAAAGGCGTCGTTGAGGAAGGGCATAAGATTAAAGGCGCCGCCGGTTCGGTAGGGCTGCGTCATCTGCAACAACTTGGCCAGCAAATCCAGTCGCCGGATCTTCCCGCCTGGGAAGATAATGTCGCGGAATGGATTGAAGAGATGAAGCAGGAGTGGCAGCACGATGTCGCGGTGCTGAAAGCCTGGGTG [...]
+GCGAAATGGCTGATAAAAAGCCTTGAAAGCCGTAACGACACGCTGCTGCGCGTCAGTCGCTGCATCGTCGAGCAACAGCAAGCCTTTTTTGAACAGGGCGAAGAATATATGAAACCGATGGTACTGGCGGATATCGCCCAGGCCGTCGAGATGCACGAATCCACTATATCCCGCGTGACCACGCAGAAGTATTTGCACAGCCCGCGCGGTATTTTTGAACTCAAATATTTCTTTTCCAGCCACGTCAATACCGAAGGCGGAGGCGAAGCCTCTTCCACCGCGATTCGCGCGCTGGTGAAGAAGTTAATTGCGGCGGAAAACCCCGCGAAACCACTGAGCGACAGCAAGTTAACCTCTCTGCTGTCAGAACAAGGTATCATGGTGGCGCGCCGCACTGTTGCGAAGTACCGAGAGTCTTTATCCATTCCGCCGTCAAACCAACGCAAACAGCTAGTTTGACCCAACCGATAAGGAAGACACTATGCAGCTCAA [...]
+NODE 387 954 57603 57330 0 0
+CTGCGCGTTGGATATGAGCGTTAATACCATAAATTTCATGCAGAATAATCGCTGCCCGGCGATGGCGGCTCGACAAACTGGAGGCGTTGCTCCCCCCGGATACGCCTGGGGCGAAAAACACGGTGTCTTTTATCATAACGCGTTCTTGATACAAAGAGAGCGGCTGGATTTTCGCCGATCACGCTATGTCAGAAGCATTGTTCCTGTCAATGAACAGAAACATTTTATGGCGTAATTTTTGGTTGATAAATTTTATATTGGTAAACCAATATTCTGTTCATATTCAGGCATCAGGGCTAAAGGTGGAACATCAGTCGTGTATTGTCTACTGCCTTTCCTTTCATCTGGCCTCACTAGCGAAACGGGGCGCATTATTATTTTGTTGGTTGACCAGTTTCGCGTTTTTGGTGTGCTACGCGTGCTATCCCTCTTTACAAATGCTATAGTCTGATACCGGGAAATCGCATCGGACGGGCACGACCAATATGAAAT [...]
+GCGCTGGAGGCGAGCTCTCGCTCTTCCAGTTGTAACGCCTGGCGCATTTTAATGATGTCTTCGCGGGTGGCCTGCAGAGCGGCAAATTCAGCGATATTGCTTTCCAGCAACTGACGCGCCTGTAACAGTTCAAACGGCCCGGCGTCATTACAGTGATTGACGTCAGCGCCTTCCATCTCGTTATTATCCGCGCTGTCGAGCACGTAGATCCCGGCGCCGCGGCGGACTTCAACCAGACCTTTAATTTCCAGCATGATCAGCGCTTCACGCACGACGGTACGCGTCACATTGAGCCTCTCAGCGATCTCTCTTTCCGGCGGCAAGCGCTCCCCGGGGCGGTACGGCGTCTGAACAATCAGATCCCGTATCATTGCGCCCACTTCCTGGTAAGGTCTTTGCTGAGAAGTGTTTGATTTCATATTGGTCGTGCCCGTCCGATGCGATTTCCCGGTATCAGACTATAGCATTTGTAAAGAGGGATAGCACGCGTAG [...]
+NODE 388 102 38248 36809 0 0
+CAGGCGGTCTGTCAAGTCGGATGTGAAATCCCCGGGCTCAACCTGGGAACTGCATTCGAAACTGGCAGGCTTGAGTCTTGTAGAGGGGGGTAGAATTCCAGG
+CAGTTCCCAGGTTGAGCCCGGGGATTTCACATCCGACTTGACAGACCGCCTGCGTGCGCTTTACGCCCAGTAATTCCGATTAACGCTTGCACCCTCCGTATT
+NODE 389 13909 929660 922438 0 0
+AAAACTGGCTGAGATTGCACAGCAGTTTGCCAGAGAGGCGGGGCTGACCAGGCTAAAAGGGGAAACTGACTATGTGTTAAGTAATGTGCTGGACGGCCTTATCGGAGACGGCAGCTGGCGAGCTGGCCCGGCTTACGAGTCATACCTGAATAAACCTGGCGTGGATCGGGTTATTACTACCGTTGATGGCTTGCACATGCAGCGTTAATTAACCGGGAAAGATGCGATGAATATGGATATTGAAGCAAGAGTCAAAAAAGTGATCACCTCCTGTATTGCCGTTGATGTTGATAGTATCAATGGTCAGACCCATCTGGTTGAGGATCTTTACGCTGACTCATTGGATTTAATTGATATTGTATTTGGTCTTAGTGAGGAGTTTGACATTAGTTGTAATGAAAACGATCTTCCTGATATGACGACCTTTGCGGATATATGTCGTGTTGTTAAAAAAAGTCTTGAGTCCAGGGTGTAGTATTTTTCTCTCGCTCG [...]
+TGCGCTGTAAATGCGCGTCTAGTTTCAGTCCCCGGAACAGCGATAGCGGTGAAGAGTCCATCCCCAAACGATACATAACCTTCTTACGATAAATGCTGACGGTTTTTGTTCCCAGACCAAATTTTTTCGCCAGTTCAATTGCCGGATGTCCCGAGGATAATAATATCAGCAGCGCATATTTCGCCTGAGTGACGCCGGGAGGTAGATTCCACCAGGCGTATTGATTGATATTAAACAATACCTCTTCCGGCGTCTCGCCGGCATTAAAAGCATACGTAGCAGCCACGGTTTTCTTTTGTGGCCTGTGGCAGAAACGCAGCCAGGCTTCCGGAAGACGAAGCTTCTCTCGATCCGAGCGGATAGCGCAGGATAGTTCGTCTTTTAAAACATAATCCATAACGCCAAAATATTGCAGCACACAGCGATCGATATAATACAAGCGATCTGCCACTACCAAAACTTTACGGTTCTGCAACCGCGTCTGCAACGCAT [...]
+NODE 390 2976 163530 162002 0 0
+GTTTGTTTTTCTGCCATGTTACAAAATACCCCTGAAAATAAGCACTTGCCAGGCGAGCACCCACGCTATAACCGCAAACTCAGCGCTTGCGGCAGTATTATGACGTTATGGGGATGCGTAAAATTTACTTACGGCCAGAATGACCGAAGCCGCCCTCGCCACGTTCGGTGGCGTCAAATGCTTCCACCAGATTAAATTCGGCCTGAACGACCGGAACAAACACCATTTGCGCGATACGTTCGCCCGGTTCAATGGTAAAACTGTCCTGACCACGGTTCCAGATCGAAACCATCAGTTGCCCCTGATAATCGGAATCAATCAGCCCGACCAGGTTGCCCAGCACGATACCATGTTTATGGCCCAGGCCAGAACGCGGCAACATGACTGCCGCCAGTGATGGATCGGCGATATGAATGGCCAATCCGGTAGGCACCAACGTCGTTGCGCCAGGCGCCAGTTCTACGGCGTCGTCGAGACAGGCGCGCAGGTCAA [...]
+GAAACGGCGTTTAGTCGCGTTCAGTGCGTGGGAACGGTTGTTACCGGTCACCGGACGCTTGCCAGTAACTTGGCAGACTCGGGACATGTCTATTCTCCAAAAATCAAATTAGCTCGAGCTTCGTATGGGGTATCGGCGCCTCGTCAGGCTTTACAGCCTGGTCATCGCGCAGTTCTATTGAACTCTCGATTGCCAGGCCCAAATGCCAAACCCGAGATTCTCAAAGGTGGCGTAGTATACGCTGACCCGGCGATATGCTCAAGTCCCGAACAGACAAAGATCCCGATGGATCGCGCAAAGAATCTTAAATCCAGCCGCGTTCGGCAAAAGAAACGTACTCTCCGCGCCCAATTATCAGGTGATCGAGCACCCGGATATCCATAAACTGGCAACACTTTATCACGCGCTCAGTGATAAGTTTATCTGCTTTACTTGGCTCTGCGCAGCCTGAAGGGTGATTATGCGCCAGAATGACCGCTGAAGCATTGAGTT [...]
+NODE 391 48 3179 3159 0 0
+ACGCTTCTCGCTCTCAACCCAGAAACGGTGAGAGTGCAGGTTAGGCAG
+TGTCACCCTGCGTGTATCTGCTAAAGGTATGCGTATCATCGATAAAAA
+NODE 392 3018 154788 153842 0 0
+CCATCCGCTATGCGTCGATCTCTGGCCGCGGCTTCCCCATCCGGAACTGATCCTGATCGCCGCGCTGTTCCACGATATTGCGAAAGGACGCGGCGGCGACCATTCGGTACTGGGCGCGCAGGATGTACTCACCTTCGCCGAACTGCACGGTTTGAACTCACGCGAAACGCAACTGGTCGCCTGGCTGGTGCGCCAACACCTGCTAATGTCAGTCACCGCCCAGCGCCGCGACATCCAGGATCCGGAAGTCATCAAGCAGTTTGCCGAAGAGGTGCAAACCGAAACACGGCTGCGTTTTCTGGTCTGCCTGACCGTCGCGGACATCTGCGCGACCAACGAAACCTTGTGGAATAGCTGGAAACAGAGCCTGCTGCGCGAGCTGTACTTCGCCACTGAAAAACAGCTCAGGCGTGGAATGCAAAATACGCCGGATATGCGTGAGCGCGTGCGTCACCATCAGCTTCAGGCGCTGGCGCTGCTGCGAATGGACAA [...]
+TGCTGGAAAGCACCGGGGGCGGTTAAGCGCGCTATCGCAAACAGGAGGACTCACGGGACAATTATTGGCGACAGGCGTATTTATAGTCGTGACCCAATTACCGCACGAGGCGTTGTTATCGTGGGGATGGCGTATTCCTTTTCTGCTCAGTGCGCTTTTGGTGTTGCCTGGATTATATATGCGTCATCGTCTGGATGAGACGCCTGTCTTCCGTGCGTTTAAAAAGCAGCAGGCCATTAATCATAGGCAGCAAAGAGAAGAAAGGCCGGTGGTCAAAGTAGTACGAGAACAATGGCGCAGCATTTTGCTGATTATAATTCTGCGTTTTGCGGAAAGCGTTCCCTTTTTTCTTGCTACCGTCTTCGCGGTTTCCTGGGCGACGACGCAGCTTGGGATTGCCAGCCTGACTATTCTGTACATTGTAATGTTCACCTGTCTGCTGGCGTATCCCATGCACGTGCTATTTGGCATCATGTCGGATCGGCGTGGCTG [...]
+NODE 393 305 18228 18228 0 0
+GCTTTCGTTACCTTAGCGCTCAACCCGGCACCATCAGCATAAAACTCAATCTTACTGGCCGGGATGCCATGTAATCCCTTTAACTTCCTGTCGCTCAGTTTGTTAAGTTCGCCAGCCATAGACCACCACCCAGCCCAAAGTGTTTATACAAATGTTTATACAGAATTGCTTGCATAATAGCATAAACAACAAAAAGCACTGGAACAATATACAGTCATAATTTCATATAACCAATTGATTTTAAATAAAATATAAAAACCACCTCAAAGCATGAAAACAGCTAATCTGACAGTACGGCATGAACT
+TTATATTTTATTTAAAATCAATTGGTTATATGAAATTATGACTGTATATTGTTCCAGTGCTTTTTGTTGTTTATGCTATTATGCAAGCAATTCTGTATAAACATTTGTATAAACACTTTGGGCTGGGTGGTGGTCTATGGCTGGCGAACTTAACAAACTGAGCGACAGGAAGTTAAAGGGATTACATGGCATCCCGGCCAGTAAGATTGAGTTTTATGCTGATGGTGCCGGGTTGAGCGCTAAGGTAACGAAAGCTGGTGGCATTAGCTGGGTGTTTACTTACCGACTCGACGGGCAGAAGCTGC
+NODE 394 4545 237854 235234 0 0
+TACCGCCTGATGGCGGAATGGGCGACCGATGCCGTGTGCCGCAAGTTGGGCAATACTCGCCCCTGCATCACGGCGGATACGCCGTTGCCTGGCTCAAAAGAGTCTACGGAACATACGCTGAAACGCATTATCTCGCTTCCCGCGCCGCTACGCGGATCGGCGGTTTATCGGCATGGCGATCGCACGCCGGGGTGGCTGAGCGAAGGCCGCCAACACCGTAGCCTGGTCTGTGAATGTGAGGCCGTCACGGCGGGGGAAGTGCAGTATGCCGTCGAAAACTTAACCGTGAATAGCCTGCTGGATCTGCGCCGTCGCACCCGCGTAGGGATGGGCACTTGCCAGGGCGAGCTATGCGCCTGCCGCGCGGCCGGGCTATTGCAGCGTTTTAATGTGACGACCGCGGCGCAATCTATTACGCAACTCTCTGAATTTCTGAATGAGCGCTGGAAAGGCGTACAACCTGTCGCCTGGGGAGACGCGCTGCGCGAAAGC [...]
+TCCCAAAATGGCGAATAAAATAGCCTAATGGGATAGGCTCTAAGTACTCACCATTACTGGAGACTGTATTCATATATTTGTCGCCGGGTTTGGGTGTTAAATAGTGTTTGTTCCTCTACTGAAAGCGTTAAGAAATTTTCCGCAAATTCTCGTAGTGTGGTAGCAGGATCGTTTTGCCCGGCATTCAATAAGAGTTGAATTGTATGGTAACAAAATAGACCACAGCCGTTGGGTACATTATTCTGTAAATTAATTTCGATAAAATTAACCTCATCGCTTTCTGATATACCTGCAATCTTTGCTGCTTCTATAATCTCTTGCTTAGTATTTTCATTTAAATCATGATAACTGTTAAATATGAGACATTTTATTTTTTCTGCAAGTTTATAAAATAAACAGAGAAGCCAGTGATCTCCTGTATTTATCAGAAAGATTTCATTTTCACATAATCCTGATTGAGCAATCTTTTCAAGTAGCTGAGTGCTTAATATA [...]
+NODE 395 51 3028 3028 0 0
+GCTGATCGATCTGTTGAGCCAACAAACGATAAGACTCAACGGCAAGGAATA
+CCGCTGCATCTGGGGATCACCGAAGCGGGCGGCGCGCGTAGCGGGGCGGTC
+NODE 396 8772 445166 439680 0 0
+GTCTGGCTACAGTACTCGCTGTGGTTCGGTAAGAACGGCATACATGACTATAGCCGCGTCAACGATGATGTGGTCGCGCAGCAGGCGACAAACGCCAAACTTAAAGCGCGTAACGATCAGCTTTTTGCCGAAATTGACGATCTCAATGGCGGCCAGGAAGCGATTGAGGAGCGCGCGCGCAACGAACTTAGCATGACAAAACCGGGCGAAACCTTCTATCGTCTGGTGCCTGACGCCTCAAAACGCGCGGCAACGGCGGGGCAAACTCATCGATAAACCATCCAGGGATTTAACATGGCAGCCACTTTATTGGACGTTTGCGCCGTGGTGCCGGCGGCCGGATTTGGCCGCCGAATGCAAACAGAATGTCCTAAGCAGTATCTCTCAATCGGTAATAAAACCATTCTGGAGCACTCAGTTCATGCGCTGCTGGCGCATCCTCGGGTGACACGCGTTGTTATTGCTATCAGCCCTGGCGATCATCGCTTTGCC [...]
+TTAACTTTTTCTATCATAACGACTTATGCACGGTTTTTTAATGACGAATGCTTTAGCTAAACGTGCGCAGGCATCGGGAGCGATCTTGTCGCAAAGGCCGTGTGGGCGTATTTTGATCAAAATGTTCGTATACGAACGATATTTGAGGTAAGAAATGAGATTGATTGTGGGGATGACCGGTGCGACCGGCGCGCCGCTTGGCGTCGAGCTACTCCAGGCATTGCGGGCGATACCTGATGTTGAAACGCATCTGGTAATGTCAAAGTGGGCGAAAACCACTATTGAACTGGAGACGCCCTACACGCCCGCTGAGGTAGCCGCCCTGGCAGATTATTGTCATAGCCCGGCCGATCAGGCGGCGACCATTTCCTCCGGCTCATTTCGTACCGACGGCATGATTATTATCCCCTGCAGTATGAAAACACTGGCGGGGGGTCGCGCCGGCTATGCCGAGGGGCTGGTGGGACGCGCTGCCGATGTCGTGTTGAAAGA [...]
+NODE 397 6110 314896 312793 0 0
+TGGCAAAGAACGCAACAGACAGAATGACAATCGCAATAACCGGCTGGTTTTCAAAGAAATTGACCAGGCCAATAATCATGGTAACGCACAGGCCAGCCATAACGGGTAATTTTCGTGCCAGCGTTCGGGATTTTCCTTTTTTCAGCAGCATGTCGCTTAGCGTACCGCCACAGAGCACCCCAAGCATCGCCATAATATAGGGCAGCATGGCGCCTATCCCGGCTTTGGAAATAGAGAGATGCAGTCCTTTTTCCAGGTAAACAATAAACCAGGTCAGGAAAAAATAGAGCGTAGACGAGCAGGCAAACTGGGTGATGAACAAACCCCAAATCGTTTTTTTGCTGAGGAAGAATTTAATATTTTGCCAGCTGATTTTTGCACTTACGGAGGATTGGTTCTCCGAGCCATAGCCGCCGCCTGCTTTAATATAATCCAGTTCGGCCTGGTTCACAGCAGTGCTGTGCTGTGGATCGCGGTAATACATAAGCCAGT [...]
+AGAGCGATAACTCTTCTGCCGATCTCCGTCGCCTTCGCCAAAAGACACGTCGGGGATCGGTTTCAGAGTAACCCGAACCGGCAAGGAGTCAACGATCGATGATTAATGATGTTAAGTGGGTTCAGGCGCAACGCCATGCCAGCGACTGGCGACACGCGCTGGATATCGCCGTTCGTCCGCTGATTACCTTCGGCGCGGCGGCCCCCTGCTACCTGGACGGTATTATTGAGAACACCCTTAAATGGGGGCCATATTATCTTATCGCGCCGGGGATTGCGCTGCCCCATGCCAGACCGGAGCAAGGCGCTAACCATAATCAAATCAGCCTCACTACGTTAGCAACGCCGGTCGCTTTCGGCAATGCGGATTGCGATCCCATCTGGCTGTTGCTTTGCGCCAGCGCCACGGATGCCGAAGCACATATTCGCACCATTCAACGCATCAGCCAGTGGCTCGACTCGCCGGAAAGCGTCGCGATGCTGCAAGATGCGC [...]
+NODE 398 3405 189971 182743 0 0
+TGAAAATATACATACAAGGAATAATGCATAGCGATTCATAATGTTCTCCTGATTGAAGCGCCCGCAGTATACCTGGCAGTAATTTAGCCAGGTTCAATAAGAGAAACGTTTAATGAACTTGCTGCAAATGGATATGAACCTGTTAAAAGTACTGTATGTGCTGCTGGAGACGAGCTCTACGGGGAAAACGGCGCAAAAGCTGGCTTTGTCGCCTTCTGCGGTAAGTCATGCGTTAATGAGATTGCGCGATGCGCTAAACGACCCGTTGTTTCGACGGGAAGGGAACCGCCAGATTGCTACGCCTTATGCGCAGGCGCTGCGTGACAAATTGGCGCCTGTGTTTGTTTCGCTTAATGAGGAGCTGTTTGGCGATAAAGAGAACGGCTCCCGTTGTTTCCGGGTGGTACTTCCTCCCGCATTGAACGCGCTGCTTACGCCCGTTCTCGCAGAGAAAGGTCATCTTCATCAGGCGGTGATCGAGTGCCTTCCTTT [...]
+TTCCTGAATCGCGGAAATCTCGCCGCGGCCACGTTCCTGACGATCCAGCGAAATCAGTACGCCAGCCAGCGTAGCCCCGTGCGCCTGAATAATCTCCATCGACTCGCGAATCGCCGTACCTGCGGTAATCACGTCATCCACCAGCATCACGCGGCCCTGTAGCGCGCTGCCCACCAGACTCCCGCCTTCGCCATGATCTTTTGCCTCTTTGCGGTTAAAGCAGTACGGCAGGTCTTTATCGTGATGTTCCGCCAGCGCAACCGCCGTCGTCGTCGCGATCGGAATACCTTTGTACGCGGGGCCAAACAGCAGATCAAATTCAATACCGGAATCCACCAGCGCTTCGGCATAAAAACGGCCTAACAACGCCAGGTCGCGCCCGGTATTAAACAGCCCGGCGTTGAAGAAATAGGGGCTTTTGCGCCCGGATTTCAGCGTAAACTCGCCAAACTTTAGTACCTGCTTGTTAAGCGCAAACTCAATAAACTGGCG [...]
+NODE 399 7714 417895 411875 0 0
+TAAACCTTATATATGAACGATTGTTTCATACTCCAGTGAGGCGGTAAACCACTCTGTAATAGTGACACAGCCTAATAACAATTGAATAACTCACAGTAAATAGCCGAGTTATAAACAGATGATGACGCCCTTGCGCCATTTTATTCACCTTTTCTGTGGATATAGTTGTGAAGAAGTATGGAATTACCACGGGAAAACCCAGAACAGTCTGAATTCCTCATGCGGAAAACAGTAAAAATAGTGCCTTATATTCATTGTGTTATAGACAAATCTTACATGCCACCTTCATAAAGCGTGACAAGCATCACATCTAAGATCCTTATGCTGATGAAAGATCAACCAGCGTCGGTTTTATCCACAGATTGTGCCAATAACTTACGCACTATTTGTCTGAATTTTCGATTTTCGTCGCACGTCAAGGCTGTAAATGGAAACAGTAGTGGCGGTTTTACACAGTTATCCCAACTTTCTGTGGATAACATAGTGTAAGAT [...]
+CATTGTTGATCACACGAATTACACCAACCTGCGTAGAGATGCGCAGGTTTTTTTTGTTTCGCCTGAACCTGTAACAGTAACGGATAATTTACACAACTCGTTGCATTTCCGTTTATTCCTTTGCGTTTTCGGACTGGCGATGCAGACGCGCGAAGCCCACAATCAAGATCCCAGAGGTATTGATTGGTGAGATTATTCGGTACGCTCTTCGTACCTGTCTCTTGCACCAACCTGCGCGGATGCGCAGGTTTTTTTTCGAACCTATTTTGCTATCGCTCCTGTTACGCAACTCGTGTAATCTGCCACAATTCATGTTTTAGCGAATTGTCGGCCAAAGGGAGTTGAAATGCTGTTTGGATTTTTCCGTAACCTGTTTCGCGTGCTTTATCGTGTGCGCGTCACTGGCGATGTCCGGGCGCTACAGGGGAACCGGGTCTTAATTACCCCCAATCACGTTTCATTTATCGATGGTATGCTACTGGCGCTGTTTTT [...]
+NODE 400 9869 521108 515149 0 0
+TGCCGATATTTTGCGCCAGGTGCGCGGGAATCTGCCGCTAATGCCAGGATTAACGCAGCTGGTGCTAAAACTGGAAGCGCTTGGCTGGAAAATCGCTATCGCCTCCGGCGGCTTCACTTTCTTCGCCGACTATCTGCGTGACCAGCTACGCCTGACGGCGGCGGTCGCCAATGAGCTGGAGATCATGGACGGTAAATTTACTGGCCACGTTATCGGCGATATTGTGGATGCTGAGTATAAAGCCAATACCTTGCTTCGTCTGGCGCAAGAGCATGACATCCCGCTGGCGCAGACGGTGGCGATTGGCGACGGCGCTAACGATCTGCCAATGATCAAAGCGGCAGGGTTAGGTATTGCCTTCCATGCCAAGCCAAAAGTAAACGAAAAGACGGAGATTACGATCCGCCACGCTGACCTGATGGGCGTGTTTTGCATTCTCTCCGGCAGCATGAACCAGAAATGATTAACCTGCCCAATGGCAAGGCGACCGTA [...]
+TGTTGAAAGGATGGGGATATTTTATGGATCAGGCTGGCATAATTCGCGACCTGTTAATCTGGCTGGAAGGTCATCTGGATCAGCCGCTGTCACTTGACAATGTGGCGGCAAAAGCAGGCTATTCCAAGTGGCACCTGCAGAGAATGTTTAAGGACGTGACGGGCCACGCCATTGGCGCTTACATCCGCGCCCGTCGTTTATCGAAATCAGCAGTGGCGCTGCGTTTGACCGCGCGTCCAATTCTGGATATTGCTCTTCAGTACCGCTTCGATTCTCAGCAAACCTTTACGCGCGCCTTTAAGAAACAGTTTTCCCAGACGCCAGCGCTGTATCGTCGCTCCTCGGAATGGAGCGCCTTTGGCATTCGCCCGCCATTACGGCTGGGCGAGTTTACCGTGCCGGAACATCAGTTCGTTACGCTGGAAGATACGCCGCTCCTTGGCGTCACGCAGAGCTATTCCTGCTCGCTGGAACAGATTTCCGACTTCCGCC [...]
+NODE 401 1797 92645 92026 0 0
+TAAGACGCGCCATTGGTATATCTCTGATGAAAGTGAATGATAACGTAAACGATAATTATTATTATAACCGCAGCATGATAGGCGAAATATCGTCGCAATGGCAAGCGATACGCGGCCCTACGAAAACTAAGGGGTTAAGAAATAACCAGATGAAAAGGAAGGGTTAATAAATTAGACTGAAATGTTATTTATAAGGGATTTGCCGGATGGCGACGTAAGCGTCTTATTCGGCCTACGTCGCACATAATGGGGTCGTAACGGTGTAGACCGGGTAAGCACAGCGCCACCCGGCACTATTACCGTGATTAATTGCCGCCGAACATCTCCTTAATCCAGCCGGCAACGCCGTCGCTCTTCTCTTCTTTCGGCGGCTGTTGCTGCGCAGGCTGCTGCGGCTGAGACGACTGATCGAACGGATTGCCTGACGGCTGCTGTTGCTGCTGCATCATCTCGCCCTGCTGGCACAGCGTATTTGGATCGTCCGTCCAGACC [...]
+CGAAACTGGCGCTGGAGCGTCGTAACCTGGTGCTACGCCTGTTACAGCAGCAGAAAATCATCGATCAGGAACTCTATGACATGCTGAGCGCGCGTCCGCTTGGCGTACAGCCGCGCGGCGGCGTTATTTCACCGCAGCCAGCGTTTATGCAGATGGTTCGTCAGGAACTGCAGGCGAAGCTGGGGGATAAAATTAAAGATCTCTCCGGCGTGAAGATTTTCACCACCTTTGACTCCGTGGCGCAGGATGCCGCAGAAAAAGCCGTTGTCGAAGGCATTCCGGCGTTGAAGAAGCAGCGTAAATTGAGCGATCTGGAAACCGCGATGGTGGTAGTGGATCGCTTTAGCGGCGAGGTGCGCGCGATGGTTGGCGGGGCGGAGCCGCAGTATGCCGGCTATAACCGTGCCATGCAGGCGCGCCGTTCCATCGGGTCGCTGGCGAAACCGGCGACCTATCTGACCGCGTTAAGTCAGCCGAACTTATACCGTCTGA [...]
+NODE 402 2701 157349 156759 0 0
+AGCGCAGCGCAGGAAAATTGCCCGTCGTCTGGAAAAAAGCCCGTTATTAAAACGGGAACTGTCGGAAATGGCTGTTGAGTCCTACGGCGATGCCATGTTATCTGCAGCGCGTGAAAAGAGTTTTCCGTCTGAAATGCCGTGGGCGCTCGCTGATGCGCTGCGCGACGATTTCATCCCGGACTGACACACTGACATTGACGAATCGGTCACAATGGCCGGTTTTTTTATGCCTGCGCGGCGTGTGCTGCGTGAAATCGTGTGCAGGATAGCGGGTGCAATCAACAGAATTCGCGCAGCGTCACGGCAGGGAAGGGAGCAAACTTATGGCCAGAAGTTTTTTGACATGCACGAATCCAGCCGCCTTAACATGTCTTTTAAATGTTCTGGTGCATTTAACATAATATACATTATGCGCACTAATCTTGTAGAGGCTCAATGCTAATGTCTATTTGTGGCTCATTTATAGGAATGTCCAGGCTATAGTTCTCAGAT [...]
+TTTTTTACGACATTTAATGTAGATAGAGGGAATTTCTCGATTACAACATACTATCCACCAGAACCACCGCTAAAGCATTTGCTTAATCCGTTTCGCAAAAACGATATTCCTCAGGTGCCGGATTTCACGATAGGTATGCTCATTTCGTCTGCCAGGTCTGGTCGCTGGTTGTATGACTGATTCACGCTTGGGGGCTGCTTTCCGTCCTCCGTCATTATTGTCAAGGCTAAGTAGAAATGTCCGCCTGCCAGCAAAGTTCAAATGTCCTCTAACAATCTTGGGAACAGAATCACACAGGCGGCAGTAGCTTGACGCTTACGTTCTGCTGGGAAAAAAAGTTATATTGTTAATATGCCCTAACAAGTTATAGAGCCTTACGCTCTATAAAAATATATATTGAACGCTAAAGTAATGGACTATTAGGTGACGCCATGCCCACTTATAAACAAGTTGTGAACCATGTTAAGAAACATGTACTGTGGAAAGAGGAGT [...]
+NODE 403 51 119 119 0 0
+GGTTTTGATAAAGAAGGCGATCAGCGCAAAGCGTTTGTCGATTTCCTGCAG
+CCCCGCTCAGGCTAAACACCATTAATAACGCCACAACAGGCGCAAACCAGC
+NODE 404 5173 279769 276884 0 0
+TAAAGCGGGCATTCCGTGGGCTATCGTCACCTCCGGTTCAATGCCGGTCGCGCGTGCGCGCCATCAGGTCGCGGGCCTTCCAGCGCCAGAGGTGTTTGTCACCGCCGAACGAGTCAAACGCGGCAAACCGGAGCCGGATGCGTATTTGCTGGGCGCACAACTGCTTGGCCTGGCCCCTCAGGAGTGCGTCGTAGTAGAAGATGCCCCGGCTGGCGTGCTGTCCGGACTGGCTGCGGGCTGCCACGTCATTGCGGTCAATGCGCCGGCCGACACGCCGCGTCTGGCGGATGTTGATTTTGCGTTGGATAGCCTGACGCAATTATCGGTCGCTAAACAACCAAACGGCGATGTGGTGGTGTTAAGAAAGACCTGATCATGATATCGCCCCGCTTTGGCGGGGCATATTTATGGCAGAATCGCGTTATCTTCTCATCTGACAAGGATATGTTGTGAACGGTGAATTGATTTGGGTTCTCTCTTTACTGGCGATTG [...]
+TGCATCCTTCGCAGTACCGCCTGGTTACCCAGGTAAATGTTAGAATGTAATTGAAAATACGACCAAAACACTTCTCTTACTTACTGATATAATACCAAATGCAACTGATCGGGATATATCAAAGAGAATGTGTCATACCTTTAGGCGTCTACAGATTTCTGCTAATGATGGACGTGTAAATCTTGTAACAGCGTCAAATAGTTTACCGAGACGCACAGATACAAAAACAATATATTGAACAATAGGTTATGTATAAAATCGCGTCATGATAATTAGCAGACAACGCAGACTACGCCCCCGTTTCGGATCATTATCTTAACCTAAAACCGCTATATTTATAAGTATTATTACGAATAATCTTAACCTGGGATATGTTATACTAATCGGACCAGAAAGATATTATTACGACTTTAGTAAATGCTTTTTAAATATTAAATAATAATTAATTAAGATTTCTACCATTCATTAATTATACTTAACAATACTTTCACA [...]
+NODE 405 9555 479268 474659 0 0
+GCCTTTATCGTGGATTAGGGATGCGAGATAAAGCGAGAAAGGCGTTGCAGCAGTAACCGGTTTTCTTCGCGCAGCCGTGAATTCTCTTCCAGCAGCGTTAACGCGACCGCGATCCCAGGCCAGTCGAGCGCCAGCTCCTCGCGTAAGCGTAGCGCGCGTTGTACCACGCTCGCTGCGCGATCGTCGAATTGCCAGTCGGCGTTATCGTCTTCGTAAGGCTCAATTACGCCAAGTCCGACGATTTCGTTTAGCTCCTCTTCCGTCACGCCGGTGTGCAAACAAAATTCGGTGATGGTAAAGGTGACAGTGATGTTAGCCATTATGCTTTCCCCCATTGCTGGCGTGGGTCAAAGGACGACTGCGCGTCCGCCAGTTGTTGCCACAGGGCAGCTGTTTTCTCGTCAGGTTTCGGCGGCATAACGATTTTGATGATGGCATAGAGATCGCCAGTGTGCTTTTTACTGGCTAATCCTTTTCCTTTGATACGCAGCC [...]
+ATGCGCGTTACCCGGTGGATGCGCAGCTTAAAACCACGCTACTCGCGCCGTTGACCGCTCTGACGCAATGGGCGGCGGATCGCCCGGCGCTACAGACGCTCTGCCGACAATTCGCCGATCTGGCGCAGGCCGGCACGCAGCGCCTGCTACCGGGGCCGACCGGCGAGCGTAATACCTGGACGCTGTTGCCGCGTGAACGGGTATTATGCCTGGCTGATGACGAACAGGACGCGTTGACGCAGCTTGCCGCCGTTCTCGCCGTCGGCAGTCAGGCGCTATGGTCAGACGACGCCTTCCACCGCGATCTGGCGAAACGTCTCCCCGCCGCCGTTGCGGCGCGTGTCCAGTTTGCGAAAGCGGAAACGCTGATGGCGCAGCCGTTTGACGCAGTGATTTTCCACGGCGACTCCGACAAGCTGCGGACCGTGTGCGAAGCCGTCGCCGCCCGCGAAGGCGCGATAGTGTCGGTACAGGGGTTCGCCCGCGGCGAAA [...]
+NODE 406 2663 157377 156376 0 0
+ATATCCTCAGGTGTTAGCGCCATGTCCGCGCAGTTATCGCGGTAGAAGATCAGAGGAAAGGTGTCCTGATCTTTAATGCCGAGGATCACCAGCGCGGTCAGACGATCGCGATCCGACAGCAGGCACTGCGTATCCACACCAACGCGGTTTAATTCTTCACGAACGAAACGTCCCATATGCTCATCGCCGACGCGGGCCAGCATAGCGGAACGTAATCCCTGAATGGCCGTGCCGTAGGCAACATTGCCTGACGATCCCCCTAAATATTTAGCGAAAGTCGTCATATCCTCCAGCCGCGACCCGATTTGTTGACCATACAAATCAACGGCGACTCGTCCCAGACAGATAACGTCCAGCGGCTTTTGCTCACTACTGACTGCTTTATTCATTGACATATCCCCTAACAGAAGACGGTGTTATTTTTGCCCATACTAAGGTTTGGTGATTTCATTTTCAATAAAAATGGAAATAATGTTTTCATTTATTGTTTGA [...]
+ATGTCTATCAGCGTGCTCACGGTCTGTTTACGAGCATCTTCCAACGCTTCATGCAGTTGTTCAATGGTGGTGACGCGATAGCTTTTACAGCCATATCCTTCAGCGATGCGAGCGAAATCGACCGGGATAAACCCGCCTTCCTGACGACCGCTCTCCTGCTGATGGAAACGAAACTCGGTGAAGTAACTGTCCATACCGTGTTCCATTTGCAGATTATTGATACAGCCGTTGGTCATGTTATCGAGCAAAATGACGGTAATCTTTTTCCCCATCTGGACGGAAGTGACCAACTCAGAGTGCAGCATCATGAACGAACCGTCGCCCACGAAGCTGTACACCTCGCGTTCCGGCTGCGCCAGCTTGGCCCCCAATGCGGCATTGACTTCGTAGCCCATACAGGAGTAGCCGTACTCGACGTGGTAATCATTCTCGCCGCGGCTTTGCCAGACACGCTGGAGGTCGCCCGGCAGGCTGCCCGCCGCCGCCACCACC [...]
+NODE 407 10813 564856 551791 0 0
+GGTGGAGTGCGTCATTGCGGATACCTGTATTGCCGGAATGGCGGAATCCGCCGCCTGTGAAGAAAAATTCAGTAGCCAGAACGTGGGCGTGACCATTACCGTTACGCCGTGCTGGTGCTATGGCAGCGAAACCATTGATATGGACCCGATGCGTCCAAAAGCCATCTGGGGCTTTAACGGCACAGAGCGTCCTGGGGCGGTTTACCTTGCCGCGGCGCTGGCGGCGCACAGCCAGAAAGGCATTCCAGCGTTCTCCATTTATGGCCATGACGTGCAGGATGCCGACGATACCTCCATTCCCGCCGACGTCGAAGAAAAACTGCTGCGTTTTGCGCGGGCAGGGTTAGCGGTAGCCAGCATGAAAGGCAAAAGCTACCTCTCCGTCGGCGGCGTGTCGATGGGGATCGCGGGTTCCATTGTCGATCATAACTTCTTTGAATCCTGGCTGGGCATGAAGGTGCAAGCGGTAGATATGACCGAACTGCGCCGCCG [...]
+AACCATACAGGATCCGCTGGCGGCAAAACTGCGCGAGAGATTGAAACATAATTTTGGCGTAGTGAAGAACAGTAAAGGTAAGCTGGGCGTGGACTGTGTTTTTTCCACTGAAGCGCTGGTTTACCCACAGGCGGACGGTTCCGTATGCGCGATGAAAGCTACCGCAGAAGGGCCAAAACGGATGGATTGCGCCTCTGGCTTCGGCGCGGCGACGATGGTGACGGCAACGTTCGGTTTTGTCGCCGTTTCCCATGCGCTGAAGAAGATCATGGCTAAAGCGGCGCGACAAGAATAAAAGGACGGGGCGGAGTGTCACGCAGACGCGTATCCGGCCCTGCGCCCTTCGTTAGCGAAAGAAGCGCTGTACCCTGCCGAACACCGGTTTCAGACGGGCGCGGAGATAATGGGAATATAAATTTTCAGATATGCATAGAAACAACCCGAACCATACCGCACAAAAGCAGAGCAGTTCCGCGTAATTAATGTGCTCGC [...]
+NODE 408 3503 215338 214002 0 0
+CTGCTGCCGCACAATGAATCGCTGTTCCAGAAGGTGAACTTTCTGATGCAGGCGGCGATGGGTTTCATCAACATTGAGCAGAACCGCATTATCAAAATCTTCTCGGTGGTTTCCGTGGTGTTCCTGCCGCCGACGCTGGTCGCTTCCAGCTATGGGATGAACTTCGAGTTTATGCCGGAACTGAAGTGGAGCTTTGGTTATCCGGGCGCGATTATCTTTATGATTCTGGCGGGGCTTGCGCCGTATCTGTACTTTAAGCGCAAGAACTGGTTGTAAAGCATTAAGGCCAGGGTGATTCAGCTGCGGCTGAACCACCCTGAAAAGTTACAGGCTCCAGGTATTGATACCTTTAACCTCTTTTTCATAGAACCACTTATTTGTATTGACGCCGACATAAGCTGCGACAACAAGTCCAAGTATGTTAACGCCGATTAATGCTCCAATAAATATTGCAACGATCCCTAATAAAATAACTATAATTGCTTTTTTCCA [...]
+ACCGCCTCGCCCAGGTGATAACCGATTTTAAGCTGGTAATAACCCATATATTTGGTGATGTCCGGATTATCGTCGGTACTGCCAATCACGTACCACGGTTTGACCTCTACCAGCCAGTTACCGTTTTCGGCCATCAGACGGGTATACAGACGGTTCCAGCTACGCGAGGTGGGGTCCGAACGTCCGTTAGAGTCATGGTTGTAGCCCATCTCTACGTCGCGCAGCGTCCAGCCGGCAAAGCGATAATCGGTAGCAAAACCAAGAAAAAGCTGCGGTTCGTAGTTGGTTTCGCGAAACGGCGAAGACTCTTTACTGTTGGAAAGCTGCCACCAGGATTTCTGCGTATAGGAAGCGCCCAGTACCGAGTTCGGCCCCAGTATTCCGCGCCACAGCGGAAACGCCAGGCTCAACTGAAATTTCACTTCATCTTTACGTGCGTTTTCAGACCAGTTGTAGGTACTTATGGCCTCTTTGTTCAGATCGCTGGTGTTC [...]
+NODE 409 1667 100692 100337 0 0
+GTTTTATCTTTTTAATATCAGAAGCTTCCATGCCGCCGTATCTGGACTTCCAGTTAATGGGATGGACTACCTCCTCCCGCTGCGGTTAACTGTACGAAATGTGCTCACCAGGAGAATCACCATGAATATCGTATTTCTGGGTATTGATCTGGCTAAAAATGTTTTTCAGCTCTGCGGGTTAAGCCAGGCCGGCAAACCGGTTTATACGAAACGCACTGGCCGAAAAGAATTGCTCCAGACGCTGGCAAATATTCCTGCATGTCTGATTGGGATCGAAGCGTCCACCGGGGCATTTTACTGGCAGCGTGAGTTTGAGAAACTGGGGCATAAAGTAAAGGTCATCAGTCCTCAGTATGTAAAACCCTTTGTCCGCGGGCAAAAAAATGATGGTAATGATGCACAGGCCATCGCAGTAGCTCTGATGCAACCGACAATGCAGTTCGTGCCGCCAAAAAGCCCCGAACAGCAGGATATCCAGGCTTTACACCGGGC [...]
+CGCACAGCTCCTGGCGGCAAATTTGACGTAATTACGAACCCACGAAGGTTGGCTGTATTGACCTTCCCCCTGTAAACAGTGCCAGTCTAAACTGAAGGTTCCGGTCTTTCTTCCATCTCACAGAGAGGCGCATTGCCATGAAAAAGACCCGTTATACCGAAGAACAGATTGCATTTGCCCTGAAACAGGCTGAAACCGGCACCCGCGTCGGGGAAGTCTGCAGAAAGATGGGAATTTCTAAGGCCACATTTTACATCTATGGACTACCTCCGTTTTGCAAGTACTGAATCTGGTTTTGGGTTGTTGCTTACATCTACCCGGCATCAGGAAAATCTGTGCCCAAATGGGTAATCCGCACACAATCGCCTCAACAACTGGACGGCCTCTGAGGCCAGTATAAAAATCAGGTTCCGATTGTGCAGGTGCAACCTGTCATCATTTCTCAGTACGCTGCAACTTTTGCTGGCAGGGGATTAATTTCACACTACCTGA [...]
+NODE 410 2971 145687 143870 0 0
+GGTTTTATCCACAAAAACATGTCCATTGAGCGCCAGGCGGAAGAAGTTCGCCGCGTGAAGAAACACGAGTCCGGCGTAGTGACCGACCCGCAGACCGTCCTGCCAACCACCACGTTGCATGAAGTGAAAGCCCTGACCGAGCGTAACGGTTTTGCGGGCTATCCGGTGGTGACTGAAGATAACGAGCTGGTGGGGATCATCACCGGTCGTGACGTGCGTTTTGTGACTGACCTGAACCAGCCGGTAAGTGTCTACATGACGCCGAAAGAGCGTCTGGTGACCGTTCGTGAAGGCGAAGCCCGTGAAGTCGTGCTGGCAAAAATGCACGAAAAACGCGTAGAAAAAGCGCTGGTCGTTGATGATAACTTCCATCTGCTTGGCATGATTACCGTAAAAGATTTCCAGAAAGCGGAACGTAAACCAAACTCCTGTAAAGATGAGCAGGGCCGTTTACGTGTCGGCGCGGCGGTCGGCGCAGGCGCGGGCAACGAA [...]
+ATTATCGGCTTATTCCCACTCAATGGTAGCCGGTGGTTTACCGCTGATGTCATACACCACACGGGAAATCCCGTTGACTTCATTGATGATACGGTTGGAAACACGACCCAGGAAGTCATACGGCAGGTGCGCCCAGTGTGCGGTCATAAAGTCGATGGTTTCGACGGCACGCAGAGAGACAACCCAGTCATACTTACGACCATCGCCCATGACGCCAACGGAACGGACCGGCAGGAAGACGGTAAACGCCTGACTGACTTTGTCGTACAGATCCGCTTTGCGCAGCTCTTCAATGAAGATAGCGTCCGCGCGACGCAGCAGGTCGCAGTACTCTTTCTTCACTTCGCCCAGTACGCGCACGCCGAGGCCCGGCCCCGGGAACGGGTGACGGTACAGCATGTCGTACGGCAGGCCCAGCTCCAGACCAATCTTACGCACTTCGTCTTTGAACAGCTCTTTCAGCGGTTCAACCAGACCCATCTTCATCTCTTT [...]
+NODE 411 8600 452075 445196 0 0
+TCAGTTCTCTGGCGATATCCAGACCCGTCATATCCGGTAGCTGAATATCCAGTAAGACCAGGTCATATTCGCCCGGCGCGAACATCTCCAGCGCCGCCTTGCCGGTCATCGCGACATCCACGCTGTTCCCCAGTTTTTCCAGTACCGAACGCGCTACGATCACGTTCAGTTCAATATCTTCGACCAGCAGAACATGCAGCGCGGGCAGCGGCATGTCGTCTTCATCAAAGGCGTCCTCCACCTCTTCCGCCACCGCTGGCGCATGAACCGTTAGCGTAAAGGTCGATCCTTTGCCCGGCAGACTGGAGACGGTAATATCGCCGCCCATATTTTTCGCCAGCCGACGGGAGACCGCCAGCCCGATACCGGTACCCGTCGCCGGCTTACCGCCATGACTGTCTTTCACCTGATAATACATGGCGAAAATTTTATCCTGCTCATCCTGCGGAATGCCGATCCCGGAATCTTCCACTTCAAAGTGCAGCATGTCGC [...]
+CTCGCGACGGCGGGTCATCACCTCTTTTTCCAGTTTGAAAGCTGGAATACCGAAGGTCAGCAGGCCGCCGATTTCCGGATGGCGATCAAAGACTACCGCCTTCACGCCGTTGCGGGTCAGCACGTCGGCGCACGCCAGCCCTGCCGGACCTGCGCCGATAATCGCTACCCGTTTGTCCGTCTGGCGCACGCCGGTCATATCCGGGCGCCAGCCCATTTCGAACGCTTTATCGTTGATATAACGTTCGATGTTGCCGATGGTTACTGCGCCGAACTCGTCGTGCAGCGTACAGGAGCCTTCGCACAGGCGGTCCTGCGGGCAGACGCGGCCACACACTTCCGGCAGGGTGTTAGTCTGGTGCGATAGCTCAGCCGCCTCAAAAATACGCCCTTCGTTAGCCAGTTTCAGCCAGTTCGGGATGTAGTTATGTACCGGACATTTCCACTCGCAGTAGGGGTTACCGCAGGACAAACAGCGATCCGCCTGGGCTTT [...]
+NODE 412 2936 138958 136492 0 0
+ATTATTTTGGGTATAGTGAGCGATGTTTGTACAATTCTTAATACTCACCGGAGCGCGAGCCGCGCCGTCGCGTCGGTAAATTATGGTACAATCCCGCCAATCTTTATTTCACTCAGGTGAGGTCCTGCGACCAATGGCACAGCTATATTTCTACTATTCGGCAATGAATGCGGGTAAGTCGACTGCACTGCTGCAATCTTCATACAATTATCAGGAACGCGGGATGCGTACCGTCGTATATACGGCGGAAATCGACGATCGTTTCGGCGCAGGCAAAGTCAGCTCTCGTATCGGTTTGTCGTCGCCGGCAAAATTGTTTAACCAAAATACATCCTTGTTTGAAGAGATTCGTGCCGAGAGCGCGCGGCAGACAATACATTGCGTGTTAGTCGACGAAAGCCAGTTTTTGACTCGCCAGCAGGTTTATCAATTATCCGAGGTTGTCGACAAATTAGATATTCCAGTACTTTGCTATGGGCTACGAACAGACTT [...]
+TTCTGAACAGTCTGTTGTCGTTGTTGATTCCGTCTATGATGCCGTTCGCGAACGTTTCGCCAGCCACGGCGGCTACATGCTGCAGGGCCAGGAGCTGAAAGCGGTTCAAAACGTTATCCTGAAAAATGGCGCTCTGAACGCCGCTATCGTCGGTCAGCCAGCCTACAAAATTGCTGAACTGGCAGGCTTCTCCGTACCAGAAACCACCAAGATTCTGATCGGTGAAGTTACGGTCGTTGACGAAAGCGAACCGTTCGCACACGAAAAACTGTCTCCGACTCTGGCGATGTACCGTGCGAAAGATTTCGAAGAAGCGGTAGAAAAAGCAGAAAAACTGGTCGCTATGGGCGGTATCGGTCACACCTCCTGCCTGTACACTGACCAGGATAACCAGCCAGAACGCGTTGCTTACTTCGGTCAGATGATGAAAACCGCGCGTATCCTGATCAACACCCCGGCCTCTCAGGGTGGTATCGGTGACCTGTACAACTT [...]
+NODE 413 3143 159486 155816 0 0
+GGATGCCGAGGCGGCGAAAGCGGCGGCGGAGGCGAAGAAGAAAGCGGATGCCGCGGCGGCGAAAGCAGCGGCGGACGCTAAGAAGAAAGCGGCTGCCGAAAAAGCGGCCGCCGCAGAAGGCGTCGACGATCTGCTTGGCGATCTCAGCTCGGGTAAGAATGCGCCGAAAACCGGCGGCGGCGCGAAAGGGAATGGCCAGCCATCGAAAGATAGCGGTACATCGGGCGCTAACGGTGGGGCGACAGGCGCTGATATCAGCGCCTACGCGAAACAGATTCAGGTCGCCATTCAGAGCCGTCTGTATGATGCGAGCCTGTATCAGGGCAAACAATGTGTCTTGCATATTAGCCTGGCGCCGGATGGCTCATTAAAAAGCATTACGTCTGAGGGCGGCGATCCGGCGCTTTGTCAGGCGGCGTTAATGGCGGCAAAAACCGCGAAAATTCCTAAACCGCCAAGCCAGGCTGTTTATGAGAAAATAAAGGATGCCAA [...]
+AGGCGGCATCATCTTTTTTACCCTTGTTGTAATTCAACTGGCCCAGCCAATAATTGGCGTTCGGCTGATAAGTAGAATCAGGGTATTTCTTGATGAAGTTCTGAAACGCCACAATCGCATCATCCTGGCGAGACTTATCCTGCACCAGCGCAATTGCCGCATTGTAATCGGTATTCGCATCGCCACTTTGTACCGGCGCCCCTGAGGTTGCCGTACCGGCATCCGGAGCGGGGGTCGCAGCGGTTGCCGCCCCGCTCTGGTCGCCAGCCGCTGGCTGCGCTGCGCCGCCATTATTTAAACTCCCCAGCTGCAGCATAATTTGCTTCTGGCGCTCCATCACCTGATTCAGTTGATACTGATTTTCCTGGATTTGGCCGCGCAAAGAATCGATATCAGACTGATTATCGGAGAGCTGCTGCTGAAGTTGGGTTAAAAGCTGGCTGTGAGCGTTAGAGATACGCTCAAGTTGAGTGACGCGGTCTTCGACCGAGC [...]
+NODE 414 3831 211574 205132 0 0
+ACCCTTTTTCCTTTTTTCACATAGCCGGGTTTCCGGCAGTCAGAGAGGGAGGATACACCATGGCTGAACGCTATATTCCGCGCTCCGTTGATGCTGAACAGGCTGTGCTTGGCGGCCTGATGCTTGATAATGATCGCTGGGATGAAGTGGTGCTGATGCTCAGGAGGGAGGATTTTTCTCTGGCTGTGCACAGGGTGATATTCCGCTCTATGTCAGAGCTGGCAGTCAGCGGTCAGCCGTTCGACCTCATCACGCTGAGTGAGCATATTGAGAAAACGCACAATATTGAGGCACTCGGCGGCTTCGCTTACCTGGCTGAGCTCAGTAAGAATACACCTTCAGCAGCCAATATCATGGCTTATGTCCGTATTGTGGCGGAAAAGAGTATGCTGCGGCAGCTTCAGGAAACCGGTAATTCTCTGGTTGCTGATGTTGCATCGCCGGATGCCACTCCGCGCGCAGTTCTTGAATCCGCGGAACGGCGACTTTTTT [...]
+TACCTCACCTCCGCCCGATATCAGGCTTTCAGGTCTCAGATTCCGGGAACCAACACCATGATGCAGTGTTGCCTTTTTACCCTCGCTGTATCCCTGCCAGCGTGCACGATCACCACCATTACAGTCCTTAACATTCCGGAAGGCAGCCATTCCCTCAAATTGCTGTCTCTTCAGCCACGTCTTCATTACACGCGTCTCATCTTCCGTGAGCGGGAATGCATCCACCACATCACGCACCCCATAAACCCAGCCGTCACGAAACATGGCTGCTCTTGCCCTGCGGGTTGACAATTTTAATGCCCTGCTCTGGGTTGAAAGATACGCCTTTGTTGCCTTTTGCATCTGCCGGCAGAGAACATCAAAGGCATACGCCGCCACAACCGGGCGCTCCCCAAAGCCATAAAATATGACAACCCGCCGCCAGTACCTTCCGGTTGTGATACGCCAGTCCAGGTATGTATGGCATCCGAATGCCTCTGCAACAACATGCAT [...]
+NODE 415 4895 286981 285821 0 0
+ATTGCCCTGGCGTCGCTGGAAGCCGAGCCGGTTGGTGAGTTTTATGAATACAAACCGGGTGACTGGTATCAGCGTTCGGTCGGGGATAAAGCGCCAAAGTGGACACCACTCTACGCTGTGCCACCAGTGCTTGTGGCACCTGAAGGACTGGTTAAGGCTGTGCGCTTTTATGAACAGGTTAAGCGTGAAAATCCGCCAGTCGAAACCGGAGCATGGAAAGACGCTGTTGACTGGGTATTACAGGAAGCATGTCAGGCTGTTCATTGGTGCCGACAGATATCAGACCTTCAGGAACAGGAGAATCATTCATGAGAAAAATCAGTGGAATGTTGAATCTGGAGAAGGCCAGGATGCAGTTGCGTGTTTTGTTATCTGGACCTGTTCCTGCAATCACTCCGATGGCGCATGCCGTGGCAATAAAAGTTGTGCTTGATGCTCTGGATGCTAGTGAGCGGAGGGTGGCTGAACTGGAACAGGTCTGTACTGCCGCGG [...]
+TGACGCGGAGGCGTGGTTTTCATCTCTTTCAGTTCAGCTTCAACAAGACGACATTCATCCCCCTTAGCCAGAACAGGCAGAGGCATTGTCTGCTCTGTATCGCCCCCCTCATCTTCATCATGCGGCGCATCTGCAATAAAAAGCGCACGCCATCCTTTCACCACTTCCACCCGTCCTCGCGTGCCAAATAACTGCCCGGCAACAACAAAAGTGGCTTCAGTGACGTCCGCTTCCTGCACGGGTAAAAACTGAGCCAGATAATGCTGACGGATTAACCGGTAAACCCTGAGTTCGTTATCACTCAGGGCACCAATATTAAACGCCTGACGGGTGGGGATAATCGCATGATGCGCAGTGATCTTCTTATCATTCCAGACTCTGGAAACAATATCAGGAGTGAGTTTTGCCAGTTCAGGGGCAATGTCCGGATCGGTGTTTGCCACAGCCGCCAGAACCTCCGGCACTTCTTTATGCATTGATACCGGCAGATAA [...]
+NODE 416 8772 457366 454306 0 0
+TATGCCCAGGAAGCGTACAGGCGGTGAGAACCAGGCTTGCTAACGGCAGTAGACGAATCAGGCGAAAATCGGGCAGGGTCATAGTGATGACGAATCCTTGTGATACGGTGCAATAATTGCCTGATGGCGTTACGCTTATCAGGCCTGAAAACTGAACCTGCAGGCTGTAAAAACGTTCGCGCCGCGATTCGGCAAATTTTTGCTATCGGTTACAGTTATAGCCTTTAATGCTAGCGCCGCCTGGTGACATCGTCTACTTTCAAGTTGTCTTAAATCATCAAATTAGCGAGCGCTGCCAATTACTCCAAAAGGGGGCTCTCTCTTTTATTGACCACGCGCATCCTGTATGATGCAAGCAGACTAACCATATCAACGCTGGTACTACTCCCGCAGACATGACCCTTTTAGCGCTCGGTATTAACCATAAAACGGCACCTGTATCGCTGCGAGAACGCGTAACGTTTTCGCCGGACACGCTTGATCAGGCGCTGG [...]
+GACTAACGCTGGTATTGATATGCTGGTAAAACGGCAGCCGCATTTGCGCGTTGATATCATACCCGCGCGCCATTCGCTGTTCTAAGGTCGCCGTATGCGTCTGCCAGTCGGCAAAAGGCTGATAATAGTTGGCGGATAAACGCAAATATTCTCCCCACGCCTCCGCGCCAAAGCCGGCGCGCTGCAAATTTTCATCCAGCAGATTATCGTAAAAGGTATTATAGCCAAGAAGCCAGCCATCCTGCGCCCAGCGCTGTCCTATGCCAACGTTGCTTACCAGTCCGTCAGTCTGTTGCGTAAGACCAAGCTGGCTCCAGGTCAGATAGCGCTGTTTATCCTGTAAAGGGATAAACCAGCTTCCGCGACTGCCGTTAAAATGACCTTCGTTATCGACGTTAATATCAACGCTGGCGCTGCCCCAGGCTGATAGCCAGCTTTCAAGCTGCTGGTTAACCTGCTCGCTGACCACATCGCGTACCTGCCCGAAAGCGA [...]
+NODE 417 2114 120462 118045 0 0
+GTAAGTGTGTCCATCTTTATTCTCGCTTATACTGGGAACCTGAAAATTATCATGCTGATGGCGACAATGACACCCTGGTATCTGTATCTGATTCGTACTGCAGACAATGCGCTTTACACCGGAATAACCACCGATGTGGCGCGTCGTTACAGGCAGCATCAAACGGGAAAAGGCGCAAAAGCATTACGGGGAAAAGGCGAGTTAACGCTGGCGTTTGCGGCGCAGGTCGGCGATCGCTCGCTGGCCCTGCGCATAGAGTATCGCATCAAACAGCTCACAAAGCGCCAGAAGGAGCGCCTTGTGACGGAACGCGAAGCGTTTGAGGCGCTGCTGTCCAGCCTGCAAACGCCGGTGCTTAAAAACGATTGAAGTGGTCGTGATACTCCACCAGCCCCGTCACGCCTTCCAGCGCATCCTCAGCCAAACGGTGTACCTGGAAAGCGCTTTCCGTACCGGGCCAACGGCAGTGAAGATCGTAATGCGCGGCCAGTT [...]
+CGGCGTGACGCGGGCCAGTTGTTTTACCTGGTGAATCGACAGTACACGCGGCAGTACTACACGGTGGACATCAAAGTTGCGGTGATAAAAGCGAATCGCCTCTTCGTTGGTTGCCGAGGCCTGAACGGAAACATGGCGCTCAATATGCGGGTAACGCTCTGCGGCATATTCCAGCATAGCGAGGTCGGCGAGAATCAACGCGTCGGCGCCAAGCTGCGCCGCCATATCCACGGCGCGCTGCCAGCGGGCATAGCCGTCCGGATGCGCAAAAGTATTAATGGCGATGTGTAATTTGCGGCGATGCTGGTGAACAAAACTCACCGCTTCCTGCAATTTTTTTTCGGTAAAGTTAAGGCCGGCAAAATGACGGGCATTGGTATCGTCTTTTAACCCGATATAAACGGCGTCAGCGCCGTTTTCGATGGCCGCCTTCAGCGCCGGGAGATTTCCGGCAGGGCAGAGCAGCTCCATAATTTATCCTGAGGGTTACGT [...]
+NODE 418 5829 321132 316948 0 0
+CCGGCACGTCGCGCAGAAGCCTGGGCGCGTTTGGTTAAGGATCTGCCGGAATCGTTCTATGCTCAGGCCGCCACAGAGATTACGCTGGCGGATGCGCCGAAGTTCGCCGATGCCATCATCAATAATCAGGTTCAGGGCCGTACGCTGGTGAAGATAAAATAACGTCACGTATAAAAAAATTTACACTTAATTAACTATTTATTTTTACACATTGACACACTCCCTGTCATATTCACTACACGCCATGTTGTGGTGGGTAGACCGGGAGTCTGTGATGAAAAAGATACGTCCATTAACAGAAGCCGATGTGACTGCGGAATCGGCTTTTTTTATGCAGCGCCGACAGGTGCTAAAAGCATTAGGCATCAGCGCGGCCGCCTTATCCTTACCCTCAACGGCGCAGGCCGATCTCTTCAGTTGGTTTAAAGGCAACGATCGTCCGAAAGCGCCTGCCGGTAAACCACTTGAGTTTAGTCAGCCTGCCGCCTGGCG [...]
+TACTGAATATTAAATGTGGCAAGCAGGGCATATAGCACGCCGCCCACGATCATGGCGCTTAATGCGCCTGCCGCGTTTGCCCGCTCCCAGTAAAGGCCCAGTACCAGCGGCCATAAGAACACCGCTTCCAGGCCGCCAAACGCCAGCAGGTTGAGCCAAATGATCATCTCTGGCGGTTTCCATGCTGCCAGCAGCAACAGCGCGCCTAGCAGTAATGTAATCGCTGCCGACATACGCTTCAGCCGGATCTCATTTTGCATCTGATCGGGGCGCAGGTTGAGATAGAGATCTTTAATGATCGTCGCGGAACTTTGCAGCAGTTGGGCATTAATTGTTGACATGATCGCCGCCATTGGCGCAGCGAGGAAGATCCCGGCGGCAAACGGCGGCAAAACTTTCACCATTAGCGTTGGGATCACCAGATCCGGCACCGTCAGATCCGGAAGCACCGCGCGACCCAGCGCGCCGGCAAGGTGCATCCCGAACATTAAA [...]
+NODE 419 1827 85963 85651 0 0
+AGACGCCGTCTTTTTTAAACGTGGTTGCCGTTACGCATCCGTCGGCAATGCAGAGCTGCTCCTCGACGTTTTCCAGACACACCCCGGTATTTGCCAGCACGACCGTGTCGGGGACGGTCTCTTTTACCCGCTTCAGTATGGCGCTATCCGTGCGGGCGCCCGCCGTCAGCCCCGAGACGCACAGGGCATCGGGGTTATTGTTAAATACGGTCGATTTCGCAATTGAACAGACATCCCGGTTACCCAGATACACCGCCGCTTCCGGAACGATGTTAAACAACGTTTTCACGTGGCCTGCGCCGATGCGATGCTGATGGCGAATGGTTTCGCCGACATTCGTATCCCAGACGCCAAAATCGCTGGCGTAAGCGCCGGTGAAAATTTCGCGAATAAATTTTGCGTCGGTCGCCATCGCCAAATCAAACGAGGCCACAGGGTCCCACAACACGTTTACCCCAAACGGTACGCGGATTTCACTCATTAACTGACCGA [...]
+CCGTTATCTTTCTGCTTAACGTCGGTATGCTGGTGACTCGTCTGACCAAAACCATGAACGTTGATATTTATAACTACTGGCACTACGCCATTACCGGAACGGTCGTCCAGTTGATGACCGGCAGTCTGATTTATGGCGTACTGGGCGCGATTTGCCACGCCGCCTTGTCGTTGAAAATGGCCGACTGGACGGCGAAACGAGTACAGAACATTGTGGGTCTGGAAGGGATTTCTATTCCGCAAGGGTATGGCTCCAGTTCCGTGCCGTTGTTCGTATTGCTGGATGCGATATACGAAAAAATACCGTTTATGAAAGGACGCAATATTGACGCTCAGGAGATCCAAAAACGGTATGGGATGGTTGGTGACCCGGTGATCATTGGCGTTGTTCTCGGGCTGATCTTCGGACTTGCCGCAGGCGAAGGCTTTAAAGGGTGCGCAACCTTAATGATTACCGTGGCGGCGATTATGGTGCTGTTTCCGCGCATGATTC [...]
+NODE 420 1099 62801 62359 0 0
+GCCTCGCCGCCGATGGACGTCTTAAATTCGGCAAAGTGACCGCGCTGGCGGATCGGCTTGAACACAAAAACCGGGCGGTGCCGTATGCGCAGATCGCCAGTATTCGCACCCAGCGCGAGGAGGGTGCTGGCAGTTCAATGAGCTATCTGATGATTAGCACCGCTACGGGCCGGATCTGCAAAATCGACCGCTCCACTATCGTCAATGAGCCGCTGCTGCTCAACTTTCTTTCCCAGCGTTTACCCGCCTGACGACATTTTTATACAAGGATGAATCAATGGAACTGTACGTATCAAAAACCAGCCAGCAAAACATGCCTGTGGAGTTCAATATCTATTATTCCAGATCTAAAACGTTGGTTGGTATTGTGTTCTGGATTTGTATGATGGGAGTTTTTATTGCGCTGGCGGTGAGTATGGCCACCGATCCCGAGGAGCCCAAAACTGGCGGTGCTGTCTTTATGGGACTTATTTGTTGCGGCAGTCTGTTATT [...]
+CTTCGGCCATATGATTGTTGACTACACAACAACATTCGCCAATCAAATCTACATTGACACAGGTTCTTTCTGTTCAGGCAATCTGTCTTTTTTTAAAATAAAGTAATCTGGAAATAGAATTATATAATATCAACCCTCCCTGCATTATGGGCAATGATATAGCCTTCAATAAGTACCATTGCCCATTCGTAATAGCGTCTAAATTTCGCGTTTTTCTGCCCATTTCAGCATTAAGATCGCAGGCCAAAAAAACGAAGCCGTAATCCGACGCAGGTAGTTACTCGATCGCCTGAGACGAGTAAAGATCGCACAGCTCCAGATACCTATCGGAAGAAAGCGCAATAACCGTGGTGGCGAAATGGATCGGCTTGCCTTCATGCAACACAATCTTAATACCGGCGGCGGCCGGGATGAAGTTAATGCTCTGTGAATGCCAGGTGTTTTCGGCGATATTTGTCCAGGCCGCGAATTTGCCATTACAGAAGCGAATAC [...]
+NODE 421 2476 142273 141097 0 0
+GGTGGTGACCGAAGATGACTGTGGTACGCACGAAGGTATCCTGATGACCCCGGTTATCGAGGGTGGCGACGTGAAAGAGCCGCTGCGTGACCGCGTTCTGGGTCGTGTGACGGCGGAAGATGTGCTGAAACCGGGTACCGCGGACATTCTGGTTCCACGCAACACGCTGCTGCACGAACAGTGGTGTGACCTGCTGGAAGCAAACTCCGTTGACGCCGTTAAAGTGCGTTCCGTTGTATCCTGCGACACCGACTTTGGTGTATGTGCGCACTGCTATGGTCGTGACCTGGCGCGTGGCCACATCATCAACAAAGGTGAAGCTATCGGCGTTATCGCGGCACAGTCCATCGGTGAACCGGGTACACAGCTGACGATGCGTACGTTCCACATCGGTGGTGCGGCATCGCGTGCGGCTGCTGAATCCAGCATCCAGGTTAAGAACAAAGGTAGCATCAAGCTCAGCAACGTGAAGTCGGTTGTGAACTCCAGCGG [...]
+CGGGATTTTAGCAAAGTGGCTCTCAAACAAACATAATGTAATTGTCCCAACGCCTTATACATTCGGTCAGGCCCCCATTACTGGCGTCAATCTTTATTGTAATACAAAAGCAAAATTTGTTATGGCTAACGGCGGTAATAGTATTCCCTGCGCGATGGCAAAATATAATGCAAAAACTGGACAATTTATTCATATAACCAGTGATAATGATTTTTCACCAATAATACGAGAAACAAGAGTCATGAAAAAATAATTCATTTATTCATTAAATTTATAATTACAGATAAAATCAAGAGCCAGCATGGCATTGAAAAATAAAATACGGCTTTTTTATCCGCGCTGATTTTGACTCGAAGAAGAATAACGGTGGCGACAATAATAATAAGACAATAAATAAATATAAGTAATGATTTATGGTGAAGTATATATAACGATAGAAACAATAAAAAAGCGGACAGAACGTTTGAAATGGTTATCTTTTTTGTAAATACC [...]
+NODE 422 3547 184967 180975 0 0
+CAAACGCCGCAAAGCAGCGCAAACAGGCTGGCGCAAAAGCCAATCGTGAGGCTGGCAAGTAGGGCATCCCATGCCGCACCGTGCAGAGCGTTAACAAAGTGGTTCAGCGTGAAGCCACTCGGCAGAATACCGTTCCACTGCTGGCTAAGGCTGGACATCAGAATCACCGCCAGCGGCAGGAAAAAGAACACGATAAACAGTACGCTAGCCACAACGCCCGCCGCTGCGCGTCCTTTAGATGACCAAATTAGCATGGCTAGCTCCTTACGCCGGTACGTGATGCCGCCAGGCGATAGAGGGAGAACAGCCCCAGCGACAAGACAATGTTAATCAACGCAATCATGCAGGCGACCGTATAGTCAGACTCCAGAATCGCTTTGCTGTAAACCATCATCGGCAGGGTGTTAACTCCTTTCGCGCCAATAAACAGTACGATGCCAAACTCGTTAGTGGTCAACAGCAGGCACAGGCTGCCACCAGCCATCAGCGCCG [...]
+TATCGAATACTGGCGTCACGACAGCCTGCGTATTGAGGTAGATACCCACTAGCGGATGCGCCGGATGTTGGCTGCGGGACTTATCCGGCCTGTCAATCGTATCGTCTCACGGCTATCCGGATAAGCGCAGCATCATCCGGCGTGGACTGATTTATTTCTCTTTCATCGTTTTGTCATATAAGCCGTTTAGCGTAAAAAGCAAACCTGGTATAGGCCAGAAAATGCAACGTACGCTATGAGGCTATTACGATGAAACTTTCCCGACTTGCTCTGCTGTCTGTCTTCGCTCTCGCCAGCGCCCCGTCATGGGCGGAATCGGTGGTCACGGTGTACTCCATCGACGGGCTGCATGATGGCGATAACAGCTGGTACCAGGTACAGTTTGACGCATTCACCAAAGCGACCGGCATTACCGTACGCTATGTTGAAGGCGGTGGTGGCGTGGTAGTGGAACGTCTGGCAAAAGAGCGTACGAATCCGCAGGCCGACGTG [...]
+NODE 423 3971 182650 181734 0 0
+TGGTCGCTGACGCGGCTGACCGCGATGGCGGTAACCATGCTGCTATTGATGCCGTTTGCCTGGAGCGAACCGTTACTCCATATCTACCTGTTGGGCGTACGCATTGATGCCAATGTGATGCACGGCATCTGGCAAATGACGCAGCAGGGCGATCCGTTAACCGCCGCAATGGTGCTCTTTTGCGTGGTGGGCGCGCCGCTTATTCTGGTTTTTTCAATTGCTTATCTGTGGTTTGGCAGCCTCCTCGGCATGAATCTGCGTCCAGTCCTGCTGATGCTGGAAAAACTGAAAGAGTGGGTGATGCTGGACATCTATCTGGTCGGTATTGGCGTTGCCTCTATCAAAGTGCAGGACTATGCCTTTCTGCAGCCGGGCATCGGGCTTTTAGCGTTCGTCTCGTTGGTGGTTCTTAGCATTCTGACTATGATTCATCTGAATGTGGAGCAACTATGGGAACGATTTTATCCGCAGCGCCCTGCTCAACGTGCGGAC [...]
+GGAAATTTTAAGCGTATTGATGCGTATACTGCGGCGCAACGGGCGTTGGCAGGCCGAAATAAATTCATCAAAAGAGAGCGTGGAAGGCATTGCTTCACGCATTTGCGTCAGAAAAGCGTCAGGAAAATAGACAGCGTGTTGAGCCACAGGTGTATCGCCGGCAAAAAAACAGGCGCGCAGTGTAGCATAAAACGCTCCGGCGCGAGTACGCCGGAGCCTGGTGTTTAACGTGGCAGAGCGGTGCCCCATTCACGCCACTCTTTCGGTTCGCTCTCTTGTAACAGGAAATGCTTACCGGCTTGCGCTTTTGGCGCCAGCGGCGTACCTGGTGGAGTAGCGAAGGCGATACCGCCACGGATGAACTGATTAAATGTCCCCGTTTTCACCACGCCGCCGGTCAGACCAAAGTCGAGACTATAGCCGGAGGCGAGCCAGAATACGGAGTTATTACGCACCAGATATTGGTAACGCTTACTGATGCGCAAGGTGATC [...]
+NODE 424 10323 549474 541667 0 0
+GGTCACCGCCACAGCATTGCCGTCTTTATCCACCACCGAGAAGTGGGTGGTCTGGTTGCTTTCATACGGGGCGAGCTTGCCCGGTTTTATCTGGCTGGAAGGTTTGGCCTTGTTGATATCAATTTGATCGGCCAGCGTTTTCGCATAGGCTTTGTTGGTCAGCGCCTGCCACGGCACTTTCACAAAGTCCGGATCGCCCAGATACTCTGAGCGGTCAGCGTAGGCGTATTTTTCCGCTTCCGCCATGATTTGCATGGCATCGGCGCTGCCAAAGCCGTACTTCTTCATGTCGAAATTTTCAAGGATATTGAGAATTTGCACGATGTGAATACCGCCTGAGGATGGCGGCGGCATGGAGAAGACCTGATACCCGCGATAGTCACCGCTGATTGGCGAACGCTCAACGGCTTTATAGCTGGCTAAATCCTCTTTGGTCATCAGACCGCCGTTCTTCTGCATTTCTCCGGCAATCTGGTCAGCAATCGCCCCTTT [...]
+CGAAGCGCTCTCGTCTGCATATTTAAGTACCGAATATAAAGATGTCGTGTCGTTCGCTCTGCTGATTCTGGTACTGCTGGTGATGCCGACCGGTATCCTGGGGCGTCCGGAGGTAGAGAAAGTATGAAACCGATGCATATTGCGATGGCTCTGTTCTCTGCGGCGATGTTCTTCGTTCTGGCTGGCGTCTTCATGGGCGTACAACTGGAGCTGGACGGCACCAAACTGGTGGTGGATACCGCCGCCGACATCCGCTGGCAGTGGATCTTTATCGGTACGGCAGTGGTTTTTTTCTTTCAGTTGCTGCGTCCGATGTTCCAGAAAGCGGTGAAGCACGTCTCCGGACCGAAGTTTATTCTGCCGGCGATCGATGGCTCTACCGTTAAGCAAAAGCTGTTTCTGATGGCGCTGTTGGTTATCGCCGTGGCGTGGCCGTTTATGGTGTCGCGCGGTAGCGTCGATATCGCCACCATGACCATGATTTATATCATC [...]
+NODE 425 4406 203976 200320 0 0
+TCTTGAGCTGCTTTGTGGTTGTCCTTCCCTGGGCGATCGCCATTGCGCGACGCGAAGCCGATTTCTGGCATTACTTTTTCTGGGTGGAGCATATCCAGCGATTCGCCATGAGCGATGCCCAGCATAAAGCCCCTTTCTGGTACTATCTGCCGGTACTGCTCGCGGGAAGTTTACCGTGGCTGGGGTTACTGCCTGGCGCGCTTAAACTGGGCTGGCGCGAGCGAAACGGCGCATTCTATTTGCTCGGATGGACGATCATGCCGCTTCTCTTTTTCAGCATTGCGAAAGGGAAACTGCCCACCTATGTTCTTTCCTGTTTCGCACCGATAGCGATACTCATGGCGCGCTTCGTCCTGCATAACGTAAAAGAAGGCGTCGCCGCGCTGCGTGTCAACGGCGGGATCAACCTGGTGTTCGGGTTAGTCGGGATCGTCGCAGCGTTTGTCGTCTCCTCATGGGGCCCGCTGAAATCGCCGGTGTGGACGCATATCG [...]
+GACGCGGGGGTGGTTCTGCGCGACAGGCGGTTAAAAACTCGCGACGGGCTGTATGTTTGTCTGCGTGACGGCGAGCGTGAGGGATGGGGAGATATCTCTCCGCTGCCGGGCTTCAGTCAGGAAACGTGGGAAGAGGCGCAGATGGCGCTCCTGACGTGGGTGAACGGCTGGCTTCAGGGGAGCGAGGGATTACCGGAGATGCCTTCGGTCGCGTTTGGCGCAAGCTGCGCGCTGGCGGAACTGACTGGCGTCTTGCCGGAGGCGGCGGACTATCGCGCCGCGCCGTTATGCACTGGCGATCCTGACGATTTGGTGCTGCGGCTTGCCGATATGCCCGGCGAGAAAATCGCTAAGGTCAAAGTGGGTCTCTATGAAGCGGTACGCGACGGCATGGTGGTTAATTTGCTGCTGGAGGCGATCCCGGATCTGCATCTGCGTCTGGATGCGAATCGCGCCTGGACGCCGCTAAAAGCCCAACAGTTCGCAAAGTAT [...]
+NODE 426 9260 529100 526400 0 0
+TTGGCCGCTTCATACTGCTGGAGCATATCGCGTTCAGTGATTTCCAGCACGATATGAAAATGGTGCGCGGGCAGGGCGTCCCTGAGCCGGTGCATATCCTCTTTAAAACTGTCGCTGTGCAGATGTTCCGGCGCGATGTTAATGCCAAATTTGGCACCGACGGGCATCACCTTCTGTAGCGTGGGCGCGTCGCGGGCGATCAGCTCGAACAGATGCTGCGTTAACGGTACGATAAGTTGCTGCGCTTCGGCATAGTGGATAAAGGCATCCGGCGGAATCTCGCCTGCCGTAGGGTGACGCCAGCGCAGTAAGACTTCAAGCCCGGTGACGCTTAGCGTACGAGTATCGACGACGGGCTGATAAACCACATAAAACTGCTCGTGTTTGATCGCCGTTAAAATCTCTTTGCCCGGTCGCGTCCGGAGGGCATAGATAAAGTAACAGATAAACCCCGCTACGATGCCGCTAATGCAGCCCAGCATCAACGCATAC [...]
+CGCGGCGTCGGCGCTCAGCAGACGATCGGCTTTATTGTTCAGCAACAGGTCGCCGAGGCGTTTTAACACGGCAATCGGCTGCTCGTCGTTCATCGCGACAGTGACTAATAAGGCTGCTTTTTCACCCTCTACGTCAAACGCCTGGGTCGCACGGCTTACCGCAACAGCGCTGCGCAAATTGCCTTCCGCGCTGTCGTTCAGCCAGATGCCTTGTCCCAGATTCATCGGACTATCGTTAATCGTTTTTGCGACGAACGCCGCATCAACCGCTCCCGCCTCTTTCAGACGCGCCGCATTTAGCGCCTGCAATGTGACCAGCGAGCTGGCGATGACATCCAGCGTCATCGTCTCGTTATCAAGTTTTAATTGTTCACTTTGCTTCTCGCCCATCAGCAATGCGCGCAGCTCTTCCGCCGTTGTCGCGGATTTCAGCTGTTCAGCCACGGAGTCATCGCTCAGCACATGCGTCAGCTGACGCAGCAGGCCAAGGTG [...]
+NODE 427 11516 570144 565856 0 0
+TGCCATAAAGAAACCTGTATTGTTGTAAAAGATGAGAATATCACGCAAGTAAATTATCACTTTTATTTATTTGGCCGTTCAGGCCTGGATTATCTTTTTTACAATTAAGTTCCGAAACTTCTTCGGGACTCGATTGCGATGTTGTTCTGCCAAGAGGTGAAGGAAGGAAAATGCCGGGTACGGAAAAAACACAACATATAAGCCTGACCACACAGGTTGAAAATCGGTTAAAGCATCAATTGTCTATTGGCGCATTAAAACCAGGCGCAAGGCTTATCACTAAAAATATCGCTCAAGAGTTAGGCGTCAGTATTACGCCAGTGCGTGAGGCCCTGTTAAGGCTGGTCTCTTCCAGTGCTTTGGCGGTGGCGCCAGCACAGGCGTTTATGGTGCCGGAGATCTCGCTGGAAAGTTTGCTGGAAATTAATACGATTCGTACTGCCCTGGAGGAGATGGCGGTGGTCGCCGCTGCGGGTAAGATTACCCCGGATC [...]
+ATACCGTACCCTGCCGATGGTCTGGTACGTACCGCCGCTGTCGCCCATCCAGTCATACGCCGACGCGGGCGGGTTGCCGCACAATGGCAATATTCTGCCGGCGGTGGAGACGCTGCGTATTCCGGTCCAGTACCTGGCCAATATGCTCAGCGCGGGCGATACCGGTCCGGTCATTCGGGCGCTAAAGCGGATGATGGCGATGCGCCACTACATGCGCTCGCAGACGGTTGAAGGCGTGACGGATACCCGCGCGATTGACGAAGTGGGTCTGAGCGTACAACAGGTTGAAGAGATGTATCGCTACCTGGCGATTGCCAATTATGAAGATCGTTTTGTCATTCCCACCAGTCACCGGGAAATGGCGCGCGATGTCTTTCCGGAGCGCAACGGCTGCGGCTTTACTTTTGGCGACGGTTGTCACGGCTCGGATACCAAATTCAACCTGTTCAACAGTAGCCGTATTGATGCCATCAATATCACCGAAGTGCGTGA [...]
+NODE 428 3860 230080 227754 0 0
+GTTGAGCTGGGATGAGAAACGAGCAACTCATTAAGATCGATACGCTGCTCAATGTAGTCCGCTGCGGGGCTGGGGAATCCACACGGCACTAAGTAACTGAAAAATGGGAGAGGAATAATTTCGCGCAACTCTGTAGGTCTGAAAAATTCCATAATCCATACCTCGAATACTGTTTTTATATACAGTAGTATTATTTGAACATGCGCGCAAGATACCGGAGTCGCTACGGCTGTTTAAATCTTCGTCGCTTCGTTTGTAAGTTTCTCTCTCAGTTCAAATTATGGGTTTTGTAAATTTTCCGGTTGTATTGTCATGTGCGCATATTTAAGCCAGCCTGGAGGCCAGATTTTCTGTACAGCGTCGACAGTCCCGCAGCGTAAGTTATCGCCACGCGCCAGCGCGTTTCCCTCACAGCAATTAATCTTCTGCCCAGCGCCCATGTCTACAGGGGAACATTTCGGGCAACAGGCCGGGTGCGACGATGACCGAGGA [...]
+TGTTTCAACGAGGCGCATAATACTGGGCCGACTATAACGTGTCAACAGTAAAATTAACGCGCCAATTCAATTGGTTAATTAACCCACAAAGTGAGGAATTAATGTTCGGATTCCTCGCCGTAGTCGCCTTCGGCAGCGCTTACCCGTAAGCGCTGAGAAGGATCCTGGCGATAGAACTGGCAAAAACGCTGCCATAGTGCCGGGAAACGTGGAGCAAACAGTTCTGGCGCGCTGAAAAAATACTCTGACAACACGGCAAAACATTCTGCGGGGTCGGTGGCGGCATAGGCATCTATACTGGCAGCGCTTTCGCCAACAAGATCGATTTCATCCTGAATATTATTCATTGCCGCGTGGAGATCGTGTTCCCAGCCAGCCACATCGCGCAACGGGATGAAAGGGATGCCGCTGGCGCGATCGCCATTACGCATATCCAGTTTGTGCGCGACTTCATGAATAATGAGGTTGAAACCCGAAGCATCGAACGAGTCC [...]
+NODE 429 2557 137703 135157 0 0
+CCCGCCACAGCATCGTGGGCGAGCGTTACTATTTTGGGTAGCCGAATAATTTACCCATCAACAGCCTCCTCCGTAGATGTGCAGTTAAAAAATAATGATGCAATACCTTATATCGTACAAACCTGGTTTGACGATGGCGATATGAATACCAGCCCGGAAAATAGCAGCGCGATGCCGTTCATTGCCACGCCGCCGGTATTTCGTATTCAACCCAAAGCAGGCCAGGTGGTACGCGTAATTTATAACAACACGAAAAAATTGCCGCAGGATCGTGAGTCAGTATTCTGGTTTAACGTATTACAGGTACCACCAACGAATATTGGCAGCGACAGCGGGCAAAATAAAATGTTGGTGATGCTGCGCTCAAGAATAAAACTTTTCTATCGTCCTGACGGGCTAGGTAAACCTGATAGTCTGGCGAAAAAATTACAGATTAAAACGGTAAATAAGGGTTCCGGAAAAAGCGGTATTGTTATTGTTAATCCGCAGCCC [...]
+TGCCGGTCATGGATACGGTTGAGGAATGGCTTTGACTGGACTGGTTATAATTCATGGCGACAGACGTTCTGTTTTCGCCCCAATCCAGCGGTATAGAGACATTAAACGACATTGTGGTTTCGGTATATTTTTGTCGGCTACTCACGTCCAGTGGTTCGTTAACGCCGTGATAAAAGCGATCGTAATCCCAGGTGGTGCGCTGTCGTGCGATATTCACCCCGTAGCTTATATTCCGCCACTGGTTGCTATACCCCATTTGTAGCTGTGTTATACGCGATTGGTTATTGTAGTAGTCTGCGGTGCTGGCGCTGAGGTTAAGCGTACCAAGCCGTCCTAACGGCTGGCTTACCGTCGCGGACAGGCGATTGCGCTGATGCAGCGTGTCGGAGTAGTAATCAATCCCCGTTTTTGCTTCCCGGCGTACGCCGAGCACGTCCTGAAGATCGCGAAAGCCGTTGGTTGAATAACGATAAGCCGCCAGTACCAGGTTAG [...]
+NODE 430 1256 69344 68686 0 0
+CAAACCGCAATCGTTGATCAATTGGGATGGCTTTCGCACCTATAATTTCGATGTCATTGACGGCGTGAATTATCAAATCGATGTGTCACAGCCCGCCCGCTATGATGGCGAATGCCAGATGGTGAATCCGCAGGCGGAACGTATTAAAAACCTGACCTTTAACGGTAAGCCTGTCGACCCGAACGCTACGTTCCTGGTCGCCACGAATAACTATCGCGCTTACGGCGGCAAGTTTGCCGGCACGGGCGACAGCCATATCGCCTTTGCATCTCCGGATGAAAATCGCGCCGTGCTGGCGGCATGGATTGGCGCAGAGTCAAAACGCGCGGGCGAAATCCATCCGGCGGCGGATAATAACTGGCGTCTGGCGCCAATCCACAGCAATACGGCGCTGGATATCCGCTTTGAAACATCGCCAGGCGATAAAGCCGCTGCCTTCATTAAAGCGAAAGGACAGTATCCGATGAAGAAGGTTGCCGTCGATGATATTGG [...]
+TGGCGAACGGCAATCCCGCGCTGACTGAGCGGGGCGGCTTTTTTCGGGTTACGGACGATCGCGATGAGGTGACTGGCGGGCGTCGTTTTTAGCAGGTTTTCAATAACGTGTTGGCCCAGTTGGCCTGTTGCGCCAGTGATAGCAATCATGGTGAACTCCTCAGTGTTGGTCTTGTGTTTTATTACGCTACCACCTAAACTTACTTTTAGTAAGTACGTACAAAAAGGTAAGTATCAATGCGCGCTCATACTCTTTCCCGGCAGTTGCGTGAAGGCAATCTCTTTGCTGAACAGTGCCCGTCCCGTGAGGTGTTAAAACATGTCACCAGTCGCTGGGGCGTACTGATTCTGGTGGCGTTACGCGACGGTACACACCGTTTTAGCGACCTGCGCCGCAAGATGGGAGGCGTGAGTGAAAAGATGCTGGCGCAGTCGTTACAGGCGCTTGAACAGGACGGATTTCTCAACCGGGTGTCATATCCAGTTGTTCCGC [...]
+NODE 431 2742 141495 140398 0 0
+AGGTGTGGCATACCGATATGGCGATAAAGGCGGAGTTTGATGTGGCCCGTCTGCATGAGCTGAACAGACCGAACATTACCCTTGGAAAGCCCTTTATCGTCGTGGGCGTCGGCGATGCGCGCGGTATCAGCGCAGTAAAAGCGCCGCAGGTGAATGGTGAAACGCTCACTGTAGAACCGGGGACCGGCTTACCGGAAAGTAGAGAGGGCATTCATATCCCGCTGCCGGACAGTCAGTGGGCGACGCGCAACCTGACGTTGGCGATGTCGCTAAATTTAAGCGGAACCGGCAGCTTTTCACTGGTTCCCGTCGGGCGTAGCAGTGAAATGACCCTGACCAGCAACTGGCCGCACCCAAATTTTGTGGGGGATTTTCTTCCCGGTAAACGCGCAATCAGCGGTTCGGGATTTCAGGCCCAGTGGCAAACCAGCCGGTTTGCCACGAATCTCGGCGAACAGTTTGCTGATGCGCAAAAGGTGGATTGGGACAACT [...]
+CTCGATCAGCGCGGCATACAATACCGCAGATGCCGTAGACATTAACGTTACGGGATTAATTTATGCCGATCCGTGTACCGTTACGGTACCTGACACGATCTCTCTTGGACAATATGCCCGGGCGGATATCGCCGTGGCCGGCGGCAATACCGCCACCATTCCTTTCACCATAAAAATGACGAATTGCCCGGCAACGACCACAAAAGCCGCGATTTCATTTAACGGCGTACCTTATCCCGATCCAAATTATGCTTCTGCGATTTATGCAAACAGCGCGGCCAATCCGGCGCAGGATTTAGGATTACAGCTTTTTAACCTGGACGGTAAAAGTCTGGTCAATCTGGCCAACAACGTCACTTACACGGTGGATATCAACAGTAATACCCATGAAGCCAATTTGCCTGTCGCCGCAAGGATGTATACCCCGCACGGAAAAGTCACGGCAGGGGATTTCACGTCCGTTGTGACGATCACTATTGCATGGCAATAACA [...]
+NODE 432 1648 76765 76352 0 0
+TGGGCGACGAGGCTCGCGCTCTTGCTATGCAGCGTGTGGGCACCGAAGGCAGCAGCGGCATCTCCAGCCCGCGCCGCTACCTGTGGGATGAAACCCCCGCCTTGCAGGACTGGCGCTTTAGCCAGATCCACGGTAAAACGCAGCGCGAACCGCTTGCCACCGCGTTTCCGCTGATGAATCTGATGAATGACGACGGACAGCCGTTATTCCGCCTGCCGCATGAAGAAAGGCTACCGGTTTTTTCGCCGCAATACAGTCGTAGCACCTTGATGACGCATATGTTGTGCGAAATTCTGGCTCAGGCGCTGGGGCAAATTAACAGCGTCGCCACCCGGCTGCGGCTCGGCTTTCCCGCCTCGCCGCGCCAGCTACGCACCCTGATTTTAACGCTGCCTTCCGCCATGCCGAAACAGGAGCGAGAAATTTTCCGCCAGCGAATGTTTGAAGCGCTGGCGCTGGTCTGGAAAGCCATGGGCTGGCATCCGCAGGATG [...]
+AACGGTATTATCCAGTACGCCGAGATAACGCACAGTCGAATACGCGCCGATATCAGCCGCTTTAAAATTGAAACGCGGCAGACGTAAGTCCAGCGCCAGGCTGCATAACATCGCGCCCACCGCGGCAGTGGATTTTGGATTACCGATACGCCCTTGTTGACTGAAGGGATACCATTCATGTACCTGATACTTATCCATCCACACAATGCGATTAACCGGCACCGGTTGTAAGTGCCGGATGAGCGCCTGTACGCCGGGTAAACAGGTCGGTCTCCCCGTCACCAGCAAGATATCGCAGTGATAGTGGGAGATCGCTTCGCAAACCGCATGAAGCGGCGTTGTCAGCGTAAACTGACCGGCCAGCAGAGCCTCCTGAAGCTGGCTAAACTGGATTTGCAACGGCACATTGAATATATCAAATGTCGGCGAACCAGACGGTAAGGCATGATCGATCGCCTGCTGGATATAGTTCATCACGTTGCTTGTTGGGCG [...]
+NODE 433 9142 535711 523546 0 0
+AATTTCGATTAGCTAACTGCTTGTTTAAAAAGGCGCTACTCGGCATGGGGAAGCGCCTTTTTTATACGCATCACATGGAATTTGGTCATGAAAGCGGAATGTGAACCTCAGTACTTTGGCGATGAATCGAAGAAGATTATTCACGGTGACGCGCTAACAGAACTTAAAAAACTGCCTTCTGAAAGCATTGACTTAATTTTTGCCGATCCGCCTTACAATATCGGAAAAGATTTCGACGGTATGGTCGAATCCTGGGACGAAGCGTCTTTTCTGGCCTGGCTGTATGAATGCATTGATGAGTGCCACCGCGTACTGAAGAAACACGGCACCATGTACATCATGAATAGCACAGAAAATATGCCGTATATCGATCTCAAATGCCGAACGCTTTTTACCATCAAAAGCCGTATCGTCTGGTCCTATGATAGTTCCGGGGTGCAGGCGAAAAAATACTTTGGTTCTATGTATGAACCGATCCTGATGATGGTAAAG [...]
+AATGCAACTGGAATTAGTCTTTTCATGGTGTTACCTCATTAATCAGCGTTTCGCGAAGTACAGCAACGTAAATGCTGGCTCTAACCGCTGCGAAAACGAGAGTTATTTTACCACCACAGAAAAAATGGCCGACATGAGGAATCATCTCAATTCATGTGAATTGTAAAAACTATGGAGAATGCAGAGGTAAGCGGAGAGGGGGAATAGCGGAGATAAAGACGTACCGTTTAAAAAGGCGTCCGAAGACGCCTCTGTTTACCGGTTAATCATGATGGCGATTAAATCGGCGTTTTACAACAACGAAGAATACTGGCACGAAGAAAATAGCTAATAAAGTTGCGGTTAACATTCCCCCCATAACCCCTGTGCCTACTGCGTTCTGTGCACCACTACCTGCGCCACGACTGATAACTAACGGCATTACCCCGAGAATAAAAGCCAGCGAGGTCATTAGAATAGGACGTAAACGCATACGGGATGCTTCCAGCGTCG [...]
+NODE 434 81 2975 2970 0 0
+TGTAACCCCGCCCGATGATAGCGGCGATGATGATGTGACCCCGCCCGATGATAGCGGCGATGATGACGACACGCCCCCAGA
+ATCATCGCCGCTATCATCGGGCGGGGTTACATCGTCATCGCCGCTATCATCGGGCGGGGTCACATCGTCATCGCCGCTATC
+NODE 435 680 43949 43949 0 0
+TTTAAAAAATCGACGCAACGCTCAGAACACTCCGTCTCGGTCACTAATACTCCATCGTAAAACATCTGTAGTAGTAACATATTTTCTTGATACGCTAATACTTCTACAGTGTATTTATCTCTTGTTTCAGGCCTGGAGGCATCAATAAGTTTAATATATCCAAGAAGGGGGCGCCATCGTGTACAGTCTTCATCTCGCTTCGAAAATGGTCCTGGAGAGAAAGGCCCTTTAATATCGGGATGCTCGTTTTTTTGGCACAGTAGATTATATATTTCTCTATAGTCAGAAATTAAACTTCGCTTGGTGAATATATTCCTGAAAAAATCTATAAATTTCTCACACGTTGAAAAAACATGCTCTCTTTTATTATCGATGATATCTCTTAAATACCTTTCTGATATCTGGCAACTATGATTTCCGATCTGAAATGTAAACGGCATATGTCTCATCCTCTGAAAATTTATTATAATATACATGCAAACATATAAAAAC [...]
+ATGTAATTTTAACCAGCAAATGCTTAACAAAAATAATTTCTTTTTTAGGTGCTGAAGGTTTTCTCTATTTATTGATGCAGAGTAATACTGAATATGAAAAATTTTGGAAATCAGGTGATTACAGTAGTTACAAATCAGGTTTTTATATGTTTGCATGTATATTATAATAAATTTTCAGAGGATGAGACATATGCCGTTTACATTTCAGATCGGAAATCATAGTTGCCAGATATCAGAAAGGTATTTAAGAGATATCATCGATAATAAAAGAGAGCATGTTTTTTCAACGTGTGAGAAATTTATAGATTTTTTCAGGAATATATTCACCAAGCGAAGTTTAATTTCTGACTATAGAGAAATATATAATCTACTGTGCCAAAAAAACGAGCATCCCGATATTAAAGGGCCTTTCTCTCCAGGACCATTTTCGAAGCGAGATGAAGACTGTACACGATGGCGCCCCCTTCTTGGATATATTAAACTTATTGATGC [...]
+NODE 436 2069 102436 100947 0 0
+GGACGTCTGGAGCGGGGGCTCGACCTGACCGCAATGATGGCGCAGGGCATTACGATGGGAGATGAATTCCACCAGCGCAATATCGCCTCTTCCGCATTGCTGATGCGCACGTTGGCGCCGCATATCGCCCGTCTGGAACACGATAAGCAGCAGATAGCGGAAGTAATGGATTTTCTGAGCGTCACCGATCAATTCTTCCTTAATCTGGCGATGGCCTACTGTAAAGCCGCCATGGACGCAGGCGCGCAGATTCGCGCCGGCAGCATTGTGACGGCGATGACCCGCAATGGCGATATGTTTGGCATTCGGGTTAGCGGTCTGGGCGACCGTTGGTTCACCGCGCCTGTTAATACGCCGCAGGGGCTATTTTTTACCGGTTTTTCGCAGGATCAGGCCAACCCGGACATGGGCGACAGCGCCATTACTGAAACGTTTGGTATTGGCGGCGCAGCGATGATTGCCGCGCCTGGCGTAACGCGTTTTGTCGGTGCC [...]
+AGCCATAAGTCGCTTCCAGCGCCATTTGCTCTTCTGGCGAATAAACGGGGCCAATAAACTTTTCCGGTTCAAGAAAAGCAGGATCGTCCGCCGATACCTTTATCCGCGTTAATACCGCAGTCACCGGCGGCATATCGGGTTCAAGCGCCAGACGCTGCGCCAGCATATAGCCGATCATGCCCTGACTTTCCGCTACCAGCACATCCAGCGGATAAGGCTCAACGGCTTTCCAGGCAAGGTTCTGTAAAGCCAACAGGCCGACCTGGGGGCCGTTGCCATGTACTATCGCCAGCCGATACGAGCGGGCAAGTCGCGCCAGCGCAGGCACCGCGTCGGCAATATTGCGATATTGATTCTCTGCCGTTAGCGCTTCTCCGCGCTGCAATAATGCGTTGCCGCCAAGAGCAACTACCAACGTTTTCATTCCCTATCCTTTTACTATTTGTTGTCCAAGCCAGAACCCCAGCAGCGTATCCGCGCCAGAGGTGTGCC [...]
+NODE 437 2713 129362 125860 0 0
+TTCGAAGCCTGGATTGGCGACGACGACCCCAACCCGCTACATCGTGAAATGGCCGTTGCCATTAAATCGCTGGTTGATTCCGGCGTCCCCTGCTTCTTTATTCACGGTAACCGTGATTTCCTGATTGGCAAACGCTTTGCCCGCGAAAGCGGCATGATTCTACTGCCGCAGGAAAAAGTGCTCGACCTGTATGGCCGCCATGTGTTGATTATGCACGGCGATACGCTCTGTACCGATGATGCCGGTTATCAGGCGTTTCGCGCCAAAGTCCATAATCCGTGGGTTCAACGGCTGTTCCTTACCCTGCCGCTGTTTATCCGCCGCCGTATCGCCGCCAGAATGCGCGCCGGCAGTAAAGCCGCCAATAGCAGCAAATCGCTGGATATTATGGACGTCAATGCGCAGACCGTCGTCGCCGAAATGGAAAAACACCGCGTACAGTGGCTGGTTCACGGTCACACCCACCGCCCGGCAGTGCATGAACTTTCCGTC [...]
+TACCTGTTGCCGGCGAGGGCGAAGGGGTCGAGGCGGTGATAGATAAAGACCTGGCGGCGGCATTGCTGGCGGAGCAGATAGCGGCCGATGGTCTGATCATTTTGACGGATGCGGATGCGGTGTATGAACATTGGGGAACGCCACAACAGCGCGCTATTCGTCAGGCTTCGCCCGATGAGCTGGCGCCGTTTGCCAAAGCCGATGGCGCGATGGGGCCGAAGGTGACCGCGGTAAGCGGGTATGTGAAGCGGTGCGGAAAGCCGGCATGGATTGGCGCATTGTCGCGTATTGACGATACCCTGGCGGGCAGAGCGGGAACCTGCATCTCTCTGTGATCGCGACGGGCGGCGACAGAGAATGCGCCGCCCACGCTGTTTATTTAAGCTTACTTTGCGCCCAGATAATGCCGCTGGCGTATTCGCCCGGCAGGAGCGGAGAGAGCGCTTCCAGGGTGGCGCTAAGACGTGACGTATCGCTGTCGGTCAGATTCAG [...]
+NODE 438 658 34118 33723 0 0
+CGTAAACCCGGCTGGATAAAGCGCGTCTGGCGATGGTGGCGCAGCCCCAGCCGCCTGGCGTTGGGGACGCTGCTGTTAATCGGTTTTATCGGCGGCATCATCTTCTGGGGCGGCTTCAATACCGGAATGGAAAAGGCTAACACCGAAGAGTTTTGTATTAGCTGCCATGAAATGCGCAACACGGTGTATGAGGAGTATATGGAAACCGTCCACTACAACAACCGTAGCGGCGTTCGTGCCACCTGTCCTGACTGCCATGTGCCGCATGAGTGGGGGCCGAAGATGATCCGTAAGATCAAAGCCAGTAAAGAGCTGTACGCGAAGGTATTTGGGCTGATAGATACACCGCAGAAATTTGAAGCTCATCGCCTGACAATGGCACAAAATGAGTGGCGGCGCATGAAAGACAACAACTCGCAGGAATGCCGTAACTGCCACAATTTCGACTTTATGGATCTGACCGCGCAAAAAGGCGTCGCGGCGAAAATGCAC [...]
+TCCCACTCATCAACGTCCTGTCAGAAACCTGGTTTAACATCACGCATATCCGGCAGTTTATGCGCGATCCCTTTGTGGCAATCGATACAGGTCTGTCCGTCTTTGACCGCCTGATCGTGCATTTTCGCCGCGACGCCTTTTTGCGCGGTCAGATCCATAAAGTCGAAATTGTGGCAGTTACGGCATTCCTGCGAGTTGTTGTCTTTCATGCGCCGCCACTCATTTTGTGCCATTGTCAGGCGATGAGCTTCAAATTTCTGCGGTGTATCTATCAGCCCAAATACCTTCGCGTACAGCTCTTTACTGGCTTTGATCTTACGGATCATCTTCGGCCCCCACTCATGCGGCACATGGCAGTCAGGACAGGTGGCACGAACGCCGCTACGGTTGTTGTAGTGGACGGTTTCCATATACTCCTCATACACCGTGTTGCGCATTTCATGGCAGCTAATACAAAACTCTTCGGTGTTAGCCTTTTCCATTCCGGTATTG [...]
+NODE 439 174 70657 66997 0 0
+GCACCATTTTGCCTAGTTCCTTCACCCGAGTTCTCTCAAGCGCCTTGGTATTCTCTACCTGACCACCTGTGTCGGTTTGGGGTACGATTTGATGTTACCTGATGCTTAGAGGCTTTTCCTGGAAGCAGGGCATTTGTTGCTTCAGCACCGTAGTGCCTCGTCGTCACGCCTCAG
+TTCCAGGAAAAGCCTCTAAGCATCAGGTAACATCAAATCGTACCCCAAACCGACACAGGTGGTCAGGTAGAGAATACCAAGGCGCTTGAGAGAACTCGGGTGAAGGAACTAGGCAAAATGGTGCCGTAACTTCGGGAGAAGGCACGCTGACACGTAGGTGAAGTGATTTACTCA
+NODE 440 4615 245716 241615 0 0
+ACTCATTAACTGGCTTTTATTTTCGACGAATTTGGGCGGGTCCATGATGATGACGTCGAATTTTTCGCCGTGTTCACGGTAAGCGCGCAGCAACTTAAACACGTCATCGCGCACGAATTCGGCTTTGCTCAAGTCCAGTTGGTTCAGTTCAACGTTTTGCCTGGCGATATCCAGCGCATCCTGTGAGGTATCCACGCTGACAACCTGGCGACAACCGCCCATTAATGCCGACACGGCAAAACCGCCGGTATAAGAGAAGCAGTTCAGTACCCGCTGATTTTCCACGTAGCGGCGCGTCGCCAGACGACTGTCGCGCTGATCAAGATAATAACCGGTTTTGTGGCCGCCCTGGATATCGACCAGCAATTTCATACCGTGTTCTTCAATTGGCAGAAGCGCAGGCGGCAGTTCGCTAGTGACCGGGCCTTGCGTCAGCGCCATCCCTTCTTTTTTCCGCACGGCGACGTCGCTGCGATCGTAAATAGCGCAATC [...]
+GTTTAGAGGTTCGGAGACTAAAAATAAGGATATGAATGGGAATGGATTGGGAGAGAATTTTCGCCGGAATATACCAACTGAGTATACCAAGTCTGTACCAACACCAAAAAAACAAAGGGGTTAGCATTAAGCTAACCCCTTGTTTAATCTGGCGGAAGCGCAGAGATTCGAACTCTGGAACCCTTTCGGGTCGCCGGTTTTCAAGACCGGTGCCTTCAACCGCTCGGCCACACTTCCGGAATGAGGCGCACTATAAACATCCCGGTGCGTCATGTAAAGACCGAATGTGTTCGTTTGCGTGAAAAACAGGCAAAATTTCGTTAATTGCCTGAAATAGCGGCACATTGACCATTTCTTCAACACAAAAACTGGCTGAATACGTGTTGATCGTCCCCACTGTTTTACCGCTGTGATTATCAATTTTTTATCGGTAACGCGTGGTTGGCGCTGCCGCCTGTTTTATGGCGTAGCGCCAGGCATGAGAAGACCGTT [...]
+NODE 441 47 2178 2178 0 0
+AGCACCAGGCGCGGGGAAACGGTTTTGGCTATGGCATGGTTTATCCT
+TCGCGTAGCGATATAAATATTTCCACAGCACCGGCGTCAGGATATAT
+NODE 442 10443 520181 516675 0 0
+GTAACAGTTCACGCGCTTCATCGCGTTCATGTGCCCGCTGGCGCAAGCGCCATAATCGCCGCCACTCCGTGACCACCGATCCCACGCCAGCGCCAACGATCAGCGCGCCTGCGGCACAGCCGCCTAAAGCGACCCAGTCCTGAGTTTGCCAGGCATTCATTGTCCACTGTACGCCTTGCCCGACCACGCTCGCGCCAAACAGCGCCAGCCCTCCCATCACCATTTTACGCCACAGGCTGCGTTTGGGACGCAGCGCGGCATCGACCGCCGCTTCTGCCACGCCTTCGTCTTCCGGGCGCTCATCGATAGCTGCAGGCGCAAATGTACGCGACTCCGCTTCGCTGAAAGTTTGCTGCGCTTTGAAGGCCGACGTAGGCTCCTCCTTTAGCGGTTCTGCAAAATCAATACGCGGTTTTAACGGTTCGCTCATCGCAGCTTATCTCCTATTAAAAACTCCAGCGCAGCGTCCAGACGAATATGCGGTAACGGTTT [...]
+TCATGTAGCGGAGAGGCGAGCACATCGGCGGTGCTGCCGCGTTCAACCACTTCCCCCTGATGCATCACTAATACCTGATCGCTAATATGCTTCATCATGCCGATATGCTGCGTGACATAGATATAGGAGATGCCTTGTTTTTCCTGCAATTCAAGCATCAGATTGATGAGCTGCGAGCGCATGGACATATCAAGCGAAGCCAGCGCTTCGTCCGCGATAATGACTTTAGGGCGTAAAATCAGCGCGCGGGCCAGGCCCAGACGCTGTTTCTGCCCCGGCGCCAGCATATGCGGGTAGTAGCTCACGTGATCGGGCAATAGACCCACCATACGCATCGTCTCGACAATCTGTTTGCGCCGCTGTTCCGGCTCCAGATCGGTATTAAGGCGCAGGGGGAAGTCAAGGATCTGCGAAATACGTTGACGTGGATTCAGTGACGTTGAGGGGTCCTGAAAAATCATTCGAATACGTTGGCTTCGAAACGAATAGTCG [...]
+NODE 443 104 5116 5116 0 0
+TGGCGGAAGATTACGCTAATCGCCTGCGTAAAAATCTTAAAAAGCTGGAGAAATGGGCGCGCCAGGAAGGGATTGAATGCTATCGCTTGTATGATGCCGACCTG
+ATTTCTCCAGCTTTTTAAGATTTTTACGCAGGCGATTAGCGTAATCTTCCGCCACCGTCGCCGGCTTACTGTCCGCCGTGGTTTCCGCAATATGATAGTTTTTC
+NODE 444 14766 859277 851284 0 0
+AAAACCCCCACCAGATAATACAAAACACGCCTCCCGTGGCTGGCCGTCAGGCCCCGAAGCATTTATTCACCCAGAATGGTGTGAACATTGGCCAGCAGGTGAGATGAAGCCACCGGGGTGGTGTCAGGTTTGTGGTTGTTAGTTTTTTACAGAAAACTATATCAACCATATCAGGACTGAGGGTATATCAGGCTATTATGTTTCATCAGCTCATCCTGAACTGAATATTATCTCAGGCCGGTGTGTTTTATTAACGCCAGCCTGATTTTTCACAACGTTATATTGCTGGCTTACAGGCCTATCAGGCCAGTCAGGTTTTGATGTGTCCACACGGTTTACCAACACCCTGTATTTTTCCATTCATCGCTCATCATCTCTTGCCATCAATGACAGTATTGCGTTCTTTCCCGTACGTTCCTCTCCCGACCTGTCGCATGGTCCAGTACATGGCAGTCCTCTTCCACCTCGCTACATCTAATTTTTTGTTTTTAA [...]
+TCTGGCGGCTGGCTCAACGTGGCATAACCGTATCCGGCAATAAACAGCAGACAGGTAACGGAGAGGATCAGACGAAACAACGTCGGGGCAGGATTATAGAGCATCGGGACGCTCCAGCGATCGATTAAGCACCACCACAAGCCAGGCTGAAATCGTATTTCCGGCAAACACTAATAGCGTACAGAATAAAACGATCCCCATAAGTAGCGGGACATCGCCACGCAGGCCGGCATCGATAGTGGCCTGTCCCAGCCCCGGATACGCAAAGACTTTTTCTGCCAGTAACGCTCCCCCCATCAGTTCGCCCAGAGAAGCAAACTGTAAGCAGAGCGCTGGGGTAATCGCATGACGTAACACCTGGTGACGTAACAGCGACCATCCTTTATCCCCCTGAGCGCGCGCAAAACGAATAAATTCGCTCTTCATTACGCTGGCTATTTTTTCTCGCGTATGCAGCGCAATTTGCCCCATGCCCAACAGACTTAACGCACA [...]
+NODE 445 1490 76947 76344 0 0
+GAAGGTTTTGCGCGTCTGTCCCTCGGCGGCGGTAAGATCTTTTCTCAGATGGCTGAACAGCAATTCCAGCGCTTCTTCATTACGTCCGACCTGGTGCAACTGCAACGCCAGTTGCGTTGCCAAAGCCGCATCCTGCGGATTCTCCGCGACTTGCTGCTGAAGTTGCTGAATTTCCGGCGTATCCGCCGCCTGTTTAAGCAGTTCGATCTGCGCGACCAGCCCCTGATAACGGGTATCCTGATCCTGTAGCGGGATAGTTTTTAACACCGCTTCGGCCTCTTCAGAGCGGTTCAGCGCAATTTGCGCTTCCGCCAGTAACAGGCCAATCTCACCGTTCTGCGAAGAGAGCTGCCAGGCGTCTTTGAGCAACGGCAGCGCGTCAATGTAGTTGCCCTCCTGCATTAACTGCATCGCTTGTTGCGCTTTTAGCTCTTCTTCACGCGGCAGTACTTTATCCAGCAGAGCGCGGATCGCCTCTTCCGGCTGCGGCCC [...]
+CTCCCCTGAAAGCGTGGATCGTGCCGCCGATGAAGTGATCGCCCTGACCGATAATCGTCTGTATGGGATCTTTAACAATGCCGGCTACGGCGTGTATGGCCCCCTTTCTACCATCAGCCGTGAGCAGATGGAGCAACAGTTTTCCAGTAATTTTTTCGGCGCGCATCAGCTTACCATGCGCTTACTTCCCGCCATGTTGCCGCATGGCGAAGGACGCATTGTGATGACCTCATCGGTGATGGGGCTGATTTCCACCCCAGGGCGCGGCGCTTACGCCGCCAGCAAATATGCGCTCGAAGCCTGGTCTGACGCGCTACGTATGGAGCTACGGCACACAGGCATTAAAGTGAGCCTGATAGAACCGGGGCCGATTCGTACCCGTTTTACGGATAACGTTAACCAGACGCAGCGTGATAAACCGGTAGAAAATCCCGGCATCGCCGCACGTTTCACCCGCGATCCTGACGCGGTAGTAGCGAAAGTGCGTCATGC [...]
+NODE 446 905 47845 47736 0 0
+ATCATCAGGTTTGCGGCAGCCCGCCAGGATTTGAAAGCCCTGGCGTTTAAGCTCAAGCGCGCTGTCCAGACCGATTCCGCTGGAACATCCTGTTATTAAGACCGATTTTTGCATAACTTTACCTGTCAGGATCTCCGTTGATTTAAGAGTCGTGGTTAACTATATCCGTCATACTTCAAGTTGCCTGTGCGTTCGTTTACTCCAGTCACATAGGTATCTATGCTCCTGGAAATTCTCTTACGTGCCGCCTTCATGCAACTCGAATTATTCAGGAGAGAAAAGGGGTCAACTGCTTCGCCATCCAGTCGGCAATAAACGGCTGGGCGTCGCGGTTGGGATGAATGCCGTCATCCTGCATCCACTGCGGTTTCAGATATACCTCTTCCATAAAAAACGGTAACAGAGGAATATCGAACTCTTTGGCGAGCTTAGGATAAATGGCGCTAAAGGATTCATTATAACGGCGACCGTAGTTAGCGGGCAGATGAATTT [...]
+ATTTGCCCTTCCTGTTTTTGATCCTGTTAACTTTCCGTGCCGCCGCCGCAGACACCTTATTAATTCTGGGCGATAGCCTCAGCGCCGGTTACCGTATGGCCGCCAGCGCGGCATGGCCGTCGCTCCTTAATGATAAATGGCAAAACAAAACGTCGGTCGTTAATGCCAGTATAAGCGGAGATACCTCGCAGCAGGGACTGGCGCGTTTGCCGGCGCTGTTGCAACAGCATCACCCGCGCTGGGTAGTGGTGGAACTTGGCGGCAACGATGGCCTACGCGGTTTTGCGCCTGCGCAAACCGAACAGACGCTACGTAAAATCATTCAGACGGTGAAAGCCGCCGATGCCCGACCGTTACTGATGCAAATTCATCTGCCCGCTAACTACGGTCGCCGTTATAATGAATCCTTTAGCGCCATTTATCCTAAGCTCGCCAAAGAGTTCGATATTCCTCTGTTACCGTTTTTTATGGAAGAGGTATATCTGAAACCGC [...]
+NODE 447 427 27187 27164 0 0
+ATACCACATATCTGCGAAGGCAGCTTTCGGCATATCCGGATGACGCACCAGATTATGTGGCTGCGCCAGTAACTCGTTTAACTGATAGCCGCTCACCTGGACAAAAGTGTCATTGGCGTGAGTGATATAGCTTTCCAGGTCGGTCGTAGACATCAGAGTGGTATCATCATCCAGCGGGGTATTTAGCTGGCTGACGTAGGGATGAGAAGACATGATAGCGTCCTGTGCAGGTTATCTGGATGTTAATTTTTCGCTCAGATGTTATTTCGGCGCTAATCTATTTATCTTTAGTTGTTAAAATTGCTCTGGATCGCAATTTGCGATTAATCCTTAATATTTGTACGATTTTTACCTCATCCCGCGCCTTATTTTCATTATGAAATTGTTTAGCGTGGACAACCTTTTTCTTTAAAATCTACCCTGGCTC
+TAATGAAAATAAGGCGCGGGATGAGGTAAAAATCGTACAAATATTAAGGATTAATCGCAAATTGCGATCCAGAGCAATTTTAACAACTAAAGATAAATAGATTAGCGCCGAAATAACATCTGAGCGAAAAATTAACATCCAGATAACCTGCACAGGACGCTATCATGTCTTCTCATCCCTACGTCAGCCAGCTAAATACCCCGCTGGATGATGATACCACTCTGATGTCTACGACCGACCTGGAAAGCTATATCACTCACGCCAATGACACTTTTGTCCAGGTGAGCGGCTATCAGTTAAACGAGTTACTGGCGCAGCCACATAATCTGGTGCGTCATCCGGATATGCCGAAAGCTGCCTTCGCAGATATGTGGTATACCCTAAAACAGGGCGAACCGTGGAGCGGCATTGTGAAAAACCGGCGTAA
+NODE 448 41 2187 2027 0 0
+ACCTTTTTCTCACGCCGCCGCTAACGCAACACACCGTAAAC
+TAGATTTTAAAGAAAAAGGTTGTCCACGCTAAACAATTTCA
+NODE 449 354 21578 21430 0 0
+GACGCGATGTACAAAGTTGGCGTTATCATGCAGGACAAAGGTGATACGGCAAAAGCGAAAGCGGTTTATCAGCAGGTGATTAACAAATATCCTGGCACTGATGGCGCGAAACAGGCGCAGAAGCGTCTTAACGCGATGTAATGCGTACCATGCGACCAGAAAACGCCTTTTTTCTGGTCGCGTCGTGCGATTCCTAAGCAGTTGAGCCCCCTGCGTCGAAATTTTTGTTGCGCTCAAATCTGAAATCAGTAATATATGCCGCCGTTGCCACGGGATATTAAACAACTCGAAAGCAACGCAAAAGTGGGTCGTTAGCTCAGTTGGTAGAGCAGTTGACTTTTAATCAATTGGTCG
+CTTTTGCGTTGCTTTCGAGTTGTTTAATATCCCGTGGCAACGGCGGCATATATTACTGATTTCAGATTTGAGCGCAACAAAAATTTCGACGCAGGGGGCTCAACTGCTTAGGAATCGCACGACGCGACCAGAAAAAAGGCGTTTTCTGGTCGCATGGTACGCATTACATCGCGTTAAGACGCTTCTGCGCCTGTTTCGCGCCATCAGTGCCAGGATATTTGTTAATCACCTGCTGATAAACCGCTTTCGCTTTTGCCGTATCACCTTTGTCCTGCATGATAACGCCAACTTTGTACATCGCGTCCGCAGCCTTCGGCGACTTAGGATAGTTTTTTACTACCGAGGCGAAATAAT
+NODE 450 17 5671 5165 0 0
+ATCTGGAGGAATACCGG
+ACCCCCCTCTACAAGAC
+NODE 451 34 13358 13078 0 0
+TGGCGAAGGCGGCCCCCTGGACAAAGACTGACGC
+TCTCTACGCATTTCACCGCTACACCTGGAATTCT
+NODE 452 1395 60684 60445 0 0
+TTAACGTCGCCAGCGCGTTGATTTCCGGGTTCACGCCCATGCGCACGCTGGAGAAAACCAGCATCGGTAGCGTGGTGGCGCCGGGACCGGAAACGAAGCTGGCAATCACCAGATCGTCAAGGGAAAGCGTAAAGGCCAACAGCCAGCCCGAGATCACCGCGGGCATGATCATCGGTAACGTAATGACAAAAAAGACCTTCAACGGCGCCGCGCCAAGATCCATCGCCGCCTCTTCAATCGAACGATCCAGTTCGCGTAATCGCGAAGCGATCACCACTGCCACGTAGGCGGTACAGAACGTGACGTGCGCCAACCAGATGGTCAGCATCCCGCGATCGGAGGGCCAGCCGATAGCATGACCGAGCGCGACAAACAGCAACAGCAGCGACAGCCCGGTAATCACATCCGGCATCACCAGCGGCGCGGTGATCATAAACGCAAAGCCGTTTGCGCCGCGAAATCGTCCAAATCGCACCATCACCACCGCGGCGA [...]
+CTACCCGCTGGCGTGGGCGGTGGCGCATAGCAAGCCCTCCACGCGCAATATCCTGCTGCTGTTGGTGATCCTGCCCTCGTGGACGTCTTTTTTAATACGCGTCTATGCCTGGATGGGCATTTTGAAAAACAACGGCGTGCTGAACAATGTGTTGTTGTGGCTCGGGGTTATCGATCAGCCGCTGACGATCCTGCACACTAACCTGGCCGTCTATATCGGCATTGTTTATGCTTATCTGCCGTTTATGGTACTGCCCATTTATACCGCATTGACGCGCATTGATTATTCGCTGGTGGAAGCGTCGCTGGATCTCGGCGCCCGACCGCTGAAAACATTTTTTAGCATCATTGTCCCGCTCACCAAAGGCGGAATCATCGCCGGCTCGATGCTGGTTTTTATCCCGGCGGTGGGCGAGTTCGTGATCCCGGAACTGCTTGGCGGGCCGGACAGTATCATGATTGGTCGCGTCCTGTGGCAGGAGTTTTTCAATAA [...]
+NODE 453 5408 314756 308528 0 0
+GAAAAACGCTTGCCGACTTTTTACTGTCAGCACGGGCGAGGTTGATTCTCATGCAACATGGGTTTAGTGAAGCGCCGAATATGACACACTCGCAGAACTGATAAGCGAATCGTCAGCAGGGAATACCATGCCGGATGACGACATTACTACCTCATCCGGCATTATGGTTTAACTTTGACGTTTATCTTCGGTATGGTTTTCGAAGTCGCTGGCGTCATGGCGTTCGTGAAGCTGTTCGTTCAATGGGCCGTTGGTCCGGTTGACAATGCGCCCCCGCTTTACCGCCGGACGTTCGGCTACCTGTTTCGCCCAGCGTTGTACGTTTTGATAACTTCCGGCATCCAGAAACTCCGCTGCATCATAGACATTCCCCAGCACCACGTTGCCGAACCACGGCCAGATGGCCATATCGGCAATAGTGTACTCTTCTCCCGCGACATACGGGTGGTGAGCTAACTGCTTATCCAGCACGTCCAGCAGACGCTTGGCTTC [...]
+CAAATGGGACTGTTAAGTCAGTTTGTCGGGATGCTGACCGACTCCCGCAGTTTCCTTTCTTATACGCGACATGAATATTTCCGTCGTATTCTCTGTAACCTGCTGGGACAGTGGGCGCAGGACGGAGAGATTCCTGATGATGAAGCGATGCTAAGCCGTATGGTTCAGGATATCTGCTTCAATAATGCCCAGCGTTATTTCACGATTAAATAATCGCTATTAATCTGTGAGCACAGGTCTCAGGTATTTCGAGGGGCAGGAAGGCGGTAAGAGAGTGAGAAATTTAGCAGTAACGCACTTTTCCAGCCAAAGTCTGGCCGCCGATCAAAAGCAAAGAGGTTGCTGATTAATCCCGAATCACTTACTAAGGTAAGTGATTCGGGTAAACAAACACAGCCATCTTCTGCGTCATGCTTCTTTTCTCTGTCCGGAATAACTCCAGTGCAGAAAGTGTGATACATCAGTCCTGTTGATGATGGCTCCTGTTGGTTA [...]
+NODE 454 1582 85679 84765 0 0
+GTAAGCGCGCCTTGCGCACCAAGAAGTTCAGCGCGCGCTGGGTATCCATCAGACACAGGCGTACCTTCCAGCCGATATCTTCCAGTTCCGCCAGCGTGGAGAGCGCTTCGTCGTATTCATCGCCCTGATGCCCTTCCATAATGACGCGGCTCAGTTTTTCCAGATCGCTGTAGATGTTTTCGATTTCATCCGCTAACTGTTCAATTTTGGTTTCGAACAGATCGAGCAGTAATTCGTATGCATTACCGTCGACCATCGCCTGGCTGCGGGCGCGCATACGATACAGACGGAAGGCGGGCAGTTCGCGTTCACGCAGCGTAAACAGACGGCCATCGCGAATAGTGAATGCCACCGTAGAGTTACCGGCATGATCTTCCGCATCTTCGAAGAAGAAGAAGGAGTGGATATGCAATCCGTCTTCGTCTTCAAAGAAGCGCGCGGATGCTTCGATATCTTCCAGTTCAGGACGCGTCGCCAGACTCTGGCCCAGCT [...]
+AGAGGGCATGTTCCCCAGCCAGATGTCGCTGGATGAGGGCGGGCGTTTGGAAGAGGAGCGTCGTCTGGCCTACGTCGGCGTTACCCGTGCCATGCAGAAACTGACGCTAACCTATGCCGAAACTCGCCGTCTGTATGGTAAAGAGGTCTACCATCGCCCGTCGCGTTTCATCGGCGAGTTGCCGGAGGAGTGCGTGGAAGAGGTCCGTCTGCGCGCCACCGTCAGTCGTCCGGTGAGCCATCAACGAATGGGAACGCCGCTGGCGGAAAACGATACAGGCTACAAACTCGGCCAACGTGTGCGCCATGCGAAGTTCGGCGAGGGAACTATTGTCAACCTGGAGGGCAGCGGCGAGCATAGCCGGTTGCAGGTGGCTTTTCAGGGGCAAGGGATCAAATGGCTGGTTGCCGCGTATGCGAAGCTGGAAACGGTTTGACCGGCTCTCATAGTGCCGGATGGCACCTCTTATCCGGCCTACGCGCTGGCTAACAT [...]
+NODE 455 2342 113655 111833 0 0
+CGGATGAACGCCTTTCGCGCCTCGAATGGACCTCGGCTCAGCGCGCATCTCTGGTGAGCGCGATGCTGGAAAGCGGCGTCGCCATCCCGTCGATGTGCCTCTCCGCCCATCGTCGATTCCCTTTTGGCAGCCGCGACGAAGCGGTACGCGAGCGGGCGCGTGAAATCATGACCAAAGCCATTCGCCTGGCGCGCGACCTGGGGATCCGCACCATCCAGTTGGCAGGTTACGACGTCTATTACGAAGAGCACGACGAAGGCACCCAGCAACGTTTCGCCGAAGGGCTGGCGTGGGCGGTGGAACAGGCCGCAGCGGCGCAGGTGATGCTGGCGGTGGAGATCATGGATACCGCGTTTATGAACTCCATCAGCAAGTGGAAAAAGTGGGACGAGATGCTTTCGTCACCGTGGTTCACCGTTTATCCAGACGTCGGCAACCTCAGCGCCTGGGGGAACGACGTGACCGCCGAGCTGAAGCTGGGTATCGACCGTA [...]
+TGTGGAAAAAGGCTGCCTGAAAATTCAGGAAGAAGAATGTGTTTTCTGTGTCGAAGCCGGGGAAAGCCTGTTGCTTTGGCCGCATCGCCGCCATATTGGCGTTGAGGAGTTTCCCGCCGATCTTAAATTTTACTGGCTCCATTTTGAGGTCAAAGCGCCGGACAGCGACCCGCGCTGGCTGACGCATCTTTCCGTGCCGCAGCATACCCAGGTTGCCGATCCGCAGGCGCTGATTGCGCTTTTTCGCCAGTTTATGAACGAGCAGGAAAAGCACCAGCGCAGCCCGGCGCTGGAGTTCATCGTGCTGCTGATTTTGCAGCAGCTCACCGTTGACGCCCGGCAGAATGAAAACGCCGAGGCCGCTGGCGTGTCGCTGGCCTGGAAAGTGCAGCAGCTGATTCGAACGCACTATCACCTGCCGCTTTCCAGCTCGGTTCTGGCGAAAGAACTGCATTGCAATGTGGATTATCTGGGACGCGTTTATCGGCGGGT [...]
+NODE 456 2276 126124 125472 0 0
+ACCACGGAATGAAGGTTAGCGTCTGCGGCTGGCGCGATGACGGCGCGTTATCGTAGTGCCACAACGCCTGATGCTGCGCATCTGGGGCGCTTTGCTTCTCGCCTTCAGCCTGAATCAGCATCTTATGCGCAAAAAGCCCTTTGCCCTCAAAGACCCGGAACTCATTCTCTTTCGGTAGCCACAGATTATGCAGTTCTTCGCCGTTATCGGCCTGCTCAAGGCAATAGACCAGCGGCCCGCGCTGAATGGCGACCTTACCGGCGACGTGACGCGCCAGCGGATTGCCATACACGCGGCGAACCGGCATCGGCAGCGTCAGGGTTATCGTATCGCCCTCCTGCCAGGTCCGACGGATATGCAGATAACCTTTGCGAATATCCTGTTCCACTTCCAGCCCGTTGAGCGTCACTTTTGCCTCAGGGCACCAGTCCGGCAGGCGTAGCGCCAGCGTGTGACGTACCGGCTGCACAGAGTCGATGGCAATCTTCACCT [...]
+GCGAGAAATAAATAATCCGCCGTTTTGGACTTTAATCGGTAATGTTATGGATAATTCGAGCATTAATATGTCATTTCCCGCTCATTCAGCACCGTATTTCATATTACCTTTTGATTATTAACTAAAAATAGTCATTTCACTCGATCCATCTCACATTTTTAAATACGGGTCGGAATCGTCATCTTTTTTTACTCTTTTATCGCCTTGTCGCTCACCGCTATCCGGGCAAAATGAATCAGGTCATAACGCGAAAATAAAAATTACTGCCATAAAATACCCCGTCAGCGAGGAATATCTATGACCTCTACAACCTTAAGGAGCACGAAATGAACGTACTGGAAGTCGATCTGCATAAACTGACGGTCAGCGATCCGTTCCTCGGACAGTATCAACAACTGGTTCGCGATGTGGTTATTCCTTACCAGTGGGATGCGTTAAACGATCGTATTCCAGAGGCTGAACCCAGCCATGCCATTGAAAATTTCCGCATTG [...]
+NODE 457 6958 371408 366974 0 0
+CTACGCGCCGCCGGACGCGACCCCGACGAACTGCTGGCTATCCTGGCCAGTAAATCCCGCGACAACAGCCGCACGCCAATGCAGTGGGACAACGGTAAAAACGCCGGGTTCACCCAGGGCGAGCCGTGGATAAGCCTGTGCGATAACTATACGGAGGTTAACGTCGCGGCAGCATTACGCGATGAAAACTCGGTGTTTTACACCTATCAAAAGCTGATTGCGCTACGTAAAACTCAGCCTGTACTGATCTGGGGCGATTATCAGGATCTCCTCCCGGATAGCCCATCAGTATGGTGTTATCGCCGCCAGTGGCAGGGGCAAACCCTGCTGGTTGTCGCCAATCTGAGTGACCAGTGCCAGGAGTGGCATCCGCCGCATATCAAAGGACAGTGGCAGGCGCTACTGCATAATTATGGCGAGGTCGCCAGCCAGCCAGCCGCGATGACGCTCCGCCCATTTGAAGCCATCTGGTGGTTACAACGCTAACGCGAC [...]
+GTCTCGCCGACCGGCACGCCGGGGCTGGTGAAAATTTCCACCGGCCCGCTAAGCAGCCGCGCGCCGGACGGCATCGTATCCATAGAAACGGCGATTGCGCTACTCAAAGACATGGGCGGCAGCTCCGTTAAATACTTTCCGATGGGAGGGCTCACCTGTCGCGACGAGTATAAAGCGGTAGCTGAGGCCTGCGCCCGCCATGATTTCTGGCTGGAACCGACGGGCGGTATCGATCTGGAAAACTTCGCCGAGATTCTGCACATCGCCCTTGATGCAGGTGTAAGCAAAATCATTCCTCACATTTATAGTTCGATTATTGATAAGGTGAGCGGCAACACCCGTGCGGACGATGTGCGTCAGTTACTCGCTATCGTCCGGTCGCGTGTCGGCTAATCATGAGGAGAGAGACGTGCGATTCCCCAACCAACGTTTAGCGCAGCTATTTGCGATGCTGCAAAACGAGACGCTGCCGCAGGACGAACTGGCGCAGCG [...]
+NODE 458 1058 53214 52492 0 0
+CTGCCTGCCAAAATTGAACGCCCGGGCGCTGATGCCGGATGATCTGGTCATCGTAGAAAGCGCCCCTGAAAAAATCGACACCTTTAGCTGCAAAATGACAGTCCCGCCATCCGGCCATCATAACGGATTTTTCTTCTGCACCTACTGAAGCCCGCCATGGCAGGACGACCATGAATCCGTCGATAACCTTATTGTGAAATTAAGACCAGGGAAAGAGGATGTCCGCCAGACAGACATTATGTGTAAATTTATAAAGGTTTTTTTATTATGCCCTTGCATGTTGGACGCGGATGTCTTCCCGCCACAATTACTAATCTTCGTATTAACTGTATAGCCCAATCTGCAACCCCGCCTGAAATGAGCTTATGGGAAAAAATTAAGGAGTTTTTCTGCTCAACGCACCAGACTGAAGCGCAGGAATGTATCTGGACGATTTGCCACCCTTCGGTCGGAACGACGCGGGAGGATGTAGTCAGCAGATTTGAACAGCTC [...]
+CACCTCCAGTCCTGACGGCAGCGTCGGCAGGCTGGTCAGATAATTATTATGAGGAATAACCAATGTTGTTATATGCGCTGGTAAACGGTCTGGTAAGGCGGTAAGGCCTGACTCTCCCACATTAAGCTCTCGACTGCCGTTATTCAGGCAGGTACATATTCTCTGTACCGTCGCAGCACGACCGCGTAACTCTTCTGCTGGCGCAGCCCCCTTCCATTCTGACCAGACAGCATCATACTCTGCTGGTGTCTGTGGAGCCGCCGGAGCCGGAAGGGGGGATACCTGGAGTGTCCCGGATGCCCCTTCCGCATGTTCTGTACATTCCTCTCCCTGTTCTATGTCCATGGTGAAGCGATATGTTTCATTGTGCCCCTGGCAATTCACGGTATGGTTCCCGGCGTCATCAAGGGTGACCGACAATATCTCCTGGTTGTCTGCATCCAGGATACAGAAGTGGCTTTCCCCGTGGCGGCCGGAGTGAATGCTTTCCTC [...]
+NODE 459 14384 776288 767074 0 0
+ATGGTGGCAGAAAAAGGCGCAAGCCCCTGTAATAATACGCTGGCAGCCATTGGCAGCGGCGGGGTCTATTCTACGCCAGGAGATATGATGCGCTGGATGCAACAGTATCTGTCGTCAGATTTCTATCACCGTAGCCAACAGGCCGATCGTATGCAAACGTTGATTTATCAGCGCACACAGTTAAAGAAAATCATCGGGATGGACGTACCGGGTAAAGCCGACGCGCTCGGTCTGGGCTGGGTCTATATGGCGCCAAAAGACGGACGTCCTGGCATTATCCAGAAAACAGGAGGCGGCGGCGGTTTTATTACCTATATGGCGATGATCCCGCAATATAATATTGGCGCTTTTGTGGTCGTAACCCGTTCCCCCCTCACGCGTTTTACCAATATGAGCGACGGGATTAACGATTTGGTTACTGAGCTAAGCGGCAATAAACCGATTGCTATTCCTGCATCCTGAGTCGTCGCGCCTCGCGCTATATCAGACGAG [...]
+CCGATAACACGGCTGGCAATGCGCTGTATTCGCCCATAAGCGCGGCGGACTGCGGGGAGCGAAAAGGCCTGGCTGAGAAAAATACGCCAGATAACGGATGACAGCACAATTCCGGCCCAGGCCATTAACCTTGCCCATGTGGGCGTTTCTGCGCTAAGCGTTACGGAAAAAATACTGATAAAAAACAGTACGGTTTGCGGATTGGATAAATCGGTCATTAATCCCCGGCGAAAGAAAATTGTCCACGGGGCGGCAATCGGCGTCTGGAGCGTGCTCATTTGCGGCGTCGCCTGGTGGCGAATACTGTTCCAGGCGAACCATAATAAATAGGCGCCGCCGACAATTTTGATAAGAGAAAATACCGCTTCGCATTGCGTAATGAGCGTCGCCAGACCGAAAAGCCCCAGCCCGGAATAAAAGGCGTCTCCCGTGGCGACGCCCAGGCCGGTGATGACTCCCGCCCGGCGTCCTGATGCGAGGCTGGTTTGCACC [...]
+NODE 460 3356 203563 202880 0 0
+TGGCCGACCCGCTCAATGATACCTTCAATGCGGCTATTAAAAATAAAAACACGCGATGGGAACAAGCGCTGTCTTTGCTGCAGATAAATAGCATCTTTGGAACGCTGGCCGGCGACAACGCAGACTTTTTAAACGACATTCAGCAGGCCTTTAACCATATTGAGTTACATGGCGTCACGGCCACCATTCACCGTTTATCTTCAAAGGGTTAAGTATGAAAACGCTTATCTGTAATAATCCGGGAAATATCGAATACATTGAAAGAGATATTCCTCATTTAAAAGACGATGAAGTACTGTTAAAAATTAAAGCGGTTGGTATTTGTGGCACCGATATCCATGCGTTTGCCGGCCGCCAGCCCTTTTTTGCCTATCCGCGCGTGCTGGGTCATGAAATTTGCGGCGTGGCAGAAATGTTGGGTAAATCGTGCAGCACGGCGAAGGTCGGCCAACGCTATAGCGTTATTCCCTGTATTCCTTGCGGCGCTTGCGC [...]
+TTGGTTAATCCATGTCCACGACTGTCCGGCATGATGACGCGAAAATATCGAGATGCCTCTTTCGCTAATCCCTGCCAACTTTTCGCCGTCAGACCACCACCGTGAATCAACAGCAGCGGAGGCCCCTCGCCCTCTTCAACGTAATGAATTTTGATACCATTCGCTTCCACAAATTTATCTTTGTCCATCGTTGTTGCTGAAGCATTTATTAAAAATATAATATTGATAATAAAAATAAATGCTAATTTAAAAATATGATTCATAACACCTCGCCAATCACTTTCCGTGTAAAAGACCATATTATTCAGATTGAACAAAAATAACATCAAAATCGATTTGTATCATTTTCACTTATTTACCGGGGAGACCCCGCATCCTCTTTTTACAGAACGTAAAAAGCCTTTCCGCGATTAGCCTCAACGCGAAAAGGCTCTGAAGTCAGAAAAGTGCCACCTTATTCATTCTGGCTGTAATTCAGGATGACTTGAAGGT [...]
+NODE 461 7453 423287 418211 0 0
+ACGAGCACTGCCCAGGACCAAAATAGCAAGTAAAATAGCCCTAATGGGATGGGCTCTAAATTAGCTCCCGCGATAGGTTGAATAACCATACTGACTTAATAACAGCGGCACATGATAGTGCTCATTCGTTTTGCTGATATGAAACTCGACGGGAATCTCCGGGAAAAACGTGTCCAGTTTTTTACTTTCAAAATACTGGCCGGTTTTAAAAATAACGCGATAATCCCCCGGCGCGGCAGCTTTTTCGGGCCACAGTGCTTTAATACGTCCGTCCTGGTCGGTATGCCCGGTGTTTAATTGCGTCCATCCGTTATCCTTTTTCTGCTCCAGTACCACCTCCACGCCGGGTGCCGGTTTGCCTGTTTGCTGATCGAGAATATGTACGCTGAGAATATTGTTGCCAGCGGCCAGCGCCATTGCCGGGGCTGCAACAAGAGATGCTATCGCGGTAGCCAGTATATATCGTTTCATGCTTCACTCCTTTACGGTATT [...]
+GAATAATCAGATTATCCTTGCTATTGGCTTCCTTCATTTCCAGCATAACTCACGCTTCATCATCATTGAATAAACAATTAAGTTTGTTGAGCGAAAATTTACTTAAAGAAAAAATAATAAGCACTAATATTTTTTGCAGTATTTCAACTTATAGCAGAATAAATGCGCGTAGATGGCGTAAAACCTGATGATCAGGAATACTTACACACTAAAAATGCTCCCGCAAACAGAGCGAAATGAGAGAGAGGAACGTTTGCCCCTTACATTTCCACCAAAGATTCTGGTCTTGTCTCTTGTAAAGGGCATACGTATCGCGCTTTATCTCATTAAGAAAGCATGTTGATGTATTAAATTATGCATAACGCTCTTTTAATTGCTTCACGTTAGAAATGAATAATTCAAAACCAGTGAGCGCCTCTTCTTCGGTACTGGTTTGCGGCAAGCGATAAAGCGCCACTAAAGCAGTATTGTCTGCGTCAGCGCCGATAGTGA [...]
+NODE 462 2145 97970 94822 0 0
+CAAACGGAAAAATTCCTGCACGGAACGAAAGTGGCTTATGGCATTCTGGTGCAAAGCGCGCTACTGGGACAAGATGACGTGCTGGCGCAATTGATTGCAGCGTACCGGCGATTTCATCTGCCGGCCCGGCTTAGCGAACTGGACGTGGATATTAATAACACCGCCGAGATCGATAGGGTAATCGCGCATACCCTGCGCCCGGTCGAATCCATCCACTATTTACCGGTGACGTTAACGCCAGACACCCTGCGTGCGGCGTTTGAAAAAGTTGAATTTTTCAGAATATAGCCTGGTGACGTTGCGTTTATCAGGCCTGGCAACCATCAGCAGCAACGCGCGCCGCCTTTTCCACCATAGCGCGCATCCTGCCGCTCGCGGAAAAATTCTTCATAGGTCATCGGCGTCTGATCCGGATGCGTTATGCGCATATGTTCCACATAGTTGTCGTAGTCTGGCACGCCAATCATCATTTTTGCGGCCTGTCCCAGATAT [...]
+CTATTCCACTGGCGATTTTTATGGGCATCTACCTGCGTTATCTGCGTCCGGGGCGCATCGGCGAGGTGTCGGTCATTGGGCTGGTATTTCTTATTTTCGCTATTATTTCCGGCGGATGGGTGGCGGCAAGCCCAACCTGGGCGCCGTACTTTGATTTTACTGGCGTGCAGCTTACCTGGATGCTGGTGGGGTATGGTTTTGTCGCGGCGGTACTGCCAGTCTGGCTGCTGCTCGCGCCGCGTGATTACCTATCTACCTTCCTGAAAATTGGTACGATTGTCGGTCTGGCGGTCGGGATTCTGATTATGCGTCCGACGCTGACTATGCCGGCGCTGACCAAATTTGTTGATGGTACCGGACCGGTCTGGACGGGCGACCTGTTCCCGTTCCTGTTTATTACCATCGCCTGCGGCGCGGTCTCCGGTTTCCATGCGCTCATCTCCTCCGGCACGACGCCGAAGATGTTGGCCAACGAAGGCCAGGCCTGCTTTA [...]
+NODE 463 51 2084 2067 0 0
+TGGTGAAAGCGCTGACCCATAGCCCGTGGGGAACGTACACTGTCGCGTTCA
+ACGATCATCGCCAGGACGGCCAGAATGATCACCATGATCATAAAGCAGGCT
+NODE 464 4463 850490 843235 0 0
+TTTCGGCATATTCTTCGTTTGTAAGCCCATAGCCATTAAGCAACAAATTACGCTCATAGGCATTATCCCACGGCGCATTACCCGTATTTTTAACCATACGCCCCCCACCATAAACGGGATCGAACTGGTTAGAGATAAGGGCTATTTCATCCATAAAATTCTTATAGTCAATCGATGAAAGTTTATCTTTCAGCCCTTCGGCCTCACGTAAAATTTGCTTATAATCCTCAAGCATCTGGTTGTATTGCTTATATGCTTCCAGCAATTCTTTATTATTGAGAATTGTCTGTTCCATATATTCTTTATAGTTTTTGATATCCTGCATCATAGCCCTGGCCTGACCAAGAATCTGAGCAGCATCAGCAACAGGAATGCCAGAAGAAATAGCAGGTGTTGTAATCAATCCTGTCATTACAGAAAACAAGACTACTGCAAGTTGTTTTCTCATAAGAAAAACCCCTCCGTTTTATCCTTTTCAGTCTCTGTAGGCGT [...]
+AAAGCGGCATATTCCAAACTTTGGAGCAGTTCTGCAATGTTGTTTGAATTGTTTCGTAGTCGTATCATTATTTTTTATGTGATGATTGTTTTTTTATGTGTCTGACATTTTTCCAATCATGATTTCTGTGAGATTTGTATCAGCAAAATCTCCTTTCCCCGATTCAGTGTCAAAGTCGCCTGGCGTGAACTTATGTACGTCTTGCCAGACTGCGAAGCAGGTAGGGCATGTTACAGGTAGTTCGCCCTCAGCTATCTTTTCACAACTTTCTACCAGTTCTTGTTTCTCGTTGTCCCTGATGTTATAGCCGCTTGTGCAAAGCGTTTCATACCCGTGAGCGCCCGTCACTATATGTGTGGCGGTTCTTTCTGTGATTTTTCCATCAACGAATAACTGTTCATGCGTTGTGATCGTTTGCATGTCTGTCTCTCATAATTGTTGGTTTATGTGATTGTTGGGGCGACCGTAAAAATATACGCCAGATGACGGGAG [...]
+NODE 465 3447 167307 164754 0 0
+GAAAAAATCCTGGCTCTTGAAATGGGCGGAAACAACCCGCTCATTATTGAGGATGTGGCAAATATAGATGCGGCGGTACATCTGACGCTGCAATCGGCGTTTATTACCGCCGGACAGCGCTGTACCTGCGCGCGACGCCTTCTGGTAAAACAGGGTGCGCAGGGAGATGCATTTCTGGCGCGGCTGGTTGACGTTGCCGGACGTCTGCAGCCCGGCAGATGGGACGACGATCCGCAGCCGTTTATCGGCGGACTGATTTCAGCGCAGGCGGCACAGCATGTGATGGAGGCCTGGCGTCAACGAGAGGCATTAGGCGGGCGCACGTTACTGGCGCCGCGGAAGGTCAAAGAGGGAACCTCTCTGCTGACGCCTGGCATCATTGAGCTGACGGGCGTCGCGGATGTGCCGGATGAAGAGGTGTTTGGTCCGCTGCTGAACGTCTGGCGTTATGCGCATTTCGATGAGGCGATTCGTCTGGCGAATAATACCCGT [...]
+TTCCTTTCAGTTATTTTTACGGCATATTTAAAACAGCGCCGTGTTGTCGTGATTAACTTTAACCGTCTTAGCGTCAATTAGTCATAACAACGGTAAAACAATGAAAGTATAAAAAACACTTTTTCGCCAATTGTGAAGAAAAAAAGAATAAATTGCGCAGAGTTGAAAGAGAAATATACAACAGCATGATATAGCAGAAATTATGCAGAACTATAACGCAGCAACGCTTATTAATAAAGCAATTCTCCAGGAATAATCCGTAATAGCATGAAACTGTGTCCCAAATCATCCCTGTAATCCTAACGTGAGCTTACAGGGACATTTATCAGGGAAGTCTTTCCAGCATTAATCCAGCCCGCAATCCGCAGGCGACAGAGGGATTAGGAAAGAGAACATATTCAACGTCATGCGTCACCGTCACGCGCTTATCCCCCTCCTCGGCCAGCAACGTTCCCTTCGCAAAGGCAGTAAAATTCAGCGTTTGCGCATCCA [...]
+NODE 466 4352 234931 231667 0 0
+AATATAATAAAGCGCGTCACACAACGTACTGTCTGAACCGAATCCGCCCGCTTTGGTAATGACCGGCAGATCGTCAATTTCGCTGTTTACAAACGTTCCACAGGGAATACAGGGCGCCACCTCGCTCTGAATGCGATAACCTTCAGCGCCAAGCGCGCCGGCGACGGCGGTAGCGATATCACCGCCGGTCAGAAACAGCCCGCCAATCCGCGCCTGCTCGATAATGTTTAACGTGACGACGCCAAGCCGCTGACTCAGTCGCTCGCCCAATTGCTGACGGCTCATCGCGGATTTTTCGCACAATGCGTCGATTAACTGTCGATCTTCCGCGCGACGGCTGGTGCGTAAAATCGTATGTCGATGCTGACTTAACAGCGCGCAGGCCTGCTCTACGACAGACGCGATTTCCTGCTCCGCGCTATCCGACACCATGCGCGCGGCATCAATATCCACGACCTCCGCACGTCCCCGGCACAGCGCATTATCCACCTG [...]
+CAGCGACGGGCCCGGATTTCCGGGCCCGAATGGCGCTTCTTATTTATTATTACGCTTCACTTCCCGTAGCCCCGGCAAATACGTAATTACCCCGCCCATTATTGCCCCGGCTACAATCGCTGGAATAAGCATAATCAATACTTCACCATATATTAATGGTAGTATGCTTATGTCAAAACCATATCGCACCAAATTAAACAGCGTCGTGATAAGACCACCTGCAATGGCGCAAAGGATCATCCTGTTAATTATTTTTTGATATAATTTCAGGGGTATCAGCGCGCAGGCGACACCGGTTAACCATGCGGGGAGGAGACTGTATATCCAGCCGGTAATAATAACTAATGCTGGTATTGTTCTGTAGAAACAGAACAAAAATGAGTCTGGTCCGCCAATAATGGCGGGTGAATAGTTTATGACACCTATCGCGGTGGCTGCGCCTATTAACGGCCCAAGCAGAATAAACCAACCGCTATGATAAATTATTCGTCG [...]
+NODE 467 2998 155569 154575 0 0
+CTTGTTGGCGAACTGACGGATCATATGGCTAATGTACGCCGCGTATTCAACGAATTAATTGGCGATGATGAAGCCGATACCCCGCAGGAAGAAGAGCGTTCAGAGCCGTGGCGTGAAGTATGGCAGGATGCGCTACAGGAGGATGATTCGACGCCAGTGTTGGCGCATTTAGCCGATGAGGATCGGCGACAGGTTCTGACCCTCATCGCTGACTTCCGTAAGGAACTGGATAAACGCCCTATCGGCCCGCGCGGGCGGCAAGTGCTGGACCAACTGATGCCGCACCTGCTTGCTGATGTCTGCTCTCGCGAAGACGCCGCTGTTACGCTATCGCGGATAACGCCGTTGCTGGCGGGGATTGTCACTCGCACCACCTATCTGGAGCTGCTGAGCGAATTTCCTGGCGCGCTGAAACACCTGATTATGCTCTGCGCCGCTTCGCCAATGATAGCGAGCCAACTGGCGCGTTATCCGTTGTTGCTTGATGAACTG [...]
+ATAGTCGCCGCCTTTTACCAGCAGATCCGGCAGAATACCGGCAATCAGTCGTTGCGGCGTATCCTCTTCAAAAGAGACAACCCAGTCGACTGACTCCAGCGCGCCCAGCACGATCATACGCTGTTCGAGCGGATTAACCGGACGGCTTTCGCCTTTCAGACGTTTAGTCGAGGCGTCACTATTGACCGCAACAATCAGGCGGTCGCCCAATTTGCGCGCGTTCGCCAGATAAGAGACGTGGCCCGCGTGCAGAATATCGAAAACGCCGTTGGTCATGACCACTTTCTCGCCACGCTTACGCGCGCTGGCGACGGCCTGTCTCAACTCCTCTTCGGTCATAACGCCGAAGCCGGTATCCGCGCGTCCGCGCACTGCGTTTTCCAGCTCAATAGGGGAAACCGTTGACGTCCCGAGTTTACCTACCACTACGCCCGCCGCCGCATTGGCGAAATAACACGCCTCCTCCAGGGTATTTCCCGCCGCCAGCGTCGC [...]
+NODE 468 5247 287612 286309 0 0
+TCTTTTTTTCGCGTTACCTTATCGGCGTTGCGGGGCGCATTATGCGTATTGAGCCTTGAAGCGTCAACCTCTTTTTCATCGAAAAACGTCGGAAAGTGTCTGTTTGGTTAGGTTGCGAACAGCGTGGCGCAATATTCGGCAATTATTGGTTATTAATCGTTTTTCCGAAAGTGGTTTGCTATAAAAAAAGAGCCCCTAAGGGCTCTTTCGTCATCGTTAATTTACTGGTACGCCGACTGATGCACGCCGACCGCGCGGCCTGACGGGTCATCCATCGTTTTGAATGCTTCATCCCACTCAATGGCTTTGGCGGAAGAACAGGCCACGGACGGGCCGCCGGGTACGCATTCCGCCGCGCTCGGCACCGGGAACAGCTCTTCAAAAATTTCGCGGTACAAGTACGCCTCTTTAGACGACGGCGTGTTGTATGGAAAGCGGAAGCGGGCGGTTTCCAGTTGTTGATCGGAAATCTGTTTCGCCGCCACTTCTTTC [...]
+CCGGTTTTATTGATGTGCAGTTAAACGGCTGCGGCGGCGTGCAGTTTAACGATACCGCAGAAGCCGTCAGCGTTGAAACGCTGGAAATTATGCAGAAAGCCAATGAAAAATCGGGCTGTACTAACTTTCTGCCAACGCTTATCACTACCAGCGACGAATTGATGAAACAGGGCATTCGCGTCATGCGCGAATACCTGGAAAAACATCCGCACCAGGCGCTGGGTCTCCACCTGGAAGGCCCCTGGCTTAATCTGGTAAAAAAAGGCACCCATAATCCTGATTTCGTGCGTAAACCAGACGCTGCGCTGGTCGATTTCTTATGCGATAATGCCGACGTCATCACCAAAGTTACACTCGCGCCGGAAATGGTGCCTGCTGACGTAATCGCTAAACTGGCGAATGCGGGCATTGTGGTTTCCGCAGGCCACTCCAACGCGACGTTAAAAGAGGCAAAAGCGGGCTTCCGCGCCGGGATTACCTTTGCGACTCACC [...]
+NODE 469 1979 99143 96603 0 0
+TACGAGCTGGCGGGTGATGACGCCTGGACATTACGCCAGTTGGCGGATGAACTTACTCATCAGAGCGGAAAAAAAATCGTCTACCAGAACCTGAGCGAAGTCGATTTTGCCGCCGCGCTGAAAGGCGCAGGCCTGCCTGACGGACTGGCGGATATGTTGGCCAATTCTGACGCTGGCGCGGCGAAAGGCGGCCTGTTTGATGACAGCCATACGCTGCGTAAACTCATCGGTCGCCCGACGACGACGCTCACAGAAAGCCTTCGCTCCGTACTGTAAGTGTTAAAATTTAGTTAATTTATGTAGCATCCTCATAGACCTTCTCTGATAATGACGGAACGGTTTATGAGGAGAATCTGATGATTAGCGGCGTGCTATACGCCCTGCTGGCAGGGCTAATGTGGGGATTGATTTTCGTCGGCCCGTTAATCGTGCCGGATTACCCGGCCCTCTTACAGTCAATGGGACGCTATCTGGCGCTGGGGCTGATTGCCC [...]
+CGTCTACCAGCTCTCCCGCCTCGTCATGCTCGCTTTCCATTACGCTTATCGGGCCCGTTGCCTGGCGACCCATACCCTGTTTGATCATGGGGAACAGGATCTGTTCTTCTTTCATCATATGGCTGGAAAGCTCTTCATGCAGCGCGGTGAGATATTTTGTCAGGCCGCGTGGGACGTTTGGCTTATCCGCGTGGACGCGTTCCACTTTGGTTGCCTGCAGGATAAGCTCCGGCAGTTGTTCGCGATGTCGGTCATGATAGCGCACCACGATATGGTCAATAATGTCCGCCAGCGGAACGGCGCGCCAGTCTTTTTCGATGGGCTGTTCAGCCAACTGCGCGAGTTGCGCTTCAATGATGTCAATATCGACGTCGTGACGCGCGGCGGCGCGCGCCAGCGTCTGTTTTCCACCGCAGCAGTAATCCATATCGTACTGGCGAAACAGCGCCGATGCGCGGGGAATAGAGAGCGCCAGTTCGCCTAAAGGTTGAT [...]
+NODE 470 4501 280586 279542 0 0
+TCCCTGATTCCAGTTCATCATTGCCAACATCATGCCGCCAATAAGCGCTATACACGATGGCAGCAGTACAAAATGCCGTAATTGTTTGTGATACAACATCAGCGCAGACAGTAGCAATCCTGATACAATCAACAGCTTCAGCGCATCAGCTGACAGGCCGATAAACGCCAGTCCAACGATAATCACTCCAGGCAATAATACGCCCCATCCGCTGCCTAACGTCCGCTGCAACATGGTTTCACCTCTGGAATTGATAATGATAACCAATATCATATGATATATTTTCTCATTTGTCAGCCAGGGAGAAAGCTAAAGAGATGAGTTTTACTTAACGGTTGATGACACGTATTCAGTAAGGTGATAAATTGTCCGACTGTTAACGTAAAAACAACAACACCTCGCTTTAGGCGACCTTTTCTCATACGTTATTTTCATGTTGGCGCCCGATTCCGTGTATATCACCGATAAATAACGACAATTACCCATGACAAC [...]
+CTTATTATCAGTAAAACCCCTCTTATACAGGAAGGTCTTAAAGGGGCTATAACAGGTAATTTCCCCGATTATAAACTGGCGTATTGCCGTACGATAGAAGAGCTAACGCTGCTACAGCTACGCCGGAGTAATTTAGTTATTGCTGATTTAGCAGTTAACAATGCCTCTTCCCGCGCTATCTGCGAATATTTTTATAGCTTAATCTCGCAATATCGCGACATACATTGGATATTTCTGGTTCCTAAATCCTGCTATCCACATGCAGTTGATCTCCTGATGGGCCCCGTCAGCACCTTGCTTTCAGACGAAGAGCCAATCGAGAATCTTATTAGCGTTATCCATGCGGGAAACGCTCGCTCAGAAAGAATAAGCAAAACGTTATTATCGCCTCAGGTACCGTCTGAAATTCAGCAGGCCCACGACAGGCCGATTGTCCTTACGCTGTCTGAACGAAAAGTATTACGCCTTTTAGGAAAAGGGTGGGGCATTAAC [...]
+NODE 471 3408 202675 201237 0 0
+ATCCGAAATAAATCCGGTCAACGTTGGGGCGACAACCGCTGAACTCATGCCAAAGAAGTTAAAAAGGCTGAAAGCTCTTCCCAGACTTTTTGCCGAAGCCTGTTCAGATACAAAGGAGATCAGGATCGGGTCTACCGCCATTTTCCCCAACAAGCCGTATAGCGTCAGGCTGACCATCAGCATCGTGGTATTCGGGGACAAAACCGTAAACGCCAACATTGCTGCCGCCACAATTTCCAGACCGAGAATAACCTTAACTTTACTGTTACGGAATTTATCTGACAGATGGCTAAAAAATAACGCCCCCGGTACGCCAACCACCGCCACCAGCGCTGATGCCAGCCCGATAGCTCCGCCATCAAATCCTCTTTCAGTCTGGAGATAAGAGGGCAGCCAGGTCACTATCAAATAGTAACCGTAGCAGGTACAGAAATAGAGGAAGTAAACGCTACACAATAAACCAGAGAATAAAGGTGCGCGTTTCTCATCTTC [...]
+GTTTAACATTCCGTATATCCATGTGCTGGTTAACAACGCTTATCTTGGTCTGATTCGCCAGTCGCAACGCGCATTTGACATGGACTACTGCGTACAGCTCGCCTTTGAAAATATCAACTCCAGCGAAGTGAATGGCTATGGCGTTGACCATGTAAAAGTGGCGGAAGGGTTAGGCTGTAAAGCCATTCGTGTCTTTAAACCGGAAGATATTGCGCCTGCATTTGAACAAGCCAAAGCGCTAATGGCGCAATATCGCGTTCCGGTGGTGGTGGAAGTCATTCTGGAACGCGTAACCAATATTTCCATGGGCAGCGAACTGGATAACGTAACTGAGTTTGAAGAGGTTGCGGATAGTGCGAAAGATGCGCCAACAGAAACCTGTTTTATGAAATATGAGTAAGGGAGGTAATCGATGTTACGTTTCTCTGCCAATCTTTCTATGCTGTTTACGGAATATGATTTCCTGGAACGCTTTGATAAAGCGGCGTTGTC [...]
+NODE 472 11044 561828 554855 0 0
+ATCCGTCAGCAGCCCGCCCTGGTCGAAACCGACGTATCCCGGAGGCGCGCCGATCAAACGGCTCACCGTATGACGTTCCATATATTCGGACATATCGAAGCGCAACAGCTCAATACCCAGCGCTTTTGAAAGCTGTACCGTAACTTCAGTTTTCCCTACGCCAGTTGGCCCGGCGAACAAGAATGAGCCGACAGGTTTATGCTCATGGCCCAGACCCGCACGACTCATCTTAATAGCTTCGGTCAGCGCCTCAATCGCGTTATCCTGGCCGAAGACCAGCATTTTCAGACGATCGCCCAGGTTCTTCAGCGTATCGCGATCGCTCTGCGAGACGCTCTTTTCAGGAATTCGCGCAATTCGCGCCACTACGGACTCAATATCCGCCACGTTGACCGTTTTCTTACGTTTGCTCACCGGCATCAGACGCGCCCGAGCGCCCGCTTCGTCAATCACGTCAATGGCTTTATCCGGCAGATGGCGGTCATTGATATA [...]
+GTGGCGAAATCGGTAAAGTAGTTACGCTCGCCGCGCGCGCCGTCACAGCCGCCGACCAGGAAGATGTGGCGCAGTTTTTCACGGCTGACCAGATCGATGAGCGTATCGGCAGCGCCGAGCAGGGTCTGACGGCCAAAACCGACGGTGATGAGATGCGGAATTTCGCTATACGGGAAGCCCGCCATTTGCTGCGCCTGGGCAATGACCGGCCCGAAGTCATCGCCTTCAAGATGGCTAACGCCCGGCCAGCCGACGATGCTACGGGTCCAGATACGGTCGTCATAGCTGCCCACGGTCGGGTCGATAATGCAGTTAGAAGTCATCACGATTGGGCCAGGGAAGCGGGCGAACTCGACCTGCTGATTCTGCCAGCCGCTGCCGTAGTTACCGACCAGATGCTTGAATTTACGCAGTTCCGGATAGCCATGTGCGGGCAGCATTTCACCGTGAGTGTAGACGTTAACGCCGGTGCCTTCGGTCTGCTCCAGCAGG [...]
+NODE 473 4599 237205 235260 0 0
+CGTATGCAGTCACATCTTCTACTGGCTCAACCATAATCTGGCTATTGCCGGTTTCGTCGAAACGGCGGATCATTTCAGCCAGGTTATCCTGAGACAGGTCGGACTCATATTCGTCAAGAATAACGTCTGGCAGAATAACAGCGACAGGTTCGTTTCCGACAACGGGATGCGCGCACAATACGGCATGGCCCAGGCCTTTTGCCAGCCCTTGACGTACCTGCATAATAGTGACATGCGGAGGGCAAATAGACTGAACCTCCTCCAGAAGCTGACGCTTAACGCGTTTTTCCAGCATCGCTTCCAGCTCAAAACTGGTATCAAAGTGGTTTTCAATAGAGTTTTTAGACGAGTGCGTAACAAGCACGATTTCAGTAATGCCAGCAGCGATACATTCGTTCACGACGTACTGAATTAATGGCTTATCAACCAGCGGCAGCATCTCTTTCGGGATAGCTTTGGTCGCTGGCAGCATCCTGGTTCCCAATCCCGCGA [...]
+CGGGATAAATTCATTATGCTGCTTGCATTCTATAGCGGGAAGGATTATTCGGAGCTAAAGCTCCTCACCCTTCGGGCCGTTGCCTGCGGCAACGTTCTCTCACTATTGCTCGAGTCGAACCTTCGAAGTCGATGACGGCAGATTTACAGTCAGCTCCCTTATGATCGCTCGGGAACCCCACCACGGGGTAATGCTTAATACTGGCCCGCTTCCTTTCGGGAAGCGGGGCGCATCATATCAAATGACACGCCGCTGTAAAGCATTCCTTTGCCTGAAATGAACTGTTTGCGTACTTTTCATCCGTAACGGATTAAAGCTAATCAATTCATATTACTGACGATTAAAGAATAATCGTCCGATTGCCGTAAACAAAGACCCGCTGCGCCAGAACCTGATACAGCGCGCGGCTTAATACGTTTTTCTCAACGTCGCGCCCGGCACGCATCATATCTTCTGCGGTGTAAGTGTGATCGACATGAATCACGTCCTGCA [...]
+NODE 474 6631 391489 386162 0 0
+TTCGGACCGACATCCAGATCTTTATTATCCTTGCAGCTTACCTGGCAGGTTTTACAGCCTGAACAGCGCGAGGAGTCAACATAAAAGCCATACTGTTTCATCGTACATCACTCCTTAAGCGCGTTTAATTTCAACCAGATTGGTATGCTGCGGATTGCCTTTCGCCAGCGGCGAAGGATGGTGGCTGGTCAGCGTATTGATACAGCCGCCGACATCAACGCCGTTGCCGTCAAGCCGCGTCCACGCGCCCTGTGGCATCGCCGCCACGCCGGGTAAAATGCGCTGGGTCACTTTACAGGGAAGCTCCACCACGCCGCGGTCATTGAATACATGCACCCGATCGCCGGACTTCAATTGGCGGGCGCTGGCGTCAATCGGGTTAATCCAGACTTCATCCGGCACCGCCTCATGCAGCATCAGCACATTGCTGTAGGTCGAGTGGGTATGCCCTTTGGTATGGAAGCCGCTTAACTGCAACGGATACTTCGCCGT [...]
+TTATCCAGATCTTTACCGCGGAACCAACTAAAAATACCGATTGCCAGGATACCGAGCAGGGTAGACGGGATGGTGATCGACAGCAGATCGAGGAACTCCAGATGTTTTCCGGCAAATGTCACGTTGCCCAGCATCGCTACCAGAGAAACCACGGCGACGGAAACCGGACTGGCGATGATGCCCATTTGCGCGCCGATAGAACTGGCCGCCATTGGACGTTCCGGACGGATATTATTCTTGATCGCCACGTCATAGATAATCGGCAAAATGGTGTAGACCACGTGGCCTGTCCCACACAGAATCGTCAGGGTACAGGTGACGAACGGCGCCACAATAGAGACGTATTTGGGGTTGCGACGCAGCAGCTTTTCGGCAATCTGCAGCATCACATCCAGCCCGCCTGACGCCTGCAACGTTGCCGACGCGGCGACTACCGCGATAATGACCAGCATTACGTCAACGGGCGGTTTACCTGGCTGGAGATGGAAAACA [...]
+NODE 475 4270 216024 213305 0 0
+TTCCAGCTCTTCAAGCGTCCACAACACTTTTTTAACATTAGTCGAGTTGTTCCGGCCCCACAGCGTAATCATATTAACCCCTTCCGTTTTATCAGGATGATGACAGTAATCGGCCTACCGTGAGATAAACCTAACATTTACACAATGGTCTGTAAAAAAATCGTTATGAAGGAAGCGTAACGGGATGTTATTGCATAAACTTTAAAAACTTTACCAAGTTACGGTTTCTTTAACGTCGTGAGTGCGTTATTACTCACCGCACTTATTACACGGTGGTGTGACGTGTGTTTTTGGAATGGATACTCGGGTGGTACTATGACGCAATACGCTTCTTCCCTTCGTAGCCTCGCGGCAGGTTCGGTTCTCTTATTCCTTTTCGCTTCGCCTGTAAAGGCAGAGGAACAAACGATCGCGCCGCCGGGCGTTGATGCGCGAGCCTGGATCTTAATGGATTACGCCAGCGGTAAAGTACTGGCGGAAGGCAATGCCGAT [...]
+CGGCGATGATCAGCCCCGCGACGATAGGCCAGCCGCCCATCACGATCAGCGAGCGAACCGTACGTCGGGAGGTTAAACGCGCTAACACCAGATTACCGGCAATGAGCGCGCCAAAAACGGGCACCTGCAGCAGACCATATTCATAGCTGCTGAGCTGTTCGCCGCTAATGATGATAATCGGCGACTGCGCAATCCAGGCCAACAGCGGCAGGCTGACAAATCCCAGCGCTAACGCCCCTGCGACGAACCGCCGATTTTTTATCACCAGCCGATAATCCCGGCCAAGCGCCTTAAATGACAGCGTTTCGCCCCGCCGCGTGGCGGTCTCCGGCATTGCGCGCTGTAGCCCGAAAAAGGCGATAGCGGCCAGTGCGGCAAATAAAATAAACATCCCCTCCCACGGCAGAACATGCACCCATGCCGCCCCAACCAGTGGTCCCAGTAGCGGCGCGATTAACGCCACGTTCGCCATCAGCGCGGTAATTTTTATAC [...]
+NODE 476 2531 118966 117675 0 0
+TCTGGCGATGGTCAGCAGCATCATTCTGTTTTCGGTGGGAACCCTGGCCTGCGGGTTTGCGCCCGGTTACACCACCATGTTCATCGCCCGACTGGTGATTGGTATGGGCATGGCGGGCGAATATGGTTCCAGCGCGACCTATGTGATTGAAAGCTGGCCAAAACATTTACGCAATAAAGCCAGCGGTTTTCTGATTTCCGGCTTCTCCGTCGGCGCGGTCGTTGCCGCGCAGGTGTACAGCCTGGTGGTGCCTGTCTGGGGCTGGCGCGCGCTGTTTTTCATTGGCATTTTGCCAATTATCTTCGCTCTCTGGCTGCGGAAAAACATTCCGGAAGCGGAAGACTGGAAAGAAAAACACGCGGGTAAAGCGCCGGTACGCACGATGGTCGACATTCTTTATCGGGGCGAGCATCGCATCATCAACATTTTAATGACTTTCGCCGCCGCCGCTGCGCTGTGGTTCTGTTTTGCCGGTAACCTACAAAATGCTGC [...]
+ACGCGTCCACAGCCGCATACGGGCCCGTGTGGGTCCGCCAGGGTGTGTCCCAGGTGCCCGGCCAGACCGCCTTTTCCGGTAAGGAGCTTGCCGTCACAGACAACGCCGCCGCCAACGCCGGTTGAAACGGTGATAAATACCATATCGCGGATATCATCAGGGAGCGCGTGATACTCCGCCCAGGCCGCCGCCTGCGCGTCGTTCACCGCCAGCGTCGGCAGGCCAGCGATCGTTTCCAGTGTTTGCACTAACGGAAAGTGTAGCAAGCCGCCCAGATTATGGGGGTTTAGCGCCAACAGCATCCCTTCCTGAATGATCCCGGTAGAAGCTATCGCTACCTGACGCGCCTCTGCCCGTAGCGGTTCAACCAGCGCCTTTAATGCTTCACGTAACGCATCCGGCGTTTTGCTCGCGGGGGTCGGCAGCTCGCGACGCTGGCTAATGCGCAAGTTGTTGTCGATGAGCGCGGCGGCAAGTTTAGTCCCGCCAATA [...]
+NODE 477 2804 137496 136557 0 0
+GATAATGATAAACGCGCTGCTCCACACATCAAAGCGACTGCCGTTATGGACGGCTTTGCGGATCCCCAGCGGGATAGACACCAGATAAATAATCAGCGTGCTCCATAATCCCAGGGTAATGGAGACGGGAAGACTATCTTTGATCAGCGTTAGTACGGATGCGCTGCGAAACATACTGTCGCCGAAGTCAAAAGAGAGATAGTCCCGTAGCATCTTGAAATAACGCTCATGCAGCGGTTTGTCGAAGCCGTAGCGATGGGTGATCTCCGCGATCACCTCCGGATCGAGTCCCCGGCCGCCGCGATAATGGCTGTCGCTGATATTGCCGACGCCGGTTTGCGCATGACTGGCGCGAACGCCTTCGCCGCTGGCGCCGGGCAACGCGCCGCCCTGGCCAAATTCAATCGCGGCAATAGCCTGATCGACAGGGCCACCGGGAGCGATCTGCACGATAAAAAAGTTAATGGTAATAATGGCCCATAGCGTGGGGAT [...]
+TCGGTACAGGCCATAGCGCCCTGATTTATCTGGAGCGATTTACTTTAGATTATCTGAAAATCGATCGCGGTTTTATCCAGGCGATCGGCACGGAAACCGTCACGTCTCCGGTTCTGGATACCGTGCTGACGCTCTCCAGACGCCTGAATATGCTGACGGTGGCCGAGGGCGTTGAAACGCCGGAGCAGGCCCGTTGGCTACGCGATCACGGTGTTAATTACTTGCAGGGGTACTGGATTAGCCGTCCTTTACCCCTAAAAGATTTCGTGCTGTGGATGTCGGCGCCTTCCGTGCCTGAATGGTAGTCCCCTTACGGTTTTAACGGATTCACATCAGACGCAACGTCACTTATTATTCAGCGAAACGCCTGCCGGTTTGCAGCGGGCAATACGATAAGGAAACCGCCTTCAGATGATTGCGCGCGTAATGCTTCTGCTTGTCGCACTGGTTAGCGCTGGCGCCCAGGCCCAGGAAATCAAAGAAAGCTACGCT [...]
+NODE 478 203 11471 11416 0 0
+TTGAACTCCAGGTTCTGTGTTGCCTTGTTTCCCGCCGCGTCGGTCGCTTCCACCGTCAGAGTGTGAGAACCGTTAGCCACATCGGTCAGCCAGGTGTAATCCCAGACGCCCGACGTCGAGCTCTGTGTGGCGTTAAACCACGTTTTGCCGCCGTCAATGCTCAGGCGCACCACGTTGACATCCGTCGGTACCGTCACCTGGAA
+CGGCGGCAAAACGTGGTTTAACGCCACACAGAGCTCGACGTCGGGCGTCTGGGATTACACCTGGCTGACCGATGTGGCTAACGGTTCTCACACTCTGACGGTGGAAGCGACCGACGCGGCGGGAAACAAGGCAACACAGAACCTGGAGTTCAACATCGACACCCTACTGTCAGAGCCGACTATCGCTCTGGACAGCACGGACG
+NODE 479 1904 101831 101030 0 0
+AATAACATTGAACTGGTCAATGACAGCGGTATTCCCGACGATAATCTGACTAATAATGTGCGTCCGCACTTCCAGGTGACGGTACCGACGGATGTTAACGAGGTACGCCTGAGCATTGACGGCGGCAAGACGTGGGTAACAGCGGCGCTGAAGGCAGCCGGGGTTTGGGAATATATCTGGCCGGATGATGTGACCGATGGCTCCCATACCGTGACGGTGGAAGCAATCGATGAGGCGGGAAATAAGGCAACACAGACGCTCGATTTCACCATCGATACCACTCTGTCTGTGCCGACCCTCTCGCTGGACAGCGCAGATGACAGCGGCATCGCGGGCGATAATATCACCAATGTTAAAACGCCGGGCTTTACCCTCAACAATATTGATACCGATGTCAGCCGGGTGATAGTGGAGGTAATGCACAATGGCATTAAACAGGAGGTGCCACTGGTTCAGACCGGCGGACAGTGGCGCTTTGCGCCGACCAGCGAC [...]
+ACGCACGTTATTAGTCAGATTATCGTTGGGAATACCGCTGTCATTGACCAGTTCAATATGGTCAATGGCGATTTGCGTATCGACAGTGACCTTCAGCGGCGCTGAGTGGCGAATATTACCCGCCTCATCTTTCACCGTTACCGTCAACGTATAATCGCCATCGGCCCACGCGCTGCCGGGTACAAAACGCCACTGCCCGCCGATCTGCGTCAGCTCCACCTCCTCGCTGCCACCATCGCGCATCACCTGCACGACGACCTGAGTCACGTCAGAATCAATACCGCCGATAATAAAACCCGGCGTTTTAACGTTAGTCTTATTATCGTTGGCGGTGCCGCTATCATCTGCGCTGTCCAGCGTGATGGTCGGTGTCGACAATGTGGTATCAATGGTAAAATTGAGCGTTTCCGTCGCCGTGTTGCCTGCAACATCGGTTGCTTTCACTGTCAGGGTATACGTATTTTCGACCAGTTCTGTCGGCCATATATACTC [...]
+NODE 480 6 771 771 0 0
+CATTGA
+CTGCGG
+NODE 481 3554 177433 174046 0 0
+CGCATCATCAACGTAGCAGACCGCGTCATCCAGAAGCCCCAACACGTCCGGATTACTGAGCTTTTCGCGGTGCGCGCCGAGGGCGGAGATATAGCTGGTAAAAGTGTGATTGAGGCAAAGCAGCCTGAACGCCGCCTCCCGGGTTTCAGCCGTGACGTCGGGTTCGCTCGACATATTAGAAACCACGGATGCCAGTTCTGCATCGCGGTTGTGCGCGTCGCGTCTGGCAATGCGATAGGCCAGGCGGTTATCCCGTCCCTGGTGATATTGCTCAAGGATCGCATCAAGGTAGCGGCAATTAGCATCGGTGGCGCGCTGGAGTACCCGGGGAAGGTTGCGAAAGCGCCAGTCCGGCCAAATAAAGCTGACCGCAGCCCAGGCGATAGCGCAGCCAATTAACGTGTCGACGACGCGCGGTAACGCTACCTCAAAGCCTTCGCCCAGGAGGTTAAAGCAGAGTAATACCAGCAGGGTGATGAACATCGTCGCATG [...]
+TTTGGCCTGCGCTTTTTTCTCGCTACACTGCTGACGCCAGGTGCGCAGAAATAGCTGATGCCGCGCGGTGGCGTCACTTTCCAGCTTACTGACAACCGGCGCTTTTTTACTGCCTTGCTGAATAATATACAGCGCCAGCGAATGGAACGTACGGGCAGTAATCTCTTCCGTATGTAAGCGCTCGCGGATACGCTCATCCATCTCCTCTGCCGCCTTGCGGCCAAACGCCAGTAAAAGAATTTGCCCCGCATCGGCTTGTCCGCGCGCCAACAGCCAACCCGCGCGCGCCACCAGTACCGAGGTTTTGCCGCTTCCCGCGCCCGCCAGTACCAGTAACGATGATTCGCCGTTAACCACCGCCCTGGCCTGGGAAGGATTAAGCGGAGAAGATTCTATCTGCGTAAAAAAGTCGGCATGCGCTTCCAGCATGGCATCGGCATACGCCTGATTATGCTGCTGCCGACTTCCCTCGCTATCCTGTAACCATGCCAG [...]
+NODE 482 513 33857 33830 0 0
+GCATTCAGTGTTTTTTTTGAGCTTAAATGCTTTTTTTAGGCAACGTGACAGGTAATTATTCTAATCCTGTGATCTATAACCATTTTATTTTAGAATGTCTAATAATTACGCAATGTAACTTTTATGAATGGTAACAATATGAAATACAAGAGCTTAGTACTTTTCTCAATTTTGTTGCTGCTGGGGCAGAGCGCCTGCGCGGAACAAATTGGTTCAGTCGATACGGTATTTAAAATGTTCGGTCCTGACCATAAAATCGTGGTGGAAGCTTTTGACGATCCTGATGTCAAAAACGTGACGTGCTATGTTAGCCGGGCGAAAACGGGCGGCATAAAAGGCGGATTGGGGCTGGCGGAAGATACGTCTGACGCCGCCATCTCTTGTCAGCAGGTCGGGCCTATTGAACTGAGCGACAAAATTAAGAACGGCAAGGCGCAGGGAGAGGTGGTTTTCAAAAAACGCACCTCATTGATATTTAAGTCATTGCAGGTC [...]
+TGCGTTTTTTGAAAACCACCTCTCCCTGCGCCTTGCCGTTCTTAATTTTGTCGCTCAGTTCAATAGGCCCGACCTGCTGACAAGAGATGGCGGCGTCAGACGTATCTTCCGCCAGCCCCAATCCGCCTTTTATGCCGCCCGTTTTCGCCCGGCTAACATAGCACGTCACGTTTTTGACATCAGGATCGTCAAAAGCTTCCACCACGATTTTATGGTCAGGACCGAACATTTTAAATACCGTATCGACTGAACCAATTTGTTCCGCGCAGGCGCTCTGCCCCAGCAGCAACAAAATTGAGAAAAGTACTAAGCTCTTGTATTTCATATTGTTACCATTCATAAAAGTTACATTGCGTAATTATTAGACATTCTAAAATAAAATGGTTATAGATCACAGGATTAGAATAATTACCTGTCACGTTGCCTAAAAAAAGCATTTAAGCTCAAAAAAAACACTGAATGCTAAAAGAACAAAAAATGCTATTATCCTCT [...]
+NODE 483 8208 420727 416853 0 0
+TAATGTGAGATTCGGATTCGTTAAGCAACTGCTAGTGGATAAACATTACGTTTATCCCCGTCATACTTCAAGCCGCCAGAGGAAACACCGTTACGTCGCCGCCTGTGGAAACCTGAAGGTTCGGGGATAAAATCGTTGCCAGTAGCACTCATTTTATCCTTATATTAGTATCATACTCTTAATCTTTGCTGAATCGAAGCAGCAACAAATTCATTCGCCCCATCTGCTTTTTATTTGCGCAAAGCCCGGCAGATCAAATGTGAAAGCAGTTCCAACTGTCGGGCCGTTTCCATACTTAGCCAAACATAGCCGTGGATGGGGGTTTCAGCCACCGCGTCGCCCTGCTGCTCGTTCATTAGCTGTCGCAACTCGGCAGCAATATCATTCAGTTTACCGGTGTTTGCCAGTACCGGCTGCGGGTTGCCTTCAAACAACGCGTGGGCGATCGTTAGCAAGGTTTGCTGCGTCATCTGCTGGGTTTCACGCAATGTG [...]
+ATCGCGATCTGCGGTCGTAAGGGTTTCTCCGGCTTTCTGTCGTAAAACTGCATCCGTGAGTTTCTTAGCCCAGTCGGCAGGTGATGACGGGGAAGACGTAGCCTGAAGTGAGAGGGAGGGTGATACTGGTGGTGTTCTACCTTCAGAAACCGTGGGCCTGTTATTGGCTGATACAGAGACTCCACCGGGGAGCGGGGCCGCACCTGTCACTCTGTAATTATAATCACATGTTTGATTTGCAATATGCTTACGCATGAATGCTGCATTCATTTTTGAGACATCTTCTTCTGAAATATTTTTCTTACCTGCATTATTTGTATCTTTAATATTTTTAACAGTAATCAATGTGTTATTTAAGGTGTTTTTATCTTTCGGCTGAAAGAAGTCTTTTATTTTTTGTGGTAACGCGAACTCAATCGATGAGCTCTTTCCTGTTTTAAGTTTTTCATTTAAAGAAGCATGCGTGTTTTTAACACTGGTTATTTTTGAGGC [...]
+NODE 484 9384 552677 548548 0 0
+GGGCTTTTTCTTTGCATGTCATTTAATTATTGCTCAATTCGCAAAAATCCTCTGCATTTCTCGCTCTTTTTCTACAAAGCGCTGAAGGTCATAATTCCCTCAGTTAACGAACATAGTGATTAAAAAGAGGAATTCTATGACTATCCCTGCATTCGGTTTAGGTACTTTTCGCCTGAAAGACGACGTGGTTATCGCTTCTGTTAAAACGGCGCTTGAACTGGGCTACCGTGCTGTCGACACTGCACAGATCTATGATAATGAAGCGGCTGTTGGACAGGCGATTGCTGAAAGCGGTGTACCACGTAATGAGCTGTACATCACCACCAAGATCTGGATTGAAAACCTTAGCAAAGACAAACTAATCCCAAGCCTGAAAGAGAGCCTGAAAAAACTGCGTACCGATTATGTCGATCTGACGCTGATCCACTGGCCATCTCCGGGTGATGCTGTGTCTGTCGAAGAATTTATGCAGGCATTGCTGGAAGCTAAAAA [...]
+GTGATGTTCCCGCTGGGAACGAGGCGAATATTACGGTTTGCGGTGTCGCCCGTCAACGCTTTTTCTCACCTTTTGAATCAGTTGCTGCAAAAATCGCCCGAAGGATGATTTTTATAGCCTAAAAAGGAATAAATTACGCCCGCCAAAGGCAACTTCCGCCCTTTTTCTGCACCAGATCAAGCCGCGATTCATGCGCAGCCAGCTCTTCCTCAGAGGCAAAAACGACCCGTAACCGGCTGGCCTGGCGAACGATTCGCTGAATGGTCGCCTCACCTTGCTGCCGTTGCGTCTCTCCTTCCATCGCAAACGTCATGGACGTTTGTCCGCCCGTCATCGCCAGATACACTTCGGCAAGGATCTGGGCATCGAGCAATGCGCCGTGCAAAGTACGTTTGCTATTATCTATCTCATAACGCGAACACAGCGCATCAAGGCTGTTACGCTTGCCGGGGAACATTTTCCGCGCCAACGCCAGGCTGTCGGTAACTTTGC [...]
+NODE 485 1574 104650 104205 0 0
+CAAAAAGAGCAATATTCTGGCTTTCTGGGCAACTCACACTAACGTGAACCTCCTGTGAAGACATTTGATTCCAGCCTTGCTGAGAATTGACGATATCATCTTGCTTAAGCCAGCCAAAGCTGACGTTTGGCGAAGAGAACGTTATTTGGCAGTCATCGTCGGCTCGGGCTGATGGAGGGAGTAGTGCGGTGAAGAGACAACATATAGCAATCCCCAACCATTTGCTGTTTGATTTCATTGACAGACTCCCTTTGCCGTTTCATAAAATGCCTCTTTATCCTGGGTTTTCTGCAGCGTGTAGTGGATGCGACACAGACGATTCATATCATCATCAGCGGCATATAACGCAGGATTATCCCCAACATCGGTGATAAATACGCGTCCGCTGTCGACAGCGCTGACCAAATAGTTATTTTTTTCATCTACAATGCTGGTGCCTTTAGGTAGCCATGAGCCGTCCGGACGCTTTACTGCCAGCATCACACGGCGTGT [...]
+TCTGGCGTACTGGCACAAGACTATCAAGCGGCAGGAGGTATGCTGCAATGGCTTCCAACCAACAAATGGACGTTTTCCGGCTCAATGCTGGGCAGTAAAGCGTCCTTTGGCGAATCTCTGCAGGGTGCGAAAAGTGAACTACGCGCCAGCATGGCGCTGCCCGGGGAAATTAGCCTTGACGTCAGTACCGCCCGCTACAGCGACGGATACCGTGAGTTAACGGATGCGCTCAATAAAGATGCTTACGAATACCAAAGTAGCTCCAGTGCTAATATCGCCTGGAACCATAATCTGTTAGGTACCTTCTCTCTGGGTTATTACACTTATCAGGCTACGGATAATAACAACGACTCTCGCAGTATAATGGCTTCCTGGGGCAAAACATTTAAATATGCCTCAATTACCGCTAACTGGCAGCACGCTGTTAATCAGGATGATGAGAATCATAACGGCAGTAATGATGATGATATGTTTTACATCAACATCAGCATT [...]
+NODE 486 26 57 57 0 0
+TGTATGAAGGAATGGTGTATGCGGAT
+CCCAGCCTGTGGGCACGATCAATAAC
+NODE 487 654 30770 30690 0 0
+CGGCGTTGCTGCTGTGGGTCGGAGGCTGGCTATGCTGGCGGCTGTGGCGCAGCGGCAAAGCGGCAGTCGATCGTTTAACCGCGTATTTCCCCCGCAGCCGTTTGCTGTATCTGGCGCCGTTGACGCTCGGGATTGGCGTGGTCGCGCTGGTGGTGCTGGTTCGCCACCCGCTGATGCCGGTATATATCGATATTCTGCGCAAAGTTGTGGGTTACTAACGATTCCTTTGCCGGATGGCGGCTTCGCCTTATCCGGCCTACAAAATATGGGATTTGATGCCCAATAGCGCTGAGGCGCTGGCCTGACCGCTTAGTAGCTCGTCTGTTTTGCCTTGCCACGCAATGCGTCCGTCGGCGACGACGATTGACCGGGGCGCAATTCGCGCCGCATCTTCCACGCTGTGCGAGACCATCAACAGCGTGAGCTGTCGCTCGCGGCAGATATCGCTGACCAACGTCAGCATCTCCTGGCGCAGCGCGGGATCGAGCGCGG [...]
+AGCCTGATGGCGCGTTTACCGGGCGAACTGTCCGGCGGCCAGCGTCAGCGGGTAGCGCTGGCGCGCTGCCTGGTACGTGAACAGCCGGTACTGCTGCTGGATGAACCGTTCTCCGCGCTCGATCCCGCGCTGCGCCAGGAGATGCTGACGTTGGTCAGCGATATCTGCCGCGAGCGACAGCTCACGCTGTTGATGGTCTCGCACAGCGTGGAAGATGCGGCGCGAATTGCGCCCCGGTCAATCGTCGTCGCCGACGGACGCATTGCGTGGCAAGGCAAAACAGACGAGCTACTAAGCGGTCAGGCCAGCGCCTCAGCGCTATTGGGCATCAAATCCCATATTTTGTAGGCCGGATAAGGCGAAGCCGCCATCCGGCAAAGGAATCGTTAGTAACCCACAACTTTGCGCAGAATATCGATATATACCGGCATCAGCGGGTGGCGAACCAGCACCACCAGCGCGACCACGCCAATCCCGAGCGTCAACGGCGCC [...]
+NODE 488 4848 263927 260833 0 0
+AATAGCTTCTTTGTGGCCGGTGAGTACCGCTTTTGAACCGCTGCCATTGCCGACTGTTGCTTTGCGTCGCTGGTGTGCTGTCCGGCGTGGCGCAGGCGGCGCTGCCCAGCCGCAGTCAGGTGGACGGCTGGCTACAACAAATGGGGGATAGCGATACTTACGATGCCGCCAAAGGCGTCAACTGGGGAGTAATGCCCGGGCCATTTTATACCCCTGAACTGGGCCTGGGCATCGGCACCGCCATCGTCGGTATGTATCGCCCCGATCCTGCCGATAAGGTTAGCCAGGTATCCACGCTGTCGCTGAGCGGCTATTTCAGCTCCACAGGCGCTTTTGGCGTAAGCCTGCAAAATTACGCTTTTTTCGCGCAAGATCGCTGGCGTTTCTTCCTCACTGGCGCATTGAGCGACACGCCCACTTACTATTGGGGACAGGGTTTTGCCGCCGGTGATAAAGACAGCCATAAGCAGGCCTATACTGCGCAGGTGCTGG [...]
+AGAAAAAGAGATTGCGCAAACGCTTGGGCAACAGGGAACGCTGGTCGGTGAAATTCTCACGCTGCGCGCACAGCAACAGCAGTTAAGCCGCCAGATTGCGGAGGCGGCGGAAAGCATTGCCGCCCAGGCTCACGGTCAGGCCAATAATGCAGCGACATCTGCGGGCGCCACCCAGGCCGGTATTTACGATCTTATCGAAAGCGGTAAAGGGGATCAGGCTGAACGCGCGCTTGACCGATTGATTGATATCGACCTTGAGTATGTGAATCAGATGAATGAGTTGCGGGTCAATGCCCTGCGGTTTAAGCAGCTCATTGTGACCTTAAAAGACGCGCAAGGGCTGAGCGATGCCGAGGAAACCGATGAAAAACTTAATCAGTTGGTTAAAATTTTATCCCGCCGCCAGCAGCGTATAGAAGATCCTACCGTTCGCGCCCAAATCGCCGACGCGCTGGAGAAAATAAACCAGTACACCACGCTGGTTACCCTGTT [...]
+NODE 489 2296 119747 118287 0 0
+CAACGGGCGCTTGGCCTGAGTAGCGCTCTCCAGAGTTTTCGCATAATAGCCCCTGTAATTATATGGTTTAATGCGCAGATCTTATTCCGCAAATATGAACAGCGTCACTGGTCAGGATGAACGGGATACGGCAATATATGAACAGATATGAACAGAAAGAGACCGCGCGCAGGATGTCACATCACATTGTTATTGTTGAGGATGAACCTGTTACTCAGGCCAGATTACAGGCCTATTTTGAGCAGGAGGGGTATCGCGTTTCGGTGACCGACAGCGGCGCGGGCCTGCGTGACATCATGGAGCATGAGCACGTTTCGCTGATCCTGCTGGATATCAACCTCCCCGATGAAAACGGGTTGATGCTGACCAGGGCGCTACGAGAACGCTCCACGGTGGGCATTATTCTGGTGACGGGGCGTTGCGACCAAATCGACCGCATCGTCGGACTGGAGATGGGCGCGGACGACTACGTCACCAAGCCGCTGGAACTGC [...]
+AAGATGGTTAATTTTAAGGCTTTGCGCTTTCAGCATCTTCCCCTGCGCCAGCCAAACGCCCTCACTGTCGGCATTGGTCAGATTTTGCGCAGAAAAGAGCTCGTAAGCGCTGGCTTCGCTTAACTGCCTGGCCATATTCATCGTGGGGAGCAGCGCTTGCGTATTGGTTTGCTCCACCTGACTAATGACGCGCAGGCTTATCCAGCCGATCACGGTACTGAGCAGGGTGAGTGCCGCCATCAGGGCGAAGGCCAGCCATAATCTGCGGGTCAGTGAAGGCGTTGACATTTATGCGCCGCGGGTGAAATGGGTTGAGTTGCCGCCGGAAAAACCATTAGGATAAAACCTTGTTGCTGGTGGGGCTATCATGCGCGCGCTTATTTCGTTCTTTTTTTTGATAATCATCGTCTCGAATGTAGAAACGGCGTCAGCCGAAACCGGACTGCTACACTGGACGCGCGCCGATCGGGCGATTCCCTGGCGGCAAACGTC [...]
+NODE 490 5540 294816 292130 0 0
+GCGTTGCGCCCGGAAGCGCGATTCCTGGAACTGGTGCATCGTCTTGACCGCGATACCTCCGGCGTGCTGTTGGTGGCGAAAAAACGCTCCGCGCTGCGTTCGCTGCATGAGCAACTGCGCGAAAAGGGAATGCAGAAAGATTATCTGGCGCTGGTGCGCGGCCAGTGGCAATCGCACGTTAAAACCGTACAGGCGCCATTATTAAAGAACATTCTGCAAAGCGGCGAACGCATTGTCCGCGTGAGCCAGGAAGGTAAACCGTCAGAAACGCGCTTCAAGGTGGAAGAGCGTTATGCCTTCGCCACGCTGGTGCGCTGTAGCCCGGTCACGGGCCGTACGCATCAGATTCGCGTACATACCCAATATGCCGGTCACCCGATTGCGTTCGACGATCGCTACGGCGACCGTGAGTTTGATCAACAGCTTACCGAAGCGGGAACCGGTCTTAAACGTCTCTTTCTGCACGCCGCGGCGCTGAAGTTCACACATCCG [...]
+GTTATTAGCCGCCAGCGTCTCATCGACAATATGCGCCAGTTCAGTGACCGCCACTTTAAAGACTTCATTACCCGCCATCGTCAGGTAAATCGGGTTATCCGGATTTACACGATCGGCATTCGGCAGGGTCAGTAATTCACCGTAACGGCCATCGGCATGAAGATGAGTGGAGATAATACCCGGTTCTTCAGAAGCGCTCAGTACGGCCGCGCCTGCGCCATCGCCGAAAATAATGATCGTACCGCGATCGCCAGGATCGCAAGTGCGGGCTAATACATCGGAACCGACCACCAGCGCGTGTTTAACCGCGCCGGATTTAACGTACTGGTCGGCGATGCTTAACGCGTAGGTGAAACCTGCGCACGCTGCCGCGACATCAAACGCCGGGCAACCTTTAATACCGAGCATACTTTGAATCTGACATGCCGCGCTTGGAAATGCATGCGTTGCTGATGTGGTAGCCACCACAATCAAGCCAATTTGGTCTTTATC [...]
+NODE 491 407 16985 16985 0 0
+GCAGCACTGGGGCCAGATGGTAAGCCCTCCCGTATCGTAGTTATCTACACGACGGGGAGTCAGGCAACTATGGATGAACGAAATAGACAGATCGCTGAGATAGGTGCCTCACTGATTAAGCATTGGTAACTGTCAGACCAAGTTTACTCATATATACTTTAGATTGATTTAAAACTTCATTTTTAATTTAAAAGGATCTAGGTGAAGATCCTTTTTGATAATCTCATGACCAAAATCCCTTAACGTGAGTTTTCGTTCCACTGAGCGTCAGACCCCTTTTTCAAAATCTGATAGCGTTCAAGACGCTTTGTTTATGAAGCTGGTTGAGATACATTTCCAGAGGTCAATGCAATCGTGGCCGAAGCGCCGCCTCAAACCAACGTTTGTGATACATGCTGATCGGATAT
+CACGATTGCATTGACCTCTGGAAATGTATCTCAACCAGCTTCATAAACAAAGCGTCTTGAACGCTATCAGATTTTGAAAAAGGGGTCTGACGCTCAGTGGAACGAAAACTCACGTTAAGGGATTTTGGTCATGAGATTATCAAAAAGGATCTTCACCTAGATCCTTTTAAATTAAAAATGAAGTTTTAAATCAATCTAAAGTATATATGAGTAAACTTGGTCTGACAGTTACCAATGCTTAATCAGTGAGGCACCTATCTCAGCGATCTGTCTATTTCGTTCATCCATAGTTGCCTGACTCCCCGTCGTGTAGATAACTACGATACGGGAGGGCTTACCATCTGGCCCCAGTGCTGCAATGATACCGCGAGACCCACGCTCACCGGCTCCAGATTTATCAGCAATAA
+NODE 492 127 5865 5865 0 0
+CCAGGGCGATCATCACGACCGCCGGAAGCAAGATCATCATAGATATTGTCCCGTTCGACACCTGCGGCGCGCAAGGCGTCGTGCTGCAGGTCGAGAGACTGCGAGCCATCGGCTTTGGAGACGCGGG
+GCCTTGCGCGCCGCAGGTGTCGAACGGGACAATATCTATGATGATCTTGCTTCCGGCGGTCGTGATGATCGCCCTGGCTGGCACTGTTGCAAAGTTAGCGATGAGGCAGCCTTTTGTCTTATTCAAA
+NODE 493 4064 221589 219154 0 0
+TTTACCATTCCTGACAGCAATACAATAAGAATGAAAACGCCGCGACCAATCCTGATAATAAAAGTCGTCGCTACGTTCTCAGTATGCTAACGTTGACTTTCCCTGATGCCGTGGTAGAAGCAATGAAGACGTTTTTCAGACCCGTGTTGTTTGGCAGCCTGATGGCCTTATGCGCAAATAGCTATGCGCTTACTGAATCCGAAGCTGAAGATATGGCCGATTTAACGGCGGTTTTCGTTTTTCTGAAAAATGACTGTGGTTACCAAAATTTACCCAACAGTCAGATTCGCCGTGCGCTGGTCTTTTTTGCCCAGCAAAATCAGTGGGACCTGAGTAACTACGACACCTTCGATATGAAATCGTTGGGCGAAGACAGCTACCGCGATCTTAGCGGCATCGGTATTCCGGTCGCTAAAAAATGCAAAGCTCTGGCCCGCGATTCTCTGAGCCTGTTAGCCTACGTTAAATAATCCTCCGCGATCCTATTGCTGA [...]
+CCGCGGGCATTGGGCCGGAAATTATTGTTAAAGCGCTAAGCGAAGACGGTCTCAACGGCGCGCCGCTGGTGGTTATTGGATGCCTCGCAACGTTGAAACGTTTACAGGCGAAGGGCATCACGCCGAACGTCGAGTTACGGGCCATTAAACGGGTCGCCGAAGCGCGTTTTGCGCCCGGCATCATTCATGTGATTGATGAGCCGCTGGCGCAGCCGGAGGCGCTGGAGGCCGGGAAAGTTCAGGCGCAGGCGGGGGATTTAGCGTATCGCTGCGTGAAGCGCGCCACCGAGTTAGCGTTACGGGGCGACGTACAGGCTATTGCTACCGCGCCGCTGAATAAAGAGGCGCTGCACCTGGCGGGGCACAACTATCCGGGCCATACCGAGCTGCTCGCGACCCTGACCCATAGCCGCGATTACGCGATGGTACTTTACACCGATAAACTAAAAGTGATTCACGTTTCAACGCATATCGCGCTGCGTAAATTCCTTG [...]
+NODE 494 1778 105824 104920 0 0
+ACAAGGTGGCGCGTATTGCCACCACTATGCCGTATATCCCCGGCTTTCTCTCTTTTCGTGAATATCCTGCGCTGCTGGCGGCGTGGGAACAGCTCTCGCAAAAGCCCGATTTGCTGTTTGTGGACGGTCACGGTATTTCGCATCCGCGTCGGCTTGGCGTCGCCAGTCATTTTGGACTGTTGGTGGACGTGCCGACCATCGGCGTAGCGAAAAAACGGCTATGCGGTAAATTTGAACCACTTTCCGCCGAACCTGGCGCACTTAGCCCCTTAATGGATAAAGGCGAGCAACTGGCGTGGGTATGGCGCAGCAAGGCGCGCTGTAATCCGCTGTTTATCGCGACAGGGCACCGGGTCAGTACTGACAGCGCGCTGGCGTGGGTACAGCGCTGTATGAAAGGGTATCGCCTGCCGGAGCCGACGCGCTGGGCGGATGCCGTCGCTTCCGGGCGTCCGGCGTTTGTTCGTTGGCAAGAAATTCAGCGCTGATTCA [...]
+GGCAAAGCCGCTGGCAGTAAACGGAGGCGGTGAAGCGTTATGACTGCAGGCAGTCAGCAACAGCGCGCCAGAAAACAGAAACGCGCGACGCCAGACGGACAAAAGGGGCTGATAAGCCCCTTCGATAAAACTGTTCACAGTTACGCGTCTTACTTAACTGCGTCTTTCAGAGCTTTACCAGAAACAAACGCCGGTACGTTAGCGGCGGCGATTTTGATTTCTTTACCGGTCTGTGGGTTACGGCCAGTGCGCTCAGCACGGTGGTTCACTTTGAAGGTACCGAAACCAACCAGTTGTACAGCATCGCCTTCTTTCAGAGACTCAGTAATAGCAGCCAGAGTGGATTCCAGAGCAGCTTTAGCCTGGGTTTTGGACAGTTCTGCTTTGTCTGCAATTACATCAATCAGTTGAGTCTTGTTCATAAGTTATCCTTACAATGTGTTTATCGCTTGCTAAGCATCGAGTGCGACGGAAATGCCAGAAAAGCACTCT [...]
+NODE 495 1063 48821 47714 0 0
+CGCTTAAAAAGATGAGCAGGCCGATGAACATTCCCACGCCCGCCAGCGCAAAGCCGACATGCCAGCCATACCACTGCGCCGCCAGACCACAGGCGATCGGCGCGGCTATCGATCCAATATTCCCGGCGGCGTAGAGCAGCGAGAAGCCCCCGTCGCGGCGGTTGTCATCAGGGGCGTAAAGTTCTCCCAGCAGACAGCTAATATTGGATTTAAACAAGCCGTAGCCGCAGATAATAATGGCCAGCGCCGCATATAAACTCAGCGTTGAATCAGATTCTAAGCCCAATACCACATGACCCAGCGTCATCAACAGGGCGCCGGTGATAACCGCCACGCGGTTGCCAAGCAGACGGTCGGCAAGCCAGCCGCCAAGAATAGGGGTAACGTAAACTAAAGAGGCGTAGGCGCTGAAGAGGTTGATCGCGTGGCTGTCATTAAAACCAAGCTGGTGGGTAAGATAAAGGATGAGTAAGGCACGCATGCCGTAAAAGC [...]
+AATATGCGCATCCAGGAACTGGCGCAGAATATTCATAAACTGGTCGAACATCATAATCTGCCGGACTTAATGTACCGTGCGTTTGAAGTGCTGCCGAAAATGGTGATGACGCCGTATACTGCGTTCCAGAAAGAGCTGCATGGCGAAACGGAAGAGGTGTATCTTGAAGAGATGGTTGGACGCGTCAACGCCAACATGATCCTTCCTTACCCTCCGGGAGTGCCGCTGGTGATGCCTGGTGAAATGATCACCGAGGAAAGCCGTCCGGTACTGGAATTCCTGCAAATGCTGTGCGAAATCGGCGCCCACTATCCGGGCTTCGAAACCGATATCCACGGCGCCTATCGTCAGGCAGACGGACGTTACACCGTTAAAGTGCTGAAAGAAAATACGAAATAAGTACCAAAGGGAAGTGGCTTGCCACTTCCCTTTTTTCACGCAGCAAGGAGACTTTATGAAAACACCCTCACAACCGCGCGCGATTTTTTACAT [...]
+NODE 496 51 2972 2972 0 0
+CGCGCAGGTTCAGGTCAAAGGCGCGTTTAAATTCAGTGAGCGCGCGCAGCA
+GTCAAAAACATTCTGCCGGCACTGTACCGCGAAGCGCCTGAGTTTTATGAA
+NODE 497 5334 291696 288120 0 0
+CTTGGCTTTGCGCCCTTTAACCGCGTGCATCTCGACTTAATGGGACTGTACGGCGAAGATGAAACCTGGGGGGCTGGCGCGCAGCTTACGATGACATTCTGAGGCGTTTTCACCGGAGGCGCTACGCCTCCGGTTTAGCGTTATGCTATAGTGACGCCCCTTTTTTAACCGGATGCTTATTTATTCGCCATGCAGCCTGAAACCCAGTCCTCCGCTTTACCTGCTTATCGCTTCTCCATCGCGCCTATGCTCGACTGGACGGACAGACATTGCCGCTATTTCCTGCGTTTGCTGTCTCGCCAGACGCTGCTCTACACCGAAATGGTGACCACGGGCGCAATTATTCACGGTAAGGGTGACTATCTGGCTTACAGCGAAGAAGAGCATCCGGTCGCTCTACAGCTTGGTGGAAGCGATCCGGCTCAGCTTGCGCATTGTGCAAAGCTGGCGGAAGCGCGTGGCTACGATGAAATTAACCTCAACGTGGGGTGC [...]
+TTTTGTCATTTCAGCGATACGTTCAACCGGCAGACCTTCGCCCCATAAGACCACCGGATCGCCCGCGTTATCCTGCGCGTTTGGCCCCAAATCCACGCAAATCATATCCATCGCCACCCGCCCGACAATCGGGACTTCACGACCATTGACCAGTACTGGCGTACCGGAAGGCGCCGCTCGTGGGTAGCCATCGCCATAACCCATCGCCACCACGCCCAGGCGCGTGTCGCGCTCACTCACCCATGTCCCGCCGTAGCCCACCGGTTCGCCCGCTTTGTGGTCACGCACCGCGATCAAACTGGAGGTTAAAGACATCACCGGCTGAAAACCAAAATCCGGCCCCCAGGGTTTGTGTTCCAGCGGCGATACGCCATACAAAATGATGCCCGGACGCGCCCAGTCAAAGTGAGACTGCGGCCACAGCAGAATACCGCCAGACGCGGCAATAGAGCGCTGACCGGGTTTACCCCGACAGAAGGCATTAAAAATGTC [...]
+NODE 498 970 41458 41244 0 0
+CTGTTCGGCCACGTTAAGGGGGCGTTTACCGGCGCGAGAGAGGAGCGTGCAGGGCTGCTGCGCAGCGCCGACGGCGGCATGTTGTTTCTTGACGAAGTGGGAGAGCTGGGCGCGGATGAACAGGCCATGTTGCTGAAAGCCATTGAAGAGAAACGCTTTTATCCTTTCGGCAGCGACCAGCAGGTCAGCAGCGATTTCCAGTTGATTGCCGGCACGGTGCGCGACCTGCGCCAGCGAGTGGCGGAGGGGACATTCCGCGAAGACCTGTACGCGCGCATTAATCTCTGGACCTTCGAACTACCGGGCCTGCGTCAGCGCCAGGAAGATATTGAACCAAACCTTGACTACGAACTGGAACGCCACGCGGCGCTAACCGGCGACAGCGTGCGTTTTAATACCGAAGCGCGCCGCGCCTGGCTGAGCTTCGCCACCTCGCCGCAGGCCGCCTGGCGCGGTAACTTCCGCGAACTCTCCGCCAGCGTCACCCGCATG [...]
+ATGGTAAACATGGGCAGCATTAGTATGGTCGATGCGGTCTACACCGATACCCTGCCGCCGCCGGGCGTGATGCAGGTGTTGACGGAGAACCATATCCAACTGGAGCTGTGTTAATTCTGTAAAACTTCCCACGTCAGCCCAAAACGCGCCAGGTACTTACGCAGCCGGTCAGCGTCATTCACCGTGGCTTTCCCCTGACGGGAAACGTTGAATAGCTGCCGCCCGGCGTCGGAAAGGGTTTTCGCCTGGCGGCAGACGGCAACGACGTTTTCCAGTTGCATACGGTCAAACAGATCCAGCGCCGTTGCGTCAATGCCCGGCAGTCCGTCGAGCGCGGAGGGGCGATGGTCATTCCAGCTATAGCGCAAACGCGCGATTTCATCGTCTACCGTTTCGACCGTGATTCGCCCGTTGTCCGCCAGCGTCGCCATGCGGGTGACGCTGGCGGAGAGTTCGCGGAAGTTACCGCGCCAGGCGGCCTGCGGCGAGGTG [...]
+NODE 499 12664 715286 709117 0 0
+GATCTTTTTTGGAGGAGGAGAGTGCGCCGATGCCTGCGCCGACCAGCGATCCAATACCCGCACCAATGCCGGATTTACCTGCTTCGCGTTCGCCGGTGTAAGGGTTTGTTGTGCAGCCAGATACTGCCAGGGCGCCGCTCACGATGGCAGCAATCACAAATACACGTTTTTTCATCTTAAATCCTTATCACTTTTTTATTTTTACCACAGCGACCGTGGCGGTTGATTATGACGTCTGCACATGAAGAAAATTCCAGGGAAAACTCTGAAATTTGTAAGTAACATTGATCGGCAAAATAAATAATCCCAATAATTCAGGAGCGAACCTTGACCCACGCACCATCGCGTCATTCGGTATTGACCGCCGCACACTGGGGGCCAGTCCGCGTTGAAACCGACGGAGAACGCATTTTTGCCTCGTATGGCGAACTCCCGACGGCACACCAGAACTCCCTGCAAACCGTTGTGCATGACCAGGTGCACAGTAAAACG [...]
+CGATACAAAAAACCCTGCTCGTTGAGCAGGGTTTCTGAATTTGGTCGGTGATAGAGGATTCGAACCTCCGACCCCTTCGTCCCGAACGAAGTGCGCTACCAGGCTGCGCCAATCACCGAATGCGGGCGCATCTTACTGCTCAGGCGCACGCCCGTCAATCCCTTAGTCGCAAAATACAATTCAATCGGCGAGAAAGTCGGCAGACAACCTACTTCGCGGCGACTTTCTGCGCATCAGGAATATGGCACCAGTTGTTGTTCTGGTTAATGCCGCCATCCGGCGATGTATACCCCAGGCAGCCCATTATCGTATCGTACAGCTCCACATGACGACGCGGCACTTTGATCTCCGCCTGCTGTTTCAGGTGAGCGAACATCTGCGCATGTTGCGGACTGGCAAGATATTTATCCGACATCCATACCAGCATCGGAACGCGGAATTGCTCCGGCGGCGCCATATTGCGCGGCGTACCGTGCAAATGTTCGCGTTCGT [...]
+NODE 500 11653 627489 622153 0 0
+CGCGACGTAAATACGAAAGTGCTCAAACAGGACAAAGCAAAGATCCCTTTCCGGCGCGCAGCTCATTGCGTGATGCAGGCGCGCTTTCGAGAGGGTGATCCCCTGAACCAGCGAGTTGCAGTAAATATGCCACTGGTCCTGTAGGCGACGATGCCGTTGCGCGATGTAATCGGCCTTTTCGCTTATTTCCCAAATAGTCATGTCAGGTTACCCGTTTAACAGAGATGCCTGCGTTAAGCATTTTCCATGCCAACTTTTAACTTATTGTTTTTAATGGCAGACGAGCGCAGTTACTGCCGTTTCGACGCGGTGACGACATGTCATTTCGTCATCGTCGACATTAACCTGCCAGGGGATAAAAATATTGGCATAAATATTGCTTTACAGGGGCAACCACTACGGGAGGCGATATGCACGAAATCACCCTCTGCCAACGGGCACTGGAATTGATTGAACAACAGGCTTCAGCATACGGTGCAAAACGTGTGACAG [...]
+ATTGCGGTAGGAATGCATTAAAATATTTTTTATCATTTATGACCATGTGTTGAGCTTTTATTATAAAAAAGATTTTTTGAGTAGTAATTCGTATATATAATCATCTGGAGGTGATTGGTTGCCTGGCTCAATCATTGAGGCATATTTTTGCGGGCAATATATTGAATCTGAAAAGTTAAAGATGATATTTTCGGTGCAGGAGCTATCATGTGGAGGGAAAAGTATGCTAAGTCCTACGGCTCGTAATATGGGGGCGAGTTTATCGCCTCAGCCTGACGTCAGCGGGGAGCTAAACACCGAAGCATTGACCTGTATTGTTGAGCGTCTGGAAAGTGAAATTATAGATGGCAGCTGGATTCATATCAGTTACGAGGAAACCGATCTCGAAATGATGCCTTTTCTTGTTGCACAGGCCAATAAGAAGTATCCAGAGTTAAATCTTAAATTTGTTATGTCAGTCCATGAGCTTGTTTCCTCTATAAAGGAGACCAG [...]
+NODE 501 914 36502 36381 0 0
+GATGGCGCCGAAATTCTGATCGATCGTGGTTGGGATATGGCGAAAGGCGAAGTGAATTTCGACGATGCTGGCAACCAACAACATCGTCCCCGCCGACTCACGCCGAGAGAGTGCGCGCGTTTAATGGGATTTGAGGCGCCGCAAACGTACCAGTTCAGGATACCTGTCTCGGATACGCAGGCCTATCGCCAGTTTGGCAACTCCGTGGTGGTGCCGGTATTTGCCGCGGTAGCAAAGCTGCTGGAACCCAAAATTCACCAGGCGGTGACGCTGCGTCAGAGAGAGACGGTAGATGGCGGACGTTCACGATAAAGCCACGCGCAGTAAAAATATGCGCGCGATAGCAACCCGCGATACGGCTATTGAAAAACGTCTTGCCGGCCTGCTAAGCGCGCAGGGGATTACGTTTCATACTCAGGACGCGACATTACCGGGCAAGCCGGACTTTGTGGTGAATGACTATGATTGTGTGATTTTTACTCACGGCTGCTT [...]
+GGGCCGCGCTGGGTGTGATTGTGTTTGCCGTAGTGCTGGTGACTCTGGGTAAGTACCTGTTTCCTGTCAAGGCGGTGGTCACGCCGTGTAAAACGGAAGATTCACGCCAGTAGATGAATCCCCTGGGTGTCGATCTGCGCGCTGGCGCCGCCGCCGCAGATCCACTCTTCCAGGCGCTCCGCCAACGCCGCGTCGCTCAATTTCGCTCGCCCGCGCAAGGCGCACTCCCAGACGATCAGCACCCGCCAGCCAAGCGCCTGTAAACGCTGAATATCGCGCTCATCGCGCTCAACGTTCTTACCGATTTTTTCCAGCCAGAAAGCCGTCCGCGTGGCCGGTACTTTGAACAGATAACAGTGGTGATGATGCCAAAAGCAGCCGTGAGTAAAAATCACACAATCATAGTCATTCACCACAAAGTCCGGCTTGCCCGGTAATGTCGCGTCCTGAGTATGAAACGTAATCCCCTGCGCGCTTAGCAGGCCGGCAAGA [...]
+NODE 502 8018 417195 412407 0 0
+TAAACTGCTACGAGAGAAAGATAAAAAGCCCAGCGCCCGGTTCGGCAACATCACACACTGGGTTACGCCTCTGCGTAATCCGAAACGCTGGGCGGCATCCCACATCGCCTGCGCTTCATGAAATAGCACGTCATCCCAATGTAAATGACCCTGCCTGAAATTTTCCGGCTTTAATACCGGATCGATCGCGAAATAGTTTTCGGACTGGTAATGCGTTACCCACGCCGGAGGATAAGTGGTACGAAGCGATATTTTAGGCCGGGTAAAGGGGACGGGATGACGAACACACAGGGCATAATAATCAAATTCCAGCCGCTGTGTCTGATATTGCAATTCAGTATAAACATCCTCTGCTGCCGCCATCTCCTGAAAGCGTAACAACATTGCGCGTCGCCAGGTGAAGAAATCATTTTCCTGCATATTTTATGGTCACGCCTTTGATATTGATAATCATTATTATGAATGACTTAAATTAACACATAAATAGTGTTT [...]
+TCTGGATACGCTGAATGTTCAACAAAAATATAAGGTCAGCGATACGGCTGCAACTGTTACAGGATATGCCGATACTGCGATTGCTTTAGACAATAGTACTTTTAAAGCCTCGGCTACTGGTCTTGGTGGTACTGACCAGAAAATTGATGGCGATTTAAAATTTGATGATACGACTGGAAAATATTACGCCAAAGTTACCGTTACGGGGGGAACTGGTAAAGATGGCTATTATGAAGTTTCCGTTGATAAGACGAACGGTGAGGTGACTCTTGCTGGCGGTGCGACTTCCCCGCTTACAGGTGGACTACCTGCGACAGCAACTGAGGATGTGAAAAATGTACAAGTTGCAAATGCTGATTTGACAGAGGCTAAAGCCGCATTGACAGCAGCAGGTGTTACCGGCACAGCATCTGTTGTTAAGATGTCTTATACTGATAATAACGGTAAAACTATTGATGGTGGTTTAGCAGTTAAGGTAGGCGATGATTACTA [...]
+NODE 503 1299 58036 57944 0 0
+GCAATCCAGGCGGTAGGATCGGCGATAGCCACCGTAAGCTGGAGTCTGCCGTCCGCTAATTCCTCAGCATAAAGCGCGTCATCCATATCTTCAGTGCTGGCGCTATCGATAGTGACGAAATTCAGCGCGGTAAGATCCTGGCGCTCCAGCCCTTCGTCCAGCATCTCCGTCGCTACGCCGTTCGGCGCTTCTTTTTCCAGGTTGTGGCGGGCAAGCGTAACCCACCAGGGAACAAAGTGATCGTCGGCAAAGGTGATGTACTGCGTTAAATCGGCGTAAAACGAACGGTCGCCTTTAAGCGGATGGCGGCGCATTTCGGCAACCGCCCAGTCACCTTCTTTGAACTCATGCTGAACGCCGCGCGCGGCGCGGCAGGGAATCGCGTCTTTCAGCAACGGATGATCCGGCACGATGGACAGGCGGTCATTTTTACCCTGAACTTTTCCCACAAAACGCGTCAGGAACGGTTCGATCAGTTCTTCCGGCTCGGCA [...]
+AGTTCGGCGGCAATATTCGTCTTCACAATGCCAAATGATGGCGCCGGTACTCATCCGCGATCCGTCTTCATTCGCGTTACTCGAACGCATACTGACCAGCACATTACACACCTCGTCGCCCCCTTCTTTACTTCCACTTATCACGCTCCTCACATCACGTATCAACGGCAGCGCCGCCTGCTTTAACGAACAGGCAACCCAACCTGGCGCGTGGCGCCGCGCTGTTATCACGTTACGCCAGGAAGACGACGATATCGCTCGTTGGGAGCTTGAGCCTGCGCTGACACAGGCGATACAATGGCTCACCAGAGCGCCCGATCGCTTTAGCGCCGCGCATTTTTTCCCGCTACTCACCAGGGGAGTTTCATCGGAGCAGGCCATTAATATGTTAGGCTGGTGCGGCGTGTGCGGATGGTTAAATCGTTTAAAAATCGCGTTGGGCGAAACCTATTAACTCATCCATTACAGAAAGAGCGCTTGCTGCGCCAGGCA [...]
+NODE 504 51 1883 1273 0 0
+GCCACGTTACAGGGACAACTGCTGTTAAGCGGAAAACCGCCGCTCAATCTG
+CTGGCGAGACGTTTGCCAGATGCTGCTCTGGTACATGCCAGCTCTCTCCCG
+NODE 505 22 6373 708 0 0
+TCAAGCCTGCCAGTTTCGAATG
+TGTAGCGGTGAAATGCGTAGAG
+NODE 506 9971 582354 578453 0 0
+CGGTGGTTGCACCAGTCAGGGAAAAATATTCAATCGTCGATGAACCAAAGCAGACAATGAAGTCTCGCCATGTGCCGATACCGATGATGCCGTCCGGCTGCGATTCTGCGCGATATTGTGCGCTGTATCGGTCAGGATGCGATTCGTCTTCAAGGTCAGTGATAAACCATGAATCAGTGCCGTCTTTTGACCACGCATAACGCCCACGTAAGCGAGTAATGTCACGGACTGAACCTAACTCATACTGCGTGAATCCGCTGTCTGCAGGCCAGTTTGCCATCGTCTTAACGGCGCCATCGTATCGGTACTCGATGAGCTGACCGTTCACACCTACCGCCTGAGAAGTACGACCGTGAGCAAGAGATACGCGGCCTGCCCCGGCAACGTCTCCGACTACGGTTTCGCCTTTGTAGAGCTTCCCACCACAGACGCGATATACGGCGTTCTGAGCGGTATTGTATTCAACACCACGCGATACACCATTTACATCGT [...]
+GTAATGCGGGGCTTTTTTGTGTCCGCAGTAAACGCGCATCGCACGCGCGACTTCTGAACACAGAACCTTTCAGGATGACCCTTGAGGATGCTGGTTTGGTGATCGGTGCCTTTCTGTGGGCCGGAATCCTGTGTGACAAGGTTCATCACTTAAAGGTAACTACCGATGCAATTAGTTGAAATCAAGAAGCTCGACTTGGTCACTAACTCCGCTGTAATCGCTACTGGCGTCAAAAAGGATCACAAGCCTGTGATTCAGCTCATCAGGAAGTACAAAAGCGACCTCGAAGAGTTCGGAAGGGTGGAATTTGAAATGCGACCCTTTCAAACGGATGGGGGCATGCAGAAGCAGGAAATAGCACTGTTAAACGAACAGCAAACCACGCTGTTGATCACATACATGCGAAACAATGAAGTTGTGCGTGAATTCAAAAAGCGCCTGGTAGCTGAATTCTTCACTATGCGTAGCGCGCTGGCGAAAAAGAAAATGGAT [...]
+NODE 507 483 25161 25051 0 0
+CGCGCCGGGCGCGCGGGCAAACAGGGCGAAGTGGTGCTCCAAACGCACCATCCTGAGCATCCCCTGCTGCAAACGTTACTGTATAAAGGCTATGATGCGTTTGCGGAGCAGGCGCTGGCGGAACGGCAAACGCTCCAGCTTCCGCCGTGGACCAGCCACGTCATTATTCGCGCAGAGGATCATAACAATCAGCAGGCGCCCGTCTTTCTCCAACAGTTGCGTAATCTGATTCAGGCCAGCCCGCTATCAGACGATAAGCTGTGGATCTTAGGTCCGGTTCCGGCCCTCGCGCCAAAACGCGGCGGCCGCTATCGCTGGCAAATTTTACTTCAGCATCCTTCACGGATTCGCCTGCAACACATCATCAGCGGCACGCTGGCGTTGATCAATACGCTCCCGGAAGCGCGGAAAGTTAAATGGGTTCTGGACGTCGATCCGATTGAAGGATAGTCCTCACGATGCGAGGCGGATCGTAAAATTAAA
+CGACGTCCAGAACCCATTTAACTTTCCGCGCTTCCGGGAGCGTATTGATCAACGCCAGCGTGCCGCTGATGATGTGTTGCAGGCGAATCCGTGAAGGATGCTGAAGTAAAATTTGCCAGCGATAGCGGCCGCCGCGTTTTGGCGCGAGGGCCGGAACCGGACCTAAGATCCACAGCTTATCGTCTGATAGCGGGCTGGCCTGAATCAGATTACGCAACTGTTGGAGAAAGACGGGCGCCTGCTGATTGTTATGATCCTCTGCGCGAATAATGACGTGGCTGGTCCACGGCGGAAGCTGGAGCGTTTGCCGTTCCGCCAGCGCCTGCTCCGCAAACGCATCATAGCCTTTATACAGTAACGTTTGCAGCAGGGGATGCTCAGGATGGTGCGTTTGGAGCACCACTTCGCCCTGTTTGCCCGCGCGCCCGGCGCGGCCGGAAACCTGAGTGTAGAGCTGGGCGAAGCGTTCCGCCGAACGAAAAT
+NODE 508 51 1954 1836 0 0
+AAAGCCCATCCCAATGCAATGAGTATCGCCTGCGGCTTTTGCGCCAGGTAG
+TAAAAGGCGACGGCTCGTTGATAAAAGAATATACCGTCGTTGCCTTGCAGG
+NODE 509 32 1749 1749 0 0
+TGCGTCAGGCCACCGACAGCGCGCTGCGTGGC
+TCACGCTAAACAGATATTTCTGCGGATCGGTG
+NODE 510 13685 717140 709596 0 0
+ACGCAACTCGCCGGGCGTTTGCGCGCCGCGCAGCAGCAGCGTAGTGACGAGCGCCACTTCCGCCGCGCTAAGTTTCAGATCGCCAAATTCGGAATTACAGAAACGCTGTTCATATTTGGTGACGCGATTGCCAAACCCGCTGACCGTACGCAAAAAGTGGCGTTTCACCAGGTTATCGAGCTGTTCTTGTACCTCTTGTTCCGTCAGGTTCATCACCGGTTCACGGTTGGTTTTCTGATTACAGGCTGTCACCACCCCGTTGACGGAAAGCGGATACTGTTCCGGCGTTGTCACCTGCTTTTCCAGCAGACAGCCAATCACTCGCGCTTCAGTGGCGGTTAATTCATATTTCATCGTTTTCTCCCTTTGCCTCTCATTCCGTAAGCCGCTCAACGCCCCGGCGTCCATAACGGCGTGGTTAACGCCGTCAGGACATGGTCGCGCCATTGTCCATCAATCAACAGGTAATCTTTCGCATAGCCTTCTTTTTCA [...]
+CCTCGGCTGGGAAGTGGTCTGGAACTCACCGCAACGCGACGATGATTCTACGCCGTGGGGAGAAGCCTTTATGCGTCACGGCTCTCAACTGCTGCTGGGGCTGGTCTGGGCGGTGGGTATGGCGTGGCTGGATTTACGCTTTCTGTTCTGGCTGGCGCCGATTGTCTTTTCGCTGATTCTGTCGCCATTTGTTTCGGTGATCTCCAGTCGTTCAACGGTAGGATTACGCACCAAACGCTGGAAGCTGTTCCTGATCCCGGAAGAGTATTCGCCGCCTCAGGTGTTGGTCGATACCGATAAATATCTGGAGATGAATCGCCGCCGTATTCTGGACGATGGCTTTATGCATGCGGTATTTAACCCGTCGCTTAATGCGCTGGCGACCGCGATGGCCACCGCGCGTCACCGCGCCAGTAAGGTGCTGGAAATAGCCCGCGATCGTCATGTGGAGCAGGCGCTAAACGAAACGCCGGAGAAACTGAACCGCGATCG [...]
+NODE 511 2829 173291 170911 0 0
+CGTTCCGTTTGTACCAGCCAGCCGTTTTCGCGCATCTCCCGATAGCTTTCGGTACGGTTATCCACCGTCGGCCAGACGGAGACCATCAGCTCAATTCCCAGCGATTTCAGCTCGGCAATCATGGCGTCAGGATCGGGCCAGTCGCGCGCATCGAACATCCAGTCACCCTGATTCGGCCAGTGAAAGAAGTCGATTACGATCACTGAGATAGGCAGATTGCGGCGCTTATATTCGCGGGCGACCTCCAGCAGCTCTTCCTGCGTACGATAACGGAGTTTGCACTGCCAGAAGCCCATGGCGTAGTCCGGCATCATCGGCGGTGTGCCGGTAGCCAGCGCGTAAGCCCGACTAATTTCTGCCGGGGTATCGCCAGCCGTGATCCAGTAGTCCAGCTGTTCGCTGACCTGCGCTTCCCATTCGGTAACGTTTTGGGCAAAGGTTACGCGTCCGACTGCCGGGTTGTTCCATAAAAATCCGTAGCCCAGACTGGAG [...]
+ACCAGCCTATTTTTTCAGCTCCCCCTCCCTTAGTCACGTAATACTTGAAAGTTATTTTCTTTCACTGTTTTCCTTTTCTTATTTCATTACTGAAAAAACTGTGACCACCTTAGCAAATAAAAACATCGCTCATTCAAAAACTAATAAACGCAATCCTGATGTAAGATTTAATAATTGATTGATGCCGTCGGGTTAACTACTTTTCATGTACACCTTACTTACTCATTTTAATCTGAGGTTAAATTCAGAAACGACATAAAAATAATATTCAAAACTTGCTTAGAAAGTAGAGGTTGTTTTTCTGGGCGTATCGTACCAATATCGGAGTTATCATTATGAGTTCTGTCATTGAGGATACCCAGCCTTCCGGGTCAGCATCATTGTCTTTACTACAGCGTATTAGCTACGGCTCTTTGGATGTGGCGGGTAATCTGCTGTACTGCTTCGGTTCAACGTACATTTTATATTTCTACACAGACGTTGCGGGCATTA [...]
+NODE 512 53 2602 2357 0 0
+ACGCTCGTAGCCGCCATAAACCGACCATGACAGGTCGCTGTTTTCACCGCTAC
+CGTTATCGCAATAGTAATAGCGATAGCAGCGCGCCAACGACGTTTGGCGGTAA
+NODE 513 32 1432 1321 0 0
+AACCTTTGATGTGACCGTTCTGGAATACGCTA
+ACCAGCGAACGGCTATTTTGCTGCGTATGCAG
+NODE 514 854 47654 47330 0 0
+CGCCGATTATCGAAGTTCACGCCTCCGCTGGCGATAACTACCTCGGCGGCGAAGATTTCACGCATTTGTTGCTTGATGAAGTGCTGAAACGCTGGAACCTCGATAAATCAGCGCTGACGGATAGCGATCTGGCTGCGCTGTATGCCTGTGTTGAAGCCGCAAAATGCGCCAGCAGCTCCCCGCTGCGCATGAGCTGGCTTTATCAGGAGAGCGTTCTGGAAAGCACGTTTTATGACGATGAGCTGGAAGCCCTGTGGCTACCGTTGCTCAACCGGCTGCGCACGCCCATTGAGCAGGCGCTGCGCGACTCCCGACTCAAACCGGAGCAAATTGACAGCCTGGTGCTGGTCGGCGGCGCGTCACAGATGCCGCTGGTGCAACGCATCGCGGTGCGCTTATTCGGTAAATTGCCCTATCAAAGTTACGATCCCAGCACCATCGTGGCGCTTGGCGCCGCAACTCAGGCCGCCTGTCGCCTGCGCCATGAAGACG [...]
+CGTCAACTTCCAGCAGGCCATTAATATCGTAGCTAAAACGAATATCAATGGCCTGAATGTGCCCGTTCGGCTTCAGCATGACGTCAAAAGAATCGATCAGGATATTATTTTTCACCTTATGGCTTTCGCCCTGGTATACCCTGACGCAAATAGAGTCCTGCTCAGGGTGCATGGTGGAGTACGTTTCCACTTTTGACACCGGAACGGTGGTATTGCGTTCAATGATGGGCGAGAAAATACCAGGCACTCCCTGTCGGTTGACTTCCACGCCCAGCGAGTAGGGGCAGATATCCGTGAGGATCACCTCTTCAACGTCTTCATGGCGCAGGCGACAGGCGGCCTGAGTTGCGGCGCCAAGCGCCACGATGGTGCTGGGATCGTAACTTTGATAGGGCAATTTACCGAATAAGCGCACCGCGATGCGTTGCACCAGCGGCATCTGTGACGCGCCGCCGACCAGCACCAGGCTGTCAATTTGCTCCGGTTTGAGTC [...]
+NODE 515 2392 112012 111157 0 0
+CGCCGATAGACGGTATCGATCATCCAAAAGCATTGACCTACCTGGAGGTATTGCGCGATAAGGCGCCGGTTGGTAAGCGAGTGGCGATCATCGGCTGCGGCGGGATCGGTTTTGACACGGCCATGTATCTGAGCCAGCACGGCGAATCCACCAGCCAAAATATTGCTGAATTTTGTACGGAATGGGGAATTGATACCAGCCTGCAACAGGCAGGCGGTCTGCGCCCGGAAGGCCCACGCCTGGCACGTAGTCCACGGCAAATCGTCATGCTGCAACGCAAAGCCAGCAAGCCGGGCGAAGGATTAGGTAAAACCACCGGCTGGATCCATCGCGCGACGTTACTGGCGCGCGGCGTGAAGATGATCCCGGCGGTCAGTTACCAGAAGATCGACGACGACGGATTACATCTCTTGATCGGCGGCGAACCGCAGTTGCTGGAAGTGGATCATGTGGTGATCTGCGCCGGACAGGAACCTCGCCGCGAGCTGGCGG [...]
+CGGCTCCATATGGCAGCAGAGCTGATAAAACGCTTTGTTATGATCTTTCTCTTTCAGGTGCGCCAGCTCGTGAACCACAATCATCCGTAAGAATGGCTCCGGGGCGTTGCGAAACACGGTGGCGACGCGGATCTCCGCCTTTGCCTTGAGCTTGCCGCCCTGAACGCGCGAGACAGCGGTATGCAGTCCCAGCGCATTTTTCAGCACATGGATCTTGCTGTCATACATCACTTTATTGATGGGCGGCGCATTGCGCAGAAACTGACTTTTCAGTTCCTGAGTATAGTGATATAGCGCTTTGTCAGTGGCGTAATCATGCGCGCCGGGATAACGTTTTTCCAGCACCGCTCCCAGGCGCTGCTCGGCGATTAAGGCGCGCACCTGGGCAAGGAGATGTTCCGGATACCCCTGAAGGTAAGTTAGTGAGGTCATCAAAGCTCCATGTTGCTGATAAAAAGTGTATACTCACGCACCCTTTTCAGGGATAACGCC [...]
+NODE 516 7386 419853 415571 0 0
+GTCGCGCACAAGCTGCACGGCCTTCATCAGCGTTTCATAGGACGGGTTCGGTTCAATACCGCCAAACTCCCGAACATCCAGTCCTTTTAACGCTTCCTGAACTTGCGCCAGTACGCCGGTCTTTTTCACGCTACCGCCGCCATAGGTAATCAGCACGCGGGCGTCCTGCGGGATTTGATCGCGAAGATCGACGATAGCGCCTTTACCAAACAGAATGCGGGTAGGGGTATGTAATTTGAAATTGTTCATTGCTCATTCCCTTATGTGGGTAAAAAGAGGGCAGGCGGCTGTCTGCCTGATGGTCATCATTGTGGCCTTGTGAGGGATGTCTCTCAATGCACATTTCTGCCAATGTTTTGCCTATTTCTCCAGAATGCTGGAGAAAATCGCTAAAAATGCGCACAATCCAGCGGAGTGGATTTGATGAAAAAATGGCGCGTTATGAATCGTGAAGCAATTTGCTTACAGTTGGCGGATAAAATTAATCATTTA [...]
+AAATCTCATCCGGTTTAACCTGTGGGCGCTGATATTCCGGCCATACCAGCGCGACCAACGCCGGGTAGGCTTCAAGACTGAACTCACGAAAACACTGGCGTAAATTAAGGACGTCCAAATCCGAATACGGCACCTTTTCTCCGTTCAGACAACGCTTCTTAATATTGTCGTAATACTTATAAACGGCAGAGTTAAGGTCGCTGCAACGACGCTGTGCGTCAAATAATCCAGGCGTTTCATTCAACTCAGTCATTGTCATTCGTTTTATCGTTGCATGAAGGAAATCGATATATTCATGGTTAACGCGCCAGTACCATACCGGCGTTATCGAATTCATTAATACTGAGAAATGATCTTCGCCCTCTTCCTTTGTCATGGGTTCAGTTTGATTTAAATTTACGACTTTTCCACCAGGACGTTTTTTATTAACCTCCCACATCAGGAAGAGTATCGCGCCGGTCAGTAATAGCAATATAATAACAGAATAAAAAA [...]
+NODE 517 5006 297269 295919 0 0
+CCTTGCGCAGCGGTACGCATATGAACCGGCGCTTTTTTATCGACATAAATGTAGGCGGTGACGTAGTAGAAATCGTAACTCACGCCGTGTAGCAAAATACCGAGGAACAGCAGGGCATAAGTGAAGTACGTTTCCGCACCGCCATAGACAAAAAAGCCGTAGCGGATCGCAGCGGTAATAAGACCAAGTAATAATACCTTTTTAATACCAAAGCGCTTAGTGAAAAAGGGCAGAGCCAGCATAAAGAAGATTTCAGAGAACTGGCCGAGCGTCATCCAGCCGGTGGCGTTCTTCATTCCCACTTCTGTCAGGTAGCCGTTAGCGAAGATGTAGTAGAAGGCCAGCGGCATCGCAAACAGGAAGGAACAGAAGAAGAAAACGAGAAAGTTTTTATCGCGCAGCAGGACCAGCGCATCCAGCCCCAGCATCACTTTAATATCCATCTTGCCGGTGCTTTTTGGCGGCGTGTCTGGCAGACAGAACGCAAATACG [...]
+GCGAGCATCCAGCATTAATAAAAGGACTCGATATTATGCACAGTAAACCTTATGGCGATCCCTATAATGACTGGCTCAGTAAAGGGTTGAGGCATTATTTTGGCGGTTCTCATATACAAGATTATGACGCATTTTGCGATTTCATTGAATTTAAACACGAAAATATCATTATGAACACAAGCAGTTTAACTGCCAGTTCTTGGAGGTAATCATGATAGCCTTGTTTTACACGCTCTTCCCACCGTCACGTATAATCGGTATCCAGAGTTATTCCTTTATCCTGTAAAATGTGATACAGATTCTCCATTGATCTAATAACCACCTCAATTTCACATTCAAGTTTCTCTACAGAACTTTCATTGAGTGAGAAGTTGAGAGCCAGTAATAATGATTGTGAGTTATTATCATAACACAAATGTGGTCCATTATTCTCTGCAAACCATAAATTAGCATTGAGAAATTCAAAAGCAAGATTATTATTATCCGGAGGTC [...]
+NODE 518 51 1966 1966 0 0
+ACAGCAATATGGCGCTCTATAAATCGCGCAAACTAAGCGTACAAACGCCGC
+TATTTTATTCCCGGCCACAGGCGTCGCGACAACTTCATGGTACAGATCCAC
+NODE 519 51 1884 1884 0 0
+ATAATATCAATCAGCAAGGCGGCGGTGATATAGCAATCATAAAGCGCCCGG
+TGCGAACCACCGGCTGGACCGCGGAAGAAATGGTCAATATCACGGGCCGCC
+NODE 520 66 2555 2555 0 0
+TGATGATGCAGCCCCGGCGGCGTTTGTACGCTTAGTTTGCGCGATTTATAGAGCGCCATATTGCTG
+CGGGGCTGCATCATCACCGGGCGCTTTATGATTGCTATATCACCGCCGCCTTGCTGATTGATATTA
+NODE 521 6589 371126 368158 0 0
+GCTGCTTTCATTATATGAACAGCTAAAAAGCTATGTGCTGTCACTCAGTGATGAGGTTCAGTTTAAAGAGCTTAAGCTCTATGACGCCTTCCGCCTCATTCGCAACTTTCTGTGCGTAGCCGTTTATCCCGTGACCGACCCACACCTACGCCTGTGGCTGAAAATCAATCCACAGCATATCCAGCTTGAAGAAGGATTTAGCCGGGACGTCACGCATATTGGCCACTGGGGAACCGGCGACGTCGAATTGATTGTGCGTAACGAACACGATCTGGATAAAGCCAAGCTGCTGATCGAGAAAGCCTGGCAGGAAAATTAGCGTTCCAGGATACCCGCCTACTGGAGAGGTTAAGATAAGATTATCCAGCCTTTCCAGTTTTACTGGCTCTTATCTGTTATTCCACATCCTTCCTTTCCAACCCAATATCCCTTAACTGCTCGTCACTCATTCGTCGCAGCGCCTGACAGGCCCGCTTACGCAGCCACCACCTT [...]
+GGAATGCCGGATTGTTGTTGTAAATGATAATAAAAAGTAAAATTAATGTTTCAAATTTGCAAGAAAAGAAAGTGAAGCGCAGGCGAATAACGGATTGAGAAGAGGGGCATCGGTGGGAAATGGCATTAAATTAATGCCTCCCGCGTGCGGGGTTTGGCAGTTAATCTGAACGAGAATTGCGCCTTCCCCTTCTTAAATACTGAGCAGTGCCGGTATTTGTGACAGTAAATATAACACCAGACCGATAGCGCCGCCGACCAGCGTGCCGTTCACGCGGATAAACTGCAAATCTTTACCGATATTAAGCTCAATCTGCTGCGACATATCGCGCGCATCCCAGCCTTTTACGGTATCGCTGATGTGGCGCGTCAGGAAGGCGGCGAATTCCGGCGCGACCCGGTGCGCGGCCTGTTCCAGATGACCGTTAAGCGAGGCGCGTAATGCGTCGTCGGCGATCAGCGTCTCGCCAAACCATTGTCCGGCATGAGCGAT [...]
+NODE 522 2323 118114 114359 0 0
+AGCGAGCATGGCTGGATAGACGTGGTTGAATCATTGACATCATAATCCCTTTCTCTTATCTGCGATGGGAACGACATCGTGAGCCGGATAAGGCCGCTATGCCATTATCCGGCAATATTATCTGCTTTTTTGTCCAGCCAATTGTACTGAATACAAAGTAATACGTGCGTTAATTCACATTTATATGGTTAACCCTTCCACTCCGTTGGAAGGCGGATAAGCTTTGACGCGCTTCACAATTTTTTCCCTGCTGACCTTTCACACTGATTCCAGTGTCTCAGACTGGAGTCCAATATGTTGGAATCAAGTAAAGTCCCGGCTCTTACTCGCGCAATCGACATCCTCAATTTGATCGCGCGTATTGGCCCATGCAGCGCGGCAATCATTATTGAAACGCTGCGTATTCCAAAAAGCACCGCGTACCTGCTGTTGAATGAATTAAAACGTCAGCGATTTATTAGCCTCGATCATCAGGAGAACTACTGCCTGTGG [...]
+AGTGACAGTCACGGTTAAGCTCGACGCCGAAGCCCGGCTTATCCAGCACTGATTTATGGATGCGTCCATTCACCGGCACCGGCTCATCCAGGAGAATCGGGTCAAATTGCGGACGCAGGGTGGAGCAGTCCGGGCTGGTCATCAGGAACTCGCTGAAAGGGGTATTAGTGAAAGTAATAACTGCATGGTGCGAATAGACAGACGAACCGTGCGGCACCACCAGTTGCCCGCGCGATTTGGCAAGCGCGGCGATCTCAACCAGCGTGGTTAATCCGCCGCACCAGCCAACATCCGGCTGCATAATATCAATGCCGGTTTCTGCCAGAGTGCGGAAGGATTGCAGCGTACCATGGTGTTCGCCGCTGGTAACCATCATCCCTGCAGGCGCGTTGCGTTTTAATTCGCGATAGCCTTCATACTGCTGCGGCGGCAGACACTCTTCAATCCATTTGAGATTAAATGGCGCACAGGCGTGAGCCAGTTTAGTCGCAT [...]
+NODE 523 10821 567454 564015 0 0
+TAAAAGCATTGGCGTAAAGCGGATGCTGGCTGAAAAGCCAAAAAAATTTGGCGCGTTAACAAAGCGGTTATGTAGCGGATTGCAAATCCGTCTAGTCCGGTTCGACTCCGGAACGCGCCTCCAATTTTTCCCGAGCCCGGATGGTGGAATCGGTAGACACAAGGGATTTAAAATCCCTCGGCGTTCGCGCTGTGCGGGTTCAAGTCCCGCTCCGGGTACCATGGGAAAGACAAGAATAATCAAAGCAATAAGCAGTGTCGTGAAACCACCTACGGGTGGTTTTTTTGTGCCTTCAGTTTGTATGCCGACCGCGAGCGTGAACTTTCCAGCGCGATACACAGTAAAAAAACACCGGTAGCGGCATTTCTGCCAGTACAGCAGTTATGTGTTACCGACCCGCAAGAACTTGTGGCTGGTAAATACTAAACGTCGGGTAAATCAGCCGATAAAATCCATTAATCTCTATAAAAAATGCTGATATGTTTTATGCCT [...]
+CGCCTGGGTTGCCCCGACGCCCACTTTTACGGAAATTCCGCCAGCGTGATTCACCACGCCAAAGCCAGCCTCATCGGTCAAATCGTCGCCCACAAAAACGGGAATCCGTCCCGCAAAGGGCGCCTCCTGCATAAAGGCGGCAATCGCTTCGCCTTTATTGGTTCCCTTAGGTTTGATTTCCACAACACATTTACCAGGCTGCAACGCCAGTTGCGGCCAGTGCTGCGTAACGTGTTGCGCAAGCGCCAACAGCGCCGCTTCATGTTCCGGAGCCTGACGGTAGTGCAGCGCAAACGCCATCCCCTTCGTCTCCAGCTCCGTTCCGGGCAGCGCTACAAGCGTCGAACGTAATAACGCCTCCACCTCCCGGACTACCGCTTCAGGAAGGCGCACGATATGGGTTTTACCATTGATGTCACGACGCTCTGCTCCGTGAACGCCAGCGAGCGGAAAGCGAAAAGGCTTCGCCAAAGCATCCAGCTCAGTCATTGA [...]
+NODE 524 18780 919956 901726 0 0
+GATTTGGGACGCAAGCTGGTAGAAGTGCCGGTTGGCTTCAAATGGTTTGTTGACGGTTTGTTCGACGGCAGCTTTGGTTTCGGCGGGGAAGAGAGCGCGGGCGCTTCGTTCCTGCGTTTCGACGGTACGCCGTGGTCTACCGATAAAGACGGTATCATCATGTGCCTGCTGGCGGCGGAAATCACCGCCGTTACCGGGAAAAACCCGCAAGAGCATTACAATGAACTGGCAGCGCGTTTTGGCGCGCCGAGCTATAACCGTCTGCAGGCGAGCGCGACCTCCGCCCAGAAAGCGGCATTGTCTAAACTGTCTCCGGAAATGGTCAGCGCCAGCACGCTGGCAGGCGACCCGATCACCGCGCGTCTTACCGCAGCGCCGGGTAATGGCGCATCGATTGGCGGCCTGAAGGTAATGACCGACAACGGCTGGTTCGCCGCGCGTCCATCCGGTACGGAAGACGCTTACAAGATCTATTGCGAAAGCTTCCTGGGG [...]
+AAAGGCGGGTTTATCCAGCGCACCGCAGTGACTCAGCCCCGACTGACGAAAGCCGTGACGCCCGCTATCCTGCACGGAGGTGTAAATCCCCGCGCGAATAATATTCAGCATATTCCCTCCTTTTGCGGCACAAAGCGTACGCTATCGCCAGGGCGTAGCAGAACCGGAGGCTCCCGCATCGGATCGAATAACTTCAACGGCGTGAGGCCGATCAGCTGCCAGCCGCCCGGCGTGGATAATGGATAAATACCCGTCTGCGCGCCGCCGATGCCGACAGAACCGGCCGGAACCTGCAGGCGCGGCTCCGCGCGTCTGGGCATATGGAGCGGTTCTGGTAAATTCCCAAGATAGGGAAAGCCAGGCTGAAAGCCTAAAAACCAGACGACATATTCAACGGAGGCATGTAGCTCCACGACCTGCTTTTCACTCAAACCGCTGTGCCGTGCCACCGCCGCCAGATCCGGCCCGCCTGCGCCGCCATAGATCACCGGG [...]
+NODE 525 3173 169974 168471 0 0
+GTTCGCATGGGAATTACTGACCGGTGAAAACTGGTTTGCTCTGCCAAAAGAGCGTTTATGGGTCACCGTTTATGAAACCGACGACGAAGCCTATGAGATCTGGGAAAAAGAAGTCGGCATCCCGCGCGAGCGTATCATCCGTATCGGCGACAATAAAGGCGCGCCATACGCATCGGATAACTTCTGGCAGATGGGCGATACCGGTCCCTGCGGTCCGTGCACCGAAATCTTCTACGATCATGGCGACCACATCTGGGGCGGCCCTCCGGGAAGCCCGGAAGAAGACGGCGATCGCTATATTGAGATCTGGAACATCGTCTTTATGCAGTTCAACCGTCAGGCTGACGGGACTATGGAACCATTGCCGAAACCGTCTGTAGATACCGGTATGGGGCTGGAGCGTATTGCCGCGGTACTGCAACACGTTAACTCTAACTATGACATCGACCTGTTCCGCACGTTGATTGAAGCGGTAGCGAAAGTCACCGGCGC [...]
+AATGGCGGTGAGGCGGGGATTCGAACCCCGGATGCAGCTTTTGACCGCATACTCCCTTAGCAGGGGAGCGCCTTCAGCCTCTCGGCCACCTCACCACACGCCTCTTACGAGTGCTTCGAAGAACTTGTTCTGCTCATCGTCGCTGCGTGGCGCACATATTACTTTCTGGGACTTATAAGTCAAACAATTTTTCCAGAGCTTTTATCGTTTGCACACTTCACGCTCAATTAGTCTGTAAAAAAGCCAAAAAGAGTGTTTTATCAACAGATAATTTGATGACACGCTGGCCGCCAAAAGCGCACCATATCAACAATGAGGTTGAAAAAAGTCATGAAGGGACAACGCGGGCGAGCGAGAAGAGAGGCTGCGTCTCACCCGAAAAGTGAGACGCGAAAACCTTAGTAACTGGACTGCTGGGATTTTTCAGCCTGGATACGCTGGTAGATCTCTTCACGATGGACAGAAACTTCTTTCGGGGCGTTCACGCCAATA [...]
+NODE 526 7808 407876 401923 0 0
+CGCGCCAGCTTTGCTGCATGGGTTTTAATTCCGCCGCCTGCGCAGGTTGCAGGGCATCAACTTCCGCACGGTTATTACACCCTATCAATGCAAATAGCGTACAGGCTGCCGCTACTGACAATATTGCTGTTCTCACCATAAAATCCTTATGAAATTGCTATTCCTGCCCGTCAATCCAGTGGACGACGAACTTTGCCGCGAAGCGCCTTTACAGAAGATTTTTGCGCCTTTGAGGACAAGCGGCGCTCTTTCGAGGCACGCGTCGGACGGGTTGCGCGACGGCTTTTCTGCTCCGCGGTTAATTCTTTTATGACGGCAACCAGCCTGGCGATAGCCGCTTCCCGGTTGAGCTCCTGGCTCCGGAACTCCTGCGCCTTAATGATAATGACGCCATCATCGCTTATCAGATGGTGGCTGGCCGTCAGCAAACGCTGTTTATAATACTCTGGCAGGCCAGAGGCCCGAATGTCAAAGCGCAAATGAATCGCGCTA [...]
+GAGACGCCGATGAGCTGATGTGATTAAACGCAACGGCATGTTCTCCCTGACACTGTAGCAACTGCCAGGCGTGTGGCCAGGGCAGGCAGTGAACTACCCTTCAAGGAGAAAATTATGGGATTGCAAAAAACACTGGCGCTCAGCGCCGTGGCGGCAGGAATCATGTTGAGCTTATCCGGTGCGCAGGCCGCACCGCTGCTTAGCAGTAGTGAGCCAATGACCATCAACGCCAGCGATCTGGCGGCGAAAGAGAAAGCGCTGACGGATTTTCCGTTAATGGAGGCCGTGAAATCCTCTATCCAGACGTTGGATAACAGCGCGGTCGAACAAATCGAACCGGGGCGCGCCGCTAACCCGGCAAACGTAAGACGCGTTGAAAGTATTCTGAAAGAGGCCGACTGGGATTATCTGTTCCCGATGCGCGCGCCGGAATATACTTACTCTAACTTCCTGAAAGCGATAGGTAAATTCCCGGCGGTTTGTGGTACCTAC [...]
+NODE 527 51 16331 8316 0 0
+CAGTAGCGGCGAGCGAACGGGGAGGAGCCCAGAGCCTGAATCAGCATGTGT
+GGGGGAATCTCGGTTGATTTCTTTTCCTCGGGGTACTTAGATGTTTCAGTT
+NODE 528 63 18328 17099 0 0
+GTTAGTGGAAGCGTCTGGAAAGGCGCGCGATACAGGGTGACAGCCCCGTACACAAAAGCGCAT
+CGCTTCCACTAACACACATGCTGATTCAGGCTCTGGGCTCCTCCCCGTTCGCTCGCCGCTACT
+NODE 529 257 17602 17602 0 0
+GTAAAAGAGGGCGCTGGCGGCGCCTTTTTGCTATCTGCAATATGGATGATTCGAACCTGTCGCAGGTTCGGGTCTTGCCTGATGCGCTGCGCTTATCAGGCCTACAGACGGCACCGCTCATGTAGGCCTGATAAGACGTTACGCCGCCATCAGATACGGGGCTACGTAATTATTGTGACTTTCCTTATTGAATCAGCTATCTTGTTTAGCATATAAAACAAATTAACCGATTGTGGCGTTTATTACGCTTTCATTCG
+AAACAAGATAGCTGATTCAATAAGGAAAGTCACAATAATTACGTAGCCCCGTATCTGATGGCGGCGTAACGTCTTATCAGGCCTACATGAGCGGTGCCGTCTGTAGGCCTGATAAGCGCAGCGCATCAGGCAAGACCCGAACCTGCGACAGGTTCGAATCATCCATATTGCAGATAGCAAAAAGGCGCCGCCAGCGCCCTCTTTTACATTGGTGGGTCGTGCAGGATGACTCGCTTCGCTCGCCCTTCGGGCCGTCG
+NODE 530 38 2159 2159 0 0
+GTTGTTTCGTTAAGTCAGTAAAACGAGAAGCCACGATG
+TAATAAACGCCACAATCGGTTAATTTGTTTTATATGCT
+NODE 531 2743 147068 144442 0 0
+TCACGTAGCATCAGCTCGGTATCCGGTAGACCAATCACTGATGACCAGACCGCGCGTCCCGCCAGGAACCCGGATGCGCCAGCTTCCATGGCGACCCTGACCGCGCGAGGGAACAGTTTTTCGTCCACACCGGAAGAGAGGATGACCCACGGCATATTGATATGCCCATTCAGGCGTTGTGAGGCGGTAAGAAGATCCGAGCGCGCGCCTTTGCCGTAGAGCGGCATTTCAACTTTGTAAAGATCGGCGCCGCTGTCGCCCAGTTCTTTGGCCGCATCGATAATCGCCTGCTCGCGATCGAATTTGTCGCCGCAGCGCGGCGGACGTACAACCGGTTCGATAATGCTCAGCAAACCATTGGAGTGACATAATTCATTGAATTCTTTGACCATATCCAGACGCTGCTGCGCGTCTTCGTCGCTGCGCCACAGCACCAACAGTTTTAAGGCTTTCGCGCCATCCCGTTTTACCGCCTGCGCATTAATTTTTTTA [...]
+GAATCTGACAGCCTCTTCGATGGCGTATCCGCTTGCCAGGCCAAATGCCAGTGCGCCATGAAAAACATCGCCCGCGCCGGTAGTATCCACCACCTCCACGGTAAAACCCGGTTGGTGGCGTACCGCCGCTTTTTCCAACCAGTTGCAGCCTTCACTGCCTCGCGTGACATAGACATGTCCATTTGTGAGCATTTGTGCTTTTTTTAGCGCATCAATGGCTTCGCTCATCCCCGTCAGGCGTGCCAGCCCTGGCTCGGAGAAGGCGGCGTGGTCGCTTAACGCCACCAGCTCGCTAATATCCTGCGGCGTAATATCGCCATCAAGAACAGTCATGACGCCAGCCTGACGCGCCAGCGTAAACGCCTGTTTTGCGCCGTCATGCCAGCGCACATCCGCCAACACCACATCCCACTGCGAAAAATCGATGTCGTTAAGCCAGTCGGCGTCAGGTAATAAATCCGGGCTGGGATAATTAACGATAATCCGCTCTCC [...]
+NODE 532 51 5930 5346 0 0
+ACTCCTTGTCCAGCTTCAGCCCTTCCTGGTGCCACTCGACCAGCGGCGAGT
+TTTATCCACACTATCACGGCAAACGAGAGTCTGCGGACTGGACAGTGGGTG
+NODE 533 1858 87723 86923 0 0
+GCCCAACGCAATACGGTAAACAGATAAGCGTCTGCAATGGTAAAACGCTGGCCGCAAATCCACTGGTCGTCTGAAAGCGACTCATCCACATACTGAAATTTCTTTTCCAGACCGGCGCGAACGGCGGGTTTGAGTGTTTCCGGCGTGTCAGGGCGGAACAGCGGGGTAAAGCCTTTATGCAGTTCCGTTGCAATATAGTTGAGCCATTCCAGCGTATGATAGCGAGCAAGACTACTTACCGGCGCCAGAAGCTGGCGGTCGGGAACGCTGTCGGCGAGGTACTGCATAATGGCGACGCCTTCAGTCAACAGTGTACCGTCATCCAGCAGCAGAGCCGGAACCTGTCCTTTAGGGTTGACTGCCAGGTAATCATCACCGTTTTCCAGGCGTTTTTTTGCGAGATCGACGCCATCAAGCGTAAAGTCTTTGCCAATTTCGCGCAGGGTAATATGGGAAGCAAGAGAGCAGGCACCCGGTTTGTAGAACAGTTTC [...]
+TATCGGTTATGCGCTGGTCGCATGGTCTGGTCATGACGCTGGCATCGTCTATATGGGCATGGCGGCTATCGCTGTGGGTAACGGTCTGTTTAAAGCTAACCCGTCTTCCCTGCTGTCTACCTGTTACGCGAAGGACGATCCGCGTCTCGACGGCGCATTTACGATGTATTATATGTCCGTCAACATCGGCTCCTTCTTCTCTATGCTGGCGACGCCGTGGCTGGCGGCGCGTTATGGCTGGAGCACCGCGTTTGCGCTTAGCGTCGTCGGTATGCTGATAACCGTCGTTAACTTTGCTTTCTGCCAGCGCTGGGTGAAAAGCTACGGTTCCAAACCCGACTTTGAACCGATCAACTTCCGTAATCTGCTGCTGACCATCGTGGGTATTGTCGTTCTGATTGCGGTCGCCACCTGGCTGCTGCACAACCAGGATATCGCGCGTATGGTGCTGGGCGTAATCGCTCTTGGCATCGTCATTATCTTCGGTAAAGA [...]
+NODE 534 5227 262141 256503 0 0
+TCGGCCATCGGACAAACGCGGTCAATCAGGCCATTAGCGACAACAAGCGCATGGTCATCAAGAATTTCGTGACCGGTAAAGATCCGGCCCTGGGTTAAAGCATACATTCCGACCCCCGATATCAAAAATTTACCGCCCCGCATTGACTGGCGGGGCGGAGACAACATTACAGACCTTTAATATTTTCTGCTTCTAATTCATTGAAATATTTCAATGTTTTAACTTTAAGTTCCATTGTGGACGGCTCATCGCATACCACAACCGCTTTCGGATGGAGTTGCAGGCAGCTAATGGTCCACATGTGGTTGACGTTGCCTTCAACCGCCGCCTGCAGCGCCTGGGCTTTCTGATGGCCCAGCACCAGAATCATCACTTCTTCCGCATCCAGCAGCGTGCCTACGCCTACCGTCAGCGCGTATTTCGGCACCTGGTTTACGTCGCCGTCAAAGAAGCGGGAGTTCGCTACGCGAGTATCATGGGTTAACGTTTTGA [...]
+AAAACGCGGCGTTGACAAGGTATTTTTACAGCATTCGCCTGTTGGCGCAGTGCTTACTCGCCCGCTTTCGCCCAGGTATCACGCAGGCCCACGGTGCGGTTAAAGACCAGCTTATCGGCCGTTGCATAGCGGCTGTCGAGGCAGAAGTAGCCTTCACGTTCAAACTGGAAAGCTTTTCCTGCTACCGCCGCTTTCAGCGACGGCTCACCATACCCCTGCTTAATCACTAATGATTCGGGGTTGATAACGGACAGGAAGTCCTCCGCGGCGCCCGGGTTCGGCACGCTAAACAGACGGTCGTAGAGACGAATTTCAATCGGCAACGCATGTGCTGCGCTAACCCAGTGGATTACGCCTTTCACTTTACGCCCGTCAGCCGGATCTTTACTCAGCGTATCGGCATCATAGGTACAGAAGATGGTGGTGATATTCCCTTCGGCATCCTTCTCTACGCGCTCCGCTTTAATGACGTAGGCATTACGCAGACGCACT [...]
+NODE 535 6823 376530 370278 0 0
+TGACCAGGGAGAATAAATCATGATTATTTCAGCAGCCAGCGATTATCGCGCCGCAGCTCAGCGCACGTTGCCTCCTTTCCTCTTCCACTACATCGACGGCGGCGCGTATGCGGAATATACCCTGCGCCGAAATGTGGAAGACCTGTCGCAAGTCGCTCTGCGCCAGCGTGTGCTGAAAAATATGTCCGATTTAAGCCTGGAAACGACCCTGTTTAACGAAACGTTGTCGATGCCGGTGGCATTAGCGCCGGTAGGTCTGTGCGGCATGTACGCCCGTCGCGGCGAAGTACAGGCCGCCGCCGCCGCAGACGCAAAGGGCATTCCGTTCACCCTTTCCACCGTCTCCGTCTGTCCGATTGAAGAAGTTGCACCAACCATTAAGCGCCCGATGTGGTTCCAGCTTTATGTACTGCGTGACCGGGGCTTTATGCGCAACGCGCTTGAACGTGCGAAAGCGGCGGGCTGCTCCACGCTGGTCTTTACCGTGGATAT [...]
+CGGAAAAAACGCGCGCGAGGCAGCATTAACGTTATTAGGTCGCGCCCGCAAGGAAGAGCTGAGTCGCCACTAGCCGTAAGGAACTGTTTGCATAAACGACCCAACCCGCACAGAACGGGTTGGTCGTTTTCTGCCCGTCTGGAGTAAGCCATGCCGTGTGAAGAACTGGAAATCGTCTGGAAGAATATTAAAGCTGAAGCCCGCGCTTTAGCTGACTGTGAGCCTATGTTGGCCAGTTTTTATCACGCCACGCTACTCAAGCATGAAAATCTGGGCAGTGCGCTGAGCTATATGCTGGCAAATAAACTGGCTTCGCCCATCATGCCCGCTATCGCTATCCGTGAAGTAGTTGAAGAAGCCTATGCCGCCGACCCGGAAATGATCGCGTCGGCAGCCTGCGATATTCAGGCCGTGCGCACTCGCGATCCGGCGGTGGATAAATACTCCACGCCGCTGTTATATCTGAAAGGCTTTCATGCGCTACAGGCCTAC [...]
+NODE 536 1960 103515 101869 0 0
+GCCAAACAGATAGGGGATGACCCAGCCAAAACGGTAATAGTTGCGAATCAGACGAAAATAGCCGGCAGAAATTTTTTCTTTTGCCGCTTCGCCTTCCGTAACGCCGCATTTCGCCTGCCAGAACGCCATCGGTAATGAAAAATTGTAATGTACGCCGGAGATGGTTTGCATCAAGGCGCCATAACGATTTTTCAGCCCTTCGCGATAGAGCGTCTTAAAGCGCCCGGTATTGGATGTGCCGTACTGCGCCAGCTCTATGTCCTGCCCTTCCGCAATATAGCAGGGCATACTTAATGGCCACATCCGCTCATCGCCCAGTTTCCTGGCCGTATACCGATGGAGATCGCGCATAAAAGTGAGCATATGCTGGATATCGCCATCGACTGGCGTAATAAACTCCAGTAGGGCTTCCGCAAAATCCGTGGTAATCCATTTATGGGTCAGCGCTGAACCTAACGCTTCAGGATGACCTGTTGTCGCCAGCGTGCCATC [...]
+ATTCTCCATACTTTATTCTCCGTACTTTCAGCGATGAAGATGCAGATAAGATAGCGGTAATCACCGCTGGCATCAGAAGGATAACGTTGCGTCAGCAACGGCCCATAAGGCGAATAATCCTCCCGGATACGTCACTGCCCCGCAATCGCTTTTCCCCTTATCTTGAACACACCTCTTCATCTCTATTAGCGACAAAATCAACCAATTGCGATAAAGTACTGTCTGGTTATTCGGTTTGCGAGAACACGATGTACGCACGTTATGCTGGTTTGATTTTTGATATGGACGGTACTCTCCTGGATACCGAACCCACGCATCGCAAAGCGTGGCGTGAGGTTTTGGGGCGCTATGGTCTTCGTTTTGATGAACAGGCAATGGTCGCGCTTAACGGTTCGCCAACCTGGCTTATCGCCCAGTCAATCATTGAGCTTAACCATGCCGATCTTGATCCCCTGTCACTGGCGCGTGAGAAAACCGACGCGGTAAAAAGCA [...]
+NODE 537 4445 206773 202018 0 0
+TCGCCCATCTGATGAAACCCGGAAGCGCGGTGATGGTTTCGTCCACGATCTCAAGCGCCGACGCGCAAGAGATCGCCGCGGCGTTGACGGCATTGAATCTTAACATGCTGGATGCGCCGGTTTCCGGCGGCGCGGTAAAAGCGGCGCAGGGCGAAATGACGGTGATGGCCTCCGGGAGCGAGGCGGCGTTTACCCGCCTGAAGCCTGTGCTGGACGCCGTTGCCAGCAACGTTTATCGCATCAGCGATACGCCGGGCGCAGGTTCAACCGTCAAAATCATTCATCAACTGCTGGCTGGCGTGCATATTGCGGCGGCGGCCGAAGCGATGGCGCTGGCCGCGCGGGCCGGTATTCCTCTGGACGTGATGTATGACGTCGTGACCCATGCCGCCGGCAACTCCTGGATGTTCGAAAACCGTATGCAGCATGTCGTTGACGGCGACTATACCCCGCGTTCGGCCGTCGACATTTTTGTCAAAGATTTGGGGCTGG [...]
+GCGTAACACCAGCCATACCAGCACGAAAACGGCAACGATCAGGCCGATAATTGGGGTCGGTAAACTTGTCATGACCACCCCTCCATATCATCTTGTCGAAAGCGTTCGATAATGTCATCGAAGCGTTTATCGGCGACAAAACCTAACGCCAGCGCACGCTGGTTATCGATACGTCCCGGCCAGGAGGCGACAATTTTCTCGACGCCTTCATCGCGCTGATGCGTAACCCGATCGCGCGCCGCCTGACCGCCCGCCTGACGCAACGTTTCCAGCATCTCGCCCACGGTTACGCTGATCCCGGGTAAGTTGATGCTGCTCGCCTCGCCAGGCGCGGGTAACGTTGCGGCCAGCGACAGGTTATGGATCACCGTCGCCGGGCTGGAAATCCACAGCCGCAAACTTTCAGACACCGGGCAGATGGTCGTCTCGCCCTGCAACGGTTCACGAATAATCGCGCTGACAAAAGAAGAAGCGGCGCGGTTTGGTTTACCC [...]
+NODE 538 4780 294435 293301 0 0
+GCAGTAAATAATTATCTTGCGGAATTCTGAATAACGGGAAAATGAATAAAAAGGACATGAGAAGACCAATGCTGAACGTTTTCTTCAAACCAATTCTATCTGCGCACAGACCCCAAACGATATTTCCCAATACAGTGCCGAATGCCGCCGCCGTCATTAAATTAGAGACCACGCCCGTATCAAAGCCCTCTCCCGCCAAATATGTAGGCAGTAGACCAAAGATCGGCCAGTTTGCGCCGAAAATAGAGAACAGAACAATAAATACACATAATGTCAGTGGAAATTGAGCTCGATTAAATAGCCCTTTCATTGACAAAGAGAAAACTGACCAGGCACTTTGTGAATGCTTTCCGGGACCACTGAGTTTGGCTTCTTCCCACTCTTTAGATTCAGGAGCCCTGGCCCGGATGTAGATTACTAAAAGAACGGGTAGCAAACCGACAAAAAAAGCAGCACGCCAACCATACGCTTCGGCAAATGACGGCATAAAAT [...]
+ACTAACATCATGGCCAGGAGGTAGCCAAATAATACAAGATAATTAACGATGCCGAAAGAATGTGTAATCATAGTTCTTTCCTGCTTATGGTTTTGAGTAGAGTTGCGGTCATCGTCTGTGTATTTTTATCTTCCCATCATTCAGACGATACGATATTCAGATCAAGTAATAGTTTTTGTTAATCTCAATGACGCTAATCATGAGATGTAAAAGGCAGAGCATTTATGCTCCTGATGCCAAGACGTATGTCCTGCCGGATACCTGAAATAGCAGCTATCCGATATTGCGTTCAAACAGGCTTCAGGCCTGGGTATCGTATTTGCCGATAGCATTATTAACGTCGGATTATTCTCTGAGACATACATATCAATAGTAAGCGTGTTCATTTTCTTTTCCTGTTCAGCGTTTTACTGCGTGACTGAACCACTGACAGATATGCTCGATACGGGTGATAGCGGAACCAACGGTAACTGCCCAGGCACCATGCTCAAT [...]
+NODE 539 1438 79421 78429 0 0
+TTCTGATCGGAAACCGATTCGGCTCTTCCGCTTCGCAAGCCACCGTATTGTCTACTGATAAATAAAGAGTTTTGCCATGCCATGGATCCAATTGAAACTGAATACCACCGGCGCGAATGCTGAAGAGCTGAGTGATGCGCTGATGGAAGCGGGCGCCGTTTCCATTACCTTTCAGGATACGCACGATACGCCGGTTTTTGAGCCGTTGCCGGGCGAAACCCGTCTGTGGGGCGATACCGATGTGATCGGTCTGTTCGACGCCGAAACCGACATGAAAGACGTTGTCGCGATTCTGGAGCAACATCCGCTGCTGGGTGCCGGATTTGCCCATAAAATCGAACAACTGGAAGATAAAGACTGGGAACGCGAATGGATGGATAATTTCCATCCGATGCGTTTTGGCGAGCGTCTGTGGATTTGTCCCAGCTGGCGTGACATTCCGGACGAGAATGCCGTCAACGTGATGCTCGACCCGGGACTGGCGTTCGGTAC [...]
+GATAAGCGGAATAATCTGCTTTTTTTATAAGCTAATTACCCCAAATGAATGGGATCGCCGTCTCGTTTCAGGACAAGATCACTTCCCGCTGCGCGTGATTTTTCTCCATTGTCAGTCGGAAGGGGGCGCACAGACGCGCTTTTGTGTTCATGAACGGCACGGATAAATTTTTCCAGCTGCGCTGAAGAGAGGGCTAGCGGATGCTGCAGAACAACCCGGACAGCATTACTAATGCACGAGGACGATGGCTGCGACCCGTTAAAACGCCAGTATCTTTTGTCCGCTGGTAGCTGCTGATTATCCAGATGGATAGTGACAAAGAAGTCATTTCAGGCATTTATTTGATGAATTTAATGATGTCTCGGTGACAGAAAGGTGTTAAGGCAGTTGTGTGGAGAAAAGCGTGGCCGGGCGACCACGCTGACAAGAATTATTTCTTACGGCCAGTAATGCGGCACCACTCTTCTTTTTCGACGACCGGGTCGAGAGTGA [...]
+NODE 540 1027 53273 52512 0 0
+GCGAGAGATAAAAGCCGCAGAAATCAGGCTTGCCGCCTGTACCGTCGTCAGCCCAAATTCGCTTTGTACCTCAGTCAGTACAAGAGCAATCAACACAAAATCAAAACCATCAAGCAGATATCCCAGCCAGGCAGCGGAAAATGCCCGCCACTGCGCCCGGTTGAGATGGCGATACCACGGGATGTTCTGGGTAGAAGTACTCATTTTACTCTCCCGACGATTTTTGTTGTCGTTATGCCGAATGGCGGCTCCGCCTTATCCGGCCTACCGCTCACACTGTTGTAGGCCGGGCAAGCGTAGCGCCCCCGGCATTATGCTGTTACGCCTTTTCTTCTATCAGTTGTTGCGCCAGCGCCTTGAGCGCCGGCAGATATTTTTCATCAACAGGCGCGAACGGTTTACGACACAGCGGCACCGATACCACGTCCATATAATGCAGGACCGTTTTCAGGCCGCGGAATACGCCGGTTTTAATCAGTAAATCAATAACCT [...]
+TGTCGGGACGGTAAGCACCGCAGAAAGCCAGCAGCTTGCCAGCGCCGCAAAGCGTTACGGTTTTGATGCGGTCTCTGCGGTGACGCCTTTTTATTACCCTTTCAGTTTTGAAGAGCACTGTGACCATTATCGGGCAATCATTGATTCCGCAGATGGATTGCCGATGGTGGTATACAACATTCCGGCGTTAAGCGGTGTAAAACTTACCCTCGATCAGATCAATACGCTGGTGACATTACCGGGCGTGAGCGCGCTGAAGCAAACCTCCGGCGATCTCTTCCAGATGGAGCAGATCCGCCGCGCGCATCCGGATCTGGTGCTGTACAACGGTTATGACGAAATCTTCGCTTCCGGCCTGCTGGCGGGCGCGGACGGCGGTATCGGCAGCACATACAACATTATGGGCTGGCGTTATCAGGGGATTGTTCAGGCATTACGTGAGGGCGATGTGGCGAAAGCGCAGCGTCTGCAAACCGAGTGCAATAAGGTTAT [...]
+NODE 541 6303 401045 394691 0 0
+GACCACTACCGGCAGCGCCATACAGCGTTCGCCCGCGGAACCAAATGCTCCGCCCATAATGGCGTTGACGGTGGCGTCCAGATCTGCATCCGGCATGACGATTGCGTGATTTTTGGCGGCCCCGAAGGCCTGTACGCGTTTGCCATGGGCGCTGGCGGTGGTATAGATATGTTCCGCGACGGCGGAGGAACCGACAAAGCTGACGGCCTGTACGCGAGGGTCGCTGGTCAACAGGCTAGCCGCCTCATTGCCACAGTGAACAACGTTAAACACGCCGTCCGGCAGGCCAGCCTCCTGCAGAAGCTGCGCCATACGTAACGATGCGGACGGCACCAGTGCGGGCGGCTTCAGGACGAAGGTATTGCCGCAAGCCAGAGCAACCGGGAACATCCACATAGGCACCATTGCCGGGAAGTTAAACGGTGTGATGCCTGCCACAACCCCAAGCGGCTGCATTAATGAAAAGCTGTCAACGCCTGAGCCGACGTTAAA [...]
+CGCCATGGCAAGACTGCGCACACAGCATCCTGCGGAACCGATCGGCTCAAAGGCCAGCCGCATCTGGCTTTCTTCCGCCACTGCCGCCATCTCGCGCAGACGCTTCACTGAATCTTTCACCGTTTCCCCTGGCGGAAAATTTCCCCCCTGACGAATGGTGGGCACCACGACCAGACAATCCCCCCCCACCACTGAGCCAGCATGGCAGGCGAAAGCCAACTGCCGCCGTTTCTCCGCCCAGCTTTCGCTATCACAAAACGTAATGTCTTCCAGCGAATTGTAGCCCCAGGGCTTAAGGTGGCCGACGGCAAAAATGTCTGCCAGCTCGCTTAACGTATGTTTCTGCAACCACTCCTGCAACATATCCAGACGGATTTCGATGTAGTCATAGCCAAAACGTTCCGCCAACACAACATCCTGTGCCAGCATGGAGTTTCGCATACAGGTCGCTTCATTAAATCCCAGCTTCATCATTCAGATCGACTCCTGCCG [...]
+NODE 542 153 16581 16524 0 0
+ATGGGCGGGCAAAGGCTTCGGGATGATCCAGATCCCGCGTATCGGCCAGGAAGTGCTGGTGGATTTCAAAAACGGCGATCCGGATCTGCCGATCATCGTGGGGCGTACCTACAACCAGGACACCATGCCGCCGTGGGGACTGCCGGGAATGGC
+CCCCACGATGATCGGCAGATCCGGATCGCCGTTTTTGAAATCCACCAGCACTTCCTGGCCGATACGCGGGATCTGGATCATCCCGAAGCCTTTGCCCGCCCATGGGTAGCTGACGCGTATCCAGCAGGAGCTGTTTTCATCCATTTTGCCGTA
+NODE 543 30 3625 3615 0 0
+GTGGAACTTCACTTCCTCCGCGCCCGTTTT
+CACGGTGAAGAATAATGAAACGCATACGGT
+NODE 544 123 5468 5426 0 0
+GTCGTCAAAACGCAGCATGTTGCCGTTCGTTGGCCCGCCATACAGCGAGTGGCTGAAGATCCCGCTCTGCGACGCCATTCCCGGCAGTCCCCACGGCGGCATGGTGTCCTGGTTGTAGGTACG
+GTCGCAGAGCGGGATCTTCAGCCACTCGCTGTATGGCGGGCCAACGAACGGCAACATGCTGCGTTTTGACGACAAAACGGGCGCGGAGGAAGTGAAGTTCCACGCGGAAAAAGATCTCAACAC
+NODE 545 5089 242494 238699 0 0
+CATGGTCAGCGACAGGCCGTCCAGCACCAGGTTAAAACCGATGTTGAAGTTACCGACCGACATCCACGTCCACAGCGGCTGGCTGAACGCCTGTTTGCCGTTGGCGAAGAAATCCATCCCGACAAACGCTGTCACCAACGCCGCCAGACCAACGGAGCCCACGCCAATGGTCGCGGAGAGATTTTCCGACCAGCGTCCGCGAGAGAACGCCAGCAGTACAAAGCCAATCAATGGCAGAATAATGGTTAAGGCAAGCATGTTCATCCACGCATCTCACTTACTGAATCGATGTTCAGGTTCTGGCGACGGCGATGGAGTTGCAGCAACAGCGCAAGTCCAATACTCGCTTCCGCAGCCGCAAGGCTGATGGCGAGAATGTACATCACCTGACCATCGGTCTGGCCCCAGTAGCTCCCGGCGACCACAAAGGCCAGCGCGGAGGCGTTAATCATGATTTCCAGCCCGATCAGCATAAACAGCAGATTGCGGCGG [...]
+AGGATATGACCGTGATGACGGGTCACAGTTTCCGTCGCTACCGTTTCACCAAACGTACCCACCGCAACCAGGATCTGGGGCCGTTCATCTCTCACGAAATGAACCGCTGCATCGCCTGCTACCGTTGTGTACGTTACTACAAAGATTATGCCGACGGCACCGATCTGGGCGTCTATGGCGCGCATGACAACGTCTACTTCGGGCGTCCGGAAGACGGTACGCTGGAAAGCGAATTCTCCGGTAACCTGGTCGAGATTTGCCCGACCGGCGTATTCACCGATAAAACGCACTCCGAGCGCTACAACCGTAAATGGGACATGCAGTTTGCGCCGAGCATCTGTCAGCAGTGTTCCATCGGCTGTAACATCAGCCCGGGCGAGCGCTATGGCGAACTGCGCCGTATCGAAAACCGTTACAACGGTACCGTTAACCACTACTTCCTCTGCGACCGCGGTCGTTTCGGCTATGGCTATGTGAACCTGAAAGACCGTC [...]
+NODE 546 3533 185270 182608 0 0
+GCCTCGGCCGCCTGCCGCGCGCGGGCGATCATTTCGCCAGACAGATCGCATAACGTCACCTGATGGCCGCGTTCCGCCATCTTAATCGCCGTTTGCCCTTCGCCGCCGCCGGCATCCAGTACCCGCAGTTTTCGCCCGCCAATCTCCTCCAGCACGCGATCCAGGTCTTGCCACAGAATGGCTTGCCGCAGTTGTCCTTTGGTCGTGCCGTAAATGTTACGGGAAAACTTTTCAGCAATGTCATCAAAATTGCGATCCTGCATCGGACTCTCCACAGGCTGGCTCAGGCGTTATCTGATAAAACCGCTATTTTGTCACAGCCGCGGCCAGAATGAACCTGTCTGGTGTAATATCAGCGTTAATCCTCCGCTATATGGTTAAAAAAGGAACCAAAAAGGATGCTTTTTACGCTAAAGAAAGTGATTGGCGGTATGTTATTGCCGCTTCCGCTGATGTTGCTGATGATTGGCGTCGGCCTGGCGCTGCTCTGGT [...]
+TATTATACCAGGGCCGTTTAGTCGGGCGAATGGATGCCAAAATGCACCGTAAAACGGGGGTGCTTGAGGTTATCTCGCTGTATCTGGAGGACGATATTCGCCCTGGCGTTAGTCTGCAAAAAGGAATCTGGCAGGCGATTAGCGCGTTTGCTGCCTGGCAACGGGCATCGCGCGTGACGCTGGGACAATGTCCGCCAGGCCTGTTTAGCGCCATGCGTCATGGCTGGGAAATAGACCCTGCACCCTAACCGATTATGTTAATATTGAAGGATTCACAATCCGGTCCATCTGGAGGAACTATGGATCATCGTCTGCTTGAAATCATCGCCTGCCCGGTATGTAACGGCAAACTCTGGTATAACCAGGAACAGCAAGAATTAATTTGCAAACTGGACAATCTCGCTTTCCCGTTACGCGACGGCATTCCTGTATTGCTGGAAAATGAAGCTCGCGCCCTGACATCTGATGAGAGTAAATCATGAGTTTCGTCGT [...]
+NODE 547 3136 154873 153247 0 0
+CGTTAGGGTGGACCACCGATCGTCACGGTTATTGTTATGCTGTGCGCGATCCGTTGACCGATAAACCCTGGCCTGCGCTGCCGTTATCGTTTGCCAGCGTATGTCGTCAGGCGGCAATCGCGGCAGGGTATGCGAGCTTCCAACCGGACGCCTGCCTGATCAATCGCTACGCGCCCGGCGCAAAACTGTCGCTGCATCAGGATAAAGACGAGCCGGATCTGCGCGCGCCTATTGTCTCAGTTTCGTTGGGGGTGCCGGCGGTTTTTCAGTTTGGCGGCCTGCGTCGCAGCGATCCGCTCCAGCGGATCTTACTGGAGCATGGCGATATCGTGGTCTGGGGCGGCGAGTCCCGGCTGTTTTATCATGGTATCCAGCCGCTTAAAGTGGGCTTTCATCCCATGACCGGTGAATTTCGTTACAATCTCACCTTCCGCCAGGCGGCTGAAAAAGAATAAAAATAAGAATTATTATTGCTGTGCAGGTGGAGTTAGT [...]
+TCAATGAGTTATATAGATGCTTATATAACGAAAATCACTAATAGTTGATAATTTCATTTACATTATCAATATCGGAATATTCCACTATATAAAAAGACGCTATTTTATTAATAATCTTGAAAATATGAGTAAATACAGATTAATAGATAATATGAATGTGTTAATCTGTTGCCCGTGCATACCGAAAACAGCAGAAAGGAAATACTGTGAACAATCAAATGAAGATGTTTGTCCCTGCCGTCGTCTTCGCCGCCCTCGCCAGCGCCTCTGCCTGGGCTAACAATAGCGATACCGCCCAGCCGCTGGAAAAAATCGCCCCCTATCCGCAGGCGGAAAAAGGAATGAAGCGGCAAGTGATAACCCTTACCCCTCAGCAGGATGAATCTACCCTCAAAGTGGAACTGTTGATTGGCCAAACGCTGAATGTGGATTGTAACCAGCATCGCCTCGGCGGCACGCTGGAAACAAAAACGCTGGAAGGCTGGGGCTATG [...]
+NODE 548 51 3686 3686 0 0
+CGGCAACAGCATTTACCTCTATCGGGGTATGCATCTCTTACACATCCTGAA
+GGATCAAAAGAGTGCCAGGTAAAGACCCGTAAACGTGCTTTTTCTCACATT
+NODE 549 599 31609 31157 0 0
+ACGTCATGCTGTGCGGGAACCCGCAGATGGTGCGCGATACGCAGCAACTGCTGAAAGAGACCCGACAGATGACTAAACATCTGCGCCGCCGACCGGGGCAGATGACGGCTGAACATTACTGGTGATGTTTTACCGAATGGCGGCTGGGGCTTATCCGGCCTGCAAATCATCACCAATCTGTAGGCCCGGTAAGCGTCAGCGCCACCGGGCAAATTACGGTTTACCGCCCGTTTACGGTTCTGCTTTAAACTTCACGTCCTGTGTCGCTTTCCCAAACTTATTTTCCCCCTGAACACCGACAAACGCGCCCAGATCGATAAGCATCATCACCAGGATCAGCGTCGGAATAAATCGCCCGACGACCCACTGCCACATCCCCGGCAGCATCACCCAGTTTCCGGCCAGCAGCATCCACGCCAGAATCATTAGCAACGCCCACGCGCCGGAACGTCCCCGGTCATGCAGACGTTTGACCATGACGGCGGCGGTCGG [...]
+GGGAAAAATCTGCTTGATATCCAAACGGCGGCATTTTGCCTGGTGTGCCTGCTGTGGCCGACCGCCGCCGTCATGGTCAAACGTCTGCATGACCGGGGACGTTCCGGCGCGTGGGCGTTGCTAATGATTCTGGCGTGGATGCTGCTGGCCGGAAACTGGGTGATGCTGCCGGGGATGTGGCAGTGGGTCGTCGGGCGATTTATTCCGACGCTGATCCTGGTGATGATGCTTATCGATCTGGGCGCGTTTGTCGGTGTTCAGGGGGAAAATAAGTTTGGGAAAGCGACACAGGACGTGAAGTTTAAAGCAGAACCGTAAACGGGCGGTAAACCGTAATTTGCCCGGTGGCGCTGACGCTTACCGGGCCTACAGATTGGTGATGATTTGCAGGCCGGATAAGCCCCAGCCGCCATTCGGTAAAACATCACCAGTAATGTTCAGCCGTCATCTGCCCCGGTCGGCGGCGCAGATGTTTAGTCATCTGTCGGGTCT [...]
+NODE 550 9746 561377 551740 0 0
+AGCTGCGCCTGAAAGGCACGCTCCTGCTCCTGCGGCGTGGAAAAATTACGATTGAAATCCAGCCCGCACTCACCGATAGCGACGACTTCCGGCTGGTTCGCCAGCGCAATAATGGCGTCTTCAGACGCGGGTGACCACTGACTGCTGTCATGGGGATGGACGCCAGCCGTCGACCAACAATGGGGGTAGCGCCGCGCCAGTTTTAACGCCTGCTGACTTTCATGGATGTTCGTTCCGGTCAGTAGCATACCTTTTACTCCCGCCGCAAACGCACGGGCGACCACATCATCACGATCTTTTGCAAACTGGCTACTGGTTAAATTAACGCCAATATCAAACATGCTTGCCCCCATATGACAACCGCCCTGGCGGGCGGTTGTGTTTAGTCTTCAGTGTGCTCGGCCTTTTCGGTTTCGGCCTCGTTATCTTCGTCGCGCGTCCGTCGCTTACCGACATAAAAGCGTGAGCAGAAAACGCCAATTTCAAACAGGC [...]
+TCATCGGTCTCTCTATCGACGGCCCGGCGTCGTTACACAACCACTATCGGCTTAATCGCGCTGGAAAAGGAACTCATGAACAGGTCGTCGCAGCAATGGCGCGGCTTAAAGCGCACCATGTCGACTTTAATACCTTAACCGTCGTGGGAAAACATAACGTCGGTCATGCAGCAGACGTCTACGAATTTCTTCTGGCGGCGGGATCGCGTTTTATTCAGTTTATCCCGCTGGTAGAGCGAATGAGCACCGATAACTCATCGGTACTTAATCTGGTGATGCCCGGCGAAAGCGCGGCGACGCTGGCGCCATGGACGGTACCGTCGTGGCAATATGGCGAATTTCTCAACCAGATCTTTGATATCTGGGTTCGTCGCGACGTAGACCGCGTCTATGTGCAGATGTTTGACGTGGCGTTAGCCGCCTGGACGGCGCAGCAGCCGGTACTGTGTGTACATTCCGAGACTTGTGGACATGCCTTCGCGTTGGAGTCGA [...]
+NODE 551 6135 374830 372749 0 0
+CCGATATGGGTACCGGCATTATGCTCGACTCGCGGCGTAAAATTGGTCCGAAGGGCAAATTCCGCCCGTTCGTGCTTTACGCGGCATTTCCGGTAACGCTACTGGCGATTGCTAACTTTGTCGGCACACCGTTTGAGGTGACGGGAAAAACCGTCGTCGCAACGATGCTGTTTATGCTGTACGGGCTGGTTTTCAGCATGATGAACTGCTCGTATGGCGCGATGGTGCCCGCGATTACCAAGAACCCGGATGAACGCGCCTCGCTTGCCGCGTGGCGTCAGGGCGGCGCCACTCTCGGCCTGCTGCTGTGTACCGTTGGCTTTGTGCCGGTCATGAACCTGATCGAAGGCAATGCCCAACTCAGCTATATTTTCGCCGCCACGCTATTTTCATTGTTTGGCCTGCTATTTATGTGGCTGTGCTACGCCGGCGTTAAAGAGCGCTACGTCGAAGTGAAACCTGTCGATAGCGCGCAAAAGCCTGGATTATTGC [...]
+CTCCACGTAAAAATGGTTAGGGTAATGAATCGTGTCGATATTGATATACATCATGACCGGTTGGCTGCCAGCACGTTCGGCCATGATTTTCTGGATATAATGGATCTGGTTATCCATACTTTCTTTAACCGTACAGGCAAATCGTGGATGCCAGTAACTCTCTTTAAACATCGATGGGAACACTTTTCCCATGCCGGAGCGGTTATTAAAGAAAGAGACGCCGCCAATACAGATGGTCTGGTAGCCTTTATTTTCCAGACTTTTTATCCATGTTGCGTCATCAAAGGCAAATGCATTTTTCGGCCCTTTACGACCAAGTCCGATATCTTTTGGGAAAAACAGCATGGTCTGATTAACGGTATCATCAATAGGTTTTGGCATAAAACCTGAAAACATGGCGTGATGCGAAGGCCAGGTGAAATTACCGGCCGCCTCGCATTTCGTCCATTGTCCATAATGATTAAGGTTTGGCGTATTTCCGGCGGTTTGTTC [...]
+NODE 552 2158 111510 107173 0 0
+CGTGTTAAAACTGGCGAAGCAACTGCTGTCGCAAACCGGTTTGCGTCAGGGCAGTCTGAGTAAGGCGGCGCGAGGTTATCACCTGGCGCAGGGGAATGCGCCGCGAGAGAATACACCAACGGCAATTCTGCGGACTGCCGCGAAAGCCACGGTAGAGCAAGGGCTGGAGGCCTCGCTGGATCTGGCGTTGTCACAGTGGCAGTACCATGAAGAGCTCTGGCTGCGCGGCGACGAGTCGGCGAAAGAACACGTGCTGGATGCTATGGGATTAGTGCGCCATGCCTTAATGCTTTTTGGTGGCATTGTTCCGCGTAAAGCGAGCGCTCACTTACGTGATCTACTTACCCAGGCGGAAGCGACGATGACATCCGCGGTGTCCGCCGTCACAGCCGTTTATAGTACGCAAACGGCGATGGCGAAACTGGCATTGACGGAATGGCTGGTGACGAAAGCCTGGCAGCCATTTCTGGACGCGAAGGCGCAGGCCAAAAT [...]
+GATCGTCGGCAGGCAGCGTTTGCGTCTGTTCGTCATTGATGCTTTGCAGCAGATTCTCCAGACGACGTAGAAAAAGATAGGCCACGCGCAGTTGCGCCACGTCATTCTCAGGCAGCAAATGCAGCGCAGCGATAGCATCCAACGTCGGCAGTAACGAACGCGACTGTAGCGACGGCTCGCGTCCGCCGCGGATGAGCTGGAATACCTGCACGATAAACTCAATTTCACGAATACCGCCCGCGCCAAGTTTAATGTTGTCTTTCAAACCGCGGCGTCGCACTTCGCGGGCGATCATCCCTTTCATATTGCGTAGCGACTGGATGACGCTGAAATCGATATAGCGGCGGAAAACGAAAGGTCGCAGCATGGCGCGTAATTCACGAGACCAGGCGTCGTCGTTATCGCCCATTAGCCGTGCTTTCACCATAGCGTAGCGTTCCCAGTCGCGTCCTTGCTCCTGATAGTAATCCTCCAGCGCGGCAAAACTCAGTA [...]
+NODE 553 6673 337098 334330 0 0
+AAAGATAGCGGTGCCGATGCGCACCATTGTGCTACCTGCCGCAATCGCGGCTTCCATATCGTCGCTCATACCCAGAGATAAGGTATCAACGTCAGGGTAGCGCGCTTTCAGCCCGGCAAATGCTACAGCCATTTGACGTGCGACTTCAAACTGCCTTACATAATCTGACTCTGGCGCCGGGATCGCCATCAGTCCGCGAAGCCGCAGACGCGGCAGTGTTGCCACCGCCGCGGCCAGCTCATCCAGTTCCGCCAGCGGAATGCCTGATTTGCTGTTTTCATCGCTGATATTAATTTGGATCAGAACATTTAGCGCTGGCAGATTATCCGGACGCTGTTCGCTCAGCCGCGAGGCGATACGCAGGCGATCGATGGTATGACACCAGTCAAAATGCTCGGCCACCAGCCGACTTTTGTTGGACTGTAAAGGGCCTATAAAGTGCCAGTGCAGGCCTTCCACTTTCGCTTCCTGAAAGTGGCGGATTTTTTCCAC [...]
+TACTGCTGGAAAACATCGACACCTTTATAGCAGAGGTCGTGCCGCATGAACTGGCGCATCTGTTGGTGTGGAAGCACTTCGGACGCAAGGCTCCGCATGGCAAGGAATGGAAGTGGATGATGGAAAGCGTGCTGGGCGTTCCGGCCAGACGTACTCATCAATTTGCGCTGCAATCCGTACGGCGCAATACCTTTCCCTACCATTGCCAATGCCAGCAACATCAACTCACCGTCCGCCGTCATAATCGGGTAGTACGCGGCGAAGCGGTTTATCGTTGCGTTCACTGCGGCGAACCACTGGTCGCCGGGTAGTTCCCGAAACGTCCGGGAACTTTCCTGAGCGGACTGATTGCATACAGACACAACTTTCGTTACGTTGCGGGCTCGTTTTGCTATGGAGTGTGCAATGTACCGTAATTTTTCTTTTGCCGCTGCGTTGCTGGCCGCAGCGTTTTCAGGCCAGGCCCTGGCCGATGGCATTAACAATTTTTCT [...]
+NODE 554 3485 239105 236050 0 0
+ACTGACGGGTAATCCATGTTACCTGTTGCTCAATCACGGTTAGCCGACGGCTGGCCCAGTCGTGGTCCTGCGACAGATGATTTTCCAGCATGCGTTGACTGAAGGCTGGCTCGTCCCAGGGGATTTTGCCTTCATCGGGTAATAGCCGAATGCGATGCGTTGCAAAAATAACGGCGCTGATATCCATCATCATCTCCTTAGCGATTGTCAGGCTGGGCGCGAACGTTGTTCAGCCCGGTTGTATTAATGCGGTAGGGCTGACCGTTAACGGATTTGATCAGCTTTTTGGTTTTGAGTTTTTTGAATACAGCGAGCGTGCAATCGGCGAGCAACAGCCCTTCGCGGCTATAGCACTCCACGGCGGTGACGCGGCCTGACGCATCGCGGATGTGCGTAATGCGTCCGCCTTTGGCGAGAACGTGTAAGGTACGTTGTTCCTGACGGGATAAATTCATACTGAAGAACCTGTTTAATCATCATAGGCAAAACGTG [...]
+CTGTATGGCTGCGGCATCAAGACCATAACGTTGCAGCGTTTCGGCGGGATGATAACTGACCAACGTTCGCCCATCGGCTTGCTGGCTAATGAGCACCCGAAACGGTAAATCCAGCGCCAGTTCGGGATGCGCCAGCATGAGAGGCGTTCCGCCTTTAGGATTGCCAAAGACCAGAACCGTTGTCGGCGGCATTTTCAGGTTAACATTCTGTGCCGCTCTGGCATGATCAAATTCCCCAAATAACACCAGACCGTGATCGGCGACAGCGTGCATCAACCGCGCTCGGGTCTGCAAATAGTCATAAGCGCTGTAGGTTTTAACCATGGTTATCGCTCCATCCTCCGTTGCAAAGCCAGGCCTTATTAAGATTAACATCAGGGTTACCGCCAATAAAAAAGGCTTTAAAATAGTACTCATTCTTCTCTCTCCCTGACCCAATACCCATGAGTAAATGCGACACAGATGATATTCAGTTTAAAAATCAGTCATCGT [...]
+NODE 555 4935 286110 284903 0 0
+ACTTCCCTCATTTTCAGCATAACTCATGCTTCATCATCATTGAATAAACAATTAAGTTTGTTGAACGAAAATTTACTTAAAGAAAAAATAATAAGCCTTAATATTTTTTGCAGTATTTCAACTTATAGCAGAATAAATGTGCGTAGATGGCGTAAAAACCTGATGAGCAGGAATATCGATAGCCAGTAAATCACTCCTGTGGTAATGCAGGACACCTGATGACTGTGAAGGTAGCTTCATCTGTAGCGCCGGTGAAGTTCAGCGATTTAAGTGAAAAGTAGCCAGCAGGCGCTTCTGCTGGTCCATATTCCTCTATTTTGCCAGACCATACTGAAGTGCCACCCAAGTATCTGCCAGAACGATCCTGAGATAATAAATATAAAAGCAGTTACTGCCTACCTCAAGAAGTATGTGCTCATGATCATTTAAAGCTCTTTTAAAGAGACTGATAATAAGCTTGTCAATATAATATTATGCAGTCTCTATTAAGCG [...]
+TTCGCCCACTATAGATAAGGGGTAACATTGTCCCGTTTGATAACTGCGAATGCTTTCAGCCACCAGCGGAGAACGTAAATTCGGCGCGTTCAGAATCTCGTCGGCGCTCACCCAACGGCAGCAATCGATGTCATTGTCATGGGGTTCGGTCGCGCAAATATGATCAAGCTTGATAGCGAATAAAAAGCGCAGGAACGGGGTCTTATCCGGCGCAATCCACTGATGCATACGGATAAAATACTGTGGTTGCGCCGTGATGCCAGTCTCTTCCCACAGTTCACGCGCGGCGGCCTGCGCCAGCGTTTCATCTGCCTCCAGGTGTCCGGCAGGTTGATTCCATAACGATTTACCGTTGATGGTCTCTTCCACCACCAGAAATTTATCTTCGGCATGTACGATGCAGGCAACGGTCACGTGCGGCTTGAACATAGGCATCCTTATTAAAGCGGTTTATCAATGTGGTCATAGATCGCGTCAAGCTGTTTCAGACGC [...]
+NODE 556 6580 304702 302105 0 0
+CTATTAACTTTTGTACGATGCTGCGTAAGGTGCGGTTTTCGCCGTTAGTGATGTTATAAGCGCGGCCAGAAGGCAGATGATCGCAGCCCGGCTGGCTGGCCAGCCACATGGCGTGGATCGCATTTTCATAGTAGGTCATATCGACCAGCGCGCTGCCCCCGTGCGGTAATAAGACGCTACCGTAATGGTGCATCATATGCGCCAGACGTGGGATAAATACTTTATCGTGCGGGCCAAACAGGCTTTGCGGACGCAACACCGTAAAACGTGTTTGCGGATTAGCCTGCGCCAGCAGATTAATCACCTCTTCACCGGCGGCTTTACTGCGGGCGAACTCATTGGCAAACCGATGCGGACGGAAATCTTCTTTGATATCACGGTGATGGTGGTAATCAAAATAGAGTGAGGGAGAGGAGATATGAATAAAATTGCGCACGCCCCAGGCGACCGCCCATTCTCCCAGGCGGCGGGTGGCGCGAACATTCGCCAGAT [...]
+GTTTCAACAAACTGGAGTTCGGCGACATCGAAGGGCTGCCGCGTCTGGTCGATGCCGGTCAGTGTAACGATGCTTACTCCGCGATTATCCTGGCGGTGACGCTGGCGGAAAAACTGGGCTGCGGCGTCAACGATCTGCCGCTATCGCTGGTGCTCTCCTGGTTTGAGCAGAAAGCGATCGTGATTCTGCTGACGCTGCTGTCATTAGGCGTGAAAAATATTATCACCGGGCCGACCGCGCCGGGCTTCTTCACGCCGGATCTGCTGGCTATCCTCAACGAGAAGTTCGGTCTGCGTTCCGTGACCACCGTTGAAGAAGACATGAAGCAATTGCTGAGCGCGTAAGGAGGTCAATAATGACGATGCCAACCTCACAATGTCCCTGGCGAATGCAGGTGCATCACATCCGTCAGGAGACGCCGGATGTATGGACAATTGCGCTATTATGCCATGACTACTACCCTTATCGCGCCGGGCAGTATGCGCTGGTGAG [...]
+NODE 557 63 4698 4698 0 0
+CGCCTGTCCGGCCTGGCCTACGGTACCGACAGTTTCATTTTTCTCGTTAAGGACATCTGCGCC
+GGCCGGACAGGCGTACGTGCGCGGCGTAGAACAGCAAGGCGAACTTCGCGTGGTGTGGGGCAG
+NODE 558 2987 151509 150545 0 0
+CCAAGCGCGATCGCAACACGGCTATTGGCGCAGGTGCGGGGGCGTTAGGCGGCGCAGTGTTAACGGACGGCAGTACATTAGGCACCCTGGGCGGCGCGGCGGTCGGCGGCGTGATTGGTCACCAGGTTGGAAAATAATCCAGACGTTTAAATATTGAACGGCTCAAAATAATACGTTTATTCTTTTCAGGTCTGGATTACAAAAATAGACAAAGTTGACTTTTACGCCACGGTAATTTACAACCGTGGCGTTTTCATTAGCCGCCAGCTAATTTTACTTTCATTCCTTTAGCTTCCAGCAATGATTTTATCAAGTCGCGTTTATCACCCTGAATTTCAATAATCCCTTCTTTTACTGCCCCGCCACAGCCGCATTTTTTCTTCAGTTCAGCCGCCAGTTTGGTTAATTCAGCATCATTCATCTCGATACCGGTAATCAAACATACGCCTTTACCCTTACGGCCACTGGTTTGACGCTGAATGCGAACGATAC [...]
+TGGGCGCGCAGAATGATCAACAGGTGACGTTTAACTACCTGCTGGCGCAAGGGGAGTATCGTATCTCCACGTTGCTTGCTGTGCTGTTCGCCGTCGGTTTTGCGATTGGCTGGCTGATTTGCGGCCTGTTCTGGCTGCGGGTCCGCGTTTCCCTTGCCCGTGCTGAACGTAAAATTAAACGACTGGAAAACAAGCTTTCGCCAGCAACCGACGTTGCGGTCCCTGCCGATTCGTCGGTTGTAAAGGAATAATCATTTATGTTGGAGTTGTTATTTCTGCTGTTGCCTGTAGCCGCTGCCTATGGGTGGTATATGGGTCGCAGAAGTGCGCAACAAACAAAACAGGATGAAGCTAACCGCCTGTCGCGCGATTATGTCGCAGGGGTTAACTTCCTGCTGAGTAACCAACAAGATAAAGCGGTGGATCTGTTCCTCGATATGCTTAAAGAGGATACCGGCACCGTTGAGGCTCATCTCACTCTCGGTAATCTGT [...]
+NODE 559 4682 250149 245834 0 0
+TTTATAGAGCGCGGCCAGTGATTCCATTTTTTACCCTTCTGTTTTTTTGACCTCAAGTTCCCGCATCTTAGCACATCGCCCCACGAGAGCGTGATCTCTGCCGAGCGTGATCACATCGGCATTTCTTTAATCATTTATTTGCATTTTATTAACACAAAACACACACTTCGCTTCATCTGGTACGACCAGATCACCTTGTGGATTCAGGAGACTGACATGCTTTATAAAGGCGACACCCTGTACCTCGACTGGCTGGAAGATGGCATCGCCGAACTGGTGTTCGATGCTCCAGGCTCGGTCAATAAACTCGACACCGCAACCGTCGCCAGCCTCGGCCAGGCGCTTGAGGTGCTGGAAAAGCAACACGATTTAAAAGGGCTGCTGCTGCGCTCGAATAAAGCGGCCTTTATTGTCGGCGCGGACATCACCGAATTTCTTTCACTGTTCCTCGTCCCCGAAGAGCAGTTAAGCCAATGGCTGCATTTCGCTAAC [...]
+TGTTTGATATCCTCGATCCTTATCGTGATGTGATAATGAAAACTCTCGATCAGGGCGCTGTGTGCCTGAATATCGACGCCAGCCAGTCCGGCCATACGTTGAGCGAAGAAGATCTGGCGGCGCTGGACTCCTCCGACAAATTCGGGGATATCGTGGGTAGTGGGGCTGGCCGCAACTGGGCGCATGTCAACAGCGTCGACTATGACAGTGAAGATGATTCCATCATCATCAGCTCCCGCCACCAGAGTGCGATTATCAAAATCGGCCGCGATAAGAAAGTGAAGTGGATACTGGGTACGCCTGCTGGCTGGAAAGCGCCATTTAATGCCGCAATTCTGACGCCAGTGGATAGCAAAGGCCAAAAAATCGCTTGCCAGGACAGTGGCTGCGAGGGTGACTTCGACTGGACATGGACGCAACATACGGCTTTTAAAATTGATAGTAAGAGTAAAGGCGATATCTTATACCTTTCCGCTTTCGACAATGGCGATG [...]
+NODE 560 4947 272038 270066 0 0
+CGCACCCCAGCGCCAATGGTGTATATCGGCAATCTGGGTCGCGAACTGAGTCTGCCCGCCGCCAGTTTAACGCTGGTCGATAAGCTGGCAATGATGGAGCAATATATTGGCAAAAAAGTCATTGACGCAGTAGTGGTTGGGCCGCGAGTTGACGTCAGTGCGGTGAACGATCGGCTGGTGATTCAGGAAGTGCTGGAGGCCAGCGATATCCCCTATCGCCACGATCGTCAGTTATTACACAATGCGCTGGAAAAAGCGCTACAGGCGTTGGGTTAAGCCCGTTTACCGACGACGCTGCGCTTATCAAAAGCCTGTTTACACCGAAGGGTAAACAGGCTCCCTCCCTCCCTCTTCTGATAAACTGCGTTCAGCTACCGCCAGTAGGCGCTCATGAGCGAGCTCACCTCTTTTTTCAGCAATATATTCTCCATGAGCTCAGTACAGAGTGACTGATTAATTTCTTCCATTATTTTTTTCCCAATAGCACGCTCT [...]
+GCGGTGGAGTATTTCGTCTCCTACTATGACTACTATCAGCCGGAAGCGTATGTGCCAAGTTCGGATACGTTTATCGAAAAAGACGCTTCGGTAAACGAACATATTGAGCAAATGCGGTTGTCGGCAACGAAAGCGTTGCTTGAGCGACGCGATGTCGTGGTGGTGGCTTCCGTGTCCGCGATTTACGGTCTGGGCGATCCGGATCTCTACCTGAAAATGATGCTGCATCTGACGGTGGGAATGCTGATTGACCAGCGCGCGATTTTGCGTCGGCTGGCGGAATTGCAATACACCCGTAACGATCAAGCTTTTCAGCGTGGTACCTTTCGCGTGCGCGGCGAAGTGATCGACATCTTCCCGGCTGAATCTGACGACATCGCGCTACGCGTTGAGCTGTTTGATGAAGAAGTGGAACGCCTGTCGCTGTTCGACCCGTTAACCGGGCAGGTAGAGTCAACGGTGCCACGTTATACTATCTATCCCAAAACGCAC [...]
+NODE 561 1143 244527 242483 0 0
+AAAAAACCTATCCAAAATTTCACGTTTTGTACCATTCTTAAATGGCGCATAATCACCTATACCTTCACCATTCAAATCAACTTCATATATTTCTCGCCCCTCTGACTCACAACGTTGTTTCATAATCGAGTAAATAAATTTATCTGGTTTCTGATCCCAGAACCACAACCCCCAATTTTTCAATATTGCCTGGTCTGCAATAACCCCCTGAATAACACCTTTACCCGTTTGCGTTGCGCCTAAAATTTTAATATTTACTTTAGACAAATAGTCATCTGTAACGTAGATTGCTTTATCATTTTCATCTAATCCTAAAAAGAAATGACCATCCTTATAATAATCTAAAGGATTGAAGTTTTTAGGCGAATATTTACCTTTCTCAACACGAATATCACTCATAGTATCCGAGGTCTGAGACACACGAAAACGACGAAGCCATGATGATAGTTTTGGTCTTATAAGACGGCGATTAATTATCTGACAAGCATAGGG [...]
+GGTATTCACTCAGGAGGGTGGCAGGGTTTAGTGAGTTACGTAGACAGGTATTTAAGTTACAGAGATATGCAATGACAGAGTGGAAACGTTCCAGAAGAGGTGAATATCCTTATGAGAAGATTTTTGTTGGATGGTTAGGACGATTTAAACAAAGTGAAACCATCACAGATGAAGAGCTTTTGTTAATATCGAAGTCAAAAAAAGCTGATATCTTTTAGTTTTATCAACATAGCGTGAGGTGCTTATGCAAGCAAATGATGAGTTTCTTCGCTTGGTTTTTGAAAACATATGGCCCTGGTGGACATATGCTTGGGTTTTAGTTTTTTCTTTGTTATGTGTGTTTACATTTTCGGGTCATGCAGAAAAAAGTGGTGATAAGAGTACTCTGCGTTTCATTATTGAAGCAGCCAGGAAGAAATTACTTGTTGCATGGATTTTATGTACTCTTTTGTTCTTTCTATTTGTGTACATAATAGCGTGGAAACACTTTGG [...]
+NODE 562 117 10636 10636 0 0
+CGTTTTTCTGATTATCTGATTCATGCCGTTATCATAATGTGGATAGTTGTTACGAGTGTTTCTATTTCACTCAGCGCCATCATTAGCATCGTTTTCTGATAGAATCAGCCCCTTGCG
+AAATAGAAACACTCGTAACAACTATCCACATTATGATAACGGCATGAATCAGATAATCAGAAAAACGTGATGTTAACAACTCATTGAAAATAATGGGTAATTATTAAGACGAGAAGG
+NODE 563 3641 176214 174359 0 0
+GACAATCAGCTTGACGATGGCAATCACCAGCGCCAGCAACAGTCCGCCTGCGCTGAAGGTTTCCATCTGTCCCCACGGCAGAAACACGCCGACGAACATTTGCAGCACCACCAGTTGCTTAAGGCTGATGCCCCATTTCAGCACCGCAAAGCCGCTACCGCTGTATTCGGTCAACGGCCCTTCCTGCAACTCCTGCTCCGCTTCCGCCAGGTCGAACGGCAGCTTGCCCATTTCGATAAAGGTGGCGAAGGCGCAGGCGCACAGCGCCAGAATCAGCGGAATACTGCGCGCGACAGGCCAGTGATAAATGGTATCGGCGATATTGCTGATATGAGTTGAACCCGCCACCTGCGCGGCGACCCACAGACCCAGCAGCAGAATCGGCTCCACCAGCACGCCGAGCATCGCTTCACGGCTGGCGCCGATCGCGGTGAACGGGCTGCCGGTATCCAGGCCTGCAATAGAGAAGAAGAAGCGTGCAATCGCGAACAG [...]
+AGATGGCGAAGATAAACAATTGATTGCACAGGCGCAGCTCGATATCGACGGCAAGGTTGACGAACGGGTTAACAACCGCGATCGCGAGCAGGTGCTGGAGCACTATCTGGAAAAAATCGCCAGCGTTTACGACAGCCTCTATACCGCTGTAGAAACCAACTCGCCGGTTAATTTGCGCCAATTGGTAAAGGGAAACAGCCCGGCGGTATAAGCCTGAGGCGTTGCCCGCTTTGATTCGCGATGTGGCGTTGCGCCATGTCATGAATGTTTTGGGGATGGGCGTGTCGATAAGTGTCGAAAATGACATTTCAACGGCATGTTTTCGTCAAAAATGACAATCACCTGAGGAATGCCTGGTGAATCGTTTTGTAATTGCTGACTCCACTCTCTGTATCGGCTGCCACACCTGTGAGGCCGCCTGTTCAGAGACGCATCGCCAGCATGGCCTGCAGTCAATGCCGCGCCTGAAAGTGATGCTGAATGAAAAAGAAT [...]
+NODE 564 1936 97733 95303 0 0
+TCCGGTGGCGGTGGTCTCCTCCGTCAAGCTGGACACTCAGCGCGCCTATACCGTCATTCAGGCACGTCCAACCGCGGGTTTGCAGCGTTTGCGCTATCTGCTGCTGTTGTGGGGAGCCGATCGTAACGGCGCCAATCCGATGACGCCGGAAGAGGTTCACCGCGTCGCCAATGAGCGCCTGATGCAGATGATGCCGCAGGTGTTGCCTTCTCCGGATGCGATGGGGCCGCCGGCGCCAGTGCCGGACCCGGCGACGGGGATTACTCAGCCATCTGCGGGCCAGACTGCGCCGGTATCAACGCAACCATCGCCTTCGGGCGCGACCACGCCGCCTGCGCGTGCGCCGGGAGGGTAATGGTGGCGAGCTATCGTAGCCAGGGGCGCTGGGTTATCTGGCTCTCGTTTCTTATTGCGCTGTTGCTGCAAATCATGCCCTGGCCGGACGACATCATTGTTTTCCGGCCAAACTGGGTTTTGCTCATCTTACTGTAC [...]
+TCACTTTCGCTTTCGATACGCTGGGAAACGCCAACGTGTGACGCGCCGGGCATAAAAACAAGGTAACGGGAGGGCAACGTGATGTCCGTGGTCAAACGCGCGCCTTTCGTGCCGAGCGGATCTTTCACTACCTGCACCATCAGATCCTGTCCCTGACGCACCAGTTCGGAGATATCGCGCACCGTAAACTGTTTTTGCTCGTCGCCCGCCACGCATTCGGTATGCGGCATAATATCGGAAGCGTGAAGAAATGCGGCTTTATCCAGCCCAATATCTACAAAAGCCGCCTGCATACCTGGAAGTACACGACTTACACGACCTTTGTAGATATTGCCTACGATTCCGCGTCGCGCTTCGCGCTCAATATGGATTTCCTGAAGAATACCGCCATCAATGTACGCCACGCGCGTTTCCGATGGCGTTACGTTTACCAACAATTCAGCCGTCATGTTTATCCCTTTTATCACGCAGTGCGTTAAAATGACTCAACAA [...]
+NODE 565 2731 134727 133505 0 0
+GTATGGTGTTCTATCTGCCGAGTGCGATTCCGTCAGTGTCCGTGGGCCTGGGCATTCTGGTTGCTTTCAGCCAGGGGCCATTGCAAATGAACGGCACCCTATGGATTGTGCTGACAGCGCACTTTGTGCTGATTTCCGCCTTTACCTTCAGTAACGTGTCGACCGGACTGGCGCGAATTTCCGCCGATATTGAAAACGTCGCGTCGAGTTTGGGGGCATCGCCCTGGTATCGTCTGCGTCACGTGACGTTGCCGTTATTGATGCCGTGGATGATGTCAGCGCTGGCGCTGAGTTTATCGCTCTCCATGGGGGAGTTGGGCGCGACGATGATGATTTATCCGCCGGGCTGGACGACGCTGCCGGTGGCTATCTTTAGCCTGACCGACCGTGGAAATATCGCCGACGGCGCGGCGCTGACCATTGTGCTGGTGGCCATTACGCTGCTGCTGATGATGAAGCTGGAGCGCATTGCAAAACGGTTGGGGCAGAAAT [...]
+CAGCGAATAGGCATGAATGCATTCGACCGCCGCAGCTGGCGCATCCAGCGTTGCCGTACTGACGCCAAACATTTGACCGGTGGCGTAAACCAGAAATGGCCGCAGGCGTTTACCGCCTAATAATGCGCCATACTGCATGGCTTCGACCACGGGAGTGTTCTGAAAGGGCAGTGGCGCGATAAAACGGCTCAGCGCCTGATTCGCTTGCGTTACGCAAGCCTGTAGCTGCTGCGTAAAGTCCATTTACTCATTATCCGCGATAAAAGGCTCAGGTGAAGCCTCTTCATTATCAGACAGCAAAATTTGCACGCGCTGTTCCGCCTGCTGCAGTTTTGCCTGCCCCTGACGCGCCAGTTGTACGCCGCGCTCGAATTCATTCAGCGCGTCTTCCAGCGGCAAATCGCCGCTTTCCAGGCGGGTAACAATATGTTCCAGCTCGCTCAGCGCAGTTTCAAAGCTGGCGGGCGCCTCATTTTTCTTCGGCATGATGAC [...]
+NODE 566 754 46102 45698 0 0
+GACGCATTACTTTGATCCAGGGATTCTTCGGTTGCGCTTATCGACGGTGTGGCAATCAGAGCGCGGTAAATCTCGATAAATGGCGGTAAAACGTTTTTCATTGTTGACACACCTCAGGTCATGATAGTATCAATATTCATGCATTAATTATGAATAAAAATACATTAACGTTGAGCATAAAGGAACCCGATGTTGAATACGCTGATTGTAGGCGCTAGCGGTTATGCGGGCGCAGAGCTTGTAAGCTACGTAAATCGCCACCCACATATGACCATAACCGCTTTGACCGTCTCAGCGCAAAGCAATGATGCAGGAAAGTTAATTTCTGATTTACATCCGCAGTTAAAAGGGATTGTCGACCTGCCATTGCAACCGATGTCGGATGTACGTGACTTTAGCGCAGATGTTGATGTGGTGTTCCTGGCGACAGCGCATGAAGTGAGCCACGATCTGGCGCCGCAATTTTTACAGGCCGGATGCGTCGTATTCGAT [...]
+AGAAGCCCGCCGTCAATCAGCGGTTTTAGCGACAACTGCGCTGCGGTTGGATAGCAACCAGGAACCGCAATCAGATTCGCCGTGTTCAGTTTATCGGCATTCCACTCCGCCAGACCGTACACCGCCTGCTCCAGCAGCTCAGGATACTGATGAGTAAATCCGTAGTACTTTTCATAGAAGGCGCGATCGTTTACCCGAAACGCGCCGGAAAGATCGAATACGACGCATCCGGCCTGTAAAAATTGCGGCGCCAGATCGTGGCTCACTTCATGCGCTGTCGCCAGGAACACCACATCAACATCTGCGCTAAAGTCACGTACATCCGACATCGGTTGCAATGGCAGGTCGACAATCCCTTTTAACTGCGGATGTAAATCAGAAATTAACTTTCCTGCATCATTGCTTTGCGCTGAGACGGTCAAAGCGGTTATGGTCATATGTGGGTGGCGATTTACGTAGCTTACAAGCTCTGCGCCCGCATAACCGCTAGCG [...]
+NODE 567 954 47569 46921 0 0
+GCCGACTTGCCATATTAAATTTGGCGAAGCCAACGCAATCCTGGCGGGAGACGCGTTGCAGACGCTGGCGTTTGCCATTATCAGCGACGCGCCGATGCCGGAAGTCACCGATCGCGATCGTATCGCGATGATCGCCGAACTGGCGAACGCCAGCGGCATCGCCGGTATGTGCGGCGGTCAGGCATTGGATCTGGCAGCAGAAGGCCAGCGGATCACTCTGGACGCGCTGGAACGCATTCATCGCCATAAGACCGGCGCGCTCATTCGCGCCGCCGTTAGACTTGGCGCGTTGAGCGCGGGCGATAAAGGACGGAATACTCTGCCGATACTTGACCGCTATGCAGAGAGTATCGGCCTTGCCTTCCAGGTTCAGGATGACATTCTGGATGTGGTGGGCGATACTGCAACGTTAGGTAAACGTCAGGGCGCAGACCAGCAGCTTGGCAAAAGTACCTACCCTGCACTTCTGGGTCTTGAGCAAGCCCGGAATAA [...]
+GACGACCGGTAAGGATTTTATGTGGATAAGCCTGGTGTCCAACATCCCAGATTAGCTGGTCAAACGGGGTGTTGTAGACATAATGCAGCGCCACGGTAAGTTCTACCGTGCCCAGCCCGGAAGCGAAGTGCCCGCTGGAACGGCTTACGCTGTCGAGTAAGTAGCGGCGTAGCTCGTCGCAGAGTTTCGGCAGACTCTCTTTCGGTAACAGTCGTAACTCCTGGGTGGAGTCGACCAATGCCAGGGTAGGGTATTTGGCTATATCAAAACTCATCGCAAGCTCATTGGATATGGGGTTTATTTATCACGCTGGATTATGTAGTTCGCTAGCGCTTCCAGTGCCGAGGTGTCCAGTGATTGCGCGGCCAGCTGATGTAACGACTGACGGGCGTCCTCTATCAGGTCCCGGGCTTTATTCCGGGCTTGCTCAAGACCCAGAAGTGCAGGGTAGGTACTTTTGCCAAGCTGCTGGTCTGCGCCCTGACGTTTACC [...]
+NODE 568 19 2653 2585 0 0
+CGAGCTACCAGGCTGCTCC
+AATCCGGCCCCCGCAACCA
+NODE 569 8 1080 1078 0 0
+ACCCCGCG
+TCGGTTCA
+NODE 570 3 160 160 0 0
+CCT
+TCG
+NODE 571 3138 196885 195509 0 0
+GAAACGTGGCAAATTCTACTCGTTTTGGGCAAAATTTGCAAATACTGCTGGGATTTGGTACCGAGGACGGGACGTAAAATCTGCGCACAGTATAGTGACCAGGCATGAGTTATGTCAACCCTATTCCCAATATGCAGATGAATGAATATCACTCTTCGTTATACTCATCCCACCTCTCCGGCTTATACATGCATTTCACAACGTTATTTCAGTAAACCTTCACTAAACGCTTCCTGTCTCTGCTAAAAGATGATTAAATGAAAACTCATTTATTTTGCATAAAAATGCACTAAAGCAGAAACCGATCTCATTATCAGTCAATCAAGCAGGGTTCTATTCTATGACGACGATTCTTAAGCATCTTCCAGCAGGTCAACGTATTGGTATCGCTTTTTCCGGCGGTCTGGACACCAGCGCCGCACTGCTGTGGATGCGACAAAAAGGAGCTGTCCCATATGCCTATACTGCGAATCTGGGACAACCGGATGAGGA [...]
+TACACGCGTCCCTGGCATGGCCCCGTCAATACGTTGAGATAGCCCTCCATACATACTCATGTATGTCCTCTCTGGTGATCTCCCTGCGTCAGGTTCACTCCACCGATTACGAGATCATCTCCGTTCATTGAAGACGGTAGTTGCTCAGCTATAATCTGAAATGCTTGTATCTGTTATCCCCCTCCATATCTTTTGCTCAAGTAGTTTTATCTAATCTTCCTTTGCACTGAGCCGAATATCTAAGGAAGAGATTAATGAGTTTATTTTTCGATCGTGCTGGATTGATTGCCGAATTGCGCACATCCAATTTGAGCTCTGCTATTCAGGAGAACGTCGTGCAACAGGCACGTGCTGCTATTGCATTTAAACGTTGTCTGCGGGATATGGAAACAGTAAAGGTGGGGGCATCGCGGTTGGGCAGTCTACCCGACTGGCCATTAGGACAAAACTGGCCTATACGAAAAAAATCGGTTAATGCCACATCTCGCGTGC [...]
+NODE 572 2777 145471 141352 0 0
+ATAAAAACTGGAATAGCGCGCAGCTGGCGGGAAAAGTGCGCGTCCTGCTGCACATTGCGGGTCGAACGTCAGCGAAGGAAAAAAACGCCACGCTGATTGAAGCGATTAAATCAGCCAAGCTCCCGCATGACAGATACCAGACGACCACAATTGTGAACACTGATGATGCGATCCCAGGCTCCGGTATGTTCGTGCGTAGCAGTATAGAAAGTAATAAAAAGCTCTATCCGTGGTCGCAATTTATTGTCGACAGCAATGGCGTGGCGCGTAACGCCTGGCAATTAAAAGAAGAGGGGTCCGCCGTCATCGTGCTTGACAAAGACGGTCGGGTTCAATGGGTGAAAGATGGCGCGTTAACCCAGCAAGAGGTACAGCAGGTGGTCGACCTGCTGCATAAGCTCCTCAGTAAATAGTCACCCGGAAGCCGGGGTTAAGGAACGATTCACGAGGGGTATAGTCCAGCGTTTTTCCCTGCCAGTCGTGAACGTGCGC [...]
+GAGATAAAGATCGGCGGCGTTACGGAAGGTCAACTGGCCTTTTTCCACTTCGACAAAACTGGCAGGATCGTTCTTACGCCCGCCAACTTTAAACGGCGCGGCGGCGGACAGCACCGGCAGTTTCGCCAGATCCGGATCGCCCTGAATAAAGTGTTCCACATACGCTTTTTGCGCGTTATTCACCACCTGTACGGTAGGATCGTCCTGCACCAGAGCAAGATAACTGTACATGTTATCGGCGGATTTACCGATGGGCTTGCTGACAAACTCGCGGGTGGCATCGTGATCGGCTTTCAGAATACCGACCAGCTTACTGTCTTCCGCTGCCAGCGACTTTTTAGCGGCGGCGTCATAGATAGGCCGCGCTTCCGCTTTCGCCTGCGTAACCTGCCATTTGCCGCTGTCGTTATTGAGCACCAGATCGACCACTCCCAGATGGTCGCCCCACATGCCAGGCATTACCGCAGGAATGCCGTTAAGCGTACCTTTGGC [...]
+NODE 573 1507 71435 71077 0 0
+TATGCGTACCGCCGGACTGGACTCCTCCCAGGGGCCAACGGCCGCGAAATACATCCTGGAAACGGTGAAACCGCAGCGCATCGCTATCATTCACGATAAACAGCAATACGGCGAAGGACTGGCGCGCTCCGTGCAGGATGGCCTGAAGCAGGGCAATGCCAATATTGTCTTTTTTGATGGTATTACCGCCGGTGAAAAAGATTTCTCCGCCCTGATTGCTCGCTTGCAAAAAGAGAATATCGACTTTGTGTATTACGGCGGCTACTACCCGGAAATGGGGCAGATGCTGCGCCAGGCGCGGGCTAATGGCCTGAAAACGCAATTTATGGGGCCGGAAGGCGTGGGTAACGCGTCGCTGTCCAATATTGCGGGCGGTGCGGCGGAAGGCATGTTGGTGACGATGCCAAAACGTTATGACCAGGACCCGGCGAATAAAGCGATTGTCGAGGCGCTGAAAGCCGAAAAGAAAGATCCCAGCGGTCCGTATGTCTG [...]
+TAGGGGTTAATTACGCCATAGAACTGGCCGAGCAGCACGCCCGCCACCGCCGCCATTGCCGCGCCGATAACAAACGTTAGCGCAATGACGCGGTCGGTATTAATGCCGAGCAGGCTGGCCATTTTCAGATCCTCCGCGCAGGCGCGGCAGGCGCGGCCCATCCGGGAGTAGCGAATGAAAATGGTGAGCGCCAGCATAGCCAGAAAGGTGACTATCCAGATAACCGCCTGCATGGTGGTGATGGACGCGGCAAAGTTTTCGCTGCTGCCCACAATCCACTGGCCGTTAAACAGGCTGGGTAACGCCACGTCGCGCGAACCTTCCGTCAGGCTGACGTAGTTTTGCAGAAAGATGGACATCCCGATGGCGGAAATCAGGGCGATCAGGCGCTTGGAGTTGCGCACAGGCCGGTAAGCGACTCGCTCGATACTCCAGCCGTAGGCGCTGGCAATAATAATCGCGCCGATAAATCCGGCGGCCACCAGGAGCCAA [...]
+NODE 574 10882 681715 677009 0 0
+CATTGCCTCCCGACGGCTTGTTCAATCCAAGCCGGTTCACCAGTTCACGCTCTCGCTCATGCAGATAATCCATCGCCTTCTGGTGTTGCTCCGTCATCTCTCTGACGCTGCGCAATTCAGCTTCGTCACGTTCACGCTGCTGTTTCGCCTGGTTAATGCTGGTTACGGTCATAGATACCTCTCCCGCCCTGATGAATCATTAAAACGCCGTTAACGATGGCGTGATGCCTGGCTTCTTTGTCGTACAGATAACGCCTGACTGTATTGCGGTGGCACGATAAGCGCCGTGCTACTTCTGTCTGGTTTCCATATGTCTCTATGAGCATGTCTGGAATGGTTTTGATAGTGTGTGTCATGCGGCCTCCCGGATAACCTGCTCATGACTCAGATATTGACCCCAGCAACTGACCAACAATCTCGCTTTCACAGCGGCTTTCTCTTCGTTGCGCCACCTGCAGAACCAGTTAACAGCGCCTTCCATTTCTTGCCTGA [...]
+CAATTTCAAACTGAAAGTCACGGCACTTAAGGTCTTTGTTAAATCCCTTGAATGTCACAATTTCTTTGGTCATGTTGTTATTCCTTAAATTTTGGCAATAAAAAAGGCCGCATTGCGACCTGATTAGACGTGAGCATTGCTGTAGAAAATTCTGGATTGTGCCTGTCTTTTAACCACATCAGGCTCGGTGGTTCTCGTGTACCCCTACAGCGAGAAATCGGATAAACTCTATTCACCCCTACAGAGAGCAAAAAGAGAATCGCCGATGAACAACTCATGGTGGCAGGAGCTAATGCGTTTTTTCCTGCAAGGAATGACACTTAAACAGTTGATTCATATGCTAATCATCCTGATCGTATTGATTATTGTTATGCCGGTAAGCGTAAAAGAATGGATAAACCTGCATAATCCAGAAATACTTCCTCATTACTGGATGTATTACATCCTGTTGCTCTGCGTTAGCTATGTGCTTAACGGTGTTGTTAATTCCGT [...]
+NODE 575 4480 259079 256614 0 0
+CCTCTTCCGCCAACATCATAAACGGACTACGCTGCGCCAGTTCGCTCTCGGTTACCCGGCGCGCCAGGTATTCATGCCCCATCAGGTCGCCCGGTAGCGGAAGCCAGCGAGTGCTGATGCGCGTGAGATCGTTATCCAGTTGTTCCCGAACGTCAGGACGGATGCAAGAAATATGGATATGCAAATGGTCCTGTGAACGACCAAGCCGCGAATTAATCGCCAGCGAGACTGCGCTATCCGGAATATCATGCCCGTATTTTTTACTCATATAGCCGCGAGCCTGCCAGGCCAGCCAGAAAAAGTTGGGCGTAGCGGGTTCCAGCAATAGCGGGCTTTCTGTACCGTTGATACGGTAGGTGGGCATCAATAAATATTGCAACGGACCGTGACGATCTTTAAAGACGACATAGCCGGCGCGAGGTTTGACTTCCGCGCAAGGCGCTGGGTTTTGATGCTGTAACTGATCGGGCAGGCATTGTTCAAGCACGATTT [...]
+ACCGAACATCAGCGTCAGCAGATGCGAGATCTTATGCAACAGGCAAGGCACGAACAGCCTCCTGTTAATGTTAGCGAAATGGAGACAATGCATCGGCTTGTCACCGCAGAAAAATTTGATGAAAGCGCTGTGCGCGCTCAGGCAGAAAAAATGGCGCAAGAGCAGGTCGCCCGCCAGGTCGAAATGGCCCGCGTGCGTAACCAGATGTATCGCCTGTTAACGCCGGAGCAGCAAGCGGTTTTGAATGAAAAGCATCAGCAACGAATGGAGCAACTGCGCGACGTGGCGCAATGGCAAAAAAGTTCATCGTTGAAATTATTGAGTAGTAGCAACTCACGTTCCCAGTAACAACCCTGTTTTCCTTGCCATAGACACCATCCCTGTCTTCCCCCACATGATGTGGGGGTTTTTTTTATCTCCAGTTTGTCATTCTGTTATTAGCTTACTGTTTTAAACCATCCGTTATACTACCGGCAGAAGATAGCGGGAGTA [...]
+NODE 576 14 528 528 0 0
+TATAATTGTGAGAG
+ACCTGCCGCTGCTG
+NODE 577 987 62953 62953 0 0
+GGCTTTGCTTTGATATCCAAAAGAGCGCTAAGCAGACCGAGTACCGCGCTTATCGTCAGGACTCCGGCAGCTTCAACACCGTTTATCGTGCCGTGCATAACGCTTTCAATAATGACGTAAATGCATGAACCGATCCCCACGCCCCGAAGGGCGTTTTTCAGATGTTTATTCAAACGTGCAAAATGGTTTAGCGGCGTCATTTTTGGCATTCCTGCGCCTGCGTTATGATGATGATATCTTTATTGTTGGTGTACATGACGTTCCTATTCAGAATATGCGTCTTATCCGGACAGGAGGATGCTGTTCGGTAAAGCTGGCTGCCAATCCACGTATAAACGTAGCGGTTATCATACGCAAAACGTTCGGTGACTTTTAGCGGCCCATTGATGCTAAAGACCTGAATATCCTGAGCCTGCTGGCTATTATGCATAAAGTAGCCGTGCTCTTTTCCGGCGTTAATTTCCCGGTTCAGGAAGGGGGCTGTGCTATCCA [...]
+AGTACAGCGAGTGTCTTAAACACGTTTTTCATTATGGATTGCCTGTAAGTTCATGCTTTCTATTTTCTATCATCGCAGGAGAAGGCGTAAAAGCAAGCGTTTAGGGGCTCTTTATAAAATCTGAAAAGCGGCGCGTTGCCATGATTATTGCGCATTTACATCAGGAAACATGCTTTGCTCATCACTTCAGGTTTACGTACCACGTCCGGATGACCTTATGCAATATCGTAATTTGTTTTGCCTTTTTTCGCTTTCACTTCTGCTGCCTCCCGCCTGGGGATGCCGGCTGAGTGAACCTCCGCACAATGTTTATCAACGGCAAGGCAGCGGCGTGGTTTATCTCCAGCCAGAAGAGGAGAACAATCTTTTGTTGCCGGAGGTGAATTTCAAACGCCTGCGTCGGTTACCCAATTCATTGATTAACCCGGCAACTCAGGGCTGGAACTGGATAGCACAGCCCCCTTCCTGAACCGGGAAATTAACGCCGGAAAA [...]
+NODE 578 11626 616116 605479 0 0
+TTAAGCGTATACGCTTTTGGCATTGGGCTGGCGAATGCCGGACTGGTGCGTCTGACGCTCTTCTCCAGCGATATGAGTAAAGGAACGGTCTCGGCGGCGATGGGAATGCTACAAATGCTGATTTTTACCGTTGGCATTGAAGTCAGTAAACACGCCTGGTTAAGCGGCGGCAATGGGCTATTTAGCCTGTTTAATCTGGCAAACGGTATTCTTTGGCTACTGCTGATGCTGGTCTTCTTAAAAGATAAGCGGACGGGTAATTTGCAAACAGTCTGAGAGAGCGGCTACGCCTGATAAGCTTTCTGTTATCAGGCATAGAGAGGCATCCGCTAGACGTTGAACGGCGGCTCGTTGTTTAATACGCTGTCGATAATATCCAGCACGCCTTCCTGGTTGTTCGATCCGGCGCGGTATTTCGCCGCCGCCGCGACCGCTTCGCTGGCGTGCGACATGGCAAAACTAAACCCGGCCTGACGCAGCATCTCAATATCG [...]
+CAGATAGGCTTCGAAATAGAGCGGATCGTCGGTCAGTTGCAAAAAATTGCCGAGGTTGAGCGTAATCGACAACTGACCGTCAGCCCATTCCAGCAGATCGGTATACGGCGGGATCGCCCGCGCCATTTCCGCCAGACTTATCTTAAAGACGATAAGAAACGGCAGTAAAAACAGCAGAATGAGCCAGATATAAGGCAAAGCAATAACCAGCTTACGCCCATGTTTCATTTGCATTCGCGCCAACCATAGCGCCGCGCCGCCAGGTTTACTGATGCGTGCCGGAGGTTCAAGTGTGCTCATGTTTACCCCTTATACCGTCAGGACCACGCAGCTATCCGCTTCCCAGCACAAACGCACTTCATCGCCCCAGGTCGGTAACCCTTTCCGGTAACGGTGCGCATTCTGCAGTTGAGCGCTGATCATCTGCCCGCTTTTTAGCCGCACATGATAAATAGACAGATCGCCGAGATACGCAATATGCGCCACTTCGCC [...]
+NODE 579 635 30687 29264 0 0
+GAGTTCGACGCCTTGCTATTGCCGGGAGGCCATTCGCCGGACTACCTGCGCGGCGACAGCCGTTTCGTGGATTTTACCCGCGATTTCGTTAACAGCGGTAAACCGGTTTTTGCCATTTGCCACGGCCCACAGTTGTTGATCAGCGCCGATGTCATTCGTGGCCGCAAACTCACGGCGGTGAAACCGATTATTATCGATGTGAAGAATGCGGGCGCGGAATTTTACGATCAGGAAGTCGTCGTCGATAAAGATCAGCTGGTGACCAGCCGCACGCCTGACGACCTGCCGGCATTTAACCGCGAGGCGCTACGCCTGCTGGGCGCGTGAGTCACGTAACCAGTGCAGTTTTTTACCAAACCCCAGCGTGTTGTCGGTGAATTTAATTTCATCCAGCCGAATTTCCCATACCGGCGCTGGCAGCACCCTGGCGACCGGGAAGCGACGAAGGTAAGCTTTACGCGCGGCGTCGCTCTCCTGCCCCTCCAGACGGCG [...]
+ATGTCCGGCGCGTGCGCGCCAGTTGCGGGAACGGTCAATGGTCAGCCGAAAACGGTGGCGCGCATTCGCGGCGTGCAGTTTAAAGGGGAAATTCGCCGTCTGGAGGGGCAGGAGAGCGACGCCGCGCGTAAAGCTTACCTTCGTCGCTTCCCGGTCGCCAGGGTGCTGCCAGCGCCGGTATGGGAAATTCGGCTGGATGAAATTAAATTCACCGACAACACGCTGGGGTTTGGTAAAAAACTGCACTGGTTACGTGACTCACGCGCCCAGCAGGCGTAGCGCCTCGCGGTTAAATGCCGGCAGGTCGTCAGGCGTGCGGCTGGTCACCAGCTGATCTTTATCGACGACGACTTCCTGATCGTAAAATTCCGCGCCCGCATTCTTCACATCGATAATAATCGGTTTCACCGCCGTGAGTTTGCGGCCACGAATGACATCGGCGCTGATCAACAACTGTGGGCCGTGGCAAATGGCAAAAACCGGTTTACCGCT [...]
+NODE 580 16726 924814 911347 0 0
+CACCTCCATCAGCAGACGATCCGGCAGTTGCCCGGCTTTTACTTCCAGTACCCCATCGTCACGCTGGCCGAAAGTCCAGGCGCTGGCGCAAATATTACGAATGAGATTTTCCAGGCCGCCGACATTCCCTTCCAGGGTCTCCTGCATCAGTTGGCTAATAATTTCACTATCCAGCGACAAATCGTGATGAAGACGCTGCGCCTCGCGACGGAAAAAATGGTGAATAAACGCCAGCCGCTCATACTGTCCGCGTTCGGCGATGGGCAGAATTTTGACAATGACCGGTATCCGGCGAATAAATGTCGCCAGAAAGTGCTTTTCCAGATCTTCGGTAGAGGCGAATATCAGGCGTACGGTGGCGCTGCGTTCATCGCTGCTTTCGCCTAAGCGACGCCAGGTGCCGTTATCCATAAAATGGAACAGTTTTTCCTGCCCTTCCGGCGGCAAACGGTGCACTTCATCGATAAACAATACGCCGCCATTACTGGTCTC [...]
+CGAAGAACAGATTGCATTTGCCCTGAAACAGGCTGAAATCGGCACTCGCGTCGGGGAAGTCTGCAGAAAGATGGGAATTTCTGAGGCCACATTTTACAATTGGAAGAAAAAATTTGCCGGGCCGGGCGTGACGGAACTGCGGCGTCTGCGGCAACTGGAGGATGAGAATCAGCAGCTGAAGAAGCTGGTCGCTGAGCTGAGTCTCGACAAGGAGATGCTGCAGGAGGTACTGAAGCAAAAGTTCTGAGGCCGGCTCAGAAGCGCCAGGCGGTGATGCGGGTTGCAGATGCAGAGCAGAACCGTTTACCACTGGCAGAGCCGGCGTGACGATCGGGCGATAACCCTGCGTATTCATATTCAGTTGCGCCGGGAGGGATGGCCTGTTAACCACAAGAAAACCCACCGGATTTATTGTCCGGAAGGCCTGAACCTGCGCAGAAAACGCCCCGCAGACATGTCAGTGCAGCACGCCGTCAGCAGCGCCCGGTCCTG [...]
+NODE 581 3711 195310 193187 0 0
+CAGCAACGCTACCAGCAAAAAAACGCCTACCCAAATTTCATTTTTTTTCGTTTGCATGAACTCAATTCCCAAACATCAGTGCGGTCAGCACAAAATCCAGCCCCAGAACGGCCAACGATGCGTGAACCACGGTACGCGTCGTTGCCCGGCTAATCCCGGCAGAAGTCGGTATTGCGTCATAACCGTTGAATAACGCAATCCATGTTACCGTAATGGCGAACACCACGCTCTTTATCAGACAGTTCACCAGATCCATACGCCAGTCGACGGCATTCTGCATCGCGGACCAGAAGAACCCGGCGTCGATTCCTTTCCAGCTTACGCCGACCAGCGAGCCGCCCCAGATACCGACCGCCACAAAGATAATGGTCAGTAGCGGCAACGAAATCACGCCCGCCCAAAAGCGCGGCGAAATCACCCGGCGCAATGGATCGACCGCCATCATCTCCATACTGGAGAGCTGCTCCGTCGCCCGCATCAGGCCGATTTCCG [...]
+CCCATATCGAACACGCGACGTAAATCGCCGTCGGTGAAGATACCGTCGATCTTCATGGATTCATCGCAAATGACGGTCATACCGAGATTTTTACGCGTAATTTCTAACAGCGCATCACGCAGGGTGGCATGTTTATTAACATGCGGGATCTCATCGCCAGTATGCATAATATCGCTTACGCGCAGCAGTAGCTTACGTCCCAGCGCGCCGCCAGGATGCGACAGAGCGAAATCCTCGGCGGTAAAGCCGCGCGCTTTTAACAATGCCACGGCGAGCGCGTCGCCCATCACCAGCGTTGCGGTGGTACTACTGGTAGGCGCCAGTCCTAACGGACACGCTTCTTTGGGCACTTTAACACACAGATGCACATCTGCCGCACGCGCCATGCTGCTTTCCGGTCGCCCGGTAATGCAAATTAACGGTACGTGCAGACGTTTAAGCACCGGTATTAGCGCCGCGATCTCGCTGGATTCGCCGGAGTTGGAGATAGCG [...]
+NODE 582 4668 237166 235066 0 0
+GGAGAGCGGAACGGCAGACAGGGTATAACGGGGAAATCGCACGCGCGGAACAGGACGTCGGGGGCGAAGATCGGCTAAAATAGTGTTTTTCTGATTTTTAGCCTTAGCCTCTTTTAGTGAAGCATTAATGATGAAACCTCTTCGCCAGCAAAATCGCCAGATTATTAGCTATATTCCGCGTGTTGAACCCGCGCCGCCGGAACATGCGATAAAAATGGATACGTTTCGCGACGTCTGGATACTGCGCGGTAAATATGTTGCCTTTGTTCTGACGGGGGAGTCATTTCAACGGTCGCCCGCCTTTAGCGTGCCAGAATCGGCGCAACGTTGGGCGAATCAGGTTCGCCAGGAAAACGAAATCGCTGACTAAGAAAAAACAAAACGCCGGTACTGGAGACCGGCGTTTTTAGTGACAGACATTTTGAGTTGCCGATCGTCGTGTCTCAGACGATGTGAACGCCCGATAATGTATTATCGATGCGCCAGTTCAGC [...]
+TTTGACAACGCGCTCTCTACCACGCCGCAGCCGAATACCTGGCAACGCCGTTGGTCGACTTTTTTCGCCGAACAGCGCATTGGCTGGCAACTTGAACTCGCTGCGGAAAAAGGCATTACCTTTGGTAATATTGACGCCATTGTTGAACATGTTCAGCAACGTCTGGCGTCGCATCAACCGCAGCCTTCTCTTTTGCATGGCGATCTATGGTCGGCGAACTGCGCGCTTGGCCCTGACGGCCCCTATATCTTCGATCCAGCCTGCTATTGGGGTGACAGAGAATGCGATCTGGCGATGCTGCCACTGCATACCGATCAGCCACCGCAGATTTATGACGGCTATCAGTCCGTTTCGCCGCTACCGCTGGATTTTCTCGACAGGCAGCCGATTTACCAGCTCTACACCCTGCTTAATCGGGCAAGGCTGTTTGGCGGTCAGCACCTGGCTACTGCGCAAAAAGCAATGGATCGGCTGCTTGCAGTATAGGTACAG [...]
+NODE 583 3953 191783 187279 0 0
+AATAGCGCGACGCTGTATATATGCATATTTTATGATTAAGAATATATTTATTATACCGATAGTAAAAACCATTTTTTCCCGTTAGCGAAGGCGGTGGATTAGCGCTAGCGTAACAGTAATATTCAACTGATTTTTATAACAATTTATTTTCATTTGTTTTTCCTGAATATTACTGTGGAGTATGTGATGGCTATCAAAATTACGCCTGACGAGTTTAGTTTGCTTATCCAGCGATTAAACAAAAAATGGCGCGTGTTTGCCCCGTCCGCAGAGTTTCGCGGCGGACGTTTTTCCGACACTGACAACATTATTTATCAACGGATTAGCGGCTGGCGCGATCTCATCTGGCACGAGAAATCGCACATGTCGCCGAATACCATTATCGCCCCTATCACCGAAACGCTCTTTTATTTCGATAAAGACACCATCCAAATTGCCGAGACAGACACTTCCCCGATAATCATCTTTGCCCGCGCCTGCGACATTAACGCC [...]
+AGCAGTTGAGCGCGCTGCTTAATGCGGTGGCGACGCATCCTGAGCGGGCGGGCGGATCGTTGCTTCTGCTGAGTTTTATGTATGGCGTGCTTCATGCGCTGGGGCCGGGACACGGCAAAGTGGTGATCGCGACATGGCTGGCGACGCATCCTTCGAAGCTGAAATCAAGTATCGTGCTAACCCTCGCCGCCGCGTTATTACAGGGGCTCGTGGCTATCGGGTTGGTGGTGGGCGTGCTGACCGTATTGCAACTTCCGGCCAGGCAGCTCCATCTGAGCGGTTTCTGGCTGGAAAAGGGGAGCTATGCGTTAGTTGGCGGGCTGGGCATCTTGCTGTGCTGGCGGGCCATAAAAAGGTTACGCGCGCTGCTACGTAAACCTGCCTTTATCGCTTTTACGCCGCGCCATGTTCACCATGAAAAATGCGGCTGCGGACATCAGCATTTACCGACGCAGGAACAATTGCATAGCGGCGATGACTGGCGCGCGCGAC [...]
+NODE 584 23 7413 5428 0 0
+CCAGCTATCTCCCGGTTTGATTG
+CCTCGTGAATTCATCTCCGGGGG
+NODE 585 5 1671 1648 0 0
+GCCTT
+TAGCG
+NODE 586 17 5798 3269 0 0
+TCACCCCCAGCCACAGG
+CCCGAAAGCTATTTAGG
+NODE 587 5 1724 1472 0 0
+TCATC
+TTCTC
+NODE 588 16 5747 2777 0 0
+CGCTAATTTTTCAACA
+ACCGGGAGATAGCTGG
+NODE 589 28 10904 10540 0 0
+ATTAGCGGATGACCTGTGGCTGGGGGTG
+TCCTCCAGTTAGTGTTACCCAACCTTCA
+NODE 590 876 44737 43391 0 0
+ATCACAGGGTGTTAGTATTTGGCAATCAAGACGTTTAGATGTCTAAATATAATAACAGCGGTGAGAAGACCCTAAGGACAACACAACATGAACCACACTGAAATCCGCGTCGTTACCGGCCCGGCGAATTATTATTCCCATGCCGGAAGTCTCGGAAGACTGACAGACTTTTTCACGCCGGAACAGCTTTCCCACGCCGTTTGGGTGTACGGCGAACGCGCGATTGCCGCCGCCCGGCCTTACCTGCCGGAAGCGTTTGAACGTGCTGGCGCAAAACATCTGCAGTTTACCGGCCATTGTAGCGAACGCCATGTTGCCCAACTGGCGCACGCCTGCAACGACGATCGTCAGGTGGTAATAGGCGTCGGCGGCGGCGCGCTGCTCGATACCGCCAAAGCGCTCGCCCGCCGTCTGGCGCTGCCGTTTGTCGCTATCCCGACCATCGCAGCGACCTGCGCCGCCTGGACACCGCTTTCCGTCTGGTATAACGAC [...]
+CAAGGCCGCCGACCATACCGCCGCCAGCGATAATCGCATCCACCACGTCGCAAAATGCCTGGGTCAGCCGACGCTGCTGTTTATCCGCTAATGCTTGTTCGCTGTTGTCCAGCAGGAGATCGCGAATAGCGCACGCGCTGTTAATGCCCAGTCTTACGGTCAAAGGTAACGTTTCAGGCTGCGGCGCAAGCACAACGGCTTCATACCATTTCGCCAGCGTATCGCCAATGCCAGCTAACAGATAGTCATCGGGCGCCTGCAGAATAATGCGCGGTTCGACCAGCACCAGAAAATTGGCATCATCAAAAATTTCGAACTGTAACGCCTGTCCCGCGTCGTTATACCAGACGGAAAGCGGTGTCCAGGCGGCGCAGGTCGCTGCGATGGTCGGGATAGCGACAAACGGCAGCGCCAGACGGCGGGCGAGCGCTTTGGCGGTATCGAGCAGCGCGCCGCCGCCGACGCCTATTACCACCTGACGATCGTCGTTGC [...]
+NODE 591 6749 358715 351015 0 0
+CTGGGAATGTTCACCCAGAAAGGGAGTTTTGAGGCGGAGCTGTTCAACCGCGAAGGCGAACTGTGGCCGGAAGCGGATGTGACGCTGATAGACCTGGGGCACCTGGCCCGTGAGGGGTATGAGGCGCAGATGGCGCTGACCATGGTGTCGATGACCAACATGATCAATAACATTGCCGAACGTGACCAGTATCTGGGGCGTGATATTGTGTTTGCCGTGGATGAGGCGCATATCGTGACGGTGAATCCGCTGCTCTCGCCCTATATGACGAAGGTGGTGAAAATGTGGCGTAAGCTGGGAGCCTGGCTGTGGCTTGCGACGCAGAACCTGAAGGACTATCCGGATATATCAGAGAAAATGCTGAACATGGCGGAATGGTGGGTGTGTCTGACGATGCCGCCGGAAGAGGTGAACAACATTGCCCGTTTTAAATCCCTGACGGAGGAGCAGAAGGCGGTGCTGATGTCGGCGAGCAAACTGTCCGGCTGTTAT [...]
+ACATTACCTTCTGAAGCAACAGTTCTCAGTTTGCCTGTATAGAACGGATGCGACTTAGAAGAAACGTCAATTGTAACATATGGGTAAGTTACCCCATCCAGTTCAATTACCCGGTCAGTTTTGATCGTCGACCCGATCCTGAAGTACTCATCAACACACGTGCTTGATGAAGTGATTTCGTTACTGATTGATATCATCGATCCACAATAAAAATAAGCTAAAGTAGCTGGCATTGACACGATTTACGTTTCTTATCATCTCTCTGCCGCTTCTTTCTTCCATTGAACATTTATAATACAGCACGTATGATATCACTGTGATAACTACCTGCTCAGGGGAGCTGCGCTATGAAAAACGAAGCAGAAAAGGCGATGTGGAGTTGCAAAACCTCGGATACCCCATGGACCTTCAGTTCCCTGCTGAAAAAGGCTGTCTGCGCGATTTTGCCTGATGCAGAACCGAAGATTGAGAATGCCACAAAAGGATGTTCTG [...]
+NODE 592 15 777 777 0 0
+TTGATGCGAAAAAAG
+TGGGTAAAGCGTGCA
+NODE 593 208 11327 11259 0 0
+GAAGTATGGCATTAACTTTCGGGGCAGTTCACTACTCGACAGAGAGTAGGACAAAAGCGAAAGCTTTTGAACGTTGCGAAGCAACGGCCCGAAGGGTGAATCACGAAGTGATTCATAAACTGCCAGGCATCAAATTGCAGTAAACCGGGATGAAAATCCGGGTTGTGACAAAGAAATTCGGTGGAGCGGTAGTTCAGTTGGTTAGAAT
+GATTTTCATCCCGGTTTACTGCAATTTGATGCCTGGCAGTTTATGAATCACTTCGTGATTCACCCTTCGGGCCGTTGCTTCGCAACGTTCAAAAGCTTTCGCTTTTGTCCTACTCTCTGTCGAGTAGTGAACTGCCCCGAAAGTTAATGCCATACTTCTAATTTGATGCCTGGCAGTTCCCTACTCTCGCATGGGGAGACCCCACACT
+NODE 594 27 1296 1296 0 0
+ACCCGCGACCCCCTGCGTGACAGGCAG
+TTATTAAGAGCCCTGAGCATTAGCTCA
+NODE 595 3965 220226 217116 0 0
+CGATTTCGCAGATTTCTGAAACGTTATTCATCCTGACCATTCCGTTCTTCCTGAGCCGTTATGGTATTAAGAACGTTATGCTTATCAGTATTGTGGCGTGGATGCTGCGTTTCGGCCTGTTCGCTTATGGCGACCCGACGCCGTTCGGTACCGTTCTGCTGGTATTGTCGATGATTGTGTACGGCTGCGCCTTCGACTTCTTCAACATTTCTGGCTCGGTGTTTGTCGAAAAAGAAGTACGCCCGGAAATCCGCGCCAGCGCGCAGGGGATGTTCCTGATGATGACCAACGGCTTCGGCTGTATCCTGGGCGGCATTGTGAGCGGTAAAGTGGTGGAGTATTACACTCAAAACGGCATTACCGACTGGCAGACCGTGTGGCTCATCTTCGCAGGCTACTCGCTGGTGCTGGCCTTCGCGTTCGTAGCCTTGTTCAAATACAAACACGTTCGCGTTCCGGCAAGTTCGCAACCCGTTGCACATTAATCCTTGC [...]
+AGGCGCATTAAACCGTAATCGCCTCGCTTCGTCAACGAAATTTCTTCAAATCAACGTAGACTGCACAATCTATCACCACTTTGTTGTTATTGCACGCAGAGTCAGGCAAAAAACATCGCCCATGCGGCGGAGATCGGCATCGCCAGCAACAGCGCCGGGAGCATATTCACTACCGGAAACATTTTGATTCCACATACACGCAAGCCGGTCGCCACCAGCAGCAGTCCGCCCACGGCGCTAAAGTCGCCCATCATTGCCGGCGTAGTTAGTGGAAGAATGAGGGTGGCGCAGGCGGCAAGCGTTAACTGGATAATCAACATCGGCGCGCAAATCGCCGAAACGGCGATGCCAAGCGAACAGGCGAAAATAATGGCAGTGAAAAAATCCAGAAAAGATTTAGCGATCAAAATGTTTGGATCGCCGGTCATCCCTTCATGCATCGCGCCGAAAATACCGGTGCCGCTGGCGCAAAAAAGTACAATGATAGCGACG [...]
+NODE 596 10 441 423 0 0
+ATTTTGGGTT
+ACCAGCCTGG
+NODE 597 1877 96061 94769 0 0
+TCACACCGCACATCACCCACTACCTGCATAACATCCCGACGTTTATGTACTGACATCGGACAACGCAGGATCCTGTTTTTTGACAGCAGCCACAGGCTGGATTCTTTATGCTCGCTCTGCAGGCTAAATCGCCCGGAAGGTCCCAACGACAAAAATGGATGGTTCAGTGGCTGTGCGTCCAGCAGCGGTCTGCCATCCTTGTCCAGTACGCGGCCAACGTACAGTCGGCTCATACTGGCGCTGATGTTGTGAACCAGCAGATGCCCGGGTGTCAGGAAGTAACGCCTGCTTCCCCCTCCCGCTTTTACGCCTGCCATACCCTGTGAACTAACCCCTGCATCCTCAATGGTCACCTCCGTGGCGTTATAGCCTTCCATCAGCAACAGCGACTGCTGACCAAAACCGAGACTGAACGGCTGGCTGCTGCCACGAACGCTGACTACTTTCCCGCTACTGCCCTCGTCCCCCTCTGACTCCACGTTCACCGCCATG [...]
+CAGTCTGCTTCCCCTGAGCCGGTTTGATGGATTACGAACCGGGACCACCCAAGCTTATGTTAACCATGAGGTGGACCAGAATGCCACTCCGGTTATGGTTCAGGTTACCCGAAATGCCCGTATTGATATTTATCGTGGCAGCGAGTTGCTGGGGAGTCAGTTCCTGACCCCGGGAATGCATACCCTGGATACTCACTCTCTTCCACCGGGAAGCTATCCTCTGGCGTTGCGGGTGTATGAGGATGGGATTCTGCGGCGAACGGAGACCCAGCCCTTCAGTAAGGGGGGCAATAGCTTCAGTGCACAGACCCAGTGGTTTATTCAGAGCGGGCTGGAAGATACCGGGGATAAAGCCAGCCATTATGACGGTGAGACTGTCATGGCTGCCGGATTCCGAACTGGGCTGCGGAAAAATATCAGTCTGACCGAAGGTATCTCTCTGGCACATGAGGCCTGGTACAGTGAAACCCGACTGAATTCACAGCATGCAGT [...]
+NODE 598 14447 793309 782150 0 0
+CTATTGAGACGAAGATGAGCGATCTGTTTTCCTCCCCTGACCATACGCTTGACGCCCTGGGGCTGCGTTGCCCTGAACCGGTAATGATGGTGCGCAAAACGGTGCGCAACATGCAAACTGGCGAAACATTGCTGATTATCGCCGACGATCCGGCGACGACGCGTGATATTCCGGGGTTCTGTACCTTTATGGAACACGATTTGCTGGCGCAAGAGACGGAGGGTCTGCCGTACCGTTATTTATTGCGTAAAGCGCATTAACCGCACGGCAGATAGCATTCTGATTAGAAGCTTTCCCAGTTCGCCTGTTCTGCGGCGGGCTGTGGCGTTAAGCCTTTGCTTAACGGCGTCGGCGACGCCTCCCGACGAGGTTGTTTCTGGATGCGGAACGCGGCGACCGCCTGACGAAGTTCGTTAGCCTGATCTTCCAGCGCCGCCGCCGCTGCTGCGGATTCCTCTACCAGCGAGGCGTTTTGCTGCGTCACGCTGTCCA [...]
+GATCATCAGAATACCTTCATCTTCATAGATATCGGATGCTGGCTGAGTAGAAGAAGAACACAAGTGACCAATAACGTACTGAATACCGTCGTTAACGATTTTGTTGGCCACCGCCACCGCCTGTTTTGGATCGCAGGCATCATCGTACTCTACGCCGACCAGCTTATCGCCTTTAATCCCGCCTTTAGCGTTGATGTCTTTAATGGCCTGGCGCGCGCCGTTAAATTCCATATCGCCCCATTGCGCTACCGGGCCGGACATCGCCCCGACTATGGCGACTTTAATATCATCTGCCATTGCCCCCTGCGAGACTGCTAATGCAACAATCCCTGCGATTATTGTTTTCGCTTTCCGTTTCATGTGCCTGTATCCCCATTCGTGATGTTATATGTTTTGTTTTTTGCTGGTTAAAAAGCAGACTGTACTTTTTATAAATGGTGCGCTTTTTACTGACTCATTAATGAGTTAGCGCAGCATTTAAAGCATAATAAG [...]
+NODE 599 34 2286 2045 0 0
+ACCAGCCTGCCGTTTGACGTGCAGATGCAGATTG
+TAAATCTCGTTAGAGGTCAGTCCTTCCGGCTCAA
+NODE 600 7135 433592 430405 0 0
+TCCGTTCCATGCAGGGCATGGAGAACGCGAAGATCGTTCGCCCTGGTTACGCGATTGAGTACGATTTCTTCGACCCGCGCGATCTGAAACCGACTCTGGAAAGTAAATTTATTCACGGCCTGTTCTTTGCTGGTCAAATCAACGGTACTACTGGCTATGAAGAGGCTGCGGCGCAGGGCTTGCTCGCTGGTCTGAATGCCGCGCGTCTTTCCGCCGACAAAGAGGGCTGGGCGCCTGCGCGTTCTCAGGCTTATCTCGGCGTGCTGGTGGACGATCTCTGTACGCTGGGCACCAAAGAGCCGTATCGCATGTTTACCTCCCGCGCCGAATATCGCCTGATGCTGCGTGAGGACAACGCCGATCTGCGTCTGACCGAAATGGGCCGCGAGCTGGGTTTGGTGGATGATGAACGCTGGGCGCGATTCAACGAGAAGCTGGAAAATATCGAACGCGAACGTCAGCGGCTGAAATCGACATGGGTAACGCCGTCTG [...]
+AGTATCCAGCAGCGCTTTCGGGTCTGGTTCATACAGGTAATCCCAGGCTTTACGCTTCAGATCATCATCTTCTGACGCCGGCAGCGGCAGCAGTTGAGTGATCGTCGGCACCTGAGACATGGTGTTAATAAATTTGTTGCTGACAATGTAAAGCTTGTCCAGACGGCCTTCGTCGTAGGCCTGCAACATCACTTTAACCGGACCGATCAGTTCGGACAGAGAAGGGTTATCCCCCATACCTGTCACCTGAGCGACAACGTTGCCGCCTACGGAATTAAAGAATGACACGCCCTTAGAGCCGATCATTGCGAGTTCGCACTGAACGCCTTTATCGGACCATGCCTTCATATCCGCCAGCAGCTTTTTGAACAGGTTAATGTTCAAGCCACCGCACAAACCACGGTCGGTCGACACTACCAGGTAGCCCACGCGTTTAACGTCGCGCTCTTCCAGGTAGGGGTGCTTATATTCCAGATTACCGTTCGCAAGGTG [...]
+NODE 601 94 37593 35611 0 0
+TGTGGGAAGGCCCAGACAGCCAGGATGTTGGCTTAGAAGCAGCCATCATTTAAAGAAAGCGTAATAGCTCACTGGTCGAGTCGGCCTGCGCGGA
+GGCTGCTTCTAAGCCAACATCCTGGCTGTCTGGGCCTTCCCACATCGTTTCCCACTTAACCATGACTTTGGGACCTTAGCTGGCGGTCTGGGTT
+NODE 602 5 2005 1999 0 0
+AGATG
+ATGAT
+NODE 603 12 5024 5010 0 0
+TAACGGGGCTAA
+CGCTTTCTTTAA
+NODE 604 6 2662 2642 0 0
+ACCATG
+CTATTA
+NODE 605 20 9006 8936 0 0
+CACCGAAGCTGCGGCAGCGA
+AGGCCGACTCGACCAGTGAG
+NODE 606 1 203 202 0 0
+C
+C
+NODE 607 4 262 262 0 0
+GCTG
+CGCG
+NODE 608 56 21615 19163 0 0
+CCCTGCCCCGATTAACGTTGGACAGGAACCCTTGGTCTTCCGGCGAGCGGGCTTTT
+GCAGGGTGAGTCGACCCCTAAGGCGAGGCCGAAAGGCGTAGTCGATGGGAAACGGG
+NODE 609 10621 509051 502181 0 0
+TGGGACTATCACTGTTTCAGCGGCATTGATCACATCGAGAATCCCGACGAAGACGGCATTTTTAAGATCGTCAATGACTATACCGGCGATGGCTGGAACGATCAGGTTGATGATGAGATGGGTAATTTTGACTATCTGATGGGGGAAAATATCGATTTTCGCAATCACGCGGTTACGGAAGAGATTAAATATTGGGCTCGTTGGGTCATGGAACAAACCCACTGTGACGGCTTTCGCCTGGACGCGGTAAAACATATACCCGCCTGGTTTTATAAAGAATGGATTGAGCATGTACAGGCGGTTGCACCAAAACCGCTGTTTATTGTCGCAGAATACTGGTCGCATGAAGTGGATAAACTGCAAACGTACATCGATCAGGTCGACGGGAAAACCATGCTGTTCGACGCGCCGTTGCAGATGAAATTTCATGAAGCCTCGCGCCAGGGCGCGGAGTATGACATGCGCCACATATTCACCGGCACGCTGGTAGAA [...]
+CTGTGCGGCGATACCATCTGGAGCTGCGCCTGATTGTCATCCAGCTTGAGCGAAATATGCACCTGACCTAACTCTTCCGGATGCAATCGAAGCTGCGCGCTTTGCTGTCCCTGACGCGTAAATAACATGACCTGCTGACTGAACGTTTGCTGCCATTCATGGCTGCCTAACGGCGCGCTGAGTACCGGGGCTGAGGCGACAGGTAGCGGTTGCGGTTGCGCCGTGGCGCTGCTGAGCGTCGGCATTGCCGCGCCATGCGTTACTGGCGCGGGCGAGCTATCCACCTCCACTTTCGCGCTGGTCGCGGCGGCAGCAACCACCAGCGGCGTCAGTGCTGGACCCGTGGCGCGATCGTCGCTGGCGCGCGCAAGCGACGCCTCGGTTTTCCCTTTTTCATGCTCGCTAAAAGAGAGCGTATGTGTCTCTTCCTGCGGCGCCGATGGCATGTCGCCGCGCAACAGTGACGGCAAGGCGATGTGATTTTCAGCAGGC [...]
+NODE 610 5191 296884 294936 0 0
+ATCATCTATAATACCTCCTGTCTATGGCAAGGCTTCCATATAGCCTTACGGTCCCTCTCACTTCTCCTTTAAGATAAACCTTATCAGCCCGTCATTTCCATAACATTTATCTCACATTTTATTTTTTTAATCATTTTTCAATGACCTTCGTCTGAAATAAAATTATCACTGTAAAAACAATGCATTAAAAATAATGATTAGCTTATTTTTGCTACGGGAGAAATATTTACGCTTCTTGATAAAGAATTTCTGGGCGCGAGTAAATAACTGGTGGTACATTAGCCTGCCTGGCGTTCATGCCCTCGTGGTTTAGTACTGACTTAGTTTTACACTCCTTACGGGAACCATTGTCGTACATGATGGCCTAACTATACGCAAATCATTCAAGTTACCCTGATGAGCTTACTCAAGTAAGTGCTTCGGATAAGCGAACGCAACTTGAAGGATGATGCGTATTTCAGAGTGTACCGCTGCGGATAATGACTCTTCTGC [...]
+GGAGCGACAGCAGCAGCATCGTTCGGGCACGCGGGTGGAACATAATCTCTTCCTTACACGGGGTCGTATACCTATTTTGCACAGCCTGCCCGACGGCATTGCTGCAATTGGTGCTGAAACAAGAAAGTAATTCTGTGATGAAGATCTATATTTATAGGCAGTCAGCCTGATGGCCGTTGTTGTTATGCCCCCATGAATTTACAGTGTGACAAAGACTTATTTTGACTTTAGCGGAGCAGTAGAAGAATGACAAAGTATGCTTTAGTAGGAGATGTAGGCGGCACGAATGCGCGTCTTGCCCTGTGTGATATCGCCAGTGGAGAAATCTCGCAGGCCAAAACGTATTCCGGCCTGGATTATCCGAGTCTTGAGGCCGTGGTGCGCGTTTATCTCGATGAGCATAGCGTCAGCGTGGAAGATGGTTGTATCGCCATAGCCTGCCCGATTACCGGTGACTGGGTAGCGATGACTAACCATACCTGGGCTTTTTCT [...]
+NODE 611 3921 186482 183560 0 0
+ACAACAGAATCGCGATAACGTTACCGCAGCGAATGTGCTTATCACGTAGCCAGAGCGCGCTGGCAAGCGCCAGCATGGCGCCTGCGGAATCCCCGGCGAAACCGATTTTCTCCACGTTGAGCGAGTATTCATCGGCATGTTGAGAGAAGTAGCTGCATACCGCGACGGTTTCTTCGATGGCCTGCGGATAACGCGCTTGCGGCGACAGCGAATAATCAATACCGATCACGGTGCAGCCGGTATAACGCGCCAGCAGACGCATTATCCGGTCATGCGTATCCAGATTACCGAGGATAAATCCGCCGCCGTGCAGATAGTATAAGGTGGCCTGGCTGGTCGGCTGCGGCGAGTAGAGCCGGGTTGTTACATCGCCATAAGGCGTAGGGACGACGCAGGTGCGGGTGGTCATGGACGGCGCGTCGGCATTCCAGAAACGGCGCTCAAGAAGATAATACTGACGCTGGGTCTCAATATCGCCATCGGCAGGCCAGG [...]
+TCAGATCGTATCTTTTTATAAAACACAACCATTTTTTATAAACATCCTGATTGAAATTGTCATAAACTATTACCCGGAGTTTTGGAGTCCAGCAACCAAAGGAGACGGAATGCATCACGCTACCCCGCTTATCACCACCATTGTCGGCGGCCTTGTGCTCGCTTTTATTCTCGGCATGATTGCCAACAAATTGCGTATTTCTCCACTGGTGGGATATCTGTTAGCGGGCGTTCTGGCGGGACCTTTTACCCCGGGTTTTGTTGCGGATACCAAACTGGCGCCGGAGCTGGCGGAGCTCGGCGTGATTCTATTGATGTTCGGCGTCGGGCTGCATTTTTCGCTGAAGGATTTGATGGCGGTAAAGTCTATCGCCATTCCCGGCGCTGTCGCTCAGATAGCGGTGGCGACATTGCTGGGTATGGCGCTTTCCGCCGTGCTGGGATGGTCATTAATGACCGGCATCGTTTTTGGGCTTTGTCTGTCTACCGCCAG [...]
+NODE 612 4519 251559 247682 0 0
+TGGCTGTCAGGCTTATCGCCCGACTCTGGCGCTTCGGAGGGGTCGTCTTTTTCGACAGCGAAACGGTAGTATCTATTTAGCATAACATGTCTCCCTTAGTTACATTCACTTGGCAATATCTACCTGGCCGTTATAAAAATAACGGCAAAACAAAAAAACAGCGTCTTCAAGACTATTTGCAATTTCAGCAAAATACGCTTAGCTGAAAGTTAAGAATAGACGTAAAACGATAACCTTCAAGTCAACGCGGTTTACGGGACGGGGGATTAGCACAGGGAGAATGACCGCAACGCTCGCTGCGCGGCGGCCATTTTATATGGTCTATCAAAAAGATAACCGTTAAGGTCCATTCAAACCCGTTAGTTTGCCTTCCCCTCAATCAAGCCATTGATCGTAGAAAATACCGCCGGCGCGCTGGTCGCTTCCGCAAACTCGACATTGATATTTTGCCGACGCAGCATATCGAAGAATTTACGTTGCGCATCAAGAATA [...]
+CAGAAATCCTATAAAGAACCGACCGAACAGTTTCCAGAAGGGAAATGGCGGCCGGTGCCGTTAACGGTGTCAAAAGGGCTGAGCGGCGGCGGCTATACCTATAAAATTACCACGCCGAACGGTACGGTACACGAAAGACTATGGGCTTATCCTGAAGCCAGTTACCAAAAACTGGTGGCCGATAATCTGGTCTATTTTGGCAAAGATAACGGCGGTATTCCCCAGCGAGTCATGTACGCGCACCACAGTAAAGGGCAGCCAACGACCAATTACTGGGATAACGTAGCGTCGAATAAAGAGGGGAAAAAGGAGATTTTGGATCTCTTCGGCGACAACGTTTTTGATACGCCGAAACCGACCGCATTATTGAAGAAAATCATCAAGCTCGCTATCGATAAAGACGGCGTCGTTCTGGACTTTTTTGCCGGTTCCGGTACTACGGCCCATGCGGTGATGGCGCTGAATGAAGAAGATGGGGGACAGCGCACGTTT [...]
+NODE 613 2463 122633 117953 0 0
+AATTCTGCTGCCGGCGAAGTAAATTCTGAATCTTCAAATTCATCGGTAATCAAAACGGCAATTTTCTTACTCATGCGTTTCCTCCGCAGTGGTGGCGTCGGGTAAGGCAAATTTTCCACAATGATGGATACTTACCTCGTAGACTATTAAGCCTGGTCGATAGGGCCGAGAGTGCAAGGTGGACAAATCTGTAAAGGAGCGAGGATGAGTCAGGTACTGATTACCGGCGCGACCGGACTGGTCGGCGGACATCTGCTGAGAATGTTAATCAACACGCCGCAGGTGAGCGCTATCGCCGCGCCGACGCGTCGTCCGCTGACGGATATTGTCGGCGTTTATAACCCTCACGATCCGCAGCTTACCGACGCGTTAGCTCAGGTGACCGACCCGGTGGATATTGTTTTTTGCTGCCTGGGCACGACCCGGCGTGAAGCGGGAAGTAAAGCGGCGTTTATTCATGCGGATTATACGCTGGTGGTTGATACCGCGCTG [...]
+CTGGCTGGAAAGCAAAGGACTGCGGTTTATCGCCGCCAACGTGCGCGAGCGCGGCGGCGAAATCGATCTGATCATGCGCGACGGAAAAACGACGGTTTTTGTTGAGGTCCGCTATCGGCGCTCCGGGCTTTATGGCGGCGCGGCGGCTAGTGTGACCCGCAGCAAGCAACACAAATTATTACATACTGCCCGCTTGTGGCTCGCCCGCCAGAATGGGAGTTTTGATACTGTGGATTGTCGGTTCGATGTGTTAGCCTTCACCGGAAATGAGATTGAGTGGTTTCGGGATGCGTTTAACGACCACTCATAATTGAAGATTTTAAGGATTAGCGTGCTCGAAAGAATCAAAGTTTGCTTTACAGAAAGCATTCAAACTCAAATTGCTGCGGCGGAAGCGCTTCCGGATGCCATTTCCCGCGCCGCCATGACGCTGGTTCATTCCCTGCTTAACGGCAACAAAATCCTCTGTTGTGGAAACGGGACGTCCGCGGC [...]
+NODE 614 906 44701 44508 0 0
+TCTGCATTCAGTGCCTGCGCCCACTGGCGGGCAGACCTTTCCAGTAATGTGTACACCGCCTCAAACGCATCGCGGCTTTTGCGATACGGGTCCGGTATTTCACGCTCGCTGTCCCAGTGACCAAACAGCATTACCTTGCCGCGCATTTCCGGCGCAATGTCGCACAGGGCGGCGATGTGACGTTTCTCCATCGTCAGAATCAGGTCATATTCCCGGCACAGACGCGCGGAAATTTGCCTTGCGCAGTGATTTTCCAAAGACAGATCGTGGGCGCTCGCCACGCTCGCCGCCGCAGGATCGGCTCCTTTGCCGACCAGCGCGCCTAACCCGGCGGACGCAACCGTCAGCGAGGGATGAAAGCGCTTTAGCAAACGTTCTGCCGTCGGGGAACGGCAAACATTCCCCACACAGACCACTAAAATTTTGTTAAACATAACGATTACCAGGAATGAATGTCGCTGGCCGTATCCGTCATATAACGGACACCGCTAA [...]
+TACCCTGGCGACATTCTGTATGTGCCGCGCAATGACGATCTGAAAGTCTTTGTCATGGGCGAAGTGAAAAAACAGAGCACCCTCAAAATGGATTTCAGCGGCATGACGCTCACCGAAGCATTAGGCAATGCGGAAGGCATCGATCTGACCACCTCCAACGCCAGCGGCATTTTTGTGATTCGTCCGTTGAAAGGCGAGGGGGGACGCGGCGGCAAGATCGCCAATATCTACCAGCTTGATATGTCTGACGCCACGTCATTGGTGATGGCGACGGAATTCCGACTTCAGCCTTACGATGTGGTGTACGTCACGACCGCGCCGGTTGCTCGCTGGAACCGTCTGATCAATCAGTTGCTGCCGACCATTAGCGGTGTCCGTTATATGACGGATACGGCCAGCGACATTCATTCCTGGTAATCGTTATGTTTAACAAAATTTTAGTGGTCTGTGTGGGGAATGTTTGCCGTTCCCCGACGGCAGAACGTTTGCTAA [...]
+NODE 615 4313 238634 237029 0 0
+AGAGCGCGTGCAGCGTAAACTGCATTATGCGCTGGTGGATGAGGTTGACTCCATCCTGATCGATGAAGCGCGTACGCCGCTGATTATTTCCGGCCCGGCGGAAGATAGCTCGGAAATGTACAAAAAAGTGAACAAAATCATTCCGCACCTGATTCGTCAGGAGAAAGAAGATTCTGACACTTTCCAGGGCGAAGGCCACTTCTCCGTTGATGAGAAAGCGCGCCAGGTTAACCTGACCGAACGCGGTCTGGTGCTGATCGAAGAGCTACTGGTGCAAGAAGGCATTATGGATGAAGGCGAGTCGCTCTACTCGCCTGGCAATATTATGTTGATGCATCACGTCACCGCCGCGCTGCGCGCGCACGCGCTGTTTACCCGTGACGTGGATTACATTGTGAAAGACGGCGAAGTCATCATTGTTGATGAACATACCGGTCGTACCATGCAGGGGCGTCGCTGGTCTGACGGTCTGCACCAGGCGGTAGAAGCGAA [...]
+ACGACAGTTTCAACAGGCTACGTCGCCCTATGTGTTATGGGTTGTGCCTCTGCTGGTTGAAAACAGGCTGTATCAAAAAGCCAACCGCGTACTGGTGGTTGACGTGACGCCCGAAACGCAGCTCATACGCACAATGCAGCGTGATGATGTTACGCGCGAGCATGTTGAACACATTCTCGCTGCGCAGGCGACGCGTGAAGCGCGCCTTGCCGTGGCGGACGATGTTATTGATAATAACGGCGCACCGGATGCTATCGCATCAGATGTGGCCCGCCTGCACGCCAGTTATCTTAAGCTCGCGTCGCAGTTTGTCTCACAGGAAAAACCGTAATGCACACCCAGGTCCTATTTGAACACCCTCTCAATGAGAAGATGCGTACGTGGCTGCGCATAGAGTTTTTGATCCAACAGCTCTCCATCAACCTGCCAATTGCAGACCATGCTGGCGCACTGCATTTTTTCCGTAACATCAGCGATCTACTGGATGTGTTC [...]
+NODE 616 3409 182936 182158 0 0
+ATATAGAGCGGCGTCAGAACGGTAAACAGCAGCAGTTCGGATACGGTCAGGTAGAGGTAAGCATGGAAGCTCAACATATACATGATGCCAAGCTGCATCGCCCCCACCAGCATATACAGGCTGATGGTTTTTAGGTTGTGCCCGCGAGAACGCAAAAACGGCAGAAAAACGAGCGCCGCCAGCCCAACGCGTATCAACACCGCGAAATAGCTATCGACATGCCCGGCAAGATACTCGCCAAATAGACTAAAGGAGAAAGCCCACAGGATAGTGGTAATGATGAGTAGCGCCACAATGGATGTCTCTTAAAACAGGGAACACCCATTGTAGCGGAGAGTGAAGTTGACAACTGGTCAACTAACAAACAATCACATCAGCGTAAGAAAAGATCGCGCAGGTAATGCGGCACGGCGTTATCCGCGTTGATGCCGATCACCTCAAGTTCGGGATACAGGTCTTTCAGACGCTGGTGCGCATTGCCCATGATGCAGC [...]
+TGTACCTGTGCTGGATGGGCTATCAGATGCTGCGCGGCGCGCTGAAAAAACAGGATGCGGCGGCGTCTTCTCCGCACATTGAACTGGCGCAGAGCGGGCGCAGCTTTCTCAAAGGGCTGCTGACCAATCTGTCGAATCCGAAAGCGATTATCTATTTTGGTTCCGTTTTTTCACTGTTTGTCGGCGATAACGTCGGCGCTGCGGCGCGCTGGGGTATTTTCGCGTTAATCACCCTGGAAACGCTGGCCTGGTTTACCGTAGTCGCCAGCCTGTTCGCGCTGCCGAAAATGCGCCGCGGCTATCAGCGTCTGGCGAAATGGATTGATGGCTTTGCCGGCGCTCTGTTTGCGGGCTTTGGTATTCACCTGATTATTTCGCGCTAATTTACCTCCGGGCCGGATAAACATCATCCGGCACGACTATCACGCGTGTCTTGCCGACGCCAGGAGCGCGCCTACCAGCATAAACAACGAACCAAACGCTTTATTCAGC [...]
+NODE 617 7213 377696 374924 0 0
+GTCCATCGAACCCGAGACGTCCATCAGACAGAACATCACCGCCTGGCTGGAGGGCTCAGGCCGTTTTTCATAATTTTTATAGCGTAAATCAAAGGTGTCGATAAACGGCACTCGCTCGATTTTAGCCCGTAGTTCGGCAATCTCCCGACGTAACCGCTCCTCTTCAAGCAGTTGCGCTGGTTCGCTGTGGCTGATGGTCTCCAGTTCCGTTTCCAGCGCGTGCAGTTCGCGGCGTTTTCCTGCCGTCATTGCTGTACGGCGCGCCAGAGAGTTTTGTAGCGAACGTACCACGCTGATATTGGCCGGTACGCCGTTTGAGGTGAAACCGGCGCGGTGAGTTTTATACTCGTTAAGCTGGCGATGCTGGTTTTTTTTCAGATTAGGCAGCGCTAAATCTTCAAAGAGCAGATCCAGATACTCATCTTTTGAAATCTGAAAAACAAACTCATCCTGGCCTTCGCCGTCCTGGCTGGCCTGACCTTGACCGCTGCC [...]
+GTCACACGGCTTTGCGCGTAATCTACCGTGGGCGCTAAAAGCGCATAATGAAGATGATAATGGCGTAATGCTGACATTTGAGCTGCAAAGCAGTGAGGCCACCCGGAAATACTGGCCGCACGATTTCACGCTGCTGGCACGTTTTAAAGTGGGCAAAACCTGTGAAATTGAACTGGAAGCGCATGGCGAGTTTGCAACCACATCCGCGCTCCACAGCTATTTTAACGTTGGCGACATCGCCAACGTTAAGGTCAGCGGACTCGGCGATCGGTTTATTGATAAAGTTAACGACGCTAAAGAAGGTGTCCTGACCGACGGTATACAAACCTTTCCGGACCGTACCGATCGCGTTTACCTCAATCCTGAAGCATGTAGCGTGATCCACGATGCGACATTAAACCGCACGATTGATGTAGTCCACCACCATCATCTTAACGTCGTAGGCTGGAACCCTGGCCCGGCGTTGTCCGTCAGCATGGGCGACATGCCGGA [...]
+NODE 618 2613 147397 146957 0 0
+GTTCGGTACTAACTTTAACTACGCGTTCTAATCTCTTTCTGAAACGGATCAAAAAGGTGAGCATTGCGCTCACCTTTTTATTTACTGCCGTTTATTCCGAGTCGATCTCTTTGAGTTCGTCCTGAATCGCCTGCGCGTTCGGGTTTTCCTGCGGCTTGAGTTTTCCGCCATTGGCGATAAAGTCATGACGCTGGAAGTACGCCTCGCGCACCATAATATAAGGATCGGAAGACTGGCGCAGCAAACCATCGGAGTCCAGCAACTGCGCGCGGGTTTCTATCCCTTCGATAGTCCATTTTCCTATGGACATTGGCCAGGTCAACCACGAGAGCACCGGATACAAGGTATCCGCCATATCCCCGCCATCTTCACGCAGCGTGAAGCTGCCGTAGAACGGAAGTTGCATATAAGGCCCATACCCCACGCCATAATGGCCCAGCGTACTGCCAAAGCGATGCGGTTCAACGCGCTGCAGCTTAGGATTCGCCATTC [...]
+ATTTGCGGGTACGGTCCGATGACCAGTGTCTTTTCCTTGCCGTCGAAACGGTAACGCATTCGCCACACCTTTTTTCCTGATGGAGGTACGAACAGGAACAGGCCTCCAGAATCAGCAAGGCGATATGATTTTTCTGCAGGTTTTGCTGCGTCAATTTGCTTTACTGTGAGCATGTGGGCATAAATCCGTGGTCATTTTAACATGTGCCCACAATATGCCCGCATTAATGTGCGGCAGTCAACGATCCGCTACGAACGTCTAAGAACTTATTTTTGGTATAAGTAGTGATTATAAAGGGGATTCTAGAACTGTAACGAACGAGGAAGAACTGAAAAGTGGTGTCCCCTGCAGGAATCGAACCTGCAACTAGCCCTTAGGAGGGGCTCGTTATATCCATTTAACTAAGGGGACAACGCGGCGCCAGTATAGCGTTTTTTATTCGCCGGAGTAAGTGTAGCGCCGCCTGACTGGTTAAACCGTCGCCACTCAGCG [...]
+NODE 619 1219 241336 233181 0 0
+ATGAAACGCTAGGTTTTCTACCTCGATGTGGAACTGTTTTTAGTTCATAACCTGAAACAGAAATACGAGTTTTTTTATTCATACCATCATAAAATTTTTCTTCATTGTATACATCCCCTTCTGTTGCAAGTAACACCCATAAAAGAGTTGCATTTTTTTCATCAAACCAGACAAGAAATTTGCAGTTTGCTACTCCTTTTTCTCTTCTCCTGAAACGTTGTTGTGCTGTTGCATTGATAGCATAGAGTTCATCAAAACGTGCTTTTAGTGACACGAATTTATAGTGAGGGTTTAGAGGAATTTCGCCACCAAACCACCTTGTATATCCCAGCGAAAACAGCATGGCTATCTGACGCATAAAATCGGTTTTAAAACGGTAAATCATCGAAATCCTCATAAAAGCTATGTAGTAACCGCTACATAAGAGAAGTCAACATATGGGAATACCTTATAAAGAGATTCCTTGCGCTGCGCTTACAGGTTAAATATTAT [...]
+CCCGCCACTGGCTCAGACAAACTACTAGGCTACGCCTTACCATTTCTGGCTTTCAGGGGGCCGAGATTCCAAAGCACCTCCCTTACTCATAATTTGCCGTCAACACCATAGCCAGACACTTAAGTCATGGCTGGTTATCACTTACCCGAATGCGACCTCTTCGGACGCAATTACAGGCTTGAGCTTTACAGCGATCTGCAAAGGTTGCCCCTCACAGTACCGACGTTTCCAGGTTTCCCCTCAACGCCCTGACACCTCACGATGCCCTCAGCAGCCCACCTGTCGGGAATATGTTGTACCTTCTCAAGCACCCCATATTCGGGATTTTCACCCGTTCAAGATCAACAGGGATCACGTAGTCACCTACGTTCCCGTTTCCGTGTCGCCCAGTCTCACGCTTTGGCGTGGATTGGGTCGGACAGGGGAGTTTCACCCCCGAACGCCCTTCGTAGCCGTACCAGCCCAATTACAGGCATACGGCTTCGGCAGTAA [...]
+NODE 620 51 2863 2795 0 0
+TGGGTACCGGTGACGGCTAATGCGCGTGAAGAAGCGATGTAATCTTCGCGG
+ATCTTTCTCACCCCAATACGCGCGCCGCCGTTCTTAAAGCGCTGGAGTATG
+NODE 621 3080 178995 177643 0 0
+CGCGCCGTCCGCGGTATTTTTATCGCCGCGTCCCAGCCATTTGTAGCCAGCCAGCGCCGCCGCTTCGGTCACACGGGAAAATTCGATGGCAAGTTCTCGTCTCATAACAAACTCGTAGCAAAAAGGAGTGGCGCGCAGTGTAGCACAGGGGAAGGAGGGAATAATTGATGTGTGTGCGGAGTTGCCCCCGCACAAAGATTTTGCCGGATGGCGACCTTACTTGTCGTGATCTTCCCACGCCATTGCGCGTTTAACCGCTTTCTTCCAGCCGCTATAACGGTAGTTACGCTCGGTGGTTTCAATGCCGGGGCGGAATTCTCGCTCAATGACGGCTTTTTCCTGCAGCTCGTCCAGGTTCTGCCAGTAACCGACGGCCAGACCAGCCAGATAGGCGGCGCCCAGCGCGGTCACTTCGCGCACTTCCGGGCGTTCCACCCGCGTGCCGAGAATATCTGACTGGAACTGCATCAGGAAGTTGTTGGCCACTGCGCC [...]
+TGTACTTTTGCTTCCAGTTTCTCAAACACTTCTAAAGACATGATCTTACCTCTCCTGAATTGCAAGGCGACGCTTCACGTAAACGCGCACAATATATAGTGTCGATTGTATGAAGCCCCGCTCTCGCTGTCCAGCGACATACCGCGTAGATCGCGGTTTGCAGCAATTTTCATCCATCTCCTGGTAACATTCATTCAATAACTTAAAAGTGTTAACATATTGGTTAATGAAATGATTCAATTCACTCTCTTCTGCTGTCTCAAAATGCGCCTCATGGCGCGATAACGCTCATTTTATTGACGCAGTACACACATTTTGATTTCGATATTTCTCGTTTTTGCTCGTTAACGATAAATTAACAGTGTGCCTACAGGGCATCGTGGATGTCCATGACCTCCTCGCATACCAATAATCATTACATACTCTTCAGGATCCGATTATGAGTCAAACATCAACCTTAAAAGGCCAGTGCATTGCTGAATTCCTCGGTAC [...]
+NODE 622 961 65148 61393 0 0
+AGCCGGCGCGCTGTTCCGTGACCGCCAGCGAGTGCAGCAGGGCGGTGCCCGCCAGCCACGGCATAAAGGAGGCGTTCTCCACCGGGTCCCAGAACCACCAGCCGCCCCAGCCCAGCTCGTAGTAGGCCCACGCCGAGCCGAGCACGATGCCCAGCGTCAGGAACACCCACGCCGCCAGCGTCCACGGACGGGCAAAACGGGTGAACGCGCTGTCCAGACGCCCGCTCAGCAGCGCGGCGATGGCGAAGGCGAAGGCCACCGAGAAGCCGACATAGCCCATGTACAGCAGCGGCGGGTGGAAAATCAGCCCCGGGTCCTGCAGCAGCGGGTTCAGGTCGCGCCCCTCCACCGGAAAGGCCGGCAGCGTGCGGGCGAACGGGCCGGAGGTGAACAGGATGAACGCCAGAAAACCGGCGCAGACCATCCCCATCACCGCCAGCACCCGGGCGACGATATCCGCCGGCACCCGCCGGCTGAACACCGCCACCGCCA [...]
+TGGCCAAGCATGACGAGAACTACACCCCGCCGGAAGTGGAAAAGGCGATGCAGGAAAACCACCGCCGCCCGCAACGCGCTGATAAGGACACCTCATCATGATGCCTGAATACGGCCACGCACTGCTGTGCCTGGCGCTCGGCGTGGCGCTGCTGCTGTCCGTTTACCCGCTGTGGGGCGTGGCGCGCGGCGACGCGCGGATGATGGCGTCGGCCGGGGTGTTCGCCTGGCTGCTGTTCATCTGCGTGGCGGGCGCGTTTTTCGTGCTGGTGCACGCCTTTGTGGTTAACGACTTCACCGTGGCCTATGTCGCCGGCAACTCGAACACGCAGCTGCCGGTGTGGTACCGGGTGGCCGCCACCTGGGGGGCGCACGAGGGCTCGCTGCTGCTGTGGGTGCTGCTGATGAGCGGCTGGACCCTGGCGGTGGCGGTGTTCAGCCGGCGGGTGCCGGCGGATATCGTCGCCCGGGTGCTGGCGGTGATGGGGATGGT [...]
+NODE 623 2958 156851 155835 0 0
+CTGGCTGGCGTCATGTAGCTCCGGCGGAGAGAATAAAAGCTATTATCAGCTCCCGATAGCGCAAAGCGGTGTGCAAAGCACCGCAAGCCAGGGCAACCGTCTCTTATGGGTAGAGCAGGTTTCCGTACCTGACTATCTGGCAGGTAACGGCGTGGTGTATCAAACCAGTGATGTCCAGTATGTGATTGCCAATAACAATCTGTGGGCCAGCCCGCTGGATCAGCAATTGCGTAACACGCTGGTGGCGAATCTTAGCGCCCGGCTTCCTGGCTGGGTCGTCGCTTCCCAGCCGTTGGGAACCACCCAGGATACGTTGAACGTTACCGTAACCGGATTCCATGGACGTTACGATGGTAAGGTTATCGTCAGCGGGGAGTGGTTATTAAACCACAACGGACAACTGATTAAGCGGCCTTTCCATATCGAAGCCAGCCAGCAGAAAGATGGCTATGATGAAATGGTCAAAGTACTGGCAAGCGCATGGAGTCAGGA [...]
+GTTACTGTGGATGCGTCTGAAAGCCATCGTTAGCCGCGAGCGTTTTGACTGGGTGGCCTTTGACGAGTCGCGTCCATTACCGGTCTCCGTGCCATCCATGCCGCTCAAACTGAAGGTGATTCTGGTTGGCGAACGTGAATCACTGGCTGATTTTCAGGAGATGGAACCGGAGCTCGCGGAACAGGCTATCTACAGTGAATTTGAAGACAATTTACAGATAGCGGACGCAGAAGCTATGACCCTGTGGTGTCAATGGGTGACGCGTATCGCTTTACGCGATAATTTGCCCCCTCCGGCTCCGGACGCCTGGCCCGTTCTGATACGCGAGGCTGTGCGCTATACCGGCGAACAGGATACGCTGCCTCTTTGCCCACTGTGGATAGCCCGCCAGTTTAAGGAGGCGTCGCCTTTATGCGAAGGCGATACCTGCGGCGCAGAAGCGCTCAGCCTGATGCTTGCCCGACGCGAATGGCGAGAAGGCTTTCTGGCGGA [...]
+NODE 624 14 546 495 0 0
+TATAATACCAGAAT
+ACCCTCGGTTTATT
+NODE 625 2279 127401 126587 0 0
+TCGGCTGGAATTTCACTGCGCGCCAGCAGCTCGCCTACCACCATCTTGCCGAGATCAACAGCGGGAATACCATGAAATGCAGTGGCCTGACGAGCAAAGGGGGTTCGTAACCCACTGACAATAGCAATGCGATCGCCCTGACGGGTGACCAACGGTAAAGCCTGACGCATAGTACTCCCCTGTAAAAAAATAAATTAGTGGTCTGACCTGATCACAGTCTTAACCAATTTTTTACATTTAGCCAAGCAGAGAGAAAAGAAAGTGGGAGCTAAGGCACAGTGAAGGGAAGCGACAAAAAAAGAAAACGCCTCCGCCAGATGATGACGGAGGCGTCGTGAATGAACGGATTAACGCAGGCCGAGCTGGAAGATCAGCGTTTCTGCTTCGCAGGCGAAAACAAAATCAATATCCAGACGAACGCCTTCGGATTCCTCGGTAAAGGTTGGCGTAATTTGGCAAGGTTCAGACTCCACGCTACGCGCTTTTTCGGTT [...]
+CACGCTCTGACCATGCATATAAGAGACGCCAACGTCGACAGACGCATCTTTATTAAAGGCGTAAGTCGTACCGGCGCTCAGCCAGAAACGGTCCTGGTCCGGAATAGAGATAGAACGGTTTTGCGCTGGTACCGGGCTGTCATCGAAGGCGATACCGGTACGGAACGTCCAGTTGTCATCGTAGTAATAGGTGGTGCCCAACGCAATGCGGTAAGCGTCTTTAAAGCCTTCATGCTTCTCAAAGAGCGTATCGCCAGCGGTCGATTTTGCCTTCAATTCCTGGAACTGACTCCAGCTGGTATAGGCCAGGCTATAGTGGATGGCCCACTGTGGCGCCACACGGTTATAACCGGACACTTCCCACATTTCCGGCAGATTCAGCGTCAGGTAGCCTGACTGCGTCGCGCCACCGGTTGCCGTTGGGATAGGCAGGTTAAAGCGGTTTATAGCGATGGGAAGATCGCTACTGTAGTTGCCTTTAAAGTCAATTTT [...]
+NODE 626 8251 460304 457545 0 0
+GATGAAGAGGCATTGCCGCTTGGCAGTACCGCTGAGCATTTAAGCGGCCTGTTTTACATTCAGGAGGCCAGTTCGATGCTGCCGGTCGCGGCCCTGTTCGCCGATGATAATCATCCGCAGCGGGTCATGGATATGGCAGCGGCGCCTGGCTCAAAAACCACGCAGATCGCTGCCCGCATGGGGAACCGCGGCGCCATTCTGGCCAACGAATTTTCGGCCAGCCGCGTCAAAGTTCTGCACGCTAATATCAGCCGATGTGGAATCGCCAATACCGCACTGACGCATTTCGATGGTCGCGTATTTGGCGCTGCGTTACCGGAGATGTTTGACGCTATCCTGCTGGATGCGCCCTGCTCTGGCGAAGGCGTAGTACGTAAAGATCCTGATGCGCTAAAAAACTGGTCGCCAGAAAGTAATCTGGATATCGCGGCGACACAGCGGGAACTGCTCGACAGCGCTTTTCATGCTTTACGACCCGGCGGCACGCTGGTC [...]
+GTAGTGTTCAGTTTCAGACACTGCCGGACGGGCCCGAGTAGTCGGCGGTTCTCCTCTTTTAACCCGAGCATGTCTGCCAGTGCAGAGATGATGCAGAACCGTGAGTGCTCGTCGCTAATCTCCACCACACTGACTTTTTATTGATTGTGAATGAGTCTGTCATTCACGTAAATATCAAGCAGGTAATTCCCTGGCGCAATATAGCCATCCCGGCTGAAGGCGGAGAAATCCACACTGAGGTGGTCACTGTTTTTAAGAGAATCGGCGCTGAACTCCGTCGTCTCTACTGGCAACGACAGTATATTCAGAGTAATTAGCAGTGTAGGCCGATTCAGTTTCATGGTATAAGCCGCTATCCGTGTTGCCTGAATAAATGAAAATCCGCCGCTGCTGATTTAAACCGTTCCGTGAAATAACAGCGCATCACTGAAGAAATAAACAATTCTGGCGTCCGGACATACCAGATAAATGGACAGCGAAACTGTTTATTAA [...]
+NODE 627 507 21975 21938 0 0
+CGCGTTAAAGGCGACTGGCTGGTCGCGCTGCCTGCGGGACTGAGCAGCCGTAACGCCATGATCATCGGCACCGCCGGTTTTACCGCCATGCTGTGCGTCATGGCGCTTGAAGATGCAGGTATTCGCCCGCAAGACGGTGAGGTTGTCGTCACCGGCGCCAGCGGCGGCGTGGGCAGCACTGCCGTTGCATTACTGCATAAGCTGGGCTATCAGGTTGCAGCAGTATCAGGACGTGAAAGCACCCACGGCTATCTTAAGAGCCTGGGAGCTAACCGTATTCTCAGCCGCGATGAGTTTGCTGAATCTCGCCCGTTGGAAAAACAGCTGTGGGCCGGTGCAATTGATACCGTTGGCGATAAAGTGCTGGCGAAAGTGCTGGCACAGATGAACTATGGCGGTTGCGTGGCCGCCTGCGGCCTGGCGGGCGGCTTCGCGCTGCCGACCACCGTTATGCCATTCATTCTGCGTAATGTGCGTTTGCAAGGGGTGGAC [...]
+ATGGCATAACGGTGGTCGGCAGCGCGAAGCCGCCCGCCAGGCCGCAGGCGGCCACGCAACCGCCATAGTTCATCTGTGCCAGCACTTTCGCCAGCACTTTATCGCCAACGGTATCAATTGCACCGGCCCACAGCTGTTTTTCCAACGGGCGAGATTCAGCAAACTCATCGCGGCTGAGAATACGGTTAGCTCCCAGGCTCTTAAGATAGCCGTGGGTGCTTTCACGTCCTGATACTGCTGCAACCTGATAGCCCAGCTTATGCAGTAATGCAACGGCAGTGCTGCCCACGCCGCCGCTGGCGCCGGTGACGACAACCTCACCGTCTTGCGGGCGAATACCTGCATCTTCAAGCGCCATGACGCACAGCATGGCGGTAAAACCGGCGGTGCCGATGATCATGGCGTTACGGCTGCTCAGTCCCGCAGGCAGCGCGACCAGCCAGTCGCCTTTAACGCGTGCGCGTTCGGCCAGGCCGCCCCAGTGGTTTTCGC [...]
+NODE 628 3465 199988 196298 0 0
+TCAATATACGCGGTACGGCTGGCAATCAGCTTGCTCCAGTCGAACTGATTAATCGTGGTGTCAAAACCGTAGTCCGGGCCATACAGATGAATCGCTTCACGAATCTGCGCGGCATGCCACATCACTTTCTTCGGCACGCAGCCCACGTTAACACAGGTGCCGCCCAGCTCTTTGGCTTCGATGAGCGCGCATTTCTGGCCGTACATAGCGGCGCGGTTAATCGAGGCGATACCGCCGCTGCCGCCGCCGATAGCGATGTAATCATAGTGTTTGGTCATGACCGCTCCTTTATGTTCGTTGTCGGACGGATAGATTCTGCGCTACCCGCCAAAATATTCGCGATTGTATACCTGAAGGTGAAAGGTTCCACCGATGGCTGTGATTACTCCGGCACGATCCAGCTTACCGAAGTGTGTCCGTGACCGTTTGGCGCCAACCTGCTGTGCAGCCACGGTAGCACGTTGTTCATCTGCTGCTCCAGTTTCCACGGCG [...]
+GTCCAGCCCATGGTGGCATCGAGCACATTATTGCTGTACTGGTTGCCCAGCTCAGACAGGCGAGTGGCGATTTCGCCGTAACGCTGCTGTTTCTCTTTCGGCAGACCGATGCCGGACAGTTCAAAATCACGCAGCGCGTTATCGACCGCTTTCTTCTGCGCGGTATTCAGAGTGGCGTAATGATCGCCGTCGCGCAGGTCGCGGTACGCGTTGTACAGTCCTTCATGTTGCCCAACCCAGGTGCTGTATTCAGACAGCAGCGGCAGCGTCTGTTCGTAGGCTTCACGCAGCTCCGGACTATTTTTCACCGAGTTTAAGTGGCTAATTGGCGAGAAAATACGCCCCAGAACATCGTCGGCTTCCGCCAACGGCTGGCAGAGGTTTTCCCAGCTATACGGCGCGCCATGCGCCACAACGCCTTCTACCGCCGCCCGGCAATCGGCCAACGCTTTGGTGACCGCAGGCACCACATGCTCCGGTTTAATTGCAGAA [...]
+NODE 629 6793 359632 357100 0 0
+GTTTAATCCGGCGAAGTTACTGCTTGACCCTTATGCGCGCCGGGTCGAGGGCGAACTAAAAGATCATCCGCTGTTGCACGGCGGACACGATGAACCGGACTACCGCGATAACGCGGCGGTGGCGCCGAAAAGCGTGATAATCAGCGACCATTATGACTGGGAAGATGACGCCGCGCCGCGCACGCCGTGGGGAAAAACGGTCATCTATGAAGCGCATGTCAAAGGGCTGACCTACCTGCATCCGGAACTCCCCCAGGAGATACGCGGCACCTATAAAGCGCTCGGTCATCCGGTCATGGTGGCGTATTTCAAACAGCTTGGCATTACGGCGCTGGAACTGTTGCCGGTGGCGCAGTTTGCCAGCGAGCCGCGCCTGCAACGTATGGGACTGACCAATTATTGGGGTTATAACCCGATGGCGATGTTCGCGCTGCATCCCGCCTGGGCCAGTTCGCCCGAGACGGCGCTGGACGAGTTTCGCGACGCGGTGAA [...]
+TGATCGCCAAAGTTAATCAGCGAATCTACCAGATCGCGGTAACGACCTGGCTCTTCCGGATTAAAGACGCCGCTACCAATCTGCGTCAGTACCTGATGTAGCTCTTCATCTTTTTCATAATAGTCGCGAGGCTTATAACCCTGCCTGCGCAACGCTTCCACCTCTTCGGCAGTATTACCGAAGATAAAGATATTCTCCTCGCCGACATGCTCCTGCATCTCTACGTTCGCACCATCCAGCGTACCAATGGTGAGCGCGCCGTTCAGGGCAAATTTCATATTACTGGTGCCGGAAGCTTCTGTCCCTGCCAGCGAAATCTGCTCAGACAGGTCAGCAGCGGGAATGATCACCTGCGCCAGGCTGACGCTGTAGTTCGGGATAAACACCACTTTCAGCTTGTCGCCAATCTGCGGATCGTTGTTAATCACTTTCGCCACGTCGTTGATCAGATGAATAATGTGTTTTGCCATGTAATAGGCGGAAGCCGCCTTA [...]
+NODE 630 3306 173596 172492 0 0
+TTAGCGCTAACAGGATGTGACGACAAACAGGACCAGCAAGGCGGCCAGCAGATGCCAGAAGTTGGAGTTGTCACACTAAAAACGGAACCACTGCAAATCACAACTGAACTTCCGGGTCGTACCGTTGCTTACCGTATCGCCGAAGTTCGCCCGCAGGTAAGCGGCATTATCCTGAAGCGTAATTTCGTTGAGGGAAGTGATATCGAAGCGGGAGTCTCTCTCTATCAGATTGATCCTGCGACCTACCAGGCGACTTACGACAGCGCTAAGGGCGATCTGGCAAAAGCGCAGGCCGCCGCGAATATCGCTGAACTGACGGTGAAGCGTTATCAAAAGCTGCTGGGTACGCAGTACATCAGTAAGCAGGAATACGATCAGGCGCTGGCTGACGCGCAACAAGCGACTGCCGCCGTTGTCGCAGCAAAAGCCGCCGTTGAAACCGCACGTATCAACCTGGCGTATACCAAAGTCACCTCACCGATTAGCGGTCGT [...]
+ACGTGCCTGGGTGAGTTTTTCATGACCAAGTCCCGCCTGGTCAATCAACTCGAAGTCAAACCCGGTTGCGGTGCCCAGTTCAACAATCGCCGGTAGGTTAAAGGCGAAGACCATCGCATCTTTAATTTGTGAAAACGCTGCGGTTGCCCGCTGGGTAATCGCTTCAACCTTGTTTTTTTCGCCTGGACGATCGGCCCAGTCTTTCAACGACACGAATGCAATACCGGTATTCTGACCGCGCCCTGCAAAACCGAAGCCGTTGACGGCGAATACCGATTCAACGTTGGCTTTCTCTTTGTTCAGATAGTAATCCGTGACCTCATCCAGCACTTTTTGCGTGCGCTCTTGCGTCGCGCCGGCGGGGAGCTGGACCATTGTCAGGAATACGCCCTGGTCTTCATCCGGCAAGAAAGAGCTTGGCAGACGAACGAACAGATAAGCCATACCGACGACAATAATGAGATAGAGCAGCAGGTAACGCCCGGTGCTGCG [...]
+NODE 631 69 2474 2474 0 0
+CCCTGCCGGCACGCCGCTCGCCATCACCGTCACTTTCGCGCCGATGGAGTCACCCTCTTTTTTCAGCGC
+GAGCGGCGTGCCGGCAGGGCTTGGCGAACCGGTTTTTGACCGACTGGATGCGGACATCGCCCATGCGCT
+NODE 632 4575 246837 245627 0 0
+TTCAACAGCGCAACTTTATGTTCGAAATTGTCGGCACGGTAGTACCACTGGTGAATTTTCTTACGCTCGCGGGTTGACGGATTGGCGGAAACCTCAACCGGGTCTTCCAGCAGGCGCTCGGCAAAATCTTTAATCGCATCGCCTTCCAGCGTGGCGGAGAACAGCATCGTCTGTTTACGCCAGCGGGTCTCACCGGCGATATGCTCAATGTCCTGAGCGAAGCCCATGTCGAGCATCCGGTCAGCTTCGTCAAGGATCAGTGTTTCAACCGCCCGGCAGTCAAAGTTCTCTTCTTTTATATATTGCAGCAGACGGCCCGTTGTGGCGACCACGATATCCTGGTTTTCGCTAAACACTTCAGCATGGTTCATATAGGCCACGCCGCCGGTAATTGTGGCGATATCCAGATGAGTATGCTTAGCCAGTTCACGAGCGTGATCGGCAACCTGCATTGCCAGTTCGCGGGTTGGCGTCAGGATCAGAATACGCGGC [...]
+CTGCGCCGCCCACGGACGCACTTTTTTCCAGAACGGCATTTTCTGCCATTGCTGCGGAGCGGGTTGGGCCTCAGGAATTAATGGCGACACCTGACGTACTGGCTCGTTTTCAATAGCGGCCATCACGCGAGCGGATATATCGAAATGGAGAACGTCAGGCGTATCCCCCCGCATTGAATCGCGGATCAGGTGATAACTCTCCCAGGTTTTCTGCATTTCCGGGTCGTGCGTAAGCGCTTTGAGCAGCTCACTATCCAACGTTTCGCCATCCATCAAAGCGGAAAGTTTTTCTTTCTGCATGCCTAATACCTTTTCCAGTATCCCGCTATCGTCAACGCCTGATAAGCGGTTGAACTTTATTATCAATAGCTTCCCGCGCCCGGAAGATACGTGAACGCACCGTCCCCACCGGACAATCCATGATAGCCGCTATCTCTTCATAGCTCAGGCCATCCAGCTCCCGTAAGGTGATTGCCATACGTAAATCTTCCG [...]
+NODE 633 2822 143825 139962 0 0
+GCACCTGATCCAACGGCTGGGAAGAGGTATCGTAGATTTTTAATTCAGCGGAGGGATCCGCCGGCGCGCTTGCTGTAGCAGGGGGAGTTTGTGGCGCGCTGACTGGCGTAGCGGACTGGGATGGAGCGTCATCAGTCAGATCGCTCACCGAGGCCTGCGACGGACTGGCGACGCCGTTGGTCATTTGTGGCTGCGTCTCCTCCACGCCAGGTTCGACCGGCGCGTCAGGCGCGGCGGCAGGCTGCATCTCTACCGCCTGGGTGCCGAGGTTTTTCGCGGCTTCGAAACCTTGCTGGATGGTACGGCCAAACACGGCAGCCTGACCGTTCAGCGGCAGCAGCAGAGCGATTTTGCTGGTGGAAGCTGGTTTAAAACGTTGTACATTGACGAGCTGCGTCGGCAGCATTTTCGCCCCCGGATTTTGCGGGTAGCGTTTTTGCCAGTCGGCGATCCCGGCTTTCAGCATGTCCGGATCGTTGCGGTTGTCAAACC [...]
+AGTCATTCTGGAAGATCGGTATCAACTCGCCAGCGATCCGAAAAAGCGGATTGCCCAGGCGGCTGCGGCAATGGTTGAAGAAGGAATGACCATCATTCTGGATAGCGGGAGCACAACATTACTGATTGCGGAAGCGCTCGCGCGAAAAAGCAATATTACGGTGATCACTAACAGCTTGCCTGCCGCTTTTACGCTATCAGAAAATAAAGATCTCACGCTGGTGGTCTGCGGCGGTACGGTACGGCATAAAACCCACTCAATGCACGGCACGATTGCGGAACGCTCGCTACACGGCATCAGCGCCGATGTCATGTTTGTCGGGGCGGATGGCATTGATGCGACAAACGGTATTACCACGTTTAACGAAGGTTATTCCATTAGCGGCGTCATGGCGGCGGCGGCACACAAAGTTATCGCGGTACTGGACGCGACCAAATTTAACCGTCGCGGCTTTAACCAGGTATTGCCGATGGACAAGATCGACTGTGTGAT [...]
+NODE 634 3263 155196 153085 0 0
+GCGTATACTTTCGCCTTTATTAATCTGACCGTTATAGTTACGCCACAACTCTGGCCGCTGATTTTTCGGGTCCCAGCGATGGAAACGGTCACGAAAGGAGTAAATACGTTCTTTCGCGCGGGATTTTTCCTCATCGCGCCGTGCGCCGCCGAACGCGGCATCAAAACCGTACTTATTCAGCGCCTGCTTTAACCCTTCGGTTTTCATAATGTCAGTGTGTTTAGCGCTACCGTGAACGAACGGATTGATGCCCATCGCCACGCCTTCCGGATTTTTATGTACCAGCAATTCGCAGCCGTATGCGTTGGCGGTACGATCGCGAAAGGCGTACATCTCACGGAATTTCCAACCGGTATCAACGTGCAATAGCGGGAACGGTAACGTACCCGGATAAAACGCCTTACGCGCCAGATGCAGCATGACGCTGGAGTCTTTACCAATGGAGTACAGCATGACCGGATTAGCGAATTCCGCTGCCACTTCACGGATAAT [...]
+GCGGGGATAAACCGAGATGACCATCCCACCAAGCAGGCGAAGAAAAGTGTTCCCCGCGCCAGCGGGGATAAACCGGTGCCGCTGATTTTCGTAACGCCTCAATGTATGTGTTCCCCGCGCCAGCGGGGATAAACCGAAAAAACAATGGTTTTACCGTCCGGCTGAACAGTGTTCCCCGCGCCAGCGGGGATAAACCGCCGATGATCCAGAAAGTCACAAATGCGAGGAGGTGTTCCCCGCGCCAGCGGGGATAAACCGAGGGGTTCAGGGGCGAGCGGGCGTTAAAGCGCGTGTTCCCCGCGCCAGCGGGGATAAACCGCAGACCAGGGAGTTTCTGGCCGAACTGGAGAGGTGTTCCCCGCGCCAGCGGGGATAAACCGATGTGCGCATTATTGCTAACCATAGAGACTCAGTGTTCCCCGCGCCAGCGGGGATAAACCGGGCGACGGCACAAAACGCTCAAAACTCATAACGTGTTCCCCGCGCCAGCGG [...]
+NODE 635 7123 374736 370804 0 0
+AATCTGACGCGCTTTTTCCGCTGACCCTGAGCATCTTGTCCCTCATTATGGCCTCGCTGCTGCTATTTATTGTGCTGTGGTCCGATCCGTTCCTGCGTATTTTCCCTCCCGCCATGGAAGGGCGCGACCTTAATCCCATGCTGCAACATCTGGGGCTGATCTTACATCCGCCGCTGCTCTATCTGGGTTATGGCGGCCTGATGACCGCGGCGAGCGTAGCGCTGGCCTCGCTACTGTGCGGCGGCTTTAACGCCGCAACCGCCTGGGTGTGCTGGCGCTGGGCGTTACCCGGCTGGTGCGCTCTGACGCTGGGGATCATTCTCGGATCGTGGTGGGCGTATTGCGAACTGGGCTGGGGCGGCTGGTGGTTCTGGGACCCGGTGGAAAATGCCTCGTTGTTGCCGTGGCTTGCCGCCAGCGCGTTGCTGCACAGTCTGTATGTCAGCCGCCAGCGCGGGAGATTCCGTCACTGGTCGTTGCTGCTGGCGATAC [...]
+AATCTGTTTCCTGGGATGAAGCGCTCAATTACGTCGCTGAACGTTTGAGCGCCATCAAAGCGAAGTACGGTCCGGATGCAATCCAGACAACCGGCTCCTCTCGCGGTACCGGAAATGAAACCAACTATGTAATGCAAAAATTCGCACGCGCCGTTATTGGTACCAATAACGTTGACTGCTGCGCTCGCGTCTGACACGGCCCATCGGTTGCAGGTCTGCACCAATCGGTCGGTAACGGCGCAATGAGTAATGCGATTAACGAAATTGATAACACTGATTTAGTGTTCGTCTTCGGGTATAACCCGGCGGATTCCCACCCTATCGTGGCGAATCATGTGATTAACGCTAAACGCAACGGGGCGAAAATTATCGTCTGCGATCCGCGCAAAATTGAAACTGCGCGCATCGCTGACATGCATATCGCGTTGAAAAACGGCTCGAATATCGCGCTGCTCAACGCCATGGGGCATGTCATTATTGAAGAAAACCTGT [...]
+NODE 636 1344 62086 59134 0 0
+GGACCAATCAGCCCGACCATACTACGGGCGGGAATGTCCAGCGTGATATTGTTCAGCGCGACCGTTTTTCCGTAATGCTGGCTCACCCCCTCAAGCTGCGCCACGGGAGGAACAGGCACCAGCGTCAGCGACGTCATTGCGACAGCCTCACGTTCAGATCGTCAGGCCAGGGCACGCGCTCATCCAGACGAACCCATGCCATTCCCGGTAAACCGGTTTTGACATATTCCAGATGCTGTCGCAACAGCTCTGGCGGAATACGCGCTTTGACGCGGAACATCAGCTTTAACCGTTCATCGTGGGTTTCCACGGTTTTGGGTGTGAACTGCGCCACGCTGGCGACAAAACTGATCGTCGCCGGAATACGCAGATCCGGCGCGGCGTCCAGCACCAGTCGCGCTTCGCCGCCGATCTTCAACAACCCCGCCTGTTCGGTCGGCAGGAAAAATGTCATATAAACGTCGCTGAGATCGACCATGTTCAACACCCGGC [...]
+ATTCTTATCCCGGATGGAAACCCCCGCTGAGCGCACGCCCGGCGGACTTTGTGACACGCATGGTTAGACAACAGGGATTACGGCGGGTCGATTATGGACAAAATGAAGCGTCATCTGGTGTGGTGGGGAGCGGGGATTCTTGTGGCGGTGGCCGCGATAGCCTGGTGGATGCTGCGCCCTGCGGGAATACCGGAGGGGTTTGCCGCCAGTAACGGCAGAATTGAAGCCACCGAAGTGGATATTGCCACTAAGATTGCCGGGCGTATTGATACCATCCTCGTTTCGGAAGGGCAGTTCGTTCGTCAGGGCGAGGTGCTGGCGAAAATGGATACCCGCGTATTGCAGGAGCAGCGGCTGGAGGCGATTGCGCAGATTAAAGAGGCCGAGAGCGCAGTTGCCGCCGCCCGCGCCTTGCTGGAGCAACGCCAGAGTGAAATGCGCGCCGCGCAGTCGGTCGTCAAACAGCGGGAAGCTGAGCTGGACTCCGTCTCT [...]
+NODE 637 2726 115869 113111 0 0
+GCAGCATTTGCGCATCGCCGCAGCGCAGCGCCGGGTTATCCGCAAACTGCGTGATAAGCGCCATCAATCGTAAGGCATGGCGGGAGAGCGTGGCATCATCGTAACGCTGTGCATTCGCCAGCAATTCAATATCCAGACCGCCGTTTTCATCCGGAAAAAGCGCCAGTTCAAGATCGTTAACCGGCCCCGTCGCCAGGGTATGGGTTTGCGCCTGTATGCCAGGAAGATCCAGATGATAATCAAACACTTTTATATTGAGCACCGGGCCAAATAGCGGCGTCTCCCCTGCGGCTCGCCCGCTATCGCGTACAATCTGTTCGGCGTCGTAACGCTGGTGACGGCGCATCTTCTTTAACTGCGCCGCAAGACGCTTCGCCAGCGTTGGCAGATCTTCCGTCGCATGAAGGTTAACCGCCAGCGGCAACACGTTAAGGACAGGCCCGGTCGCCGTTAACGCCGCCGAACCCATCCGCCGCATAAAGATAAATCCGG [...]
+CGGGTCACTTTTTGGTGGCGCGACCCGCAGGGAAACGAAACACACTCCCCGATACGGCGTGTCTGGGTCTACATCACTGGCGTAACCGATCATCATCAAAACGCGCAGCCTCAGACGATGGCGCGTATTGCCGGAACGGATGTCTGGCGCTGGAGTACGGCGCTTAGCGCTAACTGGCGCGGCAGCTACTGTTTTATTCCTACCGAACGCGATGACGTTTTTGCCGCTTTTGCGCCGGGCGAAACGCCCGATCGGAACGCACTGCGTGAAGGCTGGCGACAGCTATTACCGCAGGCGATTGCCGACCCGCTTAATTCGCAAAGCTGGCGGGGAGGACGTGGTCATGCGGTTTCAGCGCTGGAAATGCCGGATGCGCCCCTTCAGCCGGGGTGGGATCGTCCTGAAACGCCGTACTCGCCGCCTTTGATGATGCAGTGGCATAGCGAACGTCTGGATAACTCCCGCCGCGTATGGATATTGACGATCGGAGAC [...]
+NODE 638 9260 511456 501391 0 0
+TACGGCTATATTCAGGCGGTGAACTATCTTGTTCGTCAGTTTGCCCCGGATGTGGCTTTTGGCTGGCAGACGAATGTCTGGGCGACAGGAACGGCGGACTGGGTGCTGCGCGATACCGCTGATCCGGTAGCTGAAGGGCAGGCGATCGCCGGATTTATTCATGAACTGGGCGTTTACAGCGGAGAATATGCGCCGGACTTTATTGCGTTTGATAAATTTGAGCGTGACTGTTTCAGTCCTGATGCGCTTGCCCACTATGGCTGGAATGCGACATGCTGGCTTAATTACCTGGCGATGGTCAAACAGGTGACGAAAGTGCTGCTGACGCCCGCCATGCTGTGGCAAATCCCAGGCGGCCATATGCCTACAGTAGAAGAGGGCGTCAGTAAAATCAGCGCTGCGCACTTTGCATCCGGCGGAACCTTTTTTATGGGGGACGCCCGCATTGGCAGCGATCCTGACACGCTCTCTTTGCAGCTACTCAATACGGCC [...]
+CCAGTTGAACATACGCCTGTTGTTGCGCAATCTGCTGACGCTGATGCAACGTCTCGCTGGCGGCGACCAAAAATTCCGGATGTTCGGCCAAATACGTTGCCACCACCTCTCCCACTTTATCCGGATGACTGACGATGTAGGCTTCCGCCGTCGGGCCAATTTGCGACGTCGGGGCAGAATCGGCGGCGATTGCCGAGGCGGATACGGCAACGCCTGCCAACGTCAACATCGCCAGTCGGGAAAGTTTTAACGCGTGATAATACATAATAAAAGTCTCGTTCGATAAGATCGGAAAGCCTCCCGCTATCGGGAGACGCCTGAAAAATAGGTTAATGAATACGCGTCAGATCCACGGTTTGCGCTGGCATTACCCGCCCATAGTCATTAATACTTTGCCAGCGCACAGTGCAGCGAACCGTGTGCCGGCACCAGTCCGTTTGACGCGTTGCAAAGGGAGCCACGACCCCGGCGTTGTCCTGGGCGCGCTCGTTA [...]
+NODE 639 14155 825508 817811 0 0
+GTTCGCTCGCCGAGCTTAAAAATGCGCTGAAAGGCAAAGTGCAGGAGACGCTCTCGGCGGTGGCGGATGACGGCATCGAGCAGAGCGGGCTGCATATCTGGAGTTTCGGCGAGCTGCCGGAAAGCTACGAACAGAAACGCGGTAATTATAAAGTGAAGGCGTGGCCGGCGTTAGTGGATGAGCGTGACAGCGTCGCTATCAAATTGTTTGATAATCCGCTGGAACAACAACAGGCGATGTGGTGCGGTTTACGCCGTCTGCTGTTGCTCAATATTCCTTCACCGATTAAGTATCTGCATGAGAAATTGCCGAATAAAGCCAAGCTGGGGCTGTACTTTAACCCGTACGGCAAAGTACTGGAGTTGATTGATGACTGTATTGCCTGCGGGGTAGATAAACTGATAGATGCCAACGGCGGGCCGGTGTGGAGCGAAGCAGGTTTCACCGCGCTGCACGAAAAGGTACGCGCCGAGCTGAATGATACTGTGGTGG [...]
+AATAACCGCCAGCCCAATACCGCCTAAACCAAAAACGGCAACGGTGTCGCCCGCTTTCACTTTAGCGGTGTTATGGACGGCGCCAATACCCGTCGTCACGCCACAGCCCAACAGACACACTTTATCCAGCGGCGCCTGCGGGTTCACTTTCGCCAGAGAAATTTCCGCGCAAACGGTATATTCGCTGAACGTGCTGGTTCCCATATAGTGATAAACGGGTTCGCCGTTATAAGAAAAGCGGGTAGTGCCATCCGGCATCAGCCCTTTTCCCTGAGTGGCGCGTACGGCCTGACAAAGGTTAGTTTTACCGGACTTACAGAACTTACACTCGCCGCATTCCGCCGTATACAGTGGAATAACATGGTCGCCGGGTTTCAGGCTGGTGACCCCCTCGCCGACCTCAACTACCACGCCGCCGCCTTCGTGACCCAGGACTGCCGGGAATACGCCTTCCGGATCATCGCCGGAAAGGGTAAAAGCATCGGTATGGCA [...]
+NODE 640 51 2970 2928 0 0
+ACCTTCTTTAAGCGGCTGCCTGCGGATTACGGTCGGCACCCGCCAGGAAAA
+TTGTTTGTTCTGATCGCGTAAGATAATGCCCTGATCCCATAAGGATTTAAA
+NODE 641 21 1150 204 0 0
+GCCTTACGTGCGGAGCCAGTA
+TGCCGACCGTAATCCGCAGGC
+NODE 642 2820 132573 131485 0 0
+CAGGTATCAATCCCGACGACAATGCACTGTACGCCAAAACGGTCAGCCAGACGGGTAATCAGCGTTGGGTCAGCCAGCGCCGGGGAGTTGATAGAGATCTTATCCGCCCCGAAAGAAAGAATTTTGGCGGCGTCGTCAATTGACCGGATACCGCCCGCTACACAAAACGGAATGTCGATCACCTCGGCAACGCGCGCCACCCAGCTTTTATCGACTACGCGGCCATCGCTGGAGGCGGTAATGTCATAGAACACCAGTTCGTCCGCGCCTTCGTCGGCATAGCGTTTGGCCAGCGGAACGATATCGCCAATGATCTCATGGTTGCGAAACTGTACGCCTTTTACCACCTGACCATCACGAACATCCAGACACGGAATTATACGTTTTGCCAGCATTGGATGGCCTCCTTAACGGTAAATTTCCCTTCTAACAGCGCGCGCCCGACAATCACCCCGCGCACGCCGGTGCCGCGCAGGGCGGCAATATCATCGA [...]
+TGAGTCAGAAGTATCTTTTCATCGACCGGGACGGAACCTTAATTTCCGAACCGCCGAGCGATTTTCAGGTAGACCGCTTTGATAAACTGGCCTTTGAGCCAGAGGTGATTCCCGTATTGCTGAAGCTGCAAAAAGCCGGTTTTAAGCTGGTGATGATCACTAACCAGGATGGACTTGGCACGCAAAGCTTCCCGCAGGCGGACTTCGACGGACCGCACAACCTGATGATGCAGATTTTCACCTCTCAGGGCGTACGCTTTGATGAGGTGCTGATCTGCCCTCACCTGCCCGCAGACGATTGCGAGTGCCGCAAGCCCAAAGTGAAGCTGGTGGAGCGTTATCTTGCGGAACAAGCGATGGATAGCGCCAACAGCTATGTGATTGGCGATCGTGCGACCGATATCCAGCTCGCTGATAATATGGGCATTACTGGTTTACGCTATCACCGTGAAACGCTGAACTGGACGATGATTGGCGAACAGCTAACGAAAC [...]
+NODE 643 899 39165 38887 0 0
+CGCGTAACGGGGCATGTAGTTTATCGGGCGGTGATTGATTGCGACGATATGCCGGACGATTTACGTATTAACGCACCGGTGCTGTGGGCAGGCCCGCATTGTCACCTGGTCCATTATCCGCTCCGTGGAGGCCAACAGTACAATCTGGTGGTGACATTCCACAGCCGCCAGCAAGAAGAGTGGGGCGTGAAAGACGGCAGTAAAGAAGAGGTGCTCTCTTATTTTGCCGGTATTCATCCCCGCCCGCGTCAGATGTTGGATAAGCCGACCTCCTGGCGCCGCTGGTCGACCGCCGATCGCGAGCCGGTCGCGAAATGGGGAACCGAGCGTATCACTCTGGTGGGCGACGCCGCGCATCCGGTGGCGCAATATATGGCCCAGGGGGCCTGTATGGCGCTGGAAGACGCCGTCACGCTGGGCAAAGCGCTGGAACGCTGCGACGGCGACGCGCAGCAGGCATTTGCGCTGTATGAGTCGGTGCGTATTCCCCGC [...]
+GTAATCATTCACTTCGGTCAGCAGCTCGCGCACTAACGCGTCGAGCACGCCTTCCATCGGCGCCAGTAAAACACGCATATCGGTATCCACAGCAAAAAAAGAGGCGCTATCATAACGCCTCTCTGCGATGAGCAAAACTTTTTGCCGGGTGGCGGCGCAAACGCCACGCTACGTCACGTAAAGCGCTCAACGCGGCTCAAGACAGTTATCTTCTTTCCAGCCGTACAGCCATTCGATACCGCGATAAAACGCCTCCTGCGATTTTCCTTTCCACAACAGATTACGTACCTGACGCTCCACCCCGGCGGCGTGATAGAGACGCCCCATCTCGCGGGTAGACCAGACGATACGCGCCGTGCGGGGAATACGCACCGACTCATACAGCGCAAATGCCTGCTGCGCGTCGCCGTCGCAGCGTTCCAGCGCTTTGCCCAGCGTGACGGCGTCTTCCAGCGCCATACAGGCCCCCTGGGCCATATATTGCGCCACCGG [...]
+NODE 644 11761 688693 683999 0 0
+TAGCACGTTAATTATCTATCGTGTATATGGAGGGGAATGATGATAAAGAAAAAGGCTGCGTTTAGTGAATATCGTGATTTAGAGCAAAGTTACATGCAGCTAAATCACTGTCTTAAAAAATTTCACCAAATCCGGGCTAAGGTGAGTCAACAGCTTGCTGAAAGGGCAGAGAGCCCCAAAAAAAGCAGCGAGACAGAGAGTATTCTTCATAACCTATTTCCACAAGGCGTTGCCGGGGTTAACCAGGAGGCCGAGAAGGATTTAAAGAAAATAGTAAGTTTGTTTAAACAACTTGAAGTACGACTGAAACAACTTAATGCTCAAGCCCCGGTGGAGATACCGTCAGGAAAAACAAAAAGGTAAAGCATAATGTCTTCAGGAAACATCTTATGGGGAAGTCAAAACCCTATTGTGTTTAAAAATAGTTTCGGCGTTAGCAACACTGATACCGGGGGGCAGGATGACTTATCCCAGCAAAATCCGTTTGCCGAA [...]
+TTAAGGTGCCGAAAATAAGACGTAAATCTCTAATAGAAACCCGTTCTGATACAAGCCGTTGCAAAGTTTCAGCGATTTTATTAATGGGTAACTGGCGTTGAAGCTCTTTCACCAGCTCAGAGTAGTTTTTTTCCATCGCATTCATTAGATAACGCGTTTCCTGAACACCAATAAACTCTCCCATATGCCGAAGCAGGACACATTTTAATAAGGCAGAGATACGTTGGCTGCCCGCGAAAACGTCCAGTCCAAAACCTTGCGCCTTATGGGCCATCTCTTTTGTAAGCCAACAGATCTGCCCCATCCCGTTCGGTAACGTCTGGCTGTCACCCACCACACTAGCGTCCGCGCCTATCAATAAATAATCCGCCTGAGCGGGAATAGATAAACTAAATACGGGTTCCTGATATAGCAGTACCGTCAATTTTTCGGTGGGTTCAGGCAAAACCTCAATATTCACCTCAGGGAGAGGGACGCCGGTATCCTCAAATA [...]
+NODE 645 19594 1021317 1009869 0 0
+ACCAGCCGGTCGAGCAGGTGGCAAGCCTGCGCGTAACGCCGAACATGTCCACATGGCGTCCGTGCGATCAGGTGGAATCCGCGGTGGCGTGGAAATATGGCGTAGAGCGTCAGGATGGCCCAACCGCGCTGATTCTATCCCGTCAGAACCTGGCGCAGCAGGAACGTACTGAAGAGCAACTGGCGAATATCGCCCGCGGTGGTTACGTACTGAAAGATTGTGCGGGCCAGCCGCAGATTATCTTCATTGCGACCGGTTCTGAGGTTGAGCTGGCGGTTGCCGCTTACGAAAAACTGACTGCCGAAGGCGTGAAGGCGCGCGTGGTTTCCATGCCGTCCACCGACGCGTTCGACAAGCAGGATGCGGCCTACCGTGAATCCGTGCTGCCGAAAGCGGTCTCTGCGCGTGTGGCGATTGAAGCGGGTATCGCTGACTACTGGTTCAAATACGTCGGCCTGAACGGCGCTATTGTCGGGATGACCACCTTCGGTG [...]
+TTGACGCCTTGCCCTGCCAGCGGGTGGATGGTGTGCGCGGCATCGCCGACCAACGCCAGACGATGCGCGGCAAACTGGCGAGCATAGCGGCCCGTCAGCGGAAAAACCTGCCGTTCGCTTTCCAGGCGGCATAAGCCCAGCCGATTATCGAAGGCGATAGTCAACGCCTGGTTAAACGCCTCGTCGCCGCTCTGTTGCATACGCTCCGCATCCTGCGGAGAAAGCGACCAGACAATGGAACACAGATGCGGATCGCTTAACGGCAAAAACGCCAGAATACCTTCACCATGAAACACCTGGCGAGCAACCGCGCCGTGCGGCTCTTCGGTGCGGATAGTCGCTACCAGCGCATGGTGACGGTAGTCCCAGAAGGTTAAGGGGATATCCGCTTTGTTACGCAGCCAGGAGTTGGCGCCATCCGCGGCAATCACCAGACGCGCGGTTAACATCGCGCCGTCTTTTAAAGTCAGGAAGGCGTCGTTCTCTCCCCAG [...]
+NODE 646 4608 229460 227380 0 0
+GAAGAAACCATTACCGTAACCGCAGCGCCTGCCGCGCAGGAAAGTGCCTGGGGACCGGCTCCGACCATCGCCGCGAAGCGTTCCGCCACTACCACCAAAACTGATACACCTATCGAAAAAACGCCACAGTCGGTTTCGGTGGTCACTAACGAAGAGATGCAGATGCATCAATTCCAGTCAGTAAAAGAAGCGTTGGGTTACACACCAGGCGTAACGGTAAGCAGCCGCGGCGCTTCCAATACCTATGACTTCGTGATTATCCGTGGCTTCTCTTCCGTCGGCCTGAGCCAGAATAACTATCTGGATGGCCTGAAATTGCAGGGTAACTTCTACAACGATGCGGTTATTGATCCCTACATGCTTGAGCGTGTTGAGTTGATGCGTGGCCCAACGTCCGTTCTCTACGGTAAGAGCAACCCGGGCGGTATCATTTCTATGGTTAGCAAGCGGCCGACTACTGAGCCGCTGAAAGAAATTCAATTCAAAATGGGG [...]
+CAGATTACGCGCAACGCCGTCATCCAGCCCCATCAGCGTCATCGGACGTAGCAACAATAATGTGAGCATCACACCGCCCAGCAACTGCGGCCACAGACGCTGCACGCCGCTCCAGTCGGTTTGCGTCAGCGTTCCGGTGCTCCATAAAAACATGCTTTGCAACTGATCGTGGTGGAAAATCACCAGTAACTGGTTGATTGCGCCACAATAGAGGCTGACCACCAGCCCGGCGAGGATCAGGGTTACCGGCGACAGGCGTTTGCCCCACGCCACGCCGAACACCAGCGCGCCGACGATACAGGCTCCCGTCAAGGCGGCAAACTGCGTGGTCAGCGCGCCGGGAATCGCCCATAGCGTAGTCACCGTGATCCCCAATTGCGCGCCGGTCGCCACGCCCAGCGTGGTCGGTTCCGCCAGCGGGTTACGCAATACTTGCTGGAACAGGACGCCTACCAGCCCAAGTCCCGCGCCCACCAGTAGCGAAATCGCCAG [...]
+NODE 647 4959 290995 288823 0 0
+ATTGCAGGCGGAAACAATGGCGGCATTCTCTTCCAGCGCGCGAAATAGGGTCGCTTTATTACACTTTTCAGGATCGATAGACAGATTGATAAACGACGGCGCGGCATGGTACCAGCGTTTAAAACGCATAACGTCAGAGAAGATGGGCATCACACCGTACGCGCCGGGAGGAACCCGGCTGGCCATATCTTCCAGCAGGGAATACGCATCAATACCTAACCTTTCAGCGATTAGTTTTTCCTCGGCGCAAAAGGCGTCGCGGAACCAACGCATCGTTAACCCAGTAAAAAAGCTAATAGACTCGGTTTGTACCATACCGGGGATCACATGAGGATTGATGCGAACGTTCATGTTTGGGTCGGTGACCGGCGCGGGAAGATTGACGACCTGTTGCCAGAAGGTTCCGCCCAGCACGGCCGTTTGCGCCGGGCGTACGACGCCCAGCCCCAGACAGCCTAACTGCACATCGCCGCCGCCAACGATGACCGGCGT [...]
+GGGGATACGCAGCAGCACTAACACACTATCGATTTGCGTAAGAAAATAAGCGCCGAGAATAGCGCCGATGACCGTGCCTGACCCGCCTAACAGGCTAATTCCCCCCAATACGCAGGCCGCGATGGCTTTCATTTCCAGCCCCGTGCCGGTTTGATTGGGAATGAAGCCAATCTGCGAGGCAAACACGATTCCAGCCAATGCCGCCATACCGCCATTAAGTGAAAATGCCATGATGCGTACCATCTCGGTACGGACACCCAATTGCCGGGCACCCTGCAGGTTATCGCCGGTGGCGTAAAAATTGCGGCCAAAGGCGGTTTTCGCCAGGAGCCAGGCCATAAGCAGCGCTAACACCAGGGTAAACCAGCCGATTGCGGAAATTCCCAGAAACACAGGAGCAGAGAGTTGCTTTAAGCCTGCGGGTAATCCTTCAATCCATTTCCCCCCTGTCCATAGCAGCATGATCCCACGATACAAGCCCAGCGTTCCCAG [...]
+NODE 648 2706 129329 127733 0 0
+TTCGGCGGCTGCCGTTTATCGCTGGCAACGCCGGTTGACGAAGCCTGGGACGGCCCGGCGGCGCTGGACGGTAAACGTATCGCTACCTCTTATCCGCACCTCCTCAAACGCTACCTCGACCAGAAAGGCGTCTCTTTTAAATCGTGTCTGTTAAATGGTTCTGTCGAAGTCGCGCCGCGCGCGGGGCTGGCCGACGCTATCTGCGATTTGGTCTCTACCGGCGCGACGCTTGAAGCTAACGGCCTGCGTGAAGTCGAAGTTATCTACCGCTCTAAAGCCTGTCTGATTCAGCGCGACGGTGAGATGGCACAGAGCAAGCAACAGCTGATCGATAAATTGCTGACCCGTATTCAGGGCGTGATTCAGGCGCGCGAATCGAAATACATCATGATGCACGCGCCAAGTGAACGCCTGGAAGAGGTTATCGCCCTGCTGCCAGGCGCCGAAAGGCCGACAATTCTGCCGCTGGCGGGCGAGCAACAGCGCGTGGCG [...]
+GCTTTCGACAATGTGCGCAGGATAACCAGATGAGGATATTCAACCAGCCAGCCTGTCAGCGTGGCCTGCGGGCAAAACTCAATATAAGCTTCGTCGGCGACGACTATCGCTTTACCGCGTGTCAACTCCAGCAGCGTGCGCAGATCCTGCGGGTTGATAAGTTGCCCGGTGGGGTTATTGGGGCTACAAACGAATACCACTTTTGTTCCGTCAAGGTTGTCGGAAATCCCCTGTAGATCCAGCTGCCAGTTTTCAAGCGCGGGAACCGTCCGGCGCTCTACGCCAATGGTTTCGGCGCTGACGCTGTACATACCGTAAGTAGGCGGACAGTAGAGAATGGCGTCTTTCCCCGGTTCGCAGAAGGCGCGGATCACCAGCTCGATCCCTTCATCCGCGCCGCGGCTGACCAGCACCTGCTCCGGCTTTACGCCAGCATATTGCGCGTAGTTTTCAATCACGGCCTTTGGCTGGCATTCCGGGTAGCGGTTAAGC [...]
+NODE 649 99 4103 4044 0 0
+CGTCGCGCCGCTGGTCATCTTCATGGGCGTGGGCGCGATGACCGACTTTGGCCCGCTGCTGGCGAATCCGCGCACCCTGCTGCTCGGCGCGGCGGCGCA
+AAAGTCGGTCATCGCGCCCACGCCCATGAAGATGACCAGCGGCGCGACGCCGGAGCCAATCGCCACTTTATAGAACAGCGCCAGCACCCCCGGCGTGTA
+NODE 650 7904 406813 404007 0 0
+ATAATCGCCAGCGTCACCATCAGCCCTTTACGACGTCCGATTCTGTCAATATAGGCGCCAAGCACAATCGCGCCGACGGGGCGCATTAAAAAACCGGAGCCAAAGACGGCAAAGGTCAACATTAATGAGGCAAATTCGCTTTCCGCCGGAAAAAACGTTCTGGCGATATAGGTGGCGTAAAATCCGAACAAGAAAAAATCAAACTGTTCAAGAAAATTGCCGCTTGTCACGCGCAGTATTGCGCCGAACGTGCCGGCGCGCGATGTTGCAGGTGTGTGTTGTGCCATAGGGTTTGCTCTCCACTGTCTTTATTGTTTTATGGGTAAGATGTTGCGGGTCAGTTGCCTGTATCCCCCGCATGTTTTCCGCGTCGCTTCTCAACAGCCCATTTGAGTAAGGCCGCGCAGCGGAAAAATCCGTGGGCGAATTTTCCGTAGGGAAGGGTAAGAAAGAGCGCCATCACCACGCCTAAATGGAGCGCCAGCAGTATGC [...]
+CCATTGGGCGGATTATATTTAATACCGCCATCTTCCGGCGGGTTGTGCGACGGCGTAATGACAATACCATCAGCCAGCGGGCCGCCTTTTTTGTTATGGACCAGGATAGCATTTGACACCGCAGGCGTTGGCGTGAAGCCATTATTTTCCTGCACGATAACGTCTACGCCGTTTGCCGCCAGCACTTCCAGCACGGAAATGAAGGCCGGTTCCGAGAGCGCATGGGTGTCTTTCCCTACATAGCAGGGGCCGGTAATGCCATTTTTCGCCCGCTCTTCAGCAATCGCCTGGGCGATCGCCAGAATATGCGGTTCGTTGAAACTGTGACGACCTGCGCTGCCGCGATGGCCGGAAGTGCCAAATTTCACGGCATGTTCTGCATTCCCTGCCTCCGGTTTCAGTACATAATACTGCGCCGTCAGTTGGGCGACGTTAATCAAATCACTCTGTTGCGCGGGTTGTCCTGCGCGGTTGTGGATTGCCATTGCCTGG [...]
+NODE 651 94 4214 4214 0 0
+ACGTTTGACCATACGATGCAGCGTTACGCCCGTTTCGCTTTCGCCGTTAACCAGAACCCAGTTTAGCGGCGCACGGCCACGATAGGCAGGCAAT
+GCGAAAGCGAAACGGGCGTAACGCTGCATCGTATGGTCAAACGTGCCGACGCCGGAGAGATTGTCGCCAGTCAACGCGTCGCTATTGCGCAGGA
+NODE 652 1077 72049 71249 0 0
+GTCTTTATTCCAGCCGCCTTCAACCTGGTGTGCGGCAACCGCGCCGCCCCATAAAAAATCTTTTGGCAGGGTGAGTTTTCTCATTGTTGCATAATCTCAATTTATTTAGTCTGTTATCATTCATTCTGCACCAAATGGCATGTAAAGCGTACGCAAAATTCCAGGATGCTCGCGTGTCGGGACAAGAACACATTCAGATCGTAACATCCACTTCAAGGGGCCATATTCAGGGGATAACCACATGCAGCCAAACGACATTACTTTCTTTCAACGTTTCCAGAATGACATTCTGGCAGGGCGTAAAACCATCACTATTCGTGATGCCTCCGAGTCCCACTTTAAAGCAGGCGATGTGCTACGCGTGGGACGGTTCGAAGATGATGGCTATTTTTGCACAATCGAAGTGACAGGAACGTCAACTGTGACGCTGGATACGCTGAACGAAAAACATGCGCAACAGGAAAATATGTCGCTTGATGAGCTGAAACGGGT [...]
+AGCAGAAATGGCGTATAGGTTCCGGCAATGAGCAGATAGATAGCGCAGTGATCAAATTTCTTTAACCAGATTTTTGCCCGCTGATGAGGAATGGCATGATAAAGCGTTGAGGCAAGAAAAAGCAGGATCATGCTCCCGCCATATAAACTGTAGCTGGCGATAGCCGTCATACCCGCATTCGCCTCTACCGCCTGAACCAACAACAGCACCAGGCCGACAATACCAAATACCAATCCAATGCCGTGGCTAATACTGTTGGCGATTTCCTCAGCCAGCGAATATCCCTGCGTCATTAATGGTTTTTGCACCATAACTTACTCCGGAGAAACGTTCATAACGATGAACTGCGCCTCTAGCGTAACTGAGAATGGTTCCAGTGAACACATGTTAGCTAAAATAAATTCTCAAAATTAAATTTTGTTTATTATTCAATAAGTTAATTACAAAAACTCAACTAACACGCGTTCATATTTATCAAAGGCATTTAAAATC [...]
+NODE 653 4112 205646 204598 0 0
+CGCCCTCTGGCTGGTCGAAGAGGGCGGGTTATCCGCAGAACTCAGTCAGGCTGTATGGGCCGGTTTCCGGCGTCCGCGTGGAAATCTGGTGGCGCAGTCGCTGGCGGCGCACGGTAGCGACCCTTTAGCCGCGACGCTGGTCGGGCGTCGCGTAAGCCGTATCGCAGTGCACCCCGCCCGCCAGCGCGAAGGCATCGGTCAGCAGTTGATTGCCTGCGCGTGCATGCAGGCGGCGCAGTGTGATTATCTTTCCGTCAGCTTCGGCTATACGCCGGAGCTGTGGCGTTTCTGGCAACGCTGCGGCTTTGTACTGGTACGGATGGGCAACCATCGGGAGGCGAGCAGCGGTTGCTATACGGCGATGGCGTTATTGCCGCTGAGCGACGCGGGAAAACGGCTGGCGCAGCAGGAACACCGACGTTTGCGCCGCGATGCGGATATCCTGACGCAGTGGAACGGCGAGGCGATACCGCTGGCGGCGTTACGCGAACA [...]
+CCGCAACTGCAAATTGATATTGACCAACGAAAAGCGCAGGCGCTGGGCGTATCGATTGACGATATCAACGACACCCTGCAAACAGCCTGGGGATCGAGCTACGTCAACGACTTTATGGACCGGGGCCGCGTGAAGAAGGTCTATGTTCAGGCCGCAGCGAAATATCGTATGCTGCCGGATGATATTAATCTTTGGTATGTCCGTAACAAAGACGGCGGCATGGTCCCCTTCTCCGCCTTCGCCACCTCGCGCTGGGAAACCGGATCGCCGCGTCTGGAACGCTATAACGGCTATTCGGCGGTAGAAATTGTCGGAGAGGCCGCGCCGGGGGTCAGTACCGGGACGGCGATGGATGTCATGGAGTCGTTGGTGCATCAGCTACCGGGCGGTTTTGGCCTGGAATGGACAGCCATGTCTTACCAGGAACGGCTCTCCGGCGCGCAGGCGCCCGCGCTGTACGCTATTTCGCTATTAGTCGTCTTCCTGTGTCTG [...]
+NODE 654 4357 228381 224334 0 0
+AGAGATTGTCGTGGAAACGCTACAGCTTGAGCAGGCGGTTAAAGATGCCGATCTGGTGATTACCGGAGAAGGGCGGCTGGACAGCCAAAGTATTTGCGGCAAGACGCCGATTGGCGTCGCCAGAGTGGCGAAGCGGTATCATAAACCGGTTATCGCGCTCGCCGGTGGGCTGCAACACGATCATCACGTTGTGTATCAACAGGGTATCGATGCGGCGCTGTCGATTTTGTCGCATATCGTTACGTTGCCGGAAGCCTTACACGAGGCGGAATATAACCTGAGCCTGTCGGCGCGCAATGTGGCGGCGATATGGCGTCTGGCGCGGCAAGCCTGACGGCGCATTCCCTTTCCAGGCCGCACATCAGCGCGGCCTGAGGCTTTTACGCGTTTTCTTTCAGCCAGTTCAGCACCACATCATGGTGATTGCTGGTTTTAAAATCATTAAAGACGTGCTCAATCTTACCATCAGCGTCAATCAAAAAGCTGATGCGG [...]
+TCTTTGTCCATTTTGTCCAGCGTCTCTTTATCCCACAGGCGGCTGCCGTCCGGCGAAAACTCATCGCCCAGCACCACTTCGCCTTTATACAGGCCAAACTCCAGTTTGAAATCCACCAGGATAAGGCCCGCGTCATCAAACAGTTTTTTCAGTACGTCGTTGGCTTTGTAGGTTAGCTCTTTCATACGCGCCAGATTTTCCTGACTTACCCAACCGAACGTTTCACAGTAGGAACTATTCACCATCGGGTCGTGCAGCGCGTCGTTTTTCAGGAACAGATCGAATATCGGCGGGTTAAGCTCCATGCCTTCTTCCACGCCCAGACGCTTGACCAGCGACCCAGCCGCACGGTTGCGCACCACACATTCAACCGGCACCATCTCCAGCTTCTTCACCAGACACTCGGTATCAGACAGCAAACGTTCCATCTGGGTCGGGATGCCCGCCTCGGCCAGTTTGGTCATAATGAAATGGTTGAATTTGTTATTTACC [...]
+NODE 655 529 28165 28102 0 0
+AATTTTCTTGGCACTATGGGTGGCTTTTTAAATATTTGCGGCAACCTTTCGGGGATCGTTAGCCCAATTGTTATTGGGGTTATTCTCCAGCGCACGCAAAACTTCCAGTATGCCATGTGGTATATCGCAGGCGTCGCCGGACTGGGCTTATTAGCCTACATATTCCTGGTGGGCAAAATTGAAGTGATCCTGCCTGAAAAAAAGAATGCCGACACTGTGGATAAGAATGCCATTAACCCGGCAACTGCCAACAAATAATGAGGTCATTATCAAAATGGAAAAAATAACCTGTAACGCTTGTCTGGCCCATGCGGAAAAAGACGTACGCTTTGAATCACGTGAAATCGAGCACAGTGAACATGACGTCGTCGTGAAGGTCGCCTGCGGCGGCATCTGTGGCTCTGATATTCACTACTATCAGCATGGCCGCGCGGGGATGTCTGTCCTCAAGCATCCGATGGTGATTGGCCATGAGTTTGTTGGCGTGATCAG [...]
+CAAACTCATGGCCAATCACCATCGGATGCTTGAGGACAGACATCCCCGCGCGGCCATGCTGATAGTAGTGAATATCAGAGCCACAGATGCCGCCGCAGGCGACCTTCACGACGACGTCATGTTCACTGTGCTCGATTTCACGTGATTCAAAGCGTACGTCTTTTTCCGCATGGGCCAGACAAGCGTTACAGGTTATTTTTTCCATTTTGATAATGACCTCATTATTTGTTGGCAGTTGCCGGGTTAATGGCATTCTTATCCACAGTGTCGGCATTCTTTTTTTCAGGCAGGATCACTTCAATTTTGCCCACCAGGAATATGTAGGCTAATAAGCCCAGTCCGGCGACGCCTGCGATATACCACATGGCATACTGGAAGTTTTGCGTGCGCTGGAGAATAACCCCAATAACAATTGGGCTAACGATCCCCGAAAGGTTGCCGCAAATATTTAAAAAGCCACCCATAGTGCCAAGAAAATTACGGGGAATTACA [...]
+NODE 656 745 46331 46331 0 0
+GACGATAATAGGGAGAACAGCCTGTGCAGACAGGCATAGCCCTATTTTTCCCTTCTCTTTTCAGATTAATTTCTGCATCATGAATTGAAACCTTTTCTGACATTAAGGATGACAAACATGTCTGATATCGAAGCACAACGAATTGCCGCACGCATTGATACCGTGCTGGATATCCTTGTTGCTGGCGATTACCACTCGGCCATCAATAACCTTGAAATATTGAGAGCAGAGCTGTTAGATCAGGTTAAAGACGGTATCTCGCCATCCCAGGCTCCCGGGTCGCTCTGGGAAATCTGATAGCGATTATTTGTCCGGGATGGCCGTTAGCCCTTCCCGGCTCTCTGACTGTCTGTTGACTCCTCTTAACGAATAAAATTAATACTATGAACTCCCGACAACAATCAATTTTGCAAATGGTGGTTGATAAAGGCCAGATGAGCGTTGCTGAACTGGCGAAAATTACCGGCGTATCTGAAGTCACGATTCGTCAGG [...]
+CGTCCGGGCCAATAGCGCATTGCTGCTGCCATTTTCAATAAAAACGGATTCCCCTGGACTGACCAGCGAGGCGGCGAACTCCGCCAGTCGGCGTTTTAGCGTGTAGTTCGTCATCATGCGAGTCTCTACGTCATCGCTCTCAAGCGAAACGGCGAAACCGTGCGCACGGCGTAAATAGCTCTGCTTTTCCAGGGTATTCAGATCCTGACGAATCGTGACTTCAGATACGCCGGTAATTTTCGCCAGTTCAGCAACGCTCATCTGGCCTTTATCAACCACCATTTGCAAAATTGATTGTTGTCGGGAGTTCATAGTATTAATTTTATTCGTTAAGAGGAGTCAACAGACAGTCAGAGAGCCGGGAAGGGCTAACGGCCATCCCGGACAAATAATCGCTATCAGATTTCCCAGAGCGACCCGGGAGCCTGGGATGGCGAGATACCGTCTTTAACCTGATCTAACAGCTCTGCTCTCAATATTTCAAGGTTATTG [...]
+NODE 657 2727 138533 136732 0 0
+GAGCCGTCAGCGGCATTGTTACAGAGTCTGGTAACGAAGCTTGATGCGCCGGATATCTGCCCGTTGGAAGCGCTGGTTATTCGCGGGTTGCTGGGGCGGGCTGCGGCTGTCGCCACACCGTGTGAAGCTGTAGTCGCAGATGAAGAACCGGTGACGACGGTGACTTCGCCGAGTACGGAGGAATCTGGCGGCGGCTTTGGCCTCTGGCAGGTGATTAAAATCATTTTATTTATTGGCGTTGTCGGCCATGTATTACGCCAGTTTATGCATTAGGGATATCGAATATGGACAAGGAAGAACAATATTTACTTTTTGCGCTCTCCACGCCGATGGAGGTGCTATATATCGGCAATGAGCCTTCGCATACCTCTCCAGCAATGTATACCGGAATTCCTGCTGTCGATCTCTCCGATTCATGGGGGATTGATAACCGTGAAGATCTTATTCAAACCATCTATCGGATGACGGACGATGGTCATGCGGCAGATTTGG [...]
+CTGAAAATTTATCCCCGCGATATGCTGATTAACCGGACGTTTAAAGCACAGTTAGAGGAGCAGTGGTCACGCGCGTTAGGCGATGAGCGCGAAATGCTGGGGGAGATTATTACCGATTTCGACGCGGCGCTGCTGTCTAATGATATGCAGCGCGTCGATGACGTGCGCCGTCGCGCCTGCGAATATCTGGGTATTGACGAGCCGAAAGCGCCGTAACGGCGCTTTCACTGCCCCTGTTCAGAAAAAATGGAAGAATCGATTTAACGCGCAGACAATCAACGCGATCAAACCGACAATCTTCATGATTTTCATCACCCCGCCAGATTCCGCCTGACGGGGTGCTTCGGTTTTCGCTTCAGAAGACAATTTTTTCTCAGCCGCCAGCCTGAGCTCTTCCGCCAGCTCCTTTTTGTCGCGAATATCGCCTGGCTTCATGGCAATTTTAGATGACAATGCCTGCGTTATCAGCGCCTCCAGCGGACAGGATTGCCC [...]
+NODE 658 51 2214 2112 0 0
+ACCTCACTGACGACGCAGCAAATCGACGCCAGCCGCGAGCGCCTGCAGGCG
+TGGCATTGTGACTGATGATTCTGGATTCACTCTTGCCGTCTTCCAGCAGCA
+NODE 659 8010 485433 480893 0 0
+CGTCAAAGCGGCCGTTATTGTTATAGTTAGCCATACTCACCAGCCTTTGTAGCGTCGCTGACGGCATGGTCAGGTCGTCGAGGCTGCCTTTAAACTCCTGCTGCACATCCTGATACATGCTGCCGACCCAGACGTTTAGCTTGCCCGACGGCAGATGCATCTTATCTATACCCGGGGTGGTAAAACGGTAACCAACGCGAGGTGAGACGGTAAAGGCGTCGATGCTGCCATCAAGAATATCGAACTGTGTCTGGGTGTAGTTAGCATCAACAGCGGTAAACCAGTTACCTACGCCGCCGACCAGTGTGGTGCCGATGCCATAGGTAGTGCCTTTAAAGTCGAGTTTAAACTTGAGGTTTTGCAGATCAGCGGGATGAAAAACGTGGCCATTTTTCGTCATCAACCCAACACCAATTTGCGAAATGGAATGACCATCGGTATAGCCCACCAGGCCGTACACATTCATAAATGGCAGCAGCCAGGCATCCAGCT [...]
+CATGAGCCAGGCGCCACTACCGTGCCGGCGCGGAAATTCTTTGATATCTGCCGCGGCCTGCCGGAGGGCGCGGAGATTGCCGTTCAGTTGGAAGGCGATCGGATGCTGGTGCGTTCTGGCCGTAGCCGCTTCTCGCTGTCTACGCTGCCTGCCGCCGATTTCCCGAATCTTGACGACTGGCAAAGCGAAGTTGAATTTACGCTGCCGCAGGCCACGATGAAGCGCCTGATTGAAGCGACCCAGTTTTCGATGGCCCATCAGGATGTGCGCTACTACTTAAACGGTATGCTGTTTGAAACGGAAGGTAGCGAACTGCGCACTGTCGCGACCGACGGCCACCGCCTGGCGGTGTGCTCAATGCCGCTGGAAGCGTCTTTACCCAGCCATTCGGTGATTGTGCCGCGTAAAGGCGTGATTGAACTGATGCGTATGCTCGACGGTGGCGAAAACCCGCTGCGCGTGCAGATCGGCAGTAATAATATCCGCGCGCAC [...]
+NODE 660 8488 458709 453231 0 0
+ACGTTCGAGGACCTCCGCCAGTTGGATAGCCTGCGTCACCCGCCAGCACTCCGCCTGTTGCGCCGCGTTTAGCGCCGGTGGTATCTGCGTCCAGTTCCAGCTCGCGATGTCGTTATACCGCTGGGCCGCGCCGTGAATGGCGCGCTCTACGGTATAGCCGTCATTGTTGAGCAGCAGGATGACCGGCGCCTGCCCGTCGCGTAACATCGAGCCCATCTCCTGAATCGTGAGCTGCGCCGCGCCATCGCCGATAATCAGAATCACCCGCCGATCGGGACAGGCGGTTTGCGCGCCAAACGCGGCGGGCAAGGAATAGCCGATAGACCCCCACAGCGGCTGTACCACAACTTCCGCGCCGTCAGGAAGCGACAGCGCGGCAGCGCCAAAGGCGGCGGTCCCCTGGTCGACAAGGACAATATCGCCCGGTTTGAGATACTGCTGTAAGGTTTGCCAGAAGCTTTCCTGGGTCAGTTCTCCCTTATCAATCCGCAC [...]
+CATTCGAACCCTCGCTGAAAAGCGGGGGTTTTTGTTTTTTGTCACAAAATTTATGGCCTCTGATCTGCTCTTCAGGTGCGTTTGTTTGCCGCTGCTTTTGCGGTCAATATGAGCTTTTGTTAGATTGCTTCATAATGCGAATATACTTATTATTCATGCGCCTTATATAATGATGTGAGCATTAAAGCAATGCCGGATAAGTGTAACGTATTAAAAAATATAAAAATATTCTTACTGGCCTTCTGCCTGACCGTTCCGGCTATTCTGCTATCTCGTCTCATTTCTCCCCGCGCCACAATTGATTCCAGCTATATCTTTCTGGCCTGGCTACCGCTCTGCGTCATGTTTTCCGTGCTGTTCTTATTTGGCCGCCGTGGCGTCGCGCCGATGGTAGGCGGAATGATGTTGACTAATGAATGGAATTTTCATTTACCTCTGCCACAGGCGATGGTGCTGCTATTTTGCCAGACGTTTCCCGTGTTGCTGGTTTGC [...]
+NODE 661 4364 237306 233037 0 0
+TTCGGTAAAAACGCCGTGGTGCCGACAGGCTTCGGCTGGCTGGGAAATAAAGGGCAAATTAAAGAAGAGATGGGCACCCATCTTTGGATCACGGCGCGTATGCTGCACGTTTATTCCGTGGCGGCGTCGATGGGCCGACCGGGCGCTTATGATCTGGTCGATCACGGCATCAAAACCCTGAACGGCGCGCTGCGCGATAAAAAATACGGCGGCTGGTATGCCTGCGTTAACGATCAGGGCGTGGTGGATGCCTCTAAACAGGGTTATCAACACTTCTTCGCCCTGCTGGGCGCGGCCAGCGCCGTCACTACCGGGCATCCTGAAGCCAGAAAATTGCTGGATTACACCATAGAAGTGATTGAGAAATACTTCTGGAGTGAAGAAGAGCAGATGTGCCTGGAGTCCTGGGACGAAGCCTTTAGCAAAACCGAAGATTACCGTGGCGGTAACGCCAATATGCACGCCGTCGAAGCGTTCCTGATTGTTTATGAC [...]
+CCTGGTAAACCCAGCACATCGGTATAAAATTTGAGTAAATAGAGGGTTCCGATATCTAACAGGATATTAGAACCTAAATCCCCCAGTCCATAGGCAAGTTTTTCTTTAAACGGCAAGCGTAGGGTTGCCGGATTCGATGATGTTTGACTCATTATTCTTCTCCATCTGCCCGCAGGTTTCCCTGCGGGCGAGCCGTATTAGATATTCCGTAAAGAAGCAAAAAGTGAAGCCCACTCGCTCTTCGCGCGATAGAAGACCGGCGGCTTGCCAATGGGCGCATCCACGGTAATTTCACCGCCGTGGTGAGCTTCGCCGGTCCAGATATTCACCCAGTGATCTTCCGGCAGGTACAGCGTCCAGTCGCAACGCCCCTGCTCATGAACCGGCGCGACCAGCAGATCCTGACCGAGCAGATATTGATATTTCAGGGTGTAGGTTGCGGCATCGTTCTCGTAGTGCAGGAATAGCGGACGCATGACTGGCAGACCGGTA [...]
+NODE 662 3234 181511 178145 0 0
+AAAGCCGAGAAATCATCTACGCCTGTAGCGATAATGGCCAGCATACTGACGATAAATACCAGCGCGTAGGCAGAAAAGAATCCCCAGACGGCTTCCAGAATACGTTCTGGCAGCGCCCGGTTCCCCAGCTTAATACTGTAAACGGCATTCGGATGCACCAGACGTTTGAGTTCGCGGTTCCCCTGTTTAAACAACAACAGAATACGGATGACCTTTAACCCCCCGCCCGTTGACCCGGCGCAACCGCCAATAAACGCGGAACATAGCAGCAAGACGGGCAAAAACAGCGGCCAGCGCGCAATGCTGTCCGTGGTAAACCCTGCCGTTGTCGCCATCGACACAACCTGGAAGAATGCCTGATTTAGCGTTGTCAGCGCCGAGTCGTAGATATTATGGAACCACAGTACCAGCGTGCAGATCACCACCAGCGTCAACTGTACGCCGATGAACATGCGGAATTCCGGATCGCGCCAGTATACTTTCAGGCTACGC [...]
+TAAGCTGGATGCGTTACTTATTCACTCCGGCGAGCTATTCAACGTCTTTCTCGACGATCACCCTTATCCGTTTAAGGTCAATCCACAGTTTAAAGCGTGGGTGCCGGTAACTCAGGTTCCAAATTGCTGGCTGCTGGTCGATGGCGTCAACAAACCCAAATTGTGGTTTTATCTGCCGGTCGATTACTGGCATAACGTTGAACCGCTGCCAACGTCCTTCTGGACAGAAGAAGTCGAGGTCGTCGCCTTACCGAAAGCGGATGGCATCGGCAGCCAACTGCCTGCCGCGCGTGGCAATATCGGCTATATCGGCCCGGTTCCTGAGCGCGCGCTACAATTGGATATCGCCGCCAGCAACATCAACCCGAAAGGTGTTATCGACTATCTGCATTACTACCGCGCCTATAAAACGGATTATGAACTGGCCTGTATGCGCGAAGCGCAGAAAATGGCGGTGAGTGGTCATCGTGCGGCGGAAGAAGCCTTCCGTTC [...]
+NODE 663 5418 263898 262785 0 0
+ATATCTTATTTACAAAAACAACTACTCATAAATTGTACGGTTTTTATTGGTATTCACTCCCTATGGAAGCGTGTCGTTATGGAAGGGCGATATCATGGTTGATTTATCCCGTCGAAGCATGTTGACCGGCAGTTGGCGCAACGCCAGCAATGGGATTCTTCCGCCGTGGGCCAGAGAAACAACCTATTTTTTCGCACATTGTCTGCGTTGCGACGCCTGCATCCAGGCGTGTGAGGCCGACATCCTGCAGCGAGGGGCGGGGGGATATCCGAGCGTAGATTTCAAACGGGGCGAGTGCAGCTTTTGTTATGCCTGTGCGCAGGCCTGTACTGAATCGCTTTTTCTTCCGCGCCACACCAGGGCCTGGGATCTGATTTTTACGCTCACGGAAAACTGCCTCGCCAGGCAATCGGTTGAATGCCATCGTTGCCAGGACAGTTGTGAACCTATGGCCATTACCTTTCGTCCCACGCTATCCGGTATTTACCAGCC [...]
+GCAGGCAGAAATAACGACGCGGCGCGACGTTGCCCGACACTTTACCGTCGCTGTCCATAAAGTGCGTCGGACTGATACGCGGCGCGCCCGTCGTACGATAACTTTCCACACCGTGGCATTGCAGACAGCGGTTGGTATTGGTCGTCACCTGGTAGCCCTCGACGCTGTGCGGGATCATCGGCGGCTGGTTGACGTAATTTAGCGGCATACGTTCCTGCTCTTTCGGCATACGAATCGCCCCTTCCTGCGTCCCGGATACTTCCGGCGACTGGCTCAGATCCACTCCGTTTGCCGCCCAAACCGCACCACTTACCACCAGGGCAAGCGTGGCCATCCATTGACACAGCGCTTTCATCAGGTCATGGCTTTTCATTGTTTCGCTCCCGAACTCCATCGCATTTACACTTCATCCTTCGAGCTGCCTCTTTGTTGGCTGCGCTCCAAAATCCCAGTCACATCGTTATCTATGCTCCTGGGGATTTCCTCGCTTAC [...]
+NODE 664 3078 168122 165621 0 0
+GACAAAGAAATTTGTAAAAGCAAGAAAAGCCTCCGGCGTTAACTTCAGCAATAATCCACCGACATTTCACGAGATCCGAAGTCTGGCCGGGCGGCTGTACAAAAACGAGCACGGCGAGGTGTTCGCCCAAAAACTCCTGGGCCACACCTCAGAGAACACCACAAAACTCTATCTCGATGAACGCGGTAATAAAGCTTACGTGATGCTCTGATTTTGTTGTAAAAGAAATGTTAAACTGAATTTGGATGTGATATAACCAAAAAGACCGAAATACAGAAATTCGAGGAAATTTCGAGGAATTTCGAGGGGAAACACATAACCCATTGATTTATAATCTAAATAAAAAGAGACCGAATACGATTCCTGTATTCGGTCCAGGGAAATGGCTCTTGGGAGAGAGCCGTGCGCTAAAAGTTGGCATTAATGCAGGCTAAATCGCCTTGCCCTTTAAGAATAGATGACGACGCCAGGTTTTCCAGTTTGTGACGAAGG [...]
+ACAGGCGCCATGACTTTTGTGAAACATGAGCGGCGACGTTAGCCATGGGGCAAAAATAGCGATGCCTTTTACGAAGCGGCAGTTATGCTCAACAGGCATACCCACAATGATAGTCATATGGTGGGTATCGGCCGCATGAGTGAGCGGCTGTAAAAGCGCCTCGTCAGGCGGGGCGGGCAACGGTTTATTTCTTTCGTCGCAGCCTAATAGCGACAGCGACGGAAAGACCAGCAGTTCGCACTGTTGACGAGCCGCAAGCTCAATATATTCCAGATGATGGGCGACATGCTCCGCCGGCGAGGCGTTCAGGGGCGCATACTGCGCAGCAGCAATTTTCCAGGAGGACATAATGACTTCCTTTTCATAGTCTCTACAGCCATTCTAAAAAGCATAGGTTAAGAATCGCCTTATAATGTAGTCGTCTGCATGTAAGGAAGTGTAACGTTATATAATTTTTATTTAACTTTGGGTTCGTAAGGGAGTCGGGATAGT [...]
+NODE 665 1 161 157 0 0
+A
+T
+NODE 666 3050 184721 183505 0 0
+AGCATACCAAAGAATAACCCGCCGAGCGGACGAATCAGGAAGGGAACGGAAAAGGTGGCCAGCGCGGCAATCATCTGGACGCTGGGATCGGCGCCGGGGAAAAAGACTTTACCCAACGCGTAGGCAACAAATCCATAAACACCAAAATCAAACCACTCCATCGCGTTGCCCAGCGAGGCGGCGGTAATCGCTTTGCGAAGTTTACCATCATCAATGATGGTCACATCGCCCAGTGTAATCGGTTTTATTTTTTTCCTTTTCAGCATAGCTGTCCTCATAGGCTAAGCCCTGTAGCGCTATATACGGCGGGCACTGGCATACCGCGCCAGCGTCGCCGTCGAGCGGAGGGAGGGGCGCGAACGCTATCCCTCATACAAGCGTAGCAGGTTTACTTACACTGTCCGGTTACGGACTGTACAACCGAACCTGTTGACGCCTGAATGGGCAGTTAATGACCTTTTTACCCTAACAGGGTTTAAATATGTGATCAAC [...]
+GTCGTCATTCGGTGTGCTTAATCCAAGATGGTAACGTACTGAACCGGCATAGGGGTCGCGATGTTTTCCCAGATAGGCTCCGGGAGGCAACTCGGCGAACATCGCCGCTTTGATAGAGGGGATGCTGTTGACCAGCTTTGTCGTTATCGGGCATAACGTTTCCGCCGACGGGTGGGCATCGGAATACCATTTAAGGTAAAACCGTTTCCAGCCGCGCTTGAAAAAGGTATTGAATCCGGCGTCGTTATTGGCCTGCGCGGCTTTTATGTGATGCTGAAGCCGTAGCGCCTCTTCGCGAATCACCTGCCAGTTTTCCGTCAGCTTCTGCAGCTCTGGAAATGCCATGGTATCAAAGTACGGCTGCTTTGCCGGTAACGTTGAGAAGCGAGTCATGAACATATTGATCGGCGCCATAAACGTCGAGTGGTCAAAGAGCTGACGGGAAAGTTTTTGTTTTTCCACACCGCGTGAATGCGCATAAATGACGCTGAT [...]
+NODE 667 5968 329975 328264 0 0
+AAACGCGTGAGTGTACCATTTCCACGTAGCATTTTAATAGCTGCGATGCAGGTTCCAGGTCACTCGCGCGAACCTCATATTGTTGCATACTTTAGCTGAAGATGCATTCCAATACTGTATATTCAAACAGGTTAAATTGTGTCATAATTAGCCGTTTCTGCCGTTTGTCCTTCAAACAAACCAGGCATCCGAGTCTCTACCGGGAAAGGTGAATGGATAAGATCGAAGTTCGGGGCGCCCGCACCCATAATCTCAAAAATATTAACCTCGTCATCCCCCGCGACAAACTGATTGTCGTGACCGGGCTTTCGGGTTCAGGCAAATCCTCACTGGCTTTCGACACTCTGTATGCCGAAGGGCAGCGTCGTTACGTTGAATCGCTCTCCGCTTACGCGCGGCAGTTTTTGTCGCTCATGGAAAAACCGGATGTCGACCATATTGAGGGGCTATCACCCGCGATCTCAATTGAACAGAAATCGACATCGCACAACC [...]
+AGCAGCGCGGTATGTTCAGCTATACCGGGTTAAGCGAGGAGCAGGTCGAGCGGTTGCGCGATGAGTTTGGCGTTTACCTGATTGCCAGTGGCCGCATGTGTGTCGCCGGGCTTAATGCTTCAAATGTACACCGCGTGGCGAAGGCATTTGCCGCTGTCATGTAATATTCAGGCCGGACGGCGATAACATTGCCCTCCGGTCTGACAATAGCTGTTGTGATCATCCTCTTTTTTCGTAACAAAACCGCAGATAATCCTTCCTTTTGACCGTTACTGGCGTTATGGTCAGATAGTTTTTTGAGCAAAGACTCATCTTAATAACTATAATATTCTGAATTTTAAGGGAAAAGCATGAAAAAAATAACCCTGGCGCTGAGTGCCGTCTGTTTGTTGTTTACGCTAAACCATTCCGCGAATGCGTTAGTATCTTCCCCTTCGACGCTCAATCCGGGCACTAACGTTGCAAAACTCGCGGAACAAGCGCCTGTCCATT [...]
+NODE 668 2315 129177 127396 0 0
+CATTTAGCGCGTTGCTGGCGGTGATTGGCGCCGGGATTATTCGCTACGATCGCGTGACCGACCATTTTTGGGTCGGTTTGCTCCTGGTGCAGCTTTCTAATATCAGTTTCGCTATCGGAATGGTGGGGTATAAACGTCTGATGGAGACCCGTCCCATGCCGCAGCACAACGCCTTTGCGTGGTTCTATCTGGGGGCGTTTTTGGTGGCGGCGGTGGCGTGGTCGCTGTTGGGGAACGCGCAAAAGCTGCCGGAAACCACGCTGCAATGGAGCATTCTGGTGTTTCTCGGCGTGGTGGCGTCCGGCATTGGCTACTTTATGTGGAACTATGGCGCTACCCAGGTAGATGCCGGGACGCTGGGTATCATGAATAATATGCATGTTCCCGCAGGACTACTGGTTAATCTTGCCATCTGGCATCAGCAGCCCCACTGGCCAAGCTTTATTACAGGCGCGGCTGTGATCCTGGCTTCGCTGTGGGTGCATCGAAAAT [...]
+GGACCCACTCAACACCACGCTTCGCCAGTTCAGCCAGCACGTGCTGATACACCGGCAAAATGTCTTTCAGCAACGTCAGGCGGTCAAACGGCTCGCCTTTCACTTTACCCAGCCACAGATACGTGACAGGCCCCAGCAGTACGGGTTTGATCTTATGCCCCAGCGCCAGCGCTTCGTCCACTTCCTCCAGCAACTGGGTCCAGGTGAGTCTGAACTGCTGGCCTTTGCTGAACTCCGGTACTATGTAGTGATAGTTAGTATTAAACCATTTGGTCATTTCCGCTGCCGCCGCCGGTTCGCCGGTTGGCGCGCGACCGCGGCCAATGCGGAACAGAGTGTCGATGTCCACGGAACCGTCATTGTTCTGATGACGAGCCGGCACATTGCCTAACAGCAGGCTGGTGGTCAGAACATGGTCGTACCAGGCAAAGTCGCCTACCGGTAACAGGTCAATACCCGCTTGTTTCTGCTGTTCCCAGTGACGCGCGCGCA [...]
+NODE 669 686 39618 39245 0 0
+CGCTCCCGTTCATTGAGCGGAATACGCGTGGCAGGCAGCCCCAGACGCTGCATAAAACGGTGCGTATTTTCAGAGCTGCTGGAGAAGTAGACGAGCGCGCTCATGCGTTTGCCGCGTGGGGTGTCGGGTGCAGACGGTTAATCATGTCCGGGCGGAAGCCAGACCAGCTCAAATCGCCCGCCATCACCACCGGTAATTGACGAAATCCTTGCGCCCGGAGCGTATCCGCTGCATCCGGCACCAGATCGACGTTCACCATCTCAAATTCAAATCCACGGCTTTCCATCGCCCGCTTTGTGGCGTGGCACTGAACACAGTTATTGCGAGTGTAAATAGTAATGCTCATGATTCGTATTTCCATTTAAAATGAGAAAACGGCGCGATGAAACGCGTCGGATTGTCGGGTGTTGATACAGGAAATACTAGATGTAGTTGAATTAAGATTCAACCATACAAGATATGGGAATTTTCGATTGATTTTAACGTCGCTGA [...]
+GATCGGTATGCGAATGTGACGCATTGTTGCCGGATGGCGCTGATGTCAGCCAACTCTGTTATGCGTGAACCTGCAGGCCGGATCGGGCGTTCACGCCGCCATCCGGCAAAAATTAGCCATGCCGCCCCTACCCCGCTGCGTTCATCAGCGACGTTAAAATCAATCGAAAATTCCCATATCTTGTATGGTTGAATCTTAATTCAACTACATCTAGTATTTCCTGTATCAACACCCGACAATCCGACGCGTTTCATCGCGCCGTTTTCTCATTTTAAATGGAAATACGAATCATGAGCATTACTATTTACACTCGCAATAACTGTGTTCAGTGCCACGCCACAAAGCGGGCGATGGAAAGCCGTGGATTTGAATTTGAGATGGTGAACGTCGATCTGGTGCCGGATGCAGCGGATACGCTCCGGGCGCAAGGATTTCGTCAATTACCGGTGGTGATGGCGGGCGATTTGAGCTGGTCTGGCTTCCGCCCGGACA [...]
+NODE 670 648 31511 31333 0 0
+TAGGGGAGGTGGATGACGCTAAATTCAACGTGCTTGGCGGCTCAATCGCCTACGGGCATCCTTTTGCCGCAACGGGCGCGCGGATGATAACCCAAACGTTGCATGAGTTACGGCGTCGGGGTGGCGGTTTTGGCCTGGTCACGGCCTGCGCGGCTGGCGGTCTTGGCGCGGCGATGGTTCTGGAGGCGGAATAATGACTACCACATCAGCTTTTATGCTTAACGTGCGTCTGGATAATGTCGCGGTTGTCGCTATTGATGTCCCTGGAGAAAAGGTGAACACCCTGAAAGCGGAGTTTGCCGCGCAGGTACGCGCCATCCTGAAGCAGATCCGGGAAAACAAAGCGTTGCAGGGCGTTGTTTTTATCTCAGCCAAAGCAGATAACTTTATTGCTGGCGCTGATATCAACATGATAGGTCACTGCCAAAACGCGCAGGAAGCGGAAACGCTGGCGCGTCAGGGGCAACAACTGATGGCGGAGATCCAGGCGTT [...]
+AACGGTTTTAACGTCATCGGTACAGATGCGCCGATGGCAGGCCAGCGCCATTTCAAGGCCGCCCCCCAGACAGGCGCCATGAATGGCGGCGATAACCGGAACAGGCAACGCCTGGATCTCCGCCATCAGTTGTTGCCCCTGACGCGCCAGCGTTTCCGCTTCCTGCGCGTTTTGGCAGTGACCTATCATGTTGATATCAGCGCCAGCAATAAAGTTATCTGCTTTGGCTGAGATAAAAACAACGCCCTGCAACGCTTTGTTTTCCCGGATCTGCTTCAGGATGGCGCGTACCTGCGCGGCAAACTCCGCTTTCAGGGTGTTCACCTTTTCTCCAGGGACATCAATAGCGACAACCGCGACATTATCCAGACGCACGTTAAGCATAAAAGCTGATGTGGTAGTCATTATTCCGCCTCCAGAACCATCGCCGCGCCAAGACCGCCAGCCGCGCAGGCCGTGACCAGGCCAAAACCGCCACCCCGACGCCGTAAC [...]
+NODE 671 170 65719 46436 0 0
+GTGCAATGGCATAAGCCAGCTTGACTGCGAGCGTGACGGCGCGAGCAGGTGCGAAAGCAGGTCATAGTGATCCGGTGGTTCTGAATGGAAGGGCCATCGCTCAACGGATAAAAGGTACTCCGGGGATAACAGGCTGATACCGCCCAAGAGTTCATATCGACGGCGGTGTT
+GAGTACCTTTTATCCGTTGAGCGATGGCCCTTCCATTCAGAACCACCGGATCACTATGACCTGCTTTCGCACCTGCTCGCGCCGTCACGCTCGCAGTCAAGCTGGCTTATGCCATTGCACTAACCTCCTGATGTCCGACCAGGATTAGCCAACCTTCGTGCTCCTCCGTT
+NODE 672 48 20621 19731 0 0
+TGGCACCTCGATGTCGGCTCATCACATCCTGGGGCTGAAGTAGGTCCC
+CACCGCCGTCGATATGAACTCTTGGGCGGTATCAGCCTGTTATCCCCG
+NODE 673 225 97385 92700 0 0
+CGTCTTCAACGTTCCTTCAGGAGACTCTAAGTCTCAGGGAGAACTCATCTCGGGGCAAGTTTCGTGCTTAGATGCTTTCAGCACTTATCTCTTCCGCATTTAGCTACCGGGCAGTGCCATTGGCATGACAACCCGAACACCAGTGATGCGTCCACTCCGGTCCTCTCGTACTAGGAGCAGCCCCCCTCAGTTCTCCAGCGCCCACGGCAGATAGGGACCGAACTG
+CCTAGTACGAGAGGACCGGAGTGGACGCATCACTGGTGTTCGGGTTGTCATGCCAATGGCACTGCCCGGTAGCTAAATGCGGAAGAGATAAGTGCTGAAAGCATCTAAGCACGAAACTTGCCCCGAGATGAGTTCTCCCTGAGACTTAGAGTCTCCTGAAGGAACGTTGAAGACGACGACGTTGATAGGCCGGGTGTGTAAGCGCAGCGATGCGTTGAGCTAACC
+NODE 674 2047 120964 120002 0 0
+TCCACCGCGAAAAAACCTTTTGAAGGTAATCTGAATGCGGGCTACCTTGCTCAGTCAGGCAATACTAAAAGTTCTTCCTTAACGGCTGACACGGCGATGACCTGGTATGGACAACGTACCGCCTGGTCATTATGGGGCAATGCCAGCAATACCTCCTCTAATGATGAACGCTCTTCAGAAAAATATGCGGTAGGCGCGCGTAACCGTTTTAATATGACGGATTATGATTATACCTTTGGCCAGGCCAGTTGGCTGACAGACCGTTTCAACGGTTATCGTCAGCGCGACGTACTGACCGCCGGTTACGGGCGGCAGTTCCTTAATGGTCCAGTGCACAGCTTCCGTTTTGAATTCGGTCCAGGGGTTCGCTATGACGAACATACGGACGATACCACTGAAACGCAGCCGTTGGGTTATGCTTCCGGCAGCTATGCCTGGCAGTTAACTGACAATGCTAAGTTTACACAGGGGGTGTCAGTATTTGGCGCAGAA [...]
+TTAATAACAGATAAACATCGAAGCCATCATAGAAAATGAGCTCAAAAGAACACAACGTGATATTCATATTGATACCAAAAAACATCGTATTATATGCATAATCGTGAAGCCAATAATTTCTCGCACTCAGATAGCGAATGAAAAATGGATATTCAATAATATCTGGCGCATGTTTTTCAACACCATTTTTCAACATTAAGGCAACGTATCCTCTCAATGACTCGCTGCTGGCAGGAGTTTAGTTATATTTAAAGGTTTAATAAGCACTGCGCATCATGCTGCTGTGCTTATTACTTTGTAAAAATAAGAGTATTCACTTTCATATTCAGGGGTAAAAAGTGAACAAATACAGCTATTGCGCAACGATGATTGCCGCCATACTCAGTACGACCACAATGGCCAATGCCAGTAGCCTTGCTATTTCAGTGGCGAATGATGATGCAGGTATATTTCAACCATCCTTAAATGCCCTTTATGGGCACAAGGCTGCAG [...]
+NODE 675 1574 75226 74692 0 0
+CAGATCGAGATAAACGATACCCACCTGCGACTCGCCAGCCGAGGCAATAGCATGATTAATAAATTCATGGATAGCATTGCGATTGGGCAGGCCGGTGACGGTGTCTGTATTCGCCAGTATGCGTAAACGCTCCTGAGCCCGCCTCTCTTCGGTGATATCCGTGCCTGCGCAGATCAGGAAAATTTCGTTTTTTCCGCTACCGTTATGGACAAATTTATTACGAAATAAGAACAGGCGTTGGCCTTTACGGGTCTTTATCCAGCGTTCGATTTCATAGGCATTGCCATTGCGAAAAAAATTCTCAATGTAGTGCCGGGAGGCAACCGCCTCCCGGCGACTCATAAATAATTTAAAGACGCTTTGACCAATTACATCTCGCTCTTTTAAGCCCGTGTACTCTTCGCATAACCGATTAAATCGACAGATTTTTCCCCGACTATCCAGTATCGCAATGACTGAGTTGGCTTCTGATACGATTTGCTCGGCAAAAGA [...]
+ACTTCTCCCATCCGTAAGTATGGCGATATGATTAACCATCGCCTGCTGAAAGCGGTCATCAAGGGGGAAGCTATTGCGCGTCCGCAGGAAGATATCACCCAGCAAATGGCGGAACGCCGTCGCCTGAACCGCATGGCGGAGCGCGATGTCGGCGACTGGTTATATGCACGCTTCCTTAACGATAAGGCGGGGACAAGTACCCGTTTCGCGGCAGAAATTATTGACGTCAGCCGCGGAGGTATGCGTGTGCGACTGGTCGATAACGGCGCTATCGCCTTTATCCCAGCTCCGTTCCTGCACGCCGTTCGCGATGAACTGGTATGCAGCCAGGAAAACGGTACGGTACAGATTAAAGGTGAGACGGTTTATAAAGTGACGGATGTCATTGATATCACTATTGCGGAAGTTCGCATGGAAACCCGCAGCATTATTGCCCGACCGGCAGCGTAACCACGCTTAGCTCGCTCAACGGCCTTTGCTGAGAAGGCAAAG [...]
+NODE 676 4822 268616 263088 0 0
+TAGTTCCTGGAGCCGTAAACAGCCCTGTAATGCCTGTTGACCGTCACTGAGCGTCGTGAGTTGAAAATCAACGTTTCGCGCGCCGATTTCTGTTTTATTGATATTGATAGTGACGTAATAGGTGCCTGGCAGCTGGCTTTTGTCGTTATCAAATGTCGACAGATCGACGCTTGTGCGACTCGCCTGCCCATGGTTTTCAATAAATGCCGGATTGAAATAGTCGCGCGCCCATGCAACGTGTGCGAACGTGCTGCCCAGCGCGATACACACAGCGCAGCGCGATAAATAAAATACCCGGTGTTGCCTTTTGCGCATCGGCACTCTCATCCCTGTCACTCTTCTCAAGGCGTTTGTTTATGTTCGGGGCCAGTACCGCCAAAATCGTTGATGATAGACCAGATAATCGGGCCGCTGGCGGCGGCAGGCAGCGTGTACTGCGCGTTGCCGAAAGGCGCCACATAGCGCGGGGCTTTCACTTTTTGACTGCCAACG [...]
+TGATGAAGCTATCCCCTTATCTGGCCGCACTGTTATTGTTGAGCGCATCCGGCGCAGCCTATGGTGCTATGGAATGTAAATTTTACAATGGCGATACACGACAGATAATGTCGCCAGGCGTTCAGCCAATCATTACCTTTCACCCCTCGGTGCAAACCGCCACGCTGCTGGCTAGCGGTATTACGATGGAATTAACGCCGGAAATGCATAGCCACTGTGCAGTGGGGGATGATGGAGAGAACATTTACCAGATGACGGACAACACCTTACTTGAAGGGTATGTCGACGGTAAGGCGTTGTTTCGCACTAATATACCCGGCATTACGTATGCCATTGGGTTATACCCCGCAGGGAAAGGCATTACCGGATGGTTTCCCGTCAATTCCGGTCAATATTATATGACCGCTTATGCTGACGACAACGAAGGCTATTTCAAGAATGAAAAAAAATGGTACGCCGTGATGGAAATCTACCAGATGCCCGGCTTTAATG [...]
+NODE 677 2805 150327 148499 0 0
+AGTATTAACCAAACATTATTGCCTCATTGTCAGTCTCTTACAGAAAGATTACACGATTATTTCATCGGCAGGAGACTAAAAAAGATAATCATTAGCTACTGCGGGAATTAATGGTGAAACTACCCATAAGTCATTGAATATTCAACATATAAAAGGTTAAAATGGAGTAATTAACGTATCCTCTCTCCCATCACTAAAACGGCATTATTTATGCAAAATTTTGTGCGGCATACTTACGCGAGTAACGCTGACTCGTTTTAATTTTTGTCATTACCCTATTGCGTCAAGGCTATTGGTACCATTAACAGGCGATTTCATATATGGCCAGTTAGTGATTACTAGAGACGTATTACGCCCGCGTTAACGGCGCTCAAGGGCTAAAAATAGTTTGAGAGTGCGTCCTCATTTACCTGAACATCTTCAGTCAATCGGTCCGGGACTTATCAGAGGACCAGGCAGGCGTATAACGCCGCCTGGTAAAATATGTCCGAT [...]
+CCGGGCGGCGCCAGGCGGCAGTGATGGCGGCGCGAGAGACGGATTGGGGAAGAATCTGTTCGGCAAACTCCAGAAAGGGCTGATGCGGCTCATCCTGCGGCGCGACCGGCTCCTCGCTTTCATTTGCCGCGCCGGCAAACAGCGCAGGTAGCTCCGGTAGCGTATCGCTATTTTCCAGCTTGTCCAGATAGCTAAAGATTGCCTGTTTTATTAACCAGTGCGGCGTGCGATCGATACGCGACGCGGCCATTTTGATCCGTTCGCGCGTGGCGTCGTCCAGCTTAACCCCCATCGTGGTGGTTCCCATACCCTCTACTCCTGTTATTCGCTCTATCTGCTAACCAATAGTTAGTGGAAAATATCCACTATGTTGCAACTTTGTGCAACCGCGTTAAATGTGACCTGCGTTGCAAGCTTAAAAATGAATAAATTGTTAAAAAAAGAAAGGGGGAGTCTGACGGGGAAAACCATCTGGATTTATTTTCTCTGCGG [...]
+NODE 678 4786 249353 247146 0 0
+GCGGCGGGTCGGCAAGATCCGCTGACCAAACGCGAGCGTCAGGTGGCGGAAAAACTCGCCCAGGGTATGGCGGTAAAAGAGATTGCCGCCGAGCTGGGGCTGTCGCCAAAAACGGTGCATGTCCATCGCGCGAATCTGCTGGAAAAATTAGGCGTCAGCAATGACGTTGAACTGGCGCATCGCATGTTTGATGGTTGGTAATGAACACCTTTTTTTCCCGTTTAATCACCGTTGTTGCCTGCTTTTTTATTTTCTCCGCCGCGTGGTTCTGCCTGTGGAGCATCAGCCTGCATCTGGTAGAGCGCCCGGAGCTGGCGGCGCTACTCTTTCCCTTCGGCCTGCGCCTGGGACTTATGCTGCAATGCCCGCGCGGATACTGGCCAGTATTGCTGGGCGCGGAGTGGCTGCTGGTGTACTGGTTGGCGCAGGAAGTTGCGCTGGCCCATCTGCCGCTTTTGATGATCGGTGGTGTGTTGACGCTACTGCCCGTGG [...]
+CATAACGGTAAATTTATAACTGTCGACGTTCTGGCCTGTCAGGATGTGATTTATTAACGCCTGTCTTCATTTACGCAAGACGCCGGATATCCTGTCTGACGAACGCAAGGCATAAAAAAGCCCGGCGTTAAGCCGGGCAAAACGTTACCAAATGCACACATTTAAGCGATATTGACTTGCTGAATTTTTTTCTCACGGCGGATTTTGCGCTCTTCCATCACGGCGACCATCGCCATCAGGCAGATACAGCCGATCGCGGCGGCGTCCAGCGCGGCGAAGGTGCCCGCCCAGCCGGTCAGACCAAAAACGGGGGTGCCGTCGGCAATCATGCCCAGACCCAGCTTGGCAAAGCTATCGCCGATAAGATAAGCGAAGGTTCCCTTGATACCGTCCGCAGCGCCGATGGCTTTTTTCGGTACGAAACCGACAGCCGCCACGCCAATTAACAGCTGCGGCCCAAACACCAGGAAACCGAGCGCGAACAGCGAGGCC [...]
+NODE 679 5859 303362 300651 0 0
+ACGCTTTCTTACTGCCATAAAAACGAAGCGAGAGCGCCGGACAGCTTTCCGTGAAACCGTTATCTTCGCCGGCAACCATAAATTCGCGCGCGTGCTCGCTTGTGGCGGCCAGCGTATCATTGAAAAACCGCAGCACGGTGTGGTTATGGTGAGGGATATCCGATCCCAGGACGTGAATCAGTACAGTCATGCTCGCCTACGCCAGAGTAAAAATACGCCGCAACAAAGTGAAAAATAGACAATATAAGTGGCCATATAAGCCTGTGCCGCACCCAGCGCGCCGTGAGCGGGAATCAGCCAGTGAGCGAACGCCGTTAACAGAATGAACTGGCTAATTTCAGCCAGAATGTAAAATCGCAACGACGCTTTGGCAATCACCAGATAACCGAAAACATAGGCGCCGACTTTCAGCACGTCGCCCACTAACTGCCAGGCGAACAGATCGCGCATCGCGGTGAATTTGGCGGAAAAAAGCAGCCAGATAGCAAAATC [...]
+TTTACGACCATTTCTGTTATTGGGCTGGGGTATATCGGATTACCGACTGCGGCCGCTTTTGCTTCCCGCCAGAAGCAGGTTATCGGCGTGGATATCAACCAACATGCGGTAGACACCATAAATCGCGGTGAAATTCACATCGTGGAGCCGGCGTTGGGCAATGTGGTGAAGATGGCGGTGGAAGGCGGCTTTCTGCGTGCGACGACGACACCTGTCGAGGCCGATGCGTACCTGATTGCCGTGCCGACGCCATTCAAAGGCGATCACGACCCTGACATGGCCTATGTGGAAGCCGCGGCGAAATCCATTGCGCCGGTATTAAAAAAAGGGGCACTGGTGATTCTGGAATCAACATCGCCGGTCGGCGCAACGGAGCAAATGGCCGGCTGGCTGGCCGGGATGCGCCCGGATCTGACCTTTCCCCAGCAGGCGGGCGAGCAGGCCGACGTGAATATCGCCTATTGTCCGGAGCGTGTGCTGCCGGGTCAGGTG [...]
+NODE 680 15902 753905 741919 0 0
+GCTTTACCAACAGCGCAGTGGTTGAAACGGTTGACACGCCGGTCGTCGTCGACGAACCACGCCCGGTTGAAAACGTTGAACAGCCCGTTCCAGCGCCGCGTACCGAGCTGGCGAAAGTTGATTTACCTGTCGTTGCCGATATCACGCCGGAGCAGGATGATAGCGTAGAACCTCGCGATAATACCGGTATGCCGCGTCGCTCCCGCCGTTCTCCGCGCCACCTGCGCGTAAGCGGTCAGCGTCGCCGTCGCTATCGTGACGAGCGCTACCCGACACAATCGCCGATGCCGTTAACCGTCGCCTGCGCGTCGCCGGAAATGGCGTCCGGTAAAGTCTGGATCCGCTACCCGATTGTCCGTCCTCAGGAAACGCAGGTTGTTGACGAGCAGCGTGAAGCAGATTTGGCGCTGCCACAACCGGTTGTCGCTGAACAGCAGGTTATCGCTGCGACCGTAGCGCTAGAACCACAAGCGTCGGTACAGGCGGTAGAAA [...]
+CACGCTGGAACGGCTTGCCAGCCGTGAGGACGGCCCATATGTCGTCCGTCTGGCGCGTGAACCGGGTAAGCGCGAAAGCCGTTATATGCACCTTTTTTGCGGCGACGTCGATGAACTGTCTCTCCAGACGTCTGCGCCGGAAAGTGCGTCGGGCGATCTTCAGTCGCGCGTCGAAGCGCTGGAAAGCGAAGTGGCGGAGTTAAAGCAGCGGCTGGATTCTTTGTTAGCTCACCTGGGAGAGTAATGTGAGAACATTACGGATTGGCATTGTCGGGTTAGGGGGTATTGCGCAGAAGGCCTGGCTGCCGGTATTAACCAACACCGCCGGATGGACGCTACAGGGCGCCTGGTCTCCTTCGCGGGATAAAGCCTTACGTATCTGCGAAAGCTGGCGCATACCGTATATGGATTCGCTGGCGAATTTAGCGTCCGGCTGCGATGCGGTCTTCGTCCACTCCAGTACCGCAAGCCATTATGCCGTGGTCAGCGAAC [...]
+NODE 681 5366 265611 262675 0 0
+GAAAGACTATCAGAACAAGTAAGGATCGTACCGGAACGTCTTATTCGGCCTGACTGCTTTACGGCATCAGGCCGAATAAATCAGATATATTTCGCCGTCAGGTATTTGGCAGCAAATACGCCTGCTCAACCAGACTATTTTTAAATTGCTTACGATAATCGTTGGGAGAACATCCTACATGCCGCATAAACAATTTGGCAAAATGGTCCACATTTTCATATCCTACCCGCCATGAAATTTCTGCCAGTGGCGACTCAGTGTTTGTCAGCGCAAACTTGGCCTCGGTCATACGTCGTTGAATAACATAGTTGATAGGGGATATATGATATTCCTTGGCAAATTCATGGCATATATAACTGACGCTGGCGCGAAATTTTTTCGATAGCTGGTCAAGCGTGATTTTTTCACGATAATTATTATTGAGATAAACAAGCACATCCTTAATTAATACATCTTTTTTAATGTAGCCTTGTTCAGAACGATAGGCATTTT [...]
+ATAAGATCGACCGGACGATTGTGTTTGAACACGGTGGGGGCGAAGAATATTTTAGCCTGACATTTGTTCAGCACCCAAACCAGCTCTGCTTCTCGCCAGGCGGGAAGTAGCGGGACAGATACCGCGCCCGTTTTCAGGCAGGCCAGATAAATGAGGGTAAACTCACACCAGCCCGGAAGCTGAAAGGCCACGCGATCGCCCGGTTGAATCCCCTGAGACAGTAACCAGTTTGCCAGGCGGCTTGCCGCGCAGTCGAGTGCGGCGTAGGTCCAGGACGCGCCATGATTATCGACCACGGCGATTTTATCGGGTACGGCGTGTGCGGTTTGCCGCCAGTAGTCGCCCAGTGAAGCATCGCCCCAGTAGCCGGACTCGCGATAGGTTTTCCGCCTTGCGGCGTCAAACGTTAATGTAACACTCATTGACTTGTTCTCTATTAATACAAATGACGTAATCTCCGGGGGCAAGCCGAATAAGACGCCGTAGCGTCGT [...]
+NODE 682 6136 317036 312798 0 0
+TTGGGGAAAATAACCGTTTCGTTTCAACCTGGTTGCGAACAGTGAATATTTTACACGAAGTGACTATATATAAACGGGAGGGAACATGGAGTTTGATGCCTTCTTTTTAGCGAGACTCCAGTTTGCCTTTACCGTCTCTTTTCATATTATTTTCCCCGCGATTACGATTGGCTTAGCTAGTTACCTGGTGGTACTGGAAGGTTTATGGCTAAAAACGCGTAATCCTGTCTGGCGCTCGCTCTATCAGTTCTGGCTCAAAATTTTTGCCGTCAACTTCGGGATGGGCGTGGTCTCCGGTCTGGTCATGGCTTACCAGTTCGGAACGAACTGGAGCGGTTTCTCCCAGTTCGCCGGCAGTATCACCGGGCCTTTATTAACCTATGAAGTGCTCACCGCATTCTTCCTGGAAGCGGGATTCTTAGGCGTGATGCTTTTTGGCTGGAACAAAGTCGGGCCGGGCCTGCATTTCTTGTCTACCTGTATGGTGGCGTT [...]
+ACGCCCATGACACGCTGCCTACAATGCTACGCTCGGCGCCAAAATAACAATAAGAGAGCGAATTACAGGCAGCGACATAGCGTTTGTCCGTCAGGTTATTTACGTTGAGCTGGGCGCTCAAGCCATTTAACCCAATGCTGGATAAATCATACCCAACCACCATGTCGACCAGTGTATAGGACGGCAAGGTGTGGGTATTCAGGCGATCGCTGGTCACGCCGTTGACGTACCGGATGCCGGAGCCCAAAGTCAGCCCCTCTAACAGACCGCTTTTCACATCGTAGCTTAGCCAGGCGCTGGCCTGGTTCCGTGGAGCATAAACCGCGCGCTTACCCTGCTCTTGCGGGCTACTTTTCTTATAACGGATATCAGTATAGGTATACGCCGCCTGCAAACGGACGCTATCCGACAAATGGCTAATGGCCTCCAGTTCCACCCCTTTAGACTCAATTTCACCAATCGAGCGGTACGGATCGGTAGGTTCTTCTTTGG [...]
+NODE 683 9656 719175 716158 0 0
+ATCCCTTTCAAAAAAGAGAAGCGCATATCTTACGGAAAAATGTCGCTTATCGCCTCTGGCCGACTCGCCTCGGCACATCATTATCCAGCCGAAGTTCATAAATGTACTGCAATAACACGGATTGTCTTAAATATGAAAGAGAAAACTCATCTGCAAAATATATAATTTATAGCCATTTTTTGACAACAAAAAGATATTATAAAATAACGTTAGAGAATGGTCGGTATTATCAATAGTTAATTAAATGTTTGCTTTAGCTTGTGATGAGCTCAAATATGATATGTGCATCTTGCTTTATTTTTAATTGCTGAAGATAAAGTTGTTACTTATAGCTGGCTTTATATAAAAAATGGTTTTATTTGTGTGTGTTTTTACGCAATTCTGATTTTTTACTCCCCACTTATTATATTTTTAATGATTTAAGTTATATTGAAGTCCCTATGACCCTATGTTTTAATTGTGAAAATTAATTTTATCCTCTGGAGGCAAATT [...]
+CTGCAGGGCAAATGTCGGCTGGGTGCGATTCGTCATGTTATCGCCCTGGACACCGGTATCGTCCGCGCTATTCAGTACGATGACCGGCACTGACAGCGTGGTATCCACCGCGAAATCGATGGTCTTCGTCACGGTATTGCCTGCTTTATCAGTCGCCTCCACCGTTAGCGTGTATTGACCATCTGCCAGGTCTGTCGGCCAGATATACTCCCAGCTTCCTGCCACGCCCGGAGTTGCCTGAACCCACGAATTACCACCGTCAATGCTCAGACGGACTTCATTGACATCCGTAGGTACCGTCACACGAAAGTGGGGACGGTCGTCGTTGGTCATATTATCGCCTTTCACGCCGCTATCGTTGACCAGTTCCACCCCATCAATGGCGATTTGGGTATCGATAACGACCGTCAGCGGTGCTGAGTAGTTGGTATTTCCTGCCTTATCTTCTACTTTCACCGTTAACGTGTAGCTGCCATCCGCCCACGTATTCCC [...]
+NODE 684 886 148213 146795 0 0
+ACACCTAATTTTACGGTCAAAAATCCGGTTAATGGTCATGCACACCTGTTTTATGGGTTAAAAACGGCGGTTCGTGTTGCCAAAGACGGTAGCATTAAGGCGATCGAGTTTGCTGCTGCTGTAGAGCGAGGATTACGTGACAAACTTAAATCAGATACCGGCTATGCAGGGCTGATTTGTAAAAATCCTCTCCATACATACTGGCAGGTTGTTGAATGGCGTGGAGAACTTTATGAGTTAGCTGAACTGGCTGATTATGTTGATTTGTACGCGCCAACAGCGGCTAACGATGAACAGGCATTCGATATCGACTTTAGTTATGGGCTTGGGCGAAATTGTTGGCTCTTCAATCTGACCCGTATCTGGTCATATACAGCAATCCGGCAGGGCTGGCCTGATTTCCCGCAATGGAAAGAAGCGGTAATTCAGCGTGTCGAAATGTATAACGTGCAGTTAAGCGTGCCTTTGTCTCACAAAGAATGTGTATGCATT [...]
+CTGAAAATCGGAAGATCACTAAAGGCAAAGGAGCTGTCTGCAAGGATCAAGATCCGGTGCTGTTATCTGATATAGGTTGTTTATTTGGTCTCATTTGCCCTACGTCGATAATAGGTTGCCCGACTGATCCCTAACTCTACCCACGGTTTCAAACTCCGCGCAGAATCCTCAACAATCCCTCTTTTAGATATTTTCCCACCTTTACGCCCCTTAGCTGCCTGCACTTCTGAGCGATTCTTACGCCCTCTACGAGCCTGAATTTCTGATGTATGGGTATCAGCCACATATTGCTCAAATCCAGCTTCAGTGAAGCGTTTATGCGTCCATTTGGCGATGCTGGAGCCAATGCATACACATTCTTTGTGAGACAAAGGCACGCTTAACTGCACGTTATACATTTCGACACGCTGAATTACCGCTTCTTTCCATTGCGGGAAATCAGGCCAGCCCTGCCGGATTGCTGTATATGACCAGATACGGGTCAGATTGAAG [...]
+NODE 685 585 40041 39719 0 0
+TGTTTTCGCTGATACCCAGCGAAGTAGGCGATGCCCTCCTGATACGTGCGCAAGCGCTGGCTGTCGCAGAAGACAAATCCTGCGAACTGGAGTGTCATGCGATGCTGATTTCTTATGTGAATAACCGCTATCTGGAAAAGGTGTATCAGCAGTTCCTGGACGGTTATGTCTCTTATGTTATTTTGCATCTGAAAAAAGATAATCAGGAGTCGGCGCAGCTTTTCGCTGAACTGGCTGACGTCATACGCCAGGGGCGGCGTGATGAGATTGGGCAAGTTATGCAGCGTTATTTCCTCTCTTTAGCAGAAATAATGCGTCAACATATGAAGGATTGGGAAAGTGCAGAAGCCTAAGTTAGGGAAGATTAAGCTTCTTTCAGCGAAAGAACAGGTCGCGGCGGTGCTGCGTAAAGCGATTCTTTCGAGGGAGTTAGTGGAAGGGCAGGAGATTACGTTAGAAGGCATTGCCGGAATGGTCGGCGTGTCCAGTATG [...]
+TCAGCCCATCCGCCGCCAGAATCTGAAACGCCTCGCGCACTGGCATACTGGACACGCCGACCATTCCGGCAATGCCTTCTAACGTAATCTCCTGCCCTTCCACTAACTCCCTCGAAAGAATCGCTTTACGCAGCACCGCCGCGACCTGTTCTTTCGCTGAAAGAAGCTTAATCTTCCCTAACTTAGGCTTCTGCACTTTCCCAATCCTTCATATGTTGACGCATTATTTCTGCTAAAGAGAGGAAATAACGCTGCATAACTTGCCCAATCTCATCACGCCGCCCCTGGCGTATGACGTCAGCCAGTTCAGCGAAAAGCTGCGCCGACTCCTGATTATCTTTTTTCAGATGCAAAATAACATAAGAGACATAACCGTCCAGGAACTGCTGATACACCTTTTCCAGATAGCGGTTATTCACATAAGAAATCAGCATCGCATGACACTCCAGTTCGCAGGATTTGTCTTCTGCGACAGCCAGCGCTTGCGCACGT [...]
+NODE 686 2 371 360 0 0
+TA
+AC
+NODE 687 3356 190283 186529 0 0
+CTGCGCCGCCTGAGCTTTACACAATGCTTCCATATCCAGCGTGCGTGTTGGGCTCACTTTACTCTGCTGGGCTTTTTGCGTCGGTGGCGGTGTCGCTGTGCATCCCACCAGAACGATGGCTATCATCACAGTACAGAAATACTTCATTATCATTTTTATTACCGTCTGGTTTGCTGGTCAGTCTTATTATTAAGGTTTGTGGGTAGCAGACACATTGTGCGAATCTCCTTACGCCATCACAAGATGTAGCGTAGAAAGTCGGATTTTTCCAGTGAGCCACCGCACTGGAACTCTATTCAAACGGAAGCTGAGGAACTGATGCAGCCTAAAATTAACTGGATTGATAACCTGCGAGGGATCGCCTGTTTAATGGTAGTGATGATCCATACTACAACGTGGTACATCACCAACGCCCACAGCGTCAGCCCGCTAAACTGGGATATTGCGAATGTCCTGAATTCGGCTTCGCGCGTTAGCGTTCCCCTGTTTTTT [...]
+TCGATCTTGGTACATCGGGTGTAAAAGCTATCCTGTTGAATGAGCAGGGCGATGTGCTGGCTACGCATACTGAAAAACTGACCGTATCGCGTCCGCATCCCTTATGGTCGGAACAGGAACCAGAGCAGTGGTGGCAGGCGACGGATCGTGCGGTTAAAGGTTTAGGTCGGCAACAGTCGTTAAGTGGCGTCCGGGCGTTGGGCATCGCCGGACAAATGCATGGCGCGACATTGCTTGATAGCCGTCAGCAGGTTCTGCGACCAGCGATTTTATGGAATGACGGACGCTGTAGCGAAGAGTGCGCCTGGCTGGAAAAACAGGTGCCGCAGTCGCGTGCGATAACCGGTAATCTGATGATGCCCGGTTTTACCGCGCCCAAATTAGTCTGGGTGCAGCGCCACGAACCGGATATTTTCCGCCAGATAGACAAAGTTCTGCTGCCGAAAGATTTTCTGCGGCTGCGAATGACGGGCGTCTTTGCCAGCGATATGT [...]
+NODE 688 10 3911 3784 0 0
+GTTTCCCTCT
+TGGGAAACGA
+NODE 689 6760 362540 357794 0 0
+CGGCGGGACTGGACGAAGACGCGCTGGCTTTCGCACTGTTACCTCTGGCGGCGGCCTGCGCCCGTACCGATTTGTCCCATTTTAACGTCGGCGCGATTGCGCGCGGCGTTAGCGGCAACTGGTATTTCGGCGCGAATATGGAGTTCCTGGGCGCCACCATGCAACAAACTGTGCATGCTGAACAAAGCGCGATTAGCCACGCCTGGCTACGCGGCGAAAAAGGGCTCGCCGCCGTCACCGTTAACTACACCCCTTGCGGCCACTGTCGCCAGTTTATGAACGAGCTGAACAGCGGTCTGGATCTGCGCATTCATCTGCCGGGCCGCGCGCCGCATACGTTACGCGATTATCTGCCTGACGCTTTCGGGCCAAAAGATCTGGAGATCAAAACGCTGCTGATGGACGAGCAGGATCATGGCTTTACGTTAACGGGCGATACGCTAACGCAAGCGGCGATTACGGCAGCCAATAAGAGCCATATGCCTTATAGCC [...]
+TGCGAAGGCGTTTTCCTATAATGCTAAGATCGTTATTATGGATGAACCGACCTCATCGTTAACTGAGAAAGAGGTTAATCATCTGTTCACCATTATTCGCAAGCTGAAAGAACGTGGCTGCGGAATTGTTTATATCTCGCATAAAATGGAAGAAATTTTTCAATTGTGCGATGAAATTACTATTTTGCGCGACGGTCAGTGGATTGCCACCCAGCCGCTGGAAGGGCTGGATATGGATAAGATCATTGCGATGATGGTCGGGCGTTCCCTGAACCAGCGCTTTCCGGATAAAGAAAATAAGCCGGGCGATGTGATTCTGGAGGTCCGTCACCTGACCTCGCTGCGCCAGCCTTCCATTCGCGATGTCTCCTTTGATTTGCACAAGGGCGAAATTCTGGGCATTGCTGGTCTGGTTGGGGCAAAGCGTACCGATATCGTCGAAACGCTGTTTGGCATTCGTGAGAAGTCGTCCGGGACAATCACTTTACATGG [...]
+NODE 690 4667 255121 253848 0 0
+GGGCATTAAACAGCGGAAAATTCGCGCCCGTAGCGCGCTGCGTCCGCTGGATATTGTCGGTTTAAGCCAGCTGCTGGTCCAGGTTTCAAACCTGATTGTCGACTGCCCGGAAATTCAGCGTCTGGATATCCATCCGCTGCTGGCTTCCGCCAGTGAGTTTACCGCGCTGGATGTGACGCTGGATATTGCCCCGTTTGATGGCGATAACGAAAGTCGACTTGCGGTACGCCCCTATCCCCACCAGCTTGAAGAGTGGGTGGAGATGAAAAATGGCGATCGCTGCCTGTTCCGTCCTATCCTGCCGGAAGATGAGCCCCAGCTGCGACAATTCATCGCACAGGTCACCAAAGAGGATCTTTACTACCGTTATTTCAGCGAGATCAACGAATTCACCCATGAAGATTTAGCCAACATGACGCAGATCGACTACGATCGAGAAATGGCCTTTGTGGCCGTGAGGCGGATGGACAACGCTGAAGAGATCCTCGGCGT [...]
+TGCACCGCCGGATGGCGGCTCCGCCTTATCCGGCCTACAGGAATTATCCCGCCTACGAAGCTGGTGCTCTTGTAGAACTGATAAGAGCACAACCCACCCAATCGTTAACGATGAACTATCCTTTACACGTGCTTATATAAGCAGTGAGGATTTTCATTGGCTATCAAACCTTTTAACTACCAGCAGGACTTTTCCAGCATCGACTTCCGCCAGCAGCCTGAATTGTATCAGGTTGGACGAGGCGAGCAGGGGGTGCTACTGGTTGAACCCTACAAAAGCGAAATTCTTCCTTTCTGGCGCTATAAAGATAAAGCATCGGCGATGAAATCCGCAGAGCAAATCTACCAGTTGTTCGAAGCTTACCGGCAGCAGGATGATTTCGTTGGTATGGACATGGCGCGTAAATTTATTCAGATGGGATACACCCGCGCCAGGCGATACGCTAACTATAAAGGCGGTAAAAAGTATGCCGAAGACGGCAGCCTGAATACA [...]
+NODE 691 4008 216891 213548 0 0
+TGACGGCGACCCTGACGGCGGCGGGGATTATATCGTTCCCGGTGGCGTTGTGCCTGGTCATCGGCGCCAATCTGGGATCGGGGCTGCTGGCGATGCTCAATAACAGCGCCGCCAATGCTGCCGCGCGTCGCGTAGCGCTCGGCAGCCTATTGTTCAAATTGATCGGCAGCCTGGTCATCCTGCCGTTTGTCCATCCGCTGGCGAATCTGATGGATGAGCTATCGCTACCGAAGTCAGAGCTGGTGATCTATTTCCACGTTTTCTATAACCTGGTGCGTTGCCTGGCGATGGTGCCATTTGCCGAGCTGATGGCGCGTTTTTGTAAACGAATTATTCGTGATGAGCCTGAACTGGATACCCATCTGAAGCCGAAACATCTGGATGTCAGCGCGCTGGATACGCCAACGCTGGCGCTGGCTAATGCTGCCCGCGAGGTGTTGCGCATTGGCGATGCGATGGAACAGATGATGGAAGGGCTAAAAAAGGTCATGC [...]
+GCCTGGCGCGCTGTTCTCAGTGTGGCACAACCTTTCAGGGTCACTACTGGCTGGTTACTGGTCCGGGAAACCGATTGTTGAAAAATCGGGCGAAACGGCAAAGGTAAATTAAAATATTGCCGGGTGGCGCAAGCTTACCCGGCTTACACGCTATCCGCCCGTTGCGTATTGCCGTAGACTAAATGCATCGGCTAACTGAGGGCACCCGTATGGCACTCCCCCGCATTACCCAAAAAGAGATGACCGAGCGCGAACAGCGCGAACTGAAAACGTTGCTGGACCGCGCCCGTATTGCGCACGGGCGTCCGCTGACCAATTCTGAGACCAACAGCGTAAAAAAGGAGTACATCGATAAGCTGATGGCGCTGCGTGAGGCTGAAGCAAAAAAAGCCCGCAAGTTGAAGAAAAAGCAGGCGTATAAACCCGATACGGAAGCGTCATTCTCCTGGTCGGCGAATACGCCGACGCGCGGCAGACGTTAACGTCCTTTTT [...]
+NODE 692 2169 121030 119866 0 0
+GGGCGACCTTGAAACCTTGCGCAGCTACTATCTGGATCGCGGCTACGCGCGTTTCAATATTGACTCCACGCAAGTGAGTCTGACGCCGGATAAGAAAGGGATCTACATCACCGTCAATATCACCGAAGGCGATCAGTACAAGCTTTCCGGGGTTCAGGTGAGCGGTAACCTGGCCGGACATTCCGCTGAAATTGAGAAACTGACGAAAATTGAACCGGGCGAGCTCTATAACGGCACCAAAGTGACCAAAATGGAAGATGACATCAAAAAGCTTCTGGGTCGCTATGGTTACGCCTATCCGCGCGTGCAGTCACAGCCTGAAATTAACGATGCTGACAAAACCGTAAAACTGCGCGTAAACGTCGATGCGGGCAACCGTTTCTACGTGCGTAAGATCCGCTTTGAAGGCAACGACACCTCAAAAGATTCCGTTCTGCGCCGTGAAATGCGCCAGATGGAAGGGGCGTGGCTGGGCAGCGACCTGGTTGACCA [...]
+TAGTACGATCGCTACCTGCTTTCATGGATTGCAGACGCTGCATTTTAGATTGCAGATCGGTTTCCATTTTTTGCAGTTCAGCCGCACGGCCTTTAAATTCGTTTTCCAGTGTATTGGATACACCCGTCTTCTGCGCAACCTGTTGGAACAGATTACCCATGTTGACGATTGCAATTTTGTCAGCAGCCTGTGCGGACGTTACCATCGCCAAACCAAGACCTGCAGCTAATAACCACTTTTTCACAATAAACTCCTTACCATCCCATTTGCACCCGAAGGTACAGCTCTTTGCGTGGCCTGGCGATCCCTGGGGGCATCGCCAAAAGTCATCGCTACACTACCAATGCATTCCTTTGCAGTGAACAATTACCAGGTTTTACCAATGTTAAACTGGAACTGCTCGGCTTTGTCTCCATCGTACTTTTTAAACGGCTGGGCGTAGGAGAAGACCAACGGCCCCAATGGGGACATCCATTGTAATGCGATACCCGC [...]
+NODE 693 7632 417371 412152 0 0
+GCAGCGCCACAAACGTCAACGCCAGCGCAGCGTTGCCGATGGAGGGGCCGAAGATCGCTACCAGCACCAGCGCCAGCAGCAGGCTCGGCAGGGCCAGCATAATATCGACCACGCGCATGATGATGTTATCGACCAGACCGCCGAAGTAGCCCGCGACCAGGCCGAGAATAATCCCCATTACCAGCGACAGGACGACCACCAGACAGCCGACCAGCAGTGACAAACGCGCGCCATACATCAGGCGCGAGAGGACATCGCGACCAACATCATCCGTTCCCAGAATATGCGCCCAACTGCCGCCTTCCTGCCAGACCGGCGGTGCCAGCAGCGCATCGCGGAACTGCTCTGCCGGGTTGTACGGCGCAATAAAGTTGGCAAACACCGCAATCAGGATCACGATGAGAACATACGCCAGCCCGACGACCGCGCCTTTATTGCGTTTGAAATAGTGCCAGAACTCCCGCAATGGCGTCATGGGCGCCGGTGCGGCAT [...]
+GTCAGCAACAGCCCGCAGGGCGAGCCACGCAGTGGCGAGTCATCCTCTATCACCGACAGGTTGACGCTCGCACCACCAGCTCAGGCATGATCCCGTCGCTGTGACTGACCTTCTTGCCCGCCAGCAAATCAAATAATAGTGTGATTGCCTGTCGCGCCACCTCATCAAGATGCATATTCACTGCCGTCAGCGGCGGCAGCGATTCGCGCGCGCGGATACCGTCATAGCGGGTGACCACGCGCATCCGCTCCGGGATAGCGACTGCCTGTTCCTGAAAAGCGCGTACCGCGCCGCTGGCAAAGGTATCGATCAGCACCAGCACGCCGTCAACGTTGGGATGTGCCTGTAATAGCTGCTGCGCGGCCTGGTAGCCGGCATTTTCACCCTCGCTTTCATTGAGAGAGTAGACGACGGGGGCCTGGCGCCCCGCGCACCAGCGCTGGTAAGCCGCTTCGCTCTCCAGAACTGATGTTCGCCGTGTGTTACCGACAA [...]
+NODE 694 238 13771 13684 0 0
+CGGAAGAGCATGAGCAACAGTTGGATCAGCTCAGCCAGCGTCATGCTCTACAAACGCAAATCGCGGCGCATACTGAACAAGTAGCGCGCTTTACCGCGCAGATTGCGCAGCGTCAGGCCTCGCTGACGGCTGATTTGGCGCAGTATACGCTTTCCCTTCCAGCGCCAGAAGACGAGGCTTCGTGGCTGAATGAGCGCGCCGACGAAGCGAAAATATGGCAACAGCGTCAGACCGAGTT
+CAGCCACGAAGCCTCGTCTTCTGGCGCTGGAAGGGAAAGCGTATACTGCGCCAAATCAGCCGTCAGCGAGGCCTGACGCTGCGCAATCTGCGCGGTAAAGCGCGCTACTTGTTCAGTATGCGCCGCGATTTGCGTTTGTAGAGCATGACGCTGGCTGAGCTGATCCAACTGTTGCTCATGCTCTTCCGCGGCGGTCAACCAGCCCGCGAGGTCTTCTTGCGGCTGGAGCTGAACGCCC
+NODE 695 162 9145 9145 0 0
+CTGTTCCTGCAGGGTTTGCAACTGGCTTTGTAATGACACGCACTCATCATGCGCCTGCCGCCAGTTATCCAGCGGCACGTCGTCGTCGGAATCCGCGGTATCCGTTTGCGGTAGCGTCTCCAGCAACGGGGCAAGCCTGTCGATCTGCGTTTGCAAATCCGC
+ACCGCAAACGGATACCGCGGATTCCGACGACGACGTGCCGCTGGATAACTGGCGGCAGGCGCATGATGAGTGCGTGTCATTACAAAGCCAGTTGCAAACCCTGCAGGAACAGACGACGCAGGAGCAGCAGCGCGCCGCCGAGGCGATAGCGCACTTTGATGC
+NODE 696 4747 244402 241936 0 0
+CCTTTAAAAAGCTCGCTTCGGCGAGCTTTTTGCTTTTCTGCGTTTATAAATTCCGAAAGAGGTTTCCCCCTCAATGCCCTGCTATCAGTAAAACGCTATGATAAAGCCTTACAGGGATCGTTCGGTAACCTCACAATGAATTACCAGTTTTGTTGGTATCTCTTTTTGCGGCCATTAACATTTTTTATGGTCGTCTTGCTCTGCGCTTTCACCTTCATTGATATCACGGCCAGCGCCGCCTGGTTGATTATTTTGGGTCTGGTTTACCCCGTGGCAGTGTCAATGAGGCTACATATACTGCACCAGAAAAAGGCCGTCATGTTGCGCCAGAATAGTGCGGAATGGATAGTGTATCTGCCAGGGATCCCTGTGCAAGAAAAACAAAGCGCGCTGATTAATGTCGCGTTTTCCTCGAAAACGGCGCTGCGTGGATTCTATATTCGCGCCCTGTCCAGCAAAGTCATTCTTCACATCATCACTTTTTATATTCTG [...]
+TTCCCAGGCTTCATAGGCGTTAACAATGCGGGCAACGACCGGATGGCGCACCACGTCTTCGCTGTGGAAGAAGTTAAAGCTGATTTCATCGACTTCCGCCAGCACTTCAATGGCATGACGCAAGCCGGATTTGGTGTTGCGTGGCAGGTCAATCTGCGTCACGTCGCCGGTGATCACCGCTTTCGAGTTAAAGCCGATACGCGTCAGGAACATCTTCATCTGTTCGATAGTGGTGTTCTGGCTTTCATCCAGAATGATAAAGGCGTCGTTTAATGTGCGTCCGCGCATATAGGCCAGCGGCGCGACTTCAATCACATTGCGCTCAATCAGCTTCTCGACTTTTTCAAAGCCGAGCATTTCGAACAGCGCGTCATACAGCGGACGCAGGTACGGGTCCACCTTCTGACTTAAATCGCCTGGCAGAAAGCCCAGTTTTTCGCCCGCTTCCACCGCCGGACGGGTCAGTAGAATACGGCGAATCTCCTGGCGCTC [...]
+NODE 697 2520 132477 132010 0 0
+GTGCGGTATGCTGCAGGCCGGTTCTCTGCTGTGTTTCGACAAGCTGGTGGCAGAAGGCACCGACCCGGCATACGCCGAAAAACTGATTCAGTTCGGCTGGGAAACCATCACCGAAGCGCTGAAGCAGGGCGGCATCACCCTGATGATGGACCGTCTGTCTAACCCGGCAAAACTGCGTGCTTACGCGCTGTCCGAACAGCTGAAAGAGATCATGGCGCCGTTGTTCCAGAAACACATGGATGACATCATCTCCGGCGAATTCTCGTCCGGCATGATGGCTGACTGGGCTAACGACGATAAGAAACTGCTGACCTGGCGTGAAGAGACCGGTAAAACCGCGTTCGAAACCGCGCCGCAGTTTGAAGGTAAAATCGGCGAGCAGGAGTACTTCGATAAAGGCGTGCTGATGATTGCGATGGTGAAAGCGGGCGTTGAGCTGGCGTTCGAAACCATGGTCGATTCCGGCATCATCGAAGAATCCGCTTACTACGA [...]
+GATAACTGGCGGGCGCATAGGTTTTGCTGGCACCGTCGTCAGCCACCGCGCCGTGGGCGATGATCACATCGCCCAACGCCAGCGAGTCCTGCAACGCGCCGCAACTACCGATACGGATTAGCGTGTTGACGCCAACCTGGCGTAACTCCTCAATGGCGATAGCGGTTGACGGTCCGCCGATTCCCGTGGAAAGCACGACTATTTCAACCCCCTGGTACCAACCGCGCGCCGCGCGAAACTCCCGGTTTTGCCCCAGAATCTCAGCCTTATCAAGAAAACGGGCGATTCTATCCACCCGCCCGGGGTCGCCGGGCAAAAGCGCATATTTCGCGCGGGTCATGCTTGTGTTAAGCCGAATATGGGGTTGCATCTCCCGTCTCCTTATTGTTCTGAGAGGTTCAGATTTCCGCCTCCTGTTTGAGTTTTTCAGGAGCCAGTAAAATGATCCGCTCACCGTCGGTATCGATAATGTTCAGCGATTTCAGATCGTGC [...]
+NODE 698 51 19098 18545 0 0
+GTCTTGCCGCGGGTACACTGCATCTTCACAGCGAGTTCAATTTCACTGAGT
+CGGAAAGACCCCGTGAACCTTTACTATAGCTTGACACTGAACATTGAGCCT
+NODE 699 11084 594246 585512 0 0
+TGGATCTGAATTTCCAGAAACATCCGGATCAGATCAAAACGCCCGAAGCAGACGCTACGAAACTGCCGCATCTTTTCACGTAATGGGTAATTATCCGCTTTTCCGACCCGAAAGGCGTTCTGCGCGGCTGTACGTGAATCGCCGTGTAAATTCATACGATCCATCAACTGACTGGCGATATGAATATCCGCTTCCGTCACCCGTCCTTTTGATTTGGTTAAGTGGCCCATCACCTCAAAGGTGGTGGCAAAAAACAGCGCCTGCCGTTCCCGCTGGTTGGCAAACCACGCCATTTTTCGGCTGCGGGCTTTGTCGAACATATGGCCCACCAGCAGACCCAGGACCACGCCCCAAAAGCCGCCGCCCATCATCAGGGCTACGGCGACGCCAATTATCTTTCCCCAGTACTGCATAGACTCCCCAAAACGTTACGCTATCGGTGAGGCTATCTCCCACAAAATAAGGTGCTTTTCTGCGAATGAAGGCTACGGT [...]
+GCGCTGGTCGGCCCCAAACTGGCTTCAACAATTACGCCTGGTGGGCCAGGCTCTAAGTACCTGACCCATTAGGTTAATTTATGCGTCGGCGATCTGGCATCCAGCGTGTCTGGAGGTTCAGATGCTGTTGGCGCTGCGCTTATTGGGCCTGTGTCATCATGTAATGGATTGATATTACAGTCATTACAGGCAAATTTAGCGCAGCGCCGCCCGACAAGAAGGCCTTAAACCGATTGGTCAGCAATTTAAGGCTGCCATCATCACCAACCTTTCCACACCGGATCGCGCTTTTCCGCAAACGCCTGCGGCCCTTCGAGAGCGTCTTCCGGGGGCAGGATGGCGTCAACTCCTGGCTGGCGTTAATTCAATTTTTTCTGGTTAGCCGCTCAATAATATTCACTATTAGCCTGGCGAATTTGTCACTACACTTTGTAATAAAAAACAGATCATCACAGGCTAATCATGATCCTCATTATTTATGCGCATCCGTAT [...]
+NODE 700 166 8039 8039 0 0
+CGACAATGAATATGCCCACGGCGTCTGGCAACGATAATCCCTGAAGCCCTGTTACCAACAGAGCGGCGCCAGGCGTTGACCAGGCGGTTAAAACCGGCGCACGATACCACAAGGTTAACGTTAGTGTGCTTATGCCCATGGCTATACCGAGGGCGGTCATCCAGCC
+AACCTTGTGGTATCGTGCGCCGGTTTTAACCGCCTGGTCAACGCCTGGCGCCGCTCTGTTGGTAACAGGGCTTCAGGGATTATCGTTGCCAGACGCCGTGGGCATATTCATTGTCGCCAATGCCCTGATTGTGCTGTGCGGCGTCACGGGATTGTTTGCGCGTTTG
+NODE 701 1673 83239 83090 0 0
+GGCGATCTCTGCGGGTGTTGCGCCAGCGGCAAGCGCCGCCTGCCAGATAATGGCGGCGGAACTCGCATAGCCGACCAGAACGGCGACCAGACCAGATAATACAGTAGGTAACGGCAGTGATAACAGACGCATGATCGCCTCTTGTGCGTTATAACGGTCAGTCAATGTAGCATTGTGCGTTATAGCGTACAAGTGATACGCTATGGTCTTACTGGGGGGAAAAATGGATAACCTGACACACTATCTGGCGACCACGTTAAGAACGTTACGCCATCAGCGAGGCTGGAGTTTATCGCGTCTGGCGGAGATCTCCGGCGTCTCAAAAGCCATGTTAGGGCAGATAGAGCGTAATGAATCCAGCCCGACAGTCGCAACGCTGTGGAAAATTGCGACGGGCCTGAACGTTCCATTCTCAATGTTTATTTCGCCTCCGCAGGCCGAATTTCCGCCAACCTTCGATCCCCAGCAGCAAGCGATGGTAATTACACCGCT [...]
+AGCATCTGACGATAATGCGCGGTGATGTTTTTGACATAGCTCATGTCTTTGTAGCGCCCTTCAATCTTGAAGGAACGTACGCCTGCATCGATCAACGCGCCGAGGTTAGCCGTTTGGTCGTTATCTTTCATCGATAGCAAATGTTTTTCGTAAGAGACCACCCGCCCCTGATCGTCTTTTAACGTATACGGTAAACGACAGGCTTGCGAACAGTCGCCCCGATTGGCGCTGCGCCCGGTTTGCGCATGAGAGATATAACACTGCCCAGAATAAGCGACACACAGCGCGCCATGAATGAAGAACTCAATCGTGGCGTCAGTAGCCTGATGAATAGCCGCTATCTGACTCAAATTAAGCTCGCGCGCCAGTACAATCTGTGAAAAACCGACATCGGCAAGAAACTTCGCTTTTTCCACGCTGCGAATATCACACTGTGTACTGGCGTGAAGCTCAATCGGCGGGATATCCAGTTCCAGAATGCCCATATCCTGC [...]
+NODE 702 88 28795 22945 0 0
+CCAACCCGATGCAAACTGCGAATACCGGAGAATGTTATCACGGGAGACACACGGCGGGTGCTAACGTCCGTCGTGAAGAGGGAAACAA
+ATAACATTCTCCGGTATTCGCAGTTTGCATCGGGTTGGTAAGCCGGGATGGCCCCCTAGCCGAAACAGTGCTCTACCCCCGGAGATGA
+NODE 703 17 6162 3947 0 0
+TCACGACGGACGTTAGC
+CCAAAGTCATGGTTAAG
+NODE 704 21 7018 6106 0 0
+ACCCGCCGTGTGTCTCCCGTG
+CCCAGACCGCCAGCTAAGGTC
+NODE 705 13607 677831 666352 0 0
+GCCCCGACGTCAATCAGGTGACTGGCGCGGTGGAGCTCAAGTTTCGACAGTGCCAGCGCCCGTACCGCCTCTTTGGTCATTGGCACGTTCTCGCCGCGCAGAAAAAGCTCATCTTTCATCCAGGATCACCACTGCATTCATTTCATAGTCGGCGTTGACCGCACTGACGGGTAGCCAGTGGATCCGCTCATTTTCCATCGCCAGATTTTCACCAATCACCATTAAGCGATGCCCTTTACCGCGCGCGACCAGCTCCCGCGCGATTTCCCGCGGCCCGCAGCGGGCATCCGTGACCATCGCCACTTTGCGATGGTTCGCCAACTGCTCGAAGCTGACGCAACGACCGTGGCTACTGGTCAACCACATGTCATTCATATCAATTCCAGCCTGTGCGCACAGATACTGTACGGCGCTGATGCCAGGGATAATACGAACCTGTTCGATACCAAAATGCGCCACCAGGCGTGTACCGATGCCATAAAACAGCGGATC [...]
+ACGAGCCGCCGACCAGCACCACGAACGGAATATCGCGAATGTTGCCGGTTGGACTGACCTGGCGCAGCGCGCGCAGGGCGTTGGTGACAAAGACGCGCTCTTTGGCGCTGCGGCGAATGGCGCGCACTTTTTCCAGCGCTAAGTCGCCGGGAAGCGGTACCAGTTCGTCCGGTTTCACCACGCAGACGCGGGCGAACACGGCGGGAGGCAGCGGCGTCGGGAAGAACTGGACGCTGCCGTCCTCGTGGCGTAAGTGGAACAGGCTTTCGACCTTAGCCAGCGGGTATTTTTTGATCTCTTCCGCCAGATAGCGGTCTTCCAGCCCCAGTTCGCGGGCAATAATCATCGTGACCATGTCGCCTGCCCCGGCGAGATGGGTGGCGATGATTTCACCTTTAGGGTTGATGATGGAGGCATCGGTGGAGCCCGCGCCGAGGTCGAGGATCGCCAGCGGTCGGGTGGTACCCGGCGTGGTCAGCGCGCCCAGAATGG [...]
+NODE 706 5381 252259 249076 0 0
+TGCCGCGCTACGGCTGCTTGATGAGAATCGTCAGCGCTTTGCCTGCGGCAATATCGATATTCTCCCCGGCGAAGCGCCAATGACCATAACCGGGAAAGCCGATGCGGTGTTTATGGGCGGCAGCTGCGGGCATCTGACGGCGCTGATTGACTGGGCGATGGGCCATCTGCATCCCGGTGGCCGTCTGGTGATGACCTTTATCTTGCAGGAAAACCTTCATAGCGCGCTGGCGCATCTTGCCCACATCGGCGCATGTCGAATGGACTGTGTACAGCTTCAGCTTTCATCGTTAACGCCGCTGGGGGCGGGACACTATTTCAAACCGAACAACCCTGTTTTTGTTATCGCCTGTCAGAAGGAAGAAAACCATGTCAGAGACATTTGATCCACGCTGTGTATGGTTCGTCGGCGCCGGGCCGGGCGATCGCGAGCTGATCACGCTTAAAGGCTACCGCCTGCTGCAACAGGCGCAGGTAGTTATCTATGCCGGTT [...]
+CAGGCCAGCGCCCACACTGGCGGTAAAAAGCCCTCCATGATATGCATCGCAAACGCCTGTTGCGGGACAACCATCAGCAATAGCGCTGCAGCCAGTCCACTGAAAGACAACTGTCGAAGCTGCTGTTCAAGTTTCATTCTGCATACTCCCACTGTTTATTGACCAGAATGGTCGAAAAATAGGGCAACGGTCGATCATCGTTGACCTCGTGGAGATGGCGCCAGCACTGCTCGCCGGGCAGTGTGGCCTCGGACATCATTAAGGCGCATTCCAGCAGGCCAGCCTGCGCCAGCAAAGCTTTAATACGGGCGAACCGGCCATACACTTTCATCAACACCAGGCTATCATGCTGTTGTAGCGCCTGGGCTATTTCCGCTTCCGGCGCGGTACAAGAAATAACCGCCAGCGATTGCCGTTCTATGGCGAGCGGCATTTTCGCGCGGGCGGCTATCGCGGCGAAGGACGTGACGCCGGGGACAATCTCCAGCCACT [...]
+NODE 707 18166 928144 917339 0 0
+CCACCAGCGCTTTAGCCATCGGCACCGCGTGCTCCAGTTTATTGACTACAATGACCGGGACAACCGGGCCGGTGGTCAGGATTGCTTCTGCACTTGTTTTCCAGTTTTTCATCGGAATTCTTCTCTCGCCTGATTACTAGTGTGTCATCTTAAAAAGTGATACAGGTTGCGCCCTGCTCCGCACCCGACAGCTTTTCGCGCAGCGCGCCAAACAACTCACGCCCCGTTCCGACGCGCGACGCGCTCAGGTCCGGAATATGAGGCTGACGAGCGGCAAGTTCCGCCTCGTCGACCAGCAGAGTTAACTCACCTGTCTGCCCATTCACGCGAATGATGTCGCCATCGCGCACTTTTGCCAGTAAGCCGCCATCGTAGGCTTCCGGCGTTACGTGGATAGCTGAAGGCACTTTACCCGAAGCGCCTGAAAGTCGTCCATCAGTAACTAACGCGATTTTGAAACGGCGGTCCAATAATACACCAAGTGGCGGCATG [...]
+GATGTCCGGCTTCGACCGCTACTATCAGATCGTAAAATGCTTCCGTGATGAAGACTTACGTGCTGACCGTCAGCCGGAGTTTACTCAGATCGACGTCGAGACCTCCTTCATGACCGCGCCACAGGTGCGCGAAGTGATGGAAGCGCTGGTGCGCCATTTGTGGCTGGAAGTGAAAGGCGTGGATCTGGGGGATTTCCCGGTCATGACGTTTACCGAAGCGGAACGTCGTTACGGTTCCGACAAACCAGACCTGCGTAACCCGATGGAACTGGTAGATGTCGCTGACCTGCTGAAATCGGTAGAGTTCGCGGTCTTCGCGGGCCCGGCTAACGATCCGAAAGGCCGCGTGGCAGCGCTGCGTGTGCCTGGCGGCGCACAGCTTAGCCGTAAGCAGATCGACGATTACGGTAACTTTGTTAAGATCTACGGCGCGAAAGGCCTGGCGTATATCAAAGTTAACGAGCGCGCGAAAGGTCTGGACGGGATTAACAG [...]
+NODE 708 339 66171 59727 0 0
+ACCCTTTCAGGTACACTCTGAAGTATTTTTTCGTAAACACTCACGAGATGGTGGAGCTATGCGGGATCGAACCGCAGACCTCCTGCGTGCAAAGCAGGCGCTCTCCCAGCTGAGCTATAGCCCCATCGTGTAGTCAGAACCTCTTACCTTTGATTCGTTTCCGGGCGCGGCGTGGTGAAGCGAAGCATACTGAAGTATGCGAGCTTTGCCACAACAAAGCACGGGAGCGAATCTGGTAGGCCTGAGTGGACTTGAACCACCGACCTCACCCTTATCAGGGGTGCGCTCTAACCACCTGAGCTACAAGCCTGTAGAGGTTTTACTGCTCGTTTTTCATCA
+AGAGCGCACCCCTGATAAGGGTGAGGTCGGTGGTTCAAGTCCACTCAGGCCTACCAGATTCGCTCCCGTGCTTTGTTGTGGCAAAGCTCGCATACTTCAGTATGCTTCGCTTCACCACGCCGCGCCCGGAAACGAATCAAAGGTAAGAGGTTCTGACTACACGATGGGGCTATAGCTCAGCTGGGAGAGCGCCTGCTTTGCACGCAGGAGGTCTGCGGTTCGATCCCGCATAGCTCCACCATCTCGTGAGTGTTTACGAAAAAATACTTCAGAGTGTACCTGAAAGGGTTCACTGCGAAGTTTTGCTCTTTAAAAATCTGGATCAAGCTGAAAATTGAA
+NODE 709 25 4716 4621 0 0
+GACAATCTGTGTGAGCACTGCAAAG
+CTACAGGCTTGTAGCTCAGGTGGTT
+NODE 710 1929 116309 114341 0 0
+TAATAATACATTATGAGTCATTTATGGCGAATCCTCGCCTGTATCATTGATGGAACCAGAGGAAAGCATGATGGGTATGAAAGAGACAGTTAGCAATATTGTGACCAGCCAGGCAGAGAAAGGAGGCGTTAAACACGTCTATTACGTGGCGTGCGGCGGTTCTTATGCGGCGTTCTATCCGGCGAAAGCATTTTTAGAAAAAGAAGCGAAAGCGTTGACTGTCGGTCTGTATAACAGCGGAGAATTTATTAACAACCCGCCGGTAGCGCTGGGAGAAAATGCCGTTGTGGTTGTCGCCTCCCACAAAGGTAATACGCCAGAGACAATTAAAGCGGCTGAAATCGCCCGTCAGCACGGCGCGCCGGTTATTGGTTTAACCTGGATAATGGATTCACCGTTGGTGGCGCATTGCGACTATGTGGAAACGTACACGTTTGGCGACGGTAAAGATATTGCCGGAGAGAAAACGATGAAAGGCCTGCTGAGTGCGGT [...]
+CCGCATGGCGCGTAACACGCTTTCTTTATCGGGTTCCGCCATACCCGATTGCAAAATGGAAAGCAAAAAACCGGTTAAGAAGGCGTCGCCTGCGCCCAGCGTATCGACAGGTTCGATATAAGCAGGTTGCCACTCCAGATAATCCGCGCCGGAAAAATAATAAACTTTTTCATGCCCGCAGGTGGCAATAATATGCCGACAGCCATAACGATAAAGTTTATTGAGTTTTATTTTGATTTCATCTGGCGATAACCCGCTACAGGAGACAAATCCATAATCTACCCACGGGCATACCTTTTCAAAATAGTCGTCTGTACCGCGCCCGGAAAAATCAAAAGAGAGTAAGACGGTTTGTTGTTTAATTTTCTCCAGTTCCGATTCCAGGTGGCCGTTAATACTGGAATGGACTAAGGTAAATTGTGATATATAGCGAAGATCGTCGTCAGACAGACTAAAAGGATGTTCCCGCAATACGCCGTTTTTGTTGCTGGC [...]
+NODE 711 4 796 779 0 0
+TTTA
+ACCG
+NODE 712 51 3933 3933 0 0
+GACCACTAAACATGCTGAAATCACAAAACTGATCTCCTTCGACCCCGTTAC
+CACCGGAACACTGATCTTTGCTGTCGTCACTTTATATAAAAAGAAAGCAAC
+NODE 713 8704 446280 440789 0 0
+TCACCTGGGAGGTTAATAAATATTGCCGCGGCATTATACAGAACGTAATCGGTTGCATCTACATATTTTTGCAAATAGTGCTTGCGATCCCCCGTGAGCAGGTTACTATCGATTGAATAACCTGCTGATTTAGAATTTGATCCCGCTCACATGTTATCCTCTCAAACTTCCTCAATTTTTACCGTAAGCCGCCTTAACCAGACGGTTCGTCTGCTGTTAGAACAGGAGATGGGGCAGGTATGGATCAGCGGCGAGATTTCTAATTTCACGCAGCCTGCGTCGGGTCACTGGTACTTTACGCTCAAAGACGATACCGCTCAGGTGCGCTGTGCGATGTTCCGTAACAGCAATCGCCGGGTGACGTTCCGCCCGCAGCACGGGCAACAGGTGTTAGTCCGCGCCAATATCACGCTGTACGAGCCGCGCGGCGATTATCAAATCATCGCCGAAAGTATGCAGCCCGCGGGCGAAGGGCTATTGCAGCAAAAATAT [...]
+CTCAGCACAAAATGGTCTGGCTTCACTGGCGATGACGGTAAGTTGCGGTTTACGTTAACTCAGGATAAATCGTCGGGGTTAAAAACGTCTGTCACGGCGGCGCTTGCGAATCAATTTGATGAGGCGGCGAGCGTGGATGCAATCTTTACGGTACAAACCAGCCCGGATACGCCGTATGCGTCATACTGGGGTCATATGCCGGATACCGTGCAGGTGAACGGCGTTACGCTGCGCCGCCCGTATCTGAAAGCCGAGCTCTCTGCCATGCCCCAGTATACCTGGTTGATGACTAACGAATACTGGGCGTCGAACTATTATTATCAGTCCGAGCACGTTGAAACATCGCTGACACATCTTTGCGGATCGCAGGAAAATATGGCCTCGCTGGATGATCTGAAAGCGTTGCAGAGCGTTATCGGCACGTTGCAATGGCCGACGACATCGTCCTGGGATTATGTGTCGCAAGATGAAGGTCAAAGCAATAAGGTCTAC [...]
+NODE 714 6374 373240 367187 0 0
+ACGTAGAGGCCCAGCTTCTGGCACTCGACACACAGCGGCTGACGTTTCAGGTACTGAGCGCGGTACTTCTCCCATGATGCTGAGTAACCACGGGCGCGACGGTGGCCGCGTCTGGCATCTTCCGCCCGCCAGGCTTCCCGCTTGTGCTCATCGCACTTACCAGACTTCACCCGCTTATTACATCCCGGCTCAGTGCACCGGCGCATTGGTTGCCACGGCATCAGTACACCCCCACATCGCGATACACAGACCACAATGCAGAGATAGCAAGGGGGATCTCTTTCGCCTCCACATCACTAATCATCGTGCGGTATTCGTACAGTTGGGAAACGTACATAAGGCATCCGATCTTGATGGCAGGAGTGAATTCCAGACCAGCACCGAACCGCTTACCGATATGCTTCTGGCAGACTTCCAGCGACGCTTCGATGTATGCCTGAATCATTGCATCTTCATAGGAATCATCGTTATCGATGCGACAGTGAAGTTTTG [...]
+GCATAACGACAGCCTGTTACCGCTTGATGAGGTAGGACAGGGCAGCAGTGCCAAAGATGTTGCCACGTCTGCTTACACCCTGTTTAACGGTGCCGGAAAGTTGCAGGGAGCCAAAGAGGGCGGCAATCGGGAGCTTAAACGCTGGCGCACTGTGGCGATCAGCACCGGGGAAATGGATATTGAAACCTTCCTGGCTGCTGGTGGGCTGAAAGTGAAAGCGGGCCAACTGGTGCGCTTGCTCAACATCCCTATGGAGAAATCGACGGCCTTTAACGGTCTGCCAAACGGCAAGGCTCATGCTGACGCACTGAAAGAAGCCTGGATTGATAACCACGGGGCGGCGGGGCGTGAGTGGGTTAAATGGCTGGCGGCTAACCAGCAGGAGGCTAAACAGGCGGTGCGTGACGCGCAAACGCGCTGGCGCGGCCTCATCCCGGCGGATTACGGTGAGCAGGTACACCGCGTGGCCGAACGCTTTGCAATCCTCGAAGC [...]
+NODE 715 6864 311694 305024 0 0
+CCGATCTTGCCAGTCGCTGCTTACCTCAGAGAGCTGTGGCAACGACTGTAGCGCGTTCTGCAGTTTTGGCACCCAGTGGCTGAGCGCATCGAGCGTCGTGGCCTGCAGGGTAAACTGATACTGTGTGCGGCTGACCTGCGTGTCGATGGTTAAATCCTGCGTCGGCTGGAGATACAGCGCCACGCCGGGAATCGTCGCCACGGCGGTTTGCAGCCGGGAGATCACCTGCTGCACGCGGTCATCACGCGCATCCAGCGGCTTGAGGTTAATTTGCAGGCGCGCGCTATTGAGCGTGGGGTTAGCGCCGTCTACGCCAACAAAAGTCGTCAGGCTTTGCACCGCCGGGTCCTGTAATATCCGCTCCGCCACCTGGCGCTGACGTTGCGCCATACTGGCATACGATGACGATTGCGGCGCCTGCAGCGTCCCCTGGATAATGCCGTTATCCTGTACCGGAAAGAATCCTTTCGGGATGACTATCCACAGCATAAC [...]
+CCAGCTTTTGGCTGGTCTCACTCAGGCTGTGGACCAGCGAAGGGGAAGTGTTGGAAGAGCGCGCGTTCCGGGCAGGGTTAGCCGACTCCGCGCTGCATCACGCGCTTGACCGACGGGTATTCCATGAGTTTTTCCACCATGCGGCGACCGCCGTCGCCAGCAAGGGATTAAGCGTTGCGCTGCCGCTGTCCGCCGCGGGATTATACAGCGCGACCCTTATTGATGAGCTGCTGGAACAACTGGAGCATAGCCCACTGCCGCCACGGTTATTACATCTGATTATCCCGGCTGACGTTATCGTTAAGCAGGCGCAGACCGCCGCTGCGACTCTGCGAAAACTGCGGCAACGCGGCTGCCAGGTGATTCTCAGCCATGTCGGGCGCGATTTACAGCTGTTTAATTTACTGCCCCCGCATATCGTCGATTATTTACTGCTGGATAGCGACCTTATCGCCAACGTTCATGAAAGTTTAATGGATGAAATGCTGACCT [...]
+NODE 716 8951 509206 502484 0 0
+TTTTCGTCAGACAGCGGCGCATCGGAAGCGCCAAAATCAACGGTATTCGCGGTGATTTGTTTCACGCCGCCGGAAGAGCCTATCCCCTGGTAATTGACTTTGTTACCGGTTTCTTTCTGGTAGGTATCCGCCCATTTGGCATACACCGGCGCAGGAAACGTTGCACCGGCACCTGTCAGGCTTGCTGCTGCAAAGGCAGAGAACGCGCTCATCGATAAGGTCGCGGCGACAACAGTTGCGACAGTGGTACGCATAACTTTCATAATGTCTCCTGCACGGTTTCGGTAAATCGTTGTTTGAGTTGCTACGATGAGCAAAATAGGACAAATTGATGACAGTTATATGTCTTGATTATGACGGTTTGATGACAATGGAAATAAAAAAGCTGGCCCGGGGAGACACCAGACCAGCCTGCAGGGGGAGATGAATTAGACTGTTTGCGCAACCGCAGACGGTTTCAACAGCGCGTACATCAGGCCGCAGGCAATAGTG [...]
+TGGAAGATATAGCTGGTTGGTTGTTCTCGGCGCTTTTATGCTGGTGGGAATGCTGGCGACCCGTCTGGCGGATAATGCGGGGACTAATCAAACGCAACTTATCGGGCTGGGGATTTATGTGTTGGCAGAATCCTTGATTTTTGCCCCCCTGTTAACGCTGGCGGCTTATATTAATCCGTCCATCATTGGCGCGGCGGCTATTACCACCCTGTTGCTGGTCGGCGGCCTGACGTTTACCGCTTTTTCCATAAAAAAAGACTTTTCTTTTCTGCGCTCGTTTCTGACTATGGCTGGGTTCATTGCTTTTGGCGCGATTATTGCCAGCGTCATCTGCGGCTTCTCGCTGGGTGTCTGGTTTTCTGCGCTAATGGTACTGCTGTGCGCCGGGTTTATACTTTACGATACTTCTAACATTATTCACCATTACCCTACCGATCGCCCTGCTGGCGCGGCATTACATCTGTTCGCTTCTATCGCGACCATGTTCTGGTA [...]
+NODE 717 3191 147443 144646 0 0
+TGTTCGCTGGCAGGTACGCTGGGACTGGGCAAACTGATCGGCTTTTACGATCACAACGGCATCTCCATTGATGGCGAAACCGAAGGCTGGTTTACCGACGATACCGCCAAACGTTTTGAAGCCTACCACTGGCATGTCGTGCATGACATTGACGGGCACGATCCGGAAGCGGTGAAAAAAGCCATTCTCGAAGCCCAGAGCGTAAAAGATAAACCTTCGCTAATTATCTGTCGGACGGTGATAGGTTTTGGCTCGCCGAATAAAGCCGGGAAGGAGGAGTCGCACGGCGCGGCGCTGGGCGAAGAAGAGGTGGCGCTGACCCGCCAGAAGCTGGGATGGCATCATCCGGCGTTTGAGATCCCAAAAGAAATTTACCGCGCGTGGGATGGCCGTGAAAAAGGCGAGAAAGCGCAGCAGCAGTGGCAGGAAAAGTTTGCAGCTTATGAGAAGGCTTATCCTGAGCTGGCCGCGGAGTTTACCCGCCGGATGAGC [...]
+CCGTGTTATTGCTTAACTATTTACAGACGTCTCATCTAATGGACTGAAAAAAAAGAAATATATTTCTTTACACAAAAAAGACCAATCCGATAAATCTGATTGAGAACCCTGAGGCGCGCAAGGAAGATACCGCCTTAGCTGTGTTGTTCTGAATCTGGGGTTGTTCCGTTCATGCGCTACCGCGTTATTCTTTTTTGTCTGTTTGGCCTGTTGCCGGTCCAGCTACTGTGGGCTGCGCCAGCGCAACGGACTTTTTCCGACTGGCAGGTCACCTGCAATAACCAAAATTTTTGCGTAGCGCGCAATACTGGCGAACATCATGGGCTGGTGATGACATTAAGCCGCAGCGCCGGGGCGCGTACCGATGCGGTACTGCGTATCGATCGCGGCGGTTTGGCGCCGCCCGACGCTAAAGAAGCCGCAATTGCGCCTCGCTTATTGCTGGATGGCAAACCGCTTTCGTTCAACAGTCCACACTGGCGCGTGTCGCCC [...]
+NODE 718 3611 185950 185148 0 0
+CTGCTGGCGATTAATTTTGACCTGGTGATGGCGACGGCGCTGATTAACTTTGGTGCGCTGGTCGCGTTTACCTTTGTTAACCTGTCGGTGATTTCGCAGTTCTGGATCCGTGAGAAGCGTAATAAAACGTTGAAAGATCACTTCCAGTATCTGTTCCTGCCGATGTGCGGCGCGCTCACGGTTGGTGCGTTGTGGGTTAACCTGGAAGAGAGCTCAATGGTACTGGGCCTGATCTGGGCGGGTATCGGGCTGATTTATCTGGCGTGCGTAACTAAAAGCTTCCGCAACCCGGTTCCACAGTACGAAGACGTCGCGTAATCGCACGTATTATCGGCAATAGTAAAACCGGAGGCAGTGCCTCCGGTTTTTTGTCATCCAGCATGTTTACCGGATGGCGGCGTCACTCTTTATCCGCTCTGGATTAACAATGCCCGTCAGGCATTGGTCAATTACACAATCTCAGTTGCGTACTGCCACAGTGATTTCAGCAAC [...]
+GACTGAGAGCGCTGTGGATGGTTTTTTAAATCATGAACATAATAATGGTAAAAGTATTCTGATGACCATTAACAGCCTGCCCGATAAATACAGACAGGAAAAAGTCCGGGCAATGGAAGACCTGGTGAAGTCATTTCGGAGTGGCCGCTTATCAGAGGAACGTATCCGGCCAGTTGAAAGTTCGCTGGTGAGCGTACTGGCCCACCCCCCCTATACGCAAAGTGCGCTTATCAGCGAGTGGCTCGGGCCTGTTCAGGAACGTTTTTTTGCCCACCAGTGCCAGACCTATAATGACGTTCCCCTGCCGGCTCCTGACACATATTATCAGCAGCGCATACTGCCTGTGTTGCTGGATTCGTTTGACAGGAACAGCGCCGCCATGACCACTCACAGCGGACTCTTTAATCAGGTGATTTTACACTGTATGACAGGCGTGGACTGCACTGATGGCACCCGCCAGAAAGCTGCAGCGCTTTATGAACAGTATCTTGC [...]
+NODE 719 3858 196790 194724 0 0
+CCGTCGCGACGCGGCGCGAAGTGGTAATTAATGGGTTTACCGCAGGCTTTACTAAAGGCGTTGACCACATCCAGGACGCTACTGCCGACACCCGCGCCGAGGTTATAAATATGTACGCCGGATTTGTCCGCCAGTTTTTCCATCGCCACGACGTGCCCGTCGGCTAAGTCCATAACGTGAATGTAATCGCGTACGCCGGTGCCATCCTCGGTCGGGTAATCGTTGCCGAAAACGGCGAGCGATTCGCGACGACCCACGGCGACCTGGGCGATATAGGGCATCAGGTTATTCGGAATACCTTGCGGATCTTCTCCCATGTCGCCCGACGGGTGCGCGCCGACCGGGTTGAAATAACGCAGCAGCGCAATACTCCACTCCGGCTGGGCTTTTTGCAGATCGGTGAGGATCTGTTCTACCATCAATTTACTTTTGCCGTAGGGGCTTTGCGGCGTGCCGGTAGGAAAACTTTCGACGTAAGGAATTTTGGGCTGA [...]
+CAGATGCCGCCACGTTAAAGGAAGGCGATGACGTGATTGCCTGGTTTAATGCGGACAGAGTGATTATTGCAACGTTGTGCTAAGCACATTGACATCCGTTGCCGAAAGACGTATCCCTGTCATTCATCGCTGCAAAAAATGGGATGCAAAATGTCATCGTTGCAAATTTCGCAAGGCACGTTTCGTCTGAGCGATACAAAAACACTTCATCTGGATTCGCTGACGCTCAATGCGGGCGATAGCTGGGCATTCGTTGGGGCTAACGGGAGCGGGAAGTCGGCGCTCGCCCGCGCGCTGGCGGGTGAACTGCCGTTATTAACTGGCGAGCGCCAGTGTCGGTTTACCCGCATTACTCGTCTGTCCTTTGAACAATTGCAAAAGCTGGTCAGCGATGAGTGGCAACGTAATAACACCGATATGCTCAGTCCTGGCGAAGACGATACCGGGCGCACTACCGCGGAAATTATTCAGGATGAAGTTCACCATCCTGCC [...]
+NODE 720 1427 82848 81563 0 0
+GACCTTTATGGCGAGGCGATGTTGAACATGGCGAATTCGCTTATTCGCCAGCCTCAGATAAATCGCACGCACCTTCAGGAGGCTGGTCTTACCGCGCGGCAAGCTGAACGTTTTTTACAGCTTCCAGCAGGTGTGCTTGATGAGACGTTACGCTGGCTTGAACTACCGCAGCACCATTTTCTGTGTGCGGATAGTGAAATTTATCCTCCCCAACTGCGTGCTATTGACGATTATCCCGGCGCTATTTTTATTGACGGCGATCCTGCCTGTCTGCATACCTGCCAACTTGCCGTCGTAGGGAGCCGGAGCCACTCCTGGTATGGAGAACGTTGGGGACGTCTGCTTTGCGAAAGCCTTGCGAAAAGCGGTTTGACGATCACCAGCGGCCTTGCCCGGGGAATTGATGGCGTAGCACACAACGCCGCGGTGAGTATGGGGGGAAAAAGTGTAGCGGTGTTAGGGAATGGCTTGGCAAAGATTTATCCTCGCCGA [...]
+TCAATCACCATTTCTCGTGTTTCGAGGTTTAGCACCTGAATCTGCTCAAGGAATAACAGGAACCCCCGGCAACTGGCATCAAGCCTTTCACACTCTTCAACCGTATAAATGCGCATTGAAAGAGGGTCGGAAGCAAGTTGCATGGGTTCCGCGAGGCCATCCTGATAGTCAGCGAGTTTTTCCAGCCACAGCAGCGCATTGTAGATGTCTTCGCGATCAAACCCAGCGTCGGTGAGATCACGCTCCAGTCTGTCCTGATCCACGCGCAGCTCGGCTTCGTTATGGATGTATGTTTCAAACAAATACATTAGTACGTCGAACATGGCTTGCCCTCCTTAATCGGACATAGCCGCCGGGTACAGCTGCGATCCATCCTGCTAACTCCAGTTCGAGTAGCTGAGCCACTACCGCTGGCACAGGTTGGCCGGCACGTTCAGCGACGACGTCAACAGGTGTTACCTCATCTCCTACGTTAGCCAGGAGCTCAGGAAA [...]
+NODE 721 5046 259417 258016 0 0
+GCGTCAGCCTTCAGCCACAACGTGACGTCCAGCGGATCTTTCTCGCGATATTCGAGAATGATGAAATTGTTGCGATCGACAAAATCGGTGCGGCTGCCCATTAAGGAGTGCTGAATTTTAACGTTTTCCGGATCGAGTTGCGCCGTCAGCGGCGTGCCTATCTGGTAGTTCACGGTCGCGTTAACGCTAAAATCGTTACTATCGCCAGTACCGGCTTTGTAATCCGTACCAACCGTGACCAGCGGTACCGGCGTATATTCCAGCCCCAAAGTGACGGCATGAGGATCTTTTTGCAGATTATCGGTGCCAAACAGCGCTACTTCATCGCCGTAGTACTGTTCGTAAACTAATTTAGCGCCAAGCTGCGGATAAAACGGCAGCCAGCTTTCCATGCGGATATCCCAGCCGCGCGCGGGTCGTTCTTCATAAAAGTCGAAATCTTCGGAGTCTTTCCAGTCAGAAAGAGGATGGTAATAGTTGCCGGAGAATTTC [...]
+GCGTGCTGCTTCTCTGGCGTATCAAAATGCGGTGACGGCGGTAAGCGCCGATAAGCCGGATAGCATTCCCGCCGCTGAAAAATTCGCGGCTGAGAATAAAAATACCTATGGTGCGCTGGCGTCTATGGAACTGGCGCAGCAGTTTGTGGATAAGAATGAACTTAAAAAAGCCGAAGCCCAGTTGCAGCAGGGGTTGGCGGCCACCAGCGATGAAAATCTCAAAGCGGTGATTAATCTGCGTCTCGCTCGCGTTCAGTTGCAGCTTAAGCAAGCTGACGCCGCGCTGAAAACTCTGGATGCCGTTAAAGGCGAAGGATGGACGGCCATTGTCGCTGATTTGCGCGGCGAAGCGTTGCTGAGTAAGGGTGATAAAAAAGGCGCGCGCAGCGCATGGGAAGCGGGCGTCAATAGCGATGCTTCTCCGGCGTTGAGCGAAATGATGCAGATGAAAATCAATAATTTGTCCATCTGAGAGGGACCCGATGCAATTGC [...]
+NODE 722 7119 432604 425220 0 0
+GGGCTAATTACTCGTTAATTAGTTTTGAATTGAAGAGGGCGCTTCGGCGCCCTTTTTGTTGCCTGCTATTTAGCCGCTGTTATATTTATTTGCCTTTTTTAACGCTTCTCCCGTGGCGTAAATCGCTTTGTGCTATTGTAATCATAACCATTCTCATTTACACTTTGTGCGGAAATTGAACGGGAGCGATCATGTACGTTTGTTTGTGTAATGGTATAAGCGATAAAAAAATCCGCCAGGCTGTACGACAATTTCATCCGCAGTCATTTCAACAGTTGCGTAAATTTATTCCTGTGGGAAATCAATGTGGTAAGTGTATTCGCGCCGCGCGAGAAGTGATGCAGGATGAGTTAACGCAAATGCCGGAATTTAAAGAGATCGCCTGAGTCACACTCTTTTTTTTGACATCCCTGTAGCCCCATCTACGCTCTAGAGAGTGGAAGCGGAGGGACTATAAAATGAAAGGTGATGTTAAAATCATAAATTATCTCA [...]
+CACATCACCTTTTTTGACCTTACCACGCGGAATCGCTTCTTTGATGGTGATCTTAATGATGTCGCCTACGCCTGCGTAGCGACGGTGCGAGCCACCCAGAACCTTGATACACATTACGCGACGTGCACCGGAGTTGTCGGCGACGTTCAGCATAGTCTGTTCTTGGATCATTTTAGTGCTCCGCTAATGTCAACTACTACTGAGACCCGAAAATCAGGTCGTTAAAAAAACCCCATATCGAGGGCGCGGCATTATAACACCGCAAATCAGATATGGGTAGAAAAAATAAACGGCCCATCGCTGAGCCGTTTATTCGTTGAGAATGCGTACTGTATTACAGAACCGCTTTCTCTACAACGCGAACCAGAGTCCAGGATTTGGTCTTGGACAGCGGACGGCATTCGCGGATTTCAACCACGTCGCCGATACCGCATTCGTTGTTCTCGTCATGTACGTGCATTTTGGTCGTACGCTTGATGAATTTACCGTAGA [...]
+NODE 723 4308 239834 234769 0 0
+GACCAGCAGCGTAGGTACGCTCCTGATAGTTAACGGTCAGTGGGAAGAAGTCCTGGCCTGGCTTGGCTTTTTTCTGGCCGACAACGGTAACGAATACGGCGGTGTCATCCATGCTTACCATAACAGCGGCAGTGGCCTGACGCGCCATCATGCCAGTTTCCAGCGTAACGGTATGCTGACCGTACTGGAATTTACGAACGATCGGATTAAGCAAAATAATATCCTTTCCAATTTTTGACGGCATAATACGCGCCGTCGTTAATACCCGATCTTCTGCGCATCCTCGCGACTAATGACAACCCTAACCCTGATATGGGTAAAGCCTCTCATTAGCCGCGCGAACCTCTGCAACGGAAGATCATTCATAGCAACAATACATTAGTTTCCAGCGAATTGCTGCCATCTGCTGGAAAAAAGGGGCCATGAAGGCCCCCTCTTTCTGAAACTCGAAAGAATTAGCGACGCAGACCCAGACGCTCAATCAGCGCGGTG [...]
+AAGGCGGCAAGCGTAAAGGGTCTTCTTTACAGCAAGGCTTCCAGAAGCCCGCTCAGGCCGTTAACCGTGACGTGGTGATCGGTGAAACCATCACCGTTGGCGAACTGGCGAACAAGATGGCGGTGAAAGGTTCTCAGGTCATCAAAGCGATGATGAAGCTGGGCGCCATGGCCACCATCAACCAGGTCATCGACCAGGAAACCGCACAGCTGGTTGCCGAAGAGATGGGCCACAAAGTTATCCTGCGTCGTGAAAACGAACTGGAAGAAGCGGTAATGAGCGACCGTGATACCGGCGCTGCGGCTGAACCGCGCGCTCCGGTTGTGACCATCATGGGTCACGTTGACCACGGTAAAACCTCTCTGCTGGACTACATTCGTTCCACGAAAGTAGCCTCTGGCGAAGCGGGCGGCATTACCCAGCACATCGGTGCTTACCACGTTGAAACTGACAACGGGATGATCACCTTCCTGGACACCCCAGGTCACGCCG [...]
+NODE 724 51 2083 2023 0 0
+TATCATTAGCGCGACAGCGAAAAAACTCGGCATGTCGATGGACAATGTCGT
+ACGCAGGTTAGCCTGATGCGGCACCAGCCAATCGAGTTCTGAGCGATCCAG
+NODE 725 1556 96471 94975 0 0
+CTGTTCAACGATTTTCTGAAGGCGCAGGAGTATTCATTACTGATATCCTCCATTGCGCCTTCGGGAACCCACAGGACCAGCTATTTTACCGATAGTGTTTAAAAGGCGTAAGTAATGCCGAGCATGAAGTCATTGGAGGCAGCCTTTGTGTCTGCATCATAAGCGGTATGTTCATCACCAGCATAGTGATTTTTTGAAATGCTTACTTTGCCAGCATTAATGTATTTATAACTGGCGTCAATCATAATATTATCTGTTACAGCATATTTTGCACCGATACCTGCGCCCCAGGCAAAGTTATTTTTTGAAGCAGACAGAGTTTCATTAATACCAAAACCAACAGGAATGGTGTTATTACTTAGCTTCACATGAGCGAGGCCAACGCCTGCGCTGATATAGGGAGTAAATGCCGTACTATTGTGAAAATCATAATAGCCATTAACCATGTAAGTGGTCATTCGGACCTGATTTTTTACATTTATGTGTACTGGA [...]
+TTCTTTTGGCGCTTTCGCCACCGCTGTCCCCAATCCTCCCCTGCCCGCCCAGGATCCTATTGTCCAGCATCTGAAGCTGACAAACGATCAGATTACCCGGATCAAAAAACTTCACCAACAACTGGAAACCGACGTCAGTCAGATTTCTATGAAGGGAATTAAAGACGGTGCGCTGATAGAGGTGATTAAATCCGGTAAATGGGATGACGCCGCCGTAAAACAGCAGCTTGCAGCCTTCAGTAACATAGAACAACAGGCTCGCTATTATCGGGTTAAATATTATTTTGATTTAAGCAAAGTCTTAACACCAGAACAGCGTCAACAGGTACAACAAGATCTCGCCCAGGCACTTGAGTAAATATTTTTGCCCGTTATTCCTGGATAACGGGCTTTATCCAGGTCGGGTACAAATTCATCTTCATCTTTTTGTTACAGCATCGCTCTATCTAACACTACCCGTTACATAACGTAGAAGTGAAACCGTACGTGGGG [...]
+NODE 726 127 8116 8116 0 0
+ACTGGGATAGGCTCTAAGATAATTGCTCGCCATTCGTGGGTAATAAGAACGGTTAATCACTCCCTTATCAGGATATCTTCATGAAAAACTTTGTACGCACAACTTTACTGGCAGCGACTCTGGCGGG
+GATATCCTGATAAGGGAGTGATTAACCGTTCTTATTACCCACGAATGGCGAGCAATTATCTTAGAGCCTATCCCAGTAGGCGTTATTGGCGCAGCCAGTTTGGACACGGACAGCGCGCAAAAACCGG
+NODE 727 10378 586697 577500 0 0
+ACCATAAGTAAAAATTGTGTCTGAGAGGCATCCATCTTGATAGTAAACAGATCCTGATGAGCCGGGCAGGCCAGATGTTGTAGCCGTTTAAAGGCGTAAATTTTATTTATATCCTCTACGTTAACTTCCATCTCTCCAGGTTCACCACGGCCCTGTCCGTGAATGATGGAGTGTAACACTTCCAGAGCATGGTCCTTTTTTTCCGCTCTAAAATGATCCTGGACTTTATCCCAGCCCCCCATATGGATTGCTTTTTCTTTATCTGCGCTTAACAGATGAGCAAGCCGACTTTCATTAAGCGTATAATTTTGATGATTACCGAAGCTTAAAGTGACTGGCATAATATTTTCCTTCAAATTTATATTATTCAATATCCGGAGTAAAATATATCGTTCAATTCTCTCTTTTTTATTAAACAGATAAAGTTTACTACAGGAGAGAATTTGAACGACATTATTAATACAGCACATTTATGGTTGGTAATCCTTTGTG [...]
+TTTATCCCCGCTGGCGCGGGGAACACTTACTGTCTGACATAATTTTCCTCATAAATTTCGGTTTATCCCCGCTGGCGCGGGGAACACGTTGCGGCGCTCGGTGCGCGTCAGCCAGCCCTCGGTTTATCCCCGCTGGCGCGGGGAACACGATCAGATGTCCGGCGGGCTGGGTGAAGGCGGCGGTTTATCCCCGCTGGCGCGGGGAACACGCCGCTTTTTCCAGGGCTGAACGGTGGGCGCGCGGTTTATCCCCGCTGGCGCGGGGAACACGGCGATTTCCGCAATCATTTCGGCGGTCACGTCGGTTTATCCCCGCTGGCGCGGGGAACACTCCGATTTAAAAAACGTGAATATTCCTACCGTCGGTTTATCCCCGCTGGCGCGGGGAACACCCAACAAACACCCGGGGAAAAGAGGGGGGATGCGGTTTATCCCCGCTGGCGCGGGGAACACATTATCACGGGGCGCCCCGGAGGGGCTGAGAGCGGTTTA [...]
+NODE 728 3244 182690 179897 0 0
+GGGACTGGGACAGCGCCTTGTGGATGATCGGCGGCCCGATCTTCTTCTCGTTGCTGGCGATGGCGATTTATCAGAATTACAGCAGCCGCATGAGCGCTGATCCGGAGTGGGCGGCGGAGTAATCTTTGTCCGGATAGCGTTAGCTCATCGGCTTTATGAAAAGGATATTTATAATGAGTCCGAAAATGTTTGCATTGTGCGCTATCTGGATTTTACTGGCTATCCCACTCATCGCTGTATTTTCAGTCCTGGATAAAGAGTGGATGATTGGCGAGAGTGGGATAACCAACATTTGTGATGTGATGAGAACTGTCGAAAATGATGATTCCAGAGGTTTTGGCGCGATGATGACGCTGCCCCTGTTTTTCCCGTTTTTTTACGTTACTGTGTATAAGAAAATACGTAGTTGGTTTTTGTACTGTGTCGCGTTGGTGATATTTGCTTACTGGTCCTGGCAATTCTTCTTGCGCTATCAGTTTTGTGTGTGATCTA [...]
+AACAGCCTGCGCCAACGTGAAGCGGAACGCGCGCTGGAAAGCACTGAGCTGCTGGCGGAAAACAGCGCCGGTTTGCCGGAAGGCATCGTCGAACAATTTAAAGTCAACCGCGAGCTGTCACAGGCGCTCAATCAACAAGCGCAGCGGATGGATCTGGTCGCCTCGCAGCAGCGACAGGCCACCAGCCAAACGTTACAGGTGCGTCAGGCGCTCAATACGCTGCGGGAGCAGTCGCAATGGCTTGGCGTGTCCAACATGCTTGGCGAAGCGCTGCGCGCGCAGGTCGCCCGTCTGCCAGAGATGCCTAAGCCGCAGCAGCTTGATACGGAAATGGCGCAGCTACGCGTTCACCGTATGCGCTATGAAGAATTACTCAATAAGCAACCGCAGCTACGGCAAATACGTCAGGCCAATGGACAGCCGCTGACCGCCGAGCAAAACCAGATTCTTGACGCCCAGCTTCGCACTCAGCGCGAGCTGCTCAACTCTTTG [...]
+NODE 729 1708 81635 80993 0 0
+AGCCCACGAGAATATCCGCCGTCCAGCTATTTCCCTGCTCATCAAACACCGTAACGTCATCCGGCGTCTGGCGGATATCGACAATATGGGTCGAGGTACGATACTCCACGCCAGGGTGCGTCAGCGCCGCTTCCCATACCGTTGCATGAATATCTACCCGGTGAATTACCGCATACGGCCCGCCAAAATGGTCGCGGAACGCCTGTCCGGTTTCAATGCATACCACTTCTTCGGCATTCACGGCATCCATCATGGTAATGTGATCGGTAAACACCGCACGCTGGCGGGCAACATCGCCCCCCCCGAGACTATCCAGCGCCGAAAAAGCGTTCGGCCCAAGCTGAATACCCGCGCCAATCTCGCCAATTTCGTGCGCTTTTTCCAGCAGCATGACTTTTATTCCCTGGCGCGCCAGCGACAGCGCGGTCGCCGCGCCGCCGATTCCGCCACCTACAATAATTGCGCTTGTCACGTGAGTCATGGTCATTCTCC [...]
+GCGGAGGGGGATACCCTGGAACTGCCGTATCCGGCGCAGACCGATAACTACCATTATGAAATTGAGCTGGTGGTGGCGATTGGTAAAAAGGGGAGCGATATTCCGCTCGAAAAAGCCCATGAATATGTCTGGGGATACGCCACCGGTCTGGACATGACGCGTCGCGATCGTCAGATGGAAATGCGTCAGATGGGACGCCCGTGGGAAATCGGCAAAGCGTTCGATCTCTCCGCGCCCATTGCGCCATTACACAAAGCCGCTGAAACGCATAATGTGGATAACGCCCCTATTTGGCTACAGGTTAACGGCGAAGACCATCAACGCAGCGATATTCGTCACCTGATTTGGTCGGTGAATGAAACCATCAGCTATTTGTCCGGCTTTTTTGAATTGCAGCCAGGTGATTTGATTTTCACCGGTACGCCAGAGGGGGTGGGCGCAGTGGTGAAAGGGGATGTTATCACCGGGAACGTAGAAGGTCTGACGCCGATT [...]
+NODE 730 12497 652032 646201 0 0
+TTATAAGATTCGAACCTGCCGCAGGTTCGGGTCTTGCCTGATGCGCTGCGCTTATCAGGCCTACAGACGACACCGCACACGTAGGCCGGATAAGACGTTAATCGCCATCCGGCACAGACGACACCGCACACGTAGGCCGGATAAGACGTTAGTCGCCATCCGGCACAGACATCATACCGTCAACGCCGCCACCAGTTTCTCCAGTGCTGGCGTTGCCTGCTGCTGGTCATACACAATATACAAATCCGCCGGAATACGTTCCTCTAACGGACGGAACACCACACCCGGCCAGCTCATTTGCGCATAGCCATCAGCCATCAGCGTAATCCCGATCCCCATACTGATCATCGCCAACACCGTTTGCGGCTCAACCACTTCCCGAATAATCATTGGCGAGAAACCCGCCTGTTGGCATACACGTTGTAAAAATCCCCAATCAGAATGTACGGAAGGCAACGTAACAAAATATTCATTGCGCAACGCCGACAGCGG [...]
+GCCTTTTGCTTCTTTAACAAACTGAGCAGCAGGGCGGGTGTGCAGACCGTTCGGAGCGGTAATGGTAACTTCTTGCTGGAACATTGTATTTCCCCAACTTATAGGTTTAGTGTTGTGGAACTAAAGTCTAGCCTGGCGGCTCAACTTTAGCCTGTATTGTTAGCGCCGGCGTAAACGGGACGCGACACAAAAGGTGTTCTACGCAATCCGTTGCTGGCAACTTATGGCCGCTGACGTTTCGCTCGTCATTAAACATTATGCCGCGAAAGGAAGATTTGAACCAAATCATAAAATCGATTCAGCTAACGCTTTTCCTGTAACGATTAATTTCGCGCATCAAAATAATTAGTCTGGTTAAATACCAGTTCCGGCAGGGTGAATCAATGCCAGGTGAGGTGAAAGTTTGAAGCAGGCCACAAAAAAGCACCCAAAAAGGTGCTTTTTTACGCGTTTTTAACATGCTGGCATCACTGTTGCAGTTCTTTCTCAGTA [...]
+NODE 731 1163 68137 67597 0 0
+TGGTCTTCGAGTTCACCGACACCCAGGGTGTGATGGGGATGCACTACGCGCGTCACGATGGTGAAGCGGAAGATGTGGCCGTGGCGCTTAACGAGCAGTATCAGCCGCGCTTTGCCGGTGATGACCTGCCGTCTAACCCGGTGGCCTGTGCGTTGGCGATCGCCGATAAGATGGACACTCTGGCGGGTATCTTCGGTATCGGTCAGCATCCGAAAGGCGACAAAGACCCGTTTGCGCTGCGTCGTGCCGCGCTGGGCGTGCTGCGCATCATCGTTGAGAAGAACCTTGTTCTTGATCTGCAAACGCTGACTGAAGAAGCGGCGCGTCTGTATGGCGACAAGCTGACCAATGCCAACGTAGTCGATGATGTGATCGACTTTATGCTGGGTCGCTTCCGCGCCTGGTATCAGGATGAAGGTTACACCGTCGACACCATCCAGGCGGTACTGGCGCGTCGTCCGACCCGTCCGGCAGATTTCGATGCTCGTATGA [...]
+TCAGGTGGGGCTTTTCTCTGTCTGCCTTTTGATGAATATCTGAGACAAACAGTCTCAAGCACCCGCAGCTATTCTAACGCCAATATCCGTACCGCCAGCGTTAATGTATTCATGAAATATTTTTTGCCAATCAATAGAAATAACCGCGTCTATGAGTTACAGAATTATTAGCGAATCGACTGATACTATTTATGTTATAAAAAAACCTGCCCGAAAGCAGGTTTTTGTTTAATTAACTGAACGCTTATTGCAGTAACGAAATATCTGCAACCTGCAGGAACAGTTCGCGTAGTTTCGACAACAGCGTCAGGCGGTTGATACGGATATCTTTCTCTTCCGCGTTAACCATGACATTTTCGAAGAATTCATCCACCGGCGCGCGCAGAGCAGCCAGCTCAATCAACGCTTCCTGATAACGACCATCGGCAAAGTACGGCTGAAGCTTATCACGCAGCACAACCAGATGTCTGGCCAACTCAATTTCCGCCGCTT [...]
+NODE 732 1 211 211 0 0
+C
+G
+NODE 733 5 1619 1619 0 0
+CAGGA
+GTATA
+NODE 734 1 333 141 0 0
+A
+G
+NODE 735 3 951 613 0 0
+TCG
+TAT
+NODE 736 11 4130 4060 0 0
+AATTATTTTGG
+GCATAGATAAC
+NODE 737 326 22619 22560 0 0
+TCAAATTCAAAATTTACTTATTCTGATATATCTCATTTACATTTTGACGAATGCCGATTCACTTATTCGACACTGAGTGGTGTAGTCTGCAGTAATACGAAATTTAGTAATTCAGACATGAATGAAGTGTCTTTACTGTATTCAATTACTACACAACAACAGCCCTCTTTTATTAATACAACATTAAAAAATACGCTTATACCTTACAAAGCCAACCTCTCCGACGTTATTTTAAATGAACCGGATAATTTATCACCTCCGTCAGTGTCAGGGGGCGGAAATTTTATTCGTCTAGGTGATATCTGGCTGCAAATGCCACTCCTTTG
+GCCCCCTGACACTGACGGAGGTGATAAATTATCCGGTTCATTTAAAATAACGTCGGAGAGGTTGGCTTTGTAAGGTATAAGCGTATTTTTTAATGTTGTATTAATAAAAGAGGGCTGTTGTTGTGTAGTAATTGAATACAGTAAAGACACTTCATTCATGTCTGAATTACTAAATTTCGTATTACTGCAGACTACACCACTCAGTGTCGAATAAGTGAATCGGCATTCGTCAAAATGTAAATGAGATATATCAGAATAAGTAAATTTTGAATTTGAAAAGTTGAACCCCTTGATAATATCGCCGTCTCGCTTCATGAAGCTGGGGG
+NODE 738 51 2783 2736 0 0
+TTCTTCGCGCACGCCCTGATAGCGCTCGTTCATCACCCATGTGCCATCTTT
+ACCTTCCTCTTTTGCGTCATACGGTACCTGGGCGCGGACGGCGGATAAACT
+NODE 739 10 542 523 0 0
+ACCTTCACAA
+TGATGAACGA
+NODE 740 19 936 905 0 0
+GAAAAAGATGGCACATGGG
+TCCGCACAGGGCAGCACGC
+NODE 741 1104 57529 56868 0 0
+TGGAAATGCGTGGTAAATTCATGCAGGAAGCGGTTCCGGAAGGTACTGGCGGCATGTCTGCGATCATCGGTCTGGATGATGCCTCTATTGCTAAAGCCTGTGAAGAATCTGCCGAAGGGCAGGTTGTTTCGCCGGTTAACTTTAACTCGCCGGGACAGGTGGTTATCGCCGGGCATAAAGAGGCGGTAGAACGCGCGGGCGCAGCCTGTAAAGCCGCTGGCGCGAAACGCGCGCTGCCGCTGCCGGTGAGCGTACCGTCGCACTGCGCGCTGATGAAACCAGCGGCAGATAAGCTGGCGGTTGAATTAGCCAAAATTACCTTTAGCGCGCCAACGGTGCCGGTAGTGAACAACGTTGACGTGAAATGTGAAACCGATGCTGCCGCTATCCGCGATGCGCTGGTTCGCCAGTTGTACAATCCGGTACAGTGGACGAAGAGCGTGGAATTTATCGCGGCGCAGGGCGTTGAACATCTTTATGAAGTGGGTCCAG [...]
+TAGTTTGCCTGACCTGCATTTCCCATGGTACCAACCACAGAACCAATAGTGATAATGCGACCACAACGCTTTTTCATCATAGCGCGCATTACCGCTTTTGACAGGCGGAAAACGGATGATAAATTGGTTTCGATAATATCGTTCCACTCATCATCTTTCATTCGCATCAACAGATTATCACGAGTGATACCGGCATTATTAACCAGGATATCCACTTCACCAAATTCTGCGCGAATATTTTCCAGAACAGATTCAATAGATGCAGGATCGGTCACATTCAACATCAAACCTTTCCCGTTAGCACCTAAATAGTCGCTAATGTTCTTCGCACCATTTTCACTGGTCGCAGTCCCGATAACTTTCGCGCCGCGGGCAACGAGAGTCTCTGCAATTGCGCGGCCTATGCCACGGCTTGCACCAGTCACCAGCGCAATCTTTCCTTCAAAGCTCATGGTTTTCCTCTTTTATTGCGTAAGTGCCGCAGACAGCGCC [...]
+NODE 742 162 63096 51901 0 0
+CCAGCCACACTGGAACTGAGACACGGTCCAGACTCCTACGGGAGGCAGCAGTGGGGAATATTGCACAATGGGCGCAAGCCTGATGCAGCCATGCCGCGTGTATGAAGAAGGCCTTCGGGTTGTAAAGTACTTTCAGCGGGGAGGAAGGTGTTGTGGTTAATA
+GCCTTCTTCATACACGCGGCATGGCTGCATCAGGCTTGCGCCCATTGTGCAATATTCCCCACTGCTGCCTCCCGTAGGAGTCTGGACCGTGTCTCAGTTCCAGTGTGGCTGGTCATCCTCTCAGACCAGCTAGGGATCGTCGCCTTGGTGAGCCGTTACCTC
+NODE 743 12 4563 4471 0 0
+ACCGCGGCTGCT
+GTAAAGCGCACG
+NODE 744 9 3611 3541 0 0
+GGCACGGAG
+TTACTGGGC
+NODE 745 23 9377 9193 0 0
+TTAGCCGGTGCTTCTTCTGCGGG
+GAGGGTGCAAGCGTTAATCGGAA
+NODE 746 2070 91608 90896 0 0
+ATGATGCGCCCGTCGTCCATTACGATGATTTGATCAAAACGGGCCAGGCCGCGCAAACGGTGAGTCACCATCAGGACGGTTTTCTCGCGCATCACATCAGCAAGTAATTCCAGCATTTCGCTCTCGGTGGTCGCATCCAGCCCCTCAGTGGGCTCATCCAACAGCATCAACGGGGCATCGTGCAACAGCGCGCGGGCGATGGCCAGGCGACGAAGTTCGCCGCCGGATAGCAGACGACCGCCTTCGCCGAGCCAGCTATTAAGCCCACTATCTTCGAGCAGATTTTCGAGGCCGACGCGACGCAGCATGTCGGAAAGGGCTTCGTCGCTGGCATTGGGCGCCGCCAGTAATAAATTATCACGCAGCGTGGCGCTGAACAGGTGGACACGCTGCGGCACCACGCTGATAGTCCGGCGTAAGGCGGATTCGCTCAGCGAGGATAGCGGAAGATCGTTGAGCAGAATTTCGCCTTGTTGCGGGTCCCAGGCGCGG [...]
+TTTTACCGCTGCTGCCGCAGGGAGTAGACACCCCGCTCGGCAATCATGCCAGCAGACTTTCCGTCGGCCAGGCACAGCGTGTAGCGGTCGCCCGTGCGCTACTTAATCCCTGTCAACTGCTACTGCTGGATGAACCAGCGGCAAGCCTGGACGCTCACAGCGAGCAACGCGTCATGCAGGCGTTAAAAGCGGCGTCAAAACGCCAGACCACATTAATGGTGACGCATCAGTTGGAAGATCTCGCCGACTGGGACGCTATCTGGGTTATGCAAGATGGCGCGATTGTCGAACAAGGCAGTTATGCCGAACTCAGCGCCGCCAACGGCGCTTTTGCGACGTTATTGGCTCACCGTCAGGAGGATATTTAAATGCGCGCGCTACTCCCTTATCTGACGCTTTATAAACGCCACAAATGGATGCTAACGCTGGGAATTGCGCTGGCAATCCTGACCCTGCTTGCCAGTATCGGGCTGCTGACGCTTTCCGGCTGGT [...]
+NODE 747 6222 349151 344299 0 0
+AAAATTGCCATAAATAACAATTGGTTGTTTTGATATGTTTTGAAAGGTTTTACTTCGTTTTTAATTTAATTTAGGAGATTTACTTCCCAATACAGAAGCTGGAGAAAATCCGTCCCAGCAGGTCGTCGGAGGTAAACTCGCCGGTAATCTCGCTTAAGCTTTGCTGCGCCAGGCGCAACTCTTCCGCCAGCAGTTCCCCCGCCCATGCGCCTAATAGCTGCGCTTTGCCCTGCTCAAGATGGTCAGCGGCTTCCGCCAGCGCCTGTAGGTGACGGCGGCGGGCCAGGAAGCCGCCTTCCATATTGGTATCAAACCCCATGCTCTGCTTGAGGTGGTTACGCAACACGTCGACGCCTTCGCCGGTACGCGCCGAGAGGCGAACCAGTGAGTGACCGTTTACTTCACTAATACCCAACGTTTCGCCGGTGATATCCGCCTTGTTACGTACCACGGTAATCGGTAGATTTTTGGGCAGACGGGCGATAAAGTCCG [...]
+CGGTCAGAGAAAGCGTACCGTCCGCTACCTGGAGGAGCAGGTTACCGAGAATCGGCAGCGTAGGACGACCGCCCAGCGGGCCGCTGACCTGCTGAAGCGGTTTTAATAAATGTTCACGTTCAACGGTAAATTTCATAGGATCACGACGATAGTGTTCTGATTAAATTCGAAAAATCTTCTTTGATATCGTGGCTTTCTTCACGCAGTTGCTCAATTTTACGACAGGCATGAAGTACGGTAGTGTGGTCGCGCCCGCCAAACGCATCGCCGATTTCCGGCAGACTGTGGTTGGTGAGCTCTTTTGCCAGCGCCATAGCCATCTGGCGCGGACGTGCTACCGAGCGAGATCGACGCTTAGAAAGCAGATCCGCAATTTTGATTTTGTAATACTCGGCCACCGTCTTCTGAATATTGTCGATGGTGACCAGTTTTTCCTGCAACGCCAGTAAATCGCGCAGCGCTTCGCGCACAAAGTCGATAGTAATCGCCCGG [...]
+NODE 748 2 383 383 0 0
+CA
+AA
+NODE 749 15 5303 5180 0 0
+GCGCGCAAAAACCGG
+GGTGGGATAGGCTCT
+NODE 750 6 2579 2331 0 0
+AGCGTA
+ACGCCT
+NODE 751 9 3406 2964 0 0
+CACGTAGTA
+GCGCCAATA
+NODE 752 7 3100 2743 0 0
+CGTGAGG
+ACTGGCT
+NODE 753 54 5243 2659 0 0
+GAACGCCGCTAGCAGCGGCCCGAAGGGCGAGCGTAGCGAGTCAAACCTCACGTA
+GTTCAAAACGCTAACGCGTTTTGGCGAGCACTGCCCAGGTCCAAAATGGCAAGT
+NODE 754 7 1796 1171 0 0
+CTACGTG
+TAGCGGC
+NODE 755 2117 119808 119029 0 0
+GAAGCCGACTTCAATCTTCGTATGTGAATAGCGCAGCGCATTACGAACAATATTTTCCAGCGCGCTTTCCAGCGCGTTTGGGTTGCCATAGAGCGGCCACGGCCCCGGCGGATAATTTACCGTTAACGACTTGCCCATCTGTTCGGCTTCAAAGGCGGCGTTATCCAGCACTTCGCCCCATAGCTGATTGGCTTTCATCGTTTCGCTGACCAGCGCGTTTTTCTGTTGGTTACGCGACATCACCAGCAGGTCATTGATCATGCTGTCCAGACGCTGCGCTTCGGTTTCAATACGCTCCAGCTCTTTGCTTTCGCCGCCACGACGACGCAGCAGCGCGGTACCCAGTTGCAGGCGCGTAAGGGGCGTTCGCAGCTCATGGGAGATGTCTGACAGCAAACGCTGCTGCGAGGTCATCATCCGTTCCAGCGCCGTCACCATCTGGTTAAAACTGGCGCCAGCGGCGAGGAACTCCTGCGGACCCGCCTCCAGCTC [...]
+CGTCACCGGGGTGCCAGTTATCGCTTGTAACAACTTCAGCTGCGTGGCTTAAAAAACTGAATGCCAGCGTTGAGGCCATAACAGCAGCGGTAACTTTGCGCATCGCTTGCTCCCAAAATCTTTTCTGTCGCGATTCAACGAGAGACAGTTTACGATTCGGGCTGCAAACATGCGTCAGGGGGTGTAAAACAACGTAAAGTCATGGATTAGCGACGCCTGATGACGTAATTTCTGCCTCGGAGGTACGTAAACAATGAATAAAATCCTGTTAGTTGATGATGACCGAGAGCTGACTTCCCTGTTAAAAGAGCTCCTCGAAATGGAAGGTTTTAATGTCCTGGTGGCCCACGACGGCGAGCAGGCGCTTGAGCTTTTGGATGACAGCATCGATTTACTTTTGCTTGACGTCATGATGCCGAAGAAAAACGGTATCGATACGTTGAAAGCGCTTCGCCAGACACACCAGACGCCTGTCATTATGCTGACCGCGCG [...]
+NODE 756 9252 525811 521433 0 0
+CATGGTCACATACATCCGGAAGGCGCAACGTCAAAAGCGTATCAGGATGCCCATGAACGCGCCCATGCTGCCGATATTCAACGCCGTTTTGATGGTCAAACAGTGACTAATGGACACATCCTACTGTTCGGCCTGACCGGAGGGCTTATCCCCTGTCCGGCTGCGATCACCGTTTTACTGATTTGTATCCAGCTTAAAGCGTTTACGCTGGGCGCCACGATGGTGCTGAGCTTTAGTCTTGGCCTGGCATTAACACTGGTGACGGTAGGCGTTGGCGCGGCGATAAGCGTTCAACAGGCAGCAAAGCGCTGGAGTGGTTTTTCGACGCTTGCCCGGCGGGCGCCCTATTTTTCGAGCATTCTGATTGGTCTGGTCGGCGTGTATATGGGAATTCATGGCTATACCGGGATCATGCAGTAAATATGTAACGCTTCTGCTCAGGCCGTATCATTCACGTCGGGTTTCATTCCAGAAGCGTTTTTACTTATCAAA [...]
+TCAGTGAACTTCTATTTTTGTCAGTTTTTATTTTTCAGTTTATTTATTATTAAATACTGTTTCTGGCCTGGATATATTTTCGTGAATAGCCTCCCGACAGCCGCAGACAAAGATATTTGCTGGCGTAACAGCGCTCATAATTTAAAAGATTTATTTATAGTTTGTTATCACGGAAAGATTTTAACTTAATACATGCCAGTAAGGCATCAGGTAAAAATAACCGGAGAGAAGAAGATGAACAAAATGCTATTAGCCGGAAGTGCCGGTATTGTTCTGCTGTCTGCTGCAGCCAGTCCGGTATGGGCAGACGATAATGCCAGTACATTTTCACTTGGATACGCCCAGTCCCATACTAATCACGCCGGGACGTTGCGTGGGGTACGGCTGGCAAACAACTATGAAATGTCACCGGACTGGGGGCTGACAACCTCATTTGCATGGCTAAATGGAAGCCAGCGCTATTCCGATGAAAGCAGTAATGGTCGTGTAACA [...]
+NODE 757 340 5468 5468 0 0
+GGCTGGAGAGGTTAAGAAATCTATTGATAGCATGAGTGGTGAGTGATTTTTTAAATTTAAAGGACTGATATGAAAAAGATACTTTTTTGTTCGCTGCTTCTTCTTTCTGCAAGTTCATTTGCACAACAATTCCATTATCAGTGTGAAGGACGAGATTTAAAGATAATGCTTTCACCTAATGCAGCTTTTCTTGATGGTAAATCATTCGAATATAAGAATGGAGAGACGAATGGGGAAACGACAAAGATGACATTCTTTGGTCCTTCTGGTGAGGTTCTAAAGTTTTTGGTTAATCCTGTCAATAACTTATCTCGTATGCCGTCTTCTGCTTGAAAAAAAA
+ACCAAAAACTTTAGAACCTCACCAGAAGGACCAAAGAATGTCATCTTTGTCGTTTCCCCATTCGTCTCTCCATTCTTATATTCGAATGATTTACCATCAAGAAAAGCTGCATTAGGTGAAAGCATTATCTTTAAATCTCGTCCTTCACACTGATAATGGAATTGTTGTGCAAATGAACTTGCAGAAAGAAGAAGCAGCGAACAAAAAAGTATCTTTTTCATATCAGTCCTTTAAATTTAAAAAATCACTCACCACTCATGCTATCAATAGATTTCTTAACCTCTCCAGCCCTCTCGACTAAAGCATGATTTCTCTTCAGCATAAATGTATAGCCGATCCG
+NODE 758 3293 222287 220832 0 0
+AGTGAACCAGACATGGTGTTCAAGAAGCTTGCTGTGAACGATGAGCGCACATGTTTTCTCGGGTGGGAGCTGGAATATATCCAAAAGGGGGCTTTTCTATCAAGATATTTTTTGTTTTGGAGTGACATGTTTATATTGAAGCGCAACTGCTGGATGGGATATTTTATTATGATATCCCATCAATATTTAAATAGGTGAGAATAACTAATTCTGATTTTTAAACACATTAACTGAACTATCCCAGTTAACTCCTCAATAATTGTTTGTAATATTTCCTTGACTAAATGAAGGGAATAGTTTAAACCCTTGAAATGTGTATTTTTTCATATTAAATAAAGAATATTTTCCTGAAAGATTGACCGCGCTGAATAAAGATTCTGAGAGGATTATATATTTTCTCAGCCACATTTTTAACTCTTCTTCTGTGCTTATGCAAATCTGAAAGTTGTTATCTTTACCTTTTATATAAAAATAAGGAACTTGACAGGTAGG [...]
+GTTATCGGCTTTGCCACTCAATGGTTTAGGAACCATCCAACATCTTGTTATCACGGAATTTTATGACAACCATTTCCAGACGATGCTGTAATAAATACCGTCAAAATGATGAAATTTGTGATATTAATCATGTTGTTATAATGGTTTACAAACTCGCTCTTTAAATTCGTATTATTGCCGTACAACACGCATTAGGGCTATCAGGCCATTATCAGACGCTTAAACAGCAGCTGCTGCACGTCCTGCCGATGTGCCAGGATCGCATATGCTGTCACTAACGTTCCGTCTACGGAATACAAAACCCGGTAGCCTTCAGCGTGGTTAAACTCCCGGTATTTGGCGCAGCCAATTTTCAGCAATTCGGGGCAAATCTGGCAGCCCAGCGGGAACTGACCCACGGTACTCTCAAACTGGGTGAGAATATCTGCGATAACCGGACGAGGCTCAACATCAACACGCTTCAGGAAACTCGCTATTGTGTCGATACAGTGC [...]
+NODE 759 25 10759 7470 0 0
+GCGTACTTTGCAGTGCTCACACAGA
+ACCGCAGGTTCCCCTACGGTTACCT
+NODE 760 10 4051 2805 0 0
+CTGATGAAAA
+AAGGAGGTGA
+NODE 761 2 511 265 0 0
+GT
+GT
+NODE 762 147 10232 10232 0 0
+AAATAGCAAGGCGTTTACGCGTTGGGAGTGAGGCTGAAGAAATAAGGCCGTTCGCTTTCTATTAATGAAAGCTCACCCTACACGAAAATATCACGCAGCGCGTGATAAGCAATTTTCGTGTCCCCTTCGTCTAGAGGCCCAGGACAC
+TGCGTGATATTTTCGTGTAGGGTGAGCTTTCATTAATAGAAAGCGAACGGCCTTATTTCTTCAGCCTCACTCCCAACGCGTAAACGCCTTGCTATTTACTTTTCATCAGACAATCTGTGTGAGCACTGCAAAGTACGCTTCTTTAAG
+NODE 763 19 3826 3734 0 0
+ACCGCCGTGAAAGGGCGGT
+CTTGCGCGGTAATGTGTGA
+NODE 764 1723 84717 84013 0 0
+CGTTTCGGCTCCGGCTGGGCGTGGCTGGTGCTGAAAGGCGACAAACTGGCTGTGGTTTCTACCGCAAACCAGGATTCCCCGCTGATGGGTGAAGCCATTTCCGGCGCTTCCGGCTTCCCGATCCTGGGTCTGGACGTGTGGGAGCACGCTTACTATCTGAAATTCCAGAACCGCCGCCCGGACTACATCAAAGAGTTCTGGAACGTGGTGAACTGGGACGAAGCAGCAGCGCGTTTCGCCGCTAAAAAATAATTTGCATTGCACGTCTGTAGAAGCGAGTCTGATGACTCGCTTTTTTTGTATCCGCGTAAGGAGCAGCAGATGCATTATCCGGTTGACGTGTTTATTGGCAAAATTCGTGACTATGACGGCAGCCGCCCGAGCGCTATCGCCAAGGTGCAAATCGACGGCGAACTCATGCTGACCGAGCTGGGTCTGGCAGGCGATCAGCAGGCCGAAAAGAAAATCCACGGCGGCCCCGACCGCGCGCTA [...]
+CGTCAGCCCTGAAGACCGCGAGCAGATATTCCGTCCGTTCTATCGCACTGATGAGGCGCGCGACCGTGAATCCGGTGGTACTGGCCTGGGTCTGGCGATTGTCGAAAGCGCCATGCAGCAGCACCGCGGCTGGGTTAAGGCTGACGATAGCCCGCTGGGTGGGTTGCGGCTCACGCTGTGGCTACCGCTGTACAAGCGAACCTAAAAACCATCGGCCTGCGAATGCAGGCCGATTTTTTATCTCGCCATCAAGATTTACCGGGAAATGTCTGGCGCTAAAATCCACTCGGCGCTGTCGTTCCACACGTCCATCCGGGTAATTTTGCCATCGCGCACTTCGAAACGATCGATAAAGCGGTTATCGGCAAACGGGCGACCGTCGGGCCATTCGCCATACAACGTACCGTTGGAATAAATCACAACGTAATCATCATGCTGCACCGCATCAAACTCGCCCAGCGCCTTCTTTACCCACTTGTAGCGAGCGCCGTT [...]
+NODE 765 4319 227178 222552 0 0
+GGAAGTGGGCACTGGTTACTTCGACAAAGTCACCACCATTATTCAGGGTGGCGCGTCATCCGTTACCGCGTTAACGGGTTCCACCGAAGAATCGCAGTTTTGATTGATGCCCGGTGGCGCTGCGCTTACCGGGCCTACAGATAGCGTAGGCCGGATAAGCGAACGCGCCATCCGGCAGGACGTGGTGCCGGATGAGGGGAAAAAATGCCGCGTGGCCTGGAATTACTGATTGCTCAAACCATCCTGCAAGGCTTTGACGCGCAGTATGGTCGATTTCTGGAAGTGACTTCCGGCGCGCAGCAGCGTTTTGAACAGGCCGACTGGCACGCCGTCCAGCAGGCGATGAAAAGCCGTATCCACCTCTATGATCATCATGTGGGTCTGGTGGTGGAGCAACTGCGCTGTATTACCGATGGCAAAAGTACCGACGCGGATTTCCTTTTACGCGTTAAAGAGCATTACACCCGGCTGTTGCCGGATTACCCGCGCTTC [...]
+TAGCATTCGGCAATCCGCGACAGTTCCTGGACGTACTGGCGCAGTTCATCTGGCCCCAGCGCGCAGTTAAGGCCAAAAGTGAGCGCCTCGGCGTGGCGCAGCGAGTTATAAAAGGCTTCGGTCGTCTGGCCGGAAAGCGTACGGCCAGACGCGTCGGTGATGGTGCCGGAAATCATGATCGGCAGATCAACGCCCAGCGCTTCAAACTCTTCTTTCACCGCAAACACCGCCGCTTTCGCATTCAGGGTGTCAAAGACGGTCTCAATCAGAATCAGATCTACGCCACCTTCCACCAGCGCTTTAGTGGATTCACGGTAGGCCGCCACCAGCTGATCGAAGGTGATATTACGAAACGCCGGGTCGTTGACGTCCGGCGAAATGGAGGCCGTGCGGTTAGTTGGACCAAGCACGCCCGCAACAAAGCGTGGTTTTTCTGGTGTTCGCGCCGTCCATTCATCGGCGCAGGCGCGTGCCAGTTTGGCCGCCGCATAG [...]
+NODE 766 76 10734 10734 0 0
+CATGATGAGACAAAAGGGAAAATCTCTGGAGGAAATCAAAGATTTTCTGGATCTGACAGATGAGCAGTTGCTGCAG
+GAGATTTTCCCTTTTGTCTCATCATGAGCACTAATCTGGAGCGCTCTTCAGCACGACCTTTCTCCAGACCTTTCTC
+NODE 767 84 5051 4953 0 0
+GTCAGCTCAATATCTGTCACTGCCAGAAACTACCAAAAAAACGCCTGCACAAGGCAGGCGTGGTGTAAAAGGGAACAGAGTCTT
+GGTAGTTTCTGGCAGTGACAGATATTGAGCTGACTGGTAAATCAATCACACTGACGGATAAGTATGGCAGCAGCGTTCACCAGA
+NODE 768 4419 278918 277261 0 0
+CCCCCCACCACCAGATAATACAAAACACGCCTCCCGTGGCTGGCCACCAGACCCTGAAGCATTGATTCGCCCAGGCTGGTGTGACAACTGGCCATCAGATATAGAGAAACCAGATTTTTGGTGTCAAGTATGTGGTTGTTAATTTTTTACAGAAAACTATAACAACCATATCAGAACTGAGAGTATATCTGGTTATTATGTTTCATCAATTCCTGATGAACTGAATATGACTTCAGGCTGGCGTGTTTTATTAACGTCAGCCTGATTTTTTACAACATCATATGACTGACTTCCAGGCGCAGCCAGCGCGTTCTATATCTAAGCTGGTGATTGTAACGACCCCGACAGTACTTCTGCTTCACCGTTATGGCAGATATCATCGCCTCTTGTCAGATGCCAGACACCTACTCATACTCAACCAAAGCTCTAAATACAAAAATCACCTTATATCTTTTTTTATTATTCCTTGTATAAATGTGACTTGACTCACAC [...]
+TAATTTAAAACATTGCGTTCATGATCTTTTTTAACATTATGTTTTTTAAAGTTTTTTAATATAAATGGTGGTGTTGTTTCATAATACTGTCTGAAAATCAAGCGAAGGAAGTGTCAAACGTGTGATTTTACTGGAAGCGATAACCGCTAACGGTTAATATCGTACCAGAAGCACAAATTGTATCGCTTCTGTCCGAGATCCTGGTACGAAACTGACTCACTAACTTTCAACCAATCATCGTAATGTAGTAACTGGAGGAGCTATGGCTACCAACCCAAGAGAGCACGCCCGGCGAGTGCTGGACACGTTCTGGTGCGGGCGCGGTTTCCCTGTTGATCCAGCTAAGATTGCGAACGACATGGGACTTGATGTCTTTATAACTGAAATGCCTGGCAAGGTTTCTGGTGCCTTGATAAAGCAGAAAGATCAGGATCCAGCGATCTTCCTGAACAGCGATGATAATAAGGTCCGTCAACGTTTCTCATGTGGTCA [...]
+NODE 769 1530 92450 91286 0 0
+AAATGCGCTGTTCTTTGCCGTTGTGCGTCAACACGACGTTGCGCCAGTCCGCCATATCGGTCAGACCGCCCGCGGCGTTAATCGCATCCAGGACGGTTAGCGGTACGTTAGTAATGGCCTGCTGACCGGATTTATTCACCTGGCCGGAGATATACGCTTTTTGCGAGCGGAAAGCGGCGATATTGACATCCACCTGCGGGTCCGCGATGTACTTCGCTAAACGCCCGGTAATATCGCTGCGAATCTCTGACAAAGTTTTACCGACGACGCTAACCTTGCCAATGTAGGGATAAAACATGGTGCCGTCCGGCTGTACCCAGTTGCCGGTATCGCTTGAGCTACGGTACTGGCCTGCTGGCGTGGTCAATTCCGGGTGATCCCAGACGGTGACATTCAGCACATCGCCAGGCCCGACGCGATACTGATAGCTGGCGATCTCCTGGTCCAGCGACATATTCGGTTGCGCGACATTGGGCCGCGGGCGTAATTGCT [...]
+GGTCGCGCTGCCCCGGCGGTAGTTTTTCAGCGAGGATGGCAATAAAGACCAGGTTATCAATGCCGAGAACAAGTTCGATAACGATTAACGTCACCAGTCCGGCCCAGATTGACGGATCGGCAATCCATTCCATAGTAAGAGCAATACCTTCTGTAATATGACAATTGTCACAATTCGATCATGGATAATACGGCGGAAAAATGCAATGCCGCAGAGCAATTTATCTTTGTTACGCGGCTATAAAATAACTTTAAAATAGCCGTAATGTTTCTGTCGGAAACTAAATAATGTCAAGAATATATTTAGGAAATATCGCAGGTGGAGTGGGGTAAATAAATATTGTCAACATCAATAAAATCCTAAAATCATCTGTTAATTCATTTAATATTAATCTTAAAAATATAGAATGGCGGGTTTGTTACCTTGCCTGTCATTAGGTTAGCTGCAACAATTCTTGCAGGATTAAGATAGCGCTCTTAAATATCCTGTCAC [...]
+NODE 770 3022 147467 146233 0 0
+TACGGCCAGGGCGAGGAACCCTTTAGTTAATACACCCAGACCGCAGGTTGCGCCCAGTAGCAAAAACATCCCAATCTTGCCCGTTCGGGTCGTGGCCTGCATCCCCTGCCAGAAACAACACATCCCGGCCGTAAGCCAAAGCGCGATCATCGGGTCGAGTGCCGCATACGTCCCGATACTGTAAACGGCAAAGAGGGAGAGAAAGATAACGGAGGCGAGCAACGCGGTACGTTTATCCCGCCATAAGCGGAACGTCAGCCACGCCACCAGCGCTGCAGCCAGCAATGTCGTTAAAATAGCGCCAGCCCGCACGCCAAAATTGGTAGCGCCAAAAAGCCACTGACCCAGACAGTTTATCCAGTAACCGGCTATCGGTTTTTCAAAATAACGTAATCCCAGAAAATGCGGCACGATCCAGTCGCCAGACGCCAGCATCTCCCGACTTATTTCGGCATAGCGCGTTTCATCCGGCTGCCAGAGCAGGCGGCTATT [...]
+CGATGTTGCGCTTACCCTGCATCATAAGCTATGTCAGGCCGCGCGCCAGTTGCTTAATAGCATCCTGCCCACCATGAAATGCGGCGATATACCTTCTGTTCCCCAGCGTGAGTCTGACGCTACGTATTATGGTCGCCGCAGGCCGGAAGATGGCCTTATCGACTGGCACAAACCGGTTTCCACGGTGCATAACCTGGTGCGGGCGGTAGCCGCCCCCTGGCCCGGCGCGTTCAGCTATAACGGCTCGCAAAAATTCACTATCTGGTCTTCCCGAATTTGTCCGGATGCGCAGGGCGCGCTTCCCGGCTCGGTAATTTCGGTCTCTCCGCTGCGGGTCGCCTGCGCCGATGGCGCGCTGGAGATTATTACCGGCCAGGCCGGAGACGGTATTACTGTACAGGGCTCGCAGCTTGCACAGACGCTTGGTCTGGTGGCGGGCGCGCGTTTGAACCGTCCACCAGCGACCAGCGGTAAACGTCGCATTCGCGTTCT [...]
+NODE 771 11 392 374 0 0
+GCCTCTTCCGG
+AAGACAGGCGA
+NODE 772 3017 160668 157916 0 0
+ATGGCGGCATGGTCGTTCTGAAGTTAACCAGCCGATACCCGGATCTAGCGCGCGCTGCTATCGTCGGCGGCGCAACGCATCGCTTTGCTACGACCCATTACATGTAGGGGATGGAAATTTTTTATGGTAAAGGAATGCCTCAGGGGCAATTGACGGATCGCGATCTGGATAAAATGGCTTCGGATGCGCCCGGGATGGTTAAATTTTATCAGAACATGCATCATCCAGAGCAAAAAGACTACTGGCGCACGTTCCTCAAAGGTGTCTGGCCAATGTGGACAACGCCCACATCGCTGGCGGAAGAAGAGGTGAAAAAAATCCACATTCCTGTGCTATTACTGGACGGCGACCGGGATGAATTTTTCACCGTTGAAGAAGTTACCGAGCTGTACCGGCTGCTGCCTCAGGCGGAGATGACCCTCATTCCCGGTAGCGGTCACGCCATTTTCCAGACGCCAGGAAAAACACCGCTGTTTTACGCATTAGTGCTTG [...]
+CAAAGCGGTCGCGGTCGGCCCAGGACGGGTTGGTCGGGTTGTGGTTCAGGAAATCACGCCACAGGACTTCGGCAATGTCAGCCATACCCATCGGGGCACCCGGGTGACCGGATTTGGCTTTCTGTACTGCGTCCATGCTCAGCGCACGAATAGCATTGGCAAGCTCTTTACGTGAGGACATTTTGACTCCAGATCGGATGTTGAAAGGCCATGCCCGTAACGACTTGACGACAGCGCGTTTTGGGCTACGCCGGAAAATTTGCCAACAATTTACCCCAAGCCGCGCGTCATGTACATGGAACATCCTTTTACCGCTTCAGAAATCTCCGGATCGTGCTCGTATGTTGCGCAATTAGCTAACTTGCCTGCCATGCTTTTCTTTATACTTAACCCAGGCGCTAATTCATCTGCAACGGGCGCATTTCAAAATAATATTGATTCGTATGGAAGAGAAAAATGAAAATTCGCGCTTTACTGCTTGCTTTGGGCATG [...]
+NODE 773 8577 434152 428842 0 0
+CGCCTCGCAGATCAACCTGCTGCACACCCTGCCGCCCGCAGAGAATGACACGGAAGCACCCGTTGCCCCACCGGCGGATTTCCAGAACATGATGAAGAACTTACTCAAGCGTTCCGGGAGATCCTGATGCGCCGTTTGTTATTCCTTTCTCTGGCGGGTCTGTGGCTTTTTAGTCCCGCCGCCGCTGCGCAACTGCCGGGGCTTATCAGCCAACCATTAGCGGGCGGAGGCCAAAGCTGGTCATTATCCGTCCAGACGCTAGTTTTCATCACCTCGCTGACGTTTCTGCCGGCGATTTTACTGATGATGACGAGCTTCACACGTATCATCATTGTTTTTGGCCTGTTGCGTAACGCGCTGGGCACGCCCTCGGCACCGCCAAATCAGGTGTTACTCGGGCTGGCGTTGTTTTTGACCTTTTTTATTATGTCGCCCGTCATTGACAAGATTTACGTGGATGCTTACCAGCCGTTTAGCGAGCAGAAAATTTCT [...]
+GCGACAACCGGATTCACATAGGCGTAGCTGGTCGCCAGCGCCGGACTGACGTTGCGAATCAGGTACATATAGGCATTAATGGCGATAATAGAACCGAACAACGCCAGGTAACCGACGGCCATAAACCCCGATAAACCAGGCAGCGTGGCGAGCTTTTCGCCGGAAAGAAACGCCGCGCAAAGCAATACCACGCCCGCCGCCAGCATTTCAATCGCGCCCGCCATCATGCCCACAGGGAGGGCGATGCGCGAGCCGTAAACGGAACCAAATGCCCAGCTCATCGAACCTATCAGGATCAAAATCGCGCCCCACGGATTGCCGCTTAAATTACCGCCGCTGTTCAGCAGAATAATCCCGGCAAGTCCAATGGCAATCCCCACCCATTCTAATTTGCGCGTTTTAATACCAAAAAAGTAGCTAAAGCACAGCGTAAATAGCGGGACAGTGGCGACCACGACGGCAGCAATGCCCGATGGCACGTTTTGATGCTCC [...]
+NODE 774 8 3454 113 0 0
+AATTGCTG
+AGCCGCGG
+NODE 775 15 927 927 0 0
+CGGGGAGCTGCTGCG
+CAGCGCCTCCGCGTA
+NODE 776 146 5042 5042 0 0
+TCAGCTGGTGAGCCGCGACCACACGGATATCCGGGTGTTAAGCCTGTATGCGTTCAGCGCCTTTGAGCAGCAGCGCTTTGGCGAGGCGGTGGCGGCCTGGGAGATGATGCTGAAACTGCTGCCGGCGGGTGACGCCCGGCGGGCGG
+GCCGCCACCGCCTCGCCAAAGCGCTGCTGCTCAAAGGCGCTGAACGCATACAGGCTTAACACCCGGATATCCGTGTGGTCGCGGCTCACCAGCTGACGCAGCAGCTCCCCGCCGCGGCGGTTATCCTCCGGGTCGGACGAGCGCGT
+NODE 777 7483 437507 431963 0 0
+GGGATCGCGCGGCGCCAGCTCCAGCGCCAACCTGCAAGCCATTATCGCTGGATTAATTATCGCGCTTATTGCCGCCATTCTGTGGAAAGGCGCGATTAAACCTGCGGATATCACCTTCCCAGCCGCAAACGAAATCACCTTTTCCCGGCTGTGTACCGCCCTGGCGATCATGTTCTGGGGATTTGTGGGAATTGAGGCTTTTACGCATTTGTCGTCTGAATTTAAAAATCCTGAACGTGATTTTCCGCGCGCATTGATCATTGGCCTGATGCTGGCCGGCGCCATTTATTGGACCTGTACCGCCGTGGTGCTGCATTTTGGCGTCTATAGCGACAAGATAGCGGCAACAGCCTCGCTACCGCTTATTATTGTTCATCTCTTCGGTATCCAGGCGTTGTGGGTAGCCTGCATTATTGGTTATCTCACCTGCTTTGCCAGCCTGAATGTGTATGCTCAGAGTTTTGCGCGTCTGATATGGACGCAAATGCAATA [...]
+GGGCGCATTAAACCGTAAAGGGGCGCGGTCGTCAACGGCTTTACACGAAAAAAGTGATAAAAGCGCGCTGACTGCCTGCTTTTCAGGCAAAATGCATAAAATCAGTACCCGTCAGGTGAGCGCTCCACCCTGACGGCACTGTGCAAAACGCAGAATATCTTCCGCCAACCGCTGAGCGGTATCTACATCAGCCTGACTGCGGTTGACCAGCATTCGGCTGAGACAACCTTCCAGCACCAGCTCCATCTGCCTTGCAACCATCGCCGGATCGTCAATTTCCAGCGTGGTCAGTAGTTCATGGGTAAAATCATGTGCCGCGCGTTTTTGTTGATTAGCCAGTTGGTGAATAGGATGGGTTGGGTCGGGATAAAACGTACAGGCGGCAATGAACAAGCAACCAGGATAACGGTTATTACTGACACATTCCGAAAGCGCGCTGTAGCGTGCCAGTAGCTTTTGTTCAGCAGAAAGCGTCTCATCAAGAAGAAGCTG [...]
+NODE 778 899 45527 44828 0 0
+GCTCGCCCATTAATAACGGCAGTTCGGTGACTTTCACCGGCTCCGCCAGCAGGCCGCCGTCGCTGGCGATCACATAAAGCGGACGATTATCGCTGGCGGCGATATTCAGCGAACGCGCATTACAGCCATTTAGCAAGCGCAGACGTAGCCAGCCTTTCGGCGCGGAATGCTGCGGATAGATAGCGCCATTGGTCAGCAGCGTATCGCCAAACCAGCCGACGGCGGCGGTCATAATATCCAGTTGATAATCAATCTGGCCATCGGCGGAGAAGCGTTTGTCCTGAATGATCACCGGTACATCGTCGATGCCCCACTGTTTCGGCAGGCGCAATTTGCGAATCTCGTCATCTTCAATCAGCACCAGTCCGGCAAGGCCCATCGCCACCTGGCGCCCGGTTTTGCCGTGTTTGTGCGGATGAATCCAGCAGGTCGCGGCGCGTTGCTGCGGCGTAAACGTCACCGTGCGGGTTCCGCCTGCGGGAATAATCCCCT [...]
+AGGAAATGATTATGTTACGCCGTGATTTCTTAAAATATTCAGTGGCGCTGGGGGTTGCATCAGCGCTGCCGCTGTGGAGCCGCGCCGCTTTTGCCGCCGAACGTCCCGCGTTGCCTATTCCTGACCTGTTAACGGCAGATGCGAGCAACCGTATGCAGTTAATTGTTAAAGCCGGACAGTCGACATTCGCCGGTAAGAACGCGACAACCTGGGGCTACAACGGTAATTTGCTGGGGCCAGCGGTACAGCTTCACAAAGGAAAAAGTGTGACCGTTGATATCCATAACCAACTGGCCGAAGACACGACGCTTCACTGGCATGGTCTGGAGATTCCGGGCATCGTCGACGGCGGTCCGCAGGGGATTATTCCCGCAGGCGGAACCCGCACGGTGACGTTTACGCCGCAGCAACGCGCCGCGACCTGCTGGATTCATCCGCACAAACACGGCAAAACCGGGCGCCAGGTGGCGATGGGCCTTGCCGGACTGGTGC [...]
+NODE 779 5036 281944 277779 0 0
+TTATAAAATATAAAAGGGTCGATTTAAATAATTAAATCGACCCACAAGCGGAATACTCTTAATTACTCATCTTCAAGATAAGTATAACCGTACAGTCCCGCTTCAAATTCCTCAAGGAACTGCTGCTGCAACGCATCGTCCAGATCCGTCTGTTTTACCTGGTCGCGGAAATGCGTTAACAGCGTTTTTGGATCCAGTTGCACATATTGCAGCATATCCGCAACGGTATCGCCTTCGTCCGACAGCTCAACCTCGACGCTACCATCCGGGAAGACAAACACGTCAACCGCTTCAGTATCGCCAAACAGGTTGTGCATGTTACCGAGGATCTCCTGATAGGCGCCGACCATAAAGAAGCCGAGCATCGGCGGATTCTCTGGATCATATTCCGGCATCGGCATCGTCGTGGCGATACCGTCGCCATCGATATAGTGGTCAATAGCGCCATCGGAATCACAGGTTATATCCAGCAGCACGGCACGACGTTCCGGT [...]
+GCCATGCGCCGCTGTAGCTGAACGCGGTATCTGACAGATAAGCGCCCAGAATCCCGATGGTGATCATGAGTTGGTACATTGAGATCATACTGCCGCGAATTTTTTCCGGCGCGATCTCGGACAGGTACAACGGTGCAGTGTAGGAAGCGACGCCGACGGCCAGACCCAGCAGCACGCGAGAAATAATCAGGACTTCAACGTTAGGCGCCGCAGCGGAGAACAGCGAACCGGCGACGAACAGGATAGCGCCGATCATCAGGCTTTTTTTACGACCCAGCTTAAAGGAGAGCCAGCCGCTGCCGACAGCGCCGACGGCCGCGCCAAACATCATGGAGCTGACCACCCATTCCTGAGTGTGTGCGGTAATTTGAAACTCGTCGGTAATGAAGGGTAAAGCACCGGCGATAACGCCGATATCCAGGCCAAAAAGTAATCCTGCCAGGGCTGCAAGAAAGCAGACAAAAAATGTCATGGCCTTGTTGGAACGCCCTT [...]
+NODE 780 106 8060 6530 0 0
+CTGGTTAAAGGAACTGGGCAACCCGTATGCGCTGAGTTTATCGGACAGCGACGGGATGCTGGGGCTGGACCTGGGCGTGTACGGCGCGCCGGAAACCTTCCTCATC
+TCCCGTCGCTGTCCGATAAACTCAGCGCATACGGGTTGCCCAGTTCCTTTAACCAGGCCACCGCCTTCGCCCGGTCGTCCTTATAGTTCAGCCCGACCACCCGGAT
+NODE 781 399 19301 19112 0 0
+TGGCGGCTCTTCCCCTCCTGCATCAGGTCATACACCCTGCGGCGCATGTCGGTGGCTATCATCGCGTTCGAGTCCGCAATGCTGTTGTTCTGGCATTTCGGGCAGCGCAGCTGCTCCGTGAGCTGGCGGAACTGCTGCTCCTGCGCTTCATCTTTAAACGGCATCACGTCGGTGGTCGCCCGCGCTGACCCGGCGATAACCAGCGCCAGCATCAGCATCACCATGCCCGGTAACAGTCTCATTGCGCCGCCTCCCGGCTGTATCTGTCCCACAGCGGTTTCAGTTCACTTTCCCATACCCGGGCATTCAAATCGCCCGCATGGCGGTAGCGGATAATCCCCCTGCCGTCGATGAGGAAGGTTTCCGGCGCGCCGTACACGCCCAGGTCCAGCCCCAGCA
+GACGGCAGGGGGATTATCCGCTACCGCCATGCGGGCGATTTGAATGCCCGGGTATGGGAAAGTGAACTGAAACCGCTGTGGGACAGATACAGCCGGGAGGCGGCGCAATGAGACTGTTACCGGGCATGGTGATGCTGATGCTGGCGCTGGTTATCGCCGGGTCAGCGCGGGCGACCACCGACGTGATGCCGTTTAAAGATGAAGCGCAGGAGCAGCAGTTCCGCCAGCTCACGGAGCAGCTGCGCTGCCCGAAATGCCAGAACAACAGCATTGCGGACTCGAACGCGATGATAGCCACCGACATGCGCCGCAGGGTGTATGACCTGATGCAGGAGGGGAAGAGCCGCCAGGAAATCATCGATTACATGGTGGCGCGCTACGGCAACTTCGTCACCTACG
+NODE 782 12540 687709 675680 0 0
+GACTCTTTTCGTTAATGGTGACGATATGCGCCGCCAGCTCCACCTGCGCCACCGGCAGATCCATTTGCGATACCCATTTTTCCAGCTCCGCCAGGGCCGCGCGGTTATCGCGCAACAGCAGGCGGTTGGTGCGCTTATCTACCATGATGGTTCCCTTCGCGCTCAGGAGTTTCTCGCCCGCTTTCGCCAGTTCGCCGGCATCGGCGTATTGCAGGCTAATGCTGCGGTTTTCCAGCGGTAAATTAGCCTGAAGCCTTAACCGCTCGGCATCCTGCCGCGCACTGTGTTCTTTCTGCCAGGCCTGTGAATGAACATGGAAAATATTCCCCTCCTGACGCAGCACCAGCCCCGCGCTATTGACCACCGTCTGTAGCGCCTGTTTCCACGGCACATCCGTCAGATGTAGCGATAATGTCCCGCTGACGTCCGGCGACACCACCAGATTCTGCCGCTCCTGCTCGGCTAAAGCCTGCAAAACCTGCACCACAGGGA [...]
+TTTGACCGACATAATGTGACTGTAATCGCATTCATGTAAGAAAGTTACGTAACACCAACATTAACAATATCGATTCACCTCTCTGCGTTTTTTTCTGAATTATGCATGACGACGCCTGGCGGTGAACAGATGATGCAATAATGCGACTTTCTCATCATTCTGGATAACGACATGGAAAGTGTAGCGCTTTCACGTACTACTCGCTGGGGTATGTTGCTCACCGGTTTGCTGCAGGGCGTCTTGTGCTACCTGCTGATGGCCTGGCTGGTACCACAAAATAGCGACTGGCTGTTCTATGGTATGCCTGCAACGATAGCGTTGTCGTCAATGCTATTGCTTACCGTGGTTTCTTTTAAACAGCGCGCGCTGTGGGGCTGGCTGGGGCTGACCTTTGTGGTCGTGCTGGCAATGAGCGGCTGGCTGAAATGGCAGGTTGAGACGGTGGAGAAATGGCGCCTGGCCGAGCTCCTCTGGCTGTATGGTCTCCGGCTT [...]
+NODE 783 13020 635106 627660 0 0
+ACCTAATAGCCAGCCCCAGAAAATTAACGACAAAAATACCACTAAGGTTGAAAGGCCTAAACCACGTCCCATAATTCGTGGCTCAAGGATATTGCCGAAGACCAGATTAATCAGCAGATAGCCTGCCAGCACCAGCAGCGCATCATAAAACCCGTTAAATACCAGCACCTGAATAATGGGCGGCAGGGCAGCGAGCACCGATCCAATATTAGGGATATAGTTCAGCGCGAAGGCCAGTAGACCCCAGACAAAGGCGAAGCGGACATCCAGTGCGGCCAGCATGCCCCATGCGACCAGCCCCGTCACGATACTGATCGCTGTTTTTAACACCAGATAATGGGAAACGCTATCAAGCGCGCGTTGAATTGCCGCCATGCCTTCCGCCGGACGGCTCATCATCTGCTGCAGTTTTTCAGGCAATTGTGGAACCTCCAGCAGCATAAATACCACGGTCAATAACAATAAAAAGATGGACGACATGGCATTGGACAG [...]
+CGCTGAAAGCGCGTCAGGTCGATCTGCTGTATCTCGGACAACGGCATTTGATGCTGGTCTTTACGTCCATGTTTTTTGCTTTACTGGTCGGTATCCCGAGTGGGATTTTACTCAGCCGACCTGCGGCAAAAGGATTTGCTGAATATGTCATGCAAATCTTTAATGTTGGTAATACCTTGCCGCCGCTGGCCGTTCTGGCCTTAGCGATGGTGATTATCGGGATCGGCGATACGCCCGCCATTGTCGCGCTATTTCTGGCCTCCCTTCTGCCTATCGTCCGCAATACCTATGCAGGCCTCTGTTCCGTCCCCGCCTCACTGATTGAAGCGGCGAACGGGATTGGGATGACAAAATGGCAGCGGCTTCGCCAGGTAGAGCTACCTAATGCGTGGCCAGTGATGCTGTCCGGTATTCGCATCGCGACCGCCATCAATGTCGGCACCGCGCCGCTGGCCTTTCTGATCGGCGCCAGCAGCTACGGCGAGCTGATTT [...]
+NODE 784 3724 204464 202663 0 0
+GCGCTGGGCGCCCTCTCCTGGGCCAAGCGCCAGGGTCTGAAAGTGCCTGACGATCTGTCGATTATCGGCTTTGACAATATCGCGCTAGCCGAGTTTTGCGACCCTCCGTTGACAACCGTGGCGCAGCCGCGTTTTGACATTGGTCGCGAGGCGATGCTGCTGTTGCTCGATCAGATGCAGGGGCAAAATGTGAGCAGCGGCTCGCGTTTAATGGATTGCGAGCTGATTATTCGCGGTTCTACGCGCGCTTTACCCTAAAGTAAATAGCTTTAAGACTCACCTGTCTGGTCAAAGGCCCGCCGCTTCAGTAACATGACGGGCTGACGAACGAATAAATACAGCGAAACGATAGTGGCACAACGAGATTATGTACGTCGCGGCCAACCGGCTCCTTCGCGGCGCAAAAAGAGCACCTCACGGAACTCACGGAAGAAGCAAAGCAACATGCCTGCCGTCTCGCCGGCAATGGTCGCGATTGCGGCAGCCGTCCTT [...]
+TCAGCACGACGGTAATGATTAACGCCCGCTTCATCTCCTGCCGGGTGATGACGCCTTTTTGCATCCCCCGCAGCGGCCCGATGCGATCCGGTTTATCACTGCCTTTGACAGCGTCGCCATAATCGTTGGCGAGGTTGGATAAAATTTGCAACAGCCCGGCGGTGATAAGGGCCAGCAGCGCGACCAGAGGATCGAAATAGCCTTGCCACCATGCCAGGGCCGTACCGACGATAATCGCCGCGAAGGCGAGGGGTAAGGTTTTGGGTCGTAAGCTTTCCAGCCAGGCCTGAGTGCGGCTAATTTGTTGTTGTTCAGTCATATTTAGCGCCAATAAAAATGGGGCTTTTCAGCCCCATCAACAGTGATGAAAATGCATTGGACGCGATTATAAGATAAAACGGCTTAGATCTTCATCTGCGACCAGCGCATCCAGATGTTTGCTCACATATTCCGCATCAATTGTGATGTTTTGGCCGTGCAGATCGCTGGCGT [...]
+NODE 785 48 2699 2699 0 0
+CACTCCCGTCGCGTATCTTATCCCCGTTAAGCATAGTGTCTCATATCT
+GGTGGTGGGGGAAGGATGACTCAGCGCTGCGCGCTTCGCCCTTCGGGT
+NODE 786 4043 196350 194063 0 0
+AAAGGCTTCGGACGTAAACGCGAGATGCTTTGCGGAGTGATGGAACAACACCTCATGCCGACCCTTTCCGCGCCCTGGTTTTACCGCAGCGGAAGCGAAAAACGTGAAACGGCAATCATTGGCGGCGGCATCGCCAGCGCGCTGTTATCACTGGCGTTACTGCGTCGCGGCTGGCAGGTGACGCTCTATTGCGCGGACGACCAGCCCGCCCAGGGCGCCTCCGGTAATCGACAGGGCGCGCTTTATCCGCTCCTTAGCAAACATGACGCCGCCATTAATCGCTTTTTCCCGACCGCATTCACCTTTGCCCGTCGCCTGTATGATGCCCTGCCCGTCTCTTTTGATCATGACTGGTGCGGCGTGACGCAGCTCGGATGGGATGAGAAAAGCCAGCAGAAAATCGCCCAGATGCTGTCCCTGGCGCTGCCCGCCGGACTGGCCTCGGCGCTCAATGCCGAAGAGGCGGAACAGGCGGTTGGCGTGACGACACGC [...]
+AAAGGGCGCCACGATCCGTGTGTGGGGATTCGCGCAGTGCCGATCGCAGAAGCCATGCTGGCGATCGTGCTGATGGATCACCTGCTGCGCCATCGGGCACAGAATGCGGATGTAAAGACAGAGATTCCACGCTGGTAAGAAATGAAAAAAACCGCGATTGCGCTGCTGGCATGGTTTGTCAGTAGCGCCAGCCTGGCGGCGACGCCGTGGCAGAAAATAACCCATCCTGTCCCCGGCGCCGCCCAGTCTATCGGTAGCTTTGCCAACGGATGCATCATTGGCGCCGACACGTTGCCGGTACAGTCCGATAATTATCAGGTGATGCGCACCGATCAGCGCCGTTATTTCGGCCACCCGGACTTGGTCATGTTTATCCAGCGGTTGAGTCATCAGGCGCAGCAACGGGGGCTCGGAACCGTCCTGATAGGCGACATGGGGATGCCTGCCGGAGGCCGCTTTAATGGCGGACACGCCAGTCATCAGACCGGGCTT [...]
+NODE 787 131 7713 7713 0 0
+CTTTCCCACAACCTACGGCTATGCGCGTCACACAGTCCTTCCCCACCAGACTCGGCAGGAAAGGCACTGATTCCCATAACGCATATTTGACGTTTGATGCCGGGTTTATTTGCGGCAGGGCGGCGGCGCAT
+CGTTATGGGAATCAGTGCCTTTCCTGCCGAGTCTGGTGGGGAAGGACTGTGTGACGCGCATAGCCGTAGGTTGTGGGAAAGAAACGACCACTCTCTGGCAGGGAAATTGTTTACCATAAACATTAGGATTT
+NODE 788 51 3457 3407 0 0
+ACCCGTTATTGTCCGCCGGGAAAGCCTGCGAGGAACAAGGCGGTAGCGTAT
+TATGCGCCGCCGCCCTGCCGCAAATAAACCCGGCATCAAACGTCAAATATG
+NODE 789 604 40205 39975 0 0
+CGCCGTCATTGTTGGCTTGTTTTTGCTGTTAGGCGGCTGTTCCAGCGGAATGCAATCTAATAATGGCTCTTCATCCGACGTCGGCACCGCCTGGGGCGGCGACGTGCATTCATCGGTACAAAGCGTTTCGGTAGAACGTGCCGATCGAGAACCTGCCGAAATGGTGGTAATAAATTACTCCACTCAATATCCGTCAGGTTACGATAAAGTTTATAGTATACGTATCAGCGATCTTGAATATGCTGTGCGCGACGCTAATTTTAATTCGATTCCAATTACTCGTCGCTACAACGCATCAATGGGACAATGGCAATATAGTATTCCTGCAAGATCAGGGATGAACTATCAGTTATATATTCGTAATTACAGTCATGATACCAATTACGAAATCGTCGCAACGGTTGATGGCCTGGACGTGTTGAACGGAAAAGCAGGCTCGCTGAATCATCATGGCTATATTGTTAACGCCGGCGACTCACTGGCGATTAAAGG [...]
+CATAAGCGTCAGCTACGTCGGCGAACTGGAATGCCGCCTCAGTGTGTTTATCTTTGCGAAACCCTTTAATCGCCAGTGAGTCGCCGGCGTTAACAATATAGCCATGATGATTCAGCGAGCCTGCTTTTCCGTTCAACACGTCCAGGCCATCAACCGTTGCGACGATTTCGTAATTGGTATCATGACTGTAATTACGAATATATAACTGATAGTTCATCCCTGATCTTGCAGGAATACTATATTGCCATTGTCCCATTGATGCGTTGTAGCGACGAGTAATTGGAATCGAATTAAAATTAGCGTCGCGCACAGCATATTCAAGATCGCTGATACGTATACTATAAACTTTATCGTAACCTGACGGATATTGAGTGGAGTAATTTATTACCACCATTTCGGCAGGTTCTCGATCGGCACGTTCTACCGAAACGCTTTGTACCGATGAATGCACGTCGCCGCCCCAGGCGGTGCCGACGTCGGATGAAGAGCCAT [...]
+NODE 790 1633 97457 96850 0 0
+TGATCAGCAGGACAACCGGTACCATGATCAGCATAAAGCGTATCAACAGCCAGCTCACGCTGTTGACTCCGCGATCGAAAGCCGTCTGGGTACGCGTACCCACAATGGATTTCGCCAGCGAGCCGAACCAGGTACGGCTTCCCGTCGCGACCACGACCGCTTGCGCTCTGCCGCTGGTTACATTGGTTCCCATCAGACAGATATTGCCCAAATCTAACAGGCTTTTATCTTTGTCAGGCAATTGCTCGCTGTCTTTACCTGCCACATCAGCCATAACATCGTATTTTTCTACGGGTAATGATTCACCACTAAGAATTGACTGGCTGATAAAGAGATCGCGCGACGCCAGCAGTCGGACGTCGGCGGGCACCAGATCGCCTGCGGCCAGAAAAACCACATCGCCCGGCACCAGTTCTTCAATGGGAATCTCTTCCTGCACCGCGCCTATATTGCCCGGCCCACGACGCAACACCGTGGCGGTGGTGCGAACCA [...]
+ACTGAACACTGCGGCAACGCTATGGTGTTCGGCGGGCATCGGCGTGTTATGCGGCTTAGGGCAGTTCAAAAATGCGCTGGCGGCGACGATCATTATTCTTTGTGCCAATATTTTATTGCGTGAAGCGGCGCAGCGTATAAATCAACTCCCGGTATCCGCCGAGGGAGAAAAACGTTATATCCTGAAAGTAACCTGTAATAAAGAAGATGAGAGCGCGGTTCGTCAGTGGTTACTGAATATCGTAAAAGAGGCCGCGATCTGTTTACAAGGGTTAGGTTCGGTCCCCGCTCAGGAACAGGGCTATAAAGAAATTCGTGCCGAGCTTGTGGGTCATGCTGATTATCGTAAAACGCGAGAACTGATTATATCCAGAATAGGTGATAACGATAATATCACCGCAATTCACTGGAGCATTGATAGTCAATAATAGTTTTTTATTCAATTTCAACATTACGCCAGGCGTATAAGGAGGGAATGATGGATATTCCCGAG [...]
+NODE 791 296 17999 17944 0 0
+CGCATACCCCAATAAATACATAGCAAGAATATTAATAGCTAACGAAGTTGTGAGTTGGTTCATGTTTTTTATCTGTTACGTATGAAATAAGAATTATCTGCAATGTTAATGCGAAGTGTCAGGCGCAGTCGCCTCGTTGAGTAAAAACTCAACAAGATTTACGGAGTTACAATGATCGATAAATTAGTACTTACGGTTACACCAATTTTCTCCATACCACCGCGTGGTGCAGCCGCAGTAGAGATATGGATGTACCAAGTTGCACGGCGAACAAAAACTACCAAACAGAATCGCTT
+TATCTCTACTGCGGCTGCACCACGCGGTGGTATGGAGAAAATTGGTGTAACCGTAAGTACTAATTTATCGATCATTGTAACTCCGTAAATCTTGTTGAGTTTTTACTCAACGAGGCGACTGCGCCTGACACTTCGCATTAACATTGCAGATAATTCTTATTTCATACGTAACAGATAAAAAACATGAACCAACTCACAACTTCGTTAGCTATTAATATTCTTGCTATGTATTTATTGGGGTATGCGAACCTTTCGACTTTTACACTGATGATGGCCGCAGCGATGTGCTCAATGAA
+NODE 792 4632 290158 281972 0 0
+ACCGCTGCTGACGGAACCGTTCGCGATGATGTACTGAGGGCTATTTTCGACCACGGCGTTAACCAGTTCCAGCATTAACAGGTCGTCGGCAAAAAGCTTGTAGCGAATCAGGTTGATATTGCGGTTGATTTGCTGAACGGCATGTTCGTCGTATTTATTAAAATCGGCGGCAATACAGATTAACCGTGTGCCGGACCAGTCAATGGCTTTGGCCGCGGTTTTACTTATTTTTTCCATCACCAGCAACTGAAATTCCGCTTTATGATCGAGCAGCCAGTCGAGATAAAACAGCCCCTGGTTAATGACGTTTTCATTGCTGTGGCGCTTATATTCAATAATCACCGGGCAGTTATTTTCATCGAGGCCGAGGGAATCAATTCGCCCACGATGGGTTTTACCCGTGTGGTATTCGGTCTCGAGAAAGCGGACGCCAAGGAACGTTTCCATATGGGATTCGATCAGCATTTGCAGATCTTTTTCAATGGCTGCGGC [...]
+GGGAGTGGGTTGCATTACAAGAAATATGTTCATTAGAAAATGGTGACAGAAGTAAAAACTATCCGAATAAGTCAACACTAGTAGAGACAGGAATACCATTTGTCAACGCAGGTCATCTTGAAAATGGAAATATACGACAAGAAGACATGACATTCATTACACCAGAACATTTTAGCATTCTCCGCTCAGGAAAATTCCTCGGTGGTGATATTTTATTTTGTCTTAGAGGTTCTCTAGGTAAATCAGCAATTGTACAAAACCTATCAGGAGCAATTGCTTCATCACTAGTAATCGTTCGTGTTTTTAAGCCTACATTTAATAAATATATTCATTTATATTTCGATGCGCCATTATCTTATGATTTTATAAATAAATATGATAATGGGACAGCCCAACCTAATCTGGCAGCTACAGATTTAGCTCGTTTTTTAGTTCCATTACCACCACTAGATGAGCAATCTCGCATTGTTAATAAAATTACGGAGCTAATGA [...]
+NODE 793 3690 190706 188808 0 0
+GGTGACTGACGATAACCCGCGTACCGAGGAGCCGCGCGCCATTATCAACGATATTCTGGCCGGAATGCTGGACGCCGGGCAGGTCAGGGTAATGGAAGGCCGCGCTGAGGCGGTAACCAATGCCATTATGCAGGCAAAAGACAATGACGTCGTGCTGATTGCAGGTAAAGGGCACGAGGATTACCAGATTGTCGGCACGCAGCGTCTTGATTATTCAGACCGCGTGACCGCAGCGCGTTTGCTGGGGGTGATCGCATGATTAGCGTAACGCTCAGCAAAATTGCCGATGTCCTTGGCGCCGAACACCGCGGGGCGGATCTCACGCTCGATACGGTCATTACCGACACACGGAAAGTGACGCCGGGATGCCTGTTCGTGGCGCTGAAAGGGGAACGCTTTGATGCGCATGATTTTGCTGATAAAGCAAAAGCGAACGGCGCTGGCGCCCTGCTGGTCAGTCGTCCTCTGGATATCGATCTTCCGCAGGTGATT [...]
+GATCCAACGTACGCCGTTATGCTCCAACGCCAGCTGGAAGCGATGCGCCAGACCGGTAAATGTCGTCAACGCCTTCAAACTGCTGGCGCGCGGCAGACCTACGGCATCCGCCAGCGCCAGCGCCGCTAACGCATTGGTATAGTTATGCTGCCCGGGAAGCTTCATCTCTTTCACGTTCAGCACCTTCTCGCCTTTGACTCGCAGCCAGGTTTCGCCCTGCTGACGATTAAGGTGATAATCACCCATATTGACGCCAAAGCTGACGCAGCGCTCATCGGCCCCGCGTACCGGCATCGTCAACGCGTCATCGGCATTCACCACGCACACTTTAGCCTTCTCGTAGACGCGCAGTTTCGCCGCCCGGTACTGTTGCAAACCAAACGGATACCGGTCCATATGATCTTCAGTGACGTTGAGCACCGTTGCCGCCGCCGCTTGCAAACTTGACGTGGTTTCCAGTTGGAAACTGGATAATTCCAGCACGTACAATTC [...]
+NODE 794 4753 272083 267901 0 0
+TAAATTTCTAGTTTAATCTTTGAACCCCGATGTTCCTTTTGGATATTAAATTTATGCTCACATGGCTTTTCACGTTTAAGTATATGCTGAGAGTTATCTTTATTGATCTGATAATACGTACATACTGTAGTAAAAGTTTCCGCAGACTGATAGTTATTATCCGGGTCTCTGATGCCTACATTTCTGGCATTCCTCGCAATAGTCATTCCCGGAAAAGGTGTATACTTTTCAATAGAAAAGCCAAGTCCATTAAACTGCAATTCGTAGGTATCACGAGGTGTTCCAGGCCTGTGCCCAACGCTCGGCGCCGTAGGAGGAGAAAATATCCCGACGGTTGCCGCGGACGTTGTCGACGAATCTGCCAAGACGCTTATCGGCGCAGCCGCCAGAAGCAGGCTATAGATAATAAGATTATGTTTCGACATACGCACTGTTGATCCTTTTTAAAACATTAATTCGCATCAGAGGTTGCGGTATTACCCTTAGCATTTT [...]
+ATATTACCTGATCACTACACCGTACAGTACTGTCAGTAATTTTTCTCCGGTGTCGCGTGCACGCAATTTATTTTTTTCAATTCTTTCAAAACGTTAACTATATTAATAGTCACTTATTTTACCAGAATCAATACTGAGAGTTTTATTACCGTTCTGAAAAGAGAAGACTTTTCAGATGAAATGCGTGGATGGTACGAAGTCATTACAGTACAGGGATGTAATAATAAAGATCGACAATGGATTCATTATTCTGTTGCTTTTGGACGGATGCCAAATGGAAGTATTCAATATCTTCTCCTTCTCTCCTGATAAGATTCAGTTTTGGCAATATACACATATATATTGTATTGGAAAATTGTTGATATTGTTCCTTATGACCAACGAAATGGAATTTTGCATATTTACCACATTTTATTACCCTCGACATGGGTATTTTGCCTCCATCGACGGAATTATGTTCCATACCAAAAAAACTGCTTACGGCGATGACCT [...]
+NODE 795 2754 154887 152080 0 0
+CCGCTGTGTGGAGTCGCATTATAGGGAGAGTTGAAAATGAGTCAACGCATTTTCTAAAGTTTTTGTTTGTTCGTCGTAAAATTAAACAAAACGATCGTGAATTACCCCGCACTGCATGATTTCTATACGGAAATAGCAAAGCGCAGCGTTCTGACCGGATCAACATTGAGGAATCAAGCCACAGTGATAGAATACAAGGCTATTCATCTTTCCAGGATTTGCCGGTTGTCGGCATCTTTATAAACGTAAGGCCATTTCATGAAAATCAAAACTCGCTTCGCGCCTAGCCCGACAGGTTATCTGCACGTCGGCGGCGCGCGTACTGCTCTTTATTCCTGGCTTTTCGCACGTCACCACGGCGGTGAGTTCGTGCTGCGTATTGAAGACACCGATCTTGAGCGTTCCACGCCGGAAGCCATTGAAGCCATCATGGATGGTATGAACTGGCTGAACCTGGAATGGGACGAAGGCCCATATTTCCAGACCAAACGT [...]
+CTACGTAAAGCTTGTCGAGTTGACGGGCGGCATCATATGAATTCCCTCGGCATGTGTCAACGGCAAAATGAACTTGCCGAATTCAATCGCTGAAAAAGCATTCAAATAAAGGACATTGCGGCACAACTCGCATTCAGTAGTTAAACACGTCACGGTTTCGACTAAAATGGTGCTATAAAATGAACCACTAATTAACCCCACGACTATTCAGGGAATCGTTATGTTCAAGGAACGGATGACGCCAGAAGAACTCGCTAATCTCACCGGTTACAGCCGACAAACCATCAATAAATGGGTACGGAAAGAAGGCTGGGCAACATCGCCCAAACCTGGCGTCCAGGGCGGTAAAGCCCGTCTGGTTCATGTAAACGAACAGGTTCGTGAATATATCCGCAGCGCTGAACGTTCAGTTGACCATCACGCAGACACATTCACGCCTGCCAGCAACGCATCGCTTGAAGCGCTGCTCATGACGCTTGCCAAAGAGATGAC [...]
+NODE 796 5 957 957 0 0
+ACCGA
+AATAC
+NODE 797 27 5029 5029 0 0
+ACCGCCAGGTGAGCGAGTGGGCGAGGA
+CGCTATCATCTCACTCATAAAAGACTC
+NODE 798 19 3320 3320 0 0
+GGCGCAAGGGAGTCAGAGG
+TCGCTGGGGCTGCGGCAGG
+NODE 799 1412 67499 66982 0 0
+AACGTAAATGCCATGCGGCATGAACTTCTCCGCCTGGCAGTTCATTACGCAGTTCGATTTCGCCTTCACCGACTTGCTCGCTTAAAAGACGACTGATAGCTTGCCACATAATGTCTCTCCCCACGTTGTCTGCCAGATCATAAGGTTAGCGCAAAAATGCGGTTAAAAAATACGAACTAACGCACATCACGGACGCGCCGCGGCGGGAATGGCACTTATTGTGCGTTTTTACTCCACGCCTCCCAGGTCGCCACGGTAATGTCGACATCCTTATCTAACGCGCTTTTCGCAAGTCCGGCGACAAGCGCTTTGATTTCATCAGCGCTCTGAGCGCTAACAAAGCCAAACGTATTGGTGCCGAGCTCATGCACATTCCCTTCATCGTCCGTTAATGTCAGCAAAAAACCGCTGCGCGTCAGATGATTATTGAGTTCGTTAATCTCGGTCAGGGAATCTTCATGGAAGGTTACGGTAATAACATAACGGGTAATA [...]
+TTTCCCGGCTGGCGGCGCTACCGGCGAACATCTGGTCGCACTACTGGCTGACGAAAATGTCCCCGTGTCTACCGTCGATGCGAAAGACTGGACGCGTCAGAACCTGCACGTCCACGTCGAGTCCAGCGGCGAACAGTATCGTTTTGTTATGCCCGGCGCCACGCTGGACGATGACGAATTTCGCCAGCTTGAAGAACAGGTACTGGAAATTGAATCCGGGGCAATTCTGGTTATCAGCGGCAGCCTTCCGCCCGGCGTTAAGGTCGAGAAACTCACGCAACTGATTTCCGCCGCGCAGAAGCAAGGCATTCGCTGCATTATTGATAGCTCTGGCGACGCGCTCACCGCCGCGCTGGCGCTTGGCGATATCGAACTGGTGAAACCGAACCTGAAAGAATTGAGCGCGTTGGTTAATCGCGATCTGACGCAGCCTGATGATGTGCGTAAAGCGGCCCAGGAATTAGTGCAAAGCGGCAAGGCTCGCCGGGTAGT [...]
+NODE 800 1450 93199 93199 0 0
+AGTGAAGCCTTCACCTAATAGCACCGAACTATTCATAATAAAGTCTCAAATTTAATAATCTAAAATAGAAAAGTAATATCAGGCATTAATAGAAGGGATAAAATACCGGTAGTAAAATCATACTAACGATAAAACAAACCAAACTAATCGCCAATCCGGGTTTTAAGAAATCTTTAAATTTAACATTCCCCGGGCCAATAATCATTGAGTTTGCTGGAATAGCCATTGGGGTACAAACAGCAACACTACTCGCAATAAAAACAGCAATAACAACTGCACGAGGGTCTGCGCCAATAGACTGTGCGATAGTCCACCCTACCGGGCATAACAACGTACATGCTGCAGTGTTACTCATAACTTGAGTCAAAGCCCATGTAAGTATCCACAATGATGCCATAATAATCATAACGCCAGAATCTCCGGTTACTGAAATAACGGCATTGGCAATCATTTCTCCAGCACCAGTAGAATTAAGCGCGGCTCCTAAAGGCA [...]
+GACTGTAATGAGTTGTTTTTGTACCCTAATAATATAAGGACTATACATGTCACCAGCGATTATTACTTTGTTGGTTTTAGTGGTTGCAATAATTATCTTTGTTAGCGATCGTCTTCCTATGGGATTAGTTGCATTTATGGTCCCAATGGCACTTTATTTTACCGGTGTTATCGATGCTAAGGATATTTTTGCTTCAATCGTAAATGCGAATGTTATTCTTATCGTCGCCATGTGTGTACTCGGTGCGGCATTTTTTAAAACAGGTTTGGCATGGCAATCAAGTAAAATTTTACTAAAATATGCTAAAACAGAAAGAAGCCTTAGTGTATTGATTTTTCTTATTGGTGGAGTTATGTCTGCCTTTGTTTCTAATAGCGGAACAGTTGCTGTGCTAATTCCTATTGTTTTAGGTATTGCCGCCAGTAGTCAGATTAAGCCTATTAAACTTCTTATGCCTCTGGTTTTTGGGGCAACAATCGGTGCTGATATTTC [...]
+NODE 801 7143 438161 434380 0 0
+TACAGACCATAGTACGAGAACCGTGGCCGATTACTTTGATGCCTTTGATGTGGAGCTATTTTTAACAGATAACGTATACCACACTCAAAATACTCCCCCAGATCAATGCCCTCCTCTGAACACCTCCCTCTTGTGCCATTCCACAAACCGTTCACCCGGATAATTTTCTTTCATCTGCGGCAACGCGATCTCTTTCCCCGCAAAATCCCAGAACAGCCGCTGTACCACTCCGCCACCATTCACCGCGTCGGAAACCACCACGCGCATATTTTCATCCAGGCCAATCGAACCGCGATCGAACGCTTTATGATGAATTGCGCACAACGCCAGGCCATTAGGTACTTCACAAGGACCATGATGCTGCTTCCATCTGATATGGGCTGCTTCAAGGGCTATAGGGGCGTTGTCGTGGCGCATATTGAAGCCGCAGACCGCACATTGATAATTGTAAGCTCGTAGCACCGCCTGGCGGAACTTCGGATCGCGTTGACG [...]
+TGGCGTATTGGTTTTTGTAGAAGCTGACCAAATCGTCCCAGTCTTCCGAGAAATCTTTAAGATCGTCGGCCGCTGTGGTGATTTTTTCAATGACCGCGTATTCCTCTTTCTCGTTAAGGATCCCGTTCAGCAATACCAGGCCTTCTTCTATCTCTTTACGGCCAGGGTTTTGTCCACTCTCTGCACGAGTTTTAAAAACAGTCAGTTCGCTCTTCCAGCGGCCAAAGAGTTCGCGAATATGAGAGACCAGCGGCTGCTCTTCACGCTCGTTAAACGGTTCTCCAGCAATATCAGCCATCAGTTGCGCGGCTTTAGTCAGCTGCGCTTCGTCATGGCGACGTACTTTATGCAAACGCAAATCGCTGTAACGACGTGAATTATTAAACGCGTCCCACGCCTGCTTCAGTGCGATTTCACTGCCTTGCAGAGTGAAGCTGTATTTTCCGCTGCGCGCCAGCCGAGCAACCAGCAATTTGACCTCATCTTCCGGCC [...]
+NODE 802 2569 121968 120951 0 0
+TCAAATTTGATCCCCGCGCGACGCTCAACTTCCGCTTTAAACGTCTCCAGTCCCACGCGCTCAAGGGTGTATTTGGTTTTGGCATTTTTCCTGTCGGTACGGTTACCCCAGTCGCGCTGCGTCGTCACTACCGCTTCGGCCACCGCCAGGGTGTGCTCCAGCGGCAGATAGCCAAACTCGCTGGCCGTACGAGCGTAGGTTTTCTTATTACCATGCTCAATAGACAGACCGCCGCCCACCAGCAGGTTAAAGCCGACCAGCTTGCCGTTCTCGGCAATCGCCACAAAGTTCATGTCGTTGGCGTGCAGATCGATATCATTTTGCGGCGGGATCACCACCGTGGTTTTGAACTTACGCGGCAGATAGGTCTGACCGAGGATCGGCTCTTCATCGGTGGTCGCGACCTTCTCCTGATCGAGCCAGATCTCCGCATAGGCGCGGGTACGCGGCAGCAGATGTTCAGAGATCTTCTTCGCCCATTCGTAGGCTTCC [...]
+TGTGACACTGGTGAACGCCGGCGACTATAAATTCAAACAGATTGCCAGTGAAAAACTGCTGGTGATAGTGACGTCCACCCAGGGAGAAGGCGAGCCGCCGGAAGAGGCCGTCGCTCTGCATAAGTTCCTGTTCTCGAAAAAAGCGCCGAAATTGGAAAACACCGCTTTTGCCGTGTTTAGCCTCGGCGACACCTCTTATGAATTTTTCTGCCAGTCCGGAAAAGATTTCGACAGCAAACTGGCGGAACTGGGCGGTGAACGTCTGCTCGACCGTGTCGATGCTGACGTTGAATATCAGGCAGCTGCCAGCGAATGGCGCGCCCGCGTGGTTGATGTTCTGAAGTCTCGCGCACCTGTCGCGGCACCTTCGCAATCCGTCGCTACTGGCGCGGTAAACGACATCCACACCAGCCCCTATACTAAAGACGCGCCGCTGATCGCGACCCTCTCCGTGAATCAGAAAATCACCGGTCGCAACTCGGAAAAAGATGT [...]
+NODE 803 1343 86349 86270 0 0
+ATTTTCAGAAAAATGTCATAAGACATATCTACTATCCTTTTAACTACCTAAATTAAGCCCTGATTTATCTGCTTTATTAGGTGAACAGATTAACTATTCCTGTACAGCTCTTTCTTACCCATAAATTCATCAGAGCAAGAGAACGTATGCTTTTAATATCTTTGAATTTTACTTCTCGACACGCCTTTTAATTAATTCATTTAATTCCCTGTCATGGATAAAATCTATGCACTTCATGGTATTAAAATCTGATGATATCGAACCGTTATATTTCAACCCTGAATATTTTTTCGCAATCTCATCAATTTCATGGTAAATCTCCACAGATTGTTTACCATATTCAAGGTAAGCACTGGCCGTAGCTCTGGCATCGTTTTTAACGACATCATCTTTGTATACTAATGCCAGACAATGACTCAGCGCCCAATTTTTTAAGAGTTCCGACTGTGAATATTGTGTGGTCAATGCTTCTTGTGCAAAGGATGGCTGCCA [...]
+CGGATTTATTGTTTTGATTTTAAAGGAATTTACAGTGAATGAATGGCGTAACCCCACTCGGTGGTTATGTGCGGTAGCTATGCCTTTTGCACTGCTCCTGCTTTCCGGATGCGGCAGTAGCGATGCGTTACCTGACCCCTAATCGCAGCGGCCTGGCTTGAGCGTGAAAGCATTTTACAAGGTGAATTCTGACAATCAGAAGAAAGCGGCGTCCATGAAGATACGTGTTGAGAATTAATGATCTACACAGAATTTTTAGAGGGTAAGCAAAATGAACAGACCTTCATTCAATGAAGCGTGGTTAGCTTTTAGGAAGGTGAATCATTCCGTCGCTGATGTGGGTAGCATTATTGGTGGAAACGTTGGGAAAAATATAACTGGTGGTTATTTTCAAAATGCCTGCCCTATTCGAATGAGCTATGTTTTGAATGCGACAGGATTCCCAATAGCCCGTAACTCTCCGTATGCAAAGGTTAGTGGTGCCGATAATAA [...]
+NODE 804 117 6098 5997 0 0
+ATTTTATCTTTTGTTTAAATCGCTAAGCAGAACGGCGATACTCTGCCCGCCGGTGGTCTGTTCGAGGGCGATTTTGACAATGATGGTTAACGGAACGGAGAGCAACATGCCCACCGG
+CCTCGAACAGACCACCGGCGGGCAGAGTATCGCCGTTCTGCTTAGCGATTTAAACAAAAGATAAAATGCAATACATACACAAAATCATTCAAGATGCATCGCGGCGGCAAGGGAAGA
+NODE 805 3559 179839 177267 0 0
+ACCAGAATTTCGCGGCCCACTTTTTCCTGCAAGCGCTCAGCGGAGATTTGCTGTTGCAGTTGCATAAAGCGGTTCCAGCGCTCTTCTTTCACCTCTTCCGGCACCTGATCCGGCAGCTCATTCGCGCCTGCGCCTTCCACCGGGCTGTACTTGAAGCAGCCTACACGATCGAGGCGCGCCTCTTTCAGGAAGTCGAGCAGCATCTGGAAGTCTTCTTCCGTTTCGCCGGGGAAGCCGACAATAAAGGTGGAGCGTAGGGTCAGTTCCGGGCAGATTTCGCGCCACTGCTTAATGCGCGCCAGCTGGCGGTCAACGGAACCGGGACGTTTCATCAGTTTAAGAATCCGCGGGCTGGCATGTTGCAGCGGAATGTCCAGATAAGGCAGGATTTTGCCTTCCGCCATTAGCGGAATCACATCATCAACGTGTGGGTAGGGGTAGACGTAGTGCAGACGTGTCCAGACGCCCAGTTTTGATAACTGTTCGCACAGG [...]
+TGCCGACTATCTGGCGATGAATCCCAATGGGCTGGTGCCGCTGCTTAAAGATGATGAAACCGACCTGTTATTGTGGGAATCCAATGCCATTGTCCGCTATCTGGCGGCGCAATACGGCCAGAACCGGCTATGGGTTGATAATCCGGCGCGGCGTGCGGAGGGCGAAAAATGGATGGACTGGGCGAATCAAACGTTAAGCCCGGCGCACCGTGTGATCCTGATGGGACTGGTCAGAACCCCGCCGGAAAAACGCGACCAGGCGGCAATTGAAGCTGGTATCGAAAAGTGTGATGGCCTGTTTGCGCTTCTTGATGATGCTCTGGCCCACCAGCCGTGGTTTTCCGGGGATAACTTTGGCACCGGCGATATCGCTATTGCGCCTTTCGTCTATAACCTGCTGAACGTGGATCTGAAATGGACGCCGCGCCCGAATCTGGAACGCTGGTATCAACAGCTTACCGAGCGCCCTGCTTTTCGCAAAGTGGTGATGAT [...]
+NODE 806 4504 256415 255332 0 0
+GGTTGTATGCCCACAATAACCAACTGACCCGCCTGCCGGAAAGCATCACGGGTCTGTCTTCAGAGGCAAGCGTAAATCTGGAAGGCAATCCTCTGTCTGAACGCACTCTGCAGGCGCTGCAGAATATCACCAGCGCGCCAGGCTATTCAGGCCCCAGGATACTATTCGATATGGCGGGAGCCTCAGCCCCCCGGGAAGCCCGGGCACTGCACCTGGCGGCCGCTGGCTGGCTGGTGCCTGCCCGGGAGGGCGAACCGGCTCCTGCAGACAGATGGCATATGTTCGGACAGGAAGATAACGCTGCTGCCTTCAGCCTCTTCCTGGACAGACTGAGTGAGACGGAAAACTTCATGAAGGACGCGGGGTTTAAGGCACAGATATCGTCCTGGCTGGTACAACTGGCTGAAGATGAGGCGCTGAGAGCAAAAACCTTTGCCATGGCAACAGAGGCAACAGCAAGCTGCCAGGATCGGGTCACACTTGCTCTGCACC [...]
+GTATTAAGAATGAAGGTTATAGCGATTTTTTAAAGGTAAATGACCATTGTTCTGTTCATCGCATAGGTTTCAGCAGACTCTATAAGCGCCTCTTTCAGAAGTGGACTCGCCTTGACCCGCTCCCCTACTCACAGCGCATTCTGAATATTGCAAAAGACTTTAACGTTACCGATGATAGTGTAATCATCGTTCATAACAGCATAAAGCTGTACCGCCAGATCCGCAAAAGAGCCCCAAAGGCAAAAATGGTTATGCATATGCATAATGCTTTCGAACCTGATGGGTTAGATCAAAACGTTAAAACGATCGTCCCCAGCATGTTTTTGAAGAAGCATTATCAGGCGTACCTGCCGGATGCTGATATCGCTATCGTCCCTAATGGTATTGACCTGGAGGCCTATCAGAAAAACGCTGTACCACTGCAAAAGTCTGACCTGGGAATAACTCCGGAGAAAAAACGATTTTCTTTGCAGGCCGTATATCACCGGATAA [...]
+NODE 807 3607 772488 761032 0 0
+GCCTTATATTTGCAAGTTATCCGGTGAAGGGAGGTAGCCGAGACTGGGGATTGATTGTTTTGTACAAGTTCTAATGCATAATGTGTACATATAGTAGCGTTAGCATAGGGCGTAGTATGCACCAAGAGCAGGATATAGCAGATGCACTTCATGAATCCCTAGCCTATTTCAATCGATATTGTCGCTATTCGCTAAAAAGGCTTGCTGCGGATTATCAGGAAGAGATTGATAACTACCAGGATGATGTATGGGAGGCTCCGCAGCGCGCTGCGCGGTTAAGTGCAGCGGTAAAAAACTATAAAACCTCACGGATGATTGAGTTTATTTTTTATATGGCGATAAAGCTCAATCTTGATTTAACCCCGCTGGTTGTTAAGCGTTTATGTTCTTGTCTTTTTCAGCGTACTGGTAGCCAGGAGCTTATTGTTGAGATTTTTGGAAAAAAGCAGCGTGTAAATCGTAGTGCTGATAATACAATGGAACGAATCAATG [...]
+GGCACCGAAATTACATTCCTGAGTGTGGGAGAGTGGACGAGTAGGCGCAAAAATCTACAGACGATATAGCCGAAGTCTGTAGATGAATCTGAAAATACTGGAGGCAACCAGTACAGATAAGTAGCTGAAAATTCACGGTAGTAACATGGCAGAGGAAACATTCATGTTTCCTCTTTTTCGTCCTCTTTCTGTTGGTTCAGTAAGAGGACTTCCCAAAAAAACGTAGGTATATTTTGTTATGAAATTGACTAAAAAATCATGTTTAACACATGTAAGACAACAACGATTTTCAGTATTGATGCAGGATCATTTCTGCAAAAAATTCTGCTTACGTTGTTGATAAAACGCTCACATGTCCTGTCTAACGATAGGGCATTGTAATGAACAATCATCGCGTTTTTCGCGATCATAACTAACGGTAACAGGCACTACCAATGACAAATTGCCCTCTGATAATCAGAGGGCAATTCTCCCAAAAATCATGCTCATTTA [...]
+NODE 808 314 15346 15346 0 0
+CTGACGCAGCCGTATCCCACGGAGTTTCTGGTACGCAGCGCGCTGGATATGGAGCTGAGCCGCATTACGTTCTTTTAATACAGGGCATTATTCATGGATCCACGGCTACTGGAGTATTACAACCGCGAACTGAGCTACCTGCGGGAGACCGGTGCTGAGTTCGCCACCCTCCATCCCAAAATTGCCGCCCGACTGGGGATGCAGGGAACCGATATTGCCGACCCGTATGTGGAACGCATGATCGAGGCGTTCAGCTTTCTGAGCGCCCGCACTCAGCTAAAAATTGACGCCGAGTTTCCCCGCTTCACACAGCG
+GCTCAGAAAGCTGAACGCCTCGATCATGCGTTCCACATACGGGTCGGCAATATCGGTTCCCTGCATCCCCAGTCGGGCGGCAATTTTGGGATGGAGGGTGGCGAACTCAGCACCGGTCTCCCGCAGGTAGCTCAGTTCGCGGTTGTAATACTCCAGTAGCCGTGGATCCATGAATAATGCCCTGTATTAAAAGAACGTAATGCGGCTCAGCTCCATATCCAGCGCGCTGCGTACCAGAAACTCCGTGGGATACGGCTGCGTCAGAATTTGTCCGCGAATTTCAAACTGTAGCGTGTTATAGCTACCCTGCCGGG
+NODE 809 1031 47065 46260 0 0
+CTCGCGCAATATTCCAGGTAGCGTCGGGATGTAGTGCGGCTTATCGTTAAGGCCTGCGCGACCGTTTCAGCCGTATGGCGTACGGTTGGATCGGCAAACAGCTTCATCACCGCATTAAGGGTTAAGGCATCAATACCGGTCGGCAAATCCCCTTTCGGTTCGCCGCGCGCATAGGCGTTGAACATTTCATCTATCTGCTTCTGGCTAGCGCTATCCGCGCTCGCCAGCATACGTCTGCGCTGTTGATAGCGGGTCAGCGTCTGCCCCAAACGCTCATAAGCAATAGGTTTGACCAGATAATCAAACGCGCCGCTACGTACCGCTTCCGCTACCGTCTCCATGTCACTGGCGGCGGTCGTAAACACGACGCCGCCGGGATAGCGCGACTGCATTAATTCATGCAGCAGCGTAATCCCCTTCCCATCCGGCAGATAATTATCTAACAGAATTAATCCAGGTTTGAACCGGTCAATCATCATTCTCGCCTGCGCC [...]
+CAGCTACATCAACTGCCGGAGGGGCTGGATAGCACGGAGTTCGCCGCCATCGTCGGGAATCTGCTGGATAACGCGTTTGAGGCGAGTTTACGTACACAGGAAGGCGACAATACCATCGAACTTTTCCTGAGCGACGAGGGCGACGAGGTGGTGATAGAGGTCGCCGACCAGGGCTGCGGCGTTCCTGAAGCGCTGCGGGAAAAAATTTTTGAGCAGGGCGTAAGTACCCGAACTGACGAACCCGGTGAGCATGGTATCGGGTTATATCTGATTGCAAGTTATGTGGGGCGCTGTGGCGGGGTCATTACGCTGGAAGACAATGATCCTTGTGGCACCTTATTTTCTTTATTCCTTCCGAAAGTGAAAAAAAACGATGACAGAACCATTAACCCTATTGATCGTTGAGGATGAAACGCTGCTGGCGGAAATGCACGCAGAATATATCCGCCATATTCCTGGCTTTAACCAGATATGGCTGGCGGGCAATCTGGC [...]
+NODE 810 3533 194116 192592 0 0
+ATGGTTACCGACGATGTTGATCTGTTGGATCTTCGCCGATACGCCCTCCTGGAACACCAGTTTAAGATCAACACGGTTGCGCGGCAGCGGCGTGACGACCGCCTTAACGCTGGCGCTGTATTTACCTACGCTATAGTAAAAGTCTTCCAGACCTTTTTCGATATCAGACAACGTGGTGCGATCCAGAGACTCGCCAACACGTACGCCAGACGCTTCGAGGTTTTGCTTGAGCATGTCATCTTTCACCGACTTGTTCCCGGAGAAAGTGATGCTGGCAATGGTCGGACGTTCTTTTACCTGAACCAGAAGGGTATTACCATCGCGCAGGACGCGGACGTCCTCAAAGTTGCCGGTGGCGAACAGAGCGCGAATGGTGTTACTGATATCTTCATCATTAACCGTGTCGCCTGTGCGCACCGGCATACTGAGGAGAGCCGCACCAACGGCGACTCGCTGCAGGCCTTCGAAATGAATGTCCTTCACTACGAACCC [...]
+CAAGGGAAGATCCGGGCCTTTGGGCATAAAGCCGGGGCGAAGTCCGTCCGGCGAGCGGTCTCTTTTGCTGCCAATAACGGTATTGATGCGTTAACGCTGTATGCCTTTAGTAGTGAAAACTGGAACCGACCGGCGCAGGAAGTGAGCGCGTTAATGGAGCTGTTTGTGTGGGCGCTGGATAGCGAAGTCAAAAGCCTGCACCGCCATAACGTTCGCCTGCGTATTATCGGCGATATCAGCCGATTCAACTCACGTTTACAAGAACGTATTCGCAAATCAGAAGCGCTTACCGCCCATAATACGGGTCTAACGCTGAATATCGCTGCGAATTACGGCGGACGTTGGGATATTGTCCAGGGAGTCCGACAACTGGCGGAACAGGTGCAGGCTGGAGTGCTGCGCCCCGATCAGATTGATGAAGAGAGACTAGGCCAGCAAATCTGTATGCATGAGCTGGCGCCTGTGGATTTAGTAATTAGGACTGGGGGAGAG [...]
+NODE 811 12254 666036 654247 0 0
+TTGCACCAAGCTTTTGCAAGCCAATGCTACTCGGAATTTGAAAGATTAAATATGATATGAAGAATATAGAAGAAATATTAGCGAAATCCTCAGGCGTAATACCGAGAGATTCATTCATGCGTAATGCAGCAAACCCAATATTGACACGATCCATATAGTTAAAAAAGTAAAGAATAAAGGCCAAAGGAATGATTTTCCTTTTTACAATACGAATTGCATCGTATAAATTTTCTTGTGGACTACTCATTTTGCATCACCTTTTATGATTCAATGAATAAGGGTATTGACCGGAATCGATGTTACGTAAAAAACAATACAATTCAAAAGCTAATGTGTCATATCTGATATATCAGCAAGCAAACTTAATGAAATATACAATAACAACAATAAAGTATGTAAATTTTCTTATATCTGATATATTAGATCCGTTAATTTTGAATAAATTAATTACAATGGAGCCGGGTTTAACCATGGAGGAGAAGAAAATGAAAA [...]
+GTTCGGCGTGGTCGAACAACACAATACCGCGGCTGACGTTACGACCGCTGGGATCGTCATCGCTGGCCACCAGCGGGCGGACGCCGGAATACGCGCGCAGAATACGCGTCTTCGCCATGACAGGGGCCAGTTTTTCCCCTTCACGCAGCAGGATATCGACTTCATCTGCGGTGACGCGGTTGCTGTCTATCTCATTGTAATCAATATGGGTAGAGGTGGTGCCGATCAGTGAAATCGTATCGCCAGGTACCAGAATGTCGGCATCCGATGGTTTCCGGCAGCGGTTAATGACATGCTGGTTGATCCGATGGTCCATGATCAACAGCGAGCCTTTCGCCGGGAACATGCGAATACTCAGGTCGGCGTATTCGGCGATCCGTTGCCCCCAGATACCTGCCGCATTGACCACCACCGGCGCGTGAAGCGTCTGGGTTTCGCCAGTGAGATGGTTGCGCACATGGACGCCGCAGACCGTTGCGCCTTCACGAATGA [...]
+NODE 812 5932 330985 321636 0 0
+ACCGCTGCTAAGCGGCTGCGACAGCGGATAAGGCTGCCGGTCGACACGCGCGCCGACGCAGGCGTGGCCGATATCGGTATGCACGGCGTAGGCGAAGTCCACCGGCGTAGCGCCAGCGGGCAGTTCGACAATGCGTCCTTCCGGGGTGAAAACGTAAATCTCATCCGGGAAGAGATCGGATTTTACGCTTTCGATAAATTCAAACGAACTACCGGCGCTCTGTTGTAGCTCCAGCAGGCTCTGCATCCAGCGCTGGGCGCGGATCTGCGCCGTGGTGCTGGTCTCACCGTGTTCTTTATACGCCCAGTGCGCCGCGACCCCCATTTCCGCCATCTGATCCATATCTTCGGTACGGATCTGGACTTCAACAGGAACGCCGTGCGGGCCGATCATCGAGGTGTGCAAAGACTGATAGCCGTTCGCTTTGGGAATGGCAATATAGTCTTTCACCCGTCCCGGACGAGGCTTATAGAGACTGTGCATCTGGCCGAG [...]
+TCCGTTATCACTGTTTAAAGCGTGGGCTAAGCCTATAAAGCCGTTTCAAATCACAGAAGGCGTGTGGTATGTCGGCACGGAAAATCTCTCTTCTATTCTGCTGACCACTCCGGCAGGGCATATTCTTATTGATGCGGGGTTGGATGAAAGCGCACCGCAAATTAAAGCGAATATTGAAGCGGCAGGATTCCGCCTCACAGACGTGCGCTATCTGTTGAATAGCCATGCGCGGCTGGATCAAGCGGGGGGCATGGCACGTTTGAAAGCGTGGAGCGGCGCACAATTGGTCGCCAGCCAACCCAACGCCGATCAGATGGCGAGGGGTGGACGAGAGGATTTTGCGCTTGGCGATGCGCTCCCCTTCCCGCCCGTCACCACCGATAAAATTATCCACAACCAGGAAAGCATCAGCCTCGGAGGGATAACCGTGACAGCGCTATTCACGCCTGGACATCTACCCGGCTCAACCTCCTGGCGCGTAACGCTCCGCAA [...]
+NODE 813 72 1584 1528 0 0
+CACTATACATCCACTTTCTGGTTTGGGAATATTAACCCAATTCCCTTTCGATAGAAGGGGCGCCGAAACGCC
+ACCAGAAAGTGGATGTATAGTGGCAACGGATTTCTCCTATCTCTTAGGATCGACTAACCCACGTCCAAATGC
+NODE 814 53 1357 1224 0 0
+CACCTTGCAACGGATTTCTCCTATCTCTTAGGATCGACTAACCCACGTCCAAA
+GTGGGCGTTTCGGCGCCCCTTCTATCGAAAGGGAATTGGGTTAATATTCCCAA
+NODE 815 36 1638 1638 0 0
+CCAAAAGGAAAATTTTATGGCACAAGTAATCAACAC
+CCAATGTTATGCCAGGCTTACCTGTGTCATCCAGGT
+NODE 816 102 5792 5792 0 0
+TAACAGTCTGTCGCTGCTGACCCAGAATAACCTGAACAAATCCCAGTCCGCACTGGGCACCGCTATCGAGCGTCTGTCTTCCGGTCTGCGTATCAACAGCGC
+TGCGGACTGGGATTTGTTCAGGTTATTCTGGGTCAGCAGCGACAGACTGTTAGTGTTGATTACTTGTGCCATAAAATTTTCCTTTTGGAAGGTTTTTGATAA
+NODE 817 336 18992 18992 0 0
+TAAACGTACCGACAGCAAGGTAACGGGAAACGTAGGGAGTAGTATTGATAACACGTTGCGGGGCAATTTAACGCTGTCCGGCGGCGGATCGTGTTCTGTGTGGACTTTCCGGCGTTAAATCCCGTATCACCTGCGAACCTGGACTATCTCTGTGGTATCAACTCTGTAGTAATTTTGTCCCCTTCGTCTTCATTAGCCAATGAAACCGGTTTTACGTTACCGTTCGAATGTTGCGAACGAACAGCTCTGTATGCGGACTATCGTCACCGCTCTGCGATTTTTATAGCGCATCAGCCACACGATTTATTGGTTCTTGAAAACCAAGGTTTTTGATAA
+CTATAAAAATCGCAGAGCGGTGACGATAGTCCGCATACAGAGCTGTTCGTTCGCAACATTCGAACGGTAACGTAAAACCGGTTTCATTGGCTAATGAAGACGAAGGGGACAAAATTACTACAGAGTTGATACCACAGAGATAGTCCAGGTTCGCAGGTGATACGGGATTTAACGCCGGAAAGTCCACACAGAACACGATCCGCCGCCGGACAGCGTTAAATTGCCCCGCAACGTGTTATCAATACTACTCCCTACGTTTCCCGTTACCTTGCTGTCGGTACGTTTACCTCATTGTCTGAAAGGTTATTTACGAAGTTATCATTAATAATCCACGGG
+NODE 818 36 1471 1465 0 0
+GGTTTTCAAGAACCAATAAATCGTGTGGCTGATGCG
+CCAATGTTATGCCAGGCTTACCTGTGTCATCCAGGT
+NODE 819 1306 116777 115377 0 0
+CTGATTAGCGGCGTTGACAGATGTATCCATCTGAATGCAATGAAGAAAACCACCATTACCAGCATTAACCGTCAAACTATCAAAATATAACGTTGACGATGTAGCTTTAGGTGTCTGTAAAACAGGTGCCGAAGAAGCTGGAGTAACAGAAGTGAGAACCAGCTTATCAGAAAAAAAGTTTGAATTATGGCGAGAAATAAAAGTCTGAAACATGATTAAACTCCTAAGCAGAAAACCTACCGCGCTTCGCTTGGTCAACCCCTCAGCGGCAAAAATTAAAATTTTTACCGCTTCGGCGTTATAACCTCACACTCAATCTTTTATCACGAAGTCATGATTGAATCGCGAGTGGTCGGCAGATTGCGATAAACGGTCACATTAAATTTAACCTGACTATTCCACTGCAACAACTGAACGGACTGGAAACACTGGTCATAATCATGGTGGCGAATAAGTACGCGTTCTTGCAAATCACCAGAAGGCGGTTCCTGA [...]
+AATAAAATCCCTAAGCATTTGTTTCAGGGTTATTTGAATATCTATAACAACTATTTTAAAGCGCCGTGGATGCCTGACCGTACCGAGGCTAACCCTAATGAGCTTAATCAAGATGATGCTCGTTATGGTTTCCGTTGCTGCCATCTCAAAAACATTTGGACTGCTCCGCTTCCTCCTGAGACTGAGCTTTCTCGCCAAATGACGACTTCTACCACATCTATTGACATTATGGGTCTGCAAGCTGCTTATGCTAATTTGCATACTGACCAAGAACGTGATTACTTCATGCAGCGTTACCATGATGTTATTTCTTCATTTGGAGGTAAAACCTCTTATGACGCTGACAACCGTCCTTTACTTGTCATGCGCTCTAATCTCTGGGCATCTGGCTATGATGTTGATGGAACTGACCAAACGTCGTTAGGCCAGTTTTCTGGTCGTGTTCAACAGACCTATAAACATTCTGTGCCGCGTTTCTTTGTTCCTGAGCAT [...]
+NODE 820 5228 255036 248253 0 0
+GGCAGACTTTTCTCCGCTGGCGCGCTATCTGACCGGCGATCGTATCCGCCTGTATTGCTTTGGGCGCGATGGCGCGCAGCTTGCCGCGCTGCGTCCGGAAATCGCCCAACAGACTGAGACGATGGAAGAGGCGATGCGTTTGCTGGCGCCGCGTGTTCAGCCGGGTGATATGGTGCTGCTGTCGCCCGCCTGCGCCAGCCTCGATCAGTTTAAAAATTTTGAGCAACGGGGCGATGTCTTTACCCGTCTGGCGAAGGAGTTAGGTTGATGCGTTTATCTCTCCCCCGTCTGAGAATGCCGCGCGTACCAGGCTTTGGCCTCCTGGCCTGGCTGTTTGCGGCGCTTAAAGGCTGGGTGATGGCTTCGCGCGATAAAGACGCCGACAGTCTGATCATGTATGACCGCACGCTGCTATGGCTGACCTTCGGGCTGGCGGCGATTGGTTTTGTCATGGTGACGTCGGCCTCCATGCCAGTCGGGCAGCGCCTGGCG [...]
+GGAATAAAATTCCTGCAAGACGCGTTCCATTATTGCGGCGTGAAGAAGGCGTCTCTTCATCACTGTTTCGCGTGTTCAGCGCAGCCTGCGACATATCAGTCCGCCAACTCCAGAATTCGTACCACTAACTGCGAGAAGCTCATTCCCGCCTGACGCGCCGCCATCGGCACCAGACTATGGCTGGTCATCCCCGGAGAAGTATTGGCTTCCAGCAGATAAAACTGACCATCGCTGTCCAGCATGACGTCAATACGCCCCCATCCCGTGCAGCCTAAAGCTTTCCATGCCTGCAGGACGAGAGACTGTAGCGCGGCTTCCTGGGACGCTTCTAAACCGGCAGGGCAGAAATACTGAGTCTCATCAGAGAGATACTTCGCCTCATAATCATAGAAGGTTCCTGCCGGTTGGATACGAATTGACGGTAAAATTTCTTCGCCAACTATCGCCACCGTAAATTCCGGACCGCACAGCCATTTTTCAATCAGTATTTCG [...]
+NODE 821 1412 89167 88670 0 0
+AATACCAGAGACAATCTGCGCCGCAATTCTCCCGGGGCTGTCTGGCGATGTCGTCATGGAGCTCAGAATAAAAACGGCGGCGCCTGTCGCCACCAGCGCATTAGTGCGTAATCCCGCCATACGTTGACGCCATTGTCTTTCCGCGCCAATCAGCGCGCCCAACAGCATAGCGGCCAGTAAATTTAAAATATAAGGAAACATTAACATACGTTCCTCCATTTTTTCTGGAAGAATAAGTACGTGCTATATTTAGCACACGACAAATTTCTGCCCTGAGGCAATTAGCGTCGTGTTAACGGCGGAGGAAATAAAGCGTGTTTAAACATGAACATGACGATTACCTCGCGACAATGCGCGTGTTGTAACATTATTGGGATGACAATCGTCACAAGGGGAGATTGCTGCCCACCGGTTCGGCAAGCAGCGCAGGAATAGCGTGCGTTAACTTGCCAGATGATTTACGTAAAAGTGACTGTCCAACATATTACTCCT [...]
+ACCGCAAAGTGCGTTCCTTCTTTAGCGTAGAAGGGCAGCAGAATAAGGCCGCCAAAGGACATACTCCAGCCGACCACTGGCAGCGTGCCGTATTGGGCGATTAGCCTGGAAGGCCAGGTCGTATAAAAGGCGGCGGCAAATGCGGAGGCGATACCCCAGAACAGCGCGCCTGAAGAGATCGACAGCGATGTTGGATTGCCGTGAGTCACCAGTAAAAAGGTGCCGATAAGCGATGTAAGAATGGCGGTTAAGACCAGAATGCCTGGTCGTGTTCTTCGCGCTAATGCAAACCACGCGACAATAATGGTCGGCGATAAAAATTGCAGCACTGTCGCGGTGGCGGCATTGGATTTTTCAATCGTAAGCAGGAAGGTTAGCTGAACGGTGAGCGCGCCCACCACGGAGAAAATCAGCAGACTCAGTGCATCTTTGCGGTTTTTAAGAATCGAAAATATCTTATCGCCGTGCATAAAGGAGAAGGTCACCAGTATC [...]
+NODE 822 3092 154790 153837 0 0
+CGGTGCCGGAAGGCTTATTCAGCACCAGAATATGGTCGTCTTCATACAAAATGACGTCCGCCAACGCCGCCACTTTTTGCAAATGCGGCGACACGGCCTCTTCTTCGCGTTCAGCAACGCGAACCGGCGGAATGCGGACTTCATCGCCCGCTTCCAGTTTGTATTCCGGTTTAATGCGTTTTTTGTTCACCCGCACCTCGCCTTTACGCAAGATGCGATAAATCATACTTTTTGGTACCCCTTTCAGTTGGGTGCGCAAAAAGTTATCAATGCGTTGCCCCGCTTCGTCAGCGGCGATGGCAACAATTTTTACGGATGGCGTTTCTGTTTTCATGGGGGGCGATTCTAAATAGCCTGTGAGATTCGCGCCACACATTTTTCTATGCTTATAGAGACGTCTACGCCAGTGGATGAACATTTTTCACTGCGGTTTTGCTGGTTATTAAAGCGATTGGCTCGCGCTGGTGAAAAAACTGTGAGTAAGCGGGTGAT [...]
+ACGCGTTCTTCCTGCTCGGTCTCCTGGACAGGCTGTTCTTCGCGGTTAAGCGCTTTTACTTCCTGCTGCGCCTGGCGCTTGTCATCATTGCGGCGGCGGCTGCGTTCGCGACGCGGCGTCTGTTGCTGCTCATCGCCGGTTTTCACTTTTTCCGCCGTTTCCTGCTGGCGGGTATCGCGCGTTTCCGCATTTTGCTGCTGCGCCTGGCGACGGTTACGACGATTATCGTCGCGGCTCTCGCCGCCGTCACGTCCGGCACGGTTATCACGGGTGTCGCGGCGTTCGTTACGATCGCGACGGTTGTTCTGCCGTGGCTTGCGACGATCCTGCTGACGCTCCGCTTTTTCTTCCGCTTTCGGCGCGGCTGTTTCGACGGCTTTCGTTTCTTCACCGCTGAACAGTTGTTTCAGCGCGTTAAGGAAGCGGCTAAACAGACCCGGCTGGGCAGGCTGCGCGGCGGCAACATTATCCTTTTTCGCCGTGGCGACGCTA [...]
+NODE 823 3060 179023 177645 0 0
+GAAAGTTATTGACTCAATCAGTATCAAAATCATCTTTTCAGTAAAGAAATGAAAATACAAATAAAGCGCAATCAGCTGAAATAATGATGTTATTTCAATACTTTTGACAACCTGCCCTTCCTTACGGCCATCACGTAATTTCTTTTCTGTAGGCTGTTCTGTTTTCTCGCTCATACAGATGGAAACCAGTCTTTTAGATAAATATAAAATTTATCGCTTTCAACCAAATAGTGATGAAGAGCATAAGGGAATGAGATCAGGAGCGTCAGTAGAACCAATATACTTTTGAGCGGCATTGAGAAGAAAAACACATTCAATTGTTGTGCCGACCGATTTAAAAGACCTAAAGCCAGATCGGCTAATACCATACATATTATGGCAGGAAGAGAGAAGCTGATGCATAATTGATAAAGCGTTCTCCACTCTGCCTGGATATATTTTAAAAATTGCCGATCAAATAATAAAGTACGCCCTGGTGGTAAATATTGATAT [...]
+GTTAAGAATCAATGTCCCTCATCATGAAATTTACCGTTCGATGAAAGCGCTAAAGCAGTGGCTGGAGTCTCAGTTGCTGCATATGGGGTATATAATTTCCCTGGAGATATTCTATGTTAAGAATAGCGAATGAAGAGCGTCCGTGGATGGAGATGCTTCCAACGCAAGGCGCTACCATTGGTGAGCTGACATTGAGTATGCAACAATATCCAGTACAGCAAGGGACATTATTTACCATAAATTATCATAATGAGCTGGGTAGGGTGTGGATTGCAGAACAATGCTGGCAGCGCTGGTGTGAAGGGTTAATTGGCACCGCTAATCGATCGGCTATCGATCCTGAATTGCTATATGGAATAGCTGAATGGGGGCTGGCGCCGTTATTGCAAGCCAGTGATGCAACCCTCTGTCAGAACGAACCGCCAACATCCTGCAGTAATCTACCACATCAGCTAGCGTTGCATATTAAATGGACAGTTGAAGAACATGAGT [...]
+NODE 824 4147 262539 260794 0 0
+TTCGGTATAACGGGTCTTTTTCATGACAATGCGCCTTTCTGTGAGATGGAAGAAAGACCGGAAACTTCAGTTTAGACTGGCACTGTTTACAGGGGGAAGGTCAAGATAATGCGAAAATACAGGGATGATTTAAAACTTACCCTGATACTTACACTGCAGGATAATTTTAGATGATAGGTTTTTTGATGTAACTGCTTGATTTATCAATGGCGCGCCCTGCAGGATTCGAACCTGCGACCCACGGCTTAGAAGGCCGTTGCTCTATCCAACTGAGCTAAGGGCGCCTTGTGAAGTGAAGACTTCGTGTAGACGAAACGCGAGAATTATACGGTCAGGCACTCCTGAGTCAATGGCTTTTGTTCTGGTTGCTGACTAAGTGTACGAATATCGTCTTTTCTGGCGCAATGCCAGGTTCCAGGAAATCGCCTGGACACATCTCAGCACGCATAAAGTGGGAATTAAGGCCGCCAGTATTTAGATAATCAATCAGTT [...]
+TGAGTCAGGCCAACTCATCTCTGGGCGAAGTGAATATTGAACTGCGCGGTAACGTGGTGGATTTTACCTGCGCCGTGGTTGCGGGCGACAGTAACAAGTCGGTTAACCTCGGCACCTGGCCGACAAAACAGCTTCACGCCGTCGGTGACGCCACGCAACCGGTAGCCTTTAGCCTAAAACTTGAAGGTTGCCCGCCGGGGGCGGCGTCTATAACGTTTTCCGGGACGCCAGCGCCCGGCACGGCATTACTGGCGCTTGCTGATACGGCAATGGCGCAAAAACTGGCGATTGAAATTCGCGATGGCGATCAACGTCGATTGCCACTTGAACAGGCCAGCAAGGCCGTCGATATTGACAACAACGGCAATGCTACCCTGAAATTCTATGCGAACTATATCGCCTTAGCAGATGGCGTGCAGCCCGGACTTGCTAACGCGGATGCGACCTTCCTGATCAATTACAATTAGTGTCCGTTATTGTGGCTCCCGAACG [...]
+NODE 825 1937 113458 112881 0 0
+AGATCCAGGGGAGAGAATAGTCGCTGGTGGTATCACGTACGCGCCCTATGGACATTGTTAAGCCTGCGGGCGTGAGTTCGCGTAAATTAAAAGATACTGCCGGCACCGTGAAGGTTGTCGTTGAGCCATCGGTTTCAACGACGCTGACGTTAAGGTCGGTATTGCTGCGTATGATGGGGACATTTTCAAGGGTAAATGCCCCAGCGTTCACTGGTGCGGTATAAATAATCTGTCCGGACTGACGAACTTCAACGCGAGCCTGGTGGGTTCGGGCAATACCGTTAATGGTTACGCCTTGTGTATCCTGTGCCAGCCCTTGTTCAGGGATAAGCTGTACGCCGTTGATCGGCGCGCCACTGAATAGACTGGAGTTGACGTTGATCTGCCCAACTTGCGCACGCATTTTTTGTGCCTGAAATACGTGCTCCGCATAGGTATATAGACTATCGGTACGGTATTCTCCATCATTATTCGTCAGCATGTAGCGGCTGC [...]
+TCACGCTTAAATATCTCTGATCCAGACCGTATAAAAAGGTTATTGATCTGTCTCCCTTATTATGGGGAGACAGATTAAAATTAAAGGACTAATTCTGATGCCAGCAGTGACTAAACTTCCATTATTATTACTCAGCGTCCCCTTTGTTTTTTCAGCACTCTTTTCACAGGCTAACGCTGCCGGCATGGTACCGGAAACTACGCTACTGGTGATTGAAGAATCCACACACAGCGGCGTAATGAATGTTAAAAACACCGACAGCAATCCGGCTTTGTTATATACCACCGTCGTTGATTTACCTGACGACAATGGTGTGAAGCTGGATGTCACTCAACCGGTTGTTCGCGTTGAAGCAGGCCAGCAGCAGCAACTACGCTTTATTATGGAAAGCACGGAACCGCTCACCGTCGAGCACTATAAGCGCGTCACGTTTGAAGGTATTCCTCCGAAATCTACCAATAAGGGAATGAAAATAGGTTTTAATCTACGCCA [...]
+NODE 826 230 10375 10146 0 0
+GAACCTTGAGTACCCAGACCTATACCTGATGGATGTTCTGACAGGAAGTTTAATGAATTAATTGCCATATCTATCCGTCCCTGTGTAGATCCACGCGATGCCTGAGACGAATCTGTAAACCTGCCGATCAAAATTTCTGTATAGTTGTCAAAAATATTAGTAGAAATTGCTAAAACGGGTATAATTATTACAAATAAAGTTATTCCACAAAGAAGCATCTTCCGATTTGA
+ACCCGTTTTAGCAATTTCTACTAATATTTTTGACAACTATACAGAAATTTTGATCGGCAGGTTTACAGATTCGTCTCAGGCATCGCGTGGATCTACACAGGGACGGATAGATATGGCAATTAATTCATTAAACTTCCTGTCAGAACATCCATCAGGTATAGGTCTGGGTACTCAAGGTTCAGGAAACATGCTTTCGGTAAAAGATAATAGGTTAAATACGGATAATTATT
+NODE 827 1528 82271 78869 0 0
+ACGGGACTTGAACCCGTAAGCCCTATTGGGCACTACCACCTCAAGGTAGCGTGTCTACCAATTCCACCACCTCGGCACGGATACTGCTATTAGCGCGGGATATCGCTGGTCGGCTGGGCCGGTGCAGCAGGTTGAGTCTGCTCGGTCTTCGCCGGCGCGCTCAGATTTTCCCACTCGCTTCCTTTATTGGTTTTGTTGCTATTGATATTACCCAACACCAGACTGATGATGAAGAACAGCGTCGCCAATACCGCCGTCATTCGGGTCATGAAGTTACCAGAACCACTTGAACCAAATAGCGTAGCGGAAGCGCCTGCTCCGAAGGAGGCTCCCATATCAGCGCCTTTACCTTGCTGCAGCATGATCAGACCTACAAGGCCAATTGCCACAATAAGGAAAACAACTAAAAGAGCTTCGTACATAATCAACCTGTTCCTTGCGGAGTTGCCGCGTACCAATGCTTCTACCAATAAAGCGGGATTTTTACTGTTT [...]
+TCCCGAACGAACTGAGCCTCAACGGCCTGAAAGTGGTTGTGGATTGCGCCAACGGCGCTACCTACCATATCGCGCCGAATGTGCTGCGCGAGCTGGGCGCGACCGTTATCGCCATCGGCTGTGAGCCAAACGGCGTCAACATTAACGAAGAAGTGGGCGCGACCGACGTGCGCGCGTTGCAGGCGCGCGTGTTGGCGGAGAAGGCGGACCTCGGCATCGCGCTTGACGGCGACGGCGACCGGGTCATCATGGTTGACCATGAAGGCAATAAAGTCGATGGCGATCAGATCATGTATATCATCGCGCGCGAAGGGCTGCGCCAGGGGCAACTGCGCGGCGGCGCGGTGGGGACGCTGATGAGCAATATGGGGCTGGAGCTGGCGCTCAAGCAGCTTGGCATTCCGTTTGCCCGGGCGAAAGTGGGCGACCGCTACGTGCTGGAAAAATTGCAGGAAAAAGGCTGGCGCATCGGCGCGGAAAACTCTGGTCACG [...]
+NODE 828 4010 213729 209694 0 0
+GATGAGCGCTCATCTCCGGCAAGCTGAACAGCATGTCGCATTCAGGACAGCGCTGGTAGTGGCTGCGCGGCAGCGCTTCGCTAATTGACCTGATCGTTAGCTTTTTTGTTGGCGTGACGTGTGAGGTGTTCAGAGCCATGTATCGTGAATCAAAGTGTTAGAATAATGTAATCTTAACTCATGACAGGAATAATCTTGAGCAAGAACGCATTTAATGCTTATTTTAATAGCCTGTGTTTAGGAGTAAGACCACGAAGTGATTATATAATGAGCAAAACAGAACTATACGCGGCGTTAAACCGCGATTTTCAGTCGTTAATGGCAGGTGAAACCAGCTTTCTGGCCACGCTGGCGAATACCAGCGCGCTACTGTTCGAACGTCTTACCGAGGTGAACTGGGCAGGATTTTATCTCCTCGAAGGCGATACGCTGGTGTTGGGGCCGTTTCAGGGGCGAATCGCCTGTGTGCGGATTCCGGTTGGTCGCGGCGTG [...]
+TGAAATAAAAGAACCGCCAAAACCAAACAGCAGCGCCATGATCAGCAAGCCTTGCACGCTGCTCGACTGTATCCCTGTCAGGCTCAGAACCAGCCCGAAAACGACCATCACGGCCAGGTTCGTCAGCAGGAAGAGCGCGATTCGCATCATAATTTTCTTTTAACCTCAATTTAACAAAGCGCACTATGCGATTACCCACATCGTATGGGTCTTATGGCTATTTTCAAGCATCACCAGGCGGTAAGTCACGAGAAAAACACAACTTTACATTTTGTAGCATTATCCTGACGACTTCTGCGCTTGTTAAAAAAAAACAGGCACAATTTTTTGTGCCTGTTTAGCGTTACTTATTGGCTGCCGCCTGCTCCGCTGGTTTTTCTTTTTCAAGATGCGCCAGGTCCAGAGCAATCTTCACCGTTTCATCAAGGTACGGGTCCGGCTCCTGGTAATCCTTTGGCAGATCGTCCAGTTTCTTCAGCAACGGTTTACCCT [...]
+NODE 829 10930 586905 579491 0 0
+GCGCGGCGTTAAACGGCGTCAAAGCGATGAGCGGCAGCGCGTATCGCGTGACTATTCCGGCGGTGTTGCAAATAGCCTGCCTGCGACGAATGATGGCAGCCGTTCAGGCGTGAATGCCCTCACAGGGGGAAATATTTTCTTTTCCCCCTTATTAGATCATAGACAGTCCTCTTCCCCCTGATTATTATGCCGCGCCCCGAATACAGAACTCGTTATTCTGGGAAACTATTTCACCATTCAATTATGATGATTTTGAGGAATTATGGGCAACACTAAGTTGGCTAATCCGGCACCGCTGGGCCTGATGGGCTTCGGCATGACCACCATTCTGCTTAACCTGCACAATGCCGGTTTTTTCGCCCTGGACGGTATTATTCTGGCGATGGGGATTTTCTACGGCGGTATCGCGCAAATTTTTGCCGGTCTGCTGGAGTATAAAAAAGGCAATACCTTTGGTTTAACGGCCTTTACCTCTTACGGTTCGTTCTGGCT [...]
+AGCGGAAAATATCGGCGCAGCCGCCCGGGCTATGAAGACCATGGGATTTACTGACCTGCGTATTGTCGACAGCCAGGCGCACCTGGAGCCCGCCACCCGTTGGGTCGCACATGGATCTGGAGATATTATTGATAATATTGAGGTTTTCCGCACCCTTGCCGACGCGCTCCACGATGTGGATTTTACCGTCGCGACGACAGCCCGCAGCCGGGCAAAATTTCATTACTACGCTTCGCCCGCTGAACTGGTTCCCTTATTACAGGAAAAATCACACTGGATGCGTCATGCCGCGCTGGTTTTTGGCCGTGAGGATTCCGGTTTGACCAATGACGAGCTGGCGCTGGCGGATGTATTGACCGGCGTGCCGATGGCGGCGGATTACCCTTCGCTCAATCTGGGTCAGGCGGTCATGGTGTATTGCTATCAATTAGCAGGTTTAATGCAACAGACCACAGAATCCGTTGATATTGCTGATGAATCGCAGTTACAGGC [...]
+NODE 830 115 7865 7865 0 0
+AAACTGATAAGCAGTACGATACGGGTCATGCGAGTGTTAAATCGATGTCGTTTTCGCATACTGTTGGCCTGACTCACAAAGGGTTCCTTAACGTTGGCCCAGCGATATGGGCGGG
+AACAGTATGCGAAAACGACATCGATTTAACACTCGCATGACCCGTATCGTACTGCTTATCAGTTTTCTCTTCTTCTTTGGACGTTTCGTCTACTCTTCTATCGGCGCCTGGCAGC
+NODE 831 513 37421 36535 0 0
+CTTAAAACAGGTAGTAAAATCGAAGGGAGAATGAGCGGTAGTCCCCACCATTTATCTCTGATATTTATATAAGTTTTATTTAGTTTCATAGATGCTCAGCAGAACCCCCCAATCCCAAAGGGGCGTTAACAGACAGGCATCCCACCTGACTTTAAATTGATGATGCGATATACATCACACGATAGTCATCGATTGTAATTATTAAACAAAAGTAACATTTGATTTAAGTCAATTATTACCTTTCTCCTGCAGCCTTTATTCGTCTTTTTATTCTTTGTTATCATTAATTTATTATTAATGTAAATACTAAAATTATCTTCCATAACAATATAAGATAAATCAACTGACGCAATTTTACATTAAGAGGAATTGACCATCGGTTCGCAGTATGCCTTAATGTAGAGTGAACGCAGGCTTGTTACGTTCTTCGCCTTGATAATACCCTTGAAGAACCCAGCCTGATCCCGCCCATATCGCTGGGCCAACGTTAAG [...]
+ATCAGGCTGGGTTCTTCAAGGGTATTATCAAGGCGAAGAACGTAACAAGCCTGCGTTCACTCTACATTAAGGCATACTGCGAACCGATGGTCAATTCCTCTTAATGTAAAATTGCGTCAGTTGATTTATCTTATATTGTTATGGAAGATAATTTTAGTATTTACATTAATAATAAATTAATGATAACAAAGAATAAAAAGACGAATAAAGGCTGCAGGAGAAAGGTAATAATTGACTTAAATCAAATGTTACTTTTGTTTAATAATTACAATCGATGACTATCGTGTGATGTATATCGCATCATCAATTTAAAGTCAGGTGGGATGCCTGTCTGTTAACGCCCCTTTGGGATTGGGGGGTTCTGCTGAGCATCTATGAAACTAAATAAAACTTATATAAATATCAGAGATAAATGGTGGGGACTACCGCTCATTCTCCCTTCGATTTTACTACCTGTTTTAAGTAGCGCAAATACTTATGCGCTTACCAGCA [...]
+NODE 832 4858 233250 229292 0 0
+GGCCAGCGCGGCGGCAAGCTGCTGTTGACCGATAACGCCCTGTTCGAAGACCAGTTTTTTCACGGCGGCGAGGCTGTTGCCCAGGTTGGCGATACCGACCTGCAGACCGGATACCCAGTCATATTTCGCGCCGCCTTGCTTGATACTCTTCGCGCGTTCAATACAGTCATCTACTAGCGCTGAGCAGAGAATATCGTGGACGTTCTCTTCCAGCATGGTGTCGACCACATACTCAATTTCGATCGATTTGCGCGTGTAGTAGCGAATTTGGGTATCCCAGGCGGCCATCACTTCGTCAAAATTGTTAAAGTTGCCTGCGGAGAGCGCCTTTTCCTGCGGCAGAAATACCTTGCCGCTGGTGGCGTCGCGACCGCCTTCCAGCGCCGCCAGCATGACGCGGGCGAAGTTAATAAAGCTCATGCCGGTGCAGCGATAACCCCATTTCCCGCCGACGGCGGTTTCGATACAGCCGATCGCCGCGTAATCGTAAGC [...]
+GTCCCCGGCTTTGATAATTCAGCTATGGATGGTTATGCGGTACGCGTGGCGGATTTGTCCGCCGATAAGCCGCTGCCCGTCGCCGGCAAAGCATTTGCCGGTCAGCCTTACCAGGGAGAGTGGCCTGCGGGCACCTGCATTCGCATTATGACCGGCGCCCCGGTGCCGACAGGTTGCGAGGCGGTAGTTATGCAAGAGCAGACGGAACAAACCGATGACGGCGTGCGTTTTACCGCCGATGTTCGTTGCGGACAAAACATCCGCCGCCGCGGCGAGGATATTCGCCAGGATGCGGTGGTCTTTCCGGCCGGTACGCGCCTGACTACTGCCGAACTGCCAGTGCTGGCGTCGCTGGGAATTGCCGATGCGCAGGTTGTACGTAAAGTGCGCGTAGCGCTGTTCTCGACCGGCGACGAGCTCCAGCTTCCGGGCCAACCGCTGGAGGCGGGACAAATTTATGACACTAACCGTCTAACTATACATTTGATGCTG [...]
+NODE 833 501 65238 53886 0 0
+TAATGGTGCTGTCGGTATTCCTCCGGTGTCATATTGTTCAGCGATTCATGCGGGCGTTCACAGTTATATTTTGATAACCATTTTTCCGTGATTTCACGTACTTCACTCAGCGTTCTGAACAGATAAAAATCGAGTATTTCTGTGCGATATGTCCTGTTAAAACGCTCAATGAAAGCATTTTGTGTCGGCTTACCCGGCTGGATAAACACCAGTTTTACGGCATGTTTCTCTGCCCATTCAGTCAGTGCCAGAGAGATAAATTCTGGGTCGTTATCCATGCGAAGCATGGCCGGATAGCCACGGTTTGCCGCGATCCTGTCAAGCACCCGGACCACTCGTGGGGCTGGCAGATTCAGATCTATTTCAATCGACAACGCCTCACGGTTAAAGTCATCAACGACATTGAACGTGCGAAAACGACGCCCACAGACCAGGGCATCATGCATAAAATCAACAGACCAGCTCTGGTTCAGCGCTTCCGGCGTGGCCAGT [...]
+ATTTTATGCATGATGCCCTGGTCTGTGGGCGTCGTTTTCGCACGTTCAATGTCGTTGATGACTTTAACCGTGAGGCGTTGTCGATTGAAATAGATCTGAATCTGCCAGCCCCACGAGTGGTCCGGGTGCTTGACAGGATCGCGGCAAACCGTGGCTATCCGGCCATGCTTCGCATGGATAACGACCCAGAATTTATCTCTCTGGCACTGACTGAATGGGCAGAGAAACATGCCGTAAAACTGGTGTTTATCCAGCCGGGTAAGCCGACACAAAATGCTTTCATTGAGCGTTTTAACAGGACATATCGCACAGAAATACTCGATTTTTATCTGTTCAGAACGCTGAGTGAAGTACGTGAAATCACGGAAAAATGGTTATCAAAATATAACTGTGAACGCCCGCATGAATCGCTGAACAATATGACACCGGAGGAATACCGACAGCACCATTATTTGGCCGGGAACTCAAAAAATGTATGGAACTAAAACGGGT [...]
+NODE 834 47 5150 2902 0 0
+TTCGCCACTGGCCACGCCGGAAGCGCTGAACCAGAGCTGGTCTGTTG
+TTACGCACCGGCAGCCGTTGTTTGCCCTTACGGCGAAAATTCAGCTT
+NODE 835 252 14741 14741 0 0
+ATCGCGAAGATCGGCAGTTGCGGTAGGCGATGCCATATCCTGAGCTAAAGGTCTTTCCAGGGCGTGTTTCCCTTCCAGAAAGGCGCAGACGGTTTGTAGATGATCGGCGATAAAACATCCTTCTTTGCTGATAAGCCCAACCTCCGCCGCGTTCTCTGTTGCGACGATAATATTTCTGCCGGCCCTGATGGCTTCCGTTGCACTTGATATTGCGCCAGGAACGCCGCGTAATGCGCCTGTAAGCGCTAACTC
+TGCAACGGAAGCCATCAGGGCCGGCAGAAATATTATCGTCGCAACAGAGAACGCGGCGGAGGTTGGGCTTATCAGCAAAGAAGGATGTTTTATCGCCGATCATCTACAAACCGTCTGCGCCTTTCTGGAAGGGAAACACGCCCTGGAAAGACCTTTAGCTCAGGATATGGCATCGCCTACCGCAACTGCCGATCTTCGCGATGTGATCGGTCAGGAGCAGGGTAAACGCGGCCTGGAGATTACAGCGGCAGG
+NODE 836 51 2830 2830 0 0
+TGAGTTAGCGCTTACAGGCGCATTACGCGGCGTTCCTGGCGCAATATCAAG
+ACCCACCAGCTCATATGCCTCAAGATTCGACGCTGTAAGCTGCTCAGACGC
+NODE 837 59 23323 21615 0 0
+CATACCCTTGGGACCTACTTCAGCCCCAGGATGTGATGAGCCGACATCGAGGTGCCAAA
+AAGGGTATGGCTGTTCGCCATTTAAAGTGGTACGCGAGCTGGGTTTAGAACGTCGTGAG
+NODE 838 497 30254 27417 0 0
+CAGTGAACCCAGTAGCCCGACCATCCCACTGTTACGCCAGGCTGAAAGACTGGTGGGAAAACGGTTCTCGGAGGTGATCAATGAGATCCCGGTGGAGTTGCTGGAGAAGTGGGATGCCCTGGAATGATGATGCGCATGTCTGGCGGTTCTCCGTGATTATCTGAGTGACATCAACATTACGCAGTCTGCTTCTGCGCTGAACATGTCCCGATCCCGGTTAAGCACCGCCATGAGGCCGCGCCTTAAATGCCAGTGGGATCAAAATAGCCATGACAGTGAAAGAAGTGGCGGTAATATCCTGTTCGTCATCCAGGCGTAGGCCCATTTGCGTTAGATTCCACGATAGGCGGTGGCACTGCTGAAGACGAAAAAAAACCGTATCCCTTTTACAGTGATACGGTTTTTTTTACTTCACAGGATGTATAAAAACACCCTGAGATTTGTATCTGGCGGAACGGACGGGACTCGAACCCGCGACCCCCTGCGTGACAGGCAGG
+GATACAAATCTCAGGGTGTTTTTATACATCCTGTGAAGTAAAAAAAACCGTATCACTGTAAAAGGGATACGGTTTTTTTTCGTCTTCAGCAGTGCCACCGCCTATCGTGGAATCTAACGCAAATGGGCCTACGCCTGGATGACGAACAGGATATTACCGCCACTTCTTTCACTGTCATGGCTATTTTGATCCCACTGGCATTTAAGGCGCGGCCTCATGGCGGTGCTTAACCGGGATCGGGACATGTTCAGCGCAGAAGCAGACTGCGTAATGTTGATGTCACTCAGATAATCACGGAGAACCGCCAGACATGCGCATCATCATTCCAGGGCATCCCACTTCTCCAGCAACTCCACCGGGATCTCATTGATCACCTCCGAGAACCGTTTTCCCACCAGTCTTTCAGCCTGGCGTAACAGTGGGATGGTCGGGCTACTGGGTTCACTGCTCTCAAACCAGCGACGAATGCACCGCAGGCGCTCCAGCGCATCATTACG
+NODE 839 27 3624 2837 0 0
+TATTCTAACCAACTGAACTACCGCTCC
+CGGGTTCGAGTCCCGTCCGTTCCGCCA
+NODE 840 483 27963 27789 0 0
+CCCGCTACGGCATTTATTCTTTGGGCGGAACAGCGGCTATAACGTCGCACAGCAGAAAAGAACAGTGTGGAGAGGCACAAATGGGTGGGGGCCCTGCCAGCTACATCCCGGCACACGCGTCATCTGCCTTGGCTGCTTCCTTCCGGACCTGACCTGGTAAACAGAGTAGCGTTGCGGGAGAACCAACAGAGCCCCCATTGAGAGCGTTGTGAACCAACGCGCAGGCGCATTATCACTGCTATATCGTGCAATTGCAACCCATCAGGCATCGGATGCTGGTTTCTTGCGCATCCGGGCTTTCCTCCCCCCTTATTCCAGATTATCCTGAAGCATTAACGCAGGATTCTATTATGGATATTCAGGACACATTTCCTCAACGCGTCTGGCAAATCGTCGCTTCGATCCCGGAAGGATTTGTCACGACCTACGGTGATATCGCCCGGCTTGCCGGTTCGCCTCGGGCGGCGCGTCAGGTCGGCGGAG
+TCACCGTAGGTCGTGACAAATCCTTCCGGGATCGAAGCGACGATTTGCCAGACGCGTTGAGGAAATGTGTCCTGAATATCCATAATAGAATCCTGCGTTAATGCTTCAGGATAATCTGGAATAAGGGGGGAGGAAAGCCCGGATGCGCAAGAAACCAGCATCCGATGCCTGATGGGTTGCAATTGCACGATATAGCAGTGATAATGCGCCTGCGCGTTGGTTCACAACGCTCTCAATGGGGGCTCTGTTGGTTCTCCCGCAACGCTACTCTGTTTACCAGGTCAGGTCCGGAAGGAAGCAGCCAAGGCAGATGACGCGTGTGCCGGGATGTAGCTGGCAGGGCCCCCACCCATTTGTGCCTCTCCACACTGTTCTTTTCTGCTGTGCGACGTTATAGCCGCTGTTCCGCCCAAAGAATAAATGCCGTAGCGGGTAGGGGTTTACTGTATAACCAGCCCTGACCATAATGTACGCCATGCTGGC
+NODE 841 2833 143423 140283 0 0
+CGCTTCCAGCGCCGCGTGAGAGAGGAAGGCCTGCAACGGCATCAAATCTTCATCTTCGTCGTTGTAGCTGAACTGCCGCGTCGCCGTCACCAGTTCCTCTAAGTTTTCGATGCGCGTCTGGCCTTTCTCGCCTTTTTCTTGCTCATACATGGTGCGCAGGCCGGAATCTTTGATCACCCGGTCAGTCTGCACATGCAGCGGCATGTCGGCGGTTTCCTGCGCCAGAGCGTCAATCAGTTCCATAAAGCGTTGTAGCGCGCTGGCCGCACGCCCGGCCAGGGCTTTTTCCTGTAACAATTCACGGCACGCCTGCCACAATGTTAGCTGGCGATCGCGCGAGGTCTGGCGCACCACGTCCAGCGTGCGGTCGCCGATGCCGCGCGTTGGGGTATTCACCACGCGTTCAAAGGCGGCATCATCGTTGCGATTGGCAATCAAACGCAGATAAGAGAGCGCATCTTTGATCTCCTGGCGTTCGAAGAAGCGCATCCC [...]
+CTGTTCGCCAGCGATGAAGAGGCGTTATTCCTGTCGAAGCTCGGCAAGCGTATCTCCGCGCGCAATGTCCAAAAACGGTTCGCCGAATGGGGCATAAAGCAGGGGCTAAACAGCCACGTGCATCCACATAAGCTGCGCCATTCGTTCGCGACCCATATGCTGGAATCGAGCGGCGATCTGCGCGGCGTGCAAGAGCTGCTGGGTCATGCCAACCTTTCCACCACCCAAATTTATACTCATCTTGATTTTCAACACCTTGCTTCAGTGTACGACGCGGCGCATCCGCGCGCTAAACGGGGGAAATAATGCGTTTTTACCGGACTTTGGGGCGTATTGCCGCGCTCACCTTTGACCTGGATGATACCCTTTATGATAACCGTCCGGTGATTTTGCGTACTGAGCAGGAAGCGCTCGCTTTTATGCAAAATTATCACCCGTCGCTACGTTCGTTTCAAAACGTCGATTTACAGCGGATACGGCAGGCGGTGCGTG [...]
+NODE 842 251 16307 16307 0 0
+ATCAGTAATGGATTACCGGGATTAACCATGGTTGGCCTACCGGAAACCACGGTAAAAGAGGCGCGTGACCGGGTACGTAGTGCGATTATTAATAGCGGATATGAATTTCCGGCTAAAAAAATAACCATTAACCTTGCTCCAGCCGATCTACCGAAAGAGGGTGGAAGGTATGACCTGCCTATTGCTGTTGCGCTTCTGGCCGCGTCTGAGCAGCTTACAGCGTCGAATCTTGAGGCATATGAGCTGGTGGG
+GGCCAGAAGCGCAACAGCAATAGGCAGGTCATACCTTCCACCCTCTTTCGGTAGATCGGCTGGAGCAAGGTTAATGGTTATTTTTTTAGCCGGAAATTCATATCCGCTATTAATAATCGCACTACGTACCCGGTCACGCGCCTCTTTTACCGTGGTTTCCGGTAGGCCAACCATGGTTAATCCCGGTAATCCATTACTGATATGCACCTCTATAGTGATAGGCGGCGCATTGACGCCAAGTGCGGCGCGGG
+NODE 843 1559 83315 82935 0 0
+GATTTTGTCGGCTTCCTGATTTTGGGCGGGCTGTCGATTATCGCCGCCATCACCTACACCGTGGGTAATCGGCCCTACGGTTATATCGGGCTGGGTGATATCTCTGTCCTGGTATTCTTTGGCTGGCTAAGTGTCATGGGGAGCTGGTATCTCCAGGCGCATACGCTGATTCCGGCGCTGATTCTCCCGGCCACCGCCTGCGGTTTACTGGCGACGGCGGTGCTGAATATTAATAACCTGCGCGATATTAATAGCGACAGAGAGAACGGCAAAAACACCCTTGTAGTACGACTGGGCGATGTCAACGCGCGTCGTTATCACGCCTGCCTGTTGCTAGGCGCGCTGCTCTGTCTGGCGCTGTTTAATCTGCTCTCGCTACACAGTCCGTGGGGATGGTTGTTTATTCTGGCCGCGCCATTGCTCATTAAACAAGCGCGCTATGTAATGCGCGAAAGGGAGCCTGCGGCAATGCGCCCGATGCTTGAACGTACC [...]
+AAGAAAAGAACAACAGCCTGACGCAGGAAGTGCAGTCTGCACAGCATCAACGTGAAGAACTCGAGCGTGAAAATAATTCTCTGAAGGAACAGCAGAGCGGCTGGCAGGAACGTTTGCAGGCGCTGCTTGGTCGTATGGAAGAAGTCTAATCCTCGTCATATTTCACGTTATGGCGGCGTTGGCTGCGTGCGTTCACCCCAGTCACATAGTGGCCTATGCTCCTGGGGATTCACTTACTTGCCGCCTTGCCCTGACGCGAAATCTATAGAGGATTTAGAATGCGGATACCGGTGGGCCGGATAAGGCGTAAGCCGACATCCGGCAATCAGCGACAATGCATAAAAAAGGCGCCTTACGGCGCCTTTTTTGATCACTCGATATCAAGCGGGTCTTCGGAAAGGATAATCCCGGTGTTGTCGGCATAGAGATGATCGCCGGAGAAGAACGTCACGCCGCCGAAATTGACGCGCACATCGCTTTCCCCAATGCCTT [...]
+NODE 844 26 47 47 0 0
+CTTTTTGCTATACGGCTGGCTGGCGG
+CCCCACGGCAGCACGCTCACCACCGG
+NODE 845 147 8140 7998 0 0
+GAGCATCGCGGCGTACTTCCGCGAGGTGCGCAAAAAATACCACGCCTTTGAAGGCCAGCTGAGAGGCTACGACAGCCGTATTCTGGTGGCCCAGGTACCGGGCGGAATGCTCACTAACCTCGAAAGCCAGCTGAAGCAGCAGAACGC
+TACCTGGGCCACCAGAATACGGCTGTCGTAGCCTCTCAGCTGGCCTTCAAAGGCGTGGTATTTTTTGCGCACCTCGCGGAAGTACGCCGCGATGCTCTCCAGCTTCAGGATATCCAGCCCGGTGTCGTGCTCAGTACCTGCCAACGT
+NODE 846 63 5142 5142 0 0
+GAGTTTGTCCGCCGCGTTCTGCTGCTTCAGCTGGCTTTCGAGGTTAGTGAGCATTCCGCCCGG
+GGCGGACAAACTCGACCAGGTGCTGGCGGAAATCCCCCGCGTGCGCGAGGACCTCGGCTTTAT
+NODE 847 4696 273977 268601 0 0
+ACCTGGCTATTTCCGAACTGGTCGTACGCGCCGTGGACGGTAAGCTCTTTACCGAAGACAGTGTGAACTGGAACAAGCTGACCAGCAATCTGCCGCAAACCGCGCCGGTTTCAGAAAACGCTAATGCGGTGGTGATTCAGTACCAGGGTAAGCCATACGTTCGTCTGAATGGCGGCGACTGGGTGCCTTACCCGCAGTAAACCGAAAAAGGCCGCAAGGTTTCCCCTGCGGCCTGGTTCGGGCGCATGTTGCCATTACGGCGGACAGACGCTCAAAACGCATTACTTCCTGTCACGTAGCCAGTTGACGATCACACTGGCGATAATGCCAGCAATGATCGGCGCCGCCAGATCGTGCCAGAAGGCCACGCCCAACTGCGTAAGCGTCATATAGCCGCCTTGTTGCAATGGCAACCGTTCGCGGCTATCCTTGATGTGTTGAGGTTCAAGTTAGCCCCCGTCAGGTTGCCAGGTTTATACCAGTCAACGTGCG [...]
+TTCTCGATATGGCCGCCCTCGGCTTTCTTGGCATGGGCGCACAGCCGCCTACGCCGGAATGGGGCACCATGCTCTCTGACGTATTGCAGTTCGCGCAAAGCGCCTGGTGGGTGGTGACCTTCCCGGGGCTGGCGATTCTGCTGACGGTACTGGCATTTAACCTGATGGGTGACGGTCTGCGTGACGCGCTCGATCCCAAACTGAAGCAGTAAGAGGTTCGAGATGGCGTTATTAAATGTAGATCAATTATCGGTGCACTTCGGCGACGAAGGGACACCGTTCAAAGCCGTCGACCGCATTAGCTACAGCGTGAAGCAGGGTGAGGTGGTCGGTATTGTCGGCGAGTCTGGTTCCGGCAAATCCGTCAGCTCGCTGGCGATTATGGGGCTTATCGATTACCCAGGCCGCGTGATGGCGGAAAACCTGCTCTTTAACGGACAGGATCTGAAGCGCATTTCCGAGAAGGAACGTCGCAACCTGGTGGGCGCTGAA [...]
+NODE 848 1688 85608 84926 0 0
+AGACGATTCGGGGCGTAATTAATGAAAGGCAGCGCGACAGCAAGCAGGGTCAGAACAACCAACAGCAACAGCACACGATTAACCGTGATTTTTTTGGCAGCATCACTCACAGATTACTTCACCCACCCTTTTTGTCGGAGGTAATCAGCGGCGACTTTTTTCGCATCCAGCCCTTCTACGGCGATTCTGGCGTTCAACTGTTGCAGCGTTTTCTCATCAAGGCTGGCGAAAACGGGCTGCAGCCAGTCGGCTATCTGCGGATAGGCCTGTAACACCGATTCACGCACTACCGGCGCGGGGGCATAGATAGGCTGGACGCCTTTCGGGTCGCTCAGGGTTTGCAGACCCAGCGCGGCGACAGGGCCGTCGGTGCCATACGCCATCGCGGCGTTAACGCCGGATGTTTGTTGCGCGGCGGCTTTGATCGTGACCGCCGTATCGCCGCCCGCCAGCGACAAGAGCTGGTTCTGATTCAAGGTAAAATCATAGGCT [...]
+AAACAAATACACCTCACGTTATTTTGACGAAGCAAATGGCCCGCTCTATCCGTTTGGTTACGGTCTGAGCTACACCACATTTACGGTGTCTGACGTCACGCTCTCCTCACCGACAATGCAACGCGACGGCAAAGTCACGGCCAGCGTAGAGGTCACGAACACCGGTAAACGCGAAGGGGCTACGGTCATCCAGATGTACTTACAGGATGTCACGGCGTCAATGAGCCGCCCGGTGAAGCAATTAAAAGGCTTTGAAAAAATCACCCTCAAGCCCGGCGAACGTAAAACCGTGAGTTTCCCGATTGATATCGAGGCGTTGAAGTTCTGGAATCAGCAGATGAAATATGACGCGGAACCCGGCAAGTTCAACGTCTTTATCGGCGTGGATTCCGCTCGCGTTAAACAAGGATCGTTCGAGCTACTGTAAGCCTGCCGTCAACAGGGCGCGATAGCTGCGCCCTGTCTGGCAATGACTTTTCCTGTCCCCCCTTT [...]
+NODE 849 4675 186724 182996 0 0
+AATTATCTCACAAACCTTCATGTGCTCCTGGACAAATCTTACCGCACCCACGTTATTACACGCTTTATCATAAGCACCCATTTCTTCATTCCTTAGCAGGTGTTTTTAAAACCACCATGTTCATTATTTCTCCACCAGTCGCAGCGCATCCACATACCGCCCTTCACTGTTCTGCTGCCAGAACCAGCCTTGCCCCGGTGTTGCCTGCCCCAGCGTCTTACCCGGCCAGCCCGGCCACGGCAGATAACGCACGCCCGGCAGTTCTACTACCGGTGCTTCATCCGGCAGCCCGGTCAGTTCCCGGCTGCGCTGCGATGTTCGTCGTAACCCGCGCAGCCACTGCGCCCACCACGGCCCCGGCTGCCACATCGCCCATAGCTGGTCCACCTGCTCCGTCAGCCGCCCGCGCCGCATCGTGTCCAGCGTGATATGCTGCGCCGCCAGCCTCGCCAGCCAGTACAGCCAGCCCTGCGTCTCCTGCAAACTCTCGTC [...]
+TTGCTGATGCTGCTGGTACTGTGGCTGGTCAACTGGTCGATGAGTATCATCGGCATCAGTGTCCTGTGCCTGGCGATTGGCTTCGTCACACCGCTGCTGGCCCTGGGCGATGTCCATCCGTTTGCGCCGCTGTGGGTCCGCCTGACCCTGATTGGTTTCATCCTGCTGATGTACGCGCTGTACGGCCTGTACCGGCTGTGGCGTGCGCTGCGTATGGATGAACAACTGCTGCGTCGCTTCCTGCATCCGCGCGGGGAAGAGGTACCGGTGGCAGGCGAGATCAAAGCCGACCTGCGCACCGTCAACCATATTGTCACGCAGGCCATCCGGCAGCTGCGGCAGTTGCGGGTGGATATGCCTGGCTGGCGTAAAATCTTCGAGGGAAAACGCTTTCTGTATGAGCTGCCGTGGTTCATGGTGGTCGGCAGTCCCGGCGATGGCAAAACCACGGCCCTGCTGAACACCGGATTGCAGTTCCCGCTGGCGGAGCAA [...]
+NODE 850 212 9654 9654 0 0
+ACGGTCCCAGCCAAACTGCACCTTTACCCGCCCGTACTGATCCGTCCAGATTTCCTGGCCCGACGGGCCGGTGACAATGGCGCTCTGCGGTCCTTTGGTGTGGGGTTTGCTGATGGTTCGCTGCGGGCGGTACACCTCGCGGGTGGGGTGCAGTTCAAAACTGGTGGAAAAGGTAAAGTGCTGGTCCTGCCCGCTGTGCTGCGCGTTGTCCT
+AGTTTTGAACTGCACCCCACCCGCGAGGTGTACCGCCCGCAGCGAACCATCAGCAAACCCCACACCAAAGGACCGCAGAGCGCCATTGTCACCGGCCCGTCGGGCCAGGAAATCTGGACGGATCAGTACGGGCGGGTAAAGGTGCAGTTTGGCTGGGACCGTTACGGCAAAATGGATGAAAACAGCTCCTGCTGGATACGCGTCAGCTACCC
+NODE 851 51 5680 3787 0 0
+AGACTACTTCGACAAGAGTGAAGGCGAGATGCTGACGCGCATTCGTATGGA
+TCCCGGCCACTCATAATGCTCGTAGGTGGCATGACCGGTTTCACGCGGGTT
+NODE 852 26 2893 1438 0 0
+AGCGCAGCGCAGCCCCGGCAGTCGGG
+TCGCCTTCACTCTTGTCGAAGTAGTC
+NODE 853 3534 204715 203405 0 0
+GACACCGGGCGGTACTGAACCGGACCGTCGCCGGAGTGATTGGCACGGCGCTGATGGCGGCAATGGCGGGCAGGAAGGTTTACTGGGTCGGGGGCATTGAGGGATACCGAACGGAGGCGCTTGAAGATCTTTACTGGTTCCAGATGGATATGCCGGCCCGGATGCACTCTGACCGGTTGCGCAGGGATTACCGGAATTTTGATGAATACCGTCATATTGCGAAGGTGACGAAGGATGTGGAAATGAATCAGTCCATACGACTGCTGGAGCTGTGTTTTCCGTTACCAAAAAAACTGGAGCTACTCAGGGAGCACACAGTCACGAACGAGCGGGAGGCTGATCTCACGGTTTCAACGGCGCACCGCAGTAAGGGGCTGGAATGGGAGCGGGTTGTACTGGGGGATGATTTTCAGGATATCGCTGATCCGCTGATGTCAGAACAGGAGCGCCGGGATGAAACTAACCTGTTGTATGTGGCGGTGACCCGGGCAC [...]
+GGTGGTTCGATTCCGCCTCCGGGCACCAAACGCATCAAAGTACGCTGGTTAAGGGATGAGATCCTTAACGGGCGTTTAATACGGGGTCCGGTCATAACGAAATCTCCGTGTAAGTGTGGTTACACTATGGTTTCAGTATCGGTTCCTCAAACAGAGCACCTGTCCCCTCAGGTGCTCTGTTCTCGTTTCCGCTAAAAATGCTTACACCATTCCAGCCTGATGTCAAGATGTCTTTATTCTGTGTCTGTCGACTCCACTTCAGAAACATCTGAACTCTGCTCGACTTCACTGTAACCATAAGAGTGTTTTCTGGCCTCATGAATACGTCTCTTCGTTCCCTCGTCCGTGGATAACGAAAGTTCAGCTTCCAGCGTCTGGGCTGCCACCTTCAGTGAAAGATCAACATACTCCATCGTGGTGGCAACACTCCTGTGTCCCAGAATGGATTTCACCATATGCAGATTGCGCTCCGGTGCCTCCATCAGTTTTGTC [...]
+NODE 854 110 41151 36657 0 0
+CAACTGTTTATTAAAAACACAGCACTGTGCAAACACGAAAGTGGACGTATACGGTGTGACGCCTGCCCGGTGCCGGAAGGTTAATTGATGGGGTCAGCGCAAGCGAAGCT
+GTCACACCGTATACGTCCACTTTCGTGTTTGCACAGTGCTGTGTTTTTAATAAACAGTTGCAGCCAGCTGGTATCTTCGACTGACTTCAGCTCCATGAGTAAATCACTTC
+NODE 855 51 19174 18498 0 0
+AGCCTGGCCATCATTACGCCATTCGTGCAGGTCGGAACTTACCCGACAAGG
+TGTCTCCACCCGAGACTCAGTGAAATTGAACTCGCTGTGAAGATGCAGTGT
+NODE 856 110 38254 37132 0 0
+AATTTCGCTACCTTAGGACCGTTATAGTTACGGCCGCCGTTTACCGGGGCTTCGATCAGGAGCTTCGCTTGCGCTGACCCCATCAATTAACCTTCCGGCACCGGGCAGGC
+CCTGATCGAAGCCCCGGTAAACGGCGGCCGTAACTATAACGGTCCTAAGGTAGCGAAATTCCTTGTCGGGTAAGTTCCGACCTGCACGAATGGCGTAATGATGGCCAGGC
+NODE 857 847 48259 48192 0 0
+GCAACTGCTTTAATGCGTTTGCCCCGGCTTCAAAGGTAAAGTCGCCACGGGCGATGTAATGCGGATCGACCACAATGCCACTGCGTCTTAATGCCTGTACGTAACCTTGTAAGCGATAGTGACAGAGCGGCATATCTTCCGGCCCCGCAATACAACCAATCCGCTTGTGGCCCAAATCCAACAGGTAGTTCATGGCATTGAACGCGGCGGTCAGGTTATCGATATGTACCGTCGGCAGTTCAAGCTCCGGCGCAAACTCATTCGACATCACCATCGGAGGCAAATTGCGCTGCTCCTCAACGCTGGCGTCAAAGGGCAGTCGGGAACTGAGAAGTACCATGCCGTCGATCTGTTTGGTGATGATGAGATTAAGAAAGGTTTTTTCTTTCTGGTTTTGATGGGCGCAATCGCCAATCAGCACCAGATACCCCTGTTCTGCCGCGGTCACTTCGATACCGCGGATAATTTCACTGAAGAAGGGATCGCAAATAT [...]
+GCACTATCTGATAAAAATGTTTTCGATGAGTGTTACCAGGGATAGATCTGCGCCAGCAGTTCCCAGGCGAGGAGAAAGAGTGAAATCGAACAAGCAGGTTACTGCCGCTACGATGAAGGATGTTGCGTTGAAGGCGAAAGTCTCTACGGCAACCGTATCCCGCGCGTTAATGAACCCCGATAAAGTCTCCCAGTCGACCCGTAGCCGGGTTGAACAGGCCGCGCTTGAAGTGGGTTATTTCCCGCAGTCGATGGGGCGAAATGTAAAACGCAATGAATCCCGTACGATTCTGGTGATTGTCCCGGATATTTGCGATCCCTTCTTCAGTGAAATTATCCGCGGTATCGAAGTGACCGCGGCAGAACAGGGGTATCTGGTGCTGATTGGCGATTGCGCCCATCAAAACCAGAAAGAAAAAACCTTTCTTAATCTCATCATCACCAAACAGATCGACGGCATGGTACTTCTCAGTTCCCGACTGCCCTTTGACGC [...]
+NODE 858 3134 161907 160523 0 0
+GACTTCCGCCGCCGCGCGCAAATCTTCAATGCGCGAATTGGTACAAGAGCCGATAAAGACTTTATCGATAGCAACGTCCGTTAACGGTACGCCCGGCTGTAAGCCCATATAAGCCAGCGCTTTTTCGGCGCTGGCGCGCTCAACCGGATCGCTAAAGGAGGCGGGATCGGGGATGATGTCGGTGACGGAAATCACCTGGCCCGGATTCGTGCCCCAGGTCACCTGCGGCGCGATCTCTTCTGCTCGCAGGGTGACGACAGTATCAAAAGTCGCGCCGTCATCGGTTTTCAGCGTTTTCCAGTACTCGACGGCTTCGTCAAAATCGCGGCCCTTCGGCGCGTGCAAACGCCCTTTTACGTAGTTGAAAGTGGTTTCATCCGGGGCGACCAGACCGGCTTTGGCGCCCATCTCAATCGCCATATTGCACAGAGTCATGCGGCCTTCCATACTCAGCGCGCGGATAGCGTCGCCGCAAAATTCAACCACGTGCCC [...]
+CGCGTCAGGTTGAAGGCGCGATGAACGGTATCGGAGAACGTGCCGGTAACTGCGCACTGGAAGAAGTGATCATGGCGATTAAAGTGCGCAAAGACATCATGAACGTACACACCAACATCAATCACCACGAAATCTGGCGCACCAGCCAGACCGTCAGCCAGATCTGTAACATGCCGATCCCGGCCAACAAAGCGATTGTCGGCAGCGGCGCTTTCGCCCACTCTTCCGGCATCCACCAGGATGGCGTCCTCAAGAACCGCGAAAACTATGAAATCATGACGCCAGAGTCCATCGGTCTGAATCAGATACAGCTGAACCTGACCTCCCGCTCTGGCCGTGCCGCCGTGAAGCATCGCATGGAAGAGATGGGTTACAAGGACACAGACTACAACATGGACCACCTGTACGACGCGTTCCTGAAGCTGGCGGACAAAAAAGGCCAGGTGTTCGACTATGACCTGGAAGCGCTGGCCTTTATTAATAAACAGCAAG [...]
+NODE 859 3836 278221 272111 0 0
+AAGAGATTATTTGTCTCCAGCCACTTAAGTGAGGTGATTTATGTTTGGTGCTATTGCTGGCGGTATTGCTTCTGCTCTTGCTGGTGGCGCCATGTCTAAATTGTTTGGAGGCGGTCAAAAAGCCGCCTCCGGTGGCATTCAAGGTGATGTGCTTGCTACCGATAACAATACTGTAGGCATGGGTGATGCTGGTATTAAATCTGCCATTCAAGGCTCTAATGTTCCTAACCCTGATGAGGCCGTCCCTAGTTTTGTTTCTGGTGCTATGGCTAAAGCTGGTAAAGGACTTCTTGAAGGTACGTTGCAGGCTGGCACTTCTGCCGTTTCTGATAAGTTGCTTGATTTGGTTGGACTTGGTGGCAAGTCTGCCGCTGATAAAGGAAAGGATACTCGTGATTATCTTGCTGCTGCATTTCCTGAGCTTAATGCTTGGGAGCGTGCTGGTGCTGATGCTTCCTCTGCTGGTATGGTTGACGCCGGATTTGAGAATCA [...]
+GTCGGGAGAGGAGTGGCATTAACACCATCCTTCATGAACTTAATCCACTGTTCACCATAAACGTGACGATGAGGGACATAAAAAGTAAAAATGTCTACAGTAGAGTCAATAGCAAGGCCACGACGCAATGGAGAAAGACGGAGAGCGCCAACGGCGTCCATCTCGAAGGAGTCGCCAGCGATAACCGGAGTAGTTGAAATGGTAATAAGACGACCAATCTGACCAGCAAGGAAGCCAAGATGGGAAAGGTCATGCGGCATACGCTCGGCGCCAGTTTGAATATTAGACATAATTTATCCTCAAGTAAGGGGCCGAAGCCCCTGCAATTAAAATTGTTGACCACCTACATACCAAAGACGAGCGCCTTTACGCTTGCCTTTAGTACCTCGCAACGGCTGCGGACGACCAGGGCGAGCGCCAGAACGTTTTTTACCTTTAGACATTACATCACTCCTTCTGCACGTAATTTTTGACGCACGTTTTCTTCTGCGT [...]
+NODE 860 1140 55099 52838 0 0
+GCGGTTAAATTCGCCCTTCCAACCTGGGGTTGGCTGGTATTAATGCTGTGTATCGCGCCGGTATTCTTCACCCTCCTGCTGGAAAATAACTGGTCTGGCTATGTGCTGGCCATTGTCTGCGTCTTCGCGGCGCAACTTATCGCCCGTATTATGGTTAAATTTCCCGAACACCGTCGCGCCTTGTGGCAAATCGTTCTGTTAATGATCACCGGCACTCTCTTCTGGGTTCTGGCGCAGCAGGGCGGAAGTTCGATCAGTTTATTCATCGACCGTTTTGTCAACCGCCACTGGCTGAACATGACCGTCCCCACCGCATTGTTCCAGTCGGTCAATGCGATTGCGGTGATGGCGGCGGGCGTGGTGCTGGCGTGGCTGAGCAGCCCGAAAGAGAGCGCCCGCTCGGTGCTGCGCGTCTGGCTTAAATTTGCCGTGGGACTGGTATTAATGGGCGGCGGTTTTATGCTGCTGGCGCTAAACGCGCATCAGGCCCGG [...]
+ATATATGGTGGATTTTCTGCCGAAGGTAAAAATTGAAATCGTTGTGCCTGACGACATCGTGGATACCTGTGTTGACACCATCATTCGTACCGCGCAGACGGGGAAAATCGGCGACGGTAAGATCTTTGTCTTTGATGTCGCCCGCGTTATTCGTATCCGTACTGGCGAAGAAGACGACGCGGCTATCTGATGTGCCGATTCGCTGCCCGTCTCCTCCTTGTGGGCAGCGAACCACCGTTTAATCGCCCTGCGGTAGCGCCGATGTAGTCCGGGTGCAAACCCATCTCAGGCCGACAATGGCGACGATCAGCGCCACGCAACTTAGCGTCCACTCGCCCATTTGCGAGAAAAAGTGTCCGTAGGCGGCTACCGCCGTATCACTAATTTGCGATTCCGTGGTTTGTTGCGCGACGACGCCAGCCAGCCAGTTAGCGACCGCGCCGGTCGCCAGCATATAAATACCGGTCAGCACGCCCGTGACGCCAGGCAGGT [...]
+NODE 861 5554 306542 305074 0 0
+CTATCCACGGGGCGATCCCCTGCGAGAACATGTAGCGTAATGAAAAAATCATGCCAATTATGTAACTCATTGTTTTAACAGAAGCGTCAATCATTCCTGTGCACAATAAGTCGGGCAAAACCAGTATGCCGCACCGTTTTGGGGCACTGATTTAGTGCATGAATAACAACGTAGAGATACAGGGTCTATTTAGCGTAAAAATTGTTGTTAAAACAATCTTTAATTAACGATTGTGTGATGTAATTATTACAAATGATTCACTTTTATCGGAGGGGAGTACAAGACGTGTGCACTATTTAAGTGCAAAACCCCTGTGACAGGCAGGGGGATAGGGATGACTTATATACCTGTGTACATCAAGTTGCAGGTGCGTTCGCTTCAGTGACCGACGGAAGTCAGGCTTCTGCGGATTCGCTGCGTTTGTACCTTCCTGCAACTCGAAGTATTCAGGGTAGAGATAGATTTATTCGATGTTGGATTCGATAAACCACA [...]
+ATTTGAATAAATCCTAACGATGCCAGGCGCTTAAGCATTTTGGCCACAGTCGGCTGGGAGACGCCGAGCCGCGCCGCCATATCCACCTGACGCGCTTCCCCTACCTCAATAATTAAATCGGAAATCAGCTCAACGTAGTCGTCTATCAACTCACGGCGATGCGCCTCTCTGACCTGACGAAATCCTTCAACGTGTTCTTCTACGTTCACCAATTGCGTCACTTTTTTTGTTGTTGGCGTACCTGCGCGACGACCCATTTTGCTTCCTCGTTTCTGTGACGCGTTAACGCGTCAGCTGACAGAGCGCTCATTGTAAACCAGAGTTGTCCGGGCACAAAAAATTAACGTTTTAGCAATAGCTATAAAACATAGCCTGTGCTATATCTGTATGTAATGCAGACATCCCTCACGGATCGATGGGATAGAAACATCAGGAGGTTTATATGAACGAATTTAAGAGGTGTATACGCGTGTTCAGTCACTCTCCCTTTAA [...]
+NODE 862 19 956 956 0 0
+AAAAACAATGTGGAAGCGC
+TCTTGCTGAACCTGAGCAA
+NODE 863 3319 181742 178060 0 0
+ATCAGTGTGCCAATCGGCCAGAATAGGGCGACGCCCAGACCGCATAGCCAGTAGGCGGCTTTACGTTGTTCGGGTGTTTTTTGCGACAGGCCGAACACCACGCTCTCATCATTCATAATATGGCAGCCGAAAAAGCTGGCGGCGCGGGTGCCAACCAAATCGCGCACCGTTACGCCAAACGGCACGTGGCGCGCATTCACCAGCAGTCCTGCCGCCGCCGCCGCTAACGGATTGCCGCCGCTGGCAACAATGCCGATAAACATAAATTCGGACGCGCCCGCCAGTACAAAAATAGAGAGGACAAACGGCACCCACAGTGGGAAACCGTAGGCCATCGCCAGTGAGCCATAGGACATGCCGACGACGCCCACGGCCAGGCACACTAAAAATATCGCTTTTATCGTGTCTCCCTTGAGACAGGAAAAATAGTGTTTCATCTTCTTTAGTCATATCGAACGAATTTTCATTATAATGAACGGAACAGATTTGCTT [...]
+GCTTAACCCACGACGCGGTACCCACCTCTGAACTCCCGGCGCATTTCCTCTCCCACTGCGAACGCATCAAAGCCACCCACGGCAAAGACCGCGTCATTATGCATTGCCATGCGACTAACCTGATCGCCCTCACCTACGAACTGGAAAACAACACTGCGCTGATCACCCGCAAACTGTGGGAAGGCAGCACCGAATGTCTGGTGGTATTCCCGGACGGTGTCGGCATTCTGCCGTGGATGGTGCCAGGCACCGATGAAATCGGCCAGGCCACCGCGCAAGAAATGCAGAAACATTCGCTGGTACTGTGGCCGTTCCACGGCGTGTTCGGAAGCGGACCTACGCTGGATGAAACCTTCGGTTTGATAGATACCGCAGAGAAATCCGCTGAGGTATTAGTCAAAATCTATTCGATGGGCGGTATGAAGCAGACCATCACGCGCGAAGAACTGGTCGCACTCGGCAAACGTTTTGGTGTGACACCGCTGGCCAGCG [...]
+NODE 864 6330 317658 314539 0 0
+AGGTGTAGTGGTCGACAATCTCATGGTCCGGCCGGTTGAACTGTGCGCCTAACGTACGCTCGGCAATCGCCAGCCCGACGGCATTCGCCAGCCCCTGGCCCAGCGGTCCGGTGGTGGTTTCAACGCCGGGCGTATAGCCAATCTCCGGGTGACCTGGCGTTTTGGAGTGCAGTTGACGGAAGTTTTTTAGCTCCTCCAGCGGCAGGTCATAACCGGTTAAATGCAGCAGACTATAGAGCAGCATGGAGGCGTGACCGTTGGAAAGGATAAAACGATCACGGTCATACCAGGTCGGATCGGTGGGGTTATGTTTAAGAAAATCGTTCCATAGCACTTCAGCGATATCCGCCATCCCCATTGGCGCGCCGGGGTGCCCGGAATTGGCTTTTTGAACGGCATCCATGCTCAGCGCACGAATCGCATTGGCAAGGTCTTTACGGGACATAAATCACTCCATGCAAGGTTTATAGTTTGGCGGCAAGCAGGTCTTCC [...]
+GGCTGCCAGGGTTCCGCCAGTTCGATTTGTAGCCACACGGTCAGCGCGATGGCGCTGTCGAGCGCGGCGCGAAAGCCGAGGCGCGGGTCGCTTTTGGCGACCATTTTGTCCGCCGTCAGATGGGTCAGCGTATCGGGCTTTTTCACCACCGGCTGGCGGCACAGTTCACAGCAGGCCTGTGGGTGCGTATCGCTACTGGTTAAGCCATGTACCGGCTGCGGCTGCTGTTCGTCATCATCGACAAACAGCCGGCCTTGCTGATCCAGAAACTTAATGCGCAGGCGGCGGCTTTCCAGCAGTTCCCGGGCCGAGGGCGTCAGTCGTGCATCAGCGGGCAGATGGATTTCCGATCCTTCGCTGAGCGTGTGATTCGCTCTGAGCCACGTTTCGGTGATGAAATCGTTCATACGGATTGCCAGTTTGCAGGCCAGGCGACGTACAGAAAGCGCACGGACGTTGGCGTGCCAAATTCAATGCTGGAGCCTTTAGGGA [...]
+NODE 865 8945 485247 478008 0 0
+GAGGTGCGTCATCTGAATCAATACCAGACGCGCGGCGCCTTTGCTTACATCTCAGATGATCAGAAAGTCTATGCGCGCTTCTTCTGGCAACAGACCGGACAGGATCGCTACCGCCTGCTGCTTACCAACCCGCTGGGCAGCACCGAGCTGGAGCTTAACGCCCAGCCGGGCAACGTCCAGTTGGTGGATAACAAAGGCCAGCGTTATACCGCCGATGACGCCGAAGAGATGATCGGCAAACTCACCGGGATGCCGATTCCGTTAAACAGCCTGCGGCAGTGGATCCTCGGTCTGCCTGGCGATGCCACCGACTACAAACTGGACGACCAGTACCGCCTGAGCGAAGTGAACTACCGCCAGGATGGTAAAAACTGGAAAGTGGTTTACGGTGGCTATGACAGCAAAACGCAGCCTGCCATGCCTGCCAATATGGAGCTTTCAGACGGCAGTCAGCGCATTAAGCTGAAAATGGATAACTGGATTGTGAAATGA [...]
+AGAAAAGAACTTACCCTGTTAGATCTGCGTTAATTTAACGAATTGATTTTTATAGATGAATGAAAGACATTAGAGTCTATTATAAAATAGACTGTAATTAAAATTGCACATCTGTCTGTTTTTGATATGTGTATTCCAACAACAGAGTCAGGCAGCTTGTGGACGAATTAAAATTCTGCGGCTCGCTACGAAAGTTGCTACAGCCCTTAAAAACTATAGGCGCTGTCGAATCGCTATGGACAGCCTTTGAGAAACGCAAAGTATTTCTGACGGAGGCAAGATTATTTATCCGGCGATCAAGGATGCGTCAAAAAATGGAGTGTGTTGCTCTGGAGTGCTGGTGAAGAACCGTTTTATTATCGGAGTTTGGTGACCGTCTGAACGATCACCTTCAAGAAAGCAGGCAGTTAAAGAGAATTACTAGTAACCTCTGATAACAGGCACTTTTCATACTCTTCTATGCATCATAAAATGCTGTCTGAACTTGTTAAG [...]
+NODE 866 1005 50507 50446 0 0
+GGCATCTTCTTTAGCATTTTCTACACCTTCGGCAATCACTTGTAAATTTAGCGCCTGAGCCACCGCGACAATCGCCCTAACCAGAGATTGCGACAGCGGTTGCTTATGGATATCTCTGACGAAAGCCTGATCCAGTTTAACGGCATCAATAGGGAACCGGGCGAGTTGAGAAAGCGAAGAATACCCTGTGCCAAAATCATCCAGATGAATCTGGGCGCCGAGCTGACTAAATTGCTGGATAACCGATAGCGCCAGCGTGTCGTTTTCGATCAGGCAGCTTTCCGTTAGCTCGACATCGATCGGGCAATACTCAAAATTCAGATCGTACAAAGCCTGTTTAAGCGCAGTAAAAAGCGTCTGGTCGGCCAGTTGTCGCGCCGAAAAGTTAACGGCTACGCGCAAGTTAATCCCCTTATCGCGCCATTTCGCAATCTGGCGAACTACATCCAGAATCACCCAGCGGCCCAGCGGGACGATGAGTCCTGACTCTTC [...]
+ATTGCTGGCCAGACTGGGGGGAGATGAATTCATTGTCCTCGCTGCCCATACGTCTCAGGCCGCGCTGGAAGCAGTAGCCTCACGAATCCTTACCCGGCTGCGGCAACCGTTTCGCATTGGACTCATTGAAGTTTACACGGGATGCGCCATTGGCATTTCGTTGGCCCCCCGGCACGGACAGGACAGCGAAAGTCTCATTCGCACTGCCGACACCGCAATGTATAACGCCAAAGAAGGCGGCCGCGGTCAGTTCTGCGTTTTTTCGCCGGAAATGAATCAGCGCGTATTTGACTATCACTGGCTGGATACAAACCTGCGAAAAGCGCTGGAAAACGACCAGTTACTTATTCACTATCAGCCCAAAATTACCTGGCGCGGCGAAGTACGTAGCCTGGAAGCGCTGGTACGCTGGCAATCGCCGGAACGCGGATTAATTCCGCCGCTGGAGTTCATCTCATACGCCGAAGAGTCAGGACTCATCGTCCCGCTGGG [...]
+NODE 867 51 2807 2807 0 0
+GCTCTTACAGGCCGTTTCGCTGGCGCTGTTGAGTTGTCTGGAGGAAGATCA
+CTGATCGCCAAACATATGCCCATAGGCGTCATTAATTTTCTTGAAGTTATC
+NODE 868 4276 236032 234877 0 0
+TGTTCGCCTGGGCACTGATGTTAAAAGGAATGCGGATTACCCCTACGCAACAGGCTATCACCTGTTAATTATCTGCAGCCAGTGATGTGCGCAGTTTCTGGCGCACCGGGTTAACCCTATATATTGCAGGCTAATTATCTGCTGTCACTGCGGTAATTCAGGAATATTCCTGGGCGCTGACGAAAATATTCTAATGCTTTACCCTTCCAGTAAAATAAATACGCAATTCAGACTTTGCTTAAGCATAAATTAGTACTATAGTCTGTACGAGGTTTTTTAAAAAAGAGGATGCACGCTAAAATAAGGAGAAACGAGATGTTAGGCAGTATTAACCTTTTTATCGTTGTATTAGGAATTATTTTATTTTCCGGATTTCTGGCCGCCTGGTTCAGTCACAAATGGGATGATTAATGAACGGAGATAATCCCTCGCAGAGCCGGCCCCTTGCTGCATCGTTGCGCAAGGGGCCGCTTTTGTCTGGATGGCAGGCAA [...]
+CATTGCCTGGCAGGATTAAGCCCGGAAGAAATGACCGTCGCTGCCGAAGCGGCGCGTGAAAAAGGCCTGGAGGAGCGCTGGTTCATTCCGCTCCTTAATACGACGCAACAGCCTGCGCTTGCTACGCTGCGCGATCGCCAGACCCGCGAAAATTTATTCGCAGCGTCATGGACTCGGGCGGAAAAAGGAGATGCCCACGATACCCGCGCTATCGTTCAGCGTCTGGTAGAGATTCGTCGCTGTCAGGCAAAACTGCTGGGTTTCCCCAATTATGCCGCATGGAAAATGGCCGATCAGATGGCGAAAACGCCGCAAGCCGCACTGAGCTTTATGCGTGGCATTGTGCCGCCAGCGCGTCAGCGGGTACTCAATGAACAGGCGGAAATTCAGAACGTCATTGATGGTGAGCAGGGTGGCTACACCGTTCAGGCCTGGGACTGGATGTTCTATGCCGAACAGGTACGGCGGGAAAAATATGCGTTAGATGAAGCG [...]
+NODE 869 51 3396 3396 0 0
+GCCGTGGTGGAACGTCGTCGGCGATCGTAAATACCAGAAACAGAAGCTGGC
+CACTTCGTCACGCAACTGGAAATGGGAAATGAGTTCTTCGGTGCTAAAGGC
+NODE 870 5834 311713 307654 0 0
+CGCCGTTTTCCGCGCTGGCGCTGGCGGAACTGGCCCGGCGCGCCGGAATTCCCGCAGGCGTATTTAACGTCGTTACCGGTTCGGCAGGCGATATCGGCGGCGAGCTGACCAGCAACCCGCTGGTACGCAAACTGTCGTTTACCGGCTCGACGGAGATTGGCCGCCAGCTAATGGAACAATGCGCCAAAGACATTAAAAAAGTGTCGCTGGAGTTGGGCGGCAATGCGCCGTTTATCGTCTTTGACGATGCCGATCTGGATAAAGCCGTCGAAGGCGCGCTGGCTTCGAAGTTTCGCAACGCCGGGCAGACCTGTGTCTGCGCCAATAGATTGTATGTTCAGGACGGCGTTTACGATCGTTTTGCGGAAAAACTCAACCAGGCGGTAAATAAGCTCGCGGTCGGCGACGGCCTGCAAGCCGACGTCGCTATCGGGCCGCTGATTGATGAAAAAGCCGTGGCGAAAGTCCAGGAGCATATCGCCGACGCGCTGG [...]
+CCAGTTGCGCATGTGGAATATGCTCGCGCAGATATTCGTCGGCGTCGCGCACATCAATCAGTTTCGCGCCTTGCGCTATCAGCGCTTGCGCCTCACGGGGGGAAACTATCCCAATGGACATCGTGCCTCCTTATGGACAATAGAGATTCTTTAACGTGGCGATAAGCGTATTAACCGCCTCATTTTTAATGAAATAGTGAATGCGCTGGGCATCGCGTTGACTATCAATCAGTCCTTCTTCCCGCATCCGCGCCAGATGTTGCGACGTCGCGGAGGGGCTTAGCCCGGTAATGCGCGCCAGTTCGCCTGCGCTGGTTTTTGGCGAACCGCAAAGCATACATAAAATCAGTAATCTTTTTGGGTGGCTCATCGCTTTGAGCAGGGCCGCCGCCTGTTCTGCGCTGGCCTGAAGTTGTTCAAGCTCTGTCATAGTTATTTAAGCATTTTCTAAATTTAGTTAATTCTAAAATAAACGTCAACCTAATGCCAGCG [...]
+NODE 871 3384 181197 180173 0 0
+TAGCGTAATGCTGACATCATACGGTAAACCGTATTTTATCGCCGACAATCAACTGTTGCGAAACGCAGGAGAGTTCTCCTTTGTTATCAATCATTTCACTTTTTATCAGGATCAGCGGATAACCCTCGTTGACGCTAAGATAATGGGCGACTTCAAAGCTGGCATAAACCAGTTCGATCATCTTACGGGAGTGGGTAAACCATAAGTGGTGTTTCTCGCGTAAGCATTCATACAAAGAGTGATTATTAAGATCTTCGTCCAGCAAAAACGCAAAACGTGGGGGAAGATGTACGGTTTCCAGCGATACCGCCACATCGTCGGCATAGCGGATACGTTCAATGACGACCGCTTTTTCGCCATCGTTCATATTCAGTAACGCTTTTGTCTCATCGTCTACCGATTCAAAAACGGATTTGATGGTGCGTGACCCCGGGCGACGTCCCTGGGACTGGCATAACTCGCTGAAACTCATGATGCCGGTCATGCTGCGCT [...]
+GTACGCCTGAAGAGCGTGAGCAACTTATTTCCGGCGCTTTGTGGGGCGGGGTTGGCGTCATGACGCTGGCGATACTGGCGGGCGCGTTCTGGCTATTTAGTTCGTCGTCGCCAGGCTCCGATAACGGGCAAGCTCCCGCAATGGCGCAGGATGAACCGCCGCGCGAGGCGCCTTCCGCGCGGGAAACGCTCAATCATATGGGGATTACCTGGGATGCGTTTACCATGCGGGCGGCGATAGAGCGCAATGATACGCGGGTGACGGCGCTGTTCCTCCAGGGCGGAATGAACTGGCAGCTCGCGTGGACGGAGCAGGCGTTTGCGGCAGGACATACCGAGGTGCTGCAACTGTTGTTGCGTTATCCCGCGCTGATGGATGAGGTCAAACCCTGCCGACGATTTATCACAACGTTAAGTCATGACATGTCGAGCGGCGCGCCGCTGACCGCGATGCATAAAACCTATTTGCAAACGTTTTGCACCGTTCCGGCTG [...]
+NODE 872 51 2059 418 0 0
+TCTCCCCCGGCCTGCCGATCTTTAAGCCGCGCGGTTTCCCAGAACTGGCGC
+ATAAGCATGAGATTAGCGAGAGCATAGAACCACCGCGTAAGCGGCCTCCGC
+NODE 873 1268 77965 75345 0 0
+AATTCACGTTCATCCGCCAGCAGAAACGAAGCGGGATTCACGCGAGTACGTTTTTCGGCATAGGCGCGCTGGATGGGCCGAACGATTTGCTGATACTGAACGTTTAGCAGCATAAGCTGCGCTGAGGTGAGCGGCTGCCTGGCGATAACCTCGTTTCGCGAGAGGCGGCAATCATCCAGAAACATACGCAGGGTGGTGCGCGACTCGGCGAACAGCGTTAACGCTGAGGCGTCATTAAAAATTCTGACGTAATGACGGGCAAATAATTTTTTATCGACCACCATAAGCGCCAGTTCGCTGAACAACATGCCTTCCAGCGCATGTTGATCTTCTCCCTGTTTTAACCACTGGCGCAAACGGTCCGGGCCAAAATGTTGCTTGAGGTAGTGATTCAGCGACGCCCGATCCGGCCATGCGCGCGCAATAAGCGCTTTTAACGTCAGTTCTATCGCCCGAAGCTGACGCTGCGCCTCAAGATGCGCCTCCTGGTCG [...]
+CTGCCACTGTTTAATAAACGCGATGCAGGCGGAGCTAAAGCGAGATGAAATGTGCGGCATGGCATCTTTCTCATAAAAAGCGCGATTATAAAGTGTGCTGCACGCGTGGCTAGCGGTCAGACGGCCAAACGCAGGCAGGGAAAAGGTCTATGCCGTTCAGCGTCACGCCGCGTTGACAGAATGAAAAACTGATGTTTTTGGTTAGTAACCGATCTTCTTATAAATTTGCAATCATTAAGATTAAGTCACTGAAATGTGGCTAAATCTGTTATATCTATGAAAAAACATAATTAAAAGAAAACGAAGATCTCGTCGCGGGATCGTCTTTTTAGGGAAGATAATGACGAATAGCGCTTCGCAGGCGACACGCGCGCCTTTTGAACATAGCCTGGGGATTATCCGCCAGGCATCAATAGAAATCCTGCTGCTGCTGGGTATTCATACCACCGAGGGAAAAGAGCCCCGGTGGTTCATGGAACAACTTGAGCAGGC [...]
+NODE 874 2511 138194 137600 0 0
+TCCTGGGTTATTTATCGCGATGTATGCAGCCTGGTTTGCGACGCTGGCGGTCATGCTGCAATCAGAAACGCTGGTGGGGTCAGTGTGGCTGTTAGTGGTGTTATTTATCGCATTTAATGGCTTCTTCTTTTTCGACATCGCCCCGCGTTATCACTATAACGACATCGATGTGCTGGACCTCCGGGTCTGTTACAACGGCGAATGGTACAACACCCGCTTTGTTCCCCCCACGCTCATTGAGACGATTCTTCAGTCTCCACAGGTGGATAATGAACATAAAGTCCAGCTGCAAAAAATGGTTGCCCGTAAGGGCGAACTTTCCTTCTACGATATTTTTACGCTGGCCCGCGCAGAAGCCAGCCGGTAATAAAAAAGTGCGCACCCTCCCTGGTACGCACTGCTTTCCCTGAACTGTTGGTTTTTTAACGTCTTTTTTTACGCCCCTGAACCGCCTTAAAACGCGGATTTGTTTTACAAATCACGTATAAGCGT [...]
+GTTTGAGCGTTTTCGCCATTTCAATAATATGCGGCGTGACGTTTTTATATTCCAGCGCATCGACAAAAGATTTATCAATTTTAAGGACATCCACATCCAGATTTTGTAAGTAGCTGAGGCTGGAATAGCCGGTGCCAAAGTCATCAATATAAATGGAATGTCCCGCGTTACGGTATCTGGCGACAATGGGCGCGCTGGTTTTCGGATCGGCGAACTCGCGTTCCGTTAACTCAAGCGCGATTTGCGACGGAGAAATTTGGCTACGGTTCAGCAGCGTGCTTAACAGCGTCGGCAACGTTTCCGACGCCAGATCGGATGCCTCAAGATTGATTGAAATATGTTGTTCGGGATGGGACTTTAACCAACTCCCCATGTCTTCAAAAACGGTTTCGATGATTAGCCGGGTTAGCGGCTCCGTGAGCCCGGTTTGTTCAGCCAGCGCGATAAAAATTTCCGGCGAAAGGAAGGTGCCGTCCGCCTGTTGCCAGCGAG [...]
+NODE 875 4507 245045 243375 0 0
+CGATGGTCGCGCTGTATCCTTTCTCCTGTAAACCAGAAGATGTGATGTTTGCTCAGGAGTCGATGCGTGAACGCTACGTCTTTACCGATGTGCAGCTGCGCGGCTATTACCCGTCCTATGTGTTGAACGAGTGGGAGCGCCGCGGATTTAACATCAAAATGGAAAATGGCGATCTTGAAGTGCTGCGCGAAGGCACCTGCGATTATCTTGGTTTCAGTTATTACATGACCAACGCGGTCAAAGCCGAAGGCGGTAGCGGCGATGCGATTTCCGGTTTTGAAGGCAGCGTACCGAACCCCTATGTTAAAGCATCTGACTGGGGCTGGCAGATTGACCCGGTGGGTCTGCGCTATTCATTGTGTGAACTGTACGAACGCTATCAAAAGCCGCTGTTTATTGTCGAAAACGGTTTTGGTGCTTACGACAAAGTAGAAGAAGATGGCAGCATCAACGACGACTACCGAATTGACTACCTGCGCGCCCATATTGAAG [...]
+CCTCTGATGTCCATCCGCAAACTCTGGACGTCGTGCGTACGCGTGCCGAAACCTTTGGCTTTGACGTCATTGTGGATGACGCGGCGAAAGCACTGGATCACCAGGATGTGTTTGGCGTGCTGTTGCAGCAGGTTGGCTCCACGGGCGAAATTCACGACTACAGCGCACTGATTACTGAGCTGAAATCCCGTAAAGTTGTGGTCAGCGTCGCCGCCGACTTTATGGCGCTGGTGCTGCTTACCGCGCCGGGTAAACAGGGCGCGGACATTGTTTTCGGCTCTGCGCAACGCTTCGGCGTACCGATGGGGTACGGTGGCCCGCATGCGGCGTTCTTTGCCGCCAAAGACGAATTTAAACGCTCCATGCCAGGCCGTATTATCGGCGTCTCAAAAGATGCGGCGGGCAATACCGCACTGCGCATGGCGATGCAGACTCGCGAGCAGCATATCCGCCGTGAGAAAGCGAACTCCAACATTTGTACCTCGCAGGTAC [...]
+NODE 876 2996 217479 217137 0 0
+TACGTCAACAAGAGAAATCGGTTTAATAATTTAAAATAAAACATCCATAAAATAACACCCAGACTAAAACTATTCTTTATCGTCCGAAGATTTTATTTCCCTGGCGCTACTATAAAAGCATAACAATTATGTAGCATTAATGCATTGTGACCAATAGCCTATACCTTTTTTATGGTTGGCATAGGCCTTGCGCCATAATTCAAATTATTTTATGCCAACAATAAATCAATCAAAGCATATCAATATACTGATAAAAATTAACACTACTATCATTTTATTTTTAGAGCGACTAAAAATAAAATTTTAGTTTTTCTAAAAAACCATCATTTTTGTGACACGATACGATTTTCTCTGGAAAAAAGACGCTATTACAATCACACCAGTTGATCCACAAATTTAATATGCATATTATTATCGCTACCCCAATTAAACCCATTAAATAACATCATGACTATTTATTTAATTAACAGCACGCACACTTACAATGATAAG [...]
+AAGAGGGAGTTGAACGTTATATTATTGTCGAGAATATTATCACGCCGATATCGTCTCCTCATGCAACGGTAAAACGAGATTATTTGGATGAAGATAAGCAATTAACAGTGCTACGCATTGTCTATGACTGAACCGCGTAGCAGACCGCAGATGGTGTCCCGTCAGTGTCGTGTGAGGATATTATGAAAAATGTTCTCACCTTCCCGGGACACGGTCTACAGACTTTATCTTCAGATAAACGGCGCTAAAAAGAAAAGCACGATCAATAAAAAAAGAGTGGGAATACCAATGGATATAATTTTATTACATCGGTGAGTATGATGTTGAATAGCTTGTGGCGGTATGTCAGCAGCGTCAATGATAAATCTTTCATCGATTTTTATCCCCTGCCTGGGGAGCGTAACGAACAGTTCGAAAAGCCCGATTTGTTGTAAATCTCGTCGCAACAGATAAAGAAGTTGCGTCAAATTAGCATCGCTAACAAATTGACTT [...]
+NODE 877 106 50950 30265 0 0
+ATTGAAGAGTTTGATCATGGCTCAGATTGAACGCTGGCGGCAGGCCTAACACATGCAAGTCGAACGGTAACAGGAAGCAGCTTGCTGCTTTGCTGACGAGTGGCGG
+GCATGTGTTAGGCCTGCCGCCAGCGTTCAATCTGAGCCATGATCAAACTCTTCAATTTAAAAGTTTGATGCTCAATGAATTAAACTTCGTAATGAATTACGTGTTC
+NODE 878 5 1889 1300 0 0
+ACGGG
+GACTT
+NODE 879 4 1408 502 0 0
+TGAG
+GTTC
+NODE 880 5 1604 622 0 0
+TAATG
+TTACC
+NODE 881 1183 63338 63106 0 0
+CACCAAATTTATCGCCGCAGCGGCGCAGTATACGGACGGCGTCGATCCGTGGCACATTCTGGAAACCGGCGGTACTGAGATTCGTAGCGCAATCCCGATGGGGTCTGTGCTAACCCTACCGGCAACCGGCTCAGAATCGAACGCCGGCGCAGTCATTTCCCGTAAAACCACTGGCGACAAACAGGCCTTCCACTCCTCGTTCGTGCAACCGGTGTTTGCCGTACTGGATCCGGTCTACACCTATACATTGCCGCCGCGCCAGGTTGCGAACGGCGTCGTGGATGCTTTCGTCCATACCGTTGAGCAGTACGTCACTTACCCGGTTAACGGCAAAATTCAGGATCGTTTCGCCGAAGGCATTTTACTCACACTGATTGAAGAAGGTCCCAAAGCGCTGCAAGAGCCTGAAAACTATGACGTCCGCGCTAACGTGATGTGGGCCGCTACTCAGGCGTTAAATGGCCTGATTGGCGCTGGTGTTCCGCAGGACTG [...]
+CTTCATTCTGATATGCTGTGGCGGTATCAATCGATCGATAGCCCACCTCCAGCGCTTTATGAATCGCCGCGATCACCTCTTCATTGCTTGCTTTCCAGACTCCCAGCCCAAGTTGTGGCATTACGTTGCCATCCTGTAGCCTGATAATGGTTGGATTAGCCATGATGTGTTCCTCTTTTAATTGGCTCGCCGGAGTCGGGTCCGGCGAGACTAAGTGACTTAAGTCTGGACGAAATGGCCAAAAACGAAAGTCAGAGGCGAAAAAACCTTAGCGCGCCGCTTCATAAATCCGACGGCTGACATCCAGCGTAATATCCTGATTTTCACCTAAATTTGTGCATCCATGCGCCTCAAGTTTAGCCAGTAGCGCCGGAATAGTGCTGCCATCCAGACCGTAATCGGACAAGTGGGTAGGCACGCCCATCTGTTCAAAGAAACGGCGGGTGGCGGCAATGGCGGCATCAATACGCTCGTCGTCGGAACCGTCGGTGA [...]
+NODE 882 9219 501017 498668 0 0
+AACGGCCAACTGTGGGATGTGAATCGCATTGATATTACCGCCCAACAAGGCACCTGGGAGCGCTGGACGGTACGCGCCGATATGCCGCAGTCGTTCCATATTGAGGGCGTCTCTTTCCTGATTCGTAACGTCAACGGCGCTATGCCGTTCCCGGAAGATAGAGGCTGGAAAGATACCGTCTGGGTGGATGGGCAAGTCGAACTGCTGGTCTATTACGGTCAGCCGTCCTGGCCGCACTTCCCGTTCTATTTCAACAGCCAGACGCTGGAAATGGCTGACCGCGGCTCGATTGGACAAATGCTGGTGAATCCGGCGTCGTAAAGCGTCCGAGTACGGGTCTGAATAGCGCAGACCCGTCAGGGTTTTCAGGAAGGAGCAAACAGCGTGGGAAGCAGCAGACTCAACTGCGGGAAGTAGCAAATCATCGCCATGACCACAAAGAGTGCCAGAAACATCGGTAATAGCGGTTTGACGACTTTATCAATACTGATT [...]
+TTTATCACCACCAAGTTGTGGAATGACGATCAAAAACGTCCCCGCGAAGCCCTGCAGGAGAGTCTGAAAAAACTGCAGCTTGATTATCTCGATCTCTATCTGATGCACTGGCCCGTACCGGCTATCGATCACTATGTCGACGCCTGGAAGGGCATGATCGCGCTGCAAAAAGAGGGGCTGGTAAAGAGTATCGGGGTCTGTAACTTTCAGATCCATCACCTCCAGCGTCTGATCGATGAAACCGGCGTTACCCCTGTGATCAACCAGATCGAGCTTCACCCCTTGATGCAACAGCGCCAGCTACATGCGTGGAATGCGACGCATAAAATCCAGACCGAGTCCTGGAGCCCGCTGGCGCAGGGCGGCGAAGGCGTATTCGATCAGAAAGTGATTCGCGAACTGGCGGATAAATACGGCAAAACGCCCGCCCAGATTGTTATTCGCTGGCATCTGGACTGCGGGCTGGTCGTCATTCCGAAATCCGTCACCCCT [...]
+NODE 883 1275 73647 73113 0 0
+GCCACTTCAACCACAAGTTTATCCGGCACGGTAAACCTCTTTGGCGCGAACCGTAAACGCCTGCACCATGTTGGACGCTAACTCTTTGAATATACGACCAAACGCCAGCTCAATGAGTTTATTGGTAAACTCAAAATCAAGCTGAAACTCAATACGGCACGCCTCGGGGCTGAGCGGGGTAAATTTCCAGCCGCCGATCAGCTTTTTAAAGGGGCCATCCACCAGATGCATCAGAATGCTCTGGTTACGCGTTAGCTGATTACGCGTCGTAAACGTCTTGCTGATACCCGCCTTCGACACGTCAACAGCCGCCGTCATCTGTGCTGGCGATGACTCCAGGACGCGACTACCAACACACCCAGGCAAAAACTGGGGATACGATTGCACGTCATTCACTAACTGATACATCTGTTCCGCACTGTAGGGGACTAAAGCAGTCCGACTAATCTGAGGCATAGCAATTCCCATCAACATAAATCGTGTAAATAATAC [...]
+TGATAAGCGTCAGACGCAAAGAATATATTTTCGAGGCATGAATGAGATATGAATATTGACCAGCTTCATACTGAGAAGCTGGTCACAAAAAATGTCTATTATCGGCCTGCATTTTTCATAATGCGTGCTTTATCCAGTTGCCACTCACGTTCTTTAAGATCGGAACGTTTATCATGTTGTTTTTTACCTTTCGCCACGCCGATCTTCACTTTGCACCAGGCATTTTTCCAGTACAGAGAAAGCGCGACGACAGTATAACCTTCACGATTAATACGGCCATACAGCGAATCAAGCTCACGCTGATTTAACAACAGTTTGCGGGTTCGGGTTGGGTCGCATACGACATGTGTCGAGGCGACCGCCATCGGCGTAAAGTTTGCGCCAAACAGCCAGGCCTCGCCATCTTTGAGGATAACGTAACTGTCGCCGATATTGGCTTTTCCTGCGCGCAGAGATTTTACTTCCCAGCCTTGCAGGGCGAGACCAGCCTCG [...]
+NODE 884 10978 534992 530227 0 0
+TCCACGCGGTCACGAACGCGGATGGTCGCAGATCGCTGAAAATTTTTATGGCACCACTATGGGTAAAACTTTCAGTAAACGCACATTAAAACTGGACGCTCCCCCTGCTATTCATGTGTATGGCAATGCCGCCGTTGCAGAGTTCGACTGGCATTTTACCGCGGTACGCCGTGATAATGGGCAGACTCAACACACGACAGGCCGCGAAAGCCAGGTGTGGGCGAAGATACCAAACACAGGATGGCGAATCGTTCATGTCCACTACTCCGGTCCAGCCAAAACCGGCGTTGGAGAAGGCTATTAAGCTTTGCTCTTCAGGTTATGGCGCAGATGAACATTCTGCGCCAGTTAAGTCGAGCTCAGGTCAGTTGATAGTGCTTATCCGGTATCCGTTTTGCCGGAATATCCCTTTCATCATTCATTTGCAGTAAATCGATTTCTATCGCATTGCATATCGCATCCAGCGGTAAATCATTATTTTCAGTACCGAAC [...]
+AGGATGACGCCGCTGGCCAGCGGGTTTACCGCCGCACCCAGCCAGCCCAGCGATTGCGCTGAAAAATAGCTGGCTTTCATCCCGGCAGGCGCAATGTTGTCAATTAACATATATTCGCCGGGGGCATAAATAATTTCGCCAATCGTAAATACTGCCGCTGAAAGCCCCCAAAAAAACAGATTGTCGCCTGAAAAAATAAATCCGATGAGCCCGGCGATAAAAAAGACGGTGCCGGTCGTCATCATTGGTCGAATATTGACGGCGGTAAGTCGACGGCCCACGGCGTATTGCAAACTGACCACAATAACCGCATTAACCGGCAGGACGACGGCTACCACTTTTTCCGCGAAGCCGCTATCGGCAACGACCATAACGTACTGTGAAATACAGGACGCAAAGGCGCCCCCCACAAAGGAGGCCAGAAATGCCGAAAGCGTAAACCACAATAATGCTTTGTCGCGCAGCAGAACGGAGGGAGACCAGATAGCGGCA [...]
+NODE 885 1342 72360 69665 0 0
+CTCGTCTTCGACCGCCATAATAGCGTCGGGGTCGGCGCTAATGTGGATAGTGATATGGGTTCCTTCAGGGCTATAGCGATGCGCGTTTTCCACCAGATTTCGCAACAGCATACGCAGTAACGTCGCGTCACCGCGCACCACCACGTCCGCCGCGCTTTCCGGCAGCAACAGAGTTTGCTGGCGCGTTTCCAGCATAGTGTTCAGCTCATCGTAGGAGGGGAGGATCACATCTTCCAGCAGTTTTACTTCCTGATAATTCCCGGAAGAGAATGACTGGCCCACGCGCGCCAGTTGCAGAAGCTGGGAGACGCTATCCATCATCTGGTCAAGACGGGCGATAAGCGGCGCGACATCAACATTGTGGGTTTTTGACAATAATTCCAGATGCAAACGCACCCCCGACAGCGGCGTGCGTAGCTCATGGGCCACATCGGCGGTAAAAAGGCGTTCATTGTCGAGCGTGGTGGTCAAACGCGTAACCAGTTGATTGAT [...]
+TTACCGGGCTGGATGTCGGCGCAGATGATTATCTGGTTAAACCCTTCGCCCTGGAGGAGTTGCACGCCCGCATCCGCGCGCTGCTGCGCCGCCATAATAATCAGGGTGAAAGTGAACTGACGGTTGGCAATCTGACGCTCAATATAGGCCGCCATCAGGCATGGAGGGATGGACAGGAACTGACCCTGACGCCTAAGGAGTACGCGTTGCTCTCACGGTTGATGCTCAAGGCAGGCAGTCCGGTGCACCGGGAAATTCTTTATAACGATATCTACAACTGGGATAACGAACCCTCGACCAACACTCTGGAAGTGCATATACATAATTTGCGCGACAAAGTCGGCAAGTCGCGCATTCGCACGGTTCGCGGGTTTGGCTACATGCTGGTTGCCACTGAGGAAAGCTAAGTGAGCCTGATGCGTTTTCAGCGAAGAGCGATGACCCTTCGCCAGCGTTTAATGCTGACAATTGGTCTTATTCTGCTGGTGTTCC [...]
+NODE 886 4021 223829 220494 0 0
+CTGCCCGCCAAGCTGCCCCTGCGAGACGCACCAGTCGGTGGAGAGCGCCAGCGCCGGCGCCCATAGCTGCGCCATTTTGTAGCAGCGATCGATCCAAACGAAATTATCGCGCGGGGCGAAGTCGGCCAACTGGAACCGTAGCGGAGCGGAGTATTCACTTTCCGGTAACGGCTCGACGCGCTTATCCGATACGCGCAGTAGTAACGGCAGGCGGAAGTGGCTGCCGGAAAACGCGATCATGTTTTTGTCCCGATCGACGGTAAAATCTTTTATCTCTTTCGGGAAATTCCACAGGCGAATGATATCCGGCTTCATCGCCAGCACTTTCTCTTTTACATTCAGGAACACTTCCGACAGCGACTGCCCGGAAAGGCTGCTACGTCCCAGACCGATAAAATTATCGCCGCCGAGAATATCCAGCACCGTTGCGCCGTTGTCCATCGTGTTGCGTTTGACCGCCAGCGTCTCCTGCTGCGGTTTATCGCCGCGCAG [...]
+AATTGGCCTCTCTGTACCGGGATTATGGCTGTACCGCAAACGCCCCCGCGTGTGAATGGTGGAACGCCTCCTGCTGTTCTTACAGGTCTGTGTGGTACTATAAAAACAGTCGCCCTTCTCGGTTGTTGTTCCATATTGAGAAACATTATGTCTTCCAGAATTTTAACGTCGGACGTCATCGGTATTGACGCCCTTTTACACGATCATCATGCTGTGCTGGCGAAGTCAACGGGCGGCGCAGTGGCGGTATTCGCTAATAATGCGCCTGCCTTTTATGCCGTGACGCCTGCACGCATGGCTGAACTGCTGGCGCTTGAAGAAAAGTTATCACGTCCGGGAAGCGATGTGGCGTTAGACGCGCAATTTTACGAAGAACCCGAAGCCGCCCCCGTTGCGATTCCCTGCGGAAAATTCGCCATGTATCCCGCCTGGCAGCCGGATGCGGATTTTCAGCGTCAGGCTGCCCTTTGGGGAGTGGCGCTTCGGGAGCCG [...]
+NODE 887 1561 89483 88784 0 0
+CAGAGGAGACAGCCAGCAAATTAGGGTTGGTGTTATCTGCCTGACCAGAGAAAGCCACGGCAGCGGTGGCCGCCACTTTCGGATCGCAGTCATTCAGGACGATGGAGAAAGGCACCTGCGCGGTCGTATCATCAATCGCCGTAAAGCTGGCGGTACGGTATTGGCCCAGCGTCACCGTTTGATCGGCGGATTTAGTGCTGACGGCACAGGCTGCATTAACCAGTTTACCTTCGAAATGAATAGTACCGCCACTCACGCTCACCGGAGTAGGATCAGCCGCAACCGCTGCGCCAGCGACAAACATCAGACTCGCAATAGTAGAGGTCATTAATTTATGTTTCATGGATTTCCCTTGAATTACACACACCCGGTTTCGGCATCCTGTCGGCTCCGTTTGAATTATTATCGACATAGCATGTCAGAAAAGTTATCTCTGCATCCTGTAAAGATAGATATCGCAGATTAATTAGTTTTCTGTTTCTCCCCTGAGTA [...]
+CAATGAGCAAATCAGCATGCTCGACATGGTGACGCAGATCTTTGGTAAAGCGGTGCGTAACGGTAGTCGTACAGCCAGCCAGCAGCAGCTCCATGCTCATCGGGCGTCCAACGATATTGGACGCGCCAATGACCACCGCATTCAGGCCGTAGGTATCAATATTGTAACGCTCAAGCAGGGTCACAATACCGCGGGGCGTACAGGGACGCAGGCGTGGCGCACGCTGACACAGACGACCGACATTATAAGGATGGAAACCGTCTACGTCTTTATCTGGCGCGATACGCTCCAGCACTTTAACGTTGTCGATGCCTGCCGGTAAAGGCAACTGCACCAGAATACCGTCAATCGTGTTATCTGCATTCAGAGTATCGATAAGCGCCAGCAGTTCGGCTTCGCTGGTGGTTTCTGGCAGGTCATAGGAGCGGGAGACGAATCCCACTTCGTCGCACGCTTTACGTTTACTTGCGACATAAATCTGTGAGGCCGGAT [...]
+NODE 888 760 39930 39760 0 0
+GCGATGGCCGAAAACGTTGCCGTAGGCGACGCCAAATTTAAAGGCCAGCACGTCGGCATCGGGGAGCATCGCCAGCACAACACCGGCAAACAGCAGGCGAGGAGGGATAACTTTCAGGCCTAAGCCTGCGCCAAAACACAGGGGAACGGCGGCGTGGGTGATAACGGTAGGCATAGCGATGGTTCACAGGGAAATAGCCATGCTATCAGTTGGAACGCAGAGGATTAAGTGGATGATTATCTGAAAAGACAGCGTAATCAGGCCGGATAAGACGCTTTGCGTCGCTATCCGGCACTCTGTATTAGGCCACGACGTTCACACTTTGGCCTTCAAAGCTAACAGTTTGCCCGGCGACAATTTTGCAGCGTTTACGCGTTTCAACCACGCCATCAACCTTCACCAACCCGTCGGCAATGGCGATTTTCGCCTGCGCGCCGCTTTCGCTCCAGCCTTCCAGCTTGAGCAGATCGCACAGCTCGACGTGCGGGTGCT [...]
+GCAATTGTGATTGATGTCGGTATTAACCGTCTGGAAAATGGCAAGGTCGTTGGCGACGTCGTGTTTGACGAAGCCGCGGCGCGCGCGTCATACATCACGCCAGTACCGGGCGGCGTCGGCCCGATGACGGTCGCCACGCTTATCGAAAACACGCTGCAGGCGTGCATTGAATATCACGATCCACAAGGAAAATAACATGGCGACATTCTCTTTAGGCAAGCACCCGCACGTCGAGCTGTGCGATCTGCTCAAGCTGGAAGGCTGGAGCGAAAGCGGCGCGCAGGCGAAAATCGCCATTGCCGACGGGTTGGTGAAGGTTGATGGCGTGGTTGAAACGCGTAAACGCTGCAAAATTGTCGCCGGGCAAACTGTTAGCTTTGAAGGCCAAAGTGTGAACGTCGTGGCCTAATACAGAGTGCCGGATAGCGACGCAAAGCGTCTTATCCGGCCTGATTACGCTGTCTTTTCAGATAATCATCCACTTAATCCTCT [...]
+NODE 889 611 34930 34631 0 0
+CGATATGAACCAGGTGCTGGCTTCAAGCGCCGGTAACGCGGTGGAAGTGCGTGAAGCCGTGCAGTTCCTGACCGGTGAATACCGCAATCCGCGCTTGTTTGATGTCACTATGGCGCTATGCGTGGAGATGCTGATCTCCGGTCAGCTGGCGAAAGACGACGCCGAAGCGCGTGCCAAACTGCAGGCGGTGCTGGATAACGGTAAAGCGGCAGAAGTCTTTGGTCGTATGGTGGCCGCGCAGAAAGGGCCGAGCGATTTCGTTGAGAACTACGATAAATACCTGCCGACCGCCATGTTGAGCAAAGCGGTATATGCTGATACCGAAGGGTTTATCAGCGCAATGGATACGCGTGCGCTGGGGATGGCGGTCGTCTCGATGGGCGGCGGCCGTCGTCAGGCGTCAGATACCATTGATTACAGCGTTGGCTTTACCGACATGGCCCGTCTGGGCGACAGCATCGACGGGCAGCGCCCGCTGGCGGTGATTCATGC [...]
+GCTTTATCGTCAAGGATAATTGCCGCTTTGACGGCCTTCGCCGCTTCCTGCCAACTGGCTTCGTCTTTGGCATGAATCACCGCCAGCGGGCGCTGCCCGTCGATGCTGTCGCCCAGACGGGCCATGTCGGTAAAGCCAACGCTGTAATCAATGGTATCTGACGCCTGACGACGGCCGCCGCCCATCGAGACGACCGCCATCCCCAGCGCACGCGTATCCATTGCGCTGATAAACCCTTCGGTATCAGCATATACCGCTTTGCTCAACATGGCGGTCGGCAGGTATTTATCGTAGTTCTCAACGAAATCGCTCGGCCCTTTCTGCGCGGCCACCATACGACCAAAGACTTCTGCCGCTTTACCGTTATCCAGCACCGCCTGCAGTTTGGCACGCGCTTCGGCGTCGTCTTTCGCCAGCTGACCGGAGATCAGCATCTCCACGCATAGCGCCATAGTGACATCAAACAAGCGCGGATTGCGGTATTCACCGGTC [...]
+NODE 890 51 3960 3960 0 0
+CTGATCTGATCAATTATTTTTGAAGCACTAAGTACGGAGAAGATATGAAAC
+GTATACAACTATTCAGTAATTCGACGATAGACCGAAGGTGTGCTTGCTGGC
+NODE 891 2467 134195 133809 0 0
+ATTGCCAGCACCCTTGATAGAGTGAGCTTTGCTCCCAATGACAGTGCCCTGGATAGTCTGTTGCTACATAATAACAACGGTATTATCGCGATGGATAATAATCAGCAGGTCAGTGGGAAAATGATGAACGTCACGCTGACATTAACACCTGTCTTGAACGATAATCAATTTACGCATTCTACCGATACGGTCATGCTGGAAAGCAATTTACAGTGGGAAGTGCTGACGAAATAACCGATGAAGGGGGCCTGCTCTGGCCCCCTTCACAATCTTATTCTTTATCGCCCAGCAGCACAGATTCCAGCGCGATTTTGATCATGTCGTTGAAGGTCGTCTGACGCTCAGCGGCAGTGGTCTGCTCGTGGGTACGGATATGGTCGGACACGGTGCAGATGGTCAGCGCTTTCGCGCCAAACTCAGCCGCAACGCCGTAGATGCCCGCCGCTTCCATCTCTACGCCCAGTACGCCGTATTTTTCCATCACGTCGAACA [...]
+GTGCATTTATTATGGTGCTGGACTCATTCGGCATCGGCGCTACTGAAGACGCGGATCGTTTTGGCGACGTAGGTTCCGACACTCTGGGCCACATCGCAGAAGCTTGCGCCAAAGGCGAAGCTGACAATGGCCGTAAGGGCCCGTTGAATCTGCCTAACCTGACTCGTCTGGGGCTGGTGAAAGCGCATGAAGGCTCTACCGGTAAAATTGCCGCCGGTATGGACGGCAACGCGGACGTTATTGGCGCATACGCATGGGCGCACGAACTGTCCTCCGGCAAAGATACGCCATCCGGCCACTGGGAAATCGCCGGCGTGCCGGTACTGTTCGACTGGGGCTATTTCAGCGACCACGAAAACAGCTTCCCGCAGGAACTGCTGGATAAGCTGGTGAAACGCGCCAACCTGCCGGGCTATCTCGGTAACTGCCACTCGTCCGGCACCGTTATTCTGGACCAGCTCGGCGAAGAGCACATGAAAACCGGCAAGCCGA [...]
+NODE 892 843 38932 38605 0 0
+GCGGAACTGCCGCTGACCAGCAGTACCCACTCTCCGGTTCCCGCCCCGATACTGTCGATAGCGACGGCACACTGCCCGTCGGGGTTGCCCTGGGCATCGATCATTTCCACCATCAGCAATTTGTCATGCGCCAGTCCCTGATGGCGGACGGTACATACGATTTGTCCTGTGACGACTGCCAGTTTCATATCCGCCTCCATGGATTGCCCGTTGGGTCGTAGGCCTTGAATCTGCGCACCATCAGGCAATGGCGCGCATTCATGCCGGATGGCGACGCTGCGCGTCTTATCCGGCCTACCATCAAATGTTGCTGTCGCCTTTGAAGCTGATCGGGAACACTTCTTCCAGATCGCCGTGCGGGCGTGGAATCACGTGTACGGAGACCAGCTCGCCAATGCGCTGCGCCGCAGCGGCGCCAGCATCGGTTGCGGCTTTGCACGCCGCCACGTCGCCACGCACCATGGCCGTACACAGGCCACCGCCAATCTGCTT [...]
+TATCGCGCTGTTGGGCCGCTAATTCAGGGGCTTGCCGCGCCGCTTCACGACCTCTCCCGAGGCTGTAGCGTGCAGGAAATTATCGAACTGGCGTTGGTGGCAGCCGTGCCGCGCCAGGCTGACGTGAGCCGCGAACGCAGCTTACACACACTGGTTGAATGAACGGTCCCGTTCTGGACCCCTTTAATGAGAGGAAAACACGATGGAAGCATTAGGAATGATTGAAACCCGGGGCCTGGTTGCGCTTATTGAGGCCTCAGATGCGATGGTAAAAGCCGCGCGCGTGAAACTGGTCGGCGTGAAGCAGATTGGCGGTGGCCTGTGTACGGCCATGGTGCGTGGCGACGTGGCGGCGTGCAAAGCCGCAACCGATGCTGGCGCCGCTGCGGCGCAGCGCATTGGCGAGCTGGTCTCCGTACACGTGATTCCACGCCCGCACGGCGATCTGGAAGAAGTGTTCCCGATCAGCTTCAAAGGCGACAGCAACATTTG [...]
+NODE 893 1794 93699 93340 0 0
+TTGAACGGGGCGAATATTAACGAGGTGCCCCTGGCTTGTCAAAGCCTGTTTTCACAAAAAAAGTTCGTTTGCTGCTTTATTCCACACTTCGGTTAAAATTCACCGTTTCCTGATGATTTTCACAGCAAAAAGCGCTTACTCCCTCTTTACGCGCGGGTATCTCCACAGCCAGCGCCCGCTTACCAGACGCCAGTAAAACAGTGCGCCGCGCACGGCCCAGTCAAGAAACATCCCCAGCCAAACCCCTACAACCCCCATACCCAGCACAATACCAAGCGTATACCCTGCCACAACGCGACAGCCCCACATCCCCAGCATCGATACCCACATCGCAAATCGCACATCGCGCGCGCCTTTAAAACCCGACGGCAGCACCCACGCGGCCGCCCAAATTGGCATAAAGGCAGCATTAAGCCAGAGCAGAACTTTCACTACCTCTTTTACGTCCTGCTCCTGGGTATAAAATGAGGCAAACAGACCCGCGAACGGCGC [...]
+GGGTCGTATATTAGCGGCGGAAAAATTTTTGTCAAACCCCATTTAACCTCTTACAGATTCGATTGCGGGTTATCTCATCACTTTGTTGCATTTGCAGACATTTTTTCTGCAAAAAGCTTTGCAGCCTTACGATTTCTCGCTCATTATTGAAATGTGGTTTCAACTCTCTTCTTTAAGGTCCATTTTGAACGTCTCCACTGCCTTACGCCAGGCTGTCGTCCGTACGCCCTGGTATGCCAAACGCAAGAGCTACAAAGTGTTGTTCTGGCGTGAAATCACCCCACTTGCTATCCCCATTTTTCTGGAAAATACCTGTGTTTTGCTAATGGGCGTGCTCAGTACTTTTCTCGTCAGTTGGCTGGGCAAGGAAGCAATGGCGGGCGTGGGGCTTGCCGACAGTTTTAATATGGTAATTATGGCTTTTTTTGCGGCTATCGATCTTGGTACTACGGTGGTGGTTGCCTTTAGCCTGGGCAAGCGCGACAGGCGACG [...]
+NODE 894 1073 46405 46172 0 0
+GTCGTCCGGCGGGATAACATCACCGCCGTCGTCCGGCACGTCATCAGACTCGGAGCGCAAGTACCAGTCGCCGCCGTCTTGTTTCAGCGTATAGGTCCAGGCGTTAATATCAACATGCCCTTTGTAGAGCGTAAAATCACCGTCGGACTGACCGCCCACCTCAATAACTTCAATACCGTTAACTGTTTGTGCGCCCAGGCCATTGACGTTGGTGATATGCAGCGTGGTGCTGCCGGCGGTGTCGCCGGTGACGATCAGTTTATCGGTGGGCGAGCTGTCATCGCCCAGTTGGGTATTGAGATAGAGATGACCGTCGTTGCCGGTATAGTTTCCCGCGATCGTCAGCGTATTGTTGGGCTGGTCGCTGCCGCTTATCATCGCGCTGCTGTTGACGACATCGCCGTTGACGGTGAACGTATCGACAAAGTACAGGTTGCCCAGATTGTTAACATGGCCGTTCACCGTGGCGTTGTGGCCGCCAAAGGCGGCGTT [...]
+GACCACGCCAACCTGGGCGGCACGCTGGATATTACCGGCATCGGCAACGTGGCGAAATCCTGGACCCGCGACGCGTACGCCTACACGCTGATTGACACGGACAGCGCCATCAATAGCGATTTTGCGCAATTCACCGTAGCCGGTATGGACGCCAAACAGGTGGATTTTCTCACCGTCGATGGGCGCGTGAACGCCGCCGACGACACCCGCTATGACGTAACCGCCTCGTTGTCCTGGTATGCCGACAGCGACAACGCCGCCACCGACGCCCACGGTACCTTCACCCTGAGCGAGCAAGGTCACTGCTTCACGCTGAACACCGCGCTGACGGACGTTGACGCCACGCTCAATCCCGACAGCGCCACCTACTGGGACGGCAAATCGCTCATCAAACGGGGCGCTGGCACGCTGATCCTGGGGGCGCAAAACACCTACAGCGGCGACACCGACGTGCAGGAGGGCGTGCTATGGCTGGCCGAAACGGCGACCATC [...]
+NODE 895 3701 193621 186080 0 0
+ACTTCTCCCAGGCAGAAGACATCTGATACGGCGGTTAATTCGTCTGATAAAGCAGGTAAAAAATAACCCTTTCCGGTCCTGCGGAATAAAGAGAAACCATGATGAAAAAAGCACTGATGGCGGTGGCCCTCTTCAGCGCCCTGCCGGTCCTGGCGGCGGATTACAGCGAGAAGACGCAGTACCTGGGCGTGGTGAACGGTCAGGTGGTGGGCAACAGCGTGGTGAAGGTGACGCGCACCCCGGCGGACCCGGTGCTGTACCGGACGGAGAGCAACGGTCCGCTGCCGGAGACGCTGGTCATCCGTAATGCCGAAAGTCGCCCGGCATCCGGAAACATGGCGTATATCACGGTGAAACGGACACTGGGAGACGGCCGGGACGCACGGCTCACGCTGAAGACCACCCTGATGGTGGACGGGCAGCGGGCGGCCCTCTCGGCCAGCCAGCGGGGAGAGGATGTGGTTATCACGGTGCCGGCGGCAATCCGGCAGG [...]
+ACCTTTCCTGCGGAACTGTCAAAAAAAGAGCGGCCACCGGCCTCATATAAAGCAGCAGAAAACTCAGACAGCGACATTCTGGTCATGAATGTCGTGCCTTCCCCGAATACCAGCCTGACCCGGCCGTTATGTTCCTGCGCCTGCCGGATATCCCGGACACTCACAAAGAAAAACACGCCGTCAGCCCGCTCCAGCCCCACAAAAACGGCGGGGTCCGGAACGGGTGACCGGGGGCCTGCAGCCTTACCGGTATTCAATGCTCACCGCCAGGGAGGTGTGCCAGCGGGACGGTACCGCCCCCTTAAAACGCAGCTCACCGCTGTCCGCCACCGTCTGTGCGCCGTATACCCCGTCAACCTGGCGCAGGGCGGCGTCACTGAACCGGCTCAGTCCGGACACGCTGCTGACCGTCATCTCCCGGAGCCAGACCGGGCCTTCACTGTCAAACAGGGTCTGCAGCACACCCGGCGTCTGCCCTGCCGGCATCACCTG [...]
+NODE 896 1548 88058 87662 0 0
+GCGGATGGACAGCCGTTATGGCGGAATTGGCCTGGGGCTGAGTATCGTCAGCCGCATCACCCAGCTACATCAGGGACAGTTTTTCCTGCAAAACCGTACGGAAAGAACAGGCACCCGTGCCTGGGTACTGTTGAAAAAGGCATAACAGGCGTTTAATACGTCGTGACCCACACATAGATAAAACTGCTGACAATCAGCACACTACACAGGGTCGTCAAACTTTTATAAATATAGCTTTTCATGACGCTCTCCTCCAAAGGTATGGAGGAGAGTATGCCCGCGAGAGATTAAGCGAACCTTAAGCGCGAAAATTATTCATCGATACGCGGATGTTGCTGTACCAGACGCGAACGTTTGACCTGCAGCTCCGCAATTTCCTGATCGATGTCGTCGATTTTCTGCTCAATATTATCGTAATGCTCGCCCAGAATTTCCTTCGCTTCCTGGATGTCCGACGCTGCTGGCGTTGCGCCTTTTAGCGGGCGATTGGCC [...]
+TGTCGATCAGTACCTTCTGTATCGGGTTAATCCCCTCTTACGCGACGATCGGTATCTGGGCGCCAATACTGTTGTTGCTGTGTAAAATGGCGCAGGGCTTCTCGGTTGGCGGGGAATATACCGGCGCGTCGATCTTTGTCGCGGAATATTCGCCGGATCGTAAACGCGGATTTATGGGAAGCTGGCTGGATTTTGGTTCCATCGCCGGGTTCGTGCTGGGCGCGGGCGTGGTGGTCTTAATCTCAACGATTGTCGGCGAGGAGAATTTCCTTGAGTGGGGCTGGCGTATTCCGTTCTTTATCGCCCTGCCATTGGGGATTATTGGTCTCTACTTACGCCATGCGCTGGAGGAGACGCCAGCGTTTCAGCAGCACGTAGATAAACTGGAGCAGGGCGACCGCGAAGGGTTGCAGGATGGGCCGAAAGTCTCCTTTAAAGAGATTGCCACCAAACACTGGCGTAGCCTGTTGTCGTGTATCGGTCTGGTGATTG [...]
+NODE 897 2193 93502 92649 0 0
+CTGTTGGGGGGAATGGGCATTGATAAAACGCTCTCTGTCATCACCAGCGGATTCGGTACGACGCTGGGCAGCATTGGCCTGGTGATTGGTCTTGGCGTAATGATGGGGCGCTTGCTGGAGGTTTCCGGCGCGGCGGAGCGTATCGCCTGGAGCTTTATCAAATGGCTGGGGAAACGCCGTGAAGAGTGGGCGCTGGCGATCACGGGTTATATTGTCAGCATTCCCATTTTCGTCGATTCCGCTTTTGTCATTCTTTATCCGGTGGCGAAAGCGCTGGCGAAAAGCGGTAAACGTTCGCTACTGACGCTGGGCGTCGCGCTGGCGGGCGGGCTGGTGGTCACTCACCATACGGTACCTCCGACGCCCGGTCCGCTGGGGGTAGCCGGGATTTTTAACGTCGACATCGGCGCAATGTTATTAACCGGGATGGCGCTGGCGGTGCCCTGTGTGATCGGCATTGTGTTCTATGCGCAGTGGCTGGATAAACGCTAC [...]
+GCGTCCTCTTTTACCAAAAAGGCGTGAATTTACTCAATGCCGCGAAAAATTTGCAGGATGAAGTGCGTGCCAGCCATAGTGGGCTGGGCGGCGAGTTACGTATTACCACTACGCCCGAGTTTGGCGAACAGGTGGTCATTCCGGTACTGGCGCAGTTTAGTCAGCGCCATCCCGATCTCCGTATTCGGCATATGTCCTCATCACATCATGCCGATTTAATTGCCGAGCGCTTTGATGTGGCGATTCGGCTTGGCTCGCTGGCCGACTCCCGCTATCGCGCCGCGCTGATATCCCGCTTTACCATTCTGCCGGTCGCCGCGCCGCAGTGGCTCGCCCGCCACCCCGTGTCGTCGCTGGAGTCGTTGGCCCAGGCGGAATGGATTATTCATGAGCGATTACCTACGCCGCTACGGTGGACAGTAACGAATAATCATGGCCAACACTCACGCCTGGAGATAAGCAAAGCTGGCAAAATTTCTGTCGACAGCGCGC [...]
+NODE 898 1878 103474 100425 0 0
+CATTCGGGTTCTCGGCGAACTCCGGACGCAGCGCCAGGACGTTACCGTCGGCGTCAATCGGCGCTGGCGTAGAACCGGTGCTGTCAACGCCAATGCCAACGATATTTGCGCGTTGCGCGGCGCTTAATTGTGCCAGAACGGCTTTCAGCGCGGCCTCCATTGACTCCATGTAGTCGCGCGGATGATGACGGAACTGGTTGTTCGGGCCGTCGCAATAACGGCCTTCTTGCCAGCGCGGATACCACTCTACGCTGGTGGCGATCTCGTCGCCGGTGGCGCAGTCCACTGCCAGAGCGCGCACTGAATCACTGCCAAAATCGAGGCCAATTGCAATTGCCATCGTCTTACTCCATCCAGAAAAACAGGTATGGAGAAACAGTAGAGAGTCGCGGCAAAAACCGTCAGGCAGGATCCGCTAATCTTATGGACAAAAATGCTAATGCTTTGCAAAGTGTGACGCTGTGCAAATATTCAATGTGGACATTCCAGCCA [...]
+CCAGCCAGGCATGCCAAAAATTGAGCTCGCCGCTGCCGATAAGCGCGCCCAGCCCCGCCATCAGTACCGTGCCGGGTAAAATCAACCCCACCAGCGCCAGCGATTCCAGGAAGGCGACCAGCAACACGGCGATAAGCGAATACAGAGTGGATTGGGTGATAAAGTGTTCCAGCAGTGCTTGCATAGTGTGTCCGTCAGCGTGATGAAGCAGGGATTCTGCTTACCCCGTCCCCCTTCGTCAAGCCGTCAATTATCCGAATAGTTACGGCTTATGACATCTTTGTGGACACATCATTCACTTTTTATTCACATCCGGCCCTGAACTCGCTAGGACTTGCCCCGGTGCATTTTTTAAATACCCGTGAAAAATAGAGCTGATCGTCAAATCCAACATTGCGCCCAACGGACGCTATCGGCATTCGCGTAGTGCTAAGCAGAAGTTTCGCCTGGCTGATACGCTGATCTTCGCGCCAGCTCAATACGCTAATGCCT [...]
+NODE 899 7728 374928 370548 0 0
+GGCAGCTTTAATCACGAGTCCCATTACCTTGCCTTAACACGCTAATAACAACAGCGTGTAGCATAACGGAACCGCTCTCGTTTAGAAAAGATTTATGGAAGGGAAAACAGAGGCGGTGTATGTTGGCGTTTTCTATTCTCCATTTATAATATGAACCGCATTGTATTTGTTGAAGATGACGCTGAAGTGGGTTCTCTCATTGCCGCTTATCTGGCGAAACATGATATTGATGTCATTGTTGAGCCGCGTGGTGACCGGGCGGAGGATCTTATCCTCACCACTCAGCCCGATCTGGTTTTACTGGATATTATGCTTCCAGGTAAAGATGGCATGACGATATGCCGCGATTTACGCCACCGCTGGCAAGGCCCGATTGTCCTGCTCACCTCGCTGGACAGTGATATGAATCATATTCTGGCGCTGGAGATGGGCGCCTGCGACTACATCCTCAAAACCACGCCTCCGGCCGTTTTGCTGGCGCGTCTGCGCTTA [...]
+TTCGCGATAAATCCCACGCTTTCGCCTATATTGTCAAAATTGGCCGTACTCACCTGCAGGACGCGACGCCGCTCACCTTAGGCCAGGAGATTTCCGGTTGGGTAGCCATGCTGGAACATAACCTCAGGCACATTGAGCACAGTTTACCGCACGTCGCGGAACTGGCGCTCGGCGGAACCGCAGTGGGGACAGGGCTTAATACCCACCCGGAATATGCCCGGCGCGTGGCCGAGGAACTGGCAACGATTACCGCAGCGCCATTTGTTACCGCCCCGAATAAATTCGAAGCGCTGGCGACCTGTGACGCGTTGGTTCAGGCGCATGGCGCATTAAAAGGATTGGCGGCCTCGCTGATGAAAATCGCCAACGATGTTCGCTGGCTGGCGTCCGGCCCGCGCTGCGGCATTGGCGAGATTGCTATCCCGGAGAATGAGCCAGGCAGTTCCATTATGCCTGGTAAAGTGAATCCGACCCAGTGTGAAGCGGTAACGA [...]
+NODE 900 2913 157345 156705 0 0
+CATCCGGCCCAAAACGGTTGCGCAGTTCGCCGATAACCGGATCATCAAGATGATCGCGGGTACTCCATGCAGCGTCTTGCGCGGTTAAGTCGGTCATATTGTTCACCATTGCAAATGGTCCGTGGTGGTCGGCAGTGCTTCGCGCTATTAAAATAGTGGTTAGCGAAGTGAAGTGCTGCTGCCGACAGGCGCAAATTAAATCTCGTCCGGGGTACGCAGGTTCGTGACGGCAATACGCTCGCCGCGTTTACGTTCGCGTTCTGGCTGCATATTGGCGCGATACACGCCCTGATCGCCCACCACCCATGAGAGCGGACGGCGCTCTTTGCCAATCGATTCTTGCAGCAGCATCAACGCCTGCATATACGCTTCCGGACGCGGCGGACAGCCAGGGATATACACATCCACCGGGATAAACTTATCAACGCCCTGCACTACCGAATAAATATCGTACATGCCGCCGGAGTTGGCGCAGGCGCCCATAGAAATGAC [...]
+CGATAATTAACCTCGATCTCGATCTGCTGAGAACGTTCGTGGCCGTTGCCGATCTGAACACCTTCGCCGCGGCGGCGGCGGCGGTATGTCGTACTCAGTCTGCGGTCAGTCAGCAAATGCAGCGTCTTGAGCAACTCGTGGGAAAGGAATTGTTCGCCCGCCATGGCCGTAACAAACTTTTGACCGAACACGGTATCCAGCTTCTGGGGTACGCCAGAAAAATCCTGCGTTTTAATGATGAGGCGTGTTCATCATTAATGTTCAGTAATCTTCAGGGAGTGTTAACAATCGGCGCTTCTGATGAATCAGCTGATACTATCCTGCCTTTTTTGCTTAGCCGAATCAGCTCGGTTTATCCGAAACTCGCGCTTGATGTACGGGTAAAACGCAACGCCTATATGGTGGACATGGTTAAATCGCAGGAAGTAGATTTGGTGGTGACGACTAACCAACCTCATTCGCTGGACTGTCTGAATTTGCGGACCTCGCCCA [...]
+NODE 901 2153 110060 108531 0 0
+CGCGAGATTGATTACACGCGCCCGACCTGTATTCTGATGGGTCAGGAGAAAACCGGTATTACGCAGGAAGCATTAGACCTGGCGGATCGGGATATCATCATTCCGATGATCGGTATGGTACAGTCGCTGAACGTTTCCGTCGCCTCCGCGCTCATTCTTTATGAAGCCCAGCGCCAGCGTCAGAACGCGGGCATGTATCTGCGTGAAAATAGCATGTTGCCGGAAGATGAACAGCAGCGCCTGCTGTTTGAGGGTGGTTATCCGGTGCTGGCGAAAGTCGCTAAACGTAAAGGTCTGCCTTATCCTCGCGTCAATCAGCAGGGCGAAATCGACGCCGATGCTGACTGGTGGGCGACGATGCAGGCGGCAGGGTAATCACCATGTCAGGCCGCTTGTTAGACGCTGTTCCGCTCAATTCCCTGACAGGCGTCGGCGCAGCGCAAAGCAGTAAACTGGCGAAAATTGGCCTGCATACCGTGCAGGACCTCCTGC [...]
+GGCCCAGCCGCTCGGGGTTTTCAATAATCATCAGGCTGGCGTTAGGAACATCGACCCCCACCTCAATCACCGTAGTGGCGACCAGCAGATGCAGTTCACCCTGCTTAAAGGCCTGCATCACCGCCTGTTTTTCGGCGGGCTTCATGCGGCCGTGTACCAGGCCAATATTCAACTCCGGTAACGCCAGCTTGAGTTCCTCCCAGGTGGCCTCCGCCGCCTGCGCTTCCAGCAGGTCAGACTCTTCAATCAGCGTACAGACCCAGTAGGCCTGACGGCCTTCGGTTGTGCAGGCGTTGCGCACACGATCAATGATTTCATGGCGACGGGTATCCGGAATAGCAACGGTAGTGACAGGGGTACGGCCCGGCGGGAGCTCGTCAATCACCGAGGTATCGAGATCGGCGTAGGCAGTCATCGCCAGGGTGCGCGGAATGGGCGTTGCGGTCATAATCAACTGATGCGGATGAAAGCCCTGTTGTTGGCCTTTTTCCC [...]
+NODE 902 2201 441286 429440 0 0
+TGTTGAAGGGATTTCAAAAGATGCCTTTGTTGGTGAATTGCAAATACAATTAAAAAAGCAAGGAAAAACTCTAGGGGAATTACAGGAAAGACGTTTAAGGTTAGGTGATAACGATACGACAGCCTCTATCCAGTTTTTAGCTGAACAAAATGAACAACTGTTACAACAAATTCAGAGTTTACAGTTACAGCAAGCAGAGGCGATGAAATATAGTGGTCGTCTTGAGGATCACTATTTTAACAAGCGAGCGCAACAGGAAGAATTAAAGGCACGTCAGTTACAGAGGGCATGGCAATGAAAAAATATCTGATTCTTTTCTTCATGATGTTTTCAGCCTCGGCAATGGCTAAGATTGGCTATGTTGATGAGCATCAAAAGGAAGTTGACCTAAAAATTGACGCTCTGATTTCTAAATATGAAAAAGAATGTGAAGGTAAACGCAATAGTAATATGTGTAAATCCCAGGCATGGGATAAGGCCCATTTTGAATAT [...]
+CCGCTTCTGCATAATCCCGTTCTATAGTCTCTTTTAACTGTCCATAGCGCTTCTGCACATACTTTGACAGCAATGAGTTCACTGTTGGTGTATATATAGGCTGCTCATTGTCTGGCGTAAATTGTGATATTTTATGTGAACCATCAGGCAATAATTTCACCCATACTACTTCTGTAGTATTCTGGCTTTTTTCTATTGCCTCCTGAACAGAATATGACTGATATATCGTCGTCCCGGCAAGAAGCAAGGCAATCCAGAAAAACAAATTTCTGTCTTTTTTTAGTTCACCAACACGATCCTTAAAGGCTGTGCGATTTACTTTTTCGACTTCTTTTTTTTCAAGCAGCATACGTTCACCTTACAATAATGCTTTAGCCGCTTTCTTGGCTAGTTTTACTGCCATATTATTCAACCCCTGACTTGCAGAGCCGACACCAGAACCAATCATGTACGCAAATATAAAACAACTGAACACCATAATTGCAGCGATTA [...]
+NODE 903 51 3608 3608 0 0
+CGACTTACATGGATAGCGATACCATCAGGTAAATACAAAGTACCGAGTTTA
+GTAAAGATAATCATGTTAGCCTTGAAAATGGGATTATTGCTGTTAACCGCA
+NODE 904 90 5694 5694 0 0
+ATTTACTCCCGATAAATTTGGCGTATACGTAAAAGCACTATGGGGCTATAGCTCAGCTGGGAGAGCGCTTGCATGGCATGCAAGAGGTCA
+TAGTGCTTTTACGTATACGCCAAATTTATCGGGAGTAAATTTGGTGGAGCTAAGCGGGATCGAACCGCTGACCTCTTGCATGCCATGCAA
+NODE 905 1504 97383 96245 0 0
+TACAAAACCGCCGACAATAAATAACCCTATGATTTTACTGAATTATAAATTTATTTTGCTGTTTTTAAGCACGATTCATTGATCTACAACAGTGGATTGTTCAAAGTTTGGCCTTTCATCTCGTGCAAAAAATGCGTAATATACGCCGCCTTGCAGTCACAGTATGGTCATTTCTTAACTCATGCGCATCGGACAATATCAGCTCAGAAATCGCCTGATCGCAGCGCCCATGGCTGGCATTACTGACAGACCTTTCCGGACGCTGTGCTATGAGATGGGAGCAGGATTGACAGTATCCGAGATGATGTCTTCTAACCCGCAAGTGTGGGAAAGCGATAAATCTCGTTTACGGATGGTGCACGTTGATGAGCCAGGAATTCGCACGGTGCAAATTGCCGGTAGCGACCCTGTTGAGATGGCCGATGCCGCACGTATTAACGTGGAAAGCGGCGCCCAGATTATTGATATCAATATGGGGTGCCCGGCGAAGAA [...]
+TTTTTTTAATTTTTTACGCAGCGTACCACGGTTGATGCCCATCATCAGAGCAGCACGGGTCTGGTTACCACGGGTGTATTGCATCACCATGTCCAACAGGGGCTGTTCTACTTCAGCCAGTACCAGCTCATACAGGTCATTAACGTCCTGACCATTCAGTTGAGCAAAATAGTTCTTCAGTGCCTGTTTAACCGAGTCACGCAGGGGTTTTTGGGTTACCTGATCCTGAGAGTTAACGGTAGAAACGGTCAGTACGTCAGAATTTACGCGTTGTTCGAACATAGTTCTGTCAGCTCTTTATTTCTGTTTACGCAAAATTTTCGAAGTATGCCTCCAACGCCTCCAGCTGTTCGCTGGCGTCCTCAATAGCGTTGAATGTGCGCCGAAACTGGTCGTCTGGAGCGTGCTCCTGGAGATACCAGGAGACGTGTTTACGCGCGATTCGGTACCCTTTTGCCTGACCGTAAAAGTCATGCAGTTCCCGAACATGCG [...]
+NODE 906 1193 70138 67855 0 0
+ATACTGGCGCGCGAGATGATCTGTGAACATTTACGCTCGGTAAATTCGCGGCCAAACTCTTTCTCATACTCTTCACGCTTAGACACCACGAAGGAAGAGACGATGGGCGAAAAGTTAAAGGAGAACACCATGATAGAGATGCCCAGCCACACCGTAACCAGTATGCCATCGTGCCCGGTCAGCGCGATATTACTGAGATCAACCTGATCGATAACCGCCGAGTTCCAGTAAGGAATCAGCGATAATGAGATTAGCACCAGGCTGGCGATAAACGGCCATACCAGGTAACTCATCACCTTAACCATCAGATCTTTACCAAACCAGATCACAAAGGCCATCAGCAGCAGCAAGAACAGCGCCACGAAACCGCGGTTCAACGCTGGCATCTGCAACTGGTTTTCCCAAAACGTCATGAACGTGTTAGTAATGGTGACGCCATAAATCCACAGCAGCGGACAAATCGCAAAGAAGTAAAGGAACGTGATAACTACC [...]
+CGGCGTCTTATTACGCTGGCGAAATAACCACGCACCGAACGACCGGCACCCTGGCGGATGGTTGTGATGTCTCCCGCCCGGGTAATTTAACCTATGAAATTGTTCGTGAATTAGTCGATGACATTGTTCTGGTTAGCGAAGATGAAATTCGTAACAGCATGATCGCTTTAATTCAGCGCAATAAGGTTATTACTGAAGGCGCTGGCGCTCTGGCCTGCGCCGCACTATTAAGCGGGAAATTAGATAGCCATATTCAGAACAGAAAAACGGTCAGTATTATTTCTGGCGGCAATATCGATCTTTCTCGTGTATCACAAATTACGGGTTTAGTTGACGCTTAATCTTTTCGTGAGGATAGGATATGAGTACTACTGATAGCATTGTATCCAGCCAGGCAAAACAGTCGTCATGGCGTAAATCGGACACGACGTGGACGCTGTGTTTATTTGGTACCGCCATTGGCGCCGGGGTGCTGTTTTTCCCTATCCGCGC [...]
+NODE 907 251 13574 13511 0 0
+CTTTTATCTTTTTAATATCAGAAGGTTCCATGCCGCCGTATCTGGACTTCCAGTTATAGTAGGTGGCCTCAGAGATACCGGCCTCCCGGCAGACATCTTTAACGGTTCGTCCAGCTTCAACCGACTTAATCACAGTGATGATCTGATGCTCAGTAAAACGGGCTTTACGCATAGCGATCTCCTTCGCTGGCAGATTGATTATGCCGGATGATCTCTAAATGTGAATGGCACGATTATGCGGGATACTTACA
+TAATCAATCTGCCAGCGAAGGAGATCGCTATGCGTAAAGCCCGTTTTACTGAGCATCAGATCATCACTGTGATTAAGTCGGTTGAAGCTGGACGAACCGTTAAAGATGTCTGCCGGGAGGCCGGTATCTCTGAGGCCACCTACTATAACTGGAAGTCCAGATACGGCGGCATGGAACCTTCTGATATTAAAAAGATAAAAGATCTTGAGGACGAGAACCGACGCCTCAAACAGATGTTTGCCGACCTGAGC
+NODE 908 9087 412281 406418 0 0
+CTGACCGGCGCCGGTTTCAGCGATAATCTCGCTTTTCCCCATCCGTTTGGCCAGCAGCGCCTGACCCAGTACCTGATTGGTTTTGTGTGCGCCGCCGTGCAGTAAATCTTCGCGCTTTAAATACAACGTGGTACGCGTACCGGCGGTAATGTTCTGGCATTTCGTCAGCGCGGTGGGGCGTCCCGCGTAGTTTTTTAGCAGATCGGCGAATTGCGCCTGAAATTCAGGATCTTTTTGCGCGCTGACGAAGGCCTCTTCAAGCTGGTTCAGCGCAGGCATCAGGATCTGCGGCACATACATGCCGCCGAATTCACCAAAGTAGGGGTTGAGAAGTGTTGTCATGTTTTTTCCTTAATATGCGCGCAGTGTCTGAAAAACCGAGGCCAGAAGACGAGCATCTTTGATGCCCGGCTGTGACTCCACACCTGAATTAAAATCGAGACCGGCACAGCCGACTTGCGCCGCCTGGACGCAGTTATCGGCCGCCAGCCC [...]
+AAACAAGATCTATTGCAAAACCGCATTATTCTGGTCACTGGCGCCAGCGATGGCATTGGGCGGGAAGCCGCGCTCACGTATGCGCGTTACGGCGCAACGGTGATTCTGCTGGGACGTAACGAAGAGAAACTGCGTCGGGTCGCGCAGCACATTGCTGACGAGCAACATGTTCAACCACAGTGGTTTACGCTTGATCTACTGACCTGCACCGCTGAAGAGTGCCGGCAAGTGGCCGACCGCATCGCCGCGCACTATCCCCGCCTGGATGGCGTCCTGCACAATGCCGGGTTACTGGGGGAAATCGGTCCAATGAGCGAACAAGATCCGCAGATCTGGCAGGATGTCATGCAGGTAAACGTTAATGCCACCTTTATGCTCACCCAGGCGCTGTTACCGTTATTGCTGAAGTCCGATGCCGGCTCGCTGGTCTTTACGTCATCAAGCGTTGGCCGTCAGGGACGCGCCAACTGGGGCGCCTATGCCACCTCGAAG [...]
+NODE 909 96 6539 6539 0 0
+AGGGGACGCCACTTGCTGGTTTGTGAGTGAAAGTCACCTGCCTTAATATCTCAAAACTGACTTACGAGTCACGTTTGAGATATTTGCTCTTTAAAA
+TTAAGGCAGGTGACTTTCACTCACAAACCAGCAAGTGGCGTCCCCTGGAGGTTTGACCTCATCAGTTTGAACGCTGGCGTCCCCTAGGGGATTCGA
+NODE 910 15 6197 6182 0 0
+ACCCGAAGATGTTTC
+CCCTGGCAGTCAGAG
+NODE 911 6 2119 1100 0 0
+TCGCGA
+TGGATG
+NODE 912 29 11112 3131 0 0
+TTCATCGTCGTGTTGCGAAAATTTGAGAG
+TGTGAGGTTAAGCGACTAAGCGTACACGG
+NODE 913 10 4172 1236 0 0
+CTCACGAACA
+CATCTTCGGG
+NODE 914 387 19527 19527 0 0
+CAACACGGAGAACAGCACTTCCAGCAACAGCGACAGCGTAACGCGCCAGAAACCACCATACTCTTTGGTGCCTTTACACCAGATCAGCATAATACTGAGCAGCTTCGGCAGGAACAGCAGCACCATCGTTGACGCAAACAGCGCGATTGCCAGTTCCGGACGCCACTGCGGCCAGACCGGAAAAAGCTGGCGCGGCTGAAGGAAATATTGCGGCTCTGTTAACGCATGAACGACCTGCAGCGCGGTAGAAAGCGCGAGGAACATAAACCATAACGGCGCGGACAGATATGACATTACCCCCGTCAGGAACACGGCGCGATGCACCGGGTGCATTCCTTTCACCAGGAACAGACGAAAGTTCATCAGGTTGCCGTGACACCAGCGGCG
+AGGAATGCACCCGGTGCATCGCGCCGTGTTCCTGACGGGGGTAATGTCATATCTGTCCGCGCCGTTATGGTTTATGTTCCTCGCGCTTTCTACCGCGCTGCAGGTCGTTCATGCGTTAACAGAGCCGCAATATTTCCTTCAGCCGCGCCAGCTTTTTCCGGTCTGGCCGCAGTGGCGTCCGGAACTGGCAATCGCGCTGTTTGCGTCAACGATGGTGCTGCTGTTCCTGCCGAAGCTGCTCAGTATTATGCTGATCTGGTGTAAAGGCACCAAAGAGTATGGTGGTTTCTGGCGCGTTACGCTGTCGCTGTTGCTGGAAGTGCTGTTCTCCGTGTTGCTGGCGCCGGTGCGTATGCTGTTTCATACCGTGTTTGTGGTCAGCGCGTT
+NODE 915 11985 638276 631351 0 0
+CCGCCCGGATGCGCGTCGCAGTGAACATGCCAGCGCAGAAGCGCTGGATGTCAGCGGGTTTCAGCTATCAGATGGCCGAAAAATCACTGTTCTGCGCGGCTGGGGGCGTCAGGAGACGGGGCCCTGGTTACGCGCTATGTTAAACGCCAGTTGCCATTATTATGGCAATGGGCTCGGGCCTGACTATAACGCTGCTCATGCTAACCATTTTCATCTTGGAATGCGGGGCTACGGCGTGTGTCGTTAAAGCATAAACGTCTGCCTTGCGCGGCTATATAATGTGACATGTTTCACAAAAATGATGAACGGGGAGACAAAATAGCAAAGTGTGACGTATCGCACCTCTGGAACCACCAGGAAAAAGAGAACTTGCTAAGCTAACGCGTATTTTCAGCTACTTACCGTTACGAGTCTTATGGAATCCTGGAAAGTTAATCTAATTTCCGTTTGGTTTGGATGTTTTTTTACCGGGCTGGCAATCAGCCAAATCCT [...]
+GGCGTTAAAAAATAGCCCGTTTGACAGCCAGGCAACGTTCCTGGCGGCGTTGTTGGATGAAGAGACCGTGACCCGTCTGGAAAAACAACAACAAACGCTGGAAAGTCAGCTACAACAAGCGAAGGCGTTAAGCGCGCAGTCCGCGCAGGCGCTGGCTGACCATCAGCAACAGCCGCCCGCCGGTCTGGACCCAACGTGTACGGCGGAGCAGCTCGCGCAGCGGCTGGCGCAGTTGGCGCAACAACTGCGTGAAAACACGACACGCCAGGGGGAAATCCGCCAGCAAATTAAACAGGATGCAGATAATCGGCAGCGCCAACGGGCGCTGATGGCGGAAATGAAACAAGCCTCTCAGCAAGTGGAAGACTGGGGCTATCTCAATGCGCTGATCGGCTCTAAAGAAGGTGATAAGTTCCGCAAATTCGCCCAGGGACTGACGCTGGATAATCTGGTCTGGCTGGCGAATCATCAGCTCACCCGCCTGCATGGCCG [...]
+NODE 916 1034 52528 52040 0 0
+GATTGTATTAATCGCCGCCATTTATGGCGAGCAAACATCGCGGCGGGAATAAAAATCTTCAGCGTATCGACTCTTCTCCCACAAGCGGTGGTTATCCCGCTTGTGGGCATGAGTGGCGGTTAAACAGGCGCTTCCATCTCAAGTCTGACCGGATGAAAACGGCGTTTGAAATAAATCAGGCCATGCCCATCCTGACTAAGAATAATATTTTTGATCGCCACCAGATACACCAGATGCGTGCCAATGGTTTGTACCTCGCTGATCTCGCCTTCAAGACCGGCCAGCGCGCCGTTAAGTACCGGCTGGCCCAGCGGCCCGTTTTGCCAACATGGCTGGTGAAAACGCTCCTCCATCGCCATCCCCGTCATACCGGCAAAGTGGCGCGCCATCAGCTCCTGCTCATGGTTAAGTACATTAATGCACAGCCTGCCGTTGCCCTGAAAAACGGGGTTCATGGCGCTATTGGCATTAATACATACCATTACGGAGGGC [...]
+ATCTGAATAATCCGCAAATCGACCAGTACCTGGCGAAATACGTACGCGGCTCTAACGGAATGGACCATGTTGAACGTATCAAAATTCTTAAATTGATGTGGGATGCCATCGGCAGCGAGTTTGGCGGTCGCCATGAGCTGTACGAGATTAACTACTCGGGCAGCCAGGATGAAATTCGTCTGCAGTGCCTGCGTCAGGCCCAGAGCTCCGGCAATATGGATAAGATGATGGCAATGGTCGATCGCTGCCTCTCCGAATACGATCAGAATGGCTGGACGGTTTCGCATTTGCACAATAACGACGACATCAATCAACTGGATAAGCTGCTGAAATAACGCGGCAGGAGGTTCTCATGCAAGTAGATGAACAACGTCTGCGTTTTCGCGATGCGATGGCAAGTCTGGCGGCAGCGGTCAACATCGTAACCACGGCGGGTCACGCCGGACGCTGCGGTATCACCGCAACAGCGGTCTGTTCCGTCACCGATACGCC [...]
+NODE 917 2837 153550 151165 0 0
+CTTACGGCAGTGAAGCCGTCGCCGTTCTGCCATAAAAAACTCATTATAATGGAAGGTTCAGCGTCGAATGGGGATAGCAGGCAATGCCAGATGGCCGAGCTCCTGCAAAAAGTTCAGGAGACCGTGAGAACGCTTGAGAACAACGGCGTTAACGCGGCCCTGCAGCATTACCCGGGCCTGGGCCACGGGCCCATGTTTAACGCCTCTTTTCGCAGTGCATTGCTGGATATCAGTCGCGAACCGGCAAGCCAAAAACCACGCTGTCATTAACCCGCCGCCAGAATATGCCCGCCAGCGACGGGCATAATCCATCAAAACGAGGCCGTCACACCGGCATAATAAGCCCGACCCGGTTCGTTATAGGTATTTGCCCCTTCGGCGGAGCGATAGATCTGTTTATCGAAGATATTGCTGATACCGACATTAAGACGCAGGTTCTTATTGATATCGTAGTTAACGTTAGCGCCGACCAGTGAGTAAGCCCCCAGCGCT [...]
+TGCTTTGAAAAATAATTAATTTCCTCTATTCCTGTTTTGTAAAACCTTCGTTCAGTAGGCGCATTCTGCCCCCCTTCCCGGATTTACTGGCAAAGTGGAGCCCGGACAGAGAGTCATATTGCAAAATCCCGTTTCCGTTTTTTTATTACCAGATTTTTGTGGTCGAAAGATTGCCTTTTTCTTAATTGAATGATAATTATTATTATTAGCATATGATAATAATTACTATATAGACGTAACCTGGCAAGGATGTGAGCTTGAGGGCAACAGCGCTACTTTAGACATTATTTAGGGAATGGGTATGAGAGTTAATAAGTTCCTCTGGTTAATAACCGTGGTTTCTACAGGGGTTAATAGTCCATTATCAGCAGCAGAATCTACTGACGACAACGGCGAAACGATGGTGGTTGAATCCACCGCCGAGCAAGTATTAAAGCAACAGCCGGGCGTTTCGATTATTACTCGTGACGATATTCAAAAGAATCCTCCCGT [...]
+NODE 918 1530 86914 83735 0 0
+TTAGTTCCCAAATTTCTCTACGACTACTTTCCTCTTGAGGTTCGTGGTTTGGGTACCGGGCTGATTTATAATCTTGCTGCGACATCAGGCACATTCAATTCAATGGCGGCGACCTGGCTTGGAATAACAATGGGGCTAGGCGCTGCGCTAACGTTCATTGTTGCTTTCTGGACCGCAACAATTCTACTCATTATTGGCCTATCCATTCCGGATAGACTAAAAGCACGTCGTGAAAGTTTTCAATCAACAAAAGAATTTTAATAGAGGATAAATGATGACGAAATACGGTGTTGTAGGTACAGGTTATTTTGGCGCTGAACTGGCGCGATTTATGTCTAAGGTTGAAGGGGCGAAAATCACTGCGATTTACGATCCGGTAAATGCGGCTCCGATAGCGAAAGAGTTGAACTGTGTCGCCACTGCAACGATGGAGGCGCTTTGTACCCATCCTGATGTGGATTGCGTAATTATTGCTTCACCAAATTACTTACA [...]
+GACCCGTCCATTGCCGGATGGCGGCACAGTTCACAGGCGCCTTATCCGGTCTACATAAGCGCAGCGCCACCGGGTAATAACACCACCATCCGGCTTTCAATTTTAGCCAAGAATTTCAGTGAGTTTTACTTTGCGCCCCTCGTTTGAGGAAAGCGTCGCAGCATCAGCGGTAGCAATGGCATTTGTCGCCGCTTCTCCCGTTAGCAATTTAGCAAACTCCTCGCCTGGCTCCAGACCGTTTATCACATCATGCAAGTACTGCATCTCCAGTTTCATAATTGATGAGAGCCACATCGGCGTACGTTTACCGGGTTTACCATAAGCGATTGCGCCATCCATCTCGCTGGATATGTTACCGTTGCGACGATCATCATCCTCCGCCTGGCTTTCATGCACAAGAAAGTGTGTTTTTTTGCCCGCTTTTATTAGATAACCCGCCGTGTCTTGCATATCAATGAGAATTGCACCTGTCGTGCCCTCAATTAATACATA [...]
+NODE 919 2096 132404 130912 0 0
+CCGCCAGGCTTCCTCTCTTTCCGGTGCCTGAGTACTGATAACACGTATTGTTTTTTTTGTTCCCGGGGAAAGGGCAAATTTCTCCGGGGAGACAACAAGTCCTGTCTCTATATCATTCCCTGCTGGTACCTCCTTCTCCTGTGGCATACCAGGGTGTTCAATACGCATGATTCTTGTTCGAATATATTGCACATGATCTGATTTAGAATAGACGAACAGCGAGGTGGCCTCTTCGCGGCTACTATTAATTTCTGCCGCCATGGGATAAACGAGCATATTCGCCCTGGCATGACCACATGCAAACATAGCGACACAGAGAAACACCCCGGGAAGAGTATCTTTAAAATTCATACCAGATTTTACCGTATAAAAGTCATCTAAATTTTAGTATTAGCATAGACAGAAAGTTATCAGCATAAAGAAGCAAATTACGATTCAGTGTTAATACATTTTGTGTGGAGGGCATCATACGGAATAAAATTTTTCGCTCAA [...]
+AGTCTGGATACGGCGGCATGGAAGCTTCTGATATTAAATCTTGAGGATGTCAACGCCAGGATTTATGGTCGTTTTTCGCTATTTTTAATATCCGCTGTTTGATCACTTCTGCTGTCCGCTTTCCGCCATTTCATCTTCACTGATTGGCGTTGCGCTTTTGGTCAGCGCCCCGACTTTGCGTTTTTCCTTCAGTTGGTAACTTTCTCCTTTGATATTCAGTGTGGTTGAGTGATGCAGTAGCCGATCCAGGATCGCTGTTGCCAGCACGTTATCACCGAACATCTCACCCCAGTCTGCGAAGCCTTTGTTTGACGTCAGGATAATGCTCGCTTTTTCATACCGTCGGTTCAGCAGTCGGAAGAACAGACTGGCTTCCTCACTGGTCATTGGCAGGTAACCTATTTCGTCCAGGATCAGCCCCCGCGCATAGCTCAGTTGTTGTAGCTGGCGCTCCAGGCGGTTTTCCAGCTTCGCTTTCATCAGCGTCTACCA [...]
+NODE 920 156 9148 9057 0 0
+TCGCCGTAGGTCTGCCACCAGACGTCATTCATCAGTTACTGTTCTCTTTTGTCTAACAAGGATGCACCTATGCTAACAGTACCGGGATTATGCTGGCTATGCCGAATGCCGCTGGCGTTAAGCCACTGGGGGATTTGTTCCGTATGCGCGCGCGCC
+TTCGGCATAGCCAGCATAATCCCGGTACTGTTAGCATAGGTGCATCCTTGTTAGACAAAAGAGAACAGTAACTGATGAATGACGTCTGGTGGCAGACCTACGGCGAGGGAAATTGTCATCTTGTGCTGCTGCACGGATGGGGATTGAACGCGGAGG
+NODE 921 3352 157736 156504 0 0
+AGATTTGCCAGATGCCTTCAACATAACCCTGAACGAAGTTGGCGGTGTTTGGCTCGCTGCCGTCGGTAATCACCTGAATCGGCGCGCTGTCACCGGCGCGCGCCATTTGCTGCGCGAAATCCACCGGAATCACCACCAGTCCGCGAATGCGTCCGGCCTGCATTTTTTCAATTAATTCATGGCGATTATCGCTAATGGTCGCGTCGATATAGGGTGAACCGGTCATCGCATGAGTGAAATCCAGCGCCTCCTGGCTTTGCTGTTCAAGCAGAATCCCCACCCGCAGCTTGCTGGAGTCGAGGTTAATGCCGTAACCAAAAATAAACAGCAACAGCAGCGGGATCACCACCGCAATCAGCCAGCTACTGGGATCGCGCACGATCTGGCGCGTCTCTTTGACGCACAACGCACGCACGCGGCGCCAGGAGAGAGACTTACTCATGCGTATGCTCCTTATCCCAGTCATTGATGAGAGTGATAAAGGCCTGCTCC [...]
+GCGTTTCGTCTCGGCAAAGAAACTATTCTGTTACGTACCGGCTGGCCGCAGTTTGATGAAGAAAAAGCGGAGCTGATTTACCAGACGGTAACCTGCCACATCGATCTTATTCTGCACGGTTTAACGCAAAGGAGTCTGGACTGATGAAAAAACCTGTCGTTATCGGACTGGCAATCGCAGCGATCGTCGCTGTGATTGCCGGTGGAACCTGGTGGTATCAAAGTCGGCAGGACGATGGGCTGACGCTATACGGTAATGTCGATATCCGTACCGTCAATATCAGCTTTCGCGTCGGCGGCAGGCTGGCGTCGCTGAATGTTGATGAAGGCGATGCCATCAAAGCCGGACAGGTGCTCGGCGAACTGGATCACGCGCCATACGAAAACGCGCTAATGCAGGCGAAAGCTGGCGTGTCGGTCGCGCAGGCGCAATATGATTTGATGCTGGCAGGCTATCGCGATGAAGAGATAGCCCAGGCCGCCGCCGCCGTCA [...]
+NODE 922 1506 67601 66302 0 0
+ATCTGACGAAACGGAGACTGACTGGCGACAAACCCGATATCGTCTAATAGCGACTGCGCCGCGCGAAACGCAAAGCGGCGCAACACCACCGCGCCAGGCGCCAGGGGCTCTTGCCAGGGCGCTTCATCAGCAAATAGATCCAGCATTGCTACTCCTCTTTTTGCGCTTCTCGCTTTAATAGCTGCGCTTTTCGACGCACGCCCCAACGATAACCGGAGAGCGCGCCATCGCGACGCACGACCCGATGACACGGGATCACCATCGCCAGTTTATTCGCGCCGCACGCGCTGGCGACCGCGCGTACTGCCGTGGGTTTGCCGATAGTCGCGGCAAGCTGTTGATAGCTTACGGTTTCGCCGCAGGGAATCGCGCATAACGCCTGCCAGACCTGCTGTTGAAACGCGGTTCCCTGGATATCCAGCGGCAACGAGAGCAGCACATCGCGTGTGTTGATAGCCGCGACAACCTGCCGCACCCGTTGCTGAAAAGGCG [...]
+AGCGGACGGCTGGGACACCGGCCTGATGGTGCTTGGTACGCAAAAGGCGCAAGAGGTCGTGCGGCGAGAAGGGCTGGCGGTCTTTATGATCATGAAAGAAGGTGAAGGCTTTAAAACCTGGATGTCGCCGCAGTTCAAAACGTTCCTAGTGAGCGATAAGAATTAAAACGCAAGATTACGGGTTTTTGTGGGCGGATTTACGGACACACTGCATGTAAGCAAGCACTATGCTTAATGAAGGAGTCTATGATGAAAAAAGCGTTACTTACCGATGATGAATGCTGGCTGCGGGTGCAGGCGCGCGATGCCAGCGCGGATGGGCGTTTCGTTTTTGCGGTGCGAACCACCGGCGTTTTTTGCCGCCCTTCTTGTCGCTCGAAGCGGGCGTTACGTAAAAATGTTCGCTTTTTTGCCAACGCGCAGCAGGCGCTGGACGCCGGTTTTCGCCCCTGCAAGCGCTGTCAGCCGGATAATGCGCGCGCGCAGCAACGG [...]
+NODE 923 5469 247923 245537 0 0
+ACGTTGATGAAGACGCCAGCGGCGCGATGGTCGGCTTTAATGTGCATTTCCATTCGCTCGCCAGCGCCTCGATCACGGCGATGTTCAGTTAAACGCTGTGCCGGATGGCGGCGTAAACGTCTTACCCTGCCAACGGGTTGGGTAAGCCGAATACGCGCCGCGCCATCCGGCAGCATTCACATAAAGTCCGGCACCAGACGCTGTAACGCGCCTTGCGCCAGCAGCGCCGTCGCACACTCAATATCGGGCGCGAAAAAACGATCCTGCGTATAGTGCGCCACCTGCTCGCGCAGTGTCTGCCGCGCCTGTTCCAGTAACGGGCTGGAGGTTAACCCTTCCCGTAAATCTATCCCCTGACAGGCAGCCAGCCACTCCACGGCAATGATGCCGCGGGTATTCGCCGCCATTTCCCAGAGTCGCCGTCCTGCCGCCGGGGCCATTGAGACATGATCTTCCTGATTCGCCGAGGTCGGCAGGCTATCCACGCTGTGC [...]
+CGCATGGGCAGATCAGGGCCGGCTACCGGGCGGATTTTGTGGTGTGGGATGCTGAACAGCCGGTAGAGGTTGTGTATGAGCCGGGGCGTAATCCTTTATATCAGCGGGTATACAGAGGACAAATCTCATGACGCAATGGTATCCGGCTTCTCCGGCGCTCTGGCAGGGGCGCGATGACAGTATAGAAGCGCCGGATGCGCGGCGTCTGTTTCAGACCGTCACGCGCAGCGAGACCTTTTCCCCCGAAAACTGGCAGCAAAAGATAGCGTTAATGGGATTTGCCTGCGACGAGGGGGTAAAACGCAATGCAGGGCGTCCCGGCGCGGCAGGCGGCCCGGACGCGTTGCGTAAAGCGCTGGCGAATATGGCCAGCCACCAGGGACATGAACGGCTGGTGGATTTAGGCAATTGGGTTGCGCCGACGCCCGATCTGGAAGGCGCGCAGCAAGCCTTGCGCGATGCGGTAAGCCGCTGTCTGCGGGCCGGGATGCG [...]
+NODE 924 11 1292 1292 0 0
+CTATCTGCGAT
+TCGTGCAGGAT
+NODE 925 114 10444 7357 0 0
+ATGGAAGATTCGAACCTGCCGCAGGTTCGGGTCGAACGCAGTGAGACAACGGAGCCGTTTACGGCGACGGCCCGAAGGGCGAGCGAAGCGAGTCATCCTGCACGACCCACCAAT
+CCGTAAACGGCTCCGTTGTCTCACTGCGTTCGACCCGAACCTGCGGCAGGTTCGAATCTTCCATATCGCAGATAGCAAAAAAGCGCCTTTAGGGCGCTTTTTTACATTGGTGGG
+NODE 926 99 4459 4374 0 0
+GACTCGGCTTCGCCTCGCCCTTCGGGCCGTTGCTGACGCAACGTTATCCTTCACGCTCAACATCTGAGTTTGATGTTAAATTGGTGGGTCGTGCAGGAT
+GGATAACGTTGCGTCAGCAACGGCCCGAAGGGCGAGGCGAAGCCGAGTCATCCTGCACGACCCACCAATGTAAAAAAGCGCCCTAAAGGCGCTTTTTTG
+NODE 927 3666 198543 197605 0 0
+TGGTGGAAATCATGTACACTCTGCGGCAGGTGGTGTGCGTTAAAGGATAGAAAATGGCAAGGATTATCGCGCTGGATGGCGCACAGGGAGAGGGCGGCGGGCAGATTTTGCGCTCGGCGCTGAGTTTATCAATGATAACCGGCCAGCCGTTTGAAATGAGCGGCATCCGCGCCGGGCGCGCTAAACCGGGGCTGCTACGCCAGCATTTAACGGCGGTGCGGGCGGCAACGGAAATCTGCGGCGCGCAGGTGAACGGCGACGAGCTGGGCTCGCAACAGTTGCGTTTTACGCCGGGGCCGATTCGCGGCGGCGAGTACCGTTTCGCGATTGGCAGCGCGGGCAGTTGTATGCTGGTGCTGCAAACCGTCCTGCCCGCGCTGTGGTTTGCCGATGGTTCATCCCGCGTGGAGCTTCACGGCGGGACGCATAATCAGGCCGCGCCCAGCGCCGATTTTATCTGCCGCGTCTGGGAGCCGCTGTTGGCGAGGATGG [...]
+TTGATTGTGCGCGTGACCGGCGAAGAAAACGGCCAGATGCGGCTGGAGGAGATTGAGCGCCAGGGGTTATTCCTGCAACGCATGGACGACACGGGCGAATGGTTCAGCTATCACCCGTTGTTTGGTAGCTTTCTGCGCCAGCGTTGCCAGTGGGAACTGGCGGCGGAACTACCGGAGATCCACCGTGCGGCCGCGGAAAGCTGGATGGAACAAGGTTTTCCCAGCGAAGCTATTCATCATGCGCTGGCGGCGGGTGACGCGCAAATGCTGCGCGATATCCTGCTTAACCATGCGTGGGGGCTGTTTAATCACAGTGAACTGGCGCTGCTGGAAGAGTCATTAAAAGCGCTGCCGTGGGAAAGCCTGCTGGAAAATCCGCGGCTGGTGTTGTTACAGGCCTGGCTGATGCAAAGCCAACACCGCTACAGCGAAGTGAATACGCTGCTGGCGCGCGCCGAGCAAGAGATCAAAGGGGTCATGGACGGCACGCTG [...]
+NODE 928 1347 69837 69592 0 0
+CTGCTGCTCCAGACCTAAATATTCACGCTGCGCCGCACGCAACGTGGCAGCATAATCTTCCGGCAACTGAGGTAACAGCCAGTCAGCCGCCGCATCCTTAGAGGTAAATCTCCCGGTAGAAAGGGTGTACCAGATACGCGCCAGGGTTAAAACGATATGATACTCATCTCCCTGCATATCTGCCGTGGATTGCCAAAGGTCGAGGGGATAACGCAAGGCCTTCAGCAACTGCGCCGCAGGGGCTGGCGTGAACAGCCGTTCCGCGCGTTCGCCCTTTAGCGGTATACTGGTTTCCAGAATTTGGGTTATCAGTAACACCATGTCCCAGTCCTGTTGCGCTGGTTCATAAATCCCCTGGCAAATGTCCTCTCTTAGCCACTCGCCAAATTGCATTTCCCGGGCAGGTGGAAAACACCAGGGAACCAGCTGCGAATAAAGCACGACAGTGACCTCCAGAGCGCGTTTTTCTGCCGACGCCCCCGGCGGCGATGA [...]
+GGATGGTATGTGGCAATCCGTCTATCCTTATCTGGTCAGCGGCGAGCTGGACCCTGTCTTCAGGCAAAAGGCGAAGAAAGACCCGGAGAAAACGTTTGAGGATATTAAAGCGTATTATCGCAAAGGATACGCGACGAATGTTGAGACGATCGGTATTGAAAATGGCGTTATAGAATTCCATCGCGACAATAACGTTGCATCCTGTAAATACAATTATGCCGGCTATAAAATTCTGACTTACGCATCGGGTAAAAAAGGGGTGCGCTACCTGTTCGAATGTAAAGATGCGAATAGCAAAGCGCCTAAATATGTTCAGTTTAGCGATCATATCATTGCCCCGCGCAAATCGGCGCACTTCCATATCTTTATGGGAAATACCTCGCAGCGGGCATTGTTGCAAGAGATGGAAAACTGGCCTACCTATTATCCTTATCAGTTAAAGGCGAATGAGGTCGTTGACGAAATGCTACATCATTAAGTCTGATTGCAATG [...]
+NODE 929 46 3765 3719 0 0
+ATTTAGGGTCGGCATCAAAAGCAATATCAGCACCAACAGAAACAAC
+TGCCTGTTTGGTTCGCTTTGAGTCTTCTTCGGTTCCGACTACCCTC
+NODE 930 4345 277416 273584 0 0
+ATTTGACGCAATGCGCAATAAAAGGGCATCATTTGATGCCCTTTTTGCACGCTTTCACACCAGAACCTGGCTCATCAGTGATTTTATTTGTCATAATCATTGCTGAGACAGGCTCTGTAGAGGGCGTATAATCCGAAAGGCGAATAAGCGTTTCGATTTGGATTGCCTCGCGATTGCGGGGTGAAAATGTTTGTAGAATACTTCTGACAGGTTGGTTTATGAGTGCGAATACCGAAGCTCAAGGGAGCGGGCGCGGCCTGGAAGCGATGAAGTGGATAGTTGTTGCCATATTGCTGATCGTCGCAATCGTCGGCAACTACCTCTATCGCGACATGATGCTGCCGCTGCGTGCGCTGGCCGTAGTAATTCTGATTGCTGCAGCGGGTGGTGTCGCGCTGTTGACGACAAAAGGTAAAGCAACCGTTGCTTTTGCCCGTGAAGCGAGAACCGAAGTCCGTAAGGTCATTTGGCCGACTCGCCAGGAAACGCTGC [...]
+GTAGCTCTGAATCGGGAACACGGAACGGAAGGCTGCTTCCAGGCCGTACTGCCCTTCAGGATCTTGCTCGATAAACTTCTGAAACGAGTCAAGCTGGATAGAAAGGAGATAAGGTACATCCAGAACTTGTGGACGTTTACCAAAATCCTTACGAATACGTTTTTTCTCGGTATAGGAGTAAACCATAGGGTTCCTCAGCTCGCTGACAAGTCGACCCATCTGTCCTGCGGGGGACAGTTTGTGCAACACTATTTTGTTGACCGGAAAATGGATACTTTCCGCAATGCCTGTTGCTATCACGCTTAAACCATTTCATTGCGATTTACACAGAACGTACGCTCTGTCGCAGTATATTAAGTCGTCGATAGAAACAAGCATTGAAAGGCACAGCAGTAGTCAAACAGTGTGAAACGCTACTGGCGCCTTACAGCGCAAAAAGGCTGGTGACTAAAAAGTCACCAGCCATCAGCCTGATTTCTCAGGCTGCAACCG [...]
+NODE 931 4158 201738 196804 0 0
+ATTGCTGCCTGACCACTTGGGGGGCAACGGGGCGCTACTATAGGGAGTTGCGCTAAAACGGTCAAGCAGAATTTACATATTCACTGTCGTTTGCTCATGCAATAGACATAATCCCCGCCCAAACTGGCGCGGGGAGGCAAATTAACGCTGTGAATCCAACATTTCGTTGTTTTTCACCACATCCTGCGCTTTGCTGTAGCTTTCGATCAGCAGTTGATAGGCCGGGAATACCTGAGTATAAACGTCGGCCCACGCGGCGGCGTCTTCACGGTTCCAGGTGCCTTGCAGCTCAGAGGCGACTGCGGCAGTATCCATCGGTACGACGCCAGCCTGTACGATACGCGCCAGGGTGATCTCCTGCGCCATCTTACTGTAGGTGCCGGATGCGTCGATCACGGCAAATACCTTATAGCCTTCCGCTACCGCGCTAATGGCCGGGAATGCCATGCACACGCTGGTAATCGTCCCGGCAATGATCAGCGTCTTACGACC [...]
+AGTTTAAACAACGTCTGTAAGCTATTATTGAACGATCCGACTTGCATACTGGAGTTTCGCCGTCATGCGTCTGGTTCAGCTTTCCCGACATTCTATCGCCTTCCCTTCGCCGGAAGGCGCTTTACGCGAGCCTAACGGTTTACTGGCGCTGGGCGGCGATCTCAGCCCTGCCCGGTTGTTAATGGCCTATCAGCACGGGATTTTCCCGTGGTTTTCGCCGGGCGACCCGATTCTGTGGTGGTCGCCCGATCCGCGCGCCGTGCTGTGGCCTGAAAAGTTTCACCTCAGTCGCAGCATGAGGCGCTTTCACAACGCATCCCCTTACCGCGTGACGCTCAATTACGCTTTCGACCGGGTCATTGATGGATGCGCCAATCACCGTGACGAAGGCACCTGGATAACGCGTGGTATTGAGGAAGCCTATCGCCGATTACATGAATTGGGCCACGCGCACTCCATTGAAGTGTGGCGCGATCGGGAACTGGTCGGCGG [...]
+NODE 932 786 37004 36146 0 0
+TATGCCCGCACGCGGCGTACAATCGGCGTGCTGTAGCGCTGATAAATGATCATCACGGTCAATACCGCCGGAAAAATCAAAATCGCCACCAGCGCCATCCGCCAGTCAAGGCTGAACATGGCGACCAGCATGGCGCCGATCAACGCCGCGCTACGTAATACCGTTGCGACGACCGTGACGTACAGATCGCGGATGACTTCCGTATCGTTGGTCACACGTGAAATTAATTGTCCGACAGGCTGCGTGTCGAAAGCGCTTAGCGGCTGGCGCAAGGCGGCATCCATGACGTCCGTGCGCAAGGACTGAACCACGCCAACGGCCGCCCGGTTAAATAATAAAGACTGGGCGTAATGGAGACCCGCCGCCAGAAACTGTAGCCCCACATAGGCGGCCGCCAGCCCCGCGACCTTGCCCAACGGTAAATGGTGGCGGGCCACCATGTTATCAATGAAATAGCTGATCAGCAGCGGACCGCTAACCTCCGCCGCCGCC [...]
+TATGCAACATGGTCATGTTGTTCAGCGCGGCGATCACGATCAACTGGCGCAGCAGATTGGCTGGTATCGCGATATGTATCGCTATCAGCAACTGGAGGCCGCTCTGGATGACGCGCCGGAACGCGGCGAGGAGGCGGTGAATGCGTAGTTTTGGACAGCTATGGCCGACGCTGAAACGGTTGCTGGCGTATGGCTCGCCATGGCGAAAACCGCTCTCTGTCGCGGTGATGATGCTGTGGATTGCGGCGGCGGCGGAGGTTAGCGGTCCGCTGCTGATCAGCTATTTCATTGATAACATGGTGGCCCGCCACCATTTACCGTTGGGCAAGGTCGCGGGGCTGGCGGCCGCCTATGTGGGGCTACAGTTTCTGGCGGCGGGTCTCCATTACGCCCAGTCTTTATTATTTAACCGGGCGGCCGTTGGCGTGGTTCAGTCCTTGCGCACGGACGTCATGGATGCCGCCTTGCGCCAGCCGCTAAGCGCTTTCGACA [...]
+NODE 933 16108 1002467 993205 0 0
+AAACGCCGTCAACGAGATAGCGCAACCGATAGCCAGCGGCAGATTCGCCCAAAGCCCCATAACGATAGAGCCGACGCCTGCGACCAGGCAGGTCGCTACAAAGACGGCAGCAGGCGGGAACCCGGCTTTACCCAGCATCCCTGGCACCACGATGACGGAGTAAACCATCGCAAGAAACGTGGTTAAGCCAGCAACGACTTCCTGGCGAACGGTGCTCCCGCGTTGTGAAATTTTAAACCAGGCGTCGAGTGAACCGCCGGTACGCGCTGAAGGCGTAGACATAGAAAACATCCCCTGAGAATTTATTATTCGTCGGTATACGTGGGAGGTAATCCACTAACAGCGCAACGTTATCTCCTTGTGCTACATTTACGACAGCCGGGGCGCCGCAAAAAAGCAAACGTTTAGCTCCACATATACAAAACGGGTGGCAAAAAAAAGCAAACGATTATCCAGCGATCATAAACGCTTTTTCAACTGAACTTTGCCGCT [...]
+TAACGGTATTCCCGGCGACAACCTGACCAATGACGTTCGTCCACACTTCCGCGTCACGGTGCCAGGGGATGTCAACGAGGTACGTCTGAGTATCGACGGCGGTAATACGTGGGTTCGTGCAACACAGGGCACGGCAGGGATCTGGGATTACACCTGGCCGAAAGATGTGACCGACGGGCTACATACCCTGACGGTAGAAGCGACCGATAAGGCGGGAAATAAGACGACGCAGACGCTCGATTTTACCATTGATACCCGGCTGTCAACGCCTACCATCACTATGGATAGCAGGGACGATACAGGCGCCATTGGCGATCATATTACGAGCGTCAAAACACCGGGCTTTACCATTGGCAATATTGACGCCGATGCGCACTCGGTCATTTTGCGGATCACGCAGGGCAGCAATAGCCAGGAAGTGAAACTGACCCAGGTCGGCGGTCAGTGGCGCTTTACGCCAGATACTGACTGGGCGGACGGTAGCTATACGCT [...]
+NODE 934 304 33738 33413 0 0
+ACAGCGGAACAAAAGGCGATAATCTGACCAATGTGAATAAGCCGACGTTTATACTGGGCAATATTGACGCGGACGCACGGTATGTCACGGTTGAGGTACAGCATGGCGGCACGAAAGAGGTGCTGACGGCCACCAAAGGCGCGACCGGCATCTGGAGCGTGACACCGACCGGCACATGGGCAGATGGCAGTCATACGCTGACGGTGAGGGTGGAGGATGATGCGGGTAACGTAAAATACTCATCGCCGCTGACGGTTACGGTCGATACCCATATTGCCATTGATGATATTGAACTGGTTAATGA
+CGTCAGCGGCGATGAGTATTTTACGTTACCCGCATCATCCTCCACCCTCACCGTCAGCGTATGACTGCCATCTGCCCATGTGCCGGTCGGTGTCACGCTCCAGATGCCGGTCGCGCCTTTGGTGGCCGTCAGCACCTCTTTCGTGCCGCCATGCTGTACCTCAACCGTGACATACCGTGCGTCCGCGTCAATATTGCCCAGTATAAACGTCGGCTTATTCACATTGGTCAGATTATCGCCTTTTGTTCCGCTGTCGTCCGTGCTGTCCAGAGCGATAGTCGGCTCTGACAGTAGGGTGTCGATG
+NODE 935 4 1076 230 0 0
+ACTG
+AAGC
+NODE 936 24 4475 1535 0 0
+CAAATCTGCCGGGAGCAGATTTGA
+TATGCTCCTGGGGACTCACTCCCT
+NODE 937 14 2691 2222 0 0
+GCGACGGCCCGTCA
+CTCACCCCAGTCAC
+NODE 938 13 2175 2117 0 0
+GGGCGAGGCCCAT
+GGCAGATTTGTCG
+NODE 939 2361 125992 125375 0 0
+GGTTTCAGTGGCTTCTATTTGCTCCAGGCGCGTAAACTCAGCGGCAATTTCCGCCTCCGATTTACCCGCCATAAAATGCCGCAACGAGGTGATCGCCTGTTTGCCATGAATAAAGCCCAGCACCTCATCATGAGCAAGGTTAAAACGATCGGCCCAGCTACACCACGCGCGTTCGACGGCAGGTAATGAGTCAACCAACGTTCCATCCAGATCAAACAGAAAACCTTTACACTGCACGCGAGCCTCCTCAGGCATTAATGATTTGATTGATTTCATTCGCGCTCAGGTGGTACTGACGCGGGCAGGCATGCCAGACATTCAACATCCGCTGGTATTTTTCCCACATCGGCGTCTGGGCATTAAAGCCGTGCGTCCCGGCGTCAAAGTGAGTGTAGCGTCCTTCTATATTCACCATAAAACGGACATAGCCGAGGTAACGCGCTTCCGTCGCAGCGTCAAACCCCAGGAAGGTGACGCGACGTTCGTCGATGG [...]
+CCCATAGAGGTATCCACGCATTTACCGTTACGGATAGCGGAAACAGAACCGCCGTTGCCCAGGTGGCAGGTGATAATGTTCAGTTCTTCTACCGGCTTGTTCAGCATTTTTGCCGCTTCCTGAGTTACATAGAAGTGGCTGGTGCCGTGTGCGCCATAGCGACGAACGCCGTGTTCTTTATACAGGCTGTACGGCAGGGCATACAGGTAAGATTCTTCCGGCATGGTCTGATGGAAGGCGGTGTCGAATACTGCAACGTTTTTATCTTTCAGCTGCGGGAAAGATTTCAGCGCTTCGGCGATACCAATCAGGTGAGCCGGGTTATGCAGCGGTGCGAAAGAAGCGGAATCTTTGATGCCCTGAATGACGGACTCATCAATGACTACGGAGCTGGTATACTTCTCGCCGCCGTGTACGATACGGTGACCAATTGCAGTTAACTGCGCAGACAGTTCTGGTTTTTGTGCCAGAATAGTGTTAACGATAAAGTTC [...]
+NODE 940 5 252 247 0 0
+TCAGA
+ACCCT
+NODE 941 155 7976 7976 0 0
+GATTAAGGCGTTATCTTGACATGAAAAATGTTCAGCGACCTGCAGCTCCACAAATAGCATGGCGTGTAGTAACGCGCGAATATCTTTGTCCTGAAGGACAAGCTGCGCCATACCCCGATCGATATTTACGATACAGAACAGGCCGTGGCGTAGAA
+CAGCTTGTCCTTCAGGACAAAGATATTCGCGCGTTACTACACGCCATGCTATTTGTGGAGCTGCAGGTCGCTGAACATTTTTCATGTCAAGATAACGCCTTAATCGATCCTTTAATACACGCGCTTCATAAGCAACCTAATCCATTATGGCTGGG
+NODE 942 945 66282 65494 0 0
+CTTATCTGATGTAAAGGAGAAAATCATGGCTACTATTGGGTATATTCGGGTGTCAACAATTGACCAAAATATCGATTTACAGCGTAATGCGCTTACTTGTGCAAATTGTGACCGCATTTTTGAGGACCGTATCAGTGGCAAGATTGCAAACCGCCCCGGCCTGAAACGAGCGTTAAAGTATGTAAATAAAGGCGATACTCTTGTCGTCTGGAAATTAGACAGACTGGGCCGCAGCGTGAAAAACCTGGTGGCGTTAATATCAGAATTACATGAACGTGGAGCTCACTTCCATTCTTTAACCGATAGTATTGATACCAGTAGCGCGATGGGGAGATTCTTTTTTCATGTAATGTCAGCACTGGCCGAGATGGAGCGAGAATTAATTGTCGAGCGAACCCTTGCCGGACTGGCTGCCGCCAGAGCGCAAGGACGACTGGGAGGGCGCCCTCGGGCGATCAATAGACATGAACAGGAACAGATTAGCCGGCTATT [...]
+TATCGACACTTGAGGCATAAACTTTACTATTTTTTCTGTCCGTAATTGCTTACATCTAACATTTTGATTAAAAAGCCTTTCCAGGTGAATACTGTGTCTGGTAGTGTTTTGAGCGATGTCGTCTATAGCTGGATGTAACATAGGCCTTATCGTGAGCGCGCTACACTATATATGTTAATGCGTTGAATTTTGTCTCTTTTTAATTAGATGCTGTCTTTTTCGTGTACCCTTCCGGTTTATTTATGCCATACGCCTGCATTACAAAAATGTTATATCCATCCTGTTGTAATTTTTATTTTAATTCATTCGTTTTTTTATACGGCTTGCCGGAAAATATCTGTATAAGGTAGATACGCCAATACCAAAAATAATAGCTAGTTGCTGCCGAGGATGGCCTTTCTCTAATAGCCGGCTAATCTGTTCCTGTTCATGTCTATTGATCGCCCGAGGGCGCCCTCCCAGTCGTCCTTGCGCTCTGGCGGCAGCCAGTCC [...]
+NODE 943 47 8222 5333 0 0
+AGGCGTGACGACGAGGCACTACGGTGCTGAAGCAACAAATGCCCTGC
+TGTTAAAGTGAACCGGATTTACCTGGAACACACACCTACACGCTTAA
+NODE 944 3913 200620 198608 0 0
+CGGCGCGCCGAAGTACGGTAACGACGATGACAGTGTCGATACCCTGCTGGCGCGCGCTTATCAGACCTATATTGATGAGCTGAAGCAATACCATAACCCGCGCTACGGTCGTGGCCCTGTCGGCGGCAACTATTACGCCGGTACGTCCTCTATCTCAGCAAACGTGCCATTTGGCGCCGCGACTATGGCAACCCCGGATGGCCGCAAAGCGCATACGCCGCTGGCGGAAGGCGCAAGCCCTGCATCAGGTACGGATCATCTCGGCCCGACGGCGGTGATTGGTTCCGTAGGCAAATTACCTACCGGTTCCATTCTCGGCGGCGTGCTGCTCAACCAGAAACTGAACCCAACGACGCTGGAAAACGAATCCGACAAACAGAAACTGATGGTTCTGCTACGGACGTTCTTTGAGGTGCATAAAGGCTGGCATATTCAGTACAACATCGTGTCACGCGAAACGCTGCTGGATGCGAAAAAACATCCGGACCAGTA [...]
+AGATTGATAAAATCAAGCTGGAAGAGGTGAAAGCCTCCAGCCGTCAGAACCCGTTCATCCGTTTTGAGCAGGATAAAAAACTGTTCCGTAACGCTCTGGAAGTGGAGGCGCTGACGAAAGGTTTTGATAACGGTCCGCTGTTTAAAAATGTCAATTTGCTGCTCGAAGTCGGCGAGAAGCTGGCGGTACTCGGCACCAATGGCGTGGGTAAATCTACGCTGCTGAAGACGCTGGTTGGCGATCTGGACGCCGATCACGGCACCGTTAAATGGTCGGAAAACGCGCGTATTGGTTACTACGCGCAAGACCACGAATATGAATTCGAAAATGACCTGACGGTGTTTGAATGGATGAGTCAGTGGAAGCAGGAAGGCGACGACGAGCAGGCAGTGCGCAGTATTCTGGGCCGCCTGTTATTTAGCCAGGATGATATCAAAAAGCCTGCGAAAGTCCTCTCCGGTGGCGAGAAGGGCCGTATGCTGTTCGGCAAAC [...]
+NODE 945 1 91 91 0 0
+G
+C
+NODE 946 2912 172960 170488 0 0
+TAAAATGGGTAATTTATATCAGCAACGGCTTAATTCTCCCGCCTGCCAGGCAAAACAATGCCACTGTTTTCTCGCTTATCAGCACCGTCTCGATATTCCATTGCTGAATCACCTGGATACCTCACGCTGTTTTAGGATCGGGCGCTCATGCGATATCGTTTAATCGCTTTTGATCTTGATGGAACGCTGCTAAACCGTAATAAACAAATTCTGCCAGAGTCGCTAACCGCTATCCGTCAGATGCAGGACATGGGCTGCCGAATAATGCTTGTCACCGGTCGCTCTCATCGTGAAGCCTATGCGTATTATCAAACGCTGGCGCTCACCGAACCGATGATCTGTTGTAACGGAAGTTATATTTATCAACCGGCTCAACAGCAGGTCCTTCACCCGCTGCCGCTGACGCACTTACAAACGGAAAAAATACTGGCGCGGGTATATCCGCTTAAACCGACAATTCGTGCTGATGATAAAATAATCTTTCAGGCTGAT [...]
+GACTCTGCAATACTTGTTTGCGGAGGATGTTTGTGATCCTGTTTTGTAGTGCGATTAATCCGTGTACAATAACGCGCTATTTCTAATGCCTGAGGCAAAGTTGTGATCGAAAATTTGCGTAACATCGCCATCATCGCGCACGTTGACCATGGTAAAACTACCCTGGTTGATAAGCTGCTCCAGCAATCCGGTACGTTCGACGCGCGTGCCGAAACTCAAGAGCGAGTGATGGACTCCAACGATTTGGAGAAAGAGCGTGGTATTACTATCCTCGCTAAAAACACCGCTATTAAATGGAATGATTACCGTATCAACATCGTTGATACTCCCGGGCACGCTGACTTCGGTGGTGAAGTAGAGCGCGTCATGTCCATGGTTGACTCTGTGCTGCTGGTGGTTGACGCATTTGACGGCCCGATGCCGCAAACGCGCTTCGTGACCAAAAAAGCCTTTGCTCATGGCCTGAAACCTATTGTGGTTATCAACAAGGTT [...]
+NODE 947 51 3672 3672 0 0
+GCACCAATGTGGTGCTTAATGTTCACATTAAAGCACTATTTTGGTGCAACA
+CAATAGAACGCAAGCCACCCTTTTAACGCTCCGTGAAAGCGATCACAAAGA
+NODE 948 3547 172267 170858 0 0
+TTATGGCCGGGGCGAACTCGATTTTCTATGGCTGCAAATTGTTAACTACGCCAAATCCGGCAGAGGACAAGGATCTGCAGTTATTCCGTAAGCTGGGGCTGAATCCGCAGCAGACCAGGGTGCTGGCGGGCGATAACGAGCAGCAGCAACGTCTGGAGCAGACGCTGATGACGCCTGACACCGATGATTATTACAACGCGGCAGCCTTATGAGTTGGCAACAACGCGTCGACGATGCGCTGACGGCGCGTCGGGCGACGGATACGTTGCGCCGCCGCTATGTGGTGTCGCAGGGCGCCGGACGCTGGCTGGTAGCGAACGGGCGACAGTATCTTAACTTCTCCAGCAATGATTACCTCGGCTTAAGTCAACACCCGCAGATTATTCGCGCCTGGCAACAGGCAGCGACGCGTTTTGGCGTCGGCAGCGGCGGGTCGGGTCATATCAGCGGTTATTCCGTGGCGCACCAGGCGTTAGAGGAGGAACTGGCGCA [...]
+TATAGCGTCCGGCTGATCGCCAGAAGGTTTAAAAGCGGAATTCAGTTTGAACGGTTTACTCATGAGCGGCTACCTGAAGGAGTGAGCGGGCAGGGGTGTAATTTTACTCTCGACGGTGAATATTGCCAATAAAAAATACTGGATGAAAAAACAGTAACACTCCAGTGTATAATGGCTATCGGCAGATACCCCACGCTATTTAGAGGTAAAACATAGACAGTCGCGGGGTAAAATTCCAGCAGTGTGCTGGTTATCCCCAGACCAGAGTCTTTTTTAACATTTGTCAAGTCGAATGATGAAAGTTTTATGTCAACGTATCCCCCTTCCTTTACAACCATTGATTTTATATAACTTGCTGTCTGAAAAGGGATATTTTCTCAAGCCGTCTTTCGCGCCAATTTAGTCGCAGGCCGCGTCGCCTCTCGCTTACGTTGTGTTTTCTAACTCTAATACACAAGGTTATCCACAGGAATAGTGGATAACTGCTTCCAG [...]
+NODE 949 3995 208043 206307 0 0
+AATTATTCGCTACCGTGGGCAGATAAAGTCCTGGGGTTGTCGCTTCTTCCGGATGCGCTCCGCGCCAAAGTCCCGCCGTCTGCCAGGCGGCATACGCCAGTTGTATGACGACCCCCACGCTGAATAGCGCAACGGCCAACGGGCGATACCAGGGAACGAAACCGATCGCGACCAGCATCGTGGTGGCGGGAAACAGGCTGACAAAACTGCTCATTACCGGATGTCGCACTTCAGCCATCACGCTATGGGGAAAGCGCACCAGACGGCTAAGGAACGCCAGGGTCAAGAGTGCCCAAATAATCATCGCCAGGATCACCATGATGTCGCCGGGCCAGTGGCTTATTGCCCATATCTGGCTGGCATAACGCCAGGCGAATCCCATACCGATGGTGCCAAGGACGATGCCAAAATAGCCCGCAGGCAGATTGAGCACGCGATCGCTCTGCTTGTGATTACGCATTTTGTTTAATTTATAAAGTATATTTGAAATGC [...]
+CCGGCGCCGACGTCAAACACATGCAGCGTCAGGCCAAAACGCTCAATCATCACTTTGATCGGCGGACTGAGACTGTCGATCGCCATGACGATCACCAACCCCATGCCGACAAAACCGATGCCGACCGTCACCCCGGCTTTCACCGCCTGTAGCCAGGGAATACGAAAGATTAAGCCGATGATAATCATAATGATGGGCACAAAAACGGTGCCGCCGAGAGACAGGATGTAATCAAACATAATGCCCCCTTTATTGTGTTAACAGCGCCTTGATTTCTTGTTTTAATGCGTCGTCGTTGATGCCTGTCAGCAGGGCGGCGCCGTTGAGCGTCGGGATGCCATAGTCACTGTGCGTACGCATGGACGTTACGATGAGATCCATACCGTTACAGTTCAACGGGATCTCATTCAGACAACATTGCGCCGTGGTTGCCGCAATGCCTTGCTCCGCAAGAAAGTCCTGCAGTTTTTGTGCAATCATGGTTGATGTCGA [...]
+NODE 950 18315 1019449 1010778 0 0
+CAGGCCGACCAGCGTTCCGACCGAACGGTGCAGAATACGTACGCGCGTCGCGCCATAGCCGTTTTGGGTGACAAACAGCACCGTCATGAGGATCCAGTACGGTTTAGGCAGGTGCAACGCGCTGCCCATCAGACTGGCGATGCTCATCATCACGCTGATGCGTCCGGCGTTGCGTAGCGCCGGCGATTTTAGAGACATATAATTTTTCAGCGCCGGAAGTAGCGGCAGACGACGCTGTTTATCGGCCATCAGGTCGCGGGCGTACAGCGGCCGCTGAGTACGCAGCACACGGGCGATTCGACTGAAGTGCCAATAGCAGAACTGGCCTACCGGATTTTCAGGATGCTGATTAGCGATCTTCTCCAGAGCGCCAATCTGTTTTTCCATGGAGAAACGCGTCGGCAGACGATGATAAAGAATGTCATCCGCCAGCACGCGCAGACGGGCGGCGACCGTTTGCGCATTCCAGCGAATCACCTCTTCCGCATGGCT [...]
+AGCGTTATCGATCTGGTCGAATGCACGAGCAGCACCGCCGTAGGTTTTAGCCAGTACGGTGGTGATTGCAGCGGTCAGGGTAGTTTTACCGTGGTCAACGTGGCCGATGGTGCCGACGTTAACGTGCGGTTTTGTACGTTCAAATTTTTCTTTAGACACGGCTATATTCCTTACTATAGCGCTCTCCCCTTCAGGAGAGAGCACGGGATTTTGGTTTTTAACCCTGCGGCTTATTTACCACGGGCTTCGATTACGGCCTGAGCAACGTTGTTCGGCGCATCATCATACTTCAGGAATTCCATAGTGTACGATGCGCGACCTTTGGTCAGAGAACGCAGCTGAGTTGCATATCCGAACATTTCAGACAGCGGTACTTCAGCGTGGATCTTAACGCCTGTAACTTCAGATTCCTGACCTTTGAGCATACCACGACGGCGGCTAAGGTCGCCGATAACGTCACCGGTATTCTCTTCAGGTGTTTCTACTTCAACC [...]
+NODE 951 692 32579 30694 0 0
+GTGGGCATGTCACGTAAAACGATGGTTGGTCAGTTACTTAACGTGGGACCATCAGACCGTCTGAACGGCAGCCTTGCGTGCGCGGTAATTGCCGCGATGCAGGGCGCGCAGATCATTCGCGTCCATGACGTCAAAGAAACCGTAGAGGCGATGCGGGTGGTGGAAGCCACTCTGTCTGCAAAGGGAAACAAACGCTATGAGTAATCGTAAATATTTCGGTACCGATGGGATTCGCGGACGTGTAGGCAATGCCCCCATTACACCTGATTTCGTGCTTAAACTGGGTTGGGCTGCCGGAAAAGTGCTGGCGCGTCATGGCTCGCGTAAAATCATTATCGGTAAAGATACGCGTATTTCCGGCTATATGCTGGAGTCCGCGCTGGAGGCGGGCCTTGCCGCTGCGGGACTGTCGGCCTCGTTTACCGGACCTATGCCAACGCCAGCCGTCGCCTATCTGACGCGGACTTTCCGCGCGGAGGCGGGTATCGTTAT [...]
+CTCGCTTTCCCCAGCTCGGCGGAGTCTACGCAGGTGATCTCTTTTTCCATTTCGGCTTCGATGGCTTCTTCCACATCGTCAGGCAGTTTCGTACCGTCGATAGAGAAGAATTTAATGCCGTTATCATAGAACGGGTTATGCGAAGCCGAGATAACGATACCCGCCTCCGCGCGGAAAGTCCGCGTCAGATAGGCGACGGCTGGCGTTGGCATAGGTCCGGTAAACGAGGCCGACAGTCCCGCAGCGGCAAGGCCCGCCTCCAGCGCGGACTCCAGCATATAGCCGGAAATACGCGTATCTTTACCGATAATGATTTTACGCGAGCCATGACGCGCCAGCACTTTTCCGGCAGCCCAACCCAGTTTAAGCACGAAATCAGGTGTAATGGGGGCATTGCCTACACGTCCGCGAATCCCATCGGTACCGAAATATTTACGATTACTCATAGCGTTTGTTTCCCTTTGCAGACAGAGTGGCTTCCACCACCCGCAT [...]
+NODE 952 4637 267847 265714 0 0
+GGTCTGGATACGGCGGCAGGGATACGCGTGGAATCACAAAAGGCTCCACCGTATTTACTGTCTGCTCAAGCTGAATTTTCGCCGTAAGGGTAAACAACGGCTGCCGGTACGCAATCCCTCGCCACTGGTCACGCCGGAAGCGCTGAACCAGAGCTGGTCTGTGGGCGTCGTTTTCGCACGTTCAATGTTGTTGATGACTGTAATCGTGAAGCGTTGTCGATTGAAATCGATCTGAATCTGCCAGCTCTGCGAGTGGTCCGTGTACTCGACAGGATTACAGCAACCGCGGTTATCCGGCCATGCTGCGTATGGATAAGGGACCGGAATTTATCTCGCTGGCACTGGCTGAATGGGCAAAGAAACATGTAGTAAAGCTGGCGTTTATCCAGCCGGGTAAGCCGAAGAAAAACGTTTTCATCGAGCGTTTTAACCGGACATACCGTACAGAAATACTCAATTCTTATCTGTTCAGAACGCTGAATGAGGTGCAGG [...]
+CCGTAAGCCCCATTCCATGCCAAGTGCAATGCGCTGTTATTACCACCACCTGGCGGGGCATCGGCACGGTAACTCTGACGCACCTCCCAATCCAGTTGCTGACTGAATGCCTCTCCGTTGACCCCCACTTGTTGCGTCTGACCACCGTGTGATGGTGAAGTCATCTGCCAACTAGCACTTACATTATTCCCCGTCCAGCGGCTTAATGGCATACTGAACCACAGGCTGGTTATGTTCTCTTTACGGTGCGCGCCATTGCGCCACAGCGTTCTGTTTTGATTCCAGTTCAATGACAGCGAGCCCCCTCCGATAGAGGTTCCCCAACTCAGTCCGTAGCTGTCATCATGACCGGGGCGATTACGCCAGTCGGTACGGGAACCGGTTAAACTCAGATTGCCCAAATGCCTCCCCCATGACTGACTCAACATCAGGGTAGTACGCGAGCTCGGCTGCAAATTTTCCCGCCACGACCATAGACGGTTGCCATTATGT [...]
+NODE 953 9905 548632 543637 0 0
+AGGTTCCAGAGTTTCCAGCCATTAAATTTTGAGTTACCTGCGACACGTTCAGCACGGGCATATTCGACAACATCTGTTTGACCTCCAACCCATGAAAGTATACCTTTCATGAAAAGGTTACGTTCTGGTAATAGCTTGATATTTTCTACAATCTCGCGCGACATCAATCGAAAATCACCGACATTCTCTTCAATCTTTGGCGTACTGATTTTGTTATGCAGCCTGTAGAACCACTCAGCGCTTTTACGCTTCAGGTGGCCATCCGTTGAACGATCGATACGCTTAGCCAGCACCATTTCTGCACCAGCCTGCCATTTATTGATCAAATGTGGGATTACTTCGATGGGATCTTGTAAATCAACATCGATAGGGATCACCACATCTCCGGTCGCGTAATCCAATCCGGCAAAAAGTGCAGGTTCTTTACCAAAATTGCGGGTAAATGAGATCGGAACAACAAGAGGATCGGCAACAGCTAATGCGCTGATGATT [...]
+TTCTCTAAAGGAGATTAAAAGATTCCTGATGCCTGATACATCAAAATACGTCTGAACGATAACGAAGAGAGAATATTATCTCTCCCGGTAAATCAAGGAAAGCGTATATGGAAACATTATCTGTTGTACATACCGTGGCGAATAGACTACGTGAATTAAACCCTGATATGGATATACATATTTCATCAACCGATGCGAAAGTATATATCCCAACAGGACAGCAGGTAACGGTATTAATTCACTACTGCGGTTCGGTTTTTGCCGAACCAGAAAATACGGATGCCACGGTACAAAAACAACTAATCCGGATTTCCGCCACCGTTATTGTTCCGCAAATAAGTGACGCGATAAACGCGCTGGATCGTCTACGTCGCTCGTTGGGGGGCATTGAACTTCCCGACTGCGATCGTCCGCTCTGGCTGGAAAGCGAAAAATATATCGGCGACGCCGCAAACTTCTGCCGTTACGCCCTGAATATGACCGCCAGCACCC [...]
+NODE 954 1504 82416 81563 0 0
+CCTTTTCGAAACCGGCGTCAAAGGCGGCATCGATGCCCGCCATCACCTGGCGGAATTTGTCCTGACCGGTAATCGCATGGAACTGACGCGCATCCAGACTATCCACGCTAACATTGACGCCCGTCAGCCCCGCTTCGCGCCAGTTCGCGGCATCGCGCGCCAGTCGATAACCGTTAGTGGTCACCGCGATCTGGCGAATAGCATCATTTTCACCCACGGCGGCAATGATGTCGGTAAAATCGCGGCGTAATGAAGGCTCGCCGCCGGTAAGACGCACCTTCTCCGTGCCAAGACTGGCAAAAGCGCGCGTAACGCGACGAATTTCATCAACGGTAAGGAAACCGTTGTTAGTGACGCCGCCAGGTTTGTAGCCATCCGGCAGGCAGTAGGTGCAACGAAAGTTACACACATCGGTAATCGACAAACGCAAGTAGTAAAACTTACGCGCGAAAGCATCGGTAAGTTGTGAAGCCATGTACACCTTTCCAAATA [...]
+TATAAAAACTGCCAGGGCCAATCAGAATCAGATCCGCGTCATTAATGGCCTGTACCGCTTCCCGCGTCGCCGGAACGTTTGGCGTTAACATGATCTCCTGCGGCGGAGTCGCTAACTGATCGATATTCACCTCGCCATAAATCTCATGCCCCTGATCGTCAATCGCCATCAGATCTACCGGTAGCTCCGACATCGGGATCAGCTGCGCGTCCACTTTAAGCAGATTACGAATTAAATTAATCGCTTCCAGAGGCCGCACGCTCAGATGATCTAACGCCTTTAACATCAAATTTCCGAGGTTATGACCAGAAAGTTCGCCATTACCGCCAAAACGGTACTCAAACATAGCGGATGCGACGCTGGGTTCGGTAATTAACTGATTCAGACAGTTGCGCATATCGCCCCAGGCGATCCCGCCTTCCGAGCGGCGAATACGGCCAGTTGACCCCCCGTTATCTGTGGTAGTCACAATGCCGGTCAGGCGCGAACCTA [...]
+NODE 955 35 14642 4815 0 0
+TGGAGCTGAAGTCAGTCGAAGATACCAGCTGGCTG
+ACCTACGTGTCAGCGTGCCTTCTCCCGAAGTTACG
+NODE 956 15 7390 2579 0 0
+CAAGAATCCGTATCT
+GAGTGAACACGTAAT
+NODE 957 18 8361 2864 0 0
+ACAGATTGTCTGATAAAT
+CTCGGACGAAAAATGAAT
+NODE 958 156 31715 27815 0 0
+CGGGGTTCAGACCAGAACCTCACGGAGAAAAGCGAAAATAAACGCTTGACTCTGAAGCGGGAAAGCGTAATATGCACACCCCGCGCCGCTGAGAAAAAGCGAAGCGGCACTGCTCTTTAACAATTTATCAGACAATCTGTGTGGGCACTCGAAGAT
+CGCTTCGCTTTTTCTCAGCGGCGCGGGGTGTGCATATTACGCTTTCCCGCTTCAGAGTCAAGCGTTTATTTTCGCTTTTCTCCGTGAGGTTCTGGTCTGAACCCCGCTGACCCGGCGGCCTGTGTGCCGTTGTTCCGTGTCAGTGGTGGCGCATTA
+NODE 959 3 1184 1180 0 0
+ACG
+TGC
+NODE 960 3332 156047 152096 0 0
+GACAACGAGGACTTTATGTTCCTCAACCTCGGCCCGAACCACCCATCTGCGCACGGTGCGTTCCGTATTATCCTGCAACTTGACGGCGAAGAAATCGTCGACTGCGTGCCGGATATCGGCTATCACCATCGCGGCGCCGAAAAAATGGGCGAGCGCCAGTCCTGGCATAGCTACATTCCCTATACCGACCGTATCGAATACCTCGGTGGTTGCGTCAATGAAATGCCGTACGTGCTGGCGGTAGAAAAGTTGGCAGGGATCACCGTCCCGGATCGTGTGAACGTCATCCGCGTGATGCTCTCTGAACTGTTCCGCATTAACAGTCATCTGCTGTACATCTCGACCTTTATTCAGGACGTCGGCGCGATGACGCCGGTCTTCTTTGCCTTTACCGACCGGCAGAAAATTTATGACCTGGTGGAAGCCATTACCGGTTTCCGTATGCACCCGGCCTGGTTCCGTATCGGTGGCGTCGCGCACGACTTGCCGCGC [...]
+TCGTCAATAGAGATAAAGGTACCGTCGGTGGCTGGCGTCATACAGGACATCACCAGGCGACCACGCGTATCTTCCGCGTTTTGGTATTGCTTCACCGCACACTGGCGGCAAGCACCGACGCTTCCCAGCGCCGGGTGCCAGCAAAAATACGGAATATCAAGGCCGAGGGACAGACATGCCTTTAGCAGGTTGTCCGCGCCGTTGACCTCGTATTCTTTGCCGTCTACATGAATCGTAGCCATTAGCATGCTTCCAAATTAAAAATCGTTAACTCACCAGCGCTCTTTGAGCAGGTTCGGCTGAATACCATTGATTAAATGGGTATTGCTGAACGGCTGCTTGATGCCAGCTTCGAATTCTTCGCGGAAATACTTAATTGCGCTTTGCAGTGGCTCAACCGCGCCCGGCGCATGCGCGCAGAAGGTTTTACCCGGTCCGAGGAAACGACACAGTTGCTCAAGTGTCTCGATATCCCCCGGCTGGCCTTCGCCA [...]
+NODE 961 5005 270151 266166 0 0
+TGGTCAGTCAGGATGCCCAAAGCAGAGAGATTCAGATGAGATTCACGGCGAATGAGACGCTTAAGCGTATTCAGGCTGACCCGGACAGGCTGACTCAGGTGCTGTTGAATCTGTACCTGAACGCTATACATGCGATTGGCCGCCAGGGAACGATTACCGTAGAGGCAAAAGAAAGTGGGACCGACCGCGTTATCATCACTGTTACCGATAGCGGGAAAGGGATCGCCCCGGATCAGCTGGAGGCGATTTTTACGCCTTATTTTACGACCAAAGCTGACGGGACAGGCCTGGGGCTGGCGGTGGTGCAAAATATCATCGAACAGCATGGCGGTGCGATTAAGGTGAAAAGTATTGAGGGTAAAGGCGCGGTCTTTACTATCTGGTTGCCAGTGATAGCGAGACAACAGGATTAACAAGGGTGATACGCGGAAAAATCGATATTCTGGTTGTGGATGATGATGTAAGCCACTGCACGATTTTACAGGCGCTGCT [...]
+TCTCTGCTGACCGCAATAGAAAAATTGCAGAAAAATGACTGTTTGCTGCATTCCCCAGCAAAACCCCTGGTTATACCAATTTACGCACAGACTTATCCACAAAATATGCGTTCATTTCCTGGATCTTCTCACTCTGCAAACGATCTTTCAGGGATAAAAGCCGGGCCAGAATTTAAAAAGAAAAATTCGCGAGCGTTGCGCAAACGTTTTCGTTACAATGTCGCCGCAAAATGAGAATGCCCCATAAGGGGCGTTAGCTGAGTTTTTCACGAAAAATTCAGCTAACGCTCTCTGTAATCGTCAAATCCAGGGGATTTACCATGCAACAACGTCGTCCAGTCCGCCGCGCTCTGCTCAGTGTTTCTGACAAAGCCGGTATCATCGAATTCGCCCAGGCACTTTCCGCACGCGGTGTGGAGCTGCTGTCTACGGGGGGCACCGCCCGCCTGTTAGCAGAAAAAGGCCTGCCGGTGACCGAAGTTTCCGATTACA [...]
+NODE 962 1442 72810 72353 0 0
+GGCGCGAACAGATTTTCCGGCAGATAGCCTTTCCACAAGCTGTGCATGGAGTTATCCGGATCGCACACCGACATCGCGCCGAACGTGTCGCCATGATAACCGTGGCGAAACGTCAGAAAACGCTGACGCGATTCGCCCCGCGCCTGCCAGTATTGCAGCGCCATCTTCATGGCCACTTCCACCGACACCGAACCGGAGTCGGCCAGAAAGACACACTCCAGCGGCTCAGGCGTTATCGCGACCAGCTTACGGCACAGATTCACCGCAGGTTGATGGGTTATGCCGCCGAACATGACATGCGACATGGCGTCAATTTGCGCTTTCATCGCCGCATTCAATTGCGGGTGGTTATAACCATGAATGGCCGCCCACCAGGAGGACATCCCCTCAATCAGGCGTTCGCCCGAGGCGAGAACCAGCTCGCAGCCTTCGGCCCGCTCAACGGGATATACCGGCAGCGGCGAGGTCATGGAAGTGTAAGGATGCCAAATA [...]
+CGCACGTATGAGGTCGGCATCATGATGCGCGCCACGGCGATAGTACGAATAAAATCAAACGCATCCACGTCATCGTTATCCGCAAGCGGTGTGCCTTTCACCTTCACCAGCATGTTGATTGGCACGCTTTCCGGCGGCGTCGGCAGGTTCGCCAACTGCAACAACAGTCCGGCGCGATCGGTAACCGTTTCGCCCAGACCCACAATGCCGCCGGAGCACACTTTAATCCCTGCTTCACGGACTTTTTCCAGCGTGTCGAGGCGCTCCTGATAGGTACGAGTAGTGATGATATTGCCGTAAAACTCCGGCGAGGTATCGAGGTTGTGGTTGTAGTAATCCAGCCCGGCGTTAGCCAGACGCTGCGCCTGGCTCTCGTTCAACATGCCGAGCGTCATACAGGTTTCCAGCCCCATCGCTTTGACGCCCTGTACAATCTGCTCCAGATAAGGCATATCGCGTTCATGCGGATTCTTCCAGGCCGCTCCCATACAG [...]
+NODE 963 5695 299430 297783 0 0
+CCGGAATATAACGTGGCGGTAGACCGTTACGGCGACTGGGCAGTGATTCAGGAATATGCGCCGCCGAAAACGGTGGATGCGCAAAAAGCGCGGCAGCGTCTGTTCGATATTATTGCGGCAACCTTGTCAGTGCTCGGTATTCCGCCGAATAAACTGGTGTTAAAAACCCGTGAACGGCAAAAAGGAAAAAACCAGTATCAGAAAATGAGCGAGAAGGGCGAGTTCCTTGAGGTCAGCGAATATAATGCGCGCTTATGGGTAAATCTGACGGATTATCTCGACACCGGTCTGTTCCTCGATCACCGTATTGCCCGCAGAATGCTGGGAGAAATGAGCAAAGGCAAAGATTTCCTGAATCTCTTTTCTTATACCGGCAGCGCCAGCGTACATGCGGGTCTGGGCGGCGCGCGCAGCACCACAACGGTGGATATGTCCCGTACCTATCTGGAGTGGGCCGAACGTAATTTGCGTCTGAACGGACTGAGCGGCCGC [...]
+TCAGGATCTTTTTTATCCTTCGCTTCAAATACCAGCGCGTTGCTCTTCTCGTTCAGAGTTTTCAACACCGGTTGTAACTCACGAAGCACCTGATCGAGACGCTGCATATCCGCCACCATTTTGTTATACGCCGCCGATCCAGGCTGGAAGCCTTGCATACTGCGGTTAAGTTCGCGTAACGTCGTTTGCATATCTGCCGGAAGCTGCTGCATCGACTGACTGGAGGTAATCTTGTTCATATTATCCAGCGTGGTTTGCAGCCGACGCATAGTACGCTGGCTTTCAGACAGCGTATTGGTCGCTTGTTCTATCATCGGATTCAACGGCAGGTTGTTGATCTTATCCAACGTTTCCACCAGTCGCTGTTGAATTTGCGCCAGGCCGCTGCTGACGGTGGGAATAATTTCATAACCATCAAATTCGCGTAGCCCGGTAATCGGCGGTTCCTTAGGATAAAAGTCCAGATCGACATACAGCGCTCCGGTCACCAGA [...]
+NODE 964 3040 161937 160711 0 0
+AGGTCGCTGGCGTAAAAGCGGTTGAAACCGGCTGGTTTAGCCGTGACACCTTACCGGAAGAGCTGAACTTCAAACCGGTAGCCGATGCTATCTTTAATGGCGGTCTGGTAGGCGAAAACGGTACGCCGGGGCCGAATTCAGATATTATCACCGTAGATGGCGACCGGGCTTTTGTTGTGCGCGTGAGCGAACATAAACCTGAAGCCGTGAAGCCGTTGGCAGAAGTGAAAGAACAGGTCACTGCCCTGGTGAAGCATAACAAAGCGGAACAACAGGCGAAGCTGGATGCGGAAAAACTGCTGGTCGAGCTGAAAGCGGGTAAAGGCGCGGAAGCGATGAAAGCGGCGGGTCTGAGTTTTGGCGAGCCTAAAACGTTAAGTCGTACCAGTCAGGATCCGGTGAGTCAGGCGGCCTTTGCGTTAAGCCTTCCGACGAAAGATAAGCCAGTTTATGGCGTGGCGAACGATATGCAGGGTAACGTCGTTCTGCTGG [...]
+ATACGATGGCGGAACAGCTTCGACATTACCTGGCGACGCTCGGCTGTGAGTTAACGTTGATTTTTCATAATGCCAAAAACTGGGATAACTGCCCTGCGTTGGCGCAAGCGGATCTGATGATGGGCGACAGGCTGATCGGCGAAGCGCCGGAATATACGCTGGAGCAGTGGCTACGTTGCGATCAGATCTGGCCGCATGTCCTGGACGCGCCTGCGTTTTCCCATCTGCAGGCTACGCTTGACGCTCTGCAAATTCAGCCCAATGAAAAAGATCGCCGCGCCGCGCTACAACAAGTTTTTGCCAACCTGATGGATGACGCCACACTTACGCCGCTGTTTAATTATCACTATCGCATCAGCGCCCCACCGGGCGTTAACGGCGTTCGACTCACCCCTCGCGGCTGGTTTGAATTTAGCGAAGCCTGGCTTCCGCCGCCTTCGCCGTGAAGAAGCTGGTCGGGATTATCCGTACGCGTTACCATATTGGTTTTCG [...]
+NODE 965 30 12711 11445 0 0
+ACCGTGTACGCTTAGTCGCTTAACCTCACA
+GCGATGAAGGGCGTGCTAATCTGCGATAAG
+NODE 966 11507 639989 634408 0 0
+TTCTGCTGCAACGCATAGTAAGCATCCAGCGCTTTTTCTTGTTTCACTTTCGCGGCAATGTCGTCGCGAACCTCGCTTAACGGTTTCACTTTGGCAGGCTGAATATCATCCAGACGCGCCACCAGAAAACCGACAGACGACTTAATCACGCCAGATATCTGTCCTTTTTCTTTTAATCCGGCGTTTTTCAGTTCCGGCACCGTGGCAGACTCTTCCAGCCAGCCCATATCGCCGCCATTACGCGCAGAGATGATATCGGTAGATTTCTCTTTCGCCAGCGTGGCGAAATCTTCGCCCTTGTTCAGCGCATCCAGTACCGCTTTTGCATCATCTTCCGTTTTGGTCTGGATAATGCTGTAACGAATGCGCTCCGGCTGAGTAAACTGATCTACATGCTGGTCATAATAGGCCTGAATATCCGCATCGCTAACCGGTGCCTGCATCGTCGCGGCATCCAGCTTGATATAGCTTACGCGGAACTGTTCCGGCGTC [...]
+AATAAAACAATTACTTAACAATTTATTATCAATAAAAGGACAATCAACGGCAGAAATTTAAATTTAATCGGCTGAATCGTGTAAAGAAAATAGGTAGCGTAGAAATTACCAATAATTTCCAAAATTCTGTTGCGCACAAAAAGACAAATATATTTTTTATCAATTGATGGTTATTTAGCCGTTATAATTCCGGGTCGTTATTACAACGGCAAATAATGTTTTAGAGCAGGCGTGTTTTTCGTAGCGCCAGGTAGTCCAGCAACCCGCCAAAGACAATGCCGCACACGGCAACCACTACCGCGGTCTCAAGCAATCCGGGCAGGAATGAGAAGTTAGTGTAATCCACCGCGTTCATGGTCAGCAGGAGTACCCATACCGCCAGCAAAGCGACGCCCGCGAGCAGGATTGAAAGCGCGAAATTGTAGGCGCCACGGTATTGCGTGCGGGGAATGAAACGCTCGCTCTGCCAGCTATATTCCAGCGTTTGCCGAC [...]
+NODE 967 5467 303909 301314 0 0
+GGCGACATAGCCATCATTAAAAGTGGCTTCGATATAGGTAGCTTCCCAACCTGTCTTCGGTTCATTTAACGTAATACTGATCTTATTGTTGGCGGGAATATCTATTGTAAGCGGCTGATAGCGGATGCCACAGGCATAACGGAAATCACGCGCATTTGGATTGTTGGCTGTCCAGCGAACGACTTTTACCGGCGCTTCTGAGAAATAGACCGTAAGAAGATGGTGGTGAATAAGGCCGATCAACTGTGGTAATGTTTTTTTACTTTGAAACCTATTAATAAATGGAACGAGGCTTTCTTCAGCGAACTGGTTAATTGAGTAGTGGTTCATATTAGGCACTATACGTAATGATTTTACGCCAGGAAGTTTGCTATAATAAAAGCGAGTATTGTCTGGTACGAAAAAATCGTCGCCGCTTGCATTAATAATATATTTCGGTATTGCAAGGCGGGGTTGATAAATAGTGTTGAGATATCTTAGCGGATCTATTAT [...]
+AAATAGCAAATTAAGGCCTCATGATTTTCCACGACGGCCCGGTACTGGCTCTCCCCGCTAAACCTTTGCTCTATCTTAATGGAAATTTCAGGGTTATCAACCAAAGAGAAAACATCATTCGCGTTAAGCCTTTCTTTTAAAAGTCCGGAAATAATTACTCTATTATTTGGTAAAAATCCCTCTAAAACAATTTTAATTAACCTATTCTGTCTTGTTTTACAGATAAACATATGGTTTATTATAGTACTGTCGTTAAAACAGATTACATCACCTTCTTTGATATAATCTGTTACTTTACTAAAGTCTACCTTATGAATTTCCCCTTTACTCCGGTTGAGGACAAGCATTTTACACTTTTCCCTGTATAAATCATTGGCTATCCAATGAGGTCTGAGTGGGATAGTCATCTGATCGGTAATGCGAAAATCATATTTTTCGGTAAGCATATATTTACCCTTTGAAAAACCATTGATACGGCGATTGTTATATAGC [...]
+NODE 968 1195 63153 62070 0 0
+CGTGGACGCCAGCGTAGGATCGCTCACATTCATCAATATCTTGCTGAAAATATCTTCCAGTAGATTAGGGTGCGAGGCGAGGATAAAACCTGCCGCGGCAAAGGACACCATCATTATCGGGATCATCGACAGAAACGAAAAGTAGGTGATAGCCGCGCCAAACTGATTACCCAGTCGATCGTTAAAACGTTCGGTCGCGCGAATGAGGTGGGCCACCATTGGTTGACGCTGAATTTTTTGCATCAGGGAGGTGACGGAATGCAACGCCTGATTTGCCTTTTCGTTTTTTTCCGGGGCGTCATGCGGCTGCGTTTCTATTTTTTGTATCGGGTCGTGCTCCAGTTCCTGAATAGGGCGTTTTACGTCATTTTCCTGCGTCATCAGGTCGGTAGTCCTTCATCATTAATAGAATATGTCAGTATAGCTTCTCCCCGGTGGATGCTGAAAATGCGGCTACTCTGCGGCCTCTTTAATGGTTTCCGTCAGCCATAC [...]
+AAGATCTGTTGAGTAACCTGGATGAACTGGAGGGTCTTTTCCAACCTGATCCCGCCAGTATCAGCGGCAAAATACGGGTAGATATACCGCCATGTCTCGCAAACAGCCTTATCATGCCGCGCCTGCCCACTTTTTTGCATCAGTATCCCGGCATTGCGCTGGAACTTTGTAGTAGCGATCGACAGATCGATTTACTACGGGAAGATTTCGACTGCGTGGTGCGCACAGAGCCGCTACATGCGCCAGGGATACTGACGCGCCCGCTTGGCAAACTGAGGATGGTGAACTGCGCCAGCCCACAATACCTGGCGCGCTTTGGGTATCCGGAAAACCTTGACGACCTCGCCTCACATGCGGTGGTGCATTATTCATTGACGCCGGGAGTCTCTTCACCGGGTTTTGCCTTTGAAACTCCCCACGGTATGCAGTGGGTAAAAACCGGCGGAATGCTAACGGTAAACAGTACGGAGACCTGGCATACGGCCTGTCTGG [...]
+NODE 969 2087 111956 111219 0 0
+GTCAGATCAAACGGATGCGCGTGGGTCGCCTGCCACAAACGCAGCGGTTGCGCGACGCCGTTACGATAGCCTAACACCGGCAGATCCCAGGCCTGGCCTGTAATCACAAAACCGGGCTCCCAGCGCCCTTCTTTGGTGACTTTACCGCCGATCCCAACCTGGACGTCCAGCGCCTCGTTGTGGCGGAACCACGGATAGCTGCCGCGATGCCAGTCATCCGGCGCTTCCATCTGCTTGCCCTCAACAAATGACTGACGGAACAGCCCATACTGGTAGTTCAGACCATAGCCCGTAGCGGACTGCCCGACGGTGGCCATCGAATCGAGGAAGCAGGCGGCCAGACGTCCCAGACCACCGTTGCCGAGCGCCGGATCGACTTCCTCTTCCAGCAGATCGGTCAGATTAATATCGTGCGCTTTCAGCACATCGCTAACGTCCTGGTACCATCCCAGATTTAACAGGTTATTTCCCGTCAGGCGGCCAATCAAAAAT [...]
+GGCTGGCATTAATCCCGGCAAGACGGCGGGCGGAGTGATGCGCAGAGGTATGGTTCTGGCGCGCGGAGAGGGCGATCAACTGTAGCGCAGTGGCCCAACCGGCCACATCATCGCACATGCGGCTGCTCTCAGCGGCTTCAATGGGCGACGAAAGACGACGGTCAAAAAATTGCTTTGCTTCCTGATGGTTAAAAGCCAACTGCTGGCTGCCGATTTCCAACAGCTGATCGCGCACGCGCAGGTTAGCGATGCCCAGTTGCGGCAAATTACGCGATAACACCACCAGGGTGAAATTTTCCGGCTGATGCCGTAAGAAAAAGCGCATCGCGTCGTGAATCACCGGATTGGTAATCAAATGGTAGTCGTCAATCACCAGATAAAGCGGGCGATGCCACTGCGCCAGTTCAATAAAGAGCTGTGCGAAGAGGGACGTCAGGCTGGCGTACTGACGTTTTTGCGCCATCGCTTCGCTGGTAGAGCAGTGTCCGCCGG [...]
+NODE 970 10 550 530 0 0
+ACTGATGCCA
+TATTGTTTAC
+NODE 971 13 640 640 0 0
+TAAAGGCCGTAAG
+TTGACGTGGGCGC
+NODE 972 3824 190151 189262 0 0
+CCGCACTGCGTGAAGGGGAAAGGAACATTGCCGGTCTCTATTGCCGATGCGCATCGTGCAAAAGTACAAAAAGCGACGAAAACCGCGATGTCCAAGCTCATGAACCAGATTGGTAAACCGTATCACTGGGGAGGCGCGTCGCCGCGCACCGGTTTTGATTGCAGCGGTCTGGTTTATTATGCCTATAAAGATTTAGTGAAGATCCGTATCCCCCGAACGGCGAATGAGATGTATCACCTGCGTGACGCGGCGCCCATTGAGCGTAGCGAGTTGAAAAACGGCGATCTGGTGTTCTTTCGTACGCAGGGGCGCGGCACCGCCGATCACGTTGGCGTCTATGTCGGCAACGGTAAGTTTATTCAGTCCCCGCGCAGCGGTCAGGAAATTAAGATCACCTCACTGAACGAAGAGTACTGGCAACGTCATTATGTCGGCGCCCGCCGGGTGATGACACCTAAAACAATTCGCTAATATTTTATCCTGTCGTTTAAC [...]
+CCAGAAATCCCAGCACGCTAAGACCGGCTAACCAGACTAAAAAACCTTTTCCAGGTTGCATATTTGTTTCTCTTTCTTATCAGACAGACATTGTCGCAGAGTGTAGGGAGTGAAATTACGGTTGTGAAACGTTAATATTTGTCCAGTGAATTCAAAATTTTTGTAGGCAAATTATGTGGTCGGAATACTCGCTTGAAGTGGTTGACGCCGTAGCGCGCAATGGCAGTTTTAGCGCGGCGGCGCAGGAACTGCACCGTGTGCCTTCAGCAGTCAGTTACACCGTTCGTCAGTTAGAGGAGTGGCTGGCCGTACCGCTTTTTGTACGACGTCACCGTGATGTTGAACTGACGCCTGCTGGCGTCTGGTTTTTAAAAGAAGGGCGTTCTGTTATCAAAAAAATGCAGATCACTCGCCAGCAGTGTCAGCAAATTGCTAATGGCTGGCGCGGGCAGTTAGCTATTGCGGTGGACAATATCGTCAGACCAGAACGTA [...]
+NODE 973 1123 57156 55333 0 0
+AATCTGTTGCTTAAACGCGGGCAGCAGGAATATGTCTTTCCAACGCAGGTGGTGCGCGTAACGGGCAATGAGGTTGGGCTGCAACTGATGCCGCTCACCACCAAACAACATATTGATTTTGTGCAGTGTACCTTCGCGCGCGCCGATACGTGGGCGCTTTGGCAAGATAGCTTCCCGGAAGATAAACCGCTGGAAAGCTTGCTGGATATTCTGAAGCTGGGCTTCCGCGGATATCGCCACCTCGCGGAATTCGCGCCGCCTTCAGTAAAAGTAATTTTCCGATCGTTGACGGCGTTAATTGCCTGGATTGTATCGTTTATTCCGCGTCGCCCGGAGCGGCAAGCGGCGATACAGCCGTCGGATCGGGTTATGGCTCAGGCTCAACAATGATGATAATGCGATGAAAAGAAAATTGTCCTGGATGTGTGCGGCGGTAATAGGATTAAGCGCGTTTCCTGCTTTCATGACGGCGGCGGCGCCTGCTACGCCGCC [...]
+TATCAGCAAACACTATCGGCAACGTCACCGGACGGTTATCCCGCGGATCAAAAAACGGCACCGGGAAGTGGGACAGATCGTTATTCACCGCCAGCATGTTATAGGTCAGATCCAGGGCGCTATTTCGCCCGATGTCTAACCACAGAGTACTGCTGGCCGGGTTTTCACACACGTCGCGATAGTGGCCGACAAACTCCAGCCGCACCCGGTTAAAGTCGGTGATAAATAGCGGATTGATAGGTACCTGCGCCAGCGTCTTTTTCCCCAACTGCTCTTTTGTCACCGGCAGTACGCCCATCAGTTCATCATTGAGATAAACCTTGAGCTGCGACTGAACCGGCAGGAGCGACGGCGAGGGCGTATATTCCAGATTCAGCACCGCTTTCGACGCCACTTCATCGCTGCGCATACCAAATTCAATGCCGCCGTTAGGGTTAACGCCACGCAGCGCCATACTACCCGGCGGCGGCGCGATTTGCGCAAAGGTCAGCT [...]
+NODE 974 8804 522417 519810 0 0
+GGCTAATCCCCAGCGGCTTACCAATCAGCAGACCGGCAATAATTCCCAACGGCAGCATGGAGGTCAGACCGTCAATCGTGACGCCCTGAAGAGAAACGCCGGCATTCGCAAAAGCGAAGAGCGGCAGGATCAGGTACGCGACCCACGGGTGCAGAACATGCTCCAGACGCTTGGCCGGCGAGCGACCGTGTTTTTCTTTCAGCGGAATAAAGAAACCGACAATGACGCCTGCCAGCGTCGCGTGAACGCCGGACTTCAGTACCGCCGTCCACAGCACTGCCCCGACCAGAATATATACCCCTGTCCGTCTGACGCCGCACAGGTTCAGCAGCGCCAGCACGGCAATCGCGAACGCCGCCACGCCCAGCGAGACGATAGAAAGATCGCTGGTATAAAACAGTGCGATAATAACGATGGCGCCGAGATCATCGATGATCGCCAGCGCCATCAGGAATATTTTCAGCGCCAGCGGAACCCGGCTGCCCAACAGCG [...]
+GCATGGTATTTAAAATATCAATAATAGCCTCGCCTTTGGTCAGCGTACTGATAAAAGGTCCGGTGAAATAGTCGCCAGCATCAAAGAAAAAGACATCTTTCTCTTTCGCTTTTGCATCTTTGACAATTTTCGAGATGGGCGCAAAGCCCCCTACCGGACGTGTCTTGGATACATAGGGGATAATTTCTGGGGTTACATGGGCATGTAAATCGTTTGTATAATAAATTGTGATGTCACGCGCATCGGCTGAAAAGGAAATGGCTGAAGACAAACCAATGCACAGCGACAGTAGGGATATCGAAAACTTTTTGTTCATATAAACCATCCATTTACGCTACATTAAAGAAAAACAATGCCTGTAGTCGTGTCATTCACGACTACAAACCGGGGAAATTAAGTAATATTCATCAAGTTTATTAATTATTAAAACTCGAAGCCGATCAGGTAATTCATACGGTCGCCGTAGCCGTCATACCCCAATTTATTATTGAA [...]
+NODE 975 5396 336456 334659 0 0
+CGCTGCATATATTTTCTCCCAGAGAGAGCAACACAGTACATGATAAAATTTATCATATAGATTTGCATTTAGAGATAAGGTGAATACCCCCTTTGCGTCTGGTTACATAATAACGTATCACGACGCTTTGCTGTCTGGCTTACACAGTAGCAGCCAAATAAATATATTGGCTTATACTCGTCATACTTCAAGTTGCATGTGCTGCGGCTGCGTTCCCTCCTCCCAGTCACTTACTTTAGTAAGCTCCTGGGGATTCGCTCGCTTGTCGCCTTCCTGCAACTCGAATTATTTAGAGTATAAACATTATTTAAAATAATAAACACGGCATTCGTTTTAATACTACGTTCAGGACTCATCCCACTCATTAGCAGAAAACCTATTAAAAAGCGTGTTCAGGCGTTTTATTGCTGCCATTGATAAACTGTTTAACAACGTCGTCTGTACAGGTCTTCTTCGTTGCCTTTACGTTTAACTCAATCAGGCTACCGTCTC [...]
+ATCCTGCGCCCTATGCGTCAACTTTCGTCATTAATGGTACGCCGCGAACCGGGTCTGTTAACGCCGCTGCCGGAACTGCTGCCGTGGTCGGAAACACGCTTGTTAATCGTGGCGTTTAATCGCTACATTGACAGGCTCCGCGGCATCCTTTCCCGGCAGGAACGCTTTAGCGCCGATGCTTCTCACCAGTTAAAAACGCCGCTGGCGGTGTTAAAAACGCAGGCGGCGGTGGCGTTAGCCAGCCAGCACCCTCATCACTGGTACGAAAGTCTGCAGGCGATGAGCGTAACGCTGGATAGCACCATTCAGCTCACGGAAAGATTGTTGCAACTTTCTGCGGTAAAGCATAAAGAGCAGGGCGAGCGGCGTTTTTCCCCGGTGAATCTGTACGATATCATACAGAGCGGCTGCTTTACTCGCCTGGCGCAGGCACGGAGTAAACATATCGACCTGGGCTACGAAGGCGAACAGGAAGCGATGTGGATCGAGGGG [...]
+NODE 976 1187 60766 58105 0 0
+GATAGCGAGAACGGGTAAATGCGCGCGGCTGCCGGACTGCTCGCGACGCAGACCCGCAAACCACGTCTGCGCTTTCAGCTCTTTTAGCGCCCGGTTCATCGGCTCGACTTTGTTGATCTCATTGTATTTCTCAATACCTTCTACGCCCTGCTCCCACAGTTTGCCGTAGCGCGCCTCCTGCCAGGCTGGACTTTCGCCCGCGCGGTAAACTTTCAGGTTGAGTTTGAGTTTGTCCGTTAACTCATCAATAAACTGATAGGTTTCCGGGAACAAATAGCCGGTATCGGTGAGGATCACCGGGATATCCGGGCGAATCTGGTTCACCAGGTGCAGGCTCACCGCCGCCTGGATGCCAAAGCTTGAAGAAAGCACGTATTCGCCGGGCAGATTTTCCAGCGCCCAGGCCACGCGTTCTTCGGCAGTCAGCGTTTCCAGTTGAGCGTTGGTTTCCGCCAACGCCAGTACGCGATCGACTTTTGGCAGTTCATTCAA [...]
+TTCCGTATCACCGCTAACCAGAACCTGATTATTGCCAGCGTGCCGGAAAGCCAGAAAGTGAAAATCGAGACGCTGGCGCGCGATCATGGGCTGATGAATGCGGTGAGCGCGCAGCGTGAAAACTCAATGGCCTGCGTGTCGTTCCCGACCTGCCCGCTGGCAATGGCGGAAGCCGAGCGTTTCCTGCCGTCGTTCACGGACAAAGTCGAAGCGATTCTGGAAAAACACGGCATTCCTGATGAGCATATCGTGATGCGCGTGACCGGCTGCCCGAACGGCTGTGGTCGCGCGATGCTGGCGGAAATTGGCTTAGTAGGGAAAGCGCCCGGTCGTTATAACCTGCATCTTGGTGGCAACCGCATCGGGAGTCGTATCCCACGGATGTATCAAGAAAATATCACCGAGCCGGATATTCTGGCTTCGCTGGATGAACTGATTGGGCGCTGGGCGAAAGAGCGTGAAGCGGGTGAAGGCTTCGGCGACTTTACGGTG [...]
+NODE 977 474 24852 24792 0 0
+CGCCTGGCCACATGGGCGGGACCGCTTTCCAGAAAAGCCCCGTCGGCAGCATCTTTTATGATTTCTTCGGCCCGAACACGATGAAATCCGATATTTCGATTTCCGTTTCCGAACTGGGTTCGCTGCTGGACCACTCCGGCCCGCATAAAGAAGCAGAAGAGTATATCGCCCGCGTCTTTAACGCCGAACGTAGCTACATGGTGACGAACGGCACCTCTACGGCGAACAAAATCGTCGGTATGTACTCCGCGCCGGCAGGCAGCACGGTACTGATTGACCGTAACTGCCATAAATCGCTGACCCATCTGATGATGATGAGCGACATTACGCCGATTTATTTCCGCCCAACCCGTAACGCCTACGGTATTCTTGGCGGTATCCCGCAAAGCGAGTTCCAGCACGCCACTATCGCTAAACGGGTAAAAGAGACGCCTAACGCAACCTGGCCGGTCCACGCTGTTATTACTAACTCAA
+TTTACCCGTTTAGCGATAGTGGCGTGCTGGAACTCGCTTTGCGGGATACCGCCAAGAATACCGTAGGCGTTACGGGTTGGGCGGAAATAAATCGGCGTAATGTCGCTCATCATCATCAGATGGGTCAGCGATTTATGGCAGTTACGGTCAATCAGTACCGTGCTGCCTGCCGGCGCGGAGTACATACCGACGATTTTGTTCGCCGTAGAGGTGCCGTTCGTCACCATGTAGCTACGTTCGGCGTTAAAGACGCGGGCGATATACTCTTCTGCTTCTTTATGCGGGCCGGAGTGGTCCAGCAGCGAACCCAGTTCGGAAACGGAAATCGAAATATCGGATTTCATCGTGTTCGGGCCGAAGAAATCATAAAAGATGCTGCCGACGGGGCTTTTCTGGAAAGCGGTCCCGCCCATGTGGCCAGGCGTACAGAAAGTATATTTCCCTTCGCGCACATATTTGAACAGTGCTTTTGTC
+NODE 978 408 20941 20941 0 0
+TTGCAGGTTAAATGTCGGCTGGGTGCGATTGGTCATGTTATCGCCCTGGACACCGGTATCGTCCGCACTATCCAGTACGATAACCGGCGTCGACAGCGTGGTATCAATAGTGAAGTCGAGCGTCCTGGTCACCGTATTGCCTGCGTTATCAGTCGCTTTCACCGTTAACGTGTAGTCATCATCTGCCAATGTCTTTGGCCAGGTATAATTCCAGACGCCCGACTTCGAGCTTTGCATCGCCTTAACCCAGGTTACACCGCCGTCAATGCTCAGACTGACTTCGTTGACATCCCCTGGCACCGTGATGCGGAAATGTGGATTGGCGTCGTTAGTTAGATTGTCGCCCTTAGTACCGCTGTCATTAACCAGTTCAATATCATCAATGGCAATATGGGTATCGACCGTAAC
+CAGCGGTACTAAGGGCGACAATCTAACTAACGACGCCAATCCACATTTCCGCATCACGGTGCCAGGGGATGTCAACGAAGTCAGTCTGAGCATTGACGGCGGTGTAACCTGGGTTAAGGCGATGCAAAGCTCGAAGTCGGGCGTCTGGAATTATACCTGGCCAAAGACATTGGCAGATGATGACTACACGTTAACGGTGAAAGCGACTGATAACGCAGGCAATACGGTGACCAGGACGCTCGACTTCACTATTGATACCACGCTGTCGACGCCGGTTATCGTACTGGATAGTGCGGACGATACCGGTGTCCAGGGCGATAACATGACCAATCGCACCCAGCCGACATTTAACCTGCAACATATTGATGATGATGCCGTTCGCGTTACGGTCAGCGTGGAGCATGGCGG
+NODE 979 3094 172967 169847 0 0
+CCGAATTCCTGGATAAAGTGCAGCATATCGCCGCTCAGCGTCACCCCAGCCTGATCGACGAAGTGGCCGACGATAATACCGCCGAACAGAACGCCGCCAATACCAAAGCCGACACCGCGCACTTTAATGTTGCCGATCCATAAACCGACAACCGCCACCAACGCCAGAACGCTGACCGTCAATGCGATATCACTCATCTTTTCTTCCCTGTGAGTAACATTTCAATTTATAGGGATTATGACTGAACCGTTAAGGCATATATACAGCATGGCGCACATTCTCATGTTACAAAACCGCCCAGACGTCCTGACTTCGGCAGCGTCTTACCCTTTTTCGTGGCACAAAAAAGCCCCGCCATCTCTGGCGGGGCAAGGCAAGGAGCTCATTAGCTATTTAATGCGGAGCGTTCGTTAATGGCGATACGCTGCGGCGCAATGGTTTCCGGCTCGTTGCGGGTTAAATCAATATGCAGCAGGCCGTTGGTAAACGTCG [...]
+TTTATCGCGCTGTGCAGGGCGCGCATGTCGGTGTGGTGACGGTGCATCCTGCCGACAATCACTATGTGTTTATTCATGGCCCTGAAAACCCTGATGAGACGTGGCATTACGATTTCCACCACCGCCGGGGCGTTATTGCAACGCCGGGGGGCGTGACTAACCTCGATGCGATGGATATTACTGCGCCGTATACTCCCGGCGCGCTGCGCGGCGGCAGCCACGTCCATGTGTTTAGCCCGAACGGCGAGCTGGTGAGTTTTACCTATAATGACCACGTTCTGCATGAGCGAGATCCGGCGCTGGATCTGCGTAATGTCGGCGTGGCCGTGCCGTATGGGCCGGTAACGGTGCCGGTTCAGCATCCGCGCGAATACAGCGGTAGCTACTGGTGCGTACTGGTTAGCCGCACGACGTCGGCGCCGAGACCTGGCAGCGATGACATTAACCGCGCCTATGAAGAGGGCTGGGTGGGCAACCGCCAGATCGCCTTTA [...]
+NODE 980 86 4641 4641 0 0
+ACGGTAAACAGTACGCCCATCAGGAATACGGCGCCAAGCGCGACCGGGACGCTAATATGCTGCCCCAGGACCAGGCTAAACGCGGT
+TGGCGCCGTATTCCTGATGGGCGTACTGTTTACCGTTATCTCCGCCACCGGCATTCGTAGCTGGATTTTGCGTAACTTGCCGCAGG
+NODE 981 9420 529069 524357 0 0
+TACTTGTCGAAAATGGCTTTATCGCCCCCCACCATCACCGACAGCGTGCCATCAATAGCCTTCGGCTCGCCGCCGCTGACCGGCGCATCCAACATCTCAACGCCCTTCGCCTTCAGCGCATCGCTGATTTCACGGCTTGCCAGCGGCGCGATAGAACTCATATCAATCAATACGGTTCCCGGCTTCGCGCCTTCGATGATACCGTTCTCGCCCAGCGCAACCTCTTTCACATGCGGAGAGTTAGGCAGCATCGTGATGATGACGTCACACTGTTCAGCGATCGCCTTCGCCGTAGAGGCCGTTTCCGCGCCTGCGGCAATGACGTCAGCAATCGCTTCAGGATTACGATCGGACACCACCAGCGAATACCCTGCTTTCAGTAAGTTTTTGCTCATGGGCTTACCCATGATGCCTAAGCCAATAAAGCCAACTTTCATCGTCATAGCGTTCTCTCTTTCCATACCAGGATTATTTTTTAAAGGTGTCGGCAAG [...]
+ATGAAAACGGGTGACAAGGCCTTTCTCTTCCAGCAGACGCAGGTCAGCACGGATAGTCACTTCAGAAATACCAAAGGTATTTGAAAGGTCCATCACCAGCACGCTGCCTTGCGTATTAATCAGGTCGACAATTTTATTTCTTCGCTCAAATGAGTTCATATTGATTTGCCTGATAATTAACTGTAACTAGTTTAAACGAAGGATTGCGAAAGGTGAACGCTAAATTTCGAAAGGAAATGTGAGCCAGCGCAGGTTGCTGGCTCGTACCATCAGGAAAGTTGAAGTAGGATTTTGCCCTGCATGGGCGCGCCATTAAGCGCTTTGACTGCTTCTGCAAAGCTTTCCGCATCGCCGCGATGGGCAATGAGAGGGGTCAGTTGAAGACGTTTTTCAGCCAACAGGCGCGCTGCGGTTTCCCATTCTTCTCCTGGCCATGGCGCGGAGTAGTTCATCCAACTGCCGAGGAGCGTGAGCTCTTTACGCAAAATTAGC [...]
+NODE 982 1568 77443 76759 0 0
+TCGGCTCAACGACTGGGCGGATCGCAATAAAGATACCCGCAACGGTAAAGATGTGAAGAAGCTGCTGAATAAGCTGTAGTTTTTGGCCAAAGGGCAGAGCCGGATGGCGAGGCTAACGCGCCTCCGGCCTGCCTGGTAAGCAGGCCGGGGCAGGCGAACAGACGTTACATCTCCGAGTCTGGCTCGCCGTTATGCAGCGGAATTAACTGCACTTTCTGCACTCGATGGCTTTCTACCTGCAATGTTTTCAGCAAATAATCGCCCACCTGAACCTCTTCACCGGTTTGCGGTATGCGCTGCAAATATTCCATCAATAATCCGGCAATCGTATGGTATTCCCGTTTTTCATCCAGCGGTAGCGGCACGTACTGCACCAAATCCTCCAGCGGCATATGGCCGTTTGCTGTCCAGGAACCGTCCGGGTTCTTCTGAATATCGTGGCGGGCGTCAATTTCCTCGACTTCATTCGGCAGATTACCGGCAATAGTCTCC [...]
+TAGCGTACAGGCGTTAAGCTTCAGCGCCCGCGATCTGATTATGCTGTTTGGCGGCTTCTTCCTGCTCTTTAAAGCCACCATGGAGCTCAACGAACGGCTGGAAGGGAAAGATAGCGCCAACCCTACCCAGCGTAAGGGGGCGAAATTCTGGGCGGTGGTCGCGCAAATTGTGGTGCTGGACGCTATCTTTTCTCTCGACTCCGTGATTACCGCCGTGGGGATGGTCGATCACCTGGCGGTCATGATGGCGGCAGTGATAATCGCCATTAGCCTGATGCTGCTCGCCAGCAAGTCACTGACCCGATTTGTGAACAACCATCCCACCATTGTCATTTTGTGTCTTAGCTTCTTGCTAATGATCGGCTTTAGCCTGGTGGCGGAAGGGTTTGGTTTCCATATTCCGAAAGGGTATCTGTACGCGGCTATCGGCTTCTCGGTGATGATCGAGGCGCTCAACCAACTGGCTATTTTTAACCGCCGCCGTTTTCTTTC [...]
+NODE 983 309 18272 18042 0 0
+ATCATTTCGTGCTGGCGGCGGAGATATCTCAAAGCTTCGGTTATGGTGTTCTTTTCATCCCTCACAAATTACCGCTGAGCGCTTTCTCCAGCAGTGTTTAGCGCTCTCTGCCGCCGGAATAACCTGGTGCGCGGGGGCTGTCGCCAGTATGAAAGATATCGACCAGTTTCGTTGGCTACGCCAGCAGTTGCCTGACCAGAATTATTTTTGGTTTAACGCCAACGAGTGTGCCAATACCCGGCATACCGTTGAGGAAACCATCGCCTTCAGCGAACTCGATCCGCTGTATGTGATTGAAACACAGCAGTG
+GGTTTCCTCAACGGTATGCCGGGTATTGGCACACTCGTTGGCGTTAAACCAAAAATAATTCTGGTCAGGCAACTGCTGGCGTAGCCAACGAAACTGGTCGATATCTTTCATACTGGCGACAGCCCCCGCGCACCAGGTTATTCCGGCGGCAGAGAGCGCTAAACACTGCTGGAGAAAGCGCTCAGCGGTAATTTGTGAGGGATGAAAAGAACACCATAACCGAAGCTTTGAGATATCTCCGCCGCCAGCACGAAATGATTCCAGCAATGACATTAACGAAAAAGAGGCGTTAGTTTGTATGCCGACCGC
+NODE 984 39 3252 3252 0 0
+GCCAGCGCAGCTGGATATCTGTACCGCAGGAAGAAAAAG
+TTCAATCACATACAGCGGATCGAGTTCGCTGAAGGCGAT
+NODE 985 39 2779 2779 0 0
+ACTTTTTCTTCCTGCGGTACAGATATCCAGCTGCGCTGG
+TGCAGAAGGCGATCTTTTTGCTTGTCATATCAGCAAAAT
+NODE 986 12 952 952 0 0
+CCACTGCTGTGT
+TATTTTTATGAA
+NODE 987 51 2878 2878 0 0
+ACCCCGCTTTCGCTGATGCCGGAAGCCGCGTATGTTAACGATCGTTTTTTA
+TTTGTGACGACATAGTGGATTGTGTTTCATGATACCAGTGGCTTTTACCCG
+NODE 988 51 152 152 0 0
+GTTGTGACGACATAGTGGATTGTGTTTCATGATACCAGTGGCTTTTACCCG
+CCCCCGCTTTCGCTGATGCCGGAAGCCGCGTATGTTAACGATCGTTTTTTA
+NODE 989 10899 554812 545089 0 0
+TCCGTGAAGGATAAAAAATATTTTGGCGACGGGACGGGGGTTGGGCTGCGCAAAGACGATACCGAGCTAAAAGCCGCGTTTGATAAAGCGCTGACCGAACTGCGCCAGGACGGAACTTACGACAAAATGGCCAAAAAGTACTTCGATTTTAATGTCTACGGCGATTGAGGGAAGGGGATAACGCGCCGCGCTGGGGAACTATCACGGTGCAAAATAGATGTTTTGCACCTTTTTGGTGCATAAGCCGTTGCGGAACAGGCGCATAAATGCATACTTAATCGATTTTTATGCAAAATAAACCGGCTGGCAAGGTAGAATGCTTTGCCTTGTCGGCCTGATTAATGGCACGATAGTCGCATCGGATCTGTAAAGATCTCCTGGAAAGACAGTCTGTTGAGGATAGTTATGAAAAAACTGGCGTTATCCCTTTCTCTGGTGCTGGCATTTTCCAGCGCTACCGCAGCATTTGCCGCTATTCCACAAAAGATTCGT [...]
+ATGCTGCCGCCATAGTGACCAAAGCCAAGATGGTTTAAGGATTTGAGCGTGGCGACGCGAATGTCGCGCGCCAGTTGGGTGATTTCGGTTACGTTCATTCTTTCGCTCCGCTATTTTCCTGCACTTCGGCAGTCGCTTTTTTGTTTTTGGCCAACACGTTGTACGCCACCAGTAGCGCGAATAGCGCCACCACCAGCCCCGTGATAGCCATCGGCGACAGATAACGCGCCAGGTTGCCCAGCAAAATACCGATTACGCCAAAGTCAGCATCCGAGAACGTGGTATTGGCGAAGCCGATCGCGCCGAGAACCGGCAGTAACAGCACTGGCAGGAAAGTGATTAATAGACCATTAGCAAATGCGCCGATCATCGCCCCGCGGCGACCGCCGGTGGCATTGCCAAAGACGCCTGCGGTCGCGCCGGTAAAGAAGTGCGGCACAACGCCTGGCAGGATTAACACAAGCTTCATCTGTCCAAGCAGGAACAGCCCCA [...]
+NODE 990 7 316 316 0 0
+ACCAGCC
+TATGGCG
+NODE 991 735 38234 37083 0 0
+TCTGGAACGTGACGGCATGTTGATGATGGTGGATGACGATCGTATCGATCTCCAGCCTGGCGAAGTCATCAAAAAAAGGATGGTGCGCTTCCGTACACTTGGCTGTTGGCCGCTCACCGGGGCGGTGGAATCCCACGCGCAAACGCTGCCGGAAATTATCGAAGAGATGCTGGTTTCTACCACCAGCGAGCGCCAGGGGAGGGTGATTGACCGCGATCAGGCGGGGTCGATGGAGCTTAAAAAACGTCAGGGGTATTTCTAAGGAGCCGCCATGAACACCATACTTGCACAACAAATCGCCAATGAAGGCGGCGTCGAAGCCTGGATGATGGCCCAACAACACAAAAGCCTGCTGCGTTTTTTAACCTGTGGCAGCGTTGATGACGGTAAAAGTACGCTGATAGGTCGTTTGCTGCACGATACCCTGCAAATTTATGAAGATCAGCTCTCTTCTCTGCATAATGACAGTAAACGTCATGGCACGCAGGGAGA [...]
+GATCAGTAGGATCGCCAGATCGCAGGTGGACGCCCCGGTCGCCATATTACGAGTATATTGTTCATGGCCCGGCGTGTCGGCGATAATAAATTTTCGTTTTTCCGTGGAGAAATAGCGGTACGCGACGTCAATAGTAATGCCCTGCTCACGCTCGGCCTGCAGCCCATCTACCAGCAGCGCCAGATCGAGTTTTTCTCCCTGCGTGCCATGACGTTTACTGTCATTATGCAGAGAAGAGAGCTGATCTTCATAAATTTGCAGGGTATCGTGCAGCAAACGACCTATCAGCGTACTTTTACCGTCATCAACGCTGCCACAGGTTAAAAAACGCAGCAGGCTTTTGTGTTGTTGGGCCATCATCCAGGCTTCGACGCCGCCTTCATTGGCGATTTGTTGTGCAAGTATGGTGTTCATGGCGGCTCCTTAGAAATACCCCTGACGTTTTTTAAGCTCCATCGACCCCGCCTGATCGCGGTCAATCACCCTCCCCTG [...]
+NODE 992 3491 186718 185546 0 0
+TACGTTGACCTTCCTGCTCTCAACGGTAATTGAGCTGTATACCATGGTGCTATTATTGCGCGTGTGGATGCAGTGGGCCCGCTGTGACTTTTACAACCCTTTCTCCCAGTTCGTGGTGAAAATTACGCAGCCCATCATCGGACCGCTGCGTCGTATTATCCCGCCAATGGGGCCGATTGACAGCGCTTCTCTGCTGGTGGCGTTTATTCTTAGCGTTATTAAGGCGATAGTGCTGTTTAAGGTAATTACGTTTCAGGCGATTATCTGGATTGCCGCGGTGCTTATCTTACTTAAAACAATCGGCCTGCTGATCTTCTGGGTGCTGCTGGTCATGGCTATCATGAGCTGGGTGAGCCAGGGTCGTAGCCCGATTGAATATGTATTGATTCAGCTTGCCGAGCCGCTGCTCAGCCCGATTCGCCGTATACTGCCTGCGATGGGCGGCATCGACTTCTCGCCGATGGTTCTGGTGCTGCTGCTGTATGTCGTTAA [...]
+ATGGCGGCGGATTATTATTTTGTTGAAAAAACCTGGACCAAAGATCGTCCCGTTAAATTTTCTGCCATGTTGACCAGCAAAGGGACGCCAGCCTCTGGCTGGACGGTGAGCTATTACTCATTGCAAATGGCAGCCAGCGATCAGGGCCGGGCTATTGACGACATTAAAACGAATGATAAATACCTGATCGTCAACAGTGATGACTTTAACTATCGGTTTGGCAACATTGAAGCCTCCTGGCGTGCGCAGAAAGCGTCGATCCCCGGTCTTGAAGAACAACTCTCTGCCCTGGATAAGAAAATAGCGGTAGCTAAAAAAGAAGCGGACGCATATTGGGGAAAAGGCGCTGATGGGAAACCGTTGACCCGCGCCGAGGCGTTTAAAAAGACGTTAAAAGAGCGCGATGATTATGTAAAAGCCAACGATAGCAGCGTATATGCCGAGAAATACGAAAAAGAGGTCTATCAACCGGCATTAGACGCGTGCCGTAAG [...]
+NODE 993 4105 226822 224706 0 0
+CTTACCGGCGCTCGACTGCTCGAACAAATGGACGCCGAAACCATCAGCACCCACCAGGCCAATAAGCGGCGCGGATAATGCCGCTGCCACGCCCAGCATCATGGACGGATTGCCCCCGGCCAGACGGGCGACGGAATCCCGCCAGGTGGCAGCAGTACCAGCAATGGCATACCCGGAAGATGCAGCGCTGCGACCGTTAAAGAGAATGGGCGTCTCTGGATCACCAATCACTTCACCATCAGGCATGATATATGCGCCATGATGCCAGCCAGTGGTATGGGTGATAATCCATTCCCGATCAGTGCCGCTTTGCTGCAACCAGTCGGCCAGAATCGCCCGGAAGGTGCTTTTAGTGGTCACATTCACCCCACCAGCTTTAAGTGAGCGCCAGCCGTCGCGCTCACCGATATCAGCACAGGGGATCGCCCTGGTAATATCTTCGTGGCCACGCGGCGAACGCCAGCGCAAAACAAGATAGCGCTCTGCCCCGTC [...]
+AGAACAACGCCGCACCATTCTCGCAGAATATGGCATTAAGTTTGATCGCCGTATTCGTGAAAGTGAATGCTTCGAAATAACCAGCCTTTCCCGTTCCACCCGCTGGTATATGGAGAACGAAGGTAAATTCCCGCCACGCTGCCACTTTGGCCGTAATAGTTGCGCATGGCTTCTGTCAGATGTTCTTTGGTGGGTTCGCAATCCACCTGCTGTTGAGAACGTCAACACCCCTTACAACCGTAAATCCGCGTAAGGGGGGCGCTATGCAAAAATTAAATGAGTTGGTTCCGGTTAACCCCGGAAATATTGGCGGCGTGACGGTATCGCTGGTCAGTGCAAAAAAACTCCATGAGTTTCTCGGCGTTGGGCGTGATTTCACCACATGGATTAAGGGGCGTATCAGCCAGTATGGTTTTACTGCTGGTGTAGATTTTACGGTGGTTGAAAATTTGAGCGCCCCCGTTTCGGGGAGCGCAAAATATCGCCAACAAA [...]
+NODE 994 3339 185001 184123 0 0
+TCGGTAAGCCGAAACCACAGCGGACACCCGCAGCCGGAACAGAAGTAGCGTTCGCCGCGCGAAGAGGATGAAAAGTATGGCGGTTCCGGGGAAAGGGGGGCTAGCTGTGGTTGCCCGCAGGCTTCCAGATACATGGCTATTCCACCCGACCATTTTTGACACAGCGTACAATGGCAGGCATAGACATCCAGCATTTCGACGTCAACGGTAAAATGGCTCTGTCCGCAAAGACAACGACCAGTGAACGTCTGCACGGCATACTCCTTATGACCGAGTCTACATCAAGAGAAAAAGCCAGCCCTGAAAGGACTGGCTTTGTATTCAGACTACAACAAAATTAGAACTGGTAGTTCAGACCAACAGCAACGATGTTGTCAGTGCTGATCTGCGCAACATTTTTAGTGAAGTTGGTGTCATCCAGCAGGTTGATTTTGTAATCAACGAAGGTGGACATGTTTTTGTTGAAGTAGTAGGTAGCACCGACATCGATGT [...]
+ATCTCCCAGGCTATACATTAATAGCCCGCAACCTACGGAACAGTATGTGCAGGAGTTACGGATCTCTTTTGCGCGCAACAGCTTATAGTTTCGCGCCTGAGCCAGGGCCATTTTAGGGGTAAAACCCAGTGCGGCCACCGTTGTTCCCGCCATACCGCCCGCGCAGATTTTAAAAAATTGTCTGCGGCTGACGTCCATTGCTTTCCTCTTTTTTCCACGGATGCACGCCTCCTTCGAACTGCAGCAAAACCTCAGCCCAGGATGCGTGTATAACTTCGCGAGGAAACTAACAGCAAAATCGATAACTTTTTTGCGTCAAATCAATATTGAAACGGTTCCGCTACTAAATAGCCCTATTTTTAAACTGCAATAACTCCAGGGAGGTACTAAAAAATGACACTGCATGGCATCGCCCTCGGAAAAAGTGCTATAAGTGGCAGTTTATTTTGCGCGGTATTCAGGACAGTCACAAAACATGACATCACAAAAAGC [...]
+NODE 995 1927 95146 94633 0 0
+AACGCCGAGACCACGCTTATAAATGAAGAGAGCATGCGGCACCCGAATAAAGCATTGTCTGGCTGCATTCCGTTTACCAGTACGTGGGCGAATGTGTTATAATTTGCGACCTTTGAATCCGGGATACAGTAGAGGGATAGCGGTTAGATGAGCGACCTTGCGAGAGAAATTACACCGGTCAACATTGAGGAAGAGCTGAAGAGCTCCTATCTGGATTATGCGATGTCGGTCATTGTTGGCCGTGCGCTGCCGGATGTCCGAGATGGCCTGAAGCCGGTACACCGTCGCGTACTTTACGCCATGAACGTATTGGGCAATGACTGGAACAAAGCCTATAAAAAATCTGCCCGTGTCGTTGGTGACGTAATCGGTAAATACCATCCCCACGGCGATTTCGCAGTGTATGACACCATCGTTCGTATGGCGCAGCCATTCTCGCTGCGTTACATGCTGGTGGATGGTCAGGGTAACTTCGGTTCTATTGACGGCGAC [...]
+AAGTCTTCTTCTTTAATACGCGCGGCAGATTTACCTTTCCCACCACGACGTTGCGCTTCGTAATCCGTCAGCGGTTGATACTTGACGTAACCCTGGTGAGACAGCGTCACGACAACATCTTCCTGGCTAATCAGATCTTCGATATTAATATCGGCGCTGTTGGCGGTGATTTCGGTACGACGCTCATCGCCGAACTGATCGCGAATTAACTCCATCTCTTCGCGGATCACTTCCATCAGGCGATCGGCGCTGCCCAGAATGTGCAGCAGTTCAGCAATCTGCTCCAGCAACTCTTTGTATTCGTCGAGCAGTTTTTCATGCTCCAGGCCGGTCAGTTTCTGCAAACGCAGATCCAGAATCGCCTGCGCCTGCTGTTCAGTCAGGTAGTACTGACCGTCACGCACGCCAAATTCTGGCTCCAGCCATTCCGGACGCGCGGCGTCATCACCGGCGCGCTCCAGCATCGCAGCAACGTTGCCCAGGTCCCACGGA [...]
+NODE 996 9559 497087 495183 0 0
+CAATTATCCACAACAAGAACAACAAGTAATGAATAACAGGAGTGATGGCTATGAGTCGTTTAGTCGTAGTATCTAATCGAATTGCCCCCCCGGATAATAAAGGCGGCGCCGGCGGCCTCGCCGTTGGCGTGCTTGGCGCGCTAAAAGCGGCTGGCGGGTTGTGGTTCGGCTGGAGTGGCGAGACAGGTAACGAGGATGAGCCATTAAAAAAGGTGACAAAAGGTAATATTACCTGGGCATCGTTTAACCTGAGCGAACAAGATTACGAAGATTATTACTGTCAATTTTCCAATGCGGTTCTCTGGCCTGCGTTCCACTATCGTCTGGACCTGGTACAGTTTCAGCGTCCTGCATGGGAAGGCTATATGCGGGTGAATGCGCTATTAGCGGATAAGTTATTGCCCCTCATTAAAGAGAACGACATCATTTGGGTGCATGACTACCACCTGTTACCGTTTGCCAGCGAGCTGCGTAAACGCGGCGTGAACAACC [...]
+CGCCGCTTCTACCGCCGCGTTCAGCGCCAGAATGTTAGTCTGGAAGGCAATACCGTCGATAACGCTGATAATGTCAGCGATTTTTTTCGAACTGTCGGCAATTTCGTGCATGGTGTTTACTACGCCGTCGACCACTTTGCCGCCATGACGCGCGGTCTCGGAGGCGCTTTGCGCCAGTTGCGAAGCCTGACGGGCATTATCGGCGTTTTGCTTCACGGTGGCCGTCAGTTGTTCCATGCTGGCCGCCGTCTCCTCCAGAGCGGAGGCTTGTTGTTCGGTACGGGAAGAGAGGTCGGTATTACCGGCGGCAATTTCACTGGTGCCGGAATAAATCGCATCCGAACCTTCACGAACCTGCGTCACGGTGTCAATCAGCGAGCGTTGCATATGTTCAACCGTTCCCGCCAGTTCGCCAATTTCATTACGTCCTGAGACAGTGAGCGTTTTCGTCAGATCGCCGCTGGCAATTTCACGGATATGAGTAATCACTCG [...]
+NODE 997 7064 415745 411006 0 0
+CGCCGATCCCGGCTGCCTGAAGGCCTGTCCGGCGGAAGGGGCGATCATTCAGTATGCTAACGGTATTGTCGACTTCCAGTCCGAGCAGTGTATCGGCTGCGGCTACTGTATCGCTGGCTGCCCGTTCAACGTGCCGCGCCTTAACCCGGAAGACAACCGCGTCTATAAATGTACGCTGTGCGTCGACCGCGTGACCGTGGGGCAAGAACCGGCCTGCGTGAAGACCTGTCCAACCGGCGCCATTCATTTTGGCTCGAAAGAGGATATGAAAACGCTGGCGGGCGAGCGGGTGGCGGAACTCAAAACCCGTGGTTATGACAACGCGGGTCTGTACGATCCGGCGGGCGTAGGCGGTACGCATGTCATGTACGTGCTGCATCATGCCGACAAGCCGAATCTGTATCACGGCCTGCCGGAAAACCCGGAAATCAGCGAAACCGTTAAGTTCTGGAAAGGCGTCTGGAAACCGCTCGCCGCGTTCGGTTTTGCCGC [...]
+ATGAGGATAATATGACGACTCTGGCGGGAAATCTCGCCTATGTCTCATTACTCTCCTTAGTACCGCTTATTGCCGTCGTTTTTGCCCTTTTCGCTGCTTTTCCGATGTTTTCTGATGTCAGCATTCAGTTACGCCATTTTATTTTTGCTAACTTTATGCCAGCCACCGGAGACGTGATTCAGCGCTATATTGAGCAGTTTGTCGCTAATTCCAACAAAATGACGGCGGTGGGCGCCTGTGGACTGATTGTGACGGCATTGCTGTTGATGTACGCCATTGATAGCGCCTTAAACACTATCTGGCGCAGCAAACGCACACGGCCAAAAGTGTACTCTTTTGCGGTGTACTGGATGATCCTCACGCTCGGCCCGCTTCTCGCCGGCGCCAGCCTGGCAATCAGCTCCTACCTGCTTTCTTTACGCTGGGCCAGCGATCTGAATACGGTCATCGACAATGTATTGCGTATCCTTCCGCTGCTGCTCTCGTGGATCT [...]
+NODE 998 956 43588 42583 0 0
+TCGCTTCGCATTTGGAAAGCCCGGTTGATCTGATATTGTTTCATGCTGTGCTGGAATGGGTAGCCGATCCTGTCGGCGTATTAGAAACGCTCTGGTCAGTATTGCGCCCTGGCGGCGCGCTGTCGTTGATGTTCTATAACGCTAACGGTTTGCTGATGCACAATATGGTGGCGGGTAATTTTGACTACGTGCAGGCGGGGATGCCTAAACGCAAGAAGCGCACGCTGTCGCCTGACTACCCGCGCGACCCCGCGCAGGTGTACCAGTGGCTGGAGGCGATTGGCTGGCAGATTACCGGTAAAACCGGCGTGCGTGTGTTTCATGATTATCTGCGTGAAAAACACCAGCAGCGTGACTGTTATGAGACCCTGGTCGAACTGGAAACGCGTTATTGCCGCCAGGAGCCGTATATTAGCCTTGGGCGCTACATTCATGTCACCGCGATTAAAAGCCCGGCGCTAGCCGCAGATGCAAGGATAACCTATGAGTGAA [...]
+ATCCGCCGCGCGCTTCAATTCGCCGGCCACAATCGACAACTGCATAGAAAGACGCAGCGTAGAGAATTCGCGTTGACGAATGTAGTAATCGGTGATGCCAATCCCGAGCGGGGTTAATCGGTAAATCGCATTGCCTTCCGCCTGCTCGCTGGTAAAGCGGTTCAGCAGACGTTGACGCACCATATCGTTAATCGCGTTGTTCGCGCGCACGCCGATGGTTTCGCTGGTTTGCTCAAACGCATCACTCACATGGCGGAATGCATCCACCAGTTCGCCTTCACTCATCTCGCCGTCAAGGCGTTCGCCGTTCAACGTGGCGACCGCCAGCAGAAAGGAAAGTCTGTCTACCGGCAGCGAGATGGAAAAGTCGTTTTTTCTGGCCCAGGCAACCAGTTCGGGGACTGTCTGGGAAAATTCACTCATAGGTTATCCTTGCATCTGCGGCTAGCGCCGGGCTTTTAATCGCGGTGACATGAATGTAGCGCCCAAGGC [...]
+NODE 999 5272 292963 288556 0 0
+TAAAACGGTGGTGGCCGATGGCATCGGTCAGGGTTATAAAGAAGTACAGGAGATTAGCCCTAACCTACGCTATGTGATTGACGAGCTGGACCAAATCTGCCAGCGCGACCGCTCAGAACTCGATCTCAAACGTAAGATCCTCGACGACTTGCGCCATCTGGAAAGCGTCGTCGCGAATAAGATCAGTGAAATCGAAGCCGATCTGGACAAGCTTACCCGTAAGTAAGCTGTGTGTTGCCGGATGGCGACGTGTTACGCCTTATCCGGCCTACAGATATATCCCCGTAGGCCTGATAAGCGTAGCGCCGCCGGGCTTAACGCTGTTCATCCAATTGTAGCGCCACATACAGCAACAGCCGATCGTCAAAATTTCCCAAATCCAGCCCGGTCAGTTCCGAAATACGATTTAGCCGATATTCCAGCGTGTTACGATGAATAAACAGCGCCTTAGAGGTCGCCAGCGGCTGGACATTATGGCGAAACCACGCCGTC [...]
+CGTCGCCGCTAACAATAAGGCCGCGTACCGCGTTCAGATTCAGCTCCCTGATGCAGGATTCCGCGGCGGCGATCAGTTTGTCATCGGCCTTAAATCCGGCCGGACAGCCCGGTAATTGCCCGTATTCATAGCCGAAAGCGGTCACATCAGCGTCGTGGTAACGCGCTTCGTCAGAGACGACGATATCGCCGACCTTCAGCGTGGACGCCAGACCGCCTGCGGAACCGGTATTGATGATCACGTCCGGTTTGCAGTGCTCCAGAAGCAACGTTGCGCCCAGCGCCGCCGCGACTTTACCGATACCGGATTTCAGCAACGCCACTTCGGTGCCATTCAACTGGCCGGTGTAAATTTCGCAGCCGCCTAGCGTAATCGTCTGACGGTTGTCAATTTTGTCACGCAGCAGCGTAACTTCTTCTTCCATTGCGCCAATGATGCCGATTTTCATAGATTTACTCGCGATAAGTCAGTTTTGAGGGCATAGTTTATCAT [...]
+NODE 1000 134 49793 39590 0 0
+GGGGGACCATCCTCCAAGGCTAAATACTCCTGACTGACCGATAGTGAACCAGTACCGTGAGGGAAAGGCGAAAAGAACCCCGGCGAGGGGAGTGAAAAAGAACCTGAAACCGTGTACGTACAAGCAGTGGGAGC
+GCCGGGGTTCTTTTCGCCTTTCCCTCACGGTACTGGTTCACTATCGGTCAGTCAGGAGTATTTAGCCTTGGAGGATGGTCCCCCCATATTCAGACAGGATACCACGTGTCCCGCCCTACTCATCGAGCTCACAG
+NODE 1001 69 15755 15711 0 0
+CATTGTGTTTGTGTGAAATATTGCTGTAACATCGACGGTCTACGACCACCTACCACCTGAATAGCTGTA
+ATTTCACACAAACACAATGATATAAGCATATAAGCATATAAGCATATAAGCATATAAGCATATAAGCAT
+NODE 1002 368 19117 18915 0 0
+GCACACCTTTCGCTATCAGCGCCTGCTGCATCGCCGAAGGTTCATCGTACTCTTTTTTGCCGTTATCGCCGCTGACTAACAGCCACTTCACTTTACCGGCGTGATACAACGCGGCGGCAGTATTAATCCGCCGGGTAAAATACCGATTGCCGGGTTTAGCGCCTAACACCAGCCCGACGTTGCGGGCGGGAACGGTCTGAATATCATTCCATGTCAGATGCTGCGAGGCGTTGACGATAAGCCAGTTGGAATAGAAAAGCGCGACGCCTGCTGCGACAAGCAGAAAACACGCCACTGTTAACGCCCGGCGTGTAAAACAGAGGCGGCGGATAAAACGGGCACATTGTGAGAGCATGGTTGTTGCGCGG
+GTTTTACACGCCGGGCGTTAACAGTGGCGTGTTTTCTGCTTGTCGCAGCAGGCGTCGCGCTTTTCTATTCCAACTGGCTTATCGTCAACGCCTCGCAGCATCTGACATGGAATGATATTCAGACCGTTCCCGCCCGCAACGTCGGGCTGGTGTTAGGCGCTAAACCCGGCAATCGGTATTTTACCCGGCGGATTAATACTGCCGCCGCGTTGTATCACGCCGGTAAAGTGAAGTGGCTGTTAGTCAGCGGCGATAACGGCAAAAAAGAGTACGATGAACCTTCGGCGATGCAGCAGGCGCTGATAGCGAAAGGTGTGCCGGAAGCGGCCATTTTTTGTGATTATGCCGGATTCTCCACGCTGGACTCC
+NODE 1003 13 4603 1033 0 0
+TTAGTCGGTTCGG
+AAAGGCCAATCAA
+NODE 1004 2444 110892 108619 0 0
+TGGCGGAAAGCGGCATTCAGTTGGGACAAAGCAGCATCAGTAGCGAAAGCTTTGCCGGACAGCAGCAGTCTTCATCGCAACAACAGTCTTCCCGCGCCCAACATACGGACGCGTTTGGCGCTGAAGATGACATAGCGTTAGCGGCGCCGGCCTCGCTTCAGGCCGCCGCGCGCGGCAATGGCGCAGTGGATATCTTCGCCTAACGCCAGAGGTAGCATGATTATCCGCGTCTTTTCCACGCTTTGTCGTGGACAGGACACGGGATAATCAGCCAATAAGCAGTACCGAAACAGGAAGCCCGTATCAGATGACTGACTCCGCGATTAACAAAAAGAGCAAACGCTCGATTTGGATACCTTTGCTGGTGTTGATTACCCTCGCCGCCTGCGCGACCGCCGGTTATAGCTACTGGCGTATGCAGCAGCAACCGACCACGAACGCTAAAGCGGAACCGGCTCCGCCGCCCGCGCCGGTATTTTTTGCGCTGGATAC [...]
+TTCGCGCGGGCCAAGCGAGGCGCTGGCTGACACCTTGAGTCCCCGGACGCTATTTCCTTTTGGTACGAATCCCATACGCTTAATCACCCAGGCCGCCGCCAAAATGAGCGCAATAATGCCAATTAATGCGCCGCTCACCTGCATGAGCGGCGATCCGGCTGGCGCGGTGGGCTGAGAAACCGTGGCCTCTGTCTTCATCATTAACGACTCAAACGACGCATACGCTCGGATGGCGTAATAATATCGGTGATACGTACGCCGTATTTATCCGCCACGACGACCACTTCACCCTGGGCAATCAGGTAGCCATTAATCAGGATATCCAGCGGCTCGCCGGCCAGCCCGTCCAGCGCGACGACCGACCCCTGCGTCAGACGCAACAGTTCTTTAATGGTCATTCGCGTGCGGCCCAGCTCTACGGTCAGTTTGACCGGGATATCCATAATCAGATCGATATCCTGCATAGCACCGCTGACATCGCCGCCGCCAAGC [...]
+NODE 1005 6232 321123 315567 0 0
+AGGGTGAGCATGAGCTTTCCATCCTTACCGGAGTTGAACTGGTTGTCAAACGCGGCGAAACCATTGCGCTGATTGGCGAATCAGGATCGGGAAAATCTACGCTGCTGGCGATTCTCGCCGGACTGGATGACGGCAGTAGCGGAGAGGTTAGTCTGGTGGGGAAACCGCTTCACCAGATGGACGAAGAGGCGCGGGCGCAGCTTCGCGCTCAGCATGTCGGTTTTGTTTTTCAATCCTTCATGCTTATTCCTACGCTTAACGCGCTGGAAAACGTTGAGCTACCGGCCCTGCTACGCGGTGAAAACAGCGGTCAGAGTAAGGCGGGGGCGAAAGCGCTGCTCGAACAACTGGGACTGGGAAAACGGCTTGACCACCTTCCGGCACAGCTTTCCGGCGGCGAACAGCAGCGCGTAGCGCTGGCGCGCGCGTTTAACGGGCGTCCTGATGTGCTGTTTGCCGATGAGCCGACGGGCAACCTTGACCGTCAGACCG [...]
+GGGCAAACACATCAAACACCTCGCCCGATTCCACAACCTTACCGCTCGACATCACCGCCACGCGATCGCAAATAGATTTGATCACGTTCATTTCATGGGTGATCAGCACAATAGTAATCCCGAGCTGTGCATTGATCTGTCTGAGCAGGGCCAGAATCGTGGCGGAAGTTTCCAGATCCAGAGCGGAAGTCGGTTCGTCACATAGCAACACATCCGGATGGTTAGCGATGGCGCGGGCTATCCCCACCCGCTGTTTTTGCCCGCCGCTGAGCTGTACCGGAAAACGGTTCGCTTTATCGGCAAGGCCCACCAGCGTTAAAATTTCCGCCACCCGCGGCGCGATTTTGCTGCGTTCCCAGCCAGCCGCTTTCAGGCTAAACGCAACGTTTTGCGCCACTGTCCGGGTATGCATTAAGTTAAAATGCTGGAAAATCATACCAATACGCTGCCGCGCCTGGCGTAACGCTTTTCCGTCCAGCGCCGAAATTTCCA [...]
+NODE 1006 14 5190 5059 0 0
+CTCCAAGTAGACAT
+GTTAAGTAGACCGC
+NODE 1007 25 3049 3023 0 0
+GTCTGGCAATACGTCAGGAGGTCTG
+GCGTAAGGCATACGTGCCATCCGGC
+NODE 1008 226 12000 12000 0 0
+ACGCTGGCCGGCCCCAAACTGGCTTCAACAATTACGCCTGGTGGGATAGGCTCTTATCCTGAAATGATGCTCTGCGAAGAATTTATAAGTATATAAGGGTGGGAAGGCCAGGCCTTCCCACTAAAAGTTCTATGCCGTCAATGATTCAACCACGTCTATCCAGCCATGCTCGCTGGTAATGTCCTCGCCATTAAGCCAGCGGCGCAGCATATTTAGCGCCATCACC
+CCAGCGAGCATGGCTGGATAGACGTGGTTGAATCATTGACGGCATAGAACTTTTAGTGGGAAGGCCTGGCCTTCCCACCCTTATATACTTATAAATTCTTCGCAGAGCATCATTTCAGGATAAGAGCCTATCCCACCAGGCGTAATTGTTGAAGCCAGTTTGGGGCCGGCCAGCGTGCAGAAACCGGAGCGTACACGTAGTACGTGAGGATTTTGAGCACTGCCCG
+NODE 1009 1026 171277 169641 0 0
+TTTCAGCATTATCAAAAGGAAGCATGGCAGTTTTCATCCAGGAAGAACATTTAATGCCCGGAAAGCGTTTCTTGGTGATTGTCCGTCAGCACCTGGAGATATTGTAGGCAAGATACTTGATAAATACGGAAAATTACGCTGGTAACAGAAGGGGTAAACAGTGGCAAGAAAAGGTGTAAATGAAGTCACCCTGGTTGGTTTTGTTGGTAATGCTCCGGTGATATCTCAGGCCAGTAGCGGGGATAAGATCGCGGTTATTTCCGTTGCAACAACTGAAACATGGACGGACAGAAAGACAGGTGCTGAAAAAGAGAAAACCGAATGGCATCGAGTTGTTATTTTCGGAAAAACAGCCGAGATAACGGAACAATATGTAAAAAAAGGCACATTGCTGTACATTCGCGGGAAACTGCAAACCCGTAAGTGGCTGGACCGAGACAATATAGAGCGTTACAGCACGGAAATTATTGTTAATTCGGCAGGGGGAGAAAT [...]
+TTGCATGAGGCGGATTATGCTGTATATAACGCGCCAGCACTGCTTTAGCTGCCTTATCGATACGAAGCCCATAGAGCAATTCATTCGCGTGATAAGGCCGGTATGGCAAGTTTGCCGCAAAATAATCAATTGCCGGACTAATCATATGGCCCTGCACTTATGCCTGAATGACACATTATTTTTCTTGCCGTTACCGGATGATTTAAATACAATTTAAATGGGCTTTTATAGTCCCCTGATAATGCCCACAAGCTGACTCTGCCAAGTATCAACCTCATGGGTATTATCATCCCCGTAGTAAAAACCAAAAACGCCGGGGTCACTCGGAACTTGCTTCTGAGTGACTCCGGGGTTGAACAAGCCGAAGGCGCGTTAGTCGGTTTCATTGCTTTGCTGCTTGTCCGTACTGCCAGCGCCATTTTCAGGAATGTCGTTTCCGGCTTTTCCTCCGGTTACTTTATCCTGGCGACTCCCCAGCATTTGCATTTCTCC [...]
+NODE 1010 51 2341 312 0 0
+TTGCTGATAACTTCGCCAGTATGAATCCGGTTGCGAAATGGATACTCATCG
+ACCACCCCCAGCCCCGGTCCCAGGTTATTAAGCGTAGCCACTACCGAGGCG
+NODE 1011 3787 232405 230585 0 0
+GACGGTGAAATGGGGAGCACAGCAATGTCGGGTTAACTACCACCTACCTGCCCACAAGGGAATCGCGGGCTTGTATCAAATGAGCGGTCTCTGCAGATAGCCGATTCTGAAGGAGAGAATAATGTGGATGAAAATACAGCGAGTGAAAACGGTTATCTATAGCGTAAGCTTACTGGTCGCTGCCAGTAGCTTGGTGCCGATAGCGAACGCCGCAGAAAAACTTCAGACAACGCTACGTGTAGGGACTTACTTTCGGGCTGGGCACGTGCCAGATGGGATGGTGCTTGCGCAAGGCTGGGTGACTTATCACGGCAGTCACAGCGGGTTTCGGGTATGGAGCGATGAGCAAAAGGCGGGTAACACGCCTACCGTATTGCTGCTGAGCGGGCAACAGGATCCTCGCCATCACATTCAGGTTCGCCTGGAGGGCGAGGGGTGGCAACCAGATACGGTGAGTGGTCGTGGCGCCATTTTAAGAACCGCTGCAGATAA [...]
+TCCGGGTATTATCATTTCCGTCAGTCGGCATCATGTTTTGTATTGGGCATCGTCAAAAGACGACTGGCTGACCAGTCGCATATCTCGATGCCTCAATTCAGTCATCATCATGTGGGTTTAAGTCAGGAACGTGTCAAAACCATTCCAAACGGGTTAATCATCATTCAGAAAATCAATTTGTGGGCGATTATTCCATTTATCTTCAATAAAAGACAGAAAGCGTTGAAATAAAGGAGAATAATACTGACGATGACGCCATACAAGATAAATGGGGAGATCTGGAACCCTCCATTCAGGAAGTATAATTTCAAGTTCATTATTTTTTAAGTATTTGGTGGCAAGCCAGGCCGGAGTCATGAGGTTGATACCCTTTCCTTCTAAAACCAAATTAAGAACACTCAAAAGATTATTGGAAGATAAATGAACATTAACAGCGCCACTAATAGTGTATGATTCATCTTGACGGAAAAGAGTAAGAGGTCCGGAAAGACC [...]
+NODE 1012 3522 198535 196341 0 0
+TTTTTTGGCAAGGGCAACAAGCATCAGATCTCTTTTGCTGCGGGAGAAAGTATAAGGAGAGGAGGGGTTGAGCACTTATATACGGCTTTTCTGACATACAGTGAACCCAGCGATTTTTTCTTTTTACAGGCAAGAAATAATCTGGAGTTAGGAGGATTTAAGGCTAAGGGTAGTGATGATTGCAGTAAACATTCTGGCAGCGTTCCCTGCAATAAATATAACCAGGGCGTATTGGGTATCTCGAAGGATGTGGCGCTGGTTCATTTCGCTGGCATCTATACCGGTATTGGTCTGGGGGCTTATATAAAATCTAAGTCGCGAGATGATATGCGTGTCAATTCTGCATTTACCTTTGGAGAAAAAGCGTTTCTTGGCTGGAACTTTGGGGCTTTTTCTACAGAAGCTTATATCCGGCATTTCTCGAATGGATCACTTACGGATAAAAATTCAGGGCATAATTTTGTAGGTGCTTCAATTAGTTATAATTTCTGA [...]
+TTGCGCCAGTTCACTCTCTTCGCTAAACAGGCCATACGCCTTATTCTTGGCGCTATAGACCCGATGCAGTTCAGCCACCATCTCGACAACGGTGGTTGTCGGCTCCAGCAATGAATCGCGCAAGACCAGCTCAAGATTTTGCTCATCGCGCTTGATAAGCTGGTGCAGGGCAATCTGGTTGATATCCAGACTCATGATAAACTCTCCTTTAAGACCGGGCGGTATTCAACCACCGCCTGCCGGAAGACGCAAGCAATCGCCCTGTCATTTCAGGCGTTATCCGTAACGCGAATGATTTAGGGGATAAAAATGCAGAAAAAAAACTGTTGCTACGGTAATATGTTGCCCTTTCATGAACAAACAGATTTTGATTTATGCCACAACTCTCCCGCTATAGTGATGAACATGTTGAACAACTGCTGAGCGAACTGCTCAGTGTACTGGAAAAACATAAGGCGCCGACCGATCTTTCCCTGATGGTGCTGGGAAATA [...]
+NODE 1013 4625 223758 221592 0 0
+TAGCGATGAAATCGATATCGGGCGTCTGGTCGGAACGGTGATTGAAGCGCGTTGGTGGGTGTTGGGGACGACGGCCATATTTGCGCTGTGCGCGGTAATTTATACGTTCTTCGCCACGCCCATCTATAGCGCCGATGCGCTGGTGCAGATTGAACAAAACGCCGGTAATTCGCTGGTACAGGATATCAACAGCGCATTAGCGAATAAGCCGCCGGCTTCCGATGCGGAAATTCAGCTCATTCGATCGCGCCTGGTGCTGGGGAAGACCGTTGACGATCTGGATCTGGATATTGCCGTCACCAAAAACACCTTTCCGCTCTTTGGCGCCGGGTGGGAACGGCTGATGGGACGTCACAATGAAATGGTGAAAGTCACGACATTCACCCGACCAGAGACGATGAGCGGACAGATCTTCACCCTCAAAGTGCTGGGCGACAAACGTTATCAGTTAGTCAGCGACGGCGGATTTAGCGCGCAGGGCGTTGTGGGCCA [...]
+GCTAGCACCTCCTGCGCCGCCTCGCTGTGGGTGGCGATTACCGGTACGCCGATCGAGAGCGCTTCACACAAGATCAGCGGATAGTTATCGACCCGCGAGCTAAAGACCAGCGCGTCCATCTCATTGAGCGCGCTCATTAATTTGCGCTTATCGGTTTCAAAACCGTGATTAACAACGTTTTGGCTGGTAAAAGGCGAAAATTTACCGAAGGTGTGCAGTTCAATTTTTTCGCCCAGCGCCATCATGTCGTGTACCAGACGCTGGTCAGTTTTGCCGTCGTAACGCAAGTCATGCGCCACAATGGCGATCCGCGGTTTGCCCGGATTCAGCGGCACAGGTGATAGCTGCGCGAGAATCGCCTCGGTCGCCAGATCGATACCGTTGTTAATCACCCGGCAGAGTCCCGCGCCATAAACGCTGTTAAAGGCCTCGGCCACATGCTGGCTCGGCGAAATAAACTGGCAGCCCAGCCGCAGCATGTCCCGAAAGCGC [...]
+NODE 1014 3299 145057 143136 0 0
+CAGCTTGATGCCAATATTCAACGTCTTCATTATTCGCTGGAAATCGCCAACGCCGCCGGTATTAAGAGACCGGTTTACAGCAATGGTCAGGCGGTAAAAGATGATCCGGATTTTTCTATTTCTCTCGGCGCGGATGGTATTTCCCGCAAACTGGAAATTGAAAAAGGGGTAACGGACGTGGCCGAGATCGACGGTGATTTGCGTAACCGTCAATACCATGTTGAACAACTGGCGGCAATGAATGTGAGCGACGTGAAGTTTACCCCGTTTAAGTATCAACTGTCGCCGTCTCTGCCAGTGAAAAAAGATGGCCCGGGTAAAGCGGTCATTATTATCCTGGCGGCGTTGATTGGCGGTATGATGGCCTGCGGCGGCGTATTACTGCGTCACGCGATGGTCTCACGTAAAATGGAAAACGCGCTGGCGATAGATGAACGGTTAGTCTGATTTACCCGAAAAGCCGGATAGCGATATCCGGCTTTGTCATCTGTG [...]
+GCCCGGATTGTTGTTATTACTGAGTCTCGCCGCGGTTTTAAGCCTGGTCATTGGCGCGAAACCGCTGCCCGCCGCCGTCGTGCTGGAGGCGTTCACCGGCGTGTGCCAAAGCGCCGATTGCACCATCGTCCTGGATGCGCGTTTGCCGCGTACGCTGGCCGGATTACTGGCAGGCGGCGCATTGGGTCTCGCCGGGGCGCTCATGCAAACACTCACTCGCAACCCGCTCGCCGACCCGGGGATTTTGGGCGTTAACAACGGCGCCAGCTTCGCCATTGTACTGGGCGCGGCGCTGTTTGGTTTCTCCACGCCGCTGGAACAGCTTTTCATGGCATTTAGCGGCGCGCTTATCGCATCGCTGATTGTCGCCTTCACCGGTAGTCAGGGCGGCGGCCAGTTAAGCCCAGTCCGCCTGACACTGGCGGGCGTGGCGCTTGGCGCGGTACTGGAAGGATTGACCAGCGGCATCGCGCTGTTAAATCCAGAGGTTTA [...]
+NODE 1015 51 4328 4328 0 0
+TGGAGGACGAAAACCGGGCCGGAATGGATACGGGAAAAAGACGGAAATTAT
+ACCAGGCCTCACTTCCCGTTGCCAGCGCCTCTTTCATTATAACCCTGTGTT
+NODE 1016 749 48566 48282 0 0
+TGTGGCGGCGATGCAGCGTATGTAACTCGCTATCATGAAAACTTTGTACGCCAATACTGACGCGATTAACGGAAAAGGCGTTTAATAGCGCTACTTTTTCTGCCGTGGTATCCGTAGGGGAAGTTTCAATTGTTTTATAAATATTCCAGTCAACATTGAGCACATCAAAGATGGAAAAAAATAACTTCTCTAATTGCGCAATGTTTAATAGCAGAGGTGTGCCGCCGCCTACGGTAAAGCTTGCCCAGTGGACGGGCGCCAGCGCCATTTGTTGGCCCTGGGTAATAATCGTGTCGATATAGCTATCAATGAACGTATTATCTGCGCCTGTACAGGTAAATAAATTACAGAACCCGCAGCGACTTTGACAAAACGGCATATGAACATACAGATGTGTGTCGTGCTCGTAAATGCGCGGTTTTACTTCGCTAAAGCTGACGTTCTCCAGCTCCCGATAAGCCGTCTTATGCGGATAACTGTACATATACTGAC [...]
+TATCGACGCCCGCATCGACGGATTACTAAACATTTTCCGCCAAACCGGCGGCGAAACGTTCGTTATTGTCTGTTCCGATCACGGTACCTGCTATGGCGAAGACGGGAAATATTTCCATAGTTTTAATCATCCGATCGTTAATACCGTTCCCTATATGCATTTCTTGCTGAGCTGTAATCATTAATATGAATAACAATGATATTTATCGTCAGTATATGTACAGTTATCCGCATAAGACGGCTTATCGGGAGCTGGAGAACGTCAGCTTTAGCGAAGTAAAACCGCGCATTTACGAGCACGACACACATCTGTATGTTCATATGCCGTTTTGTCAAAGTCGCTGCGGGTTCTGTAATTTATTTACCTGTACAGGCGCAGATAATACGTTCATTGATAGCTATATCGACACGATTATTACCCAGGGCCAACAAATGGCGCTGGCGCCCGTCCACTGGGCAAGCTTTACCGTAGGCGGCGGCACACCTCTGCTAT [...]
+NODE 1017 41 2388 2111 0 0
+TTTCATAATGATTGCATCAGGATTTTGCCACCCGCTCCCGG
+CCCGCCAATTAAATTGGCCCACTTGCACAGCGCTTGATAAT
+NODE 1018 3308 161450 159442 0 0
+TCAGCAGAGTGACAGAAGCCCTAAGCAAAGTGAAGGGATCGATAGGAAGCAACGAGCGCCATGCCTTGCCTGGCGTGATCGGTGACGATCTTTTGCGGTTCGGGAAGCTGCCACTCTGCTTGTTCATTTGCATCATTTTAACGGCGGTGACGGTGGTCACGACGGCGCACCATACTCGTTTACTCACCGCGCAGCGTGAACAACTGGTTCTGGAGCGCGATGCATTGGACATTGAATGGCGCAACCTGATCCTTGAAGAAAATGCGCTCGGCGATCACAGCCGGGTGGAGCGGATCGCAACGGAAAAGCTGCAAATGCAGCATGTTGATCCGTCCCAAGAAAATATCGTAGTGCAAAAATAAGGATAAACGCGACGCATGAAAGCAGCGGCAAAAACGCAAAAATCGAAGCGCCAGGAAGAACAGACCAACTTCATCAGTTGGCGTTTTGCGTTGCTGTGCGGCTGTATTTTACTGGCGCTGGTTTTTTTAC [...]
+GCAGTGCAGGCGCGCCGCCTGCAACGCTTTTTCCAGCGCATCCGGCGTGTGCGCGTAATCCACCACCACCGTCGGTTTGCCAGGCGCAGTGAACACTTCCATACGCCCGCAAACCGGCTGCAAACGCGCGGCGGTTTTCAGCAAATCCGTTAACGGATAGCCCAGCGCCAGCAGCGTCGCCAATGCCAGCAGTAAGTTGCTGACGTTAAACGCGCCCATCAGGCGGCTTTCGATTTCGCCTTCACCCCAGCTTGAAGCAAAACGAATCGTCGCTCCGCGGTCGTGGTACTCCACCGCCTCCGCTTTCAGCCAACGACCGTGACAGTTAGGGTTGATATGCCCTTCCATTGATACCGCGACCGCATCGGGTAGCGACGCCAGCCAGCGGCGTCCAACTTCATCATCGGCGTTGACGATTGCCTGACCGTGATGGTGGGTGGAATAAAGCATCCATTTTGCCGCCTCGTAATGCGCCATATCGCCATGATAGTC [...]
+NODE 1019 1537 86348 85970 0 0
+GGCGCGATGATATTGTCGAATTCCGCCTGCTGTGCCGGGTTCTGCGGGGATAACGGCGGGAAAAGCGTCCGGGCAAGCCCGGTAAAATAGCCCGACCCCATTAAACTGGCCCCGCATTTTACCTCACGGTGACGCGTCATAATGCCCAGCGCCGTCATACCGCCCATGGATGCGCCGCCCACCGCCAACCGCCCGTCAAGTAGCCAGTTTTCCGCCTGAATCGCCGCACGTAACGTCGTAAATTCCTGCATGTTTTGGTGCAGAATCTGCCAGAATCGGTGTATCCGTCCCTGTGAGTCGCCGCCGAAGCGAGCGCCATGCTCCGGCGCATCCGGCATGACTACCCGGAATCCTGCCTGTGCCAGGGCAACGGCAAAATAACTATAAACCAGGCTGGAGGAGGTGAAGCCATGATAGAACACCACACAGGGAAGCGGCACGGCGCGTTTCCCTTCCGGGAAGGCATGTAGTACGACGCCTCCGGCTAATTGT [...]
+GGACTGCGGTAACGTTTGGCCTGTAGTACATGCCATCCGGCGCGAGCCACGCGGCATCAGGCATAGAGTATCGCCTGTACGCGCCAGTTATCCGACTGTTGTTCTTCATACATTTGAATAATTCTGTACCAGGACGCACCCTGTTCATCGGCTTTCAGGGCGATAATCCGCTCCACATCCTGTGGGTTTCCTGCAACATTACTGACCGAGATCAGGCCGATTTCATTCAGACCCGTTACGCAGTCAGCACTGGCGAATTCGGCAGACTGTGCCGTCGTACTCACCAGTCCGGCAGAAAGCAGCAGTGAGGATAAGGCAAGTTCTTGTTTCATCGTCAGCTCCTTATTACATACCCCGCATTTAACAGGACGCTCCATCACGGTAAACCTGTTTGTTTATTGTGCACAGGTAAACGCATAGGGGCGCAAAGCAATGTAAAACTGACTAAAAATCAATCTACTGTTATTGACGATACAAAATGGCTTGTGAATA [...]
+NODE 1020 51 2874 2788 0 0
+TGGCTACTACAACTGCGATTTTACGCAGTGAAGAGTTTGGCTGAGCAGTTT
+ACAGCGGTTAGCGGCATGTCTGTCTATGCACAGGCGGCGGTTCAACCGAAA
+NODE 1021 892 50153 49784 0 0
+CGACAACCAGGCGTTGCGTGAAGAGATGTATCGCGCCTATTCCACTCGCGCCTCCGATCAGGGGCCGAACGCCGGTAAGTGGGATAACAGCCCGGTGATGGAAGAAATTCTTGCGCTGCGCCATGAACTGGCGCAACTGCTGGGCTTCGAAAATTATGCCCATGAATCGCTGGCCACCAAGATGGCGGAAAATCCGCAGCAGGTGCTCGATTTCTTAACCGATCTGGCGAAACGCGCCCGTCCGCAGGGGGAAAAAGAGCTGGCCCAGCTGCGCGCCTTCGCCAAAGCCGAATTTGGCGTTGAGGAGCTGCAACCGTGGGATATCGCGTACTACAGTGAAAAGCAAAAACAGCACCTGTACAGCATCAGCGATGAGCAGCTACGTCCGTACTTCCCGGAAAACAAAGCCGTGAATGGCCTGTTTGAAGTGGTGAAACGTATTTACGGCATCACCGCCAAAGAGCGTACTGACGTTGATGTCTGGCACCCGGA [...]
+TTTCCATAAACTGACTTGGCAGTTCGACCGCGTCCCACGGCACGCCGCTGATACCGGAGACCCCGGCGGTCTCAATGCGGGTCAACATATGATGCAAGCCATGACCAAACTCGTGGAACAGGGTGATCACTTCGTCATGGGTAAACAGAGCGGGTTTACCGTTCACCGGACGGTTGAAATTACAGGTCAGATAAGCGACCGGCTTTTGCAATGTGCCGTCCGCCTTACGCATCTGGCCGACACAGTCGTCCATCCACGCCCCGCCGCGTTTGTGTTCGCGTGCGTACAGGTCAAGGTAGAAGCTGCCGCGCAGCTCGTTATTTTCATCATACAGTTCGAAGAAGCGCACTTCCGGGTGCCAGACATCAACGTCAGTACGCTCTTTGGCGGTGATGCCGTAAATACGTTTCACCACTTCAAACAGGCCATTCACGGCTTTGTTTTCCGGGAAGTACGGACGTAGCTGCTCATCGCTGATGCTGTACAGGTGCT [...]
+NODE 1022 27 953 953 0 0
+ACCGGCGAGCCGTTGCCGAAGGAACTG
+CCAGCGCTTCCGGCTCCCAGCACCAGT
+NODE 1023 24 865 865 0 0
+CTGGATAAAATGCTGGCGGCGAAA
+TTTCATAGTGGCCGGAGATAAACG
+NODE 1024 96 6331 3729 0 0
+TAACGCAACAATTACAGCGGGATGAAAGCGAGGCGCAGTCGTTGTTGCAGGAGGAGCAAGCGCTTACTGAGGAATGGCAAACGCTGTGCGCTACGC
+AACAACGACTGCGCCTCGCTTTCATCCCGCTGTAATTGTTGCGTTAAGGCATCTAACTGTCCTCGCAGCGCCGCGCCTTCTTCCGCCAGCGTTTTG
+NODE 1025 7193 371086 364294 0 0
+CGCCACCAGCGCGGCGTCGGTGCCGGGGCGAATAGGTATCCACTCGTCTTCACGTCCGGCAGCGGTATCGGTATAGCGCGGATCTATCACGATCATGCGCGCATTTGAGCGTTCACGCGCTTGCTCCAGAAACCAGGTAATGCCGCCGCCGCTCATGCGTGTTTCAGCCGGATTATTGCCGAACATGACCACCAGTTTACTGTTTTCGATATCAGATGTGCTGTTGCCGTCGTTGGAACCATAGGTGTAGGGCATGGCGCAAGAAATTTGCGCGGTACTGTATGAGCCGTATTGATTCAACGAACCGCCGTAGCAGTTCATCAAACGCTTCACCGGCGAGGCGGCAGGCGACGAGCGGGTTATGTTGCCGCCTACGATGCCGGATGAATAGTGGATATAAACGGCTTCATTGCCGTAGGTCTCTACGGTCTTTTTCAGGCTGGCGCTAATGGTGTCCAGCGCTTCCTGCCAGCTAATGCGTTCAAATTTGCC [...]
+GATCCGAAAATTTCAGCCATGGTGATGTTTTCCAGCGCAAATAATCCCAGCACGGCAAAGTTATGAATAACAATGAGCGCCGCCATAATTACGCCAGGGCTATACGTTTTATCTACCACAATAGACAGCATCGGCCAGGCGAGGATAATCGCGGAGATATTCAATATTATATACGGCAGCCGACGACCGTATTTATCGGACAACCACCCCAAGAGTGGGATAGTGATAAAACCAATTACGGAACTTATCATTAACGCATCGGTTGGGATAGATTTGTTAAATAATAACGTCTGAACTAAATATCCGGCAAGGAAGGTTTGAATAAGCCCGGAATTCCCCGCCTGCCCAAAACGTAAACCGGTGGCCAGCCAGAAAGATTTGCTGGTAAACATCGCGCCCAATGTATTTTCTGACGCAGGCGTTAACGCTGGCGATTTTTCGCCTTCGCTTACTTTTTCGAATACCGGGCTTTCTTTCAGATTCATTCGCAGC [...]
+NODE 1026 1084 60022 59446 0 0
+AATCGCCTCCACATCCTGACCACATTCCAGTACCTGGCGTACCATCGCGCCGCAAACCTGCTCCAGATGTCCATAATCGACGCCGGAACCAATGTGCATATGGATACCGACAAGTTTCAGTCGGTATTTCTGCATTACCGCCAGCGCCGCCGGAAGATCGCTATGCCAGATGCCGTGTTTGCTGTTTTCGCCCCCGGTGTTGGTTTTCTGGCTGTGGCCGTGACCAAAGCCAGGATTTACGCGCAACCAGACGCGATGCCCAGGCGAAACCTGACCAAGCTGCGTCAGCATATCTACCGAGCCAGCATTGACCGGAATATGCAGTTCACTGACGCGCGCCAGCGTGGCGGCGTCAATCACATCGGCGGTAAAAACGATATCATCAGGGCACGTTTGCGGATCGTAGCCCGCCGCCAGCGCACGTTCGATCTCCCCCAATGAAACAGAATCCACCTTGACGCCCTGCGCGCGCATTAAGCGCAGGATATGAAT [...]
+GCGCTGACGATGCGATCCAACCCATACCAGGAGCGTTGTACCTCTTCGAACAGGCGTAGCCCTTGCACCGTCGGATGTAAGCGCCCGCGTGTGCGCTCAAACAGCGTTAATCCCAGCACTTTCTCAAAACGCGCCAGCTCGCGACTGACGGTAGGCTGCGAGGTATGCAGCAGCCGCGCCGCTTCGGTGAGATTTCCGGCGGTCATTACGGCATGAAAAATTTCAATGTGACGTAAATTAACGGCAGCCATACGTTTTCCTGAATCATTTATCCCATATCATTTTTGCATAGACTGACAATAAAACGATATTTTTTATTCTTTCTAAGGTATGGCGTAATCGTTAAAAAGCCTGTTCCGGAGTTTGTTATGTCATTGTCGCATTATTACGCTGAAACTGACCTTAACGCTGAAAATTTGCTCAGATTGCCTGCTGAATTCGGCTGTCCGGTCTGGGTCTATGACGCGCACATTATTCGCCGTCAGATAGCCG [...]
+NODE 1027 2211 121713 120921 0 0
+ATCAGCTCAATCACATCACCACTGGTGCCGGACTTCATCGTGAACATCAGCGCCGCCATCCGGTGATAGTGTTCAATTTCATCATCGGTAAGCGTGCTGACATCCACCAGGCTGAATGGCTTTTGCTCGCCATAAATCTCGCGTCCGTACGCCGGGTCATCCAGACAATCCACCCAGTTCATCGGATACGGATATGGCCGCTTTGCACCATGATAAAACAGCACCGGGATCACTACTGGCGCACACTTATGCTCTTCAATATGCTGCTCCATCACCGCCAGGATATAACGCATCATGCGCAGTGGGATAAATTTATCCGGCGAACTCTGGTGCTCTATTAAAGTATAAATGTACCCGTCCTTCCCGTCATTTGTCTTCATGCTGAGCAAAACATCGCAGGCAGACTGGCGTAAACTTTCTGCCACAAACGTCGTGGGTTCAAGTTCTATTGTATCAAGATTACAGCGGGATTTCTGATACGGTGTCAATACC [...]
+TACATCCCTGACGTACGGGCAAATCTGCACACCTTTGAGAGCAGATGTCACCGCTTTTTACGTGTGATGAAGGCTTTTTTTACTGCACAGACAGCCGGAAATACAGCTGATTCCGGCCCCCCGACGGGAACTATCACACCCGTCAGGGGCGGTGGTGTTCTCCGTCATATCTTTTTTTATCCATGGAGAACACATCATGTCTGCAACAAATACTTCTTCTGCAAAAGCTGAATACTTCAATCTGACCGTAAAAGGTCTGGGGTACCTCAGTAATGTACGTCAGGTTAACCATCAGAATGGCTCGTTCCTTTGCTGCGTGATTAACGCACTGAGTGGACCAACGGACAATCCGTCCTATACGCGTTTTGATGTTACGGTTGTTGGTAAAGATGCAACCACCCTGATCTCTCGCTGCCAGAAAGCAGTGGATGAGGACCGTAAGGTTTTGCTTGGCTTTGCGTTAAGCAACCTGGCCACCGATATCTTCACCCT [...]
+NODE 1028 769 46080 45907 0 0
+GTATCGTCTGCTTTCGCAACCGAAGCGTATTACCCGCCAGATGCGTCTGCTGCGCTACCTTCGCTGGCACTATACTGGCGATCTCTAATTCTCCCTTCTGATGACTTGAGCAGCGGATTGTGCTTATGGCGCTGCTCATTTACAACATAATCGATGATTTCTTACACAATAAGTGCATTTTTTTAATGCTCCATTTGCCATTTGTCCAAATTTAAGAAAATATTCGCAACAATCGATGTACCCATAACAATAACCGGTACTACCGGAACCGTTGCAAACACGACATGAGGATTTATGGCAGAGAAAAAACCGGAGCTACAGCGTGGGCTGGAAGCTCGTCATATTGAATTGATTGCCCTCGGGGGCACCATCGGCGTCGGACTCTTTATGGGCGCCGCCAGTACGCTGAAATGGGCGGGCCCGTCAGTGCTGCTGGCGTATATCATCGCCGGATTGTTCGTCTTTTTCATCATGCGTTCGATGGGGGAGATG [...]
+GCAGCCAAATTCGCCAACGCAACCAGTCCGACGGCAATCAGCGCCGGTATCCACTGCGCCATCTCCGGAAACCAGAACTGGACGTAGACCCCAATGGCGGTAATTTCCGAGATCCCGACCGCCATCCACATAAACCAGTATGACCAGGCGGTAAGATAGCCAAAAAAAGGACTCATATACCGGTGGGCGTACACGGCAAAGGAGCCGGTAACAGGTTCCAGAAAGAGCATCTCCCCCATCGAACGCATGATGAAAAAGACGAACAATCCGGCGATGATATACGCCAGCAGCACTGACGGGCCCGCCCATTTCAGCGTACTGGCGGCGCCCATAAAGAGTCCGACGCCGATGGTGCCCCCGAGGGCAATCAATTCAATATGACGAGCTTCCAGCCCACGCTGTAGCTCCGGTTTTTTCTCTGCCATAAATCCTCATGTCGTGTTTGCAACGGTTCCGGTAGTACCGGTTATTGTTATGGGTACATCGATTGTT [...]
+NODE 1029 5630 301782 300926 0 0
+AGCGCGTTTGATATCAGCGGTTTCATCAATGACAACCGGGGTGTTGCCTGCGCCTACGCCGATTGCCGGTTTACCGGAGCTGTATGCAGCTTTAACCATGCCTGGACCGCCAGTGGCGAGGATCAGGTTAATATCCGGGTGGTGCATCAGCGCATTAGACAGTTCTACGGAAGGTTGATCGATCCAGCCAATCAGATCTTTCGGCGCGCCGGCAGCGATAGCCGCTTGCAGAACGATGTCTGCCGCTTTGTTGGTTGCTTCTTTAGCGCGCGGATGCGGAGAAAAGATGATGGCGTTACGGGTCTTCAGGCTAATCAGCGATTTGAAGATCGCGGTAGAGGTCGGGTTAGTGGTTGGAACGATACCGCAAATAATGCCGATAGGTTCAGCAATGGTGATGGTCCCGAAGGTGTCGTCTTCAGACAGCACGCCGCAGGTTTTTTCATCTTTATAGGCGTTGTAAATATATTCAGAAGCGAAGTGGTTTTTAAT [...]
+CGCCGATGGCAACGCGCACCAACAGATCGCGCCCGGAAGAGTCAGTGCCGAAATAGTGACCGGACGCCATATCCGGCGCGCTGGACATCATGCCCCAGTCGGTATCGAAATAGGTAAATTGCGACAGCATAGGCGCCACTGTCACGAACAGGGCTATCAGAAACAGGACAATAAGACTGGCCACCGCCGCACGGTTATGCATAAAGCGTCGGCGGGCATCTTGCCAAAGGCTGCGACCTTCCACCTCCAGCTTTTCACTGAAATTTTCCAGCGTCTCGCTGTTTTTCTTACTTAACATCATCGCGAGCTCCAGTATCAATAGCGAATTTTCGGGTCGATAACGGCATAGAGCACATCGACAATGGCGTTAAACAATATGGTCAGCGCCCCAACTAAAATGGTCAAACTTAACACCAGCGAGTAATCGCGGTTGAGCGCGCCATTAACGAAAAGCTGCCCAATGCCCGGTAAGCCATAAATCGTTTCAATCAC [...]
+NODE 1030 360 18771 18541 0 0
+GCATGTTTGCCTTTTTTCGCCGGACGCGCCGCTTTTGCATTACGGCCACGACCACGACCGCCTTCTACTTCACGATCGTTTTCGTCTTCGGCCTGGCGCGCGTGCTGAGAAGTGGTGACATGATAGTCACTGGTGTCTTCTACTGGCTCAGGCGTTGCGGTCCATTTGTTTTCTTCCGCCATGCGGCGAGCTTCTTCTGCTACACGACGCGCTTCTTCTTCGAGTTTGCGACGTGCTTCTTCTTCCGCTTTACGCTTCAGCTCTGCAGCTTCATTCTCACGGCGGGCTTTTTCGGCCTGGGCGGTTTTGGTCATATCGTCAGTCTGTTGATTGCTCACTTTGTCTTTTTCCGCAGCTTCA
+CCAAAACCGCCCAGGCCGAAAAAGCCCGCCGTGAGAATGAAGCTGCAGAGCTGAAGCGTAAAGCGGAAGAAGAAGCACGTCGCAAACTCGAAGAAGAAGCGCGTCGTGTAGCAGAAGAAGCTCGCCGCATGGCGGAAGAAAACAAATGGACCGCAACGCCTGAGCCAGTAGAAGACACCAGTGACTATCATGTCACCACTTCTCAGCACGCGCGCCAGGCCGAAGACGAAAACGATCGTGAAGTAGAAGGCGGTCGTGGTCGTGGCCGTAATGCAAAAGCGGCGCGTCCGGCGAAAAAAGGCAAACATGCCGAATCCAAAGCCGATCGCGAAGAAGCGCGTGCTGCGGTTCGCGGCGGTA
+NODE 1031 4020 257398 255535 0 0
+TGCGGTGGATTCGTTACCGACACCGAGGCTGCCGGCACAAAAACCGTGCAACTGGAGCTGCATCTGGTCGTCACTCAACCACCGCCCTGTACGGTAGGCGGCGCTTCCGTAGAGTTTGGCGATGTCCTGACCACCAAAGTTGGCGATGTTTCTCAAACGAAACCTGTGGGCTACAGCCTGAACTGCGATGGCAGAGCGAGTGACTATCTGAAGCTACAAATTCAGGGGACCACCACCACCATCAGCGGGGAGCAGGTTCTGCAAACTTCGGTGCAGGGGTTAGGCATCCGTATTCAGCAGGCGGGCAATAAGCAACTGGTTCCGGTTGGCATAACGGATTGGCTGAACTTCACCCTGAGCGGCAGCAATGGGCCAGAGCTGGAAGCCGTACCGGTTAAAGAGCCCACCACGCAGTTAGCGGGTGGCGATTTTAACGCCAGTGCGACGTTAGTCGTGGATTACCAGTGATGGAGAGATTCATAGTGAAAAGGG [...]
+AGCGGAGAGCCGCAGGCCTGGGAAAAGGATGCCTTTTTACGGAAGGTCAAAACAGGGATGATCAAACCCGATGAGAACGGTAAAATTAACGCCAAAGGCCAGTGAAGATCTGGAAAATATCTGGCATTACGGCTGGCAGCATTTTGGCGAAATACAGGCCGATCGATATATTAATCATCTATCAGATATTATTCGGGATGTAGGGAGATACTCGAGGGCTACGGCTTGATGTTTTATAAAGATATCTGGTAGCTATCTGCTTACCAGATATCTGGTATGGTTCCATGAAAATCGGTTTTGTTCAAATTTCTATTCGTATGGTAGTAATACGGTTACCGCACAATCGGTGTCAATGTTGACTCGTCCCCAGGTACCACGAAGTTCTACCATCTGTGAACGGGCACATTCAGTATTGTTTTGATCACAGGGAATAGCCTCAATCTGCATGTTTTTATCATCACATGCTATTGATACTGTTGCATTATCTATTAT [...]
+NODE 1032 610 38155 38049 0 0
+TTGATGCTTCTCATGCAGAAGGTAAATGGACTGGCATGTGTGGTGAGCTTGCAGGCGACGAACGTGCTACACTTCTGTTGCTGGGGATGGGTCTGGACGAATTCTCTATGAGCGCCATTTCTATCCCGCGCATTAAGAAGATTATCCGTAACACGAACTTCGAAGATGCGAAGGTGTTAGCAGAGCAGGCTCTTGCTCAACCGACAACGGACGAGTTAATGACGCTGGTTAACAAGTTCATTGAAGAAAAAACAATCTGCTAATCCACGAGATGCGGCCCAATTTACTGCTTAGGAGAAGATCATGGGTTTGTTCGATAAACTAAAATCTCTGGTTTCTGATGATAAGAAAGACACCGGAACTATTGAGATTGTTGCCCCGCTCTCTGGCGAGATCGTCAACATCGAAGACGTGCCGGATGTAGTTTTTGCTGAAAAAATCGTTGGTGATGGCATCGCTATCAAACCAACCGGTAACAAAATGGTCGCCCCT [...]
+ATGCCGCTATCGGATTCGATAGAGAACGCATGGTTGGTTTCAAAGATTTTGCCGATGGTGCCGTCAACAGGGGCGACCATTTTGTTACCGGTTGGTTTGATAGCGATGCCATCACCAACGATTTTTTCAGCAAAAACTACATCCGGCACGTCTTCGATGTTGACGATCTCGCCAGAGAGCGGGGCAACAATCTCAATAGTTCCGGTGTCTTTCTTATCATCAGAAACCAGAGATTTTAGTTTATCGAACAAACCCATGATCTTCTCCTAAGCAGTAAATTGGGCCGCATCTCGTGGATTAGCAGATTGTTTTTTCTTCAATGAACTTGTTAACCAGCGTCATTAACTCGTCCGTTGTCGGTTGAGCAAGAGCCTGCTCTGCTAACACCTTCGCATCTTCGAAGTTCGTGTTACGGATAATCTTCTTAATGCGCGGGATAGAAATGGCGCTCATAGAGAATTCGTCCAGACCCATCCCCAGCAACAGAAGTGT [...]
+NODE 1033 4418 202723 200628 0 0
+ACCAACGACGAACTGAAAACCGCCGCCGAATACCAGCCGCTGATTATTCACTATAACAACGGCGCGGCGGTACGCCTGGGCGACGTCGCCAGCGTCACCGACTCGGTGCAGGATGTCCGTAACGCCGGGATGACGAACGCTAAACCCGCTATTTTGTTGATGATCCGCAAGCTGCCGGAGGCCAACATTATTCAGACGGTCGACGGCATCCGGGCAAAACTGCCGGAACTGCGGGCAATGATCCCCGCCGCTATCGATTTACAAATCGCCCAGGATCGTTCGCCGACGATTCGCGCGTCGCTGCAAGAGGTAGAAGAGACGCTGGCTATCTCTGTCGCACTGGTGATCCTGGTGGTGTTTTTATTCCTGCGTTCCGGGCGCGCCACGCTAATCCCCGCCGTCGCCGTTCCCGTTTCGCTCATCGGCACCTTCGCCGCCATGTATCTGTGCGGCTTCAGCCTCAACAATCTGTCGCTGATGGCGCTGACTATC [...]
+AGCAGGCCACGCGCCAGCAAAAACGTCGCCAGCGCGGCCAGCAAGGTTGATAACGCCACGATCATCCAACTGGCGCGCCGCTGCTGTATATCAAAATTAATATCCGTATTGCGCGTCAGCCGCTCGACAGGAGAGGCGATAATCGCGCCGACTTCGACGTCATTGACCAGAATGGGGCGGCGAGTACCGTCATGCGGCACCGGACCGCGTGGGCCGACCAGCACCCGGCCATTTTGATCGACGACCCAGAACTGGGTGCGCCAACCGTGCGGCGGCATACCGGGGCCGGGTTTATCGCGGTCGTTGTCATGCTCAAATGAACGCAGAATCTGGAAAACGAAGCGATCATTGTTACGTAAAAAACGCCAGTTGCCGTGTTGCTGGTACTGGTCGCCCAGCGCATCGCCCAGCATTTGTAGCCGCTGCTCGTTGCCGTGTTTGATATAGTCAATAAATCCGCGTTCAAAACTGACGCGCACGGCCCAATGCATA [...]
+NODE 1034 770 36946 36815 0 0
+AAAGGTATCGTTCTGGCGCAGCCAAAAAGCATACGCCGGAGACTGTTTGTGTTCTCAAAATCACAGGAGAAGTGTATGGGCAAGTTAGGTGGTGAAATGAAGGCACTGGCAAAGCACTGTGGCGGTAGCCATAAAACGGTGAACGATCGCATTCATATCGTGCAGCGTTTCGATCACCACTTACGGGTTTTGAACGTCCATATCCAGCGGGTTGCGCAGATTAAGGTGCGCCACATTGAAAGCTATATTCATGAAAGGTTGGCGCAGGGGATCGGCAAACGCACGCTGCAAAATGAAATGGCCTCGCTGCGCGCTGTTCTGCAACAGGCCGGGCGTAAACAGGTGGCAGAGCATGAGTGGCTGACTAATAAATCGCTGGGGCTGTCTGGTGCATCGCGCAACGGTACGCGACGGGCTATTACGCCGGAGCATTGTCGCCATGTGCTGGAAATGGCCCGTGTAAAAGATCCAGGTCTGGCGGCTGCGCTGGAA [...]
+TTTGTCGATCAGTCGGCCATGACGGCTTTCTGCAATAGCCAGCGCATTATCCAGCGCTTTTCTGACAGCTATAGTATCCAGAATCACCGTTTCGCGGGGCCGTCCGCCTTTGGTGCCGAACACCACGGTTAAGCGCGTATCGCTGCGTTCAATGGCCTGTTTCCACGTTTTCAGCGATTGCACGCTCTGCACCGCTTCCTGTGAACGTAAGCCCATCAGCCTCGCCAGTTCCAGCGCAGCCGCCAGACCTGGATCTTTTACACGGGCCATTTCCAGCACATGGCGACAATGCTCCGGCGTAATAGCCCGTCGCGTACCGTTGCGCGATGCACCAGACAGCCCCAGCGATTTATTAGTCAGCCACTCATGCTCTGCCACCTGTTTACGCCCGGCCTGTTGCAGAACAGCGCGCAGCGAGGCCATTTCATTTTGCAGCGTGCGTTTGCCGATCCCCTGCGCCAACCTTTCATGAATATAGCTTTCAATGTGGCG [...]
+NODE 1035 36 1408 1408 0 0
+AGCAATCCTCCATGAGAAAAGCGACTAAAATTCTTC
+GGTTTTCAAGAACCAATAAATCGTGTGGCTGATGCG
+NODE 1036 3102 151378 150522 0 0
+AGGATTTATTGTTTTGATTTTAAAGGAATTTACAGTGAATAAATGGCGTAACCCCACTCGGCGGTTATGTGCGGTAGCTATGCCTTTTGTACTGCTCCTGCTTTCCGGATGCGGCAGTAGCGATGCGTTACCTGACCTCGAATCACAGCGACTCGACCTGAGCGTGAAAGCCTCCGATAAGGTGAATCCTGACAATCAGAAGAAGGCCGCGCCCATTGAGATACGTGTGTATGAACTAAAAAATGACGCCGCTTTCACGACAGCTGATTACTGGTCGCTCCATGACAACGACAAATCCGTCCTTACCGACGATTTAGTGCGTCGCGACAGCTTTATTTTGCGTCCCGGCGAAGAGAAAAAACTGCGTCGCCCGCTGAATGCGCAGACCACGGCAATCGGCGTACTGGCCGGATACCGTAACCTGGCCAAATCGGTCTGGCGGGTAACCTATAAAATCCCGGAAGCCCCGGAAAAAGCCTGGTACAGCAGCCT [...]
+GCACCAGGTTGGATGGGAATTCAGCCGAATGAATGGGCTGGCTGTCAGTGTGACCCGTTACAGTGACTGCGCCGCCCACGCGGGCGATTTCCCGCGCCGCTTTGTTAATCACTGGCCGGATTGCGTCACTCACCGTTTTTTGTCCCGGTACAAACATGGCGTCGCCACGGAAGACCACCCTACTGTGCTGGTCATCTTCGTCCACGGTCAGCAGGCCACGGGCGATTTCGTTTGCCAGCAGGATTTTCAGCCGCAGCTTATGAACCGGCACGGGCGGCGGCGGCAGTATTATACCAATCGCATCAATATGCTGTTGTACGGTGACGGTCTGCACATCCATCCGGTGGCTGTAAAGGCCAAACAGCGTCAGCATCGCCAACAGGGCTATCCCGGCGCTCAGCCAGACCGGCACCCGGCGCATCCGCCGCAGTCGTCCGCTTATCGCCCCCTGAAAGTCAGGCGAGAGCGCGGGCATAACCGGATCGCGACGCT [...]
+NODE 1037 7840 569608 567165 0 0
+TTATCCGGACAATTTCAACCAAAGAGTCGCTTGTGGAAAAGCCATTTCGAAGAATTCTGATTATAAAAATGCGTTTTCATGGAGACATGTTACTTACCACCCCTGTCATCAGCACGCTGAAGCAGAATTATCCCGATGCAAAAATCGATGTGCTTCTTTACCAGAACACCATACCGATATTGTCGGAAAATCCGGAGATTAATACACTCTACGGCATCAGTAACAAAGGCGCAGGAACAAAAGAGAAGATCAAAAACGCGCTATCGTTAATCAAAAAATTGCGTGCTAACTCGTATGATCTGGTCGTCAATCTCACCGATCAGTGGAGCGTGGCGCTTATTGTGCGTTTTTTAAACGCAAAAATAAAAATCTCGCAGGATTTCGGTAATCGTCAGTCTGCTTTATGGAAAAAAAGCTTTACGTATTTAGTACCTTATGCGGGAGAACATGCTGTTGAGCGCACATTATCCGCGCTAAAGCCGTTAGCGCTAA [...]
+GGGGAACTGAAATAAGTAATGCTTTATGAACCCGCTTGAGGATATTAAATTTAATTTTCTTTAAAAAGCCCCCTTTTTCTCGGCGATAAAAGGAGCGAATAATTAAACAGTTTTCTTCAATATATTTTTGATCATCCACTGAAGCCTGTTCGTACACATCAAGATTGACGATAGTAAACTGACTGTTACGGCTAAAGTTATAAAAATCTTCACGCCGGCGATGGAGGAAGCGAACATCCGTCAGAAGGTACAAAAATGGCTTGACGTTATTGTTTAGCAAATATTGAACAGAACCATTAACTGCAATGACATCTTTCATTCGTAACAAGGACAGCGGCGTCTTTCTGGACGTAGGACCAGAAAGAAAAATAATACAATCTTCAGCCGTTCTTTTCGCAATAAGTTGCAGAACATCGGCGTGAGTTATGAAGTTAACGCTGCCCATAAAAAACTCGTATGTTTATCATGCAACCTATAAATAAATGTTATATT [...]
+NODE 1038 2749 171000 170634 0 0
+TTCGATGGAAATTCTGGGTCAGGCGGCGCCAGGCAAGAGTACTGGTGAAGCGATGGCGATGATGGAAGAACTGGCCAGCAAGCTGCCGTCAGGCATTGGGTATGACTGGACCGGGATGTCCTACCAGGAGCGGTTGTCCGGCAACCAGGCCCCTGCCCTGTATGCTATCTCGCTGATCGTCGTCTTCCTGTGTCTGGCGGCATTGTATGAGAGCTGGTCTATCCCGTTCTCCGTAATGCTGGTTGTTCCGCTTGGGGTTATCGGCGCGCTGCTGGCCGCCACCTTCCGCGGACTGACTAACGACGTTTACTTCCAGGTGGGCCTGCTCACAACCATTGGGTTGTCGGCGAAGAACGCGATACTTATCGTCGAATTCGCCAAAGACTTAATGGATAAAGAAGGGAAAGGTCTGGTAGAAGCGACGCTGGAGGCCGTTCGGATGCGTTTGCGCCCGATTCTGATGACCTCGTTAGCGTTCATGCTGGGGGTTAT [...]
+ACGGACGTTTAAGTCATCAATAGTTTCGCTAAGCAGGCGCTGTATCTCTGTCATCTTTTGCCTTCATGATTTCTGCGACATAGGGGGTAGTAACAGCCCATTTTAAAGGGAGGTGTAACGTGAAAAAAGTAACAGATTAACCACGAATTAGCATAACAGTTATCATTTTAACTACAATTTTTTAATGATTCGCGCCGGGTTTCCACCTACCACGACGTCTGGCGGTACGTTTTTTGTCACCACAGCGCCTGAAGCGACGACGACGTTATCGCCGATGGTTACGCCAGGATTAACGACGGCTCGTCCGCCTATCCAGACGTTATTTCCGATAGTGACGGGTTTACCTAATTCTCTGCCGCTGTTGCGTTCGACGGCGTCCAGCGGGTGCGTGGCGGTATAGATATGTACCCCTGGCGCGAGCATACAATTATCGCCAATATGAATTGGGCAAACATCAAGCATGACGCAGTCGAAGTTAGCGTAAAAGGAGTG [...]
+NODE 1039 1023 45160 44779 0 0
+GCTGCCATTGTCGCCATTGATAACTACAGCGGCAGAGTCCGCGCCATCCACCGCGATATCGCCGGTATTGGTGATATGGGCGTCGTCGCCGTCAATACGCGTACCGACGGCGCCGCCAGAGATAGTTTGATTACCTTCGTTGATAACGAGCGCGTTGTCGCCATCGATATACAGCGCCGTGGCGTCTGCGCCGCTGACGGTGGTGCTCCCGGCGTTATCGATAACCACGTCGTCGCCGGTAATGTGGGCGCCGGTGCCGCCGTCGGTGATGGTCATATCACCGTCGTTGTTGACGCGGGCGTTATTGCCGTTAATGACGGTGCCGGTGGAGCCTGCGCCGCTGATGTCAGAGGTACCGGTATTTTTAATCGTGGCGTTGTCGCCGTCGATGATGATGGCGGTGCCGCCGCCGCTCACGGCAATGTCACCGGCGAAATTGGTGGTGGTGCCGTTGCCGGAAATCAGCGCGCCGGTAGCATTGTCCACCGTTGA [...]
+TGACTCTGTTATTACCTTCAGCAACGGCGTCACCATCGATAAAGGCAAAGACACCCTGACCTTCGATAGCTTCAAACTGGATAACGGCAGCGTTCTCGAGGGTGCCGTGTGGAATTATTCAGAACAGGACAACCAGTGGCAGCTCACCACCGCGGACGGCAAAACGCTGAACGTCACCGGCTGGGACGTGACCGACGCCAATGCCGCCGTGATTGAAGGCACCCAGGAAAACGGTCTCTACTGGAAGTACGACAGCCGTGGCTATCTGATTATTGCCGACGATAAAACCGCCGTTATCAGCGGCGATGACCAGGCGCATAATTCCGATCGCGGCATGGATATCAGCGGCCAGGATCGCACCGGCGTGATTATTTCCGGCGATAGAACCGTCAACACGCTCACCGGGGACTCCAGTGTGACCGACGGCGCCACCGGCATGGTTATCTCCGGTGACGGCACCACCAACACCATTTCGGGCCACTCAACGGTGGA [...]
+NODE 1040 974 46728 46552 0 0
+CACTCTGTTGGGGATCAAACACCTGGTGGTGGCAATCAACAAAATGGATCTCGTTGACTACCGCGAAGAGACCTTCGCCCGTATTCGTGAAGATTACCTGACCTTTGCTGAACAGTTGCCGGGCGATCTGGATATTCGCTTTGTCCCGCTTTCGGCGCTGGAAGGGGATAATGTCGCCGCGCAGAGCGCGAATATGCGCTGGTACAGCGGTCCGACGCTGCTGGAAGTCCTGGAAACGGTAGACATACAGCGTGCGGTAGACCGTCAGCCGATGCGCTTTCCGGTACAATACGTCAATCGCCCGAATCTTGATTTTCGGGGGTATGCCGGCACTCTGGCGTCTGGTAGCGTCAAAGTCGGAGAGCGCATTAAAGTGCTGCCGTCTGGCGTGGAATCCAGCGTGGCGCGTATCGTCACTTTTGATGGCGACAAAGAAGAAGCCTGTGCGGGCGAAGCCATTACCCTGGTACTCAACGACGACATTGATATTAG [...]
+AAATGACGGCGTACCAGCGCATTCAGCTCCAGCTCAAACGCACTGTATTCCACGGGCGGCGTCGCTCCGCGTTCGTCCAGTTCCCGCACCATGCCAGCGCCCACGGTGACGTTAGAAAGTCGGTCGATAAAAATCAGTCCGCCCGTCACCGGATTTTGCTGATAAATATCCAGCGCGAGCGGCTCATCGAATGTCATCTCTACCAGACCAATACCGTTTAACGGCAGGCTCTCGACGTCTCGTTGAGTCAGATTGTTGATATCAACCTGATAGCGAATAGCCTCGATACGCGCGCGGGTTTTCTTACCCGCGAGTTTAACGTCGTAGCTTTGGCCCGGCGCCAGCGGCTGTTCCGCCATCCATACCACATCGCTCGCGGCGTGCCGCGCAGGTGCCAGCGTCTCGTTTGCCGCCAGCAGCAGATCGCCGCGGCTAATATCAATGTCGTCGTTGAGTACCAGGGTAATGGCTTCGCCCGCACAGGCTTCTTCT [...]
+NODE 1041 6402 415343 406265 0 0
+CAAAAAAACAATTCCCGGACAGCAAGTCAGATTTGTTTGCGATGTTTATGCAGCATGCATTTTCTTTGCTCAAAGAGAACGGCTTTAATGCGCAAGTGAATATGCAGTCATGGATGTTCCTGTCTAGCTATGAAGCGCTTCGTGGCTGGTTATTAGCGAATAAGACCTTGATCACTATGGCACATTTAGGGGCGCGGGCTTTTGGGCAAATTTCTGGTGAAGTTGTGCAGACTACGGCCTGGGTGATTAGTAATAATCATACCGAACGTTATCAGCCAGTATTTTTCCGCCTGATTGAAGGTAATGAAGAACAAAAACAAAACTCTTTGCTTAAGCGGGACAACCAATTTAATAGCACGGCGCAGAATGACTTCAAAAAAATCCCAGGCACGCCAATTGCCTATTGGGCTGGGAATAAATTAATTAATGCTTTTCATGAAGTAAAACTGAAAGAAATGGCTGATGCAAAACAAGGAATGGCCACGTCAGACA [...]
+TGAAATGCCAGGTCGATCGTGATTGGGTAGCGACCATACTCTGTTGCGCTGTCCGCATTCTCCAGGATCAGAACATACTTGTTTTTACGATTGAATGCCGTCCCCATGAGTTTCATGGTTACATCGCGGGTGCGTTTACCCATATCTTCGTTATCACTGTCAAAGCATACTGTTTCCGTACCGGAGACGACCTGGTTGTTTTCATCCACGATAAAGATATTCAACGTGCGCGGCTCATTTAACTCATTCACTGCCGTAGTCTGAATAAAACCAACTTTATCAATGCTGTTAACCAGTTTGATCACCTGATCCCGTGCTACAATGGACACGGGTTGTCGCTGGGGTTGCTTCTCAGCCGCTTTCTTTTCAAGCGCGCGAATCTTCAACACGGGAACACACACTTCCTGCAGCATGGCTCCGCCATGAACGAAACGAGCGCCCCCTACGAAGTGGAAACGCTGTACTCCTTTGGGTAACAGGAATTCACTCTCA [...]
+NODE 1042 569 39493 37271 0 0
+AATTTTTTTTCCTCGTCAGCAGTAAGCGTACCATTCCATTCAACGGATGGCATTTTTCGATCTTCTCCAGGTCGCATAAGCTTATAAAGTCCATCCATGATATCTTCATCTTCGTTAACGGCGTTTCTAAGTTTGAGAGCCATATTTTGTAACAACTCTGGATTGAGAGAAATAGCCCTACCATAATAAACACATATTTTTAAAAACAACTCTTCTTCTTCATCCGTCATTGGTTTTAAAACATAACTATCTGAAAGATTGAGAATACGTTGCAAACTACATTTACTAATTACCTCACCATCAATCCAAAATTTAATTTGTGTCTGAGTAATATCAAAATCCATAACAAAACGATCTTGTTGTGATGGGTCAGCATAGAGTCTTAATTTTTCAAAGGCATATATTTTATCCATGGCGTCTGTATCAACGTCACGCTCCGCTTGCTTTTCACGTCCACATCCGTGGATGAGTGTATATAATACCTCCAGCGCC [...]
+CAACTTCAGAACACAAAAAAAACAAGAGGCGCTGGAGGTATTATATACACTCATCCACGGATGTGGACGTGAAAAGCAAGCGGAGCGTGACGTTGATACAGACGCCATGGATAAAATATATGCCTTTGAAAAATTAAGACTCTATGCTGACCCATCACAACAAGATCGTTTTGTTATGGATTTTGATATTACTCAGACACAAATTAAATTTTGGATTGATGGTGAGGTAATTAGTAAATGTAGTTTGCAACGTATTCTCAATCTTTCAGATAGTTATGTTTTAAAACCAATGACGGATGAAGAAGAAGAGTTGTTTTTAAAAATATGTGTTTATTATGGTAGGGCTATTTCTCTCAATCCAGAGTTGTTACAAAATATGGCTCTCAAACTTAGAAACGCCGTTAACGAAGATGAAGATATCATGGATGGACTTTATAAGCTTATGCGACCTGGAGAAGATCGAAAAATGCCATCCGTTGAATGGAATGGTAC [...]
+NODE 1043 19 1377 1313 0 0
+TATGGGATAGATTTAAGGA
+ACTCATCAAACGGACTAGC
+NODE 1044 939 47532 46921 0 0
+TGCCAGCGGCGGCCTGTCGATGCCGGGGCTTGGCGCATCGCCGTTTGGCTATAAAATCGCCGAACAGTTTGGTCTCAAGGTGTTGCCGACGCGCGCCGGGCTGGTGCCCTTTACGCTGCATAAGCCGCTGTTAGAACAGCTCCAGACGCTGTCTGGCGTCTCTGTGCCCTGCGTGATTACCGCCCGCAATGGCACGGTATTTCGGGAAAACCTACTTTTTACCCATCGTGGGCTGTCCGGCCCCGCTGTTTTACAGATTTCCAGCTACTGGCAACCGGGCGAGTTAGTGAGCATTAACTTATTGCCGGACCTCTCGCTGGAAGACGTTCTCAATGAACAGCGTAACGCGCACCCGAACCAGAGTCTGAAGAACACGCTGGCGATGCATTTGCCGAAACGGTTGGTGGAGTGTTTACAACAGTTGGGGCACATCCCGGATGTATCGCTCAGGCAGTTGAACGTTCGTGACCAGCAGGCGTTAGTTGACACGCT [...]
+CGTCAAAGGGAGTGAATGATGTAGGTACCCGGAAAAGAGGGAGTAATGTTGTCATCATCAGCGTTCCTGGCCGTAAATGAAACACGCATACTCATAACTGCTATAAATCGATACTAACACCTCTGTCCGGGATGTCTATTCGCTTATTGTTTGTAATGGTACTTAGCGTTTTGCCGCCAAATCCTGCGCGCAGGCCCAGGCGCTCGACCACGCCCACTGGAAGTTATAGCCGCCCAACCAGCCGGTGACGTCCATCACTTCGCCGATAAAATAGAGACCCGGCACGCGGCGCGCTTCCATAGTCCGCGATGATAGTTCGTTTGTATCCACGCCGCCCAGCGTCACTTCCGCTGTCCGATAGCCTTCGGTGCCGTTAGGCTGCACTTGCCAGGCCGTAAGCGTGTCAACTAACGCCTGCTGGTCACGAACGTTCAACTGCCTGAGCGATACATCCGGGATGTGCCCCAACTGTTGTAAACACTCCACCAACCG [...]
+NODE 1045 66 2598 2598 0 0
+GTTTACATCGTTGGCGACCAGCGTGCCGCTGCTGATAAGGGTGCCGCCGGTATAAGTATTGCTGCC
+CGCCAACGATGTAAACGCGCTGGGTACCGGCGACGTCACCGATAACGCCACGCTGGAGCTGAACAC
+NODE 1046 2636 187816 186747 0 0
+GGGCCTACGTTGCTGGTAAGTATGTCAAAGATGGCATAAATTCCGACAAACCCTATTCCGACAATTAACGATGAGCGAAGTGCTTTAGCGGGTTTTACTTTGAAGAACAATGCCAGGAAAAAAAGGACCAGCGGCAATAAAACCGTTGGGCCAAATCCCAGGACATATTGCACAACGGTATAGAGAGTATGTGCTATATCATTCATATCCGACCTCTTATTCAGATGTGACCAGACCTCGCGTTAGCGCCTGGGTAATTTATCTGTTTTTTATTTATGAAATCAGGCTTGGCCTTTAAGGATTGAAACTATTTTTTCAAGAACTTTATCTTCACCTACTCCGGTAATGATTGGCAGACCACTAACAACCGGAATATCCAGTTCATAAGGAACTTTCGTTGTTGATACAACCAAAGCTGCACCATCGGTATTGTTTGGCAATGAGGCTACATTAGTTTGGGAATAATTAACATCAAGCCCATTGTCTTTACAA [...]
+CCACGTTTGTGGTGGTGTTTATTGTGGGTTTTCGGGTGCTGACATCGGATACTCGCCGGGCGATTCGCCGCCTGAGCGAACGTCTGAATATTGATGTAGTGCCGATAGAATCGATGATTGATCAGATGGGTAAAACGGCGGGCGGTGAATTTTTACAGTATCTGCATCGCCCTGATGAGTCGCATTTGCAAAATGCCGCTCAGGTGTTACTGATCTGGCAAATGGTGATTGTCGATGGCGGCGATCAGAATTTGCAGCGGTGGCATCGCTTGCTGCAAAAAGCGCGTTTAGCCGCGCCGATCACCGACACACAGGTACGGCTGGCGCTGGGCTTTTTGCGCGAAATGGAACCCGATATGCAGGAGATCAACGCGTTTCAACTGCGCTATAACGCCTTTTTTCAGCCGGAAGAGGGTGTCCACTGGCTGCATTGATACTCTTCACTATCTCGTTAACAAAAGACGAGATGAATGAGGCTGGCAAGGGCGGAGA [...]
+NODE 1047 95 5230 5178 0 0
+ATGGTTTTTGGGGGCTTAATCGGGGCCTCACGGTTCGTTGAGTAAATGGAGCCCCCTCCTATGGCATTAACCGATACCGCTATCCGCAAGATCAA
+TTACTCAACGAACCGTGAGGCCCCGATTAAGCCCCCAAAAACCATGGATGTCAAAAAACCCGGTAAACCTTCTCAGGTCAACCGGGTAAAGATAA
+NODE 1048 15 668 668 0 0
+AGGAGGGGGCTCCAT
+ACCCACCGAGAAATC
+NODE 1049 309 16824 16178 0 0
+GCGGGAACAATCTCCCCTTGCTGGTATTTGAGCCATGATAACTTCCTGTTAATCACACAATCCGGGCTGGCGGTTAATGCGCCGGTATTACCATTGATCTCAAACCCCTGCACCTGACGCATCTGCGAAAAGTGGTTCGCCAGCGTCCAGGCATCCACGCCCATGGCGTACATCCGCGCCAGAGAATAGTCGTTATGTACAGCGCTCAGCGCCTGCTGCATCAACGGCATATTGCCGCCTGCCAGCATAGGAATTTCACTGTATTGTAAACCCTCCATTTCCAGACGGAAGTCGGGGCCGGAGGTGCCT
+GTGAAATTCCTATGCTGGCAGGCGGCAATATGCCGTTGATGCAGCAGGCGCTGAGCGCTGTACATAACGACTATTCTCTGGCGCGGATGTACGCCATGGGCGTGGATGCCTGGACGCTGGCGAACCACTTTTCGCAGATGCGTCAGGTGCAGGGGTTTGAGATCAATGGTAATACCGGCGCATTAACCGCCAGCCCGGATTGTGTGATTAACAGGAAGTTATCATGGCTCAAATACCAGCAAGGGGAGATTGTTCCCGCCAGCTAACGCGTAAACAGGCTGGCGACGCGTGGGAAGCTGCCGCGCGTCG
+NODE 1050 3234 164975 163808 0 0
+CCAGATGCTTCGTTTGCGGGCCAACAGGAAACGTTTCTTAACGTTCAGGGCTTCGATGCGGTACTGGTGGCAGTGAAACACGTATTTGCTTCTCTGTTTAACGATCGCGCCATCTCTTATCGCGTTCACCAGGGATATGATCATCGCGGCGTAGCGCTTTCCGCTGGCGTGCAGCGGATGGTTCGCTCCGATCTCGCCTCGTCAGGGGTGATGTTCTCTATCGATACCGAATCCGGCTTTGACCAGGTGGTCTTTATCACCTCGGCATGGGGACTGGGTGAAATGGTGGTGCAGGGCGCGGTTAACCCGGATGAATTTTATGTCCATAAGCCAACCCTGGCGGCAGGCCGTCCGGCCATCGTACGCCGCACCATGGGGTCGAAAAAAATCCGCATGGTTTACGCCGCCACCCAGGAGCACGGCAAGCAAGTGAAGATTGAAGATGTGCCGCAGGAACAGCGCGACATTTTCTCGCTCACCAACGAAGAAGTG [...]
+ATAAACTGGCGCCTGCCACCACAGCGCTTGCGCTTAGTCAAATCATCGACCGCAGCGAACCGTTGCAGTCAGACATTAACATTCACGGTGATGAACTGGCGGCAGTGCTGTTTACCTCCGGCACAGAAGGAATGCCGAAAGGGGTGATGTTGACCCACAATAATATTCTTGCCAGCGAACGGGCGTATTGCGCGCGGTTGAATTTAACCTGGCAAGATGTGTTCCTGATGCCTGCGCCACTGGGCCACGCCACCGGATTTTTACACGGCGTCACCGCGCCCTTTTTAATCGGGGCGCGTAGCGTATTGCTGGACATCTTTACCCCAGAAGCCTGCCTTACCTTATTAGCGCAGCAACGCTGTACCTGTATGTCAGGCGCGACGCCGTTTATTTACGATCTGCTTTGTGCCGTTGAGCAACAGCCTGCCGACCTCTCCTCACTGCGATTCTTCTTATGCGGCGGCACGACTATTCCCAAAAAGGTTGCCCGCG [...]
+NODE 1051 6427 337522 334609 0 0
+GGGATTCTGATAGCGTCCCTTCCTTCAATTTACACTCTATTTTCAATACTAAGATTGGCCTCATCAGGCCTGTTAAACGTCGACCCGACGGAAAAATGTTTATCGCAGGGCGTCCAGCCCTGCGAGCGTCAACATTTCTGCAAACGGAGTAAGGTTAGCCAATAAGTTTAAGATTTTTTATCACTCAATCATTTAACCGTTCCAGGCCTTAACCGGCCTACAAATACGCTTATTTAGCTAACCAGTCGAGTATCCCCTGCGCAGCATGTCGGCCTTCTGCCATCGCCGTCACCACCAAATCGGCGCCGCGCACCGCATCGCCGCCAGCGAAAATTTTCGGGTTGGACGTCTGGTAACGAAACTCGCTCTCGACGCTGGCGGCAATACGTCCCCAGTTATCCACCTTCACGCCATGCGATTCCAGCCACGACATACCATGCGGATGAAAACCAAACGCCATAATGACCGCATCTGCCGGCATCACGAACTCGC [...]
+CGGCCAGCTCAATGAGTTGATCTCGTGCGGCCATCAGCGCGTCATGGCCTGCTCCGGCGTGATCCTGTAATTCCATATCAAAACCGGCGGAGCTGCCCAGACCGCTAATTGCCGGCGGGCTGCTGGCGAAGACGCGAGCTTCTTTAATCTGGTTAAACGCTTTTGTCGCCCGCTCAATAATGGCGAACGAGGAGCCGGTGGTGGGATCGCGCGCGTCCCAGTCTTTCAAGCGAACAAACATGCGCGCGACGTTTTGCCCATTCCCGCCAGGGCCGGAACCTACCGTCGAGAAGACCGACATAATGTTGTCTTTCTCATGGGTGAAGTAATAGTTTTCAACCTTTTCAACGACTTTCAGGGTCTGCTGTTGCGTAGAACCGCTCGGTAGCTGGATAGACGTAGTGAACATGCCCCGATCTTCTTGCGGCAGAAAGGAGGTGGGGAGACGCAAAAACAGGAACACCATTCCGCCAAGCAACAGAACATAAATCA [...]
+NODE 1052 833 53243 53080 0 0
+GCGCCAGGGCCGGAAGTGGCGATACAAACACCGGTTTTGCCGGTAGAACGGGCATAACCGATTGCCGCCATTGCGGCCCCCTGCTCGTGTCGGCACAACAAATGCTCCACACCACCGTCATACAACGCGTCGTAAACTGGCATAATTGCGCCGCCAGGATAACCAAATACGGTTTTCACCCCCTGCGCTCGCAAAGCATGTACCACCCACTGTGCCCCGTTCATAGTTACATCCCCGTCGTAAATCTTGAGAAACAGAATTTTATGCTGTTATTCACGCTCTGCTCCTCGCTTAAGTTTTTCAGGCCAAAAAAAACCCCCGGACCTTTCGGTGCGGGGGTCTTAGTTCGTTAAGGCTTGATTTCTAAGCCTTTCCTCGTCCAAGTGCAGCCCCGCACGGTGGGATAATAATCACCACCACGCTAATCACGACCAGGCTAATCACTCGTAGAAGGGCTGTCATTTTTGTCTATTCTTGCATCTTGTTCGAAGG [...]
+ATAGAAGAGAAAATCGAATTACTGACTTTTTGTTTTTAGCGGCTGATTCCTGAATTTTGGCGTCATTTTCAGGTAAGAAGCATCAAACTGGAAGAACGCTCGCAGAAGCGAAAAGAAGGAAAACAGGGTGTAGAGTGCGCCAAAAGGGGGAGGAAAACGTGAAAATTTTTCAGTTGCTAATTTTTCTTATAAAAAACAAAGCACTTTTAGGCATTCACCTGCATTATCTGAAACGTGGTTAAAAAAATATCTTGTGCTATTGGCAAAACCTATGGTAACTCTTTAGGTATTCCTTCGAACAAGATGCAAGAATAGACAAAAATGACAGCCCTTCTACGAGTGATTAGCCTGGTCGTGATTAGCGTGGTGGTGATTATTATCCCACCGTGCGGGGCTGCACTTGGACGAGGAAAGGCTTAGAAATCAAGCCTTAACGAACTAAGACCCCCGCACCGAAAGGTCCGGGGGTTTTTTTTGGCCTGAAAAACTTAA [...]
+NODE 1053 14197 760501 754491 0 0
+CGTCTGCCAACGAATCCATCTGACCGGCAAAAAGAATTGTCCGCCACGGATTAATCCGGCAGCCAATAACGCGGCAAAAGCGATATGCAGGCCGGAAATCGCCATCAAATGGGCCGTCCCCGTATCGCGCATAACGGCCTTCACCTCCTGCGACACCGCTCCCCGCTCCCCCATTCCCAACGCCAGAATAACCTGCTGCCACGGATAAGGCGCAAGCGTAGCGCGAAGCGAAGCAAGATAGCGCGCACGCAAGCTACACTCAGGGTTAATCGCTTTAGCCTGTAGAAAACGCCCGGTCAACGGTTGATGCTGCGCCAGCGCGTAACGTTGGCTATCAAAAGCGCCTTCGTTAAGCTGTCCGTGTACCGCTCTGACCTTCAGCGTCATCGCCCACTGTTGTCCGGCACACACTTCCGTGGGTAAGTACTGGCCATGCAGGACAATCCCTACAGCAGGAAAGAGCGGCTTTCCGCGCAAATGGGTGATTCGCCC [...]
+TGGGTTACCGGGAAAGTAATGGGGAAGTCATATTTGAAATGGTTCATCCAACGCTTCTTTATCTGCTACGAGGGTATACGCCGTCATTAACCTTTACAGAAAGTAACACCGAACTGTTAACAGGAGTATTAAACAGAGATTATGACGACTATTATAATGATAAAGAAGAGATTGATTGCATTTTGGATAGAATATATAAGTCACATAATGGCACTTTATTTATAGGTAGCGGTACTATTAGCCGCAATATGCTTTTATAAAAATTAAAAAGGCCCCACTGACATGGAGCCTTTTTTGTACGCTTTTTATAGCGTAATTTCAGTCAAACCCATTACATGGTCTGCGTGAAGGTACGAGTAATAACGTCCTGCTGCTGTTCTTTCGTCAGGGAGTTAAAACGTACTGCGTAACCAGATACACGGATGGTCAGCTGCGGATATTTTTCCGGATGTTCCATCGCGTCCAGCAGCATTTCACGGTTCATGACGTTGA [...]
+NODE 1054 87 6586 6586 0 0
+TGGGCAAATCTGCACACCTTTGAGAGCAGATGTCACTACGGTTTTACGTGATGATGAAGGCATTCCGGATTCCGTTCCGGTACTTTT
+AGTGACATCTGCTCTCAAAGGTGTGCAGATTTGCCCATACATCAGGGATGTTTCCCTTCAGTACTCACAGCTCCTTTCAGGCTACGG
+NODE 1055 2605 191291 190602 0 0
+GATGGAACATTGGTGGTCGCCGGAGCGACAAGTTAGCGTCTAAAATATAATCATAAACAACATAAAACTTCAAGTTGTTGTCGTGGCTATGGTAATAACCTACAACTGACTGACAAGGCCAGCTCAATTTGATATTTTTTAATTCAGTAACACTCTTTATGAACCTGTTAGAGAGATGTGAAAATGAAATCGAAATACAAAAAATTAAAAGATGAACTACTCAGAATAGCCAAAGCATGCGCCCCGACGCCAGAAGATATGTTGGTATATACGGGAAGAGCCAGAAGACTTGCTTCATTTCTTAAAGATGCCAATATACAGATAAGCTCAGCAAATAGCATAAAACTACGTCATATTGAATGCTATTTTCAACAACGTTATCGCACTGGCGTCAGTTCCAAAATACTACGAGAAGAATTAGATACAATAAAGCATGTTCTCACCCATTGCGGAAAGAGAAACATCGTTAAAAATGAACGACTGACTTATACA [...]
+ATTTTTTCTCAGCAGACAGGCATAAAAACGCCTTTAAAATCTGCGTCTTAAGATATTTTCTGACTTTCCGCATGAGCTTCTTATGACTGTGCGCACGGCATAAGACCATTTGAAATTTGGTCGCTTGCGTGTGCATGTGGAGTTTGAAGCTGTGCGGCGTCACTTGCGTGCGACCGAAGGGAACACCAAGTGACGCCGCGGCCATCTGCCCTGAAGGCAGCATCACGTAAGGCCTGGCAGAAAATCGTCGCTCGTGACAAGCGTCCTGATAATCGTTTTGTCGCTCTGACAACGTCTTTCAGTGACGTATCCACGCCTTTCCGGCGCGTCCGTTTTCACACGGACGACCACGCCGGAATGTCTTTTTAAACTTCGTAATACATGAGAGGTAAGTGTATTAACTGACTGAAATAAAGGAATAAAAATGAAAAATCGTTCTGATGTCGGGAGGCGTCATCGTAAGGTGACGGGGAGTATTCCTCAACAATCGCC [...]
+NODE 1056 2348 136318 135220 0 0
+TCTCTTTTTTCATCAACAGCGGGCTTAACGTGCCATAAAATAAGCAAAATGCCGTTATTGCAACTGCAATCACACTTCCAGGTGGCATACTAATAACCAAACGAAAGAGAAAGGAAGAACATTCATGCCTTTAAGCGCACAACAATTAGCCGCACAGAAAAATCTATCCTATGTTCTGGCTGAAAAGCTGGCGCAGCGGATATTAAAGGGTGACTACGCCCCCGGTACGATTCTTCCCGGCGAAATAGAACTGGGCGAGCAGTACGGCGTAAGTCGAACGGCAGTTCGCGAAGCGGTGAAAACGTTGACGGCTAAAGGTATGGTGCTACCCCGTCCGCGCATTGGTACGCGGGTGATGCCGCAGGGAAACTGGAACTTTCTGGATCAAGAGCTGCTGACCTGGTGGATGACGGAAGAAAATTTTCATCAGGTGGTAGATCATTTTCTGGTGATGCGTATTAGCCTGGAGCCGCAAGCCTGCCTGCTGGCGGC [...]
+AGCCCGCCTTGCAACAACAGCGACTTCAGCTTACTCCGGTTTTGACGGAGCGTGGGTCGGTTTAGATTTATGCCGTTCTTTAATCAGATTGTTGCCGTCTTTGACTCTTAGCAGCATAAACATCAGCGCGGACACGATAGTGATCGCCCCCATCGTGATAAAGGTATAGTGGAACTGTTCCACGGTACTGGTGCCCGCAAAACCTTCATAAATACGTAACACCGCCGCGCTGATCGCCACGCCTAAACTGATAGACAATTGCTGCGTAACCGCCAGAACGCTGTTGCCGCTGCTGGCGTTATCGTCCGTCAGATCCGCAAGAGTAATCGTATTCATTGCCGTAAATTGAGTGGACATCGCCATTCCAAGAATGAATAGCGGCAGTACGAGCATCCAGATCGGCATGGCGGGAGATTGAAACGAAAACTGGGCAATCATCAGACCGATAAATACCGTAATGCCGACCAGAGTCTTCCGGTATCCCAAACGTCG [...]
+NODE 1057 414 16481 16423 0 0
+GTTGTTGAAATGCAGCGTGATAGTGGACACATCGTGACCCAGCACCAGCGTCTGTTCTTCGTTGCCTACGCGTACCGGAATCGGCCGATTCGCGTTGTCGCCGAAGGCTTTGGCGGTGATCACCAGATCAAACTTTTTCGGCAGCGGCGCTTTATATTCGATTTTAACCTCATCGCCCAACTGCGCATTTGACCAGCGCCCCCAGGACTCCGGCCGGGAAATGCCGCTAAACTGCTTCACCTCCTCCGGCGCGCCCGCCACATTAAAGATAAAGCTATCGGCTTTATAACGAATATCGTTATCGACAATCTTTAAGGTATCGACGTTGCCTTTGTAGCGTTCCATATCGATCATCGTGTCTTTAAACGCCGTCTTACCCTGCCACTGCGCTTTATCGACATGCTGTACGGTTTG
+TAAAGACACGATGATCGATATGGAACGCTACAAAGGCAACGTCGATACCTTAAAGATTGTCGATAACGATATTCGTTATAAAGCCGATAGCTTTATCTTTAATGTGGCGGGCGCGCCGGAGGAGGTGAAGCAGTTTAGCGGCATTTCCCGGCCGGAGTCCTGGGGGCGCTGGTCAAATGCGCAGTTGGGCGATGAGGTTAAAATCGAATATAAAGCGCCGCTGCCGAAAAAGTTTGATCTGGTGATCACCGCCAAAGCCTTCGGCGACAACGCGAATCGGCCGATTCCGGTACGCGTAGGCAACGAAGAACAGACGCTGGTGCTGGGTCACGATGTGTCCACTATCACGCTGCATTTCAACAACCCGACGGACGCGAATACCTTAGTCATTGCGCCGCCCGCTCCCGTCGCCAC
+NODE 1058 2898 167236 165606 0 0
+GCCATCGCTTCAGCGGCGGCGGTCGCTTCATCCAGCAGCGAGGCGGAAGCCATGTCCAGCCCTGTCAGGTCCAGCGTCACCTGTTGGAAGTTGAGCAGCGCTTCCAGACGCCCCTGAGAGACTTCCGGCTGATAAGGAGTGTAGGCGGTATACCAACCCGGATTTTCCAGCATGTTGCGCAGGATAACCGGCGGTAGCTGCACGGCGGTGTAGCCCATGCCAATATAGGACGTGAAGCGCTTGTTACGCCCGGCGATGGCTTTTAATTCCGCCAGTGCGGCATATTCGGTTGCCGCCTCGCCAACCTGCGGCGGAGTCGCGAGCTGAATGTCTTTCGGCACAATCTGACCTGTCAGCGCGTTTAACGACTCGGCGCCAACCGCATTCAGCATCTCTTGCTGCTGCGCGGCGTCCGGTCCGATGTGGCGTTCAATGAAAGCGCCGCGGTTTTCAAGCTGGCTTAACGTCTGTGTCATGGGCGATGGTTCCTGA [...]
+AGCGCCAGGGCAAAGACATTGGTCAACATCTTTATCTCCGTCGTTATGAGCGTAGCCGTAAACATAGCGCGGCGATGATGCTTGCCGGGATGCAAGGTTTTCGTGACCTGTTTGCCGGCGAAAACCCGGCAAAAAAATTGCTGCGCGACATCGGGCTGAAACTGGCGGATACGCTCCCCGGCGTCAAACCCCAACTGCTTCGCCAGGCAATGGGGCTAAACGACCTTCCGCAATGGCTTCGTTAAGCGTCTGACTGCACGCCAGCAAGAGTTTGAAACCCGTCACACTTTGCTTTCCCGGCTATCGCGCCGGGGGGGCTTTCCTCGTTTGAAATAATCTAATTTCACCGCCTATTTCGCATTATATTTTCTAATGCCACTATTTTTAGCGAACGCGATTTTCGACATTTTTTCCGCATTTAATATTAATTTATGTTGTGATAAATCGTATCAGCTTCCTTTTTATGACGGTTATTTAGCGTAATAGTGGTTT [...]
+NODE 1059 647 34298 34298 0 0
+TTTCAGGTATTGCGTCCTGATGTACTCCTGAAGCGTTCTCAGTGCTGTTTGGTCACTGATGATTCCGTCCCGGATACCGAGAACGTTTCGTCCAGCAACTGGAGAGAGTTCGACGGTGGCATCATTGCCCATGCCGGAGGCGCTGGAGGTTTCGGCTGAGGATGGCACAGAACATTTGCCTTTGACGAGCACCCGACCACCATTATCAAGCTTGCGCCGAAGAGCATCATTTTCAGCTTTCGCATCAGCTAACTCCTTCGTGTATTTAGCATCGAGTGCATCAGCATCAAGCTGGCGCTGCTGCATGTCAGTAATGGTGGCGTTCGCCTTCTCCAGTTCACTGGCCTTGTTATCGCGCTGCTCTTTGTAGGCGATGGCGTTATCACGGTAATGATTAACAGCCCACCCCATTGAAACCAGCAGGCAAATAACCACAGCGCAGATGATTGCGGTTAACCGACTCATGACATCAACACCCCAACGGCCAGAATC [...]
+GCCGTGAGATTGAGCGTGAAGTCTGTTTGTGGGGGCAGCAATGAGCATGATTTGCTTTTTCATGGCAGCGTTGCTCGCATTCAATGGCAACGATGCGTGGCCGTGGATTCTGGCCGTTGGGGTGTTGATGTCATGAGTCGGTTAACCGCAATCATCTGCGCTGTGGTTATTTGCCTGCTGGTTTCAATGGGGTGGGCTGTTAATCATTACCGTGATAACGCCATCGCCTACAAAGAGCAGCGCGATAACAAGGCCAGTGAACTGGAGAAGGCGAACGCCACCATTACTGACATGCAGCAGCGCCAGCTTGATGCTGATGCACTCGATGCTAAATACACGAAGGAGTTAGCTGATGCGAAAGCTGAAAATGATGCTCTTCGGCGCAAGCTTGATAATGGTGGTCGGGTGCTCGTCAAAGGCAAATGTTCTGTGCCATCCTCAGCCGAAACCTCCAGCGCCTCCGGCATGGGCAATGATGCCACCGTCGAACTC [...]
+NODE 1060 14 1180 863 0 0
+CGGCGACGGCACGC
+GTAAAGTCACCGCC
+NODE 1061 45 4007 1919 0 0
+TCACGCTTTCCGGCAGCAATACTTATACCGGCGGCACCCTTATCA
+CCGTCGCCGGATTTTTCCACGCGGCCCGTACCGCCGATGTTGTTG
+NODE 1062 1629 85384 84917 0 0
+AATACCCGGTGTTTTTTTACGTTTCAAAGTTGAGATAAAACCAGCTAATATAAGGGCGATTAACTATCAGTAGCGTTATCCCTATTCTGGAGATATTCCTTTGATCAACGTTCTTCTTGTTGATGACCACGAACTGGTGCGCGCAGGGATACGACGCATTCTTGAAGATATAAAGGGCATTAAAGTTGTCGGTGAAGCGTGCTGCGGAGAGGATGCGGTAAAATGGTGCCGTACTAACGCCGTTGACGTCGTGCTGATGGATATGAACATGCCCGGTATTGGCGGCCTTGAGGCGACGCGTAAAATTGCCCGATCGACAGCGGATATCAAAGTGATCATGCTGACCGTCCATACGGAGAACCCGTTGCCCGCCAAAGTGATGCAGGCTGGCGCAGCTGGCTATCTCAGCAAAGGCGCTGCGCCTCAGGAGGTGGTGAGCGCTATTCGTTCGGTGTATTCCGGACAACGTTATATCGCCTCCGATATCGCTCA [...]
+CCTTACCCTGGCGAATAAACAGCACATGCACACAGGCCATACCCGCATCAAAAGCCACGCCGATCACGTCGAGATCGTCGCCCGCATTGGAGACAAACTGTCTCTCCGTGACCCGGCGTACCGCCTGGATCTGATCGCGAATACGCGCCGCCTCTTCAAATGCCAGATCCTGGCTGGCCTTTTCCATCCGGGCAATCAGCTGTGTTAAGACCTGGTCGTCCTTACCGGACAAAAACAACCGGACATACTCCACCTGTTGCGCATACTCCTCCTCGCTGACCAGTCCTGCAACGCAGGGGCCTAAACAGCGGCCAATCTGATATTGCAGGCAAGGACGCGAGCGGTTGCGATACACGCTGTTTTCGCACTGGCGGATAGGGAAAATTTTCTGTAACAGCGCCAGCGTTTCCCGAACGGCATAGCCATTAGGAAATGGACCGAAGTACTCGCCTTTCGCATGTTTGGCGCCACGGTGCATCGCCAGACGCGGAT [...]
+NODE 1063 5835 281101 276918 0 0
+TCATCGAGTTCGATCTGCCGTTGCTGGAAGAAAAAGCCAAGTCTACCCTGACTCCGGTTGTTATCTCCAACATGGATGAAATCAAAGAACTGATCAAACTGTCCGGTAGCGTGACCGTGGGTGAAACTCCGGTTATCCGCATTAAGAAGTAATTCTTGCCGCAGTGAAGAATGGCGCCTTTGGGCGCCATTTTTTTTGCCTGTACTTGCGCCGCCATCCGGCGATGGTGCGGCGTACTGCCTGATGGCGCTACGCTTATCAGGCCTACAAGGTTGCGAACATTTCAGCGCCAATCCACGGGCTACAACTGCGAGGTCACCGGGCGAAAGCACTTCTCGCGCATCAGGATCTTCATCCCATCCGGGCCACTCTCCAGCATCCTGCGTTCGGAATCGGACACTTGCAACTCGCACTGATAGCCGCCAGTGATGCCAAACATCGCCCGCGCTACGCAAATATCTTCCAGCGCGTCCAGCCCGCTCGTTTCAAAAT [...]
+AGGATGTTCCGGTTCGCGGCGAGCGTTTGTTTGTTGGACTGCAAAAAGCGCGTCTGTATAACGGCGACCAGCGTATTGAAACGCGTGAAGAGGAACTTGCTCTGGCGCAATCGGCCTGATAGGTTAATTTGTATAGTTATCGCCCGGTGGCGCTTCGCTTACCGGGCCTACAGCGTATATCGTGATTTTGTAGGCCGGGTAAGCACAGCGCCACCCGGCATTTTTATTGAGCTGAAAACGTGAATACATTAGAACAAACCATCGGCAATACGCCGCTGGTCAAATTACAACGTCTGGCGCCGGATAACGGCAGTGAAATCTGGGTTAAGCTGGAAGGCAATAATCCGGCAGGATCGGTGAAAGATCGCGCGGCGCTATCGATGATTGTCGAGGCGGAAAAGCGCGGGGAAATTAAACCGGGCGATGTCCTGATTGAAGCGACCAGCGGCAACACTGGCATTGCGCTGGCGATGATCGCCGCGCTGAAAGGTT [...]
+NODE 1064 13 1105 1105 0 0
+AACGATTACAGAA
+TAGGAGATCGCCA
+NODE 1065 1422 86050 85470 0 0
+GGCAAACTCGCCCGCTTTTACGTCGCCGAGATCGAGCGCAATTTCAATCCTGCTGCCGTCAACGTCCAGACACCATTTTTCCCGGTAAAAATCGGTACTGAACAGCGGCTGTACGTTTGATGCCAGGCCAGCGGGCAGGTTGCCATCAGGCCAGACCTCCGCCGGAAGTTGCGTCAGATCCAGCACGGGTTCGCTTAGCGCGACATTGTATTCGGGTCGCTGGTGCAGCCCGCCCGTTACCCGGCCGGCAATTTTCATGGTCATTTCATAGCGCCCATTTTCACCACGAATACGCAGCCCCATATCATGGCGGCGTAGCCAGTTATCAGGCGTTTCGAAGTAGATATTCAGCAACTGGCTGGGCGCATGATGCTCGCCGCCGAGCGTATGAAGATGATTTCGCAGCGCATCTACGGCGTCGTGATTGACGATAAACTTTAATTCGATTTCCTGAGCCATGGCCTTGTACTTATGGGTTATGTCACATCTGGG [...]
+TTTCCTTTTAAAAACGATCATCCTCTAATGATAAGACAGTGCCGCAGAGAAGGCGATTTAGTTCATCCAGCGGTCTTTGCGTTTACGGCTTGGGATCATATGCGGCAGCACCAGCCCTAACAGCAAGCCAATACCCAATACGCCGCCGCCATACATAAACCACTGCATAATAATGGTGCGCTGTTTGTCATCCAGTTGCAGATTCGCGGCACTAACTTTTTTCTGCGCGACAATCAGCTCGTTTTTCAGCTTCTGGTTCTCTTCTTTTAGCCCGTTGATGACGCTGTCGCTTTGCGCCACTTTCTGCTGCATATCGGCGGTGCGCTGATTCCACGTGGTATCAATATTGTTGAGTTTATCGGTTAACGTTTTGACCTGATTTTCCAGATCCGGCACGCGGGTACGCAGGCTTGGTGTGGTATTCAGTTCTTTTAACGGTATCCAGGCAGTACGACCAGAACTGTCTTTAATTTGACCATAGTTGGCATCGCT [...]
+NODE 1066 4 1658 1617 0 0
+GAGA
+CCTG
+NODE 1067 1830 110381 109725 0 0
+ATCCTGATAAATTAAAGAAAGAGCGGGGTCCTTTTTCTTTAATGCTGCTAACGTTTCTTGCAAAATGCGTTGATGAGATTCATCCAGTACACCACTGATAACAAAAGAGCGCCGCATTGGCGTAACATTGACAAGGCCCACTAAACCGTTCTCTATTATCGCAGAAATAATATCATCCCCCTGAGACTGATGAGAATGACTAATCTGCCAGTGCAATAACCCGGGAATATCTGCAAGTAATGGTTGAACCTTACGCCATTGCTGATCCATTTGTATATCATCATGAATTAACACGCTTCCCGGCCCTTCGCTGGATACTTCAGCATGCGGGTAACCCATTTTTATCAAAACATCCTGCACTTCTCGTATCAATAAGTCATCACAGATTACACCATCCCGATACATGACCCCCCATGATTCGAGAGTCGCTCTCACCTTTTGCATCTGTTCGCTTGACGCGCAATAACCGGACAACTGCAGGCTTCCATCTTC [...]
+TTGCCCATGTTTGCTGCCGACCCACGCCAGAATGCAGTGATCGTTCGTGATTATGCGGCCAATATGGCCGGGTATCGGAAACTCATCACAGAATTAGATCAACGCCAGCAGATGATAGAGATTTCGGTGAAAATTATCGATGTTAATGCTGGAGATATTAACCAGTTAGGCATCGACTGGGGAACGGCAGTGTCGCTGGGTGGCAAGAAAATTGCGTTCAATACAGGTTTGAATGACGGCGGTGCTAGCGGTTTTTCAACGGTAATCAGCGATACCTCAAACTTTATGGTGCGTTTGAATGCCCTGGAAAAAAGCTCTCAGGCTTATGTACTTTCCCAGCCATCTGTGGTGACTTTAAATAATATCCAGGCTGTGCTGGATAAAAATATTACTTTCTATACCAAACTGCAGGGAGAAAAAGTGGCTAAACTTGAATCCATCACTACGGGTTCTTTGTTGCGCGTTACACCTCGCTTGTTAAATGACAATGGC [...]
+NODE 1068 3772 192642 191490 0 0
+CGTCTGGCGCAGGAAAAACGTCCTGACCTGATGATCGACGGTCCGTTGCAGTACGACGCCGCGGTCATGGCTGACGTAGCGAAATCCAAAGCGCCGAACTCGCCGGTTGCGGGTCGCGCTACCGTGTTCATTTTCCCGGATCTGAACACCGGTAACACCACCTACAAAGCGGTACAGCGTTCTGCCGACCTGATCTCCATCGGGCCGATGCTGCAGGGTATGCGCAAGCCGGTGAACGACCTGTCCCGTGGCGCGCTGGTTGACGATATCGTCTATACCATCGCCCTGACGGCAATTCAGGCTTCTCAGCAGCAGCAGTAACAGTAAAAGCCAATGCCGGATGGCGGCGTGAACGCCTTGTCCGGCCTACAGGTGAAATACCGTTGTAGGCCGGATAAGACGCGTTAGCATCGCCATCCGGCATTCTGCTATTTACCCTGCAAAGCGGAATTTTTTGCTTAACTGCGCTGCATCAATGAATAACTATTCCCT [...]
+GACTGGCCGGAACGCGATTACTTCGTACTGTCGAAAGGCCATGCGGGCCCCGCGTTGTACAGTACCCTGGCGATTAAAGGCTATTTCCCGCGCGAAGAGCTGAATACGCTTAACCAGAACGGCACCCGTCTTCCCAGCCATCCGGATCGGCTAAAAACGCGCGGCGTGGACGCCACGACCGGCTCACTGGGACAGGGCATCTCTATTGCGGGCGGAATGGCGTTGTCGCATAAACTGGCGCGGCGACCCAACCGGGTATTTTGCATTGTCGGCGATGGCGAGCTCAATGAAGGGCAGTGCTGGGAGGCGTTTCAGTTTATTGCCCACCACCGCCTGAATAATCTGACCGTTTTCATTGACTGGAATAAACAGCAGCTTGACGGCGAACTGGAGGAGATTATCAATCCGTTCGATCTGGAAGGGAAATTCCGTGCGTTTGGTTTCGATGTCGTCACCGTCAAAGGCGATGATATCGCCGGACTACTGGCGGTG [...]
+NODE 1069 51 3777 3777 0 0
+TTAACGATTGCGTGAAAATTAGCCATTGCAATGCCAGCGCAAAACAGTATC
+ACCTGCCTGGCTTACTGACGAAGATGGGCGTAAAATATCGCCGTTTTTCTA
+NODE 1070 17 8176 3239 0 0
+ACTTTCGTTGTTCTGTG
+TGATGAATCGCGAGAAA
+NODE 1071 23 11555 9500 0 0
+TTTCAATTTTCAGCTTGATCCAG
+TCTCTCAAATTTTCGCAACACGA
+NODE 1072 13 6084 3162 0 0
+ATTTTTAAAGAGC
+AGTTGTTCGTGAG
+NODE 1073 3 1545 1407 0 0
+AAA
+GAA
+NODE 1074 36 9759 9726 0 0
+TATCTCAAACGTGACTCGTAAGTCAGTTTTGAGATA
+ATCTGGATCAAGCTGAAAATTGAAACACAGAACAAC
+NODE 1075 16 989 989 0 0
+CGCCCTTTCACGGCGG
+ATTGCTTATCACGCGC
+NODE 1076 49 2176 2176 0 0
+CGAGCCGGGGCCGCATTTCGGTCTTGGCCTTGAGGCTTACGCCACCTGG
+TGCTGATTTCCGCAAAAGACTGGAAGCGACGAATGCGGCTGTCAAGGAA
+NODE 1077 235 11011 11011 0 0
+CGGTTCGGCGATTACCTGGAAATACCCGAGCTGTATTCTGCGTGGTGATAATTCTATCGGCGAGTTCTATTCCGTTGCGCTGACCAGTGGACATCAGCAGGCTGACACCGGCACCAAAATGATCCATATCGGTAAAAACACGCGCTCAACCATTATCTCAAAAGGCATTTCCGCCGGCTACAGCCAGAACAGCTACCGTGGGCTGGTAAAAATTATGCCGACGGCAACCAACGCC
+GGCTGTAGCCGGCGGAAATGCCTTTTGAGATAATGGTTGAGCGCGTGTTTTTACCGATATGGATCATTTTGGTGCCGGTGTCAGCCTGCTGATGTCCACTGGTCAGCGCAACGGAATAGAACTCGCCGATAGAATTATCACCACGCAGAATACAGCTCGGGTATTTCCAGGTAATCGCCGAACCGGTTTCCGACTGGGTCCACGACATCTTGCTGTTTTCCCCTTCGCACAACGC
+NODE 1078 2733 128366 127128 0 0
+GCGGCGCGCGTCCCGATCTTCTTGATATTGCCTGCCGTGATGCGCGATAGCCGTGCGTAAACGCTGCTGCTGCACATAACGATCTTCGCGACGTAATTCAGCGTCATCGCTCAAGGCAATCAGCAATTCATTCATATGGGCAATTACGCTCTCCGCGATGGCGGCATCCACGCGGGCACTCACTTCCTCCAGGTGCGACATAAGCTCTCCTACTCTTTATTCTGTAACAGCATGATTCGCCTATTATACGCGTTATTGTCGCCCGATGCGGTAATTCGCCGCCGCCACCCTGATTTAACTTACGTCAAGTGGAAACACGGGGCTTAATAGACCGAGAATTCGCGCCTTTTTGCCTTTCTTCCGCCGTTTGCTTGCGTATAGACCCCGTAAAGTAGACGCGTGAAGAAGTCTAAGGGATAACAACGTGGCAAAATCTCTCTTGCGCAGCGGCAATCTGGATGATTATCAGGCCGTGGGCGGCGGCGGTCAGGC [...]
+GAAAAGTGTTGCTTGCCAAAGCGCGCTTCCGAGAATTCTACCCGGCTGGTAAATAAAGGGTCGTTCAGATACTGCGGCTCGCTTAAAGAACGCACCTGAAGCTCTGCCGTCTGGCGTAACCCGTCATTCGCATCGCCATGATCCTCGATCAAGACGCCGCAGGTATGCGTATTGCCGACATCCAGAATCAGATCGACCGGGATTGCGGGCGTGCTTAACGTATGTGTCACAAACTTTACTTCCGGCACCGTAAGCTGTTCGCCTAACAGCGTCAGTAAATTCAACCAGTGCGCCTGATACTCAAAGCTACGCAGCGCTTGTTGTATGGCCTGTTCCGAACGGTTTTCCACCTGTGAGGCATACTGAAGAAACGACTCGCGCAGCCAGCCGTCAATCCATGTCTGGTCAAGGAAATCGGCAACTTCTTCATCGCGCCAGGCGAGCGCAAAACGTGTGCCATTGAGCAGATCGTTTTCGCAAGGCGCCAACGCC [...]
+NODE 1079 6289 343102 339869 0 0
+GCTGATAACAAGCAGGCGATTAAGCCAGTTTGTTGATCTGTGCAGTCAGGTTAGCTTTATGACGTGCAGCTTTGTTTTTGTGGATCAGACCTTTAGCAGCCTGACGGTCCACGATCGGTTGCATTTCGTTAAATGCTTTCAGTGCAGCAGCTTTGTCGCCAGCTTCGATAGCTGCGTATACTTTCTTGATGAAAGTACGCATCATAGAGCGACGGCTTGCGTTGTGCTTACGAGCCTTTTCAGACTGAACGGCGCGCTTCTTAGCTGATTTGATATTAGCCAAGGTCCAACTCCCAAATGTGTTCTATATGGACAATTCAAAGGCCGAGGAATATGCCCTTTTAGCCTTCTTTTGTCAATGGATTTGTGCAAATAAGCGCCGTTTAAATTGCAGCACTCGTTGCGTAGTGATGGCGCAGGATTCTACCAGCTTGCGTGCTGTGAATACAGCCTTTCCATGAGAAAAATTGCATTAAGCGGCGGGTTTTGGGG [...]
+GAGTTAGAAGAGTTTTTCGAGCCGACCACCAGCACCACGTCAGCCTGCTCCGCCAGCGCCCGCACCGCTTCCTGACGATTAGTAGTGGCATAGCAAATATCGTCTTTGCGCGGGCCGACGATTTTCGGAAAGCGTTTACGCAGCGCATCAATCACATCGGACGTATCGTCCACGGAAAGCGTGGTTTGCGTCATGAAGGAGAGCTTGCCTTCATTTTTGACATTCAGCGTCCAGACGTCCTCTGGCGACTCAACCAGGTACATCCCCCCTTCCGGGTTGCTGTACTGACCCATGGTGCCTTCCACTTCCGGGTGCCCGGCGTGGCCGATGAGAATAGATTCTTCACCGCGACGGCTGGCGCGCGCCACTTCCATATGGACTTTCGTCACCAGCGGGCAGGTGGCGTCAAAAACGGTAAGATCGCGGCTTTTCGCCTCGTTACGCACCGCCTGGGAAACCCCATGAGCGGAGAAAATCAGAATGGCGCCATCC [...]
+NODE 1080 5774 275569 272420 0 0
+CGTCAGACCAAACTGTACGCAGGCCATATTCATCGCCAGATGCAAACTGCAAAACGGGCTGGTGCCGGGATTGAAATCGCTGGCGACGGCGACAGGCACCTGATAGCGGCGCAGCAGTTCCACCGGCGGGCGCTGCGTCTCGCGCAGAAAATAAAACGCGCCGGGCAATAATACGCCGACAGTACCGCCGTCACGCATCGCCGCGACGCCCGCTTCATCAAGATATTCGATATGATCCGCCGATAAGCCCTGATAACGGCTCACCAACTGCGCGCCGCCCAACAGCGAAAGCTGCTCAACATGGCCTTTAACGGGAATACCTAACGCCTTCGCCGTCTGCAACACGCGCTCACTCTGCGCCACATTAAAACCGACGCTCTCGCAAAAGAGGTCTACCGCATCAAATAACCCTTTTTGCCAGAGCTGCGGAATCATCGTCTCGCAGACCAGAGTGATGTAGCCGTCCGGGTCGTCACGATACTCCGCTGGCGT [...]
+GGGCGCTAACCATGCTGGAGCTTAATTTTTCCCAGACGCTGGGAACGCACTGTTTAACCCTCAACGAAACGCTGCCAGCCAGTGGGATCACGGCTATCTTTGGCGTCTCCGGCGCGGGAAAAACCTCGCTGATTAATGCCATCAGCGGTTTGACTCGCCCGCAAAAAGGACGCATCGCGCTGAATGGCCGGGTGTTGCATGACGCGGAAAACGGTATCTGTTTAACGCCGGAAAAGCGCCGCATCGGTTATGTTTTCCAGGATGCGCGCCTGTTCCCCCATTACAAAGTACGCGGCAATTTGCGCTACGGCATGGCGAAAAGCATGACCGGTCAGTTTGATAAGCTGGTGTCGCTGCTGGGAATTGAAGCGTTGCTTGATCGCCTGCCGGGGAGCTTGTCCGGCGGAGAAAAACAGCGTGTAGCGATAGGCCGGGCATTGCTCACCGCCCCGGAGTTGCTGCTGTTGGACGAACCGTTGGCCTCGCTGGATA [...]
+NODE 1081 585 24600 24443 0 0
+TCGCGCTGAGAATAAACGGGGACCCTGTTAGCCACGCAAAAAAGCTGGCGGAACAGGCGGCATAAATCAGCACATTACCGCGATAGGTTTTAGAGCGTAACAACGTCGCGAAAGTGAGTTTATCCTGTCCTTCGGTACGCGCTTTTACCGATGGTTTTAAGCGCAGCGCCGGCAACATCAGCAACAACGTAATCACGAACAGGGTGGCGAAAATCGCCTGCCATGAGAAATGCGTCAGTATCCAGCTTCCCAGTAAGGGCGCAAGCGCCGGGGATAATCCCACCAGTGGCATGATAGTGGCGAAGATACGGTTAATTTTTTGCGAAGGATAATAATCGGTCACCAGCGCTTGCCAGATTACCGTTGCCGCACAAACGCCGACGGCCTGCACAAAGCGCAGCGTCAGCAGTGCTGCCGCGCTTTCTACCCACAGCATCCCCAGACTTCCGAGCGCAAAGATAGATAACCCCAGCAGTAAAATCGGTTTACGGC [...]
+GCCGTCGCGCAACTACTTTGGGGACCGCTATCGGATCGTTATGGCCGTAAACCGATTTTACTGCTGGGGTTATCTATCTTTGCGCTCGGAAGTCTGGGGATGCTGTGGGTAGAAAGCGCGGCAGCACTGCTGACGCTGCGCTTTGTGCAGGCCGTCGGCGTTTGTGCGGCAACGGTAATCTGGCAAGCGCTGGTGACCGATTATTATCCTTCGCAAAAAATTAACCGTATCTTCGCCACTATCATGCCACTGGTGGGATTATCCCCGGCGCTTGCGCCCTTACTGGGAAGCTGGATACTGACGCATTTCTCATGGCAGGCGATTTTCGCCACCCTGTTCGTGATTACGTTGTTGCTGATGTTGCCGGCGCTGCGCTTAAAACCATCGGTAAAAGCGCGTACCGAAGGACAGGATAAACTCACTTTCGCGACGTTGTTACGCTCTAAAACCTATCGCGGTAATGTGCTGATTTATGCCGCCTGTTCCGCCAGC [...]
+NODE 1082 43 4944 4913 0 0
+CCGGGATGGCGGAGATGGCCCTGCTGAAGGCTATCGAGGCGGG
+GTGACAGTGCAGGTGCAGGCGCACCTCAAAACGTTTTTTGATT
+NODE 1083 51 308 308 0 0
+GGTTGACGGCGTGGACACGGCAATTTCCTCCATGAGCGCCACCTACGGCCA
+CCCCGCCTCGATAGCCTTCAGCAGGGCCATCTCCGCCATCCCGGTGGTGGC
+NODE 1084 12 1670 1291 0 0
+CGCCACCAGCGC
+CCTGAAGCTGGA
+NODE 1085 50 1002 1002 0 0
+GTGGCCTGTGAGGAACGCCTTCGGGTGGCCCATGTCGCTCCGGCGACCAC
+ATGGAACATTGGTGGTCGCCGGAGCGACATGGGCCACCCGAAGGCGTTCC
+NODE 1086 1914 100695 99559 0 0
+GCCGCCAGTGGTCACTAAAGGAACCTTATATCGGCGACAGTACGCAATCAGAGCGGCTTTTGGACGAACGCTGTCAATGGCGTCAATGACATAGGTAAAACCCGCGTCCATATAACCCGCCACATTATCCGGCGTGATGAAATCATCGATAACCGTTACCCGGCACTCCGGGTTAATTTGCCGAATCCGTTCGGCCATCACTTCCGCTTTCGCCAACCCGACGTTATCACGCAACGCATGGATCTGACGGTTCGTATTGGTCACGCAGACATCGTCCATATCAATCAGCGTAATCGCACCGATGCCCGTACGCGCCAGCGCCTCTGCCGCCCATGATCCCACCCCGCCGATTCCCACGACGCAGATATGCGCCTCAGCAAACCGCTGCAGCGCTTTTTCACCGTACAGACGCGCGGTGCCGCCAAAGCGTTGGCGCCAGGCATCACTTATCACCACTGACATATGACCTCAGAATAAAAAAAGGCGAGGTTA [...]
+CACTATACTCCGCTGAGCTTTTGTTGCAACCCTTTTTTCATATAAATCGCTAATTTCTCATGAATTGCGCAAATACACCGCAGATAGCGCGATTTTTAAACGAATTTACATAATGAGATCGCGATCGCATTTCATTACTCCGGACGGTTTGTTATCTTCACCGGGCACTTTCGATTACGCAGAAGACGAGACACCATGAAAGGACGTTGGGCAAAATATGTGGCGACAGGCGTAATGCTGGCAATGCTGGCTGCCTGTTCATCAAAACCGACCGATCGCGGTCAGCAATATAAGGACGGGAAATTTACCCAGCCCTTCTCCCTGGTAAACCAGCCGGACGCGGTGGGCGCGCCGATTAATGCTGGTGACTTTGCCGAGCAGGTCAACCAGATCCGTTCCGCGTCGCCGCGTTTATACACCAATCAAAGCAACGTCTATAACGCTGTCCAGAACTGGTTACGTTCCGGAGGCGATACGCGCACTATGCGCCAG [...]
+NODE 1087 1626 79815 78631 0 0
+TTCCAGATTGAAGCTTTGCAGGCTCAGCGAAGTCTGCCAGGTGTTGGTGTTCACCATAAAGACCGGCAGACCGGTGGCGAATGCGCGTTCGCACAGTTTAGAAATGCGTGCGTCCATTTCATAGCCGCCGGTCAGCAACAGAGCGCCGATTTCTACGCCGTTCATCGCGGCCAGGCAAGCTGCGACCAGTACGTCCGGACGGTCAGCGGAGGTCACTAACAACGATCCTGCGCGGAAATGTTCCAGCATATGCGGAATACTACGCGCGCAGAACGTAACGGATTTAACGCGGCGGGTTTTGATATCGCCTTCGTTAATGATGGTGGCGTTCAGGTGACGCGCCATATCGATAGCGCGGGTCGCAATCAGGTCGAAGCTCCACGGCACCGCGCCCAGAACCGGCAGCGGGCTGGATTCCTGCAGTTTAGCAGGATCGATTTTGATCACCTGCGCTTTGGAAGAGTCGTCAAAGATCTCCGACAGATCCGGGCG [...]
+GCGATTATCTTCCACCTGCACGACACTCTGGGCATGAGCGTAGATCAGATCAACAAAATGCTGACCAAAGAGTCCGGTCTGCTGGGTCTGACTGAAGTGACCAGCGACTGCCGTTATGTTGAAGACAACTACGCCACCAAAGAAGACGCAAAACGTGCGATGGACGTTTACTGCCACCGCCTGGCGAAGTACATCGGTTCTTACACCGCTCTGATGGACGGTCGTCTGGATGCAGTCGTGTTCACCGGCGGTATCGGTGAAAACGCCGCGATGGTTCGCGAACTGTCTCTGGGCAAACTGGGCGTACTGGGCTTTGAAGTCGACCACGAACGTAACCTGGCGGCCCGCTTCGGCAAATCTGGTTTCATCAACAAAGAAGGTACCCGTCCGGCGGTGGTGATCCCAACCAACGAAGAACTGGTTATCGCGCAGGACGCGAGCCGTCTGACTGCCTGATTTCACACCGCCAGCCTCGCTGGCGGTGCTGTTTTG [...]
+NODE 1088 18 2880 2820 0 0
+CGCGCTGTCCGTGTCCAA
+ATTTTGAGCACTGCCCAG
+NODE 1089 24 9545 3825 0 0
+CAGTGATAAACTGGAGGAAGGTGG
+ATCGCTGGCAACAAAGGATAAGGG
+NODE 1090 5 1899 737 0 0
+GGATG
+ACCTA
+NODE 1091 8 300 260 0 0
+TTAGTCAC
+ACGCCCGC
+NODE 1092 153 6267 5789 0 0
+CAGCAGGGCGACCGCTTTCGCCGCGTCCAGCACCGAACCGCCGCCAAAGGCCACTACGCCGTCGCACGCCGCCTCACGCAGTTGCGCCACCGCCGCGCAGACGTCGGTGATGCACGGCTCGCCTGGCGGACACGGCCAGACCGTCATCGCCAC
+CGTCTGCGCGGCGGTGGCGCAACTGCGTGAGGCGGCGTGCGACGGCGTAGTGGCCTTTGGCGGCGGTTCGGTGCTGGACGCGGCGAAAGCGGTCGCCCTGCTGGTGACTAACCCTGACCAGACGCTGAGCGCCATGACCGATCGCAGCACATT
+NODE 1093 51 2379 2275 0 0
+ACCCGTTCAAAGCACCGCAACCCCGCCAAAAGCGGAGCCGGAGAAACCTAA
+TTCAACAGGGGATCTGCTTAGCATGGAACAACCGCCCAGCATGAGTGCCAA
+NODE 1094 323 18444 17783 0 0
+AGCGCCGCGTGCCGCTCCCGTCAGGATTTACACCAATGCTGAAGACTTAGTCGGCAAACCTTTCCGCGATCTTGGCGAGGTTAGCGGCGAATCCTGCCAGGCGACAAATCAAGACTCTCCGCCTAACATTCCAACTGCGCGCAAGCGTATGCAGATTAATGCATCTAAAATGAAAGCCAACGCCGTCCTGCTGCACAGCTGTGAAATTACCAGCGGCACGCCAGGCTGCTATCGTCAGGCGGTTTGTATCGGGTCCGCCCTGAATATTTCGGCGAAATGAGCAGCTTTCAGTTTGAACAAATCGGCGTTATTCGCTCCCCCTA
+GCCGAAATATTCAGGGCGGACCCGATACAAACCGCCTGACGATAGCAGCCTGGCGTGCCGCTGGTAATTTCACAGCTGTGCAGCAGGACGGCGTTGGCTTTCATTTTAGATGCATTAATCTGCATACGCTTGCGCGCAGTTGGAATGTTAGGCGGAGAGTCTTGATTTGTCGCCTGGCAGGATTCGCCGCTAACCTCGCCAAGATCGCGGAAAGGTTTGCCGACTAAGTCTTCAGCATTGGTGTAAATCCTGACGGGAGCGGCACGCGGCGCTTTAGGTTTCTCCGGCTCCGCTTTTGGCGGGGTTGCGGTGCTTTGAACGGG
+NODE 1095 764 35109 34567 0 0
+TGGAACGGCGGCGCATTTGACTGGGCGAGCGACAGCGATTCCCGCCTTGGCCCGGTACTTGAGCTGGTCACCGGCGGCGTGTATATCTGGCTGCCGTTTTCGCAAATATGCTCGCTGGAATCGCCGCAACCGGCGCGCCTGACCGATCTGCTGTGGAAACCCGTTAATATCACCCTGGTGAATGGCGATACGCACGGCGCCTGGCTCTTTACCCGTTACAGCGGTTCGGAAAGTGCATCTGACGCCCTGCGTCTGTGCCGGGAAACCGCCTGGCAGGATGGCCCCGGCGAAACCACCGTGCGGGCGCTGGGGCAGAAAGTGTGGCTGACCAGCCACGGCGATATCAGCCTGCTGGACATGGCCCATTGTACCTTTCATGCTCAGGAAAACGATGGCGCATGAGCACGTCCCGTTTTACACCCGCTAACCATCTGCTGCCCACCCTATTTGATCGGCTGTGTGACAATGCCCCGTATCAGAAAATTGACCGGG [...]
+CGAAACGGATAATGGCGCGCCGGATCGCCTCGCTGATATCGTCCCACTTATGCTCATACATAAAGCTGCCCGCCAGCGGCGGCAGGCCATAGTTGAGCACTGACGCCGCCGCCTGCGGATAGCGCCTGGCGTCGATGTCACCCTCGTGGCTAATGGTATTGAGCAAAAAGGAGAGATCCCGGCGAATGATCTCCTTCAGTTGTACCGGCGTGACGCTGATATCCCGGTCAATTTTCTGATACGGGGCATTGTCACACAGCCGATCAAATAGGGTGGGCAGCAGATGGTTAGCGGGTGTAAAACGGGACGTGCTCATGCGCCATCGTTTTCCTGAGCATGAAAGGTACAATGGGCCATGTCCAGCAGGCTGATATCGCCGTGGCTGGTCAGCCACACTTTCTGCCCCAGCGCCCGCACGGTGGTTTCGCCGGGGCCATCCTGCCAGGCGGTTTCCCGGCACAGACGCAGGGCGTCAGATGCACTTTCCGAACC [...]
+NODE 1096 2323 101481 99699 0 0
+CCGAAAGCGTCGTAGCTGTACTGCCACACCTCACCGTCCGGCGTTCTCACCTCCCGCAGACGGTCGAAGTTATCCCAGCGGTAGCGCCATTCCTGCGGCCGGAAGCCCCGTTTCTGTTCGGTGCGTTTTATCACCCGCCCGCAGGCGTCGTATTCGTAGCGGCTGTCTCCTGCCTGCGTCACGCATTCGTTGCGGTAGTCATGCTGTGACAGAATGCCGTTTATCCGGCTTTCCGCGATTTGCTCGTTCACCGTGTAGCGGTAGCGCTCTTCCTGCGCCGGGCCGTCGGCGTTCAGCCGCAGCACGCTGGTTATCTGGTCGCGGTTGTCATAGCTGTAGCGTGCTTCCTGTTCGCTGCGCGTTTTCGACCACACCTCATGGCCCGTCAGGCGGCCCGATTTATCCCACGCGTAACGGTGTTCGCCCAGCGGTCGCCATGACGCCACGCTCTCATGGCTGCCTGTCAGTCGCTCCGCCCCCGCCCGCTGCCAC [...]
+CGTAACCGCAACGAAATCCGCTTTCTCTATAACGGTGTGGGCCATCTGACAAACGTCGAACACAGCGGCGGCCTGCGCCTGCGGGTGATGTGTGGCCCGGAAGGACTGATTTACCGCGTCAGCGACGAGGCGGACGGCAGTGAGCTGGTACGTTATGACTACACTCACCACGGCGATGAGTGGTGGCTGCGTGATGCGCAGACGCGGTTTAACGGCACGCTGCATTACACGTACACCGAACAGGGCTGGCTGAATTCCTGGCGCGACAACGGCCCGACACATTTCCACCTGCGCTACGACGATGAAGGGCGGGTGGTGGCGACGGGCACCGAAGAGGGGCTGTATAACGACACCTTCCGTTACTTCCCGGCAGAGCGCAAAACCGAGTACACCGATGCAACCGGGGCCGTCACCACGCTGTGGTTTGATGAAACATGGCTGCTGATAAAACAGCGAGACCCGCTGGGGCGCATCACGGAATGGGTGCGCGAT [...]
+NODE 1097 1287 72172 71918 0 0
+TCGCGCGCTGCGACTTCTGTAGGCAATGTCGCATAATAATCAATAGCGCGCGGAAGCGTCAGATCATCACCTTGTTCCTGTAATCCCCGGCACACACGGGAATCGTGTATCCAGTTCCAGTCGTATCGGGTTGGATACAAGAACTGGCGGTAAAAGTTTCCTTTATCATTGTGACTCTCTCTATAACTAAAAGAGATTTCCGGGCCACCAGCGAGCAATTTATCCAGCGTCTTTTCCCAGTTAAGATCCTCTTCCGACATGAACACAAAATCGCGCCAGCCTTGTTGGGTAACCACACCCACCAGCCAGATCGGAAACGTCTTCCCCTTTTCATCAAGCCAGTCCTCTATACGATTTAAACGCTGTGTTTCATCGGGCTGCGGTAAACCATTTTCATAACAGTTTGTGTAATGAACACGTAAGAACCAGGTATGGATAAGGCGATCAAATTTTTCATCCTGAATGGCGCCGATATCCACACGTATACCCGTA [...]
+GGGTCGTGCTATGTTCCGTAAACTGAAAGTTTACGCGGGCAACGAGCACAACCACGCGGCACAGCAACCGCAAGTTCTTGACATCTAATCGGGATTATAGGCAATGGCTGAAAATCAATACTACGGCACTGGTCGCCGCAAAAGTTCCGCAGCTCGCGTTTTCATCAAACCGGGCAACGGTAAAATCGTTATCAACCAACGTTCTCTGGAACAGTACTTCGGTCGTGAAACTGCCCGCATGGTAGTTCGTCAGCCGCTGGAACTGGTCGACATGGTTGAGAAACTGGATCTGTACATCACTGTTAAAGGTGGTGGTATCTCTGGTCAGGCTGGTGCGATCCGTCACGGTATCACCCGCGCTCTGATGGAGTACGACGAGTCCCTGCGTGGCGAACTGCGTAAAGCTGGCTTCGTTACTCGTGACGCTCGTCAGGTTGAACGTAAGAAAGTCGGCCTGCGTAAAGCACGTCGTCGTCCGCAGTTCTCCAAACG [...]
+NODE 1098 904 55383 53020 0 0
+AGATAATACTGATTGCCGAGATCCTGACGGACAAACAGATTGTCAAACCAGGCCTGACTGTTATTGTAATGTTCTGACTGATTCCAGATAGCCGCCCAGTTGCCTCCCAGATAACGACCGTCACCAAGCCCCAGGGCACCGCTACCATTCAGTGTCATATTACGACTGTGGAGATCATCACTCAGATACAGCGTCTGGCGGTGAATAAATGCGCTGACACCCTCCGGGGTCGGAGTCAGCCAGCGTTTATCACGTCGTTCTTCATCCGGCAACCAGTCCCGGTTAAGAAACAAAGATAACTGACCGTTGTTCTCATCAAAAATAACCGCAACATCCTCTTTATCTGTTGCCACGTAACCACACTCGCTGCTGTCTTTTGCTTCTGAGACACCACAGACCAGATTGCTGTTACGTAGCAACGGACGGCTGAGTGCAGCCAGCGCTTTTTGCCGTTCTGCGACCGGCAACGCGGCAAGCCCACTGCTTTCAAGT [...]
+TACAGCGGATTGGTCAGTCTGGTGATTTCACAGGCTGTCACTGCCGGCTAATAACCGGTTATTAGCTCTTCATCTGATCCGGTTTTGGGGTGTCACCGTTCGTACCTGAACCGGATCCGGTATTGATCTTATTATTCATTGCAATTCAGGTCTCTTTACGTGAGTCGTTATTTCTGGATGTATTATTTACTGGGATTGTGCAGTTTTACCAGCCAGGCAAATCTTATTCCCCCACCTGGATTTGAATCTCTGCTGGAAGGACAGACTGAGCAAATTGAAGTGTTGCTACCAGGGCATTCACTGGGATTATTTCCGGTGGTGGTTAAACCGGACACCGTGCAGTTCATGTCCCCATTGATGGTACTTGAAAGCAGTGGGCTTGCCGCGTTGCCGGTCGCAGAACGGCAAAAAGCGCTGGCTGCACTCAGCCGTCCGTTGCTACGTAACAGCAATCTGGTCTGTGGTGTCTCAGAAGCAAAAGACAGCAGCGAG [...]
+NODE 1099 51 2479 1690 0 0
+CCAGGTTCAGCAGAGCTGAAGCATCGCCAGTTTTTCCGTCCGGGAACAGGG
+GATATTGGTCAGAAGGCTGGAGCAGCCTTACAAAACCTGCCTGCCGGTGAA
+NODE 1100 1128 58195 56337 0 0
+TTGGCTTCGACGACGGGCTCCAGCAGTTCTGCCAGCGTCGGACGGCGCGGTGGATAACAACGGGCGATATTGCGTAACGTAAAATCGGTTTTCAGGTTTAAATCGCGACGGAATCCCACCAACACAATACGTTCCCGATGCTGAGGAAGAAAGTGCTGCCCGTCGATAATTTTCGGATCGTCCGGGCCATTGTCAGCGGCATCCGCCACGTCATATCCCAGTTCATCGAGCGTTTGCATAATAATGCGGAAGGTGTTGCCCTGGTCGTGACTTTTAAGGTTTTTCACATTTTCCAGCACAAACAGCGCGGGGCGGCGAGCGTCGATAATTCTTACGACATCAAAAAATAACGTCCCCTGAGTCTCGCAGGCAAAGCCGTGGGCGCGGCCCAGCGCATTTTTCTTGGAAACGCCCGCCAGAGAAAATGGCTGACAGGGAAAGCCCGCCAGCAGGACATCATGTTGCGGAATATGCTGGCGAATGTGTTCCGCC [...]
+GGTCATCCAGATGTTTGCTACGCATCAGTAACCCCTGCCGCTGAAACGTAAACCGCGTCATTTTATGTTAGTCTGTCGGCAATTATTTTTGGCCGGTTAAATGTATGCAGGAAAATATTTCAGTAACACACGCCCGGAACCTCATCGCCGACGACGCCGGAAGCGAGATCCAGGCGATGCTGAGTCAATTGCTGGAAATCTACGATGTTAAAACGCTGGTGGCGCACCTTAACGGCTTGGGCGAGCAGCACTGGAGCCCGGCCATCTTCAAGCGCGTAATGATGAACGCGGCATGGCATCGCTTGAGCGACAATGAACTCACCTGTCTTAAAACAGGGTTGCCGACGCCGCCAGCGCATCATCCGCATTACGCCTTTCGTTTTATTGATCTCTTCGCGGGCATCGGCGGCATTCGCCGCGGATTTGAAGCGATAGGCGGACAGTGCGTGTTTACCAGCGAATGGAATAAGCACGCGGTACGGACATATAAAG [...]
+NODE 1101 1084 56644 55530 0 0
+TCAAAAACCCCTGGTCACCCGGAAGTGGGCTACACCGCTGGTGTTGAAACCACTACTGGCCCGCTGGGTCAGGGTATTGCCAACGCCGTCGGGATGGCGATTGCCGAGAAAACTCTGGCGGCGCAGTTTAACCGTCCTGGCCACGACATCGTTGACCACTTCACCTACGTCTTTATGGGCGACGGCTGCATGATGGAAGGCATTTCTCACGAAGTGTGCTCTCTGGCTGGTACTCTGAAACTGGGCAAACTGATCGCGTTCTATGATGACAACGGTATCTCTATCGATGGTCACGTTGAAGGCTGGTTCACCGATGACACCGCGAAACGTTTTGAAGCTTACGGCTGGCATGTTATCCGTGGCATTGACGGTCACGATGCCGACGCCATTAAACGCGCCACGGAAGAAGCTCGCGCCGTGACTGACAAACCGTCCCTGCTGATGTGCAAAACCATCATCGGCTTCGGTTCGCCGAACAAACAGGGTACCCAC [...]
+TCGACGAACATCAGGAAGGTGGAGGTGTACGGCAGGAAACCGCCGTGCAGGGCGATACCGTTGGCGATAGCGGTCATACCGAATTCGCGCACACCGTAATGAATGTAGTTACCTGCGGCATCTTCGTTAATCGCTTTCGAACCGGACCATAGGGTCAGGTTAGACGGTGCCAGGTCTGCAGAGCCGCCAAGGAATTCCGGCAACAGCGGACCGAAGGCTTCGATGGCATTCTGGGACGCTTTACGGCTGGCGATTTTGGATGGATTCGCCTGCAGTTTAGCGATGAACTCATTCGCTTTCGCATCGAAGTCAGCCGGCATGTCGCCTTTCATACGACGGGTGAATTCAGCAGCTTCCTGCGGGAAGGCTTTCTCATAAGCCGCGAATTTCTCGTTCCATGCGGATTCTTTCGCCTGGCCGGCTTCTTTCGCATCCCACTGGGCGTAGATTTCAGACGGGATTTCGAACGGCGCGTATTTCCAGCCCAACTGT [...]
+NODE 1102 13 648 634 0 0
+GCAATATACCGCC
+TAAAAAGCTCCGG
+NODE 1103 2985 178350 176330 0 0
+AAATCTGTTCATATTCATCTTTTATCCCACCAGAATCACTGGCATTGCTCGTGTAAGATTTCTACGCCAGAAGCGGAGGGGGAGCTCGGTATACGATAAGAGACCTGACACTGGTCTGCTGCTGTTGGCCCCCACTTCACTAATAACCGCCCTTGTTTTTCCAGTCCGGTTAACCAGGCTTGCCCCGCATCACCAACAAAACTGCTGTGATTGTCTGGTTTTGTTAAAGACGAGACGGTCGCGCCAAAAGGAACAGGCAGATTGTTTATGCGGGTTAATACCATCAATGCCTTGTAACCAATATTGGTTTTATATTCAGCCCTGACCACCGCGCCACGGGTAGGCACCAGTGTTTTACTGGTATCAATGAGCTCAATATTTTTTCTAATGCCAGTCGTATCTAAAGACACTTCATTACGATGGTAAGGCGAAGCATAAGGTACGACGGCATACCCCCGAAAATCGGTGTCCACGCCCGTTTCGTTATTCACG [...]
+AAATCTCCATTAATACCCAAATAAAGCTTATTTATCGACCGCCAGCATTAACAAAATCAACGCCTGATAGCCAGAGCCAACAATTAAAATGGCAGACGGCAGGTGATGTTATTACCGTAAATAACCCCACTCCCTATTATATGAACTTTGCCAGTGTGACGCTTAACAGCCATGAAGTGAAATCAGCGACCTTCGTTCCGCCAAAATCATCAGCGTCATTTAAATTGGGTTCTACTGCCGCCCCTCATGGCACGGTAACGTGGCGATTAATCAGCGATTATGGGATGAGTTTAGAGCCGCATTCCGGTTCATTCTAGCCATTAACGACTTCACTTTACTTTTACCCTTTCAGGACTTTTACTGTGCAATTCTCCAGAGTAGAGCCCCGTTCTCAATTAGCGTTATCGTTTCTGTTTATATGCTGTTCCATAAAACCAGCGTTAGCGCATGATCATTTTAATCCATTATCGTTGGAAAATGATGAACCGGGCG [...]
+NODE 1104 4436 268702 265970 0 0
+CTGGTAGAGATGGCCGCTCATCAGGTGGACAAAGAGAAAGCGAAAGTCGCTTTCTTCTATTCCAGCCCAACGGTGACCGACCAGAACCAGTGGGTGAAAGAAGCTAAAGCCAAAATTAGCCAGGAACATCCGGGGTGGGAGATAGTCACTACCCAGTTTGGCTATAACGATGCCACGAAATCGCTCCAGACGGCGGAAGGTATCATCAAAGCGTATCCCGATCTGGATGCCATCATCGCGCCTGACGCTAACGCTTTACCTGCTGCGGCACAGGCGGCGGAGAACCTTAAACGCAATAATCTCGCGATTGTTGGTTTTAGTACGCCGAATGTAATGCGCCCTTATGTTCAGCGCGGCACTGTTAAAGAGTTTGGCCTGTGGGATGTCGTCCAACAGGGAAAAATTTCCGTATATGTCGCCAACGCGTTGCTGAAAAATATGCCAATGAATGTCGGTGATTCACTGGATATTCCCGGCATCGGCAAAGTCACC [...]
+TCCAGAAATCACGGCGTCCGATACGCCCTTTAAATGAGAATAACCATTGCTGTATGGTCATGTAAGTTCCTTATATTTTGCCTTCCGCTACAGTTTACCCTTTTGACAAGCCCGACAGTTATCGTTTTAATCGTGAGCAGTCCTAACGAAAGGTAAGATTGATGAAGCCAGGATGTACTCTGTTTTTACTGTTGTTTTCTGCTCTCACCGCCAGCATAACGGCGCACGCGCAGCTCTCTTCATCGACCACGACAGCGCCCTATCTGCTGGCGGGCTCGCCAACCTTTGATCTTTCTATTAGCCAGTTTCGTGAGAACTTTAACCGCCAGAATCCCGATCTGCCGCTCAATGAATTTCGCGCCATTGAGAATAGCCGCGATAAGGCGAATCTGACCCGCGCCGCCAGTAAGATTAACGAAAATCTGTATGCCTCCACGGCGCTGGAGCGCGGTACGCTCAAAGTGAAAAGTATGCAGATTACCTGGCTGCCCA [...]
+NODE 1105 5476 277437 275966 0 0
+GGCTACCAATTGCTTCCGTGGCTGTTAGGGCTGTATGCGCTGAGCGTTATCGCCACATGGGGAGCGGGCCTTCTGAATAATGCCTCACTGGTGGAGATCCTGATTCCTTTCTGCGTAATGGCGATTGCCAATGGCGCCATCTACCCTATCGTCGTCGCGCAAGCGTTACGCCCTTTCCCTCAAGCCACGGGGCGCGCTGCGGCGCTACAAAATACGCTGCAACTGGGGTTATGTTTCCTGGCAAGCCTGGTGGTTTCATGGCTCATCAGCACGCCGCTGCTGACCACCACCAGCGTAATGTTCTCTACCGTTGTTCTGGCGGCGTTAGGCTACAAAATGCAGTCTCATGCAGATTGCGCTGAGACCGGGTTTCCTCATGCCAATGTCGCCCACGACAAGTCTCACTAAAAGCTTGTTAACCGCTGGTAATTAGCACGCTAACAATTTTCGGTTGAATCATCAAAAATTGCGGCCTATACTGATTCACGGTTG [...]
+TCATGCTTTAATAGAGTCACTGACTTCTGCACTGTTGTTTCTGGGCGCTGGGGTAATAGTTGCTACTGTGGGTAGCGTGTTTCTTCAGGTGGGGGTGGTTATTGCCAGCAAGGCCATTGGTTTTAAAAGCGAGCATATAAATCCGGTAAGTAATTTTAAGCAGATATTCTCTTTACATAGCGTAGTAGAATTATGTAAATCCAGCCTAAAAGTTATCATGTTATCTCTTATCTTTGCCTTTTTCTTTTATTATTATGCCAGTACTTTTCGGGCGCTACCGTACTGTGGGTTAGCCTGTGGCGTGCTTGTGGTTTCTTCTTTAATAAAATGGTTATGGGTAGGGGTGATGGCTTTTTATATCGTCGTTGGCATACTGGACTATTCTTTTCAATATTATAAGATTAGAAAAGATCTAAAAATGAGTAAAGATGACGTAAAACAGGAGCATAAAGATCTGGAGGGCGACCCTCAAATGAAGACACGGCGTCGGGA [...]
+NODE 1106 75 3508 3508 0 0
+TATCCAGGCTGAAATTACCCAGCGTCTGAACGAAATCGACCGTGTATCCGGCCAGACTCAGTTCAACGGCGTGAA
+ACGCTGGGTAATTTCAGCCTGGATAGAGTCGAGGTCAGACTGGGAGTTAGTGCTGTTAGCAGACTGAACCGCCAG
+NODE 1107 8 1921 1921 0 0
+ACGTATCA
+TTCCGCGC
+NODE 1108 5 1095 1095 0 0
+CTTAA
+ACATC
+NODE 1109 12 2436 2436 0 0
+AGCGATTCAGCG
+TTTAGCCCCGTT
+NODE 1110 1 50 50 0 0
+G
+A
+NODE 1111 19 4214 3168 0 0
+CCGACTCGACTTTGTATAC
+TTCTGTAAGCCTGCGAAGG
+NODE 1112 80 16219 10954 0 0
+GCTTTGACGTCGCTTCGCTCCGTCAATCGTAACCCGCTGAATCGCTTTAAGTGATACGTTCGCTGCCGCAGCTTCGGTGC
+ACGATTGACGGAGCGAAGCGACGTCAAAGCGTATACAAAGTCGAGTCGGTTTAAGGATACGTTCGTTGGGTAGGGGAGCG
+NODE 1113 4348 244573 242195 0 0
+ATTTGCAAAAATGGGGGTTCTGGCTCAAATACGCAGCAGGCTCAACATAAAGATTAGTAAAGTTGCAGCGTCCACCACCGGACATGAGGATTTTACGTCCTGGCTTCTTGCCATTATCGATGAGCAGCACGCGGCTACCCGCCTGTCCTGCCTGCGCGGCGCAAAACATGCCCGCTGCGCCAGCGCCTATAATAACGGCATCAAACCTTTCCACGTCGCCTTCCTCTCTCAAATTCGGGCGGGAATTGTAAAGTTTCCTCAGTGGTCGCACCAGCGCGAAAAGCGCCTGAAAATGGTATTTATCTGAAATATATAAGATAATTCTTTAGTGATATCAAACAAAGCACGAAGTACATCAAAAAAAGTCTATATTTCACTTTGCCCGCGCCGCCAAAGTCACTGATAATGCGCCGCGTTCATGTCCTCAAAATGGCGTAACGTCCTATGCTACATTTGTTTGCTGGCCTGGATTTACATACCGGGCTTTTATTA [...]
+AAAGGACGATGAGCACCAGATTGGCAATCTTAACGTTGTGCATCAGCCAGGCGCAGAGGAAAATCATGACGACGGTGCCGAGCAGTACCAGCAGCAAATTGCGAAAACGTAGCGGTTTATGATCCGGTTCAGAACCGATATTTTTCACCATGCCACGGCAGGCGAAGTACACCAGAAGCGCAACAATTAAACCAGCGCCGCACAGATTATAGGTCACCGCATAGCCAAATTTATCGGCAATCACCGGCGCCAGCGATAGCGATAACAAAGAACCGATGTTAATCGACATATAAAACAGGGTGAAAGCGCCATCCAGCCGGGGATCTTTAGGCTGATAGCATTTAGAGAGCAGGCTGGCGGGATTGGCTTTAAATAACCCGTTGCCCACGGCAATCGTACCCAGTGCGATAAAAATCAGATCGGGATTTAATAGCGACATGCCGGTCATAAAATAGCCAATCGCCAGCACAATCGCGCCCAGGACCAGGGTGC [...]
+NODE 1114 3 332 332 0 0
+CAT
+TAT
+NODE 1115 22 1535 1535 0 0
+TGACTCGCCGTCAATGCCGTCA
+AAGTACTGAGCTGGCGCTGGAA
+NODE 1116 8515 483395 478035 0 0
+GTCAATAAAACTTTACAGAAATGTTGATGAGAGTTTGGTGTCTTTATGTGTCTGACAGGCATCTTTCCATTCAAACTAACGTTTCGCTACCGTGAAAGTGCTACAAATATAAAGATTTAGTTTCAAAAGGAAAAAATATGTAAACAAATGTTATTTTCACGGAACTTTGTGAACAACGTCAAACTTCCCCTGAGTTCTCGCTTTGATTTGATCGTTTTTCTTTTATCACTATGATTTTATTGTAATTATTGGCTTGTAGAACCGTTGTGCCTGAAAAAGCAGCAGGCGAGCTATTTCATAAAAATAGCCATTTAGAAGTCTTAATGTCCGAAATTGTGGTGAAAAATTGTGCTATTAGAGCAGAAAAATCTAATCCGCAATAAAATTAAGGATTAATTTTTATGTGTAAATATTTTCGTGAAATATACAGTAACAAGATGTGGTAATTCAGAGGGTTGTAATTAAATTTATTTACTTATTGATAATAAAACT [...]
+GCGGATAGGATGCGCCATCGGGCTGGCGTCTTCCGCGAATTGTAAACCGCGCATGGTACGCACGTTACTGATGCGGTTCACCGCGCGTGACCCCAAATCAGAGCTAAACTCCTGATCGCGGAACACGGTTAGCCCCTCTTTCAGGCTCAACTGGAACCAGTCGCGGCAGGTGACGCGGTTGCCGGTCCAGTTGTGGAAATACTCATGACCTATCACGCGCTCAATATCGAGATAATCTTTATCCGTCGCGGTATCGGTTCGCGCCAGCACGTATTTGGAGTTAAAGATATTGAGACCTTTATTCTCCATCGCGCCCATATTAAAGAAATCCACCGCGACAATCATATAGATGTCGAGGTCATATTCGAGCCCAAAACGCGTTTCATCCCATTTCATGGAATTTTTCAGCGAAGTCATTGCCCACGGCGCGCGATCCAGATTGCCGCGGTCAACGTACAGTTCTAATGCGACTTCACGCCCGGAGCGGGTGGT [...]
+NODE 1117 51 2524 2524 0 0
+ACGCGTTTCGCCTTGAATTGCCGGTACAGGGTCTCCATATGGTTATTGTGG
+TTTTTCAAATTGCGTTTACGTAACCTGGCGCTGAGATGATGTTGTGTTGCG
+NODE 1118 23 1239 1239 0 0
+ATGATGTCGTCACTACCGGAAGT
+CCGGCAATTCAAGGCGAAACGCG
+NODE 1119 51 2771 2771 0 0
+ACCGTCGCGGAAATCGCGCAACTGCTTTTGCGCAACGGCGCAGCGACTGTC
+TACTTCCGGTAGTGACGACATCATCCACAATAACCATATGGAGACCCTGTA
+NODE 1120 4908 233661 229010 0 0
+GAGTTTGTTCGTCTGTTCCGTCGCAAAAATAAACTGCAACGTGAAATTCAGGACATTGAGAAGAAGATCCGTGACAACCAGAAGCGTGTGCTGCTGCTGGACAACCTGAGCGACTACATCAAGCCAGGTATGAGCGTTGAGGCGATTCAGGGTATCATCGCCAGCATGAAAAGCGACTATGAAGATCGCGTTGATGACTACATCATTAAAAATGCCGAAATCTCCAAAGAGCGTCGCGACATTTCCAAAAAGCTGAAAGCGATGGGCGAAATGAAACACGCCGATGTAAAAGCCGAATAATGCGCTACGGCAGTGGGAGCGTATATCAGGCTCTCACTGCAGTTTGACCCCGCCTGTGACCATCTTGAGTAAATGTTGTTTTGGCCAGTGTCGGGTAAGTTTTTTCTCTGCCAGCTTACCTTTCAGGCGCGCAATGTCATGACGTTTCCGGTCCAGCATCAGACCCACCACGCTACCGCTATGTGCCACGTT [...]
+GTATATCCCGCGGGCGATGAGGTGCTGACTATCTGGATGGCAACCGGCCGCCGGGTCGCCCCGGCTGCGCTACCGGCCAGCGTCGGCGTGGTCGTCAATAACGTGCAAACGGTGCTGAATATTGCCCGGGCGGTCGAGCAGCAGTTTCCGGTCACTCGTCGCACGTTGACCGTGAACGGCGCGGTCGCCAGACCGTTGACCGTTACCGTTCCTATCGGCATGTCACTGCATGAAGTGCTGGCGCTGGCGGGCGGCGCAACGGTCGACGACCCTGGTTTTATTAACGGCGGCCCGATGATGGGTGGCCTGATTACCTCTCTTGATAACCCGGTGACGAAAACTACCGGCGGCCTGCTGGTGCTCCCCAAAAGCCATCTGCTTATCCAGCGGAGAATGCAGGACGAGCGCACGGTGCTTTCCGTCGCGCGCACCGTCTGCGAACAGTGCCGACTGTGTACCGATCTCTGCCCACGGCATCTGATCGGCCACGAA [...]
+NODE 1121 2580 116024 115123 0 0
+GCCTCAACCTGGTACAGTCGATCATCACCCGCACCGCCGACTTCATTAACAACGTGATGGTTCCGGACGCGCTGGCTATCGGCCAGTTCAATAAAGCATGGAGTCAAATTGGCACCGGTCTGTCGGATAAATGCGTGCTGAGTTACGGCGCATTTCCGGACATTGCCAACGACTTCAGCCAGCAAAGCCTGTTAATGCCGGGCGGCGCGGTGGTCAATGGCGATTTTAAAAATGTCATGCCGGTAGATTTGGCCGATCCGCAGCAGATACAGGAGTTTGTGGATCACGCCTGGTACCGCTATCCGGACGATCGGCTGGGTCGTCATCCTTTTGACGGCATTACCGATCCCTGGTACAACCCGGGTGATGTCAAAGGCAGCGATACGCATATCCAGCAGCTCAACGAGCAGGAACGTTACTCCTGGATTAAAGCGCCGCGCTGGCGGGGTCATGCCATGGAAGTCGGCCCGCTTGCCCGAACGCTTATCGCGT [...]
+ATCACCGGGTTATCGCTGACTTCCGGCGTACGCCGCGGATCGCTACTTAACAGGATGACGCCATCTCCAACCCGTTTGATCCAGTCGTCTACCGTGGAAGCCTCTACCGGTTGCCATCCACGGGTTAACAGGCGTTGCCATAGCGCAGAGAACGGGGTGTCATTCGCCACTTCTTTTGCCCTCCAGACGTGTCTGATACTGACGTATGCGCACTCCCTCATAATTTTCCATCGACAGGCATTTATAGTTCAGGCAGCGTGCGACCTCGTTTGCCTGCGGTACGATCCCCCAGGCGGCCAGTTGCGCCAGGGCGGCCTGTTCCGCCGCCGGTAGCTGGTCGCGAGCTATTTCGCTCAGGCTACCGCCATAGTCGTCCAGTTGCGCCGGTTGCAGACCGACCAGCGCTATGTGACAGGGCAGATGCCCGCGGATGTCGGCCAGCGCCAGAACTTCGGAAAAACTGTTTTGATGCAGACTCATTTTTTTGGCGCT [...]
+NODE 1122 3092 185443 183759 0 0
+TCTGGAGGCGAGAAAACGCGTTCGTCGGTGAGCAGGCAGGTTTCTGGCTTCAATATGGCAAGACGAAGAGAGACGAATTGAAACCAACTGTCCCTCCGTAAGTATCCCTCTGGCAAAGTGAGTCGCCATTTTTCGCTCCGTGATTAATGGGCCGTGATAATGACGAGAGTAACATTAACGTAAATTATGGACAGGTTTTACGCGCTAAAAATTCAATTTCAGAAGGTTCTTTAATCAGACGGTGACATTTCTGGTAAGAGGAAGGTTAATTTATCAACGCAGGTGGTCAGATAAGGCGACGGCAGAGCGTGTTGATAGCCTGTCGTAGCCACACAATCTTGGGATTATGACTATTACGTTTGTGCCATAATAGGGTAAACGGCACCATCAGCTTTTCCCGCTGTTGCGCATCAAAAGGCAGGGGGCGCGCCACTAACGGTAGCTGGTGGAGCTGATTGTAGTGCTGGCAATAGCGCGGCGCGGTTGCTATCA [...]
+ATGGTCTGGCATTCTGAGAAACTGGAAGGATAAAGGGATCACCTCTGCTGAACTTTCGGTTCTACCCAGGAGCCACAATCATCCCGACGACAATACAGATCTATTAATAGCTATTGCCGGAGAAGTTCATTGGACGCTCGAAGAGGTAGAGCAGTACTTCGTTGATTACGATCTGGTAGGCAGTGACGACGGCCATCCTTACTATTACCTAGCGACGTTCAGTGATGAGACACCTGACGAGCTGAAGCGAATTGCAGGGCTGAACAGCTCAAATCAACTTCACATGGGTCTAAACATAGTTCCGGATGAAGATCAGGGAGAATTCGAGTAGAGTAATATCTTCATATAATCAATACTTTATGTGTTTTGTGATTGGTAAGTTTTACTCCACATTTACTCCAAAAAACATATAATTTATTGATTTAAAATAACTAATTACTTTCTGTATTGGTAAGTAACGTTGTATTGCCCGGTGGCGCAATGCTTACCGGG [...]
+NODE 1123 730 31754 31333 0 0
+TGGAGTAGGAGAGCATTGCCACACGCGGTTCGATACCGAAGGCAATGGCGGAATCCGCAGACTGAATCGCGATTTCTGCCAGCTGCTCTGCAGTCGGGTCTGGGTTGATTGCGCAGTCGCCGTAAACGTAAACCTGTTCCGGCAGTAGCATAAAGAACACAGAAGAGACCAGGGAGCTACCCGGCGCCGTTTTAATAAGCTGCAGCGGCGGACGGATGGTGTTGGCGGTGGTATGAACCGCGCCGGAAACCAAGCCGTCGACTTCGTCTTGCTCCAGCATCAGCGTGCCGAGCACCACGTTGTCTTCCAGCTGTTCGCGGGCAACCGGTTCGGTCATGCCTTTGCTCTTACGCAGCTCAACCAGGCGAGCGACATAGCTTTCACGCACCACTTCCGGATCGACGATTTCAATACCTGCGCCCAGCTCAACGCCCTGAGATGCCGCGACGCGGTTGATTTCATCCGGGTTGCCCAGCAGTACGCAAGTGGCGA [...]
+GAACTACGTTAACGCTGAGTGGATCGAGTCGCTGACCGCCACTTCCGAGCGTAGCCGTCGTCTCTCTCCGCCGGCGTTCCGCTACCAACTGACCGAGCTGGCGCGTAAAGCCGGTAAACGCGTAGTGCTGCCGGAAGGCGACGAACCGCGTACCGTCAAAGCGGCGGCAATCTGCGCTGAACGCGGCATCGCCACTTGCGTACTGCTGGGCAACCCGGATGAAATCAACCGCGTCGCGGCATCTCAGGGCGTTGAGCTGGGCGCAGGTATTGAAATCGTCGATCCGGAAGTGGTGCGTGAAAGCTATGTCGCTCGCCTGGTTGAGCTGCGTAAGAGCAAAGGCATGACCGAACCGGTTGCCCGCGAACAGCTGGAAGACAACGTGGTGCTCGGCACGCTGATGCTGGAGCAAGACGAAGTCGACGGCTTGGTTTCCGGCGCGGTTCATACCACCGCCAACACCATCCGTCCGCCGCTGCAGCTTATTAAAAC [...]
+NODE 1124 23 8768 7428 0 0
+GCTGTGAGCTCGATGAGTAGGGC
+ACCCTGTATCGCGCGCCTTTCCA
+NODE 1125 15 5761 4997 0 0
+CATGCGCTTTTGTGT
+TATCCTGTCTGAATA
+NODE 1126 81 5113 5113 0 0
+CCAGAATAACCTGAACAAATCCCAGTCCGCTCTGGGCACCGCTATCGAGCGTCTGTCTTCCGGTCTGCGTATCAACAGCGC
+AGCGGACTGGGATTTGTTCAGGTTATTCTGGGTCAACAGCGACAGGCTGTTTGTATTAATGACTTGTGCCATGATCTTTTC
+NODE 1127 96 6987 6929 0 0
+GTTGTTCGTGAGTCTCTCAAATTTTCGCGACACGAGAATGTTTTACGAAACATCTTCGGGTTGTGAGGTTAAGCGACTAAGCGTACACGGTGGATG
+GTAAAACATTCTCGTGTCGCGAAAATTTGAGAGACTCACGAACAACTTCGTTGTTCTGTGTTTCAATTTTCAGCTTGATCCAGATTTTTAAAGAGC
+NODE 1128 157 11140 11140 0 0
+ATCCTATCTTTATCGCGCCTATCATGCGTTTCCGCCGTTAACCAACAGCGCGGGAGAACCTACGGGTGCAATGTATGGTGTCCTCAACATGTTGCGCAGCCTGATCATGCAGTATCAGCCGACGCATGCTGCGGTGGTGTTTGACGCCAAAGGAAAA
+TGATCAGGCTGCGCAACATGTTGAGGACACCATACATTGCACCCGTAGGTTCTCCCGCGCTGTTGGTTAACGGCGGAAACGCATGATAGGCGCGATAAAGATAGGATGAGCCATCTACGAGAATAAGTGGGTTTTCTGGGATCTGAACCATAATGTC
+NODE 1129 51 2693 2693 0 0
+TTTTTCCTTTGGCGTCAAACACCACCGCAGCATGCGTCGGCTGATACTGCA
+ACCTTCCGTGATGAGCTCTTTGAACACTACAAATCGCATCGTCCTCCGATG
+NODE 1130 3160 133977 131755 0 0
+AAAACGCTGAACGAACTGGAACAACTCACCGGAACCCGTCTGTTTGAACGCGGGCGACTGGGCGCGCAATTAACGGTTCCTGGCGAACAATTTTTGACTCATGCGGTAAAAGTATTAGATGCATTGAATACCGCCGGGCAGGCGCTGAATCGCAAAGAGGACGCCAGCGCCGATGTGGTGCGTGTTGGCGCGCTCCCCACCGCTGCGCTGGGTATACTCCCGGCGGCTATTGGGCGGTTCCATCAACAGCAAAAATCGACCTCGTTACAGGTCGCGACCATGAACAATACGATGTTGCTTGCAGGTCTGAAATCAGGCGAGATCGATCTGGGTATTGGCCGTATGTCGGACCCGGAATTAATGGGCGGTTTAAATTACGAACTGCTGTTTTTAGAATCGCTTAAATTAGTGGTACGCCCCGGCCATCCCCTGTTACAGGAGACGATCACGCTCAGTCGGGTTATGGAATGGCCGGTAGTCGTCTCGCCAAAA [...]
+TCCGGAAAAATTTACGCTGGCGGGCGAAATGGGGGCCACGGACTTTATTAATCCGAATGATTACGACAAACCGATCCAGGACGTTATTGTTGAGCTTACTGATGGCGGCGTAGATTTCAGTTTTGAATGTATCGGCAACGTTAACGTGATGCGAGCAGCGCTGGAATGTTGTCATAAAGGCTGGGGCGAAAGCATTATTATTGGCGTAGCGGGGGCAGGGCAGGAAATCAAAACCCGTCCCTTCCAGCTAGTGACCGGTCGCGTCTGGCGTGGCTCCGCTTTTGGCGGCGTGAAAGGGCGCACGCAGCTGCCAGGGATGGTAGAAGATGCGATGAACGGTAAAATCCGTTTAGATCCTTTTATTACTCACCGCCTGCCGCTGGAGCAGATTAACGATGCCTTTGAACTGATGCATCAGGGTAAATCCATCCGTACTGTTATCCACTTTGGCGATAACTGATTCATCCGCCAGCGGATTTTCCGCTGGCGCTT [...]
+NODE 1131 298 14959 14959 0 0
+CGCACGCTAAACTGAAAGAACGGATGGACAGAGGCGAAGGTTTGCCGCAGTACATCAAAGATCATCCTATCTATTATGCGGGGCCGGCAAAAACGCCGGAAGGGTACGCCTCCGGGTCGCTTGGGCCGACTACCGCAGGGCGGATGGACTCTTATGTTGATCAGCTCCAGTCGCAGGGCGGCAGTATGATCATGCTGGCGAAAGGCAACCGCAGCCAGCAGGTGACCGATGCCTGTAAGAAACATGGCGGCTTCTACCTGGGCAGTATCGGCGGCCCGGCAGCCGTTCTGGCGCAGGG
+GCCATGTTTCTTACAGGCATCGGTCACCTGCTGGCTGCGGTTGCCTTTCGCCAGCATGATCATACTGCCGCCCTGCGACTGGAGCTGATCAACATAAGAGTCCATCCGCCCTGCGGTAGTCGGCCCAAGCGACCCGGAGGCGTACCCTTCCGGCGTTTTTGCCGGCCCCGCATAATAGATAGGATGATCTTTGATGTACTGCGGCAAACCTTCGCCTCTGTCCATCCGTTCTTTCAGTTTAGCGTGCGCGATGTCGCGGCCCACAATAATTGTGCCGTTCAGCGACAGGCGCGTTGAT
+NODE 1132 575 30385 30219 0 0
+CGCCAGCACTTCATCAGCCGCCTGGATAATCGCGCTGGCTTTTTCCGCCGCCAACAACCCTAAGTCCTGGTTGACCTTCGCAGCGGCGCGCTTGGTCAACGCCAGAGCGTGAATGAGCGAAACGGGCATTTTCTCCGTGGAAATCCGAAAATGCTCCAGCGAACGTTGAGTCTGCGCCCCCCACAGTTTATCTGCCGGGACTTCAATCGCGCCCATTGAATCTTTCTCGCGGCGTACCGTTACCATTACCTGCTCCTTACTCAAGTTGATGAGATCATGTGTCGACATTGCTCACATGTTTGCGGTCTTATGAGTATTAACGATAACAACACAACGGTGTAGACCGGATAAGGCGCTTGCGCCGTTCTCCGGCAAAATAGCGAATCATGTTACCGCCCCGCAGGGCGGCGACATTACTTAACGCAGCGCGCGCACTGCGATGACTGAATCTGCTGGAAGAAATCGTTGCCTTTATCATCCACCAGAATGAAG [...]
+TATCTGGAAAATTGAAGTGGAGGATTTTCCGGCCTTCATTCTGGTGGATGATAAAGGCAACGATTTCTTCCAGCAGATTCAGTCATCGCAGTGCGCGCGCTGCGTTAAGTAATGTCGCCGCCCTGCGGGGCGGTAACATGATTCGCTATTTTGCCGGAGAACGGCGCAAGCGCCTTATCCGGTCTACACCGTTGTGTTGTTATCGTTAATACTCATAAGACCGCAAACATGTGAGCAATGTCGACACATGATCTCATCAACTTGAGTAAGGAGCAGGTAATGGTAACGGTACGCCGCGAGAAAGATTCAATGGGCGCGATTGAAGTCCCGGCAGATAAACTGTGGGGGGCGCAGACTCAACGTTCGCTGGAGCATTTTCGGATTTCCACGGAGAAAATGCCCGTTTCGCTCATTCACGCTCTGGCGTTGACCAAGCGCGCCGCTGCGAAGGTCAACCAGGACTTAGGGTTGTTGGCGGCGGAAAAAGCCAGC [...]
+NODE 1133 1096 52612 50484 0 0
+GTTATCTGGCCGAGCGCCTGAAATAAACGCTACGCGGGCGGGATGCTGTACCGCCCGCGCTTTAGGGCTTCCTCGCCACCGGCACATCCAGCTGTTTAAGCGCCTCCACAAAGCGCGAGGGATTATCTTTATTAAAAAGCAGCCAGACCCGCGCACGCGCGCGCGTCAACGCCACATATAACAACCGCCGCTCTTCAGCGTCCGGAAAATCCTCAACCTGAGGAAGAAGCGCACTTTCCATAATGGACTCTCGCGCCGGGGCGGGGAAACCGTCGTTACCCTCCTGCAATCCGACAAGAATCACGTAATCGGCCTGTTGGCCTTTGCTGGCATGGATAGTCATGAAATCTATCTGTAACTTTGGCCAGCGAGTCGCCGCTTTTTGTAGACTCGCGGGTTTCAGATGGTGATAGCGCGCCAGCACCAGGATACGTTCATCCTCCTTCGCATAGCCGGATAATTTATCCAGTAACGCGTCCAACTGGCTTTCAT [...]
+TCGTTGGGTCAGTTTGATGCGTATGCACGGCGGCGCGCAGGCAGAAATGATCGCTGGCGCGCCAGAGGAGTGCCGCGAGCTGTTTGGCAAACGCATTAAGCTGATGGCGCCGCTGCTAAAGGCCTGGAAAAGCGCGTTGAAAGCGGAAAATGCCGTTGATTTCTCCGGGCTGATCCATCAGGCAATGGTGATCCTCGAAAAAGGGCGTTTTATCAGCCCGTGGAAGCATATTCTGGTCGATGAATTTCAGGATATTTCCCCGCAACGGGCGGCGCTGTTAGAGGCGCTACGCAAGCAGAATAGCCAGACTACGCTGTTTGCCGTGGGCGATGACTGGCAGGCGATTTACCGTTTTAGCGGGGCGCAGCTCTCCTTAACGACGGCGTTTCATCAGACGTTCGGCGAGGGCGAGCATTGCCACCTGGACACCACGTACCGTTTTAACAGTCGGATTGGCGATATTGCCAATCGCTTTGTACAGCAGAATCCGCA [...]
+NODE 1134 8257 432189 425161 0 0
+ACTCTGTGGCCTGCAATTTGTGAATTACTGAAATTTATTGCTTCAACGTTCCATCTTGGTCCTTATTCCATTTAATTGATTCGGTTTATATAAAGGATTTTATTATGAAAGATTCTGTAAATATTTTATTCGTATGCGGTTATGGCGTAGGCAGTAGCGTAATGTTACAGACTGTTGTTAAAAAAGCGTTAGCAAAATATGACTTCTCTTTTGATATGGAGCATACGGCAGCGGGAGAGGTCGGTGGATTTACCGACTGGGCAGATATTTATGCGATTTCGAAAAAATTGCTTGATGTTGTTAGCCTCGATCCTAAACACGGACAATATCTCATTCCCATTGAAAATATCATGGATGGCGAATCAATAGGCAAACAGATTTACGATGTGGTAGAGAAAAATTTTCCGCACCTGCTCAACAAATGAGGGTGAGTCATGAAAGCGATTATTCTGCTGTTTGACAGTCTGAATAAAAACTATTTGCCGCCCTATG [...]
+GATATGATCGCCCGCAGTATGGAGCGCTTCGGCAAAAAATCCGCCAAAGAGCCCCCGCTAACGCATTACGGCGTGTCAAAACTGAATTTTGATTTTACGCTCGATACGACTCGCGCGCAGGAAGAGCTGGGCTACCAGCCCATCGTCACGCTGGACGAAGGCATTGAACGCACCGCCGCCTGGCTACGCGATCACGGAAATTTACCGCGTTAATCCTGGCCGTACTTCTCCAGTAATGCTTCGGCAATCGCCTGCGTTTCGGCATCTGCGATACCGTTCCATTGCGCCGGACGGAAGTGCATCTGGAACGCCATAATCACCCGCTGCTGCTCGCGTGCCGTCATATCGGCTTTGACTTCATAACCATAGCGCGAGAGTAACGCAAGCACCGTTGCGGTATCGACTGGCGTATACGGCGCGCGTCCAGCCAGATAAAACGCCACACGCTGGGCGTCAGGCCAGGCGCCAATCCCCTGCGCCGCCAGCTCGCGC [...]
+NODE 1135 51 3073 3073 0 0
+GCCACGTTTTCCAGCGCCGTAAAATCCGGCAGGAGATGATGAAACTGATAG
+CGATGCCATTATTGATTGGCAAAAAGAAACCGGCGGAGATTGACGCTCGGG
+NODE 1136 1722 85516 84652 0 0
+ATAAACCCCAGTTTCTGGTTACGTAATTCCGCTTTTGCCGCAGAAGAGAGTTTGCTCATCGGCTGGCCGCTAAAAATCACATCGCCGGAGGTAGGCGTATCCAGCCCGCCTAACAGATGCAGCAACGTACTTTTACCCGAACCGGAACTGCCGACGATCGCCATCATTTCGCCTTCGCCGATACTGAAGCTGACATCGTGCAACACGTCGGTTTGTACGGTGCCTTCCTGATAGCGTTTGCACAGGTTGTCGCATTGCAACAGGATCTTATTCATAACGTAAAGCCTCAGCGGGTTGAGTGGCGGCAGCGCGCCAGGAAGGATAAAGCGTAGAAAGCAGCGCGATGGCCATTGCCACCAGCGCGATAACGATCACCTGTAACGGCTCTATCGCCACGGGCAACGCAGCGCCATCCAGAAACGCGCCGATGATCGGCATCAGGTTATTCAGTTGGCTGGCAAGCAATGCGCCCAGCGCGGCGCCCAACAGCGC [...]
+GTTCTTTATTATCCGCGATCGTTGTTTATTAGCAAATTGAATCCGCCGGATAACACGTCGAACAGGTAAAGTATGAACATGTAAGTGACTTGATTTGTCGGCCTTATTCAGAATAGCGCTGACGAACTCTTACGGTTCAGACATTTACGCATTCCGCTTTCGCTTATATACTCGGGACTTTGCTAACAGCAACCAGACGGATTACATGTATCAACCTGTCGCTCTATTCATCGGCCTGCGTTACATGCGCGGGCGTGCAGCAGATCGCTTCGGTCGCTTCGTTTCCTGGCTTTCCACTATCGGCATTACCCTGGGGGTGATGGCGCTGGTCACGGTATTGTCGGTGATGAACGGTTTTGAGCGCGAACTGCAAAATAACATTCTTGGTTTGATGCCTCAGGCCATCCTCTCTGCTAAACATGGTTCTCTTAACCCGAATCAGATGCCGGAAAAAGCGGTGAATCTGCAAGGCGTTAACCGTATTGCGCCGCT [...]
+NODE 1137 1512 82759 82299 0 0
+GGGTCTGACTGGCGCATATTCCCCGCATTCGCTGCGTTATGCGTGGGCACAGGATGCCATTCATCACTATCTGGCGCAGGGGTTCAGCAGGAAAGAGGCACTGGCAATGGTGGCGATGGACTTGGGGCATGGCGACGGACGTGGGCGCTGGGTTAAACAGGTGTATGGGCGTGAGGAATAGCATTTTCATGAATGATACGAGATAAAATGTTACTTCGTGACAACATCCTTCACTGCTTCTCTTTGTGCCGAGCATGACGCACAAGGTAAAGGTACTTTTAAGGAAGGCATAGGTGTGTTTATCCCTCAGCGCCCCTCGATCCTCAATTACAGCTGTATCAGACGCGTCTCGGCTAATTATCCAGAATCAATGAAAATTTATACAGTATGCCCCTTGAAATAGAGTTAATCGTTCCCACTTAATGACCACAATGTGGCCGTGGACTAATTCGACCGCACTAAAGAGAATGGATCGTCTTACGCGTAGAAATG [...]
+ACCGAAGCAGCATCTACGTTACCCGCACCAGCAAAACAGGCCAACACACAGCTAGCCGTCTTGCCACTACGTTTTGACACAGGAGTTTTCCATATATGGAGACCGTTCTCCGTAGTTGTATGCTCAGCATCTTCTGCGATACCGAATGCTTGTTTGGCAGCAGCCAACTCCACATCCAAAGCTGTCAGTACTAGAACATCGGGGGGCAAAGCTTGGACCCTAGCGAGTTCTTCCTCGTAGAAAATTTTGACGATGCGCTTACTTATATCGGATATGCTCATAACGGGATCTTGAAGGGATAGCGCGGCCAGAGTCTTGATAACCTTATTACCGCTATTAGGCATGTATGTTAGAGGAGTGGTTTGGAAACTCTTTAAGATCCCAATTGCACCTTTGCCGTCTTCGCTATTTGCACCCAGTTGCAAATCGAGTGGCAGTACAGGTAACTGCCTTTTGGACATCTTACGCGCACGGTCCAGAACGCCTTTCCCG [...]
+NODE 1138 10481 533924 527254 0 0
+AGCGAGGGCGAGCCGTAGCTCATCCCCAGCGCGACGGGCGTGTCTGGCAACCGCGCGGCCAGCGCCTGTTGCTGTTCGCGGCTATATACCATGAGCGGCGAACCGCCATCCATCCAGATAGATTGATAGAGTTTCGCGACGCGCGGCGAACGCAGCGGTAAAATAACGCCACGCAGCAGCGGCCACCACAGCAGACGAGGAGTATCCACCACGCGTCTGTCGCTTAAAAATTGTTTCAGGTAGCGCTTTACCGCTTCGGGAGTTGGGGCATCTGGCGTGCCAAGGTTAGCCAGCAGGATACCGGTTTTCGTCTGACGCATTGCCGCCTCTTATCTATTCAAATTGTTGATAATTGTAGCGGAAAAGCGATAAAGAAGAACTAATTGCTGCGAGAGGTAAGACGAGAATTTGCCGAATGGCGCTAACGATACCAGCAGGCCGGATAAGGCGTTCAGGCCGCCATCCGGCACCGATTGCCTGATGGCGCTACGC [...]
+GACGCGCGCTGGCTCGTCGTCAGAACCTGGTAAAAGAGGGAGCGGAAGGCGCGGAGCCACAGGAAGAACCCACCATCGCGCTGGAGCAGATTAACCAGCAAACATTACGTATCACGATGCTGCTAATGCTTGCCCTGTTCGGCGTTATGTTCTGGGCGATTTGGTCCGATTTGATCACCGTATTCAGCTATCTTGATAGCATCACGCTGTGGCACTACAACGGCTCCGAAGCTGGCGCTGCGGTGGTGAAAAGCGTGACGATGGGCAGCTTGCTATTCGCCATTATTGCCGCGATGGTGGCCTGGGCGCTCATCCGCAACTTACCCGGCCTGCTGGAAGTGCTGGTGCTTTCACGCCTGAATATGCGCCAGGGGGCTTCGTATGCGATCACCACGATCCTTAACTACGTCATTATCGCTGTTGGCGCGATGACAGTATTCGGATCGCTCGGCGTCTCGTGGGATAAACTCCAGTGGCTGGCGGCGGCGTTGT [...]
+NODE 1139 94 5415 5415 0 0
+ATTCAGAACGCGTCGAGGTATTCGACCGGTTCGAAAATAATTTGTTGGGGTATCGCCAAGCGGTAAGGCACCGGATTCTGATTCCGGCATTCCG
+CAAATTATTTTCGAACCGGTCGAATACCTCGACGCGTTCTGAATATGGTGGCTACGACGGGATTCGAACCTGTGACCCCATCATTATGAGTGAT
+NODE 1140 26 2852 2834 0 0
+TGCCTTACCGCTTGGCGATACCCCAA
+AGGTTCGAATCCTCGTACCCCAGCCA
+NODE 1141 7560 417503 414601 0 0
+TATTTATAAATAAAAGTTGTGGCCTGGACTGTCAACGTTGGGATTATGCGGATTTTTTATGCTGAGTTTAGGCTCAGTAACAGCGCTTATAACCCCGATACCCACTTGCCGCCTTTCTGCACCTCGAATTATTTAGGGTATATACTTTTTATCCTCATTCGACAGTGCCTGGGGCAACGGCACTAAAACAATCACACTTTTCTGTGACTGGCGTTACAATCGATCCCAGTCACAATTCTCAAATCAGAAGAGTATTGCTAATGAAAAACATCAATCCAACGCAGACTTCTGCCTGGCAGGCGCTCCAGAAACACTACGATGAAATGAAAGACGTTACGATCGCTGAGCTTTTTGCGAACGATAGCGACCGTTTTGCTAAATTTTCCGCGACGTTTGACGATCTGATGCTGGTGGATTTCTCCAAAAACCGCATCACCGAAGAGACGCTGGCAAAATTACAGGATCTGGCGAAAGAGACCGATCTGGCCGGCG [...]
+GCCTCCCTTCCCGGTACTGCTGTGGCTGTGGAACTCGGTGAAAATCGCCGGTATTACCGCCATCGGCATCGTGGCGCTCTCCACCACCTGCGCCTACGCTTTCGCACGAATGCGTTTTCCAGGTAAAGCAACACTGCTCAAGGGGATGCTGATTTTCCAGATGTTTCCGGCGGTTTTGTCTCTGGTGGCGCTGTATGCGTTATTTGACCGCCTGGGACAATACATTCCATTTATCGGTCTGAATACGCATGGCGGCGTGATCTTCGCCTATCTTGGCGGCATCGCGCTGCATGTCTGGACGATTAAAGGCTACTTCGAAACTATCGACAGCTCGCTGGAAGAGGCCGCCGCGCTGGATGGCGCAACCCCGTGGCAGGCGTTTCGCCTGGTGCTGCTGCCGCTTTCCGTACCGATTCTGGCGGTGGTGTTTATTCTGTCGTTCATCGCGGCGATTACCGAAGTTCCGGTCGCCTCGTTGTTACTGCGCGATGT [...]
+NODE 1142 1749 91716 91562 0 0
+GAGCGCTGTCAGACGCAGTTTGGCGATTGCTACTTTGATATCACCGAGCGGAGCTGGGTTCCGGTATTAAGCGGCTTTTTACTCAGCCGCGCGATTCGTCAGAACCGTGACGAACAATATATCTATAGCAGCGGCGGTTCATCTTACGTCTCCCGTCCCGTCTGGCGCACCACATCCGGCGATTATGCGTGGCGCAGCGGCACAGGGAAAAGCGATACCGTGACCAGCCCTGGTTATATCACACGGAAAGCGTCCACCGTCTCCCGCGGCGGCTATGGCCGTTCTTCCAGCGCCCGCGGGCACTGGGGAGGCTAACCATGCTACGACACAACGTACCGATACGCCGGGATCTGGATAAGATCGCCTGCGATCACGGTTTTGACTTTCATGTTATCGATAACGAAATTTACTGGGATGAAAGCCGGGCCTACCGTTTTACATTACGGCAAATTGAAGAACAGATCGAAAAACCGACCGCAGAGCTTCATCAGA [...]
+CTGGCGAGAAGATCGCTATCCCATCCCGCGCCTTCCCGGGAAACCGCTTCACACAGCGCGCCATCAGACAGGAATAAGTTACTGTTATTGAGCGGAGCTGGTTGATTAAAAACGGTATGTGTTTGCCAGGACATGGTGTCTCCCTCCTTCAATGGCGCTGAAGTCAAGTATGGTCATGACTGCGCCATTGACGCCGGAGCAAGATCACAAAAGTATGATTAACCGGCAATATAATGTGGGACGAAACGGGAAGTGTCTTTGGTAATTAGCGTATTGTCCTCGCGAATCCCCATCCCGGAGGCTTCATCGTCAATGATCCAACTGCCAATCAGCGTATAGCTATCGCCAAAGCGCGGCAAAGGCTGAAACGCCTGGTAAATCATCGGCTCGTCAGCGTAGTCGCCGTCGGCATGATCGATAACATTTTGCCGCTCGTCAAAAATCGTGACGTTGCCGCCTTCACGTGAATAAATCGGCTTCCGCACGCTGCTT [...]
+NODE 1143 2328 163566 163127 0 0
+CTAACAGCTTCATGCAAAGAAGCAATATTCTGTTCCTTGAAGAAAATGCCAGTCGGTTCCTCTATACCTAGTGGGCGAACGGTTTCTAAGGCCCCTCCCTTCCCAAAGGCAATAACAGGGGTACCGCAAGCTTGAGCTTCGACAGGTATTATTCCAAAGTCCTCTTCCGCTGCAAAAACAAACGCCCTGGCGCTCTGCATATACTCTTTTAAAACAGGAAAAGATTGATAACCGAGCAATTTTATATTGTCTGTAGCCTTGCTCTTTATTTTTTTCATCTCCGGTCCATCACCAATAACTACTAATTTCTTTTCCGGCATTTTACTAAAGGCTTCGACAATAAGATCAATACGTTTGTAGGGTACCATACGGGATGCTGTGAAATAATAGTCTTGCTTTTCATTTTTTACTTCAAAATTATCCACATCTACAGGCGGATATATAACTGAAGCCTCACGTCTGTATACTTTTTTAATTCTACGCGCGATATAT [...]
+TTTTCTGGATCGCCCTTGAGACTGGTATTATTGGCTTAATCATAAATATTATTTATCTAGCAAGTCAATTTTATTCTTCAACTTTACTAAATAGAATATATGGCAGTCATTATAGCAATATGCACTATAGATTATATTTTCTCTTTGGAAGTATATATTTTATAAGTGCAGCGTTAAGTTCAGCACCTTCATCATCAACTTTTTCTATATATTATTGGACAGTTTTAGCTTTGATTCCATTTTTAAAATTAACAAATAGACGGTGCACGCGATAATGAATAATAAAAAGGTTTTGATGGATATTAGTTGGTCTAATAAAGGGGGTATTGGACGTTTTACTGATGAAATTTCTAAACTACTATGTGATATATCTAAGGAGGAACTATATAGAAAATGTGCTTCTCCGCTGGCCCCATTAGGTTTAGCAGTCAATATTTTTCTGCGAAAGAAAACTGATGTGGTTTTTCTTCCTGGCTATATCCCACCACTTTT [...]
+NODE 1144 2423 138116 137169 0 0
+TGTTTTTTTGTATCTGTCGTCTGGTCCGCAACGACAGTGCGGGCAGCATCCTACTTACCCGCGCAATAAACTCGCCGTCATCTCAGGTTAACTTCTTCTCGCCAGCGTCGCCCCATCGGCAAAATAGGCTTTAATGCCCGCCAGAATCGACTCTGCGACCTGTTGCTGGAACGTCGCGGTCTTGAGCTTGCGTTCTTCTTCAATGTTACTGATAAACGCCGTCTCGACCAGAATAGACGGAATATCGGGCGCCTTTAACACCGCAAACCCCGCCTGCTCGACCTTGTTTTTATGCAGGTCATTAATTTTACCAAGCTGCTTCAACACCGCTTTACCGAATTTCAAACTATCGGCAATGGTCAGCGATTGCACCATATCGAACATCGTATGGTCGACATAACGGTCACCGCTTTTGCTCACGCCGCCAATTAAGTCCGAGGCGTTCTGCGTTTGCGCCAGATATTTCGCCGCGGTACTGGTGGCGCCTTTGGT [...]
+AGATGGCAACGACGAACGCCGCTACGACAGGCTTTTACCGCGCCGCGCAAAAAACGTACGGTTCCGGAGTTGTAATCGCCCAGCGCTTCCAACTCTTCCACCCGCGCCTGCGCTTCATTCGGGAAGAGTTCAGAAATGATGCCGCCCTCGCTATTGGTAACGCCCTGAGAAGAACAGAACCCGATCATTTTTTCCGCTTTCAATTTAACGGCGAGTTGAGTGGCAATCTCTTCTGAGGTCAGATTAAAACTTTCGCCGGTCACTGAGACGGCGACCGGCCCCATCAGAACGATCGCGCCGTTATCCAACTGGCGGTTGATCGCATCTTCATCAATGCGCCGGATACGGCCGCTATGACAGTAGTCCACGCCATCATCAACGCCCAGCGGCTGCGCAATGGTGAAATTGCCGCTGACGACATTAATGTGCGCGCCCTGCAACGGCGTATTGTTCAGACTCATCGACAGACGGGCGGTAATATCAAGCTGGAGT [...]
+NODE 1145 51 2867 2430 0 0
+TCGTACTCGCCGAAAGCGTTCGGCAGGCCGGCGTTCGGGTGCGCGGTGACG
+ACCTCGACGCCGACACCATGGCGAAACAGATTCGCGAATGGGCGGAAGCGG
+NODE 1146 1360 74337 73629 0 0
+TCCACTTGAAGTATGAAGGGTATATAAAATAACAGGCAGATTGATAGCACTAAAAACCATAGAATAAGTATAGTTTTTAGTGGCATCTTTACCTTGAAATAACGTGTTGAGGATGTGCTATTAAAAACAGATCCGCATTGCGCCGCGAATAGCGTTAAAGATACAACCCGGTGCGGATAGCGCGGGTTTACTCTACCGCTTATTCACGTATCACAAACCGTTTTTGTTTTATCTGCTGCGCGGCGCTGATCAGCGCGGCAAAAAAGAGCGCCGCGGCGCCGCAAAGCGTGGCGTTGATAATTGCCGGCGCGCCATTGCCTGACAGACTGGCGGCGAGCGGACCGAGAATTTGCCCAATACCATACGTTAGCGTCACCAGGCCTAACAAATTAATATTACCCGGCGCGCTGAGTTGTCGGGCAAGCGGCATCACCAGCGAGGTTGTGCCCATAAACGTGGCGCCAAAACCAATACTGCTCAGTATTAACAGCA [...]
+GGGGATGGGAGTTGGCCGCTTTCTGTATACGCCCATGCTGCCGGTAATGCTGGCGGAAAAGCAGCTAACGTTTAACCAACTCTCCTGGATTGCCAGCGCCAATTATGCAGGGTACCTGGCGGGAAGCTTACTGTTTTCCTTTGGCCTTTTTCATCTCCCCTCTCGTCTACGCCCCATGCTGCTGGCTTCGGCGGTCGCCACCGGTATTCTTATTCTGTCTATGGCGATATTTACTCAGCCCGCGGTCGTCATGTTGGTGCGCTTCCTGGCAGGCGTCGCGAGCGCGGGAATGATGATTTTTGGATCAATGATTGTGTTGCATCATACCCGCCATCCGTTTGTGATCGCCGCGCTCTTTTCCGGCGTCGGGGCCGGGATTGCACTGGGCAACGAATATGTCATTGGCGGTTTACATTATGCGCTTTCGGCCCATTCGCTATGGCTGGGGGCCGGAGCGCTCGCCGGTATATTGCTATTAATCGTGGCAATGTT [...]
+NODE 1147 38 3356 3236 0 0
+AAAAGCAGAGAAGCCTGCCGCCTCCGGTATCTACACCG
+GCGGCTTCCGCCTGCGGCAGTGGCTCAAACGCCGCCGG
+NODE 1148 8 1107 851 0 0
+CGAAGTGG
+ACCGGCTG
+NODE 1149 194 20717 20195 0 0
+CGTCCTCTCCGTTACGCCAGCGTCATCAGGGTGTCGCCCACGGAAACCGCGTCCCCGGACTTCACCGCGATACCGCGTACCGTACCGGCCTGTGCGGCGCGGATTTCGGTTTCCATCTTCATGGCTTCCAGAATCAGCAGCACATCGCCTTCGGCCACGCTCTGGCCCTCGGTGGCAATCACCTTCCAGATGTT
+TGTGCTGCTGATTCTGGAAGCCATGAAGATGGAAACCGAAATCCGCGCCGCACAGGCCGGTACGGTACGCGGTATCGCGGTGAAGTCCGGGGACGCGGTTTCCGTGGGCGACACCCTGATGACGCTGGCGTAACGGAGAGGACGAATGGAAAGTCTGAACGCCCTGCTTCAGGGCATGGGGCTGATGCACCTTG
+NODE 1150 46 3517 3517 0 0
+GCCCGCCAGCGGCGCGGTGACCGGGGTGCCGGCGCCTGCCGGAGCA
+TCTGGAAGGTGATTGCCACCGAGGGCCAGAGCGTGGCCGAAGGCGA
+NODE 1151 4872 315778 309077 0 0
+AAACTATATACTTAGCCAGTTCAAGAAGTTGATTTTCACTCATGCGAATGTTGGCAATTTGGTATCTAACTGGCTGAATCTCCTCATTATTAACCCAGTCTGAAACATGCTTAAAAAATGCTATTGAACCAAATCTTGCTCCGACATCCCCAAAAGACGAGTAAGCAAATCCATCAGCATACTCATTTACAGCATCACTTGAGTCCTTGAAGATGGTTTCTCTGAAGTTCACTTTGGTATCTGTCATATTTATTTATCCTTACCATACATGGTCTTTAGCGTCTCAACATCGTGTTCAAGATCTATCAATCGTGATGCTATAGTTGCAAGGTCTAGTGCTTGAATGTGTTTATTTTTTTCGGTCCACGCTTCAAGTGCCGCGACCATCTCAGCATTTAATGAACGAGAATTAGCCTCAGCCAGTTCAATAAGACGTTCCTTTATCTCTACAGGAAGCCTCAGATTCACTTGAGGGTTTTTGTACTTACGATC [...]
+TTGCTGGCGTGGACCCATCAGAACAGAAACAGGCTATAAAGAAGAAGGAAAAGGAAGAAGTAGCTGATTCGTTCGGTGATATCTTCAGGGAGTGGCATGCTCATAAATCGAAGGTATGGTCGAAAGGATATGCTGACGAAATGATGAACATGTTCACTGGCGATATATTGCCACTCATCGGACATCTGAGAATGGAAGAGGTGGAGCCGATGATGCTACTGAAGGTGATCAGGCTATTTGAGGACAGAGGGGCGATGGAACGTGCTGATAAGGCTCGTCGCAGGTGTGGCGAGGTTTTCAGCTACGCAATAGTAACCGGAAGAGCTAAATATAATCCGGCTCCAGACCTTGTTGGGGCAATGAAGGGTTACAGAAAAAACAACTACCCTTTCCTACCTATGCATCGCATTCACGAATTCCAGAGGGCGCTGAATGGGTATGGAGGCTGGGTTATAGGTAAGATTGCTGCTCAAGTTCTTCACTATACAGCAA [...]
+NODE 1152 2500 144369 143589 0 0
+TAAGGCCCATCTCGGTCGCGCCCAGCGGCGCTTTTGCCAGCGCTTCAGGGTGTCGGTGAGTCAACCAGGCTTTTTCATCGCCCCAGTTCACATCCAGATCCGGCTCCCAGACATCTTCACGCCCGGCGCCGAAACCGAAGGTACGGAAGCCGGAGTTTTCCAGCGCCACGTTACCCGCCAGAATAAACAGGTCAGCCCAGGAAATTTTCTGGCCATATTTCTGCTTAATCGGCCACAACAAACGACGCGCCTTATCCAGGCTGACGTTATCCGGCCAGGAGTTAAGCGGCGCAAAACGCTGTTGACCACGACCCGCGCCGCCACGACCATCAATAGAACGGTAGGTACCAGCGCCATGCCAGGCCATACGAATAAACAAACCGACATAGCTGCCCCAGTCGGCGGGCCACCACGGTTGTGAATCGGTCAGCAGCGCCTTGAGATCCCCTTTCAGGGCGGAGTAGTCTAACTTGCTAAACTCTTTGCGGTAGT [...]
+CTGCCAAATGGTTTGCGGGAAGTTTCGCGTTTCCGCAAGGCCGAGCGTAAACGTCTGCACTCGGCGGGCATCGAAAGATACGGCGCGATCGGCAATCGTCTGCCAGCGGGCGCTAAGTGTGGGCGTCTGGCGAGGCGATGGCGGCAGGCTGTGCTGCCCCTGAATATGCGGAATCCCCTGGCGGCTGGCGAAACTCCCGGCCCCTTGCCTGCGGGTCATAAAGCCGTCGCGCTGAAGCTGGGAATAGGCATTTTCAACCGTATCTCTGGACAGGCGAAGCTGCTGCGCCAGCGCGCGAGCGGACGGCAGTTTTGCGCCATCGACCAGCGCGCCGGAAATGACCAACTGACGAAAAGCGTGGTACAGGCGCACATGCAGCGGCAGGTTACGCCACACTTGCGCGTCGATCATGATATGTATCGACTCGAAATTCGCTGTGTTCATCTTCTGGTTCCCCCGTCCCTGCGTCGCCAAAGCCGTTGAATCATATCA [...]
+NODE 1153 6623 399344 397452 0 0
+AGTCACGCTCGATAGCCGCTTTCAGATCGCCCTGCAGAGTGGTGCCTTTTTTCAGCCCTTTCCAGAACAGGCTGTGGTTAGCGTGGCCGCCCGCGTTGTTACGCAGCACGGTTTTTTTGTCCGCTGGCACCTGATCCAGTTTAGTAATCAGTTCTTCAACCGGCAGGTCAGCAAACTCAGGCAGGTTTTCCAGCGCCGCGTTAGCGTTGTTGACATAGGTTTGATGGTGTTTGGTGTGGTGAATCTCCATCGTCTGCTTATCGAAGTGCGGTTCCAGTGCATCATAAGCGTACGGCAGGGATGGCAGTGTATAACTCATAATCATCTCCATTATTGTCGAGCGGCACAGTGTTAACGCCGCGTAAGCAGTTGGTTCATTATAGTTAATTAAATGATATTGAAAATGATTATCAATGCCGTACTTTTTCCAGGGTTATAAACGTTACGGCATCCGCTGAAAAAAATCGTTTTTTACGCCTCCAACCGAAACCG [...]
+TCCGTTAACGATCTGGTGCTGCAAAATATCATTTACTGCCCGGAGCGTTTGAAACTCAATGTAAACTGGCAGGCGATGATTCCCGGCTTTCAGGGAGCGCAGTGGCATCCTCACTGGCGGCTGGGCAGTATGGGAATGAATCAGGCGCGGCAGGTCATTAACCAGCTTGAACATGAGAGTAATGGACGCGATCCGCTGGCGAATGAGATGGCGGAATTGCTGTTTGGTCAACTGGTGATGACGTTAAAACGGCATCGCTACGCGACCGACGATCTTCCGGCAACCTCCCGAGAAACCCTGTTGGATAAATTAATTACCGCTTTGGCTAATAGCCTTGAGTGTCCCTTTGCGCTGGATGCGTTTTGCCAGCAGGAACAATGCAGCGAACGGGTGCTGCGGCAGCAGTTTCGCGCCCAAACCGGGATGACGATTAATCAATATTTACGCCAGGTCCGTATTTGCCACGCGCAGTATCTGCTTCAGCATAGCCCG [...]
+NODE 1154 8822 483072 478987 0 0
+TGTCAGGACAGTGAAATATCGTGGGTCCACTGGGATAATTTGCCGGAAACCGCCAATGCGCTACGAGAGTTTACCCGTCATCTGATTCAACTGCGCGCCACGCAACCGTTGCTGCGCCGGGAGAGCTGGCGTGACGGTCTGGAGATCCGCTGGTTTAACGCCGGCGGAGGGGCGCAGCAATCCGAACAATGGGATGAGGGATCGACCATAGGCGTATGCATTAGTCGTCCCGATCTCCAGCCGGAAGCGGGGATCTGGCATGACGCCTTACTGCTTTTCAATCCGTTTGAAGGCAGCGTACCGTTCCGTATTCCGATGTGGGGAGAAGGCGGCTGGGTACTTGAACTGACGACTGCCGATAACGCGCAGCAGGGAATGCGGATTACCGAAGAAATGGATTTCGATCTGGCCGGGCGCAGCATCGTATTATTCAGACGCCCCTGATAGTAAAACCGCGCTCCGGACCCAACCGGCCTTGATGGCCGGTTTTTT [...]
+CATTGTCTTGCATTCATACTCGCCACCTACACTGGCGGCGGTCAAACATAATTCATCGGTTATCAGTTCGTATTTTAACGTCGCGCCTGGCATGACCTGCACATGCGTAACCGTATCGCCTGGCCTGTTTGTTTTTGTAGACGACGCCGCCGAACATCCAAAAAAGTTGCGAAGAATTGGTAGCGATTTTACAAATGACATGTCTTACCTCAACCACCCGGTAAAAGTCATATATCGATAGCAGTATGTTACTCCAGATGAAACAATCGGCTCAGAAAGGGATATGTTCCAGCAGACAGGAATGTTATAAGGAGCTTCCCCCTTCGACACAAATAATGGTTGAGGACTGAGAACAGATGCAGCTGAATATGCTGGAAGCCATGAATATTTATGTCAATGTGGTAGAGCAAGGGAGCTTTATCCGCGCGGCGGAGGTGCTTGAGCTGCACCGCCCTGCTGTTACCCGCGCCGTTCAGAATCTGGAACATGATC [...]
+NODE 1155 2608 172052 171348 0 0
+CCCCCAAATGGCGAATAAAATAGCCTAATGGGCCAGGCTCTTAATCTTTCGCCATGCGGTTAAACTGCTCAATAGTAAGATCCCACGGCTCACGGGCCGCATCCGGCATAAAACTGCCGTCATCCACGCCAATTTCGTCCTTGATAATTTTATTCAGTTTCTCATTCATCGTAAGAATGAGATCCTGATATTTCTGTTTATCAGCAGCAAGGTTATGGTTCTCATCGGGATCATTTTTAAGATCGTAAAGTTCAAGATCGTTGTACTTAATAAGATCCTCCCAGGTTTCCGGCGTATTATGCTCCCTTAGTGAGAAATAGCGTGCAAACTTATAACGACCATCGTTAATCATCCGCGTCCCTGAACGATGGCTAAAATCAGGATGCAGATGGGATATTTCCTGCTTGATTTGCGCCACCGTTTTTTGTTTATCTCTTTGTAGCGCGATAACGCGGTGGAGATAATGGGCATCGGTATACAAGATCATGCCAT [...]
+ACCTCGGTTGATTATCTGAAAATAGACTTATTTGGTGTAACCGTCTTATATCTTGTTATAGTCACCTCTTTATGTTGTTGTCAATGTAAAATAATGCGCTGCCAGTTAAAAAGAAACTTAACCCCCTGTAAATAATAGTTTTTATATTATTTCTTGTAATGACGTAAGTTTTATTGAATCACGCGGTAATACGCTAGTTTTATTCATAAGCAACATAACAGAATTGAGTTATGTTTTAATTTCACAGAGTGATATTACCGGTTGTATGTCTATGGTTGCGCGGCCTGTTACTGATAGTGTTTCTTTCGGGGCGATTTTATTGTAGCGGCATAGGGTAATCACCGTAGCTGAAGGGAAAAGGCACGAACACAGCGCTATAGAGTATGTTTAATAATGTATTTTTTTATGAAGTAATGTCTGCAGTTGTATCTCTAAAATAAAAACAATGAGCTTTTCATCTAAATAATTTTTCAGTGAATTATGCTCATTTAT [...]
+NODE 1156 51 204 204 0 0
+GTTTGATTTCCAGCTGGTTACGAATATTTTCCAGCGTCTCTTTCACGACGA
+CCCCGCTACGAGCAGGAAAAGCTGGCGATGGATCGGGTGCGTCTCAAAAAC
+NODE 1157 85 4760 4711 0 0
+AAAACTTGTTTTACTGCCGATATTGATACCGCGGTGAAAGCCGTATCAAGTAAGAGATGGTGCATCCGGGAGGATTCGAACCTCC
+ACCGCGGTATCAATATCGGCAGTAAAACAAGTTTTCCGATGCATCCGTAGCTCAGCTGGATAGAGTACTCGGCTACGAACCGAGC
+NODE 1158 84 9694 7993 0 0
+CCGCGGTATCAAAATCTGCAGTAAAGTAAGTTTCCCGATGCATCCGTAGCTCAGCTGGATAGAGTACTCGGCTACGAACCGAGC
+GAAACTTACTTTACTGCAGATTTTGATACCGCGGGAAAGCCGTATCAAGTAAGGGATGGTGCATCCGGGAGGATTCGAACCTCC
+NODE 1159 2562 135209 133583 0 0
+CCGAAGAACGCCATCAGCGCGGTGCCGGTCATGCCGTGGCGACAATAACAGGGAAAGAGTATGCAGCAACCGCAGGTCTGGTTAGTCGAGGATGAACAGGGAATCGCCGATACGCTCATCTACACCCTGCAACTGGAAGGGTTTACCGTTGAGCTATTCGCTCGCGGGCTGCCCGCGCTGGAAAAAGCGCGTCAGCAACGGCCGGATGCGGTGATTCTCGATGTGGGACTGCCGGATATCAGCGGCTTTGAGCTGTGTCGGCAGTTGCTGGAACGCCATCCTGCGCTGCCGATTCTTTTCCTGACTGCCCGTAGCGATGAAGTGGATCGATTGCTTGGTCTGGAGATCGGCGCAGATGATTATGTCGCCAAGCCGTTCTCGCCGCGCGAAGTGAGCGCCCGCGTGCGCACGCTGTTGCGCCGGGTGAAAAAGTTTGCTGCGCCGTCGCCGGTGGTGCGTACCGGACATTTTGAACTCAATGAACCGGCGGCG [...]
+ACCAATAGCGACTCCGGCAACCAAAAATAGAGATAGCTGCGCTTATACTGGACCTCTTTCTCCTCTTCCAGCACGGTATAGAGCTCTGTCACCGGAACCGCCACCAGCGGGCCGACAACCTTTTGTGGGCCGCTGGTACTCTGACGAATAGCGGCTTCTACATGGCTTCGATAATCAGCACGTTCCACGATGGTGTGCCGTACCATCATCAGGGGAATTAACAGCAGGATCATGGCGCCGCCTAACGTAATCATTTTCCACAACAGGGGGGATTTCAACATAGCGTTCTCCTTTGCAATGCCAGCAGTGTAAGAACGCGATGTGGGGAGAATTTGAAGTTATGTGAAGTGACGGTGAAGTGTCAACGAGGCCAGCACGCCGCCTTCGGGACGATTGCACAACGTCACCTCACCGTTGAGGAGTCGCGCCGCCTCGCTGACAAACGCCAGCCCAAGCCCGCTGCTTTTACGCCCGTTTTCGCGGGGCAACGAA [...]
+NODE 1160 51 2787 2787 0 0
+ACCTCTTTGGAAGGGTCGTAACCCCCTGCATCATTCGTGTTCGTGACCAGC
+TTGATTGCGGCAATACGCCGGCCATTTCGGCGATAAAATTATACCGTGATG
+NODE 1161 28 1339 1339 0 0
+CTTGGTTCGATTCCGAGTCCGGGCACCA
+TGCTCTACCGACTGAGCTATCCGGGCAA
+NODE 1162 1 104 102 0 0
+C
+C
+NODE 1163 12 629 624 0 0
+TTATTCAGAAAA
+ATTTTCAATCCC
+NODE 1164 1678 110389 109510 0 0
+CCCAGCCTATGGCTGGGTTTTTGCTTTTCTGGGAATGGAAATCCGTAGCTCCCATCTCTGGCCTGACTAGCTATAACGAGAAGGCCAGATTTTCTCTGGCGCAACGCCCAGCGCTTCGTCGCTCAGCTTTTCCCCTTTGGGCCAGGGTCAAAAGCTTACTTAGCTACAGGGAGATTATTACCAGTAATAACGCCTATCACTTCATCTGACGGTTCGCTAACCCCGACAAGTGAATCCAATATCTCCGCCATGAACTTTTTCATCACTGAAAACAATAATCCCTTCGCCAATTTTGGCATTTTTTCTTTTTCGGTTTCTTTATTCTTAAATATTGTTTACGACTCTTGTTCATAATCATAAATTAATACTCAGCACATCATGACTGGTGGTAGTTGTCGGGGTAACAGGGCACATAGTTTAAAATACTTATTCATAGTTTGTTATTACGTAAACATTTTAACCTAATGCGTGTCAGTCAGGCACGCAGATAAA [...]
+TTTACCGCTTCAGCCGGACAACGACGTCATGACGGTCTGGACGGACTGCAAACGGGGGAAGGGGGCGTTGAATTCATGCGAATCGGGGAAACCAAAGGCATTCTCCACGCCCGGTCGCCCCTACGCAGTTGCACTTCCTTTCATTTGCTGTGGCCAGTTTGCGGGAAGACTTTCACCTTCAGTAATTAAGTTCGGGGCGTTCTTCTTTACTCAATAAATTATTTTTGTCGTTCAGCTCCTCACGGACTTTTGCCAGTGACTTCTGAAAAGCCGGGATTGTTTGCAGCCTTGCAAACTCTACTGCTCCCACATAACGGCCAGCATCAACATCGCTTTGCCAGTGAGCACCGCATATCACTCTGCTTTGCCCGAACTCCCATCCTCGTCTGGCGAGCTCCTGCGCGCGTTCCGGTCTGGCCTGGGATAATACTAATGCCAGAAGTGTACCATAAGCAGTATGCCCGGAAGGGTAAGAGCCATCTTTTCGCAAAG [...]
+NODE 1165 1709 83816 81674 0 0
+ACCCGGTAGTCGCAAAACGCGTTCGCCATGTATTGAGCGAAAATGCGCGCACCGTTGAAGCGGCAAGCGCGCTGGAGAAAGGTGATTTGCAACGTATGGGCCAACTGATGGCGGAGTCCCATGCCTCAATGCGCGATGATTTCGAAATTACCGTCCCGCAGATAGACACGCTGGTAGACATTGTCAAAGCGACCATCGGCGATCGAGGCGGCGTGCGCATGACCGGCGGCGGCTTTGGCGGCTGTGTTGTCGCGCTGATCCCGGAAGATCTGGTTCCCGCTGTTCGGCAGGCCGTTGCGCAACAGTACGAAGCGAAAACCGGAATCAAAGAAACCTTTTATGTATGCAAACCGTCACAAGGAGCAGGACAGTGCTAAATGAAACGCCCGCACTGGCCCCCGATGGTCAACCGTACCGCCTGCTAACCCTGCGCAATAGCGCAGGGATGGTGGTAACGCTGATGGACTGGGGAGCCACTCTTCTTTCCGCCCG [...]
+CCAGAACCAGCTTAGTTACAGCCATACTCTCACTCCTATAAATCATATGTAATGATAATAATTCTCATTATATTGCCGCGAGGTGTTGGCGGCAATGCTTACGCATAACCATAGCGAAAATAGTGGCGCAGTGTAAGGTTCTTGTGAACTCAGAGTTGCGATTTTGTCTTTAAGTGGTGGAGGTTTGAGCAGGGCAATGGCGCGTAGGCCCGATAAGCTTGCGTCATCGGGCATGTAGCGGCATATCGTTAGAACGGAATAAACTGATACTCGGTCAGGCTGGCGTACTCCTCGCCAGGGCGAAGGATACAGTCAGGCTGCGGCCATTCAGGATGATTCGGGCTGTCCGGCAGCAGTTCGCTTTCCAGCGCCAGCCCTTGCCAGTCGGCATAAGGTTCCGGCCCGCGGGAAGGTGTACCCGCCAGATAATTGCCGGAATAAAACTGTAGCGCCGGGGCGGTGGTGTAAACCATCATTTGTAGCTTTCCATCC [...]
+NODE 1166 2179 117737 111649 0 0
+CCAGTTTTTTTCTGAACGCAGAGTATAAAGCTGGACGCAGGCCCCCCACAGTTTTTTCCCCTCCAGCAGCGCCTGCGGCTCATAGCATCGCGGCGGGGCAACGATAATACGGCAGTGCGTACGCTGTTCATCCTGAGTCAACGTCAGGGCGTGGTAGCCCTCCGGCAATGTAGCCGGAAGGTTAAGTTTTTTACCGCCCGTCACGCGCCCTTTGTAATGCACGCCCTCTTCCGTAGTCAGCAGCCAGGCAAACTCACCGCGCCCCTCTACCGGCAACGCCATTTTTTTACCCGCGGTATACACCTTCACATTCGGCACGACCGCCTGTGGTCCTGTTGTCGTGCCGTGCATCGCCGCCAGCAAACGTCTCTTGGTTTCAGCGCCAATAGACTGCGGTTTGCCATGAGCATTGATGTAACTGGGGCTGATCCCCGCCGCCAGCGCGGCACTATCGAGACGTTTATTTTCCATCGCGCTCCCTTAGCGTTTTGC [...]
+CGGAAAAACTGACGAAGGTGCTTTATCCCAACGATAACCACACGGCGGGCAAAAAACTGCGCCTGATGCAGCAATACTTCCAGTGCGCCTGCTCGGTAGCGGATATTCTGCGCCGCCATCATCTGGCCGGACGCAAACTGCATGAGCTGGCGGATTATGAGGTCATTCAGCTAAATGATACCCACCCGACTATTGCCATCCCTGAACTGCTGCGCGTGCTGATTGACGAGCACCAGCTGAGCTGGGATGACGCCTGGGCTATCACCAGCAAAACCTTCGCCTACACCAACCACACCCTGATGCCAGAAGCGCTGGAGTGCTGGGATGAGAGGTTAATCAAAGCGCTGTTGCCGCGTCATATGCAGATTATCAAGCAGATTAACGACAGCTTTAAGACGCTGGTCGATAACACCTGGCCTGGCGATAAGCAGGTATGGGCAAAACTGGCGGTGGTGCACGACCGTCAGGTACGCATGGCCAATATGTGCGTGG [...]
+NODE 1167 1823 104244 103106 0 0
+GCTGAACAGTTCACTTAATGTTTCGCCGCCGTCCAGGCTGGCGAACAGTAATGCGCCCGGCGGTACGGCGCTGCCGCTGACCGTCACATTATGCGCCCCCGGCCCGCCTGCAACAGCGGAGACGATGGCCGATACCGCATCCTGCGCCATACCTGCGGCGGCGGCAGCCTGCGCCGCTGCCACCGCGGCTTTCACCAGTCCTGATGGCTCCGGCAATGCGCCAAACAGCGATCCCGCAGCCTGTTCCACGGCGGCTTCCGCCGCATCTGCCACGCTTCCGGCGACTGAATCTGCGGTGACACCGCCACTTTCTCCGGTTATCGGCGGCGTGGTTGTCGTCAGCCCTCCCATACCGGATTTATTATTTGTGGATACAAAACTCATGGTAGTGACTCCTTTAATACCGGATTAAAATAAATAGACTCACCGTCAGGAAACAGTGCCCCGCACTTTATAATGCAACCAGCCTGTTATATTTAAATATTTACCAGA [...]
+TGGTGGATGAAAAAAATAGAGGTCAGATGCTGTGAAAAAGTACGCTGTAGAGGTTCTGTTTATGTCTGCCTGTGCAGGAATGTTCCTGCCCGTATTTGCCTGGGGCGGAACAGATGTAAACATTGATAACCCGCTGGCGGAGTGTGTGGATATCCATCCCGTTCATCGTCAGGAAATGGATAACCTTACCATTCTGAAAACAACGGTCACACTGAAAAAAAGTACCGGTGAATGTGGCTGTTTCTCAACATTAATCAACTATACCAGCTTACTGGCGCAGGATGTTGAGGGTTACGGACGCGGAAGTGCATATTCCCTTCAGGAGGGGAATATTTCACTGGCGAAGATGCAGGGACGTTATCCTTTCAGCTTTGTATTATCGGTGGATAACCAGTCTGTACGGGATCAGAAGCTGGCGCTAATGATACGTTGTACACCACCGCTGTAATACACAGAATAGTCAGGGAGAAGATGATGGCAGTAAGACTGACT [...]
+NODE 1168 15 1494 1494 0 0
+CTCACGCAGCGCCGG
+GAAGGAGGCGCGGGC
+NODE 1169 6898 342044 339293 0 0
+GACACTGGCAGCTACGCTAACGTGCGGCGCTTTCTGAATCAGGGACAACTGCCGCCGCCGGAAGCCGTGCGGGTAGAAGAGATGCTCAACTATTTTCCCGCGCCTCAGCCCGTTGCGGATAAGCAGGATAACACTAAACCTATTGCGGCCTGTATACCGATGCCATTTGCGGTTAAATACGAACTGGCTCCCTCGCCGTGGAACGCGCAGCGTACGCTATTAAAAGTTGATGTTCAGGCCCGGGACATGCAGACCAGAGATCTACCACCTGCCAACCTGGTTTTTCTCATTGATACTTCCGGCTCTATGCAGCCAGCGGAACGCCTGCCGTTGATCCGGTCGGCGCTAAAACTGTTGGTGAACGATCTGCGTGCGCAGGATAACATCACGATTGTGACCTACGCGGGCGGCACTCACGTTGCGCTGGCGTCTACAGCGGGAAATAACACAACCGCGATTAAAGCGGCAATTGATAATCTGGATGCTTACGGG [...]
+AAAGGTGTCTCGCTGGGCGACCACCCGTTGCCACGCCAGTTCCGCCAGACGCGGGATCTCTACACACCACGGTTTACGTTTTTCCGCCGGATGCAGTTCCAGCCAGTCGGCGATTTTCGCTACCAGTCTGCGTCCACGATGGTGCGCAGGGTCCAGACGACCTTCAATATTGTCGATTACCCAGTACTCTTCCGGCTCGCAGGTTGCCTGCCATTGCAGTAAGCGTTTTCCGGTAAGGCTACTGCCAAGCTGGACGACAATTTGCGCCTGCTGCAGTTCGGTCACCGCTTTGGCGTTGCCGAGCCACAGGTCGGCGCACGGCAGCGGCTGCCCGGTTTGCGACAATACGTCGCCAATTAATGGCCATCCCAGAGTTTGCGCCCACTGCGCCACTTTTTTGCCTTCTTCCGCGCTCATACGCCCGGCGACGACAACGCCGCGTTTTTGTCGCCAGAAGAACCAGTCGCGCTGTTTGTCGCTTTCCAGTCGACG [...]
+NODE 1170 7223 366617 360733 0 0
+CGACGCATCCGCGCCACCGCCGCGTCATTGCTGTTGACGAGATATCCCAACCGCAGGCCGGGAATGGCATAAAATTTGGTCAGCGAACGCAGCACCCAGATATGCGGATTATCTTTAAGAGCAGGAATAAAGCCCGTCTCATGCGGAATAAAATCGATAAACGCTTCATCCAGGATCAGGTTAATGTTCAGCGATTTGCAGCGATCGGCAATGGCCTGTAATAACGGCCGCTCCGGCAGCAGGCCGGTAGGATTATTGGGCGTACACAGAAACAGGCAGTCCAGATCGGGCGTCAACGCCTCAAGAATGGCATCGGTAAGCTGCCAGCCATCCGCTTCGCGTAGAGACCAGCGACGAATTTCACAGCCAATTTGCGCCAGCGCCCGGCCATACTCCGCGAAACCTGGCGTGACAATCATTGCACGACGCGGTTTAAGACCGCTCGCCACGGTAAAGATTGACTCCGTCTCGCCATTTCCCGCCAGTATCCAC [...]
+ACGGTAACCAGGTCGGTTTCTTTAAATTTACCCGCTTTCATTGCCTGTCCGATGACGTAACTGGTCATCATCTTCGTCAGACTCGCCGGGTCGCGACGTTCGTCGGCGTTTTGTTCCGCCAGAACTTTACCGGAGTTGTAGTCGATCAGGATGTAGGATTCCGCATCGATCTGCGGAACGCCCGGGATCATAGTTTTGATATTCAGGTCATCGGCATGTGCGGTTGAGATAAACGCGGCACAAAGCGCCGTGGTGAGCGCCATGCGCTGCATAAAACGAGCGGAAAAAGTGGTCTTCATGGTCTGAACTACGACGTCCGTGATGAAATTAAAAAAAGAGCCCTACTATAGCAAAAGCATAACTGGCAGGCATCTGACTTTCCGCGTGACTTTGTTAATGTCATTTACAGAAATTGACAGTACAGATACCTGCGATCGGTTACTGCGCGCTGGCGATAAAGGACTGTAATTGTGCTTCTGTTTGCAAACGTTG [...]
+NODE 1171 51 2289 2207 0 0
+ACCGCCTGAACGCGCGCGCCGCGCATCCCCACGCAAGCGCCGACCGGATCG
+TCTCTACCGAACTGGGCGGTGAGCGTATCGATATCGTGCTGTGGGATGATA
+NODE 1172 1486 88170 84322 0 0
+ATACGTTTATCGTTGGTTTTCACTGCGATTTTCGCACGAGAACCCGGATCGCGAGCCGCCGCTTTAATTTCAATCACTTCTTCGCCGATTTCCGGCACTTCGATGCGGAACAGTTCGATCAGCATTTCCGGCTTGGAACGGGTGACGAACAGCTGCGCGCCACGCGCTTCCGGGCGAACAGCATACAGCACGCCGCGAATACGGTCGCCAGGACGGAAGTTTTCGCGCGGCAGCATATCTTCACGCAGAATCACCGCTTCAGCGTTACCGGCCATCCCTTCAGATTTAATTTCCAGAGAGATATTGTCGCGGTTTACTTTCTTCACCACGCCAGTGACGATTTCGCCTTCCTGGTCGCGGAACTGATCGACAACCATCGCCCGTTCAGCTTCACGCACTTTCTGCACGATAACCTGTTTCGCAGTCTGCGTGGTGATACGGTCAAAGGTGACAGATTCAATCTGATCTTCAACATAGTCGCCGACATTCAGG [...]
+CTTTCCCTTAGAGTTCTTTTTCAAATATACTGTGAAGATTATGTCCTTCGTAGCTGGATTTGAAAAAAATTCTTTCGGAAGGTACACCAGACCGCCGTTGCGGTTATAGGGTTCAGTTATCTAAAGCCCCGATTTATCGGGGTTTTTTGTTATCTGACTACAGAATAACTGGGCTTTAGGCCCTTTTTTTATGTCTTGGGGGTGGGCTTGTCCACATTAGAGCAAAAATTAACAGAGATGATTACAGCGCCAGTTGAAGCCTTAGGCTACGAGCTGGTCGGCATCGAATTTATTCGCGGTCGCACATCCACACTGCGCATCTATATTGATAGTGAAGATGGCATCAATGTTGATGATTGTGCTGATGTGAGCCACCAGGTAAGCGCGGTGCTGGACGTTGAAGATCCTATCTCCGTGGCTTACAACCTTGAAGTCTCGTCACCGGGTCTCGACCGTCCTATGTTCACTGCCGATCATTATGCGCGTTTCCAG [...]
+NODE 1173 2838 171985 169515 0 0
+TTCGAATGAATGACCCGCAACAGGGGTTTATGGCGTCTTTTATCAGCACCGATGCTCCGCAACAATGGCATATGACAGAAATCACTTGCCAGCTTACCGATCTGGCTGAAAAACATGGCGGCAGTTTTGATGGCTGGGGCGCACCGGTAGTACAGGCATAACAGGCGAAAGACAATATCTCAGGTGGGGCGAGCATTTCAGACCAGGAATATCTCTTTTTCCTCATTTCCAGAATCGACTCACCACAAAGGTCACAAAATCTGGTAAACTATCATCCAATTTTCTGCCCAAATAGCGGGGAATGTTCATTTTTTGTCTCGTTTCTGAGCAATGATGGCTTTTTTCGCCCTGGGTGACATAACATCTGGCTGGTCACATTGTGGCTGGTAGCAGTAAAAATTCTGAATATACCTGGAGGTTTTCATGGCTGTCGCTGCCAACAAACGTTCGGTAATGACGCTGTTTTCTGGTCCTACTGACATCTATAGCCAT [...]
+TACCTGCTCTCTTTCAGCAAGGCTCTGTACGAATGCTTCCCCGGTGGAACCGCCAACGTACAGCCCGTCGATACCCTGGCCGATGTTAAAACGCACCAGACGGCGCAGGCTTTCGCTATCCAGTTGCTGCTGATGATCAAATGGGGTCAACAACGCCGCCATTACGCCTTGCAATGCTTTTGCCATACCTACCTCTACGGATGATGAATATATTAACTACCTACCTTTATACCTGTTATACCAGATCAAATAAGCAGCAAATAATACAGAACGCTTATAGTGCGATCTGCTTCACTAAACTGGGATCGGAGGCGCGATCGCTACCGCATTTTTTGACTTTTTTTACCGAGCGCGTGCCAGGTAGCGGAAACGCTATTGAGGTGGGTTTGCAGAGCGCGATCCGCTTTATCGGGATCTCGCTGGCGAATGGCATCAACAATCACAATATGCTGTTGATAACTCACGTTATTATGTTCATGCAGCTCACGATCG [...]
+NODE 1174 288 15616 15616 0 0
+CTGGCGCGTTATCCGGATGTCAGCCTGAATATTGTGCCGCAGGAGTCGCCGTTGCTGGAAGAGTGGCTCTCCGCTCAGCGCCACGATTTAGGGCTGACGGAGACGCTTCATGCCCCGGCAGGAACAACCCGTACCGAGTTACTAACGCTAAATGAAGTGTGCGTACTGCCCTGCGACCATCCGCTTGCCGCCAAAACGGTACTGACGCCAGACGATTTTCAGGGGGAAAACTTTATCAGCCTCTCCCGCCTGGACAGCTATCGACAGTTGTTGGATACGTTATTTGCC
+TGATAAAGTTTTCCCCCTGAAAATCGTCTGGCGTCAGTACCGTTTTGGCGGCAAGCGGATGGTCGCAGGGCAGTACGCACACTTCATTTAGCGTTAGTAACTCGGTACGGGTTGTTCCTGCCGGGGCATGAAGCGTCTCCGTCAGCCCTAAATCGTGGCGCTGAGCGGAGAGCCACTCTTCCAGCAACGGCGACTCCTGCGGCACAATATTCAGGCTGACATCCGGATAACGCGCCAGAAAAGGCGGTAGTAGCGGCGGCAAAAAGGATTGTGAAAAGACCGGCAGGC
+NODE 1175 3727 195492 193297 0 0
+TCTGCATAAATGGCCCGTCTGACGTAGTCAGGCTTATCATAGCGCAGTTTTTAATTAATCTGGGTATGGGGATCGTAACGCTGTTAGTCCCCATGCTGCTTTTCAGCGCTATCGGCAGTGCTCAGACATTTGTTATTTTATTTAGCCTCTGCTTACTGTTCAAATTTATCATCGCTGGCTATCTGTCTATATTTATATACTCAATTCCTTATATAGGAATAATCGTAATTACTTTAGCGGTTATCGCGCTTTTGCTACTATTACCGCTCAAAAAAGAACTTTTCTATATTGCACCGCCCAAAAGGTTCTCATCAACCCAGCGACCTGAGTGCGCAGAACCCCTTGTCGTCGCATTATTGGCCTTTTTCGTTCCATTTTATATTATTTATTGGTTCTTCAGAATTCACCGGGAAATGCAATTTGTGGCGCCTTCGCCCCGACTCATGACCGCATGTGGCGCGGGATGGCTGTCAGCCATTATGCCGTTTGGCA [...]
+GTCCTGAATCAGCAGGGGCTGGATGCCGCCTGGCTGGACGCGCGCGCATTTTTACGCGCCGAACGCGCCGCACAGCCGCAGGTTGATGAAGGGCTATCTTATCCTTTATTGCAACAGCTACTGGCGCAGCATCCTGGCAAACGTCTGGTCGTGACCGGGTTTATCAGCCGCAATCACGACGGCGAAACGGTCCTGTTAGGCCGGAACGGTTCCGACTATTCCGCCACGCAAATCGGCGCGCTGGCGGGCGTTTCCCGCGTGACCATCTGGAGCGATGTCGCGGGCGTTTATAGCGCCGACCCGCGCAAAGTGAAAGATGCCTGCCTGCTGCCGTTGCTGCGTCTGGACGAAGCCAGCGAGCTGGCGCGTCTGGCGGCGCCTGTTCTGCACGCCCGCACGCTACAGCCAGTGTCCGGCAGCGATATCGATTTGCAGTTGCGCTGTAGCTACACGCCGGATCAAGGGTCAACCCGAATTGAACGAGTGCTGGCT [...]
+NODE 1176 1937 121448 120781 0 0
+CTGGTAAAAGTGCTGAGCAGTACGATAAGTAGCAGCCTGGAAACCGCCAAAAGCTTCCTGCAAGGATAACAGAAGAGGATATTAATAATGGTTACAAGTGTAAGGACTCAGCCCCCCGTCATAATGCCAGGTATGCAGGCCGAGATCAAAACGCAGGCCACGAATCTTGCGGCGAATCTTTCCGCAGTCAGAGAAAGTGCCACAACGACGCTGTCAGGGGAAATTAGAGGCCCGCAACTGGAAGATTTTCCCGCGCTGATCAAACAGGCGAGTCTGGATGCGTTGTTTAAATGCGGGAAAGACGCTGAGGCGTTAAAAGAAGTTTTTACCAATTCAAATAATGTCGCCGGTAAGAAAGCGATAATGGAGTTTGCCGGGCTCTTTCGTTCAGCGCTCAACGCCACCAGTGATTCTCCTGCGGCGAAGACGCTACTGATGAAGGTGGGGGCAGAGTATACCGCGCAAATCATAAAAGATGGCCTGAAAGAAAAG [...]
+TTTCAATTCTGGGTGCTTGTCAATATCGCTACATTGCGCTTTCAACGCTGCACTCTTTATCGTGTCATTGGGTAATATTTCCGCACGCAAGCCGTCAAACGCTCTGCGTACAGGAAACGGTGTAGAGGCATCCGGCTCCAGGGCTTTACGTATCACCCCCAAAAACGTCTCACGGGCGTCGAAATGCATTGAATGCATATTCGTAACGCTCGGTACTGTTGAGAGGAAACTATTTTGCTTAAACTTCAAACCAGAAAATGGGCCAGTCTTATCTGTCTGGCTATTATCATTATCGGTCGTACCGGCTTTATTACCTGTAATTACCGTCGAGTCTGATTGTAAGGTATCGATTTTAACATTCTCGACGCCAGCCAGTTGACTGGCAAGCGGCTTCACATTCACAATCTCTGCCGTCTGGCTTTGCTGTTTATTATCATCAACGCCGTGCACCGTGGCCTGTACAGGCTTGCCGATAATGTTCTTGCTGGTTAC [...]
+NODE 1177 43 20991 16500 0 0
+TGTTACGACTTCACCCCAGTCATGAATCACAAAGTGGTAAGCG
+CGTAGGGGAACCTGCGGTTGGATCACCTCCTTACCTTAAAGAA
+NODE 1178 8059 457059 449429 0 0
+AGCCATGTGCTGGCAAATTTTCGCTTACTGGTTGAGTTGCAGACAACATAACGCGTTTTTTGTCCCTGAAAGGATTTAGCGGTACTCAGGAATACTGAAGCCTTTATACACATTCTCTTCGGTTCGCTTCGCGGATGACTGCGCCTCATCGCCCCTGTCGTGCGCTGTCTGCGCACGCCGGGAACGTATTCGCCTGCCGTCCCGATGCGTCCTGAATGATTTTGTGTATCCACAAAAAAGCCGTGTAAAACCACGGCTAACCTGACCGAAAAAAGCCAAAAACCTGCGATCAGGTGGCGCAGACTATATCACCGAAGCCCAACGCTAACAAATAGCACGATCTTCTGTCGCGGGATAATCGTCAGCGTGAGAGCCGTATCACTTGTTTTCGGGCTACTTCACGCGCGATGGCGTCAACCTGCAATACGTCCTCAACGCTTGCCGGTTCCTGTAAATCCATCCTCTCCAGCACCGCTAAATTGAGCCCGGCGA [...]
+GATGGTGTGTTCATCCACCGTGTATGCGTGGAACAGGTCAAACTGCATTTGTCCGACGATGTGCGACCACTGCGGCATATAAGCCCACAGTACGCTGTGGCGATGCATGGGCAGCAGGCCGCGGCTGACCGCGCCGGGATGGCGTAGCATACTCAGAAACAGAGTGCGCGCCTCCGGGATGTAACACAGCGGTTGGCTCAGGTGGCGGCGGGCGTGGCGCAAATGGCGTAACGTCGTAGAGTAGATGCCGGTGATCGCGCTATTGCGCACCATCATATAAAACATGCGCAGGATCGCTTGCGGTTCGCGGATAAACAGCGTGTCGTCACGCAGATCAATGAGCGTACCGCGCAGTTGAAACTCATCGTCAACAGGACGTGGTTTTTCATCCGCAGGCAGCGCCAGAATCGCCTCGTCAAATAGCTGAAGCAGCATCTGATTAAGTTCGCTCACCCGACGCGTAACCCGGAAGTAGTCTTTCATCATCCGCTC [...]
+NODE 1179 8303 460546 457781 0 0
+CAAGCAGTAGTGTCACATAGGCAAGACAAGGCTTAGGTAAGCTTTCCAGGTCATTTAAGAACAAAGAAATAGAAAATGCTTCTGAGAAAATTTCTCCTCTGGCAGGATGCCCATCAATAGTCATTATCCAGGATCGGCTATTACCTTCGGCCTTGATATCCTGAATTAATGGAATGCCTTTTAAAACTGCCAGCATGAATCCCTCCTCAGACATAAATGGGAGTTTCTATCAAATTCGCTCACAACCACATCCGTAAAAAGCCTGATTCACATTTATTTCGACTATACTCTTCTTGTACAATATCAGGATGCTGTCTACATATACCTTGTCACAGGCGATTCTATCATTCGGATTTTCCGATAAATTCACAATTACACTTTCAGCATTGACATAAAAAATTACAATTTGAAAAATTATTTATTAAATAAACTGTTACGATGTTTTTACATCGCCACCTTATTAAAAAGTAATTGTAGTCATCGACTGGGTTA [...]
+ATCAGGAAGGCTTGATTAATAAAAAGGACTTTATCGCGCTGCTTGCCCGACCGACGCCCCTGCCTTGCTTAACCAGTACGCCGTTATATCCTGACTGGTCGTTCGCGGCGCTACCTGCGGTAAGCGATGCGCTGGCGGATCGCGTAACGCGAGCGCTATTCAACGCGCCCGCCGCCGCGTCATTTCACTGGGGCGCGCCAGCGTCGACCAGTCAGGTGGAAGCGTTGCTGCGTGATGTTCGTCAGCACCCTCAGCAGCGTCGACTGTGGCTGGATGTCAAAAGTTGGTTAATCCAGCACCAGCTAATGGTCGGCGGCGTGATTCTGGCGTTCCTGTTGCTCACGCTCAATTATATTTGGGTCATGCTGCTGGTGCGTCGACGTGGAAAACAACTGGAACGTAATAGCGTAGTTCTTCATCAGCATGAGCGGGCGCTGGAAACCGCCCGGCAAATGAGCGTGTTGGGTGAAATGACCTCCGGGTTTGCCCATG [...]
+NODE 1180 46 2756 2756 0 0
+GACCTTTCAAATGGGCTACCGCATCGCCAATGGTACGGTGAGTTTT
+AATGCAGATTCTGGCAACCCATCTTTCTGATAAGGCCGTAGACTTT
+NODE 1181 122 5751 5751 0 0
+CGAACCGTTACTGTTGCTGCCGATTGGCTTCGGCGGGCTGCTCTCCAACATCCCGGAAGCGGGCATGGCGCTGACCGCGCTGGAAAGCCTGCTGGCGCATCACGACGCCGGGCAGCTGGCGG
+AGCGCCATGCCCGCTTCCGGGATGTTGGAGAGCAGCCCGCCGAAGCCAATCGGCAGCAACAGTAACGGTTCGAACTTTTTCGCAATCGCCAGCCACAGCAGCAGCAGGCTCACCAGCAGCAT
+NODE 1182 13 549 549 0 0
+TGATTGCCGCGAA
+TTCCAGCGCGGTC
+NODE 1183 7 2667 2561 0 0
+ACCCGCG
+TGGAGAC
+NODE 1184 4287 275332 270529 0 0
+TTGAGCCAGTACATAGACTCCCGATCTGCAGGTAGGGGGGCGCCAGAGCGAATAACCCGAATACTGTTCTTTTGCCCGGCATCAAGGCGAAAAAGAGGCGGGGTGATAATAAACGCCTGCTTATTTGTGACCTGGGGATCGGCAACCGATAACCATGACTGAACAAGATTCGCTTTGCTGTCTTTATTCTCTACATTGATTGACGACTCATCATTATTGCCGTCGAAAACCAGTCGGGTTCCGCCAACAACAATGCTGGCATGGGCAACATGGCTTGTCAGTAATACGACCAACACGGATTTCTTTATGTGTTTCATTTTTTACTCTGTAAAGATGTTTTACGCTATGGACTGGCATCCTGCCTGTCCACATCAGGATGAGAATGCCTTACTGATACGAAACGGTATACGTAACCTGAGTGCTAACATCTCCACCGGTTACGGTTGCGGAACCATCGTTTGCCATGGCGGCGTAATAGGTAAAGTCTGCTTT [...]
+ACAGGAAATTAGCTGGCGTTTGTAAGCATATTACGCTTCGCAAATTTACAAAATTTTAACGGATATCACTGAAAAAGCATTTTTGATTTCGTAAAAGACGCTACACTATTGCGTATCTGTACTATTGCTGTTTATGTTAACAGAACATCGTTATCCTGCTGTTTATTTAGGATAATTTAATTTAAAATAGATCCTGTTCTTTGGATTCATCACATTTATTAGTTGGCTTACGTAACTAGTTGGAATATTGCAAATTTGTGATGAAAGCTAGCATTTAGCTACGATGATTTCATCAAACTGTTAACGTGCTACAATTGAACTTGATATATGTCAACGAAGCGTAGTTTTATTAGGTGTCCGGTACGTCTTAGCCTGTTATGTTGCTGTTAAAATGGTTAGGATGACAGCCGTTTTTGACACTGTCGGGTCCAGAGGGAAAGTACCCACGACCAAGCTAATGATGTTGTTGACGTTGATGGAAAGTGCATCAAG [...]
+NODE 1185 2249 110604 109971 0 0
+TAACTGTTCGCGGTAAAAGCGCCGATATTCATTATCAGGTCATCGTTGATTGCAAAGCCGGCAAGGCGGAATATAAGCCCCGCTAGCAGCGTAATTTGCGCTTCTTTTGCCGGAACAGACAATTCCTGACATCCCCTCAGGTACGCTTGACCATTATTGGTCTGTATTTGAGGGGTACTATGGCTAACTGGTTGAACCAATTACAATCACTTCTTGGGCAAAAAGGCGCTTCCGCATCGCCTTCCGGTGAACAGGGGTTAAATAAACTGCTGGTTCCCGGCGCGCTGGGCGGTCTGGCTGGACTGTTGGTCGCCAATAAGTCTTCGCGCAAATTATTAACCAAATACGGTACTGGCGCTTTGCTGGTGGGCGGCGGCGCGGTGGCGGGTTCCGTATTGTGGAATAAGTACAAAGATAAAGTACGTGCCGCGCATCAGGGGGAGCCGCAATTCGGCAGCCAAAGTACGCCGCTGGATGTTCGCACTGAGCGAC [...]
+GTCATTGAAGAATAGCCGTAACGCAGCCGGGAGGTCTCAGGTTCGGGATTATAGGCAAGCCAGGTCACGTAAGCCGGATCGTCAAAGGCGATGCCTATCACTTCACGGGTTTTACGGTTAATTTGCCGCAGGCTGGTAAGCCCCCGTTGACGCTCTTCTACTACTAACCAGTCGGTAAACAGGGTAAACCCTTCCAGCATGATATGCTCGCGCGGAGGGATCAGCTCTTCCCAGGCGTTTTCATTGCGCACGCGGGTACGGTACAACCCAAAGTTTTTACCGTTCCGGTTAGAACGCAGGTAAAACTTATGTTGATAGTGATCGAGACTATATTCATGGTCTTTGCGGCGCGGTAAAAATGAAAACGGCTCGGCATCGGCCAGTTCCGCGTCAAGTAATAGCACTTCGCTAGTGGTGGCGCTGGCAAGATGAATCACCACATAATGCTGCGAAGTGGTTTTATGCAGGCTGACATAAAAGGTATCGTCTTTC [...]
+NODE 1186 17 870 870 0 0
+TACTTAAACAGACGGAA
+ACAAGGTATCTGGCGTC
+NODE 1187 1513 88647 87829 0 0
+AAAGCGGGTAAGATAGCAGGCGATTAATACATCACTTTATGACCATACTGCTCAAGAATACCCTTTACACGCTCCATGGTCTCTTTTTTAGGCGGCTTCACGCCATCCAGTTTATATTCTTCGCCCATTGCCACCCATTTATGTTTGCCCAGCTCATGATAGGGCAACAGTTCGATTTTTTCGACATTACCCATATCGCGGGTAAACTCGCCCAGGCGATGCGCGGAATCATCGTCGTCAGACCAGCCGGGAACGACAACGTAACGGATCCAGACCTTCACATTTTTCTTTGATAAATACTGCGCGAATTCCAGCGTCCGGTGATTAGAGACACCGACCAGATTCTGGTGGATCTCATCATTCATCTGCTTGAGATCGAGCATCACCAGATCGGTAACGTCCAGCAGTTCATCAATCACCGGGTCATAACGGCGCACAAAGCCGTTGGTGTCGAGACAGGTGTGGATACCTTCTTTTTTACAGGCGCGAAAC [...]
+CGTGAATGATTAATTTCATAGTGATGATGATTACCAAAACTTAACGTAACTGGCATAATAACTCCCTTGATTATTTACCGCGAAAGCAAAATCCAATCCGTTGCTCTCATTTTTTGATTAAAACCACACTCTATTTAAGAGATTGAATCAGTCCGGGTTTAGAAATAACATCAGATTTACACCTGATTGCACGTTGAATGCGACGCCAGGCACTGGACAGGCATAACGTTCTTTGGACACATCTGAATTATGTTGAGAATTATTTTCGTTCTGACCACAACAAAACGGCGCCAATCATTTGAAAAAAGAGGCGGATCATAAACAGCAAAACCAGGGCGCTATGAATGATACACTTACAGTATGTATTGCGGTTCGGGCGTTAAACAGAGGTACCGGGCTGATGAATGAGCCAGAATTTCTGGCGGTGCAAGTTATGCAGCATAGATTTGCCGTATATTTTATAATGAATAGAGGTAAAATAGCTCCATTGCA [...]
+NODE 1188 549 31632 31446 0 0
+TGGTGTTGATCGCAACGATCCTCGGCATGATCTTTGAGAAAAAGATCGGTGTCAGCCTGGCCGTGACCGGTTGTATTGGCGCTCTTGTGCTGGTAGTAAGCGGCGTACTCACGGAAAAACAGGCCTATAAAGCCATTGATTCACAGACTATTTTTATCTTTGGCGGCACACTGGCGCTGGCAAAAGCGCTGGAAATGACCGGGGCAGGCAAGCTGGTTGCGGACTATGTAATCGGCATGCTGGGGCAAAACTCCTCACCGTTCATGTTGCTGATCGCCGTTTTCGCCTTATCCGTTGTGATGACCAACTTTATGTCCAATACCGCAACGACAGCGCTATTGGTGCCGGTGAGTTTGTCCATTGCCGCAGGCATGGGGGCCGACCCGCGTGCGGTTCTGATGGCGACGGTCATTGGCGGTTCCTGCGCCTACGCAACCCCTATCGGTATGCCTGCCAACATGATGGTGCTCTCCGCGGGTGGCTATAAATTTG [...]
+TAGTCGACAAATTTATAGCCACCCGCGGAGAGCACCATCATGTTGGCAGGCATACCGATAGGGGTTGCGTAGGCGCAGGAACCGCCAATGACCGTCGCCATCAGAACCGCACGCGGGTCGGCCCCCATGCCTGCGGCAATGGACAAACTCACCGGCACCAATAGCGCTGTCGTTGCGGTATTGGACATAAAGTTGGTCATCACAACGGATAAGGCGAAAACGGCGATCAGCAACATGAACGGTGAGGAGTTTTGCCCCAGCATGCCGATTACATAGTCCGCAACCAGCTTGCCTGCCCCGGTCATTTCCAGCGCTTTTGCCAGCGCCAGTGTGCCGCCAAAGATAAAAATAGTCTGTGAATCAATGGCTTTATAGGCCTGTTTTTCCGTGAGTACGCCGCTTACTACCAGCACAAGAGCGCCAATACAACCGGTCACGGCCAGGCTGACACCGATCTTTTTCTCAAAGATCATGCCGAGGATCGTTGCGATC [...]
+NODE 1189 64 23564 23033 0 0
+ACAGGTTTACCTGTGTGACTGCGTACCTTTTGTATAATGGGTCAGCGACTTATATTCTGTAGCA
+ACAGGTAAACCTGTGCTCCCACTGCTTGTACGTACACGGTTTCAGGTTCTTTTTCACTCCCCTC
+NODE 1190 5302 302921 297510 0 0
+TGATGTTCCTCAAGCCGGGAATGCAGGTACCGGTCTCTCAGTTGATACGCGGCATCAATCTGCAATCCGGCAATGACGCCTGTGTGGCGATGGCTGATTTCGCCGCCGGTAGCCAGGATGCTTTCGTCGGGCTGATGAACAGCTATGTGAACGCGTTGGGGCTGAAAAATACCCACTTCCAGACCGTACACGGCCTGGACGCCGACGGACAATACAGTTCAGCTCGCGATATGGCGCTGATTGGTCAGGCGTTAATTCGCGATGTGCCTAACGAATATGCCGTTTATAAAGAAAAAGAGTTCACCTTTAACGGCATTCGCCAGTTAAACCGTAACGGTCTGCTGTGGGATAACAGCCTGAATGTGGACGGCATCAAAACCGGCCATACCAGCAAAGCGGGCTATAATCTGGTCGCTTCCGCAACCGAAGGCCAGATGCGATTAATTTCCGCCGTGATGGGCGGACGGACCTATAAAGGCCGTGAAACAGAAA [...]
+GCAAGAATCCCAAAGTATTGATGCCGGAACCGTTATCGCGCCTGTGCTGGACGTGGAGGGGGTTAAGGTGGGGCTTATGACCTGTTATGACCTGCGCTTTCCTGACATGGCGTTAGCGCTGGCTTTACAGGGGGCTGACGTATTGGCGCTGCCGACGGGCTGGGTTCGCGGCCCGTTGAAAGAGCAGCAGTGGTCGACGCTGCTGGCGGCGAGAGCGCTGGATACCACCTGCTATATGATTGCGGCCGGGGAGTGTGGTAATCGTAATATTGGTCAAAGTCGTATTATCGATCCGTTGGGGGTAACGATAGCCGCGGCAGCCGATCGTCCGGCGCTGATCGTCGCGGAAATATTCAGAGAACGAATAGACCAGGTGCGGGAGCAACTTCCTCTTTTGCAGCAACGACGATTTGCGCCACCGCAATTATTATGATGTTTTTTTACGCAAAGCTTGATTCACCTTGTTACAGATTGCTATTGTGTGCGCGCGTC [...]
+NODE 1191 411 18760 18760 0 0
+ATTAACGCAGCCAGTATCCGCGGCCAGCGCCACGGCATCAGTTCTTCAAGCAGCGTTCCGCTCGCCCACGTCCAGCCGTGCGCGTCGCGACCAAAAGAGAGCGCGCCCCATGTTGCCAGCAGCAGGAGCACGCCACCGGCAACGGCAAAAGCGAGGACATGCCGACGTTCCGCCGCCACACGATCGCTGGCGTTCATATCCGGCGCGCTCATGCTTTTAAGCCGCGGCAGCAGCCACAGGAGCAGCGGCGCGCCGATTAGCGCCGTCACTGAACCGGTGGAAACTTCCATCCATACGCGGGTGAGCCAAAGGATAATCTGATCGGATAGCCACAAAATAAGCGCCCCAATGAGCGGCGCCAGCATCAGGCGCGCCAGCAGACGTCTTGCGCCAAGCATTTTCGCCAGCAGC
+TGGCGCCGCTCATTGGGGCGCTTATTTTGTGGCTATCCGATCAGATTATCCTTTGGCTCACCCGCGTATGGATGGAAGTTTCCACCGGTTCAGTGACGGCGCTAATCGGCGCGCCGCTGCTCCTGTGGCTGCTGCCGCGGCTTAAAAGCATGAGCGCGCCGGATATGAACGCCAGCGATCGTGTGGCGGCGGAACGTCGGCATGTCCTCGCTTTTGCCGTTGCCGGTGGCGTGCTCCTGCTGCTGGCAACATGGGGCGCGCTCTCTTTTGGTCGCGACGCGCACGGCTGGACGTGGGCGAGCGGAACGCTGCTTGAAGAACTGATGCCGTGGCGCTGGCCGCGGATACTGGCTGCGTTAATGGCGGGCGTCATGCTGGCGGTGGCGGGCTGCATTATTCAGCGTCTGACCG
+NODE 1192 8 2105 1700 0 0
+TTTGACTC
+GTGTCCAA
+NODE 1193 20 4784 3761 0 0
+GCTACGCTCGCCCTTCGGGC
+CCGGTTTTTGCGCGCTGTCC
+NODE 1194 36 9005 8445 0 0
+CCAAAACGCGTTAGCGTTTTGAACGCCGCTAGCGGC
+GACCAAAATGGCAAGTAAAATAGCCCTAATGGGATA
+NODE 1195 3 650 417 0 0
+GGC
+CAG
+NODE 1196 4 1036 486 0 0
+CGAG
+CGCG
+NODE 1197 6 1431 654 0 0
+TCAAAC
+CGCTAA
+NODE 1198 142 4188 4188 0 0
+TTGGCATGGTACTGGGTAATGCCGGTACCGCCACCGGGGCCTATGCGAACGCGTACCGGCTGGACCCGAAAAACCGCGATGCGGCGCTGGGCTACGCGGAGGCGCTGACGCGCTCGTCCGACCCGGAGGATAACCGCCGCGG
+GCCCAGCGCCGCATCGCGGTTTTTCGGGTCCAGCCGGTACGCGTTCGCATAGGCCCCGGTGGCGGTACCGGCATTACCCAGTACCATGCCAATGCGCCCCAGCATGAGCCAGCCCTCAACATTGCCGGCATCATTCTGCAGG
+NODE 1199 165 5220 5220 0 0
+CTTCAGCATCATCTCCCAGGCCGCCACCGCCTCGCCGAAACGCTGCTGCTCAAAGGCGCTGAACGCATACAGGCTTAACACCCGAATATCCGTGTGGTCACGGCTCACCAGCCGGCGCAGCAGCTCCCCGCCGCGGCGGTTATCCTCCGGGTCGGACGAGCGCGT
+CCGGCTGGTGAGCCGTGACCACACGGATATTCGGGTGTTAAGCCTGTATGCGTTCAGCGCCTTTGAGCAGCAGCGTTTCGGCGAGGCGGTGGCGGCCTGGGAGATGATGCTGAAGCTGCTGCCGGCGGGTGACGCCCGGCGGGCGGTGATAGAGCGCAGTATCCG
+NODE 1200 2398 125868 124908 0 0
+TCCGGGCGGCATACTGCTGACATTCTCTTGCTCCGGACTGATGACCAGCGATTTATTTCAGAAAATCATTGCCGATGCCGCAATAGATGCCGGTCGTGATGTACAATTTATAGAGCAGTTCCGTCAGGCCGCCGATCACCCGGTGATCGCCACCTACCCGGAAGGGCTGTATCTGAAAGGGTTTGCCTGTCGCGTCATGTAACTTGAAAAGTGGAATAGTATCCTCATATAAAGGGTATCTATTTCCCGGGAGGTGACTATGATAGCCAGCAAATTCGGTATCGGCCAACAGGTCCGCCATTCCCTGTTAGGTTACCTCGGAGTGGTCGTCGATATCGACCCGGAATATTCGCTTGATGAACCGTCGCCTGATGAACTGGCGGTTAACGACGAACTTCGCGCCGCTCCGTGGTACCACGTGGTAATGGAAGATGATGATGGTCAGCCAGTGCATACTTATCTGGCCGAGGCCCAGTTGCGAAGCGAAATGCG [...]
+TGGATGATAAAGTCCGCCGTTGAGACGTTAGTGGCGACAGGGATATTCCATACGGTGGCCAGACGCAGTAGCGCTTTGACATCGGGGTCGTGCGGTACCGCGTTAAGCGGGTCCCAGAAGAAAATCAACACGTCGATTTTCCCTTCTGAAATGAGTGCGCCAACCTGCTGGTCGCCGCCCATCGGGCCGCTCAGCATCGCATTAACGTCCATACCGGTTGCGCGCTGGATCAGATTCCCCGTGGTGCCGGTTGCATAAAGAACGTGTTTTTCCAGCAACGGCTGATGGCGTTCCACCCAGTTCATTAACATCTGTTTGCAGTGGTCGTGAGCAACCAACGCGATATGTTTGCGCGTCGGCAAGGTGCGAGTCGTCAGTTCCATAATTCGATTCCGTAGTTAACCTGTCTACAGATTACTGGAAGCGCTTGATGCTGCAAGAGAAAGACAAAAAAATTGCGCGCTGGGACAACTCATATCAAGAGGGCGGCTG [...]
+NODE 1201 1670 105625 101774 0 0
+GTACCTGCCGGACGGGTACATATCGTCGGCAAGGGCGATACGGTGCCGGTGGCGGATAACGGCAGTAAAGCCGGGCGGGCGAAAAACCGTCGGGTGGAAATTCTGGTAGTGGAGTGAATGAATGATGAAAAAATCAACCTATGATGTGTCTCATCATTCGGCAGTATGTGGCGTGACGGGGGATTATTATCGGATCTCAGCGACATATCACATAAAACGATCTGTTCGTGTTTTTTTGATCATTTTATGTTGTTTATTACCCGGTGGCGTTTTTGCCGGGTCCCTGATTAACGCAGGATTCATTTCCCCCGATAATGTCAACCTCAGTATACGGGATTTTCTGGGATTTTATGCCAGTGATAACTTACAGGAAAAAGATAATACACTGATGTATGTGTTGGGGGTAGCGGATGCCACAGAAGGTAAGACGTGGTGTGGATATGGTCAGGTTGACAGTATAACAATAAACCATACTGTGCTGGCCTGGCTTGA [...]
+GAACGCCCACAACTGCCAGCGCGCGCCGGGAAAAAAGCAGACTAAGAAATTTTTGCATTATATTTCGACTCGCCACCCAATAATCAATATTTTAAAATTCCCTGAATAAAGTAATATAACCATTAAATCTTACAGAACACTCATCAGCGTTCATGAAGCTGGATGCAATGAAAATATCTTTTTCTTTATCTTTGTTAATATAGGTATATTTTGCCACGATAGATTTAACCTGATTTTCATAGTAACTATCGAAATAGGATTTTTTATCTAATATTGCCACTTTATTTTTGGCCTTATCTTTTTCATAATCCATCCTGGCCAGAGATTCTGCATAGACCTTAGATACAGGCGAGATATCAAGAATCTCTACCTTTGTTTTATCCTTTATAATAGTAGCGACATCTATATTCAGGTCATTTTTTATGGCATCAAATAATGATGACTCCATTGATGCTCCAACCGTAGCACACCCATAATCGTGCGCATAAGAAA [...]
+NODE 1202 1223 59083 58273 0 0
+GTCAAGGCCAGCCGGAAATGCTCCGCCCCCGCCCCCGGACTTTCGCCTGACATCGCGGCAGCGCTTAAGGAAGTGATGCCCGGCGCGGGGGGGAATTCCTGTCTGGAGCGCTACGAATATGCCAAACATGGCGCCTGTTTCGGGTTTGATCCCAATGCCTATTTCGGCACCATGATACGGCTGGATAAGGCGATAAAAGACAGCGCGCTGGGGCAGTTTCTGGCGGATAATTACGGCAAAACCGTTAGCCGCGCTGAGTTTGATAGCGTCGTCGCACAAATGTGGGGCCAGGATAATGTCAAAGCCGTTAAAGTAAACTGCCATGGCAATCCCGCCTATTTAACAGAGATTCAGTTTTCATTAAAGGCGTCGATGATTAACGCCCCGCTCTCCTCTGCCTCATTCCTGCCGCAGCCGCATCCCGGCAACTGCGGGAAACAGTTTATTATCGATAAAGCCGGTTATTGACGAAGCAGAGGTTTAAAACCGTAG [...]
+AACGGAAAGAGGATGCGCAGGCATCCTCTGTGTAAACGCATTAACGCTTATGCAGATGGTTTAACGCAGGAAGTCGCCCGCGGCTTCAGGCTGATATTCGAGTTCCAGCACTTCGAGATGGGTGGAGGCGCCGCCCGGCAGTTCCCAGTGAATGGTGTCGCCGACGCGCAGTCCCAGCAACGCCGCGCCGACGGGCGCCATTACCGAAAGCTGGGTACTGCTGTCCGTCATATTGGCGGGGTACACCAGCGTCCGCACGCGTGTTTCACCATCGCTCAAATTGCGGAATTTAACGCGGCTGTTCATGGTGACGACATCGTTCGGCATCTCTTGTGGCGAACACATTTGCGCGCGATCCAGTTCGGCGTTGAGCGCGTCGGCAATCGGCAGATCCGCATACGCAGGCTGTTCCAGAAGACGATCAATACGTTCGGCGTCAAGGTCGTTAATGATAATAGTGGGTCTGGACATTTCTTACTCCATGTCATCGAT [...]
+NODE 1203 988 54710 53865 0 0
+ACATTGTGACGTTGATCCTCGGTATTACCGTGGCGATGGAGGAGAAAAATAGCCAGCAGAAAGAGATGGACGCCAGTTCTATCGATAACGTCAAAGCGTCGTTAATGGGGCCGCTGGCGGGTATTGGCGACTCTTTTTTCTGGGGAACATTGCGTCTTATCGCCACTGGCATCGGTACCAGCCTGGCGCTGAAAGGCAATATTCTGGGGCCGATTTTATTTCTGCTGGTGTTTAACGTACCGCATATTCTGGCCCGCTGGTTCTTTACCCGCTGGGGCTATGTGCTGGGAACCGGCGTACTGCAACGTATTCAGCAAAGCGGAATGATGGAAAGCCTAACCTATGGCGCCTCGATTATCGGTCTGATGGTGGTTGGCGCGATGACGGCCTCCATGATTGATATCACCATTCCCATTACGTTTGGTACGGGAGAGGCGAAAACCCATGTCCAGGACATTATTAACGACATCATGCCTTGTCTGCTGCCGTTAA [...]
+AACTTTACGCATCGCCTCCAGGGTAGAAGCGCTTTTCCCGCTCTGGGAAATAGCAATAACCATATCGGCTTGCGGATCGCTATTCTCATACTGGCTAAAGGTGTACGGCTCTTTAATATCGATAGAGATACCGCAGCGCTCAAAGAAATAACGGGCGCAAAAGGCGGCATTCAACGACGATCCGGTGGCTAATATCAGGATTCGCCGTAACGTTTTTTGGCTGGCGAACCGCGATACTTCTTCCAGCGACTGGCGATGGCGGCGAATAATATTCGCCAGGACGTCAGACTCTTCGTTAATATAGGTCAGCATGGTTGGTGACATTGTGTATCCCTCTTAAAATAACCCTATCCAGGAACCGAAAATTCCCACCAGCGCAATACCGCCAATGATGGTTAACGGTTTCACTTTTTTCCCTAACAGCCAGTACACAATGGCGAAGCTAATTAACGGCAGCAGACAAGGCATGATGTCGTTAATAATGTCCTGGAC [...]
+NODE 1204 2256 159187 158875 0 0
+GCGGCTGATTTCGCCGCAAAGGTGCGTTTGACAATTTTAAAACGGACCGGACAGAGAGAGCCTGCACCTGAATATACTGAGGTAGCCCGTCCCTCCGGGGCGTGCAGATGATCCCGTCACCAGAAGATTGCGGACCTCTCTGAAAACCAGTACATTACGCGCGGGTGCCTTTCGGCTGACGGCTGGAAGGATTACCTGAAGGCCGGATGTGGAAAGGCCCCGGAAAACATCTCTGTTTAGCCGAGGCCCTAATCTACATACCTTTAGCAAGTGGAAGGTTAGCGCCTCTTTGAAAAAGGAGCAAGCGCTATGCCGCAAAAAACGATCATCGTGAGCATTTTATGCTTAACCATGTTGTTGACCGTCTGGATGATACATCGTTCACCATGTGAATTCAGACTTAACATCATGTGGTCAGAATTTGCGGCGTTCTTGCAGTGTAAACCGTAAGAAACCGCAGCGGGGGTGAAAGCCCCCGCTATCCGGTTGCCG [...]
+AAGCGACAGTTAATGCAGATGCAGGTTAACAAAAAGAGAAATCTGCCGTCAACCATATGAACATGTTGATTTCATTATGAATGTGTTGTTTTAATATAAATTAATCAGTAACTTCATAAAAAGAATATAAGAAACAGATAATGCATGTATTTACATGCATATCAGCACAATGATAAATTACCCCCCTGAAAACACGATAAAGGTATAATTATGGAAGTTTCCGTTATATTTTTCTGGGTTATCACTGCTCTTATTGCCATCTTATTCTTAAAATCAGCAATAACCTACAAAATAAAAAAGCGAAATAAAACAGACATAGTGTTATATATATTGGCATTTTTATCAGCCGGATATACATTCCAGTATATTTACAATGACAATATATTTTCAGCGCTAAGGAGCATTGGCCTGTTTGTTACTCTGATAGTACTGAACATAGTATTTAATCTCTTGTTTAGTCTCTTATGCATTCTCTCGAAAATGATATTAATG [...]
+NODE 1205 2598 126750 124999 0 0
+AATCCGTAGGCCAGATCCTGAAACGCTGACCAGACGCCGAGGGCCGTACCACGAATCTCCGGTGGCACTCTGCGCACAACCTCTACGCCCAGCGATGGGAACATCAGCGAACAGCCGCAGCCGGTAATCGCCGCGCCAATCAGCGCAGCGCCTGCTGACGGAGCGGCCCACATTACCGCCAGTCCGGTCCCCTCTACCAGTAGTGAAAAGGTTGCGACCGTGGCGCCGCCGTAACGGTCGGGAAATTTGGCGCAGAAAAAGCGGACAGCGATAAACGCAATGCCAAACAGCGTCATCGCAAAACCGGTGTTATCCCAGTGACGCTCGTTGAACCAGAGGGCGGTAAACGCGCTTAGGGTGGCAAAACCAATGCCCTGGAGCACAAGCCCTGTTCCGGGCCGCCACACCAGGCCGACTACCCGTAGTACTGGCACGCGGGGACGGGCTGTTGGGATATTCCCCGGAATGCCATAGATGACTCCACTGGCGATG [...]
+CGCAAAAACACGGGCTGCGGCGGGCACTGGATATCGACTACCGCCCCGTACTGTGGGGCCTGACGTCGCTAGGAGACGGTGAAACGCGTTTCATCGCCTCATCACAGGTTACCGAACAGCTCCAGCAGGTATTGCGCCATTTCGATCTGATCGTTGGGACCGAAGAAGAATTCCATATCGCCGGCGGCAGTACCGACACGCTGACCGCCCTGCGGCGCGTCCGTCAGTTGACCCAGGCCGTACTGGTGTGCAAACGCGGCGCGCTGGGCTGCTCAGTCTTTGAAGGCAACATCGCCGATGACTGGTCGCAGGTGAAGATACATAGCGGCGTTCGCGTAGACGTTCTGAACGTTCTGGGCGCGGGCGATGCCTTTATGTCAGGACTGCTGCGGGGATACCTGAACGATGAAAGCTGGGAGCAAGCCTGCCGTTATGCAAACGCCTGCGGCGCGTTAGTGGTATCGCGCCACGGTTGTGCCCCCGCCATGCCAA [...]
+NODE 1206 4495 220120 218284 0 0
+GATTAAACTGACTCATTAAGGTCGCGGATTCAGTATTCAATACCTTCAGTCGCGCTTTATCCTCTTCGGCAAGCCGCGCGCCTGCCAACACAAAACGCTGATGGATAACATCGACCAACCGTAGCGACTCATCATCCAGCCCCAGTGAGTGACGCTGTTGCCAGACGGTATCCACGCGAGCGAATAACGCGCTATTCAGATAAATATCGTTGGAGAGCGCCGCCAGCTCGGCAGAAAAGGCCTCATCCAACCGCTGGAGTTCATCGTTAGTGTGTGCGGCCGTCATCGCGAAAAAAACGCTGGTGACGCGTGACAGAAGCGCCCCGCTTTGCTCCAGCGCCAGAAGCGTATTCGTAAAGTCAGGGGCCGCCGGATGATTGACGATGGCCTCGATTTCCACGCGTTTTTGCCGCACGCCCTCATCAAAAGCAGGACGATAATGGCAATCTTTGATCCGATCAAAACGCGGTGCCTGATAAGGCAACATACTCT [...]
+ATTCCTGGCTGCCCATCTTAATTATGCTGGTGCTCTACTCGTGTATTGGTCTGATTTCTGCGTTGTTGATGCCGGAGGTCAGAGATCGCGATCTGAGCTTGCCTGAGGATGCGGCGGAAGCGACAGCGGCAGAGAAGTTACGCCACTCCGTAACCCAGACGAGTTAAATCGTGTCGACGGTATGGCCGGAACGCTAATGCGGTTTCGGCCATGCTGCCCGGTCACTTTTGTTTAATTAGCGTAAATCCAAATGCACCAGGGCAGGCGTTACTCTGCGACTGTTCCGCTTTCAGAATATAGAGGTTATAAAATGCAAAACAGGCTTTTATCGGCAAAGGCGACGCTTCCTGATTACGATCGCGCGGCGCTGGCGGCGCGGATGGTCCATCTCGGTTTTGGCGCGTTTCATCGCGCGCATCAGGGAGTTTATACAGATATTCTGGCTGCGGAGCAGCATAGCGACTGGGGCTATTATGAGGTTAATCTTATTGG [...]
+NODE 1207 1432 78284 77727 0 0
+GTACCCCGGACATCCGCATTGCAACGGTGACTAACTTCCCGCATGGCAATGATGACATCGATATTGCGCTGGCGGAAACCCGTGCGGCGATCGCCTACGGCGCTGACGAAGTGGACGTGGTATTCCCGTACCGCGCGTTGATCGCCGGTAACGAGCAGGTGGGTTTTGACCTGGTAAAAGCCTGTAAAGACGCTTGTGCCGCAGCGAACGTATTGCTGAAAGTGATTATCGAAACCGGCGAGCTGAAAGAAGAGGCGCTGATTCGTAAAGCCTCTGAAATCTCCATCAAAGCCGGTGCGGATTTCATCAAAACCTCTACCGGTAAAGTGCCGGTAAACGCTACGCCGGAAAGCGCGCGCATCATGATGGAAGTGATCCGCGACATGGGCGTTTCTAAAACCGTTGGCTTCAAACCGGCGGGCGGCGTACGTACGGCGGAAGACGCGCAGAAATTCCTCGCGATTGCAGACGAACTGTTTGGCGCTGACTGGG [...]
+CGCTTCAGCAAGGGCTTCAGAAAGTTCATAGGTCGGCATAAACGCGCCGCTACCGACTTTGACGTCCATTACCAGCGCATCCAGCCCTTCGGCCAGTTTCTTGGCGAGGATGGAACCGGTGATCAGCGGAATAGAGTCCACCGTCGCGGTAATGTCGCGGGTGGCGTAAAAACGTTTGTCCGCCGGTGCAAGCGAGCTGGTTTGCCCAATAATCGCCACACCCACGTCTTGAATAATTTCGCGGAAACGGTTGTCGTCCGGGAAGATATCAAAGCCCGGGATCGCTTCCAGTTTATCGAGCGTACCGCCGGTATGTCCGAGGCCGCGACCGGAGATCATCGGCACATAACCGCCGCAGGCCGCTACCATTGGCCCCAGCATCAGAGACGTCACGTCCCCTACGCCGCCGGTCGAATGCTTATCGACAATCGGGCCATTGAGATTCAGGCTTTTCCAGTCAAGGACAGTACCGGAATCCCGCATCGCCATGGT [...]
+NODE 1208 6321 283029 280388 0 0
+CACCTGTTGGCGCTTTTCGGCAGGAAGCTGGAGATAATCCAGCACTTCATCAACCAGAAGCTGCCCTTCGCGATCCGGGTCGCCAGCGTGAATAATTTCACCGGCTTGATGCAAAAAGCGCTTAATCACATTGAGCTGTTTGGTGACGGAAGGACGAGGCTGAAGCTGCCATTTTTCCGGCACGATAGGCAGGTCAGCCAGATTCCAGCGCGCATAACGGCTGTCATACGCATCCGGCTGCGCCTGTTCCAGCAAATGACCAATACACCAGGTGACGACCTGCCCGTTTCCGCACTCAATAAAACCATCGCCTTTACGGTGCGGTTTTGGCAGCACATCCGCAATGGCGCGCCCCAGACTCGGTTTTTCGGCAATAAACAACCGCATCAGGTTAACGAATCTCAACCATAGCGCGACCGCCGCGGGCCTCGACCAGTTCGCCAATCGCGGTCAGATCGATACCAAATTCCGCCGCGGTGGCTTTAACATCGT [...]
+CGGATAAGAGGTAGCCGCCATCCGGCGGTTTCATTGCCAATGCGTTGTGTTTACCGGGCCTGCTCATTGCTGCCAGGCACAGGCCCGCCATATTTTTACGAATAACGCTTAATGTCCAGCGAGTCCGCCAACTGTGTCGCTAACTGGTTATTGTCATCGGCGGCCTATTCCCGGAACTTGCGCCAGCCAGCCCGCGCTTTTTAATCTGTTTCGTTGGAAGCGCTCTCCAGCCTGCGTTGAGCTTTGCCTGGTAGCGACGCTGACGTGACGTATCCGGCCCAAAGATCTATGCAATGGTCTCACCGTTGCGTGATGTATTGACCGGATACGATACCTGCTCCGCTACCTAGCGACAGCCTGGCCCTGCGTCTCTTCCCAGTCTGCCAGCGTATACAGCGTCGCGCCTGCCGCCGCCATCTCCATAAACGCGTGTGCGCTATCCTGCGGGTGAATATTCACGCCGCGACAGCCATCGGTGATAACGTTAACGGC [...]
+NODE 1209 12 501 501 0 0
+CGAAGAAATCAT
+TATCAAAAACCG
+NODE 1210 51 2710 2710 0 0
+CTGGCTACGTAGCTCAGTTGGTTAGAGCACATCACTCATAATGATGGGGTC
+GATGATTTCTTCGATGGCTGGGGTACCTGGATTCGAACCAGGGAATGCCGG
+NODE 1211 92 4393 4393 0 0
+TTGTCGTACTTCTTGCGCTCATTAGCAGAGCGTCTTTAAAACTGGCTGGGGTACGAGGATTCGAACCTCGGAATGCCGGAATCAGAATCCGG
+GTTTTAAAGACGCTCTGCTAATGAGCGCAAGAAGTACGACAATTGGGGTATCGCCAAGCGGTAAGGCACCGGATTCTGATTCCGGCATTCCG
+NODE 1212 2605 145823 142869 0 0
+AACCACCTTTGATAAGGATAAAGTGCCGACATGGTCGATCAAGGCCGATAAAGCCAAATTGACTAACGATCGGATGCTCTATCTGTATGGCCATGTTGAAGTCAACGCCCTGGTGCCTGACGCTCAATTACGCAGAATTACCACCGATAACGCGCAGATTAATCTGGTGACGCAGGATGTTACCTCGAACGATCTGGTGACGTTATACGGCACAACATTTAACTCCAGCGGACTGAAAATGCGCGGTAACTTACGCAGCAAGAACGCCGAGCTGATTGAAAAGGTTAGAACCTCTTATGAAATTCAAAACAAACAAACTCAGCCTTAATCTTATGCTTGCCGGCTCGCTGCTGGCCGCCAGCATTCCGGCCTTCGCCGTCACGGGCGATACCGAACAGCCTATTCATATTGACTCGGATCAACAGTCGCTGGATATGCAAGGCAACGTCGTGACCTTTACGGGCAACGTGGTGATGACCCAGGGCACGATTA [...]
+TATTGCACATGGCGGCATAGTGCTGGTTAATCTGTAAACGGGGAATACTGTCGCTATTAAGCTCCACCGTCCAGCGACCGTTATGCTTGCGTACCAGCACATCCGGGATAACGTACTCCGGCTCGCCGGTCTGGATCGATTGACCGGGTCTGGGATCGAGCGACTGAATCAGGTTTACCGCCTCTTTCAGCACCTCTTCTTTTAGTCGGGTAACGCGCATCAACGTGCGGAAATCGTGGTTGGCCAGCAGATCAAGGTGATCGCAGATAATAAGCCGCGCCTCTTCCAGCCACGGCGTGGATTTGTCGAATTGTGAAAGCTGGATCAGCAGACAGTCGCGAAGATCTTTTGCCGCGACGCCTACCGGATCAAAACGCTGAATGCGCTTCAGAACGGCTTCGACCTCATCGAGATCCACCTCTACATCGCCCATGCTTTCGCGAATTTCGTCCAGGGATACGGTGAGATAACCGGTATCATCTACCGCATCGA [...]
+NODE 1213 6359 414831 409845 0 0
+CTCAAGTATGGCCGTATTATATGTTCTGGGCTTGACTTAACAGGAAGTTGCCCACGTTTCTATGACGAATCTACCAGCCCTATGCCATCTGAGCTTAGTAAAGATCTGTTTAAAATACTGCCATTTTTTACTTTTATGAGAAAAAATGTGAGTGATTTAAATATCTTTAATTTATCAGATGATACTGCAATTCATTACGAGATTATTCCATATATTACAGCCTCGGAACTTGAGGATGAAATATATTACGATAAAATTGTCTAGATACTAGATAAATCATTATTTTGCGTTGCTTCGGCACGCATTTCTTTTTCTATAACATTTCTTTTTCTATAAAGTTAACTATTCTGGATTATAGCTATTATGATTAAAAAAATCATATTTACTGTTACTCCTATATTTTCAATTCCTCCACGTGGCGCGGCTGCGGTAGAAACCTGGATTTACCAGGTTGCAAAACGACTATCAATACCGAATGCTATTGCTTGTATA [...]
+AAGCCGCCGTTAGCGTCGAAACAGGAGGAATACAGAATCGCATCTTCCATGCCGAGGAAGCTTGCCAGCTTTTGCTCCAGCGCTTTGTGGCTGTCCTGGGTGCCGCAGATAAAACGCACGGACGCCATACCGAAACCGTGGCTGTCCATGCCCGCTTTTGCGGCATTAATCAGCTCAGGGTGATTCGCCAGCCCGAGATAGTTATTGGCGCAAAAGTTAATAACGTGGCTTCCATCCGCCACGGTGATATCCGCCTGCTGCGCAGACGTAATAATGCGCTCTTCTTTAAACAATCCTTCCGCCCGAGCGGTTTCCAGATCGTTGGTTAACTGTTTGTAAAAATCCCCACGCATTGCGATTCTCCAGACTGGGCAAATTTCAGCACATATTACCCAAAGCGATACGTTGATACGAGATGACGCGTCATCACTTCTTTAAAATGCAGCATAAATCACGCGTATCCTCACGGGTTATCAGTGAATGGATGAATAG [...]
+NODE 1214 51 3348 3348 0 0
+TTTCGCCTTCGCTTGGACGGCCTTCACGACGGAAGAAGCTGCCCGGGATAC
+ACCCTGATTGCGCGTCTGATTGACCGCCCGGTTCGTCCGCTGTTCCCGGAA
+NODE 1215 27 3839 3763 0 0
+TCGCGCCGATACCCCTAACCAGGGAGT
+GCCATTTTTCGCGCCTTCCATGCCGCT
+NODE 1216 1 1572 1572 0 0
+T
+G
+NODE 1217 1 1808 1808 0 0
+A
+A
+NODE 1218 3 5382 5382 0 0
+TAT
+ATA
+NODE 1219 2 3086 3086 0 0
+GC
+AT
+NODE 1220 1 1555 1555 0 0
+T
+C
+NODE 1221 51 2120 1493 0 0
+ACCGGAACCTGGCAGGCCGGTCGGGTGATACTGAACGAATTCCATATCACG
+TATCCTGATGACTGAAGGTTGCCGCGGCGAAGGCGGTATTCTGGTCAATAA
+NODE 1222 1 621 496 0 0
+C
+A
+NODE 1223 8 4772 3029 0 0
+GAGGACGT
+TCATTACG
+NODE 1224 12 5907 2821 0 0
+TCGAGTGCCCAC
+ACCAAGTCTCAA
+NODE 1225 813 51637 49707 0 0
+GGATGGTTAAACGGTTATTATACCACAAGTAGTAGCTCTGAGCTTATTGCTATTGAGATAGAAAAACACCTGGCTTTAACTTGCATTTTAAAAAATGTAATACGCAATCACCATAAACTTTATTCGGGTGGGGTATAAAATGGTAGTAAATAAACGTTTAATCTTAATTTTACTATTTATACTCAATACAGCAAAGAGTGATGAGTTATCATGGAAAGGTAATGACTTCACCCTTTATGCCAGACAAATGCCATTAGCAGAGGTTTTACATCTGCTCTCAGAGAACTATGATACGGCTATTACTATTAGCCCATTGATAACAGCTACATTTAGTGGAAAAATTCCGCCTGGACCACCGGTCGATATTTTGAATAACCTGGCAGCACAATATGACTTGCTTACCTGGTTTGATGGCAGCATGTTATATGTATATCCTGCATCGTTATTAAAACATCAGGTTATCACTTTCAATATTTTATCTACTGGGCGGTT [...]
+CAATACACTCACGACCCCAGGAACCACGACGGACTGATCGCGATATTGGTATTGGGTATCCATCGCAGTGGCATACTTAAGCGTGTATATACTTACACTCACCGCACTGTCTTTTCGTTTGATTAACGCATTATCCAGCACTGAAGCTAATTGACTAATACGAGTCAGACAGCTGGGAACACCGCTCACCTCCACAGCTCTGGTACCGGTAATTTCTTTAACCTCGCATCCCGGTGATGAAAGGATATTCTGGCTGCGTAAGTAATGAATGAACCGCCCAGTAGATAAAATATTGAAAGTGATAACCTGATGTTTTAATAACGATGCAGGATATACATATAACATGCTGCCATCAAACCAGGTAAGCAAGTCATATTGTGCTGCCAGGTTATTCAAAATATCGACCGGTGGTCCAGGCGGAATTTTTCCACTAAATGTAGCTGTTATCAATGGGCTAATAGTAATAGCCGTATCATAGTTCTCTGAGAGCAG [...]
+NODE 1226 914 51181 50770 0 0
+GTCAGGATCTGGGTATCATTAATAAAATCCCAGCCGTAGTAGCCCTTCAGACACAGGGTACCCTGGTTGGTTTTCCCCTGCGCCGCCTCAGCCCGGACGATTTTGCCGTTATCGACCACCAGATTGATTTTGCAACCTGATGCGCAATACGGGCAAACCGTGACGACTTTTTTCATCGGTTTCGCTCCAGTTAATCAAATCGCGCATACGCGCTGTCGCCCTCAGTATGCATGTTTTATGCCACTTTTTTAGTATGGGCTTTCCCTGATATTACGGGCGAATTTTGTTCAAAACCCTGACGAAAAACAGGCTATCGTCAGTTTTGACGTGTCGAAAGAAAATGCCGCATGACATTTATTATGGGGAGAAACGCTGAGCGCAGGCCAGATAGGGCGGAGCCGCCATCCGGCAATCTGCTCTGCCTGAAGTGGAAATTATCCGGATGGATAGACTCAAGGCCAGGGAACGCTTTGAGACTAACGCCAGGATAGA [...]
+AGCCGTCATCTTCGACGAAACCTACGTTCATTGGGCGGAAAATAAAACTGAGCAGACGCGTATTATCCTCTTTTGCGATATTGAGCGCCCAATGAAATGGCGCTGGGCGCAGAGCGTAAACCACTGGGTCGGCGCATCGTTGATGTCCGCCGCCAGTTCGCCAAACGACGAGAACGATCGCACCGGCGCGATTAATCGCATCTTTAAATACGTTCACGCAGCACGCGATGCCGGGCAACGGCTGAAAAAGAAAAACCGCACTCTCTATTACGCGCTGAAATATCTCGTTATTGCCGCTATTTTTGCCGCGATAATCCTTTTCAGCCTCCTCTGAAGCCGGGCCGCGGTATGGAACTGCCTGCCGCGGCCTGTTCTATCCTGGCGTTAGTCTCAAAGCGTTCCCTGGCCTTGAGTCTATCCATCCGGATAATTTCCACTTCAGGCAGAGCAGATTGCCGGATGGCGGCTCCGCCCTATCTGGCCTGCGCTCAG [...]
+NODE 1227 1482 77777 77501 0 0
+TGGTGCATTTTCCGTCGCAATAGTTTTGCTCATGATTTCTCCTGAATTACAGCGGTAATAGAATGTCCCCGCTCATTATAGGGAGCCGGGATCTCATAACCAACCCCCATTAGTTGGCCAGCACCACATTATGCGAAAACTCTTTTTCACAGTATTTGCATTTGAGGGCGATATCATTGGCGCGTTTTTTCACTGCAAAGCTGGAGGATACCGGTTCCGCGTGGCTGATGCAGTTGCTGTTCGGGCAAACCAGCACATTATTAATACGCTCTGGCAGGCTGGGGCGTGATTTCCCGACTACGTCGTAGTTGTCGATGCGGTTAACGGTGGCCTGCGGCGCGTACAGAGCAAGTTGGTTAACCTGCTCTTCGGTGAGAAAGGTGTTTTCTATTTTGATTAAGTCTTTACGCCCCATCTCGCCAGACGGGAGATTCAGACCGATAGTGATTCGCTGATCGGTCTCGGTCAATTTAAACAGACTCAGCAGTTTAA [...]
+AAATTAAAAGCCAACCCGCAGCCGGAGCTATTGAAACATAAAGTGATCGCCAGCTGCTTTTTCGAAGCCTCCACGCGTACCCGCCTGTCGTTTGAAACTTCAATGCATCGCCTGGGCGCCAGCGTAGTGGGCTTCTCCGACAGCGCCAACACGTCGCTGGGGAAAAAAGGAGAAACGTTAGCCGACACGATCTCAGTGATTAGCACTTACGTGGACGCGATTGTGATGCGCCATCCGCAAGAAGGCGCGGCACGTCTGGCGACGGAGTTTTCCGGTCAGGTGCCGGTGCTCAATGCGGGCGACGGTTCGAACCAGCATCCGACGCAGACCCTGTTGGATCTGTTTACCATCCAGGAAACGCAGGGCCGTCTGGATAACCTGCATATCGCGATGGTCGGCGATCTGAAATATGGCCGCACCGTGCATTCGCTAACCCAGGCGCTGGCGAAATTTAGCGGCAACCGTTTTTATTTTATCGCGCCGGACGCGCTG [...]
+NODE 1228 1518 83177 82162 0 0
+CTTCCATCTCAAGGCGTTCGAGGATATTAATCGGGTCGTTGGCATGGATGGTGGTCAGCATCAGATGCCCGGTCATGGCGGCTTTTATCGCCGTAATAGCGGAATCGTGGTCGCGGATTTCACCGTTCAGGATCCCGTCAGGATCAAGACGCAACGCTGATTTGATGGAGTCCACCCAGCCCTGCGCGGTATCCATGACGGCGGTCTGAATGGCACCGGGAATGCGCCCTTCCGGCGGGGATTCAATGGTGAACAGCCTGCGACGGGGAAGAAGAATACCGCCGGTGTTGTTGAAGCCGTACTGTTCAAGGTACGCCGCAGAGGCGGTTCTCAGCGTGGTGGATTTTCCTGAGCCTGTGGGGCCTGATAGCGTGATAATACCTTCAGGGCGCTGCAGAATGCGGCGAAGAGTGCGCTCCTGGTCAGGGTGATAGCCCAGCATACTGAAGGTCGGGATTTGCTGGCTGTCATCCTTGATCAGGCGGAGTACGG [...]
+CAGAACAAACAACTGCAGATTGAGCAGATTCAGGAAGAAACCGCCCTGTATGAAGCGATGCTGGCAAGAGAAAAAATTCGTCATGAATTGCGGACACTGGAACAGGGTATCTCCCCGGTTTCCGGTTCTGTCACGGGACATCAGCCGGAAAATGCGGCTGGCACCTCCTCCGGTTCACAGGCATTATCATCCCCCCGTCTGAAAGAAATCTTTGGTATTCACCCACAGCTTTCAGCACGCGTCATACTCCCCGGAGGAACTGAAACTGATGTCAGGGCCGGACAGGCATTACCCGGTACACTGTTCATGGTGGAACAAATCACACCGGACAGTGTGATTCTGGAATACAACGGCAACAGGCAGACGCTACGCCCGTGAGGTGCCATCATGCCAGAGACTATCGTACTGCCTCCTGAAGATATTCGTGATTTCGTCGCAATTCAGCATGACGCTGACGGAAAAATCAGGGTGAAAGTCGTCGAGGCGAAGAAG [...]
+NODE 1229 47 3319 3319 0 0
+CTTTACGCACCTCAAGCTCGATGCCGCGCTCGTTGAGCTTTTTAAAG
+CCACCGATCCGAAACTGAAAATGATGGATTTAATTGCCAAAGTGGCG
+NODE 1230 9559 564436 560378 0 0
+TGCGGGAAAACTAACAGGAATGACTGATAAAAACAGCCAACTGATCACTCGTTGCAGACGCGGGCCAAATGCCATCCCGACAAAATGCGCTACGCCGCCAGCGTGTGGAAAATGACGCCCCAGCACAGCAAAGACAATCGCAATAGGGAAAATCAAAATAATGAGCAGCGGCCATGCCCAAAGGCTGATGTCGCCTGCCGCCAGCGCAGCCAGCTCCGGAAGCGCAAAAACGCCAGTCCCTAATAATGATGTGGTTAACAAGATAACGCCCTGAACCAATCCAAGCTCTTTTTTTAGTTCATTCATCAGCTCATTATCCGGCGGCATTGTAACGTCAGGTGACGACAGACATTTTTAAGCGTATCACACACGCCTTTTCTTATAGCAGGATGTTCTAAACCTTGGGTAAACGTGAGATAAGTAGCGTTTTTACCGCTTTTTTCGCTCAGAAGAATTTTTTTTCATCTCCCCCCTTGAAGGGGCAAAACCCCA [...]
+TTCCCGATTGAGCGCGATCTGGTTGTCGATATGACGCACTTTATCGAAAGCCTGGAAGCGATCAAACCGTACATTATTGGCAACTCTCGCACGCCAGATCAGGGGCCGAATGTCCAGACCCCGGCGCAAATGGCGAAGTACCACCAGTTCTCCGGTTGCATCAACTGTGGTCTGTGCTACGCCGCGTGCCCGCAGTTCGGTCTGAATCCTGAGTTTATCGGACCGGCTGCGATTACGCTGGCGCATCGCTATAACGAAGATAGCCGCGATCACGGTAAGAAGGAGCGTATGGCGCAGTTGAACAGTCCGAACGGCGTATGGACCTGTACTTTCGTGGGCTACTGCTCCGAAGTCTGTCCAAAACATGTCGATCCGGCTGCGGCCATTCAGCAGGGTAAAGTGGAAAGCTCGAAAGACTTTCTTATCGCCACCCTGAAACCACGCTAAGGAGTGCAACATGACGACTAAACGCAAACCCTATGTGCGGCCGAT [...]
+NODE 1231 581 43005 38895 0 0
+CGGAGAAACGGCTCTACAACACCAGCCGGATGGTGATGACCGAGGCGGCGATTGACGGCGGGCTGACCCGCGACCTGTACGCCGCGCTCGGGGAGGAGCTGGACAACGGCGCGTGGGCCGTGCGCCTGTACTACAAACCGTTTGTCCGCTGGATATGGGCCGGGGGACTGCTGATGGCGCTGGGCGGGCTGCTGTGCCTGGCGGACCCGCGCTACCGCCGCCGTAAACCATTGCCGGAGGCCGGATGAAACGCAACGTACTGTTATTACCGCTGCTGATTTTTCTGCTGATTGCCGCGGCGCTGCTGTGGCAGCTGGCGCGCAACGCGCAGGGGGATGACCCGACGAATCTCGAATCGGCGCTGACCGGAAAGCCGGTGCCGGCGTTCCGCCTGGAATCACTGGAGACACCGGGTCAGTACTACCAGGCGGAGGTGCTGACGCAGGGGAAACCGGTGCTGCTTAACGTCTGGGCCACCTGGTGCCCGACCTG [...]
+TGCGCAGAAAGCCGGTTCAGGTACTGATGCTCGGCGCGGCAGGTCGGGCACCAGGTGGCCCAGACGTTAAGCAGCACCGGTTTCCCCTGCGTCAGCACCTCCGCCTGGTAGTACTGACCCGGTGTCTCCAGTGATTCCAGGCGGAACGCCGGCACCGGCTTTCCGGTCAGCGCCGATTCGAGATTCGTCGGGTCATCCCCCTGCGCGTTGCGCGCCAGCTGCCACAGCAGCGCCGCGGCAATCAGCAGAAAAATCAGCAGCGGTAATAACAGTACGTTGCGTTTCATCCGGCCTCCGGCAATGGTTTACGGCGGCGGTAGCGCGGGTCCGCCAGGCACAGCAGCCCGCCCAGCGCCATCAGCAGTCCCCCGGCCCATATCCAGCGGACAAACGGTTTGTAGTACAGGCGCACGGCCCACGCGCCGTTGTCCAGCTCCTCCCCGAGCGCGGCGTACAGGTCGCGGGTCAGCCCGCCGTCAATCGCCGCCTCGG [...]
+NODE 1232 1390 73226 72919 0 0
+AACAGAAAGCTCAGTACGAACCCCATCCCTAAAAACATCAGGGTGAAACCTTCACCCAGTAGTACAGCTTCATTCATGAATCATTTTCCATAATGAGAGGCACGACGGTGGCCTTGACGACAACCTTCCTGGTGAATCCGGCTAAGGAGTAGAGTGGATTTCCCTTGGCCACCTCTGGCTTTGGCCTCTACTTTTCTCCAGGTCGTTTGCGGCAAAGACACCGCCGTGCGTTTTTTTACACCATCATGCTGAACACGATGCTAGCGATAACCAGCACAATACCGCCGCCCAGACGAGAGGAAATTTGTGCATATGAAATGAGGTTCATACGGTTACAGGCGGAGAGCACTTCCAGATCGCCGGAGCCGCCGCGGTTGGCCATACAAAGACCCGCAGTAATGGATGATTCAATCGGGTAGAAGCCAATCAACCAGCCCCCGATAGCTGCGCCAACGACAGCGCCGACCACAATGATTGCGGCGATAACGACGT [...]
+TGGCGGCGCACCGGTTATGATATTTCTGGTTGCAGCTTATTTTGTCTATGCTGGCATATTTACGCAGAAAGAAATTGATGCGATCAGCAACGTAATGGATAAAAGCAACTTCCTTAACCTGTTTATCGCAGTGTTGATCACAGGCGCGATCCTGTCGGTAAACCGTAAGCTGCTATTAAAATCACTGCTGGGCTATATCCCAACCATCCTCGCCGGGATTGTCGGCGCGTCCCTTTTCGGTATCGTCATTGGTCTGTGCTTCGGTATCCCGGTCGACCGTATCATGATGCTGTACGTTCTGCCGATTATGGGCGGTGGTAACGGCGCGGGCGCCGTGCCTCTGTCTGAAATTTATCACTCGGTTACCGGACGTTCTCGCGAAGAGTACTACTCAACGGCTATTGCTATTCTGACCATTGCGAATATCTTCGCCATTATTTTCGCCGCCCTCCTCGATATGATTGGCAAAAAATACACCTGGCTTAGCGGTGA [...]
+NODE 1233 5306 273162 268713 0 0
+AGCTGTCCTATGCGTTTGCCGGCGATTTTTACTCCGCTATGTTCTGGATTGAAGTCGTCCTGATGGTCTTCCCGTTAGTGGTGCTGCGTGTGGCGAAACTGCGTAATGACTCTCGTATGCTGTACCTGTCGGCGCTGAGCGCGCTGTTGGGCTGCGCGACGTGGCGTCTGACCTATTCGCTGGTGGCATTCAACCCGGGTGGCGGCTACCACTACTTCCCAACCTGGGAAGAATTGTTGATTTCTATTGGTTTTGTGGCTATTGAGATTTGTGCATACATCGTACTCATTCGTCTACTGCCGATACTTCCTCCTTTAAAACAAAACGATCATAATCGTCATGAGGCGAGCAAAGCATGAGCCAGAGAATTACTATTGATCCGGTAACCCGTATTGAGGGTCATTTACGCATTGACTGCGAAATTGAGAACGGCGTCGTATCCAAAGCATGGGCGTCCGGCACCATGTGGCGCGGTATGGAAGAGATCGTGAA [...]
+TCGGTGTAATCATGATTGATGAGCCATTCCGCCGCCAGCCGGCCCGCCGGTAACGGCAAAGTCTGTCTGCCGCCAACCAGCGCTACCGCGCGTTTTCGGATCGCTTCGCCCTCCTTGCCCATCCGCGAAAAAAGCTGCTGCGTATAATCGCCGGAAGGATCGCAACCTGCTGTTGAGGTGCCGATCCGCAGATCCCGCCGGGTTAATAGCGACAGCCAGTCCTCGCCTTCACGCATCGCCTGCGCCCGCACGCTCAGACACAAACGGTTCGTCGTAAAAGGCGCGACCCGCAGTGCCCGCCCGCTTTCCAGCAGCGCCTGCGGATGCGCCAGGTTCGCCGAAGCAAAAAAGTCGCATGCTTCGCCCGCTTCGATGCGTTCACGTAACAGCCCCGCCGGACCGAAATCACATACCGCATCCGCCTGAAACGCCGCCATTAGTTGCGGCCAGACGACGCGCAAGCTCCCCGCTGCCAGTATTCGCATCACTGTA [...]
+NODE 1234 36 2295 2295 0 0
+CGCGATGATGGCGCTAAATATGCTGCGCCGCTGGCT
+TATTGCCAGACTATACCGATTGGCGCTAAAACGCAC
+NODE 1235 932 54251 53857 0 0
+AACGGGGCGCATAGTAACGATGTGCGATCGGCTTGTCAAAGGGGGAAATAAGGTTGCGCGTTTGTTTGCTGACAAAAACAACAAAGCGTTGAAGTTTTGATCTAATTTCTACTTTGCCCCGGCATGGCGCAACTTTGTCTGTAATTGCACAAGTCAAATGCTGTGACCTTACCGCAATGGCTATGTACCAGCGTCTGATGAACCGTGAAAAACTGGCAGGCACTTGGCAAATAATTCTGAGACATAACGCCGTAGAGATTAAGGGCAGGGAGTAGAATGAACTTTAGACGTGAAATATTTTGTGAAAATGGTTGATACAGGCAGTCTGACGCCGGTAGCGGAAATGGCAGATAAATTTCTGGTGCAGGCGAAAAGATTTCCGTCAATATCATAGGCAGAATTATGGCGCATCAGCTTTTGGCGACGACACGGGACGAGCGGGTTTTATCGCGCTTTTCCTGAAGGATTTTTTCATCAGCCTGTTTTTTGCGT [...]
+AAGGGAAGCAGACGTTCACTGACGTCTGCTTTCTGCATTTATATCAACTGATTAACCCCTTCTTCAGGTTCACTCTCGTTTACTAAAAACCACTCGAAGCCATACCCTTTTGCTGGTAAAGCTGGTTCGATTTGCGTTTTACCAGCACGCGGAGGGAACCGTCATGTCACTGACTGATACTAAAGTAAAAAATGCCAGACCAGCGGAAAAGGCCGCCAAGCTCCCTGACGGGTTTGGCCTCTATCGATTCAAAATACTGGCAGTCAGGCTATCGCTTCGATGGCAAACAGAAGGTGTTTTCTATTGGGGTTTACCTTGCTATATCGCTTGCTGATGCCAGACAACGCCGTGACGAGGCCAAAAGGCTGCTGGCTCAGGGGATTGACCCGAACGCAAAAAACAGGCTGATGAAAAAATCCTTCAGGAAAAGCGCGATAAAACCCGCTCGTCCCGTGTCGTCGCCAAAAGCTGATGCGCCATAATTCTGCCTAT [...]
+NODE 1236 43 2627 2554 0 0
+TGGGAAACCAAATTTGTTACTAATTGTTCACCATTAAGATGAA
+GACCTGCTGAGACGGCGCGATATTATCAGATCCTGAGACACCA
+NODE 1237 120 6517 6466 0 0
+CCTGGGGCGAGTCAGGCGCTTCGTAAATGGCGTCGATACCGGTAAAGTTACGCAACTCGCCCGCGCGCGCTTTTTTATACAATCCTTTAGGATCGCGCTGTTCACAGATAGCCAGCGGCG
+GCGCGCGCGGGCGAGTTGCGTAACTTTACCGGTATCGACGCCATTTACGAAGCGCCTGACTCGCCCCAGGTTCATCTTAATGGTGAACAATTAGTAACAAATTTGGTTTCCCAATTATTA
+NODE 1238 51 1952 1952 0 0
+AGCAACGTGACTACAGCCATGTTCCACAGTGGAAACAACGGCTCTCACTCG
+TCCCCGACGCTCCCCACCTCACCGCCGGTCGCATTATTCGGCAGAAAGCGA
+NODE 1239 49 2156 2156 0 0
+GAAGTCGACGCGATGCGTAACCGCATTATATCGATGCGCCAGACGCTGG
+GCCAGCCAGCCCGCTTTTAACGCCTCATCGCCCAGGACCGTAGCGACCA
+NODE 1240 51 120 120 0 0
+GGAAGGAGCTGAAGGCGGAGATGCCTGACCGCAACTTTGATTACTTGTTAC
+CCCAGCGTCTGGCGCATCGATATAATGCGGTTACGCATCGCGTCGACTTCC
+NODE 1241 14 659 617 0 0
+ACCTCCAGCGGCAC
+TCGCTGCTATCTTT
+NODE 1242 3279 226024 224810 0 0
+GTATGATCTCTAAATGTGAATGGCACGATTATGCGAGATACTTACAAGTGTCTGGTATGAAGATATACTGCGAACGCCGATGTAAACGGCGCGCGTAACATTTTAGAGCGGGACACGCCGTGCTTGCCTGTGGAAGGAGCGTGCAGTCAGGCAGCCCGTTGGAGCAGGAACCCACGCCCTTCAGGACGTGGAGGATGTCAATGCACAAGAATTGGGGAATCTTTAGCAGAATTTATTATCTCTACAGTAGCATCTCTCTTGTTCCCGTCATAAATAACCCAATGCCTCCAGAGCTGAAACCGCCTTCAGCATGAGCACTGGCTGCAAATAACACCAAATAAAATAATAATATAACAACTACCGAGACAAAAAACACCTCTCTAAAGTATTTAGAATTCATACAGTCAGCTCATTTAAATTTAACGTCACATGCAACCATGCATGCGTAAAACAAGAACCACACTCATATTAATAATGATTAGTAATGTGAGC [...]
+CATGACGTAGAGATAAAAGCGTTAACTATGAGTAATAAAATGAAGTGGACGAGTATGACAGCCTATTGGTCAGCAATTATTAATTTCATCCGAAAATATGTTTATCCAGCAAGGATAATTGCCATCCTGCTGATGGCTGGCGCTACACTGCCACAAGTCGCCGATGCGATTACCGTCGACCTGAATTACGACAAGAACAATGTACCGGTCATCACTCCTGTCTGGTCCCAAGAATGGAGTGTAGCAAATGTGTTGGGGGGATGGGTATGTCGTTCAAACAGGAATGAAAATGAGGGGGCGTGTGAAGAAACACATTTGGTATGGTGGTATGCTTTTGGAGCTTATTCAAAAATTCGTCTGCGTTTCAGAGAACAAATCAGCCATGCTGAAATCACGCTCATACTGCTCGGCAGTGTTCGTAATGCCTGTTATACTGGTGTCGTGAACATGAACGCTGCTGCATGTCAATGGGGTAGGTCGCTGAAACTTAGG [...]
+NODE 1243 3 821 752 0 0
+AAA
+TCC
+NODE 1244 46 12624 444 0 0
+GCCCGCTCGCCGGAAGACCAAGGGTTCCTGTCCAACGTTAATCGGG
+CACCCGCTTTATCGTTACTTATGTCAGCATTCGCACTTCTGATACC
+NODE 1245 291 15400 15400 0 0
+ATGGCGCCGCCGGTTAACGTTACCGACAGCCCTACCTGCCAGGTGGAGTGCGTCATCATTTGGATCTGTACCGGAACCGCCACGCCAAGCAGCCCCAGCGAGACAATAGAGATAAAACGGGCCAGAAATACTGCGCGAAATGCAGGGTGCGTCTTCAACAGGCTGAGATTGAGCAGCCAGGATTGTCGATTCATTACAACGCCTTAATGCGAGTTTTTTTAAATATCCATTCAATGGCTGCACATGCTAACATAACCAAATAAGATAGATAACGATAATTACTATCATTAT
+GCAGCCATTGAATGGATATTTAAAAAAACTCGCATTAAGGCGTTGTAATGAATCGACAATCCTGGCTGCTCAATCTCAGCCTGTTGAAGACGCACCCTGCATTTCGCGCAGTATTTCTGGCCCGTTTTATCTCTATTGTCTCGCTGGGGCTGCTTGGCGTGGCGGTTCCGGTACAGATCCAAATGATGACGCACTCCACCTGGCAGGTAGGGCTGTCGGTAACGTTAACCGGCGGCGCCATGTTTATTGGCTTAATGGTGGGCGGCGTACTGGCCGATCGCTACGAACGCA
+NODE 1246 334 16476 16476 0 0
+GAGGCTTTCGCCAGACCCATGACATTGTAGTTCGGGATGGCGCGCTCCGCTCCCAGATAAGACAAGGTCAACAGCGCAGAACCCGGATTCAGCATGGTGCGGCAGGCTTTCGCCATGGCAACAAAGCTGTAAGAGCTAATATCGTGAGCGATTTTAAAGCCTTCGCGGGTAACCGCATTAACATAATCGCCGTCCAGCTGATCGCCAGGCGCGAAACCGATCGAGTGTACAAAACCGTCAAATTTCGGCCAAACGTTACCCAGCTCTGCAAACATAGCGTCAATGCTGGCATCTTCAGCGACATCACACGGTAAAACGATGCTGGAACCCAGCT
+ATTGACGCTATGTTTGCAGAGCTGGGTAACGTTTGGCCGAAATTTGACGGTTTTGTACACTCGATCGGTTTCGCGCCTGGCGATCAGCTGGACGGCGATTATGTTAATGCGGTTACCCGCGAAGGCTTTAAAATCGCTCACGATATTAGCTCTTACAGCTTTGTTGCCATGGCGAAAGCCTGCCGCACCATGCTGAATCCGGGTTCTGCGCTGTTGACCTTGTCTTATCTGGGAGCGGAGCGCGCCATCCCGAACTACAATGTCATGGGTCTGGCGAAAGCCTCTCTGGAAGCCAACGTGCGTTATATGGCAAACGCTATGGGACCGGAAGGGG
+NODE 1247 21 3522 2363 0 0
+GACCGCTCGGTTCGTAGCCGA
+CCCTTACTTGATACGGCTTTC
+NODE 1248 29 7170 7140 0 0
+GTACTCTATCCAGCTGAGCTACGGATGCA
+GGAGGTTCGAATCCTCCCGGATGCACCAT
+NODE 1249 4117 241905 239804 0 0
+CCGCCTTATCCGGCCTACAAGGAACGTGCTTTCTCTAACCACCGCAAAATGAAGGCAGAAATCTGCGATACATCATTAAGATCCAAAACGGGTACCGCTACGGCAAGTGGAATATCACTGGCAACCGCAATAACATGCTCATCAAGAATTAATTCTTCCTCGCTGTGCCCACATCCCTGACGAAAAAGTAAGATCTTCGCAACTGCCTCGTGTTTAAACCCTTCTACCAGCACCATATCCAGCTTTGATGCATCCATCCGGCTCACCAGCCATGCCAGATCCAACTCTTCTTGCCCCGGCGTTTCAGTCATTAACGCCCAGCGCTGCTGACTGGCAACCAGCGTTTGTGCTGCCCCGGCCTTACGTAATTCGTAGCTATCTTTACCCGGTTTATCAACATCCATATCATGATGGGTATGCTTAATCAGCCCTGGCCGAATACCGTGCGCACAAAGTGCTGGGATCAGTTTTTTCAGCAGTGTTGTTTTTCCC [...]
+GAATACTCGCGGCTATCACGCTCCCATTGAGTATCGTATTGACCATCCTGGTCACTATTGTTTGCTCAGTACCGATCATCATTGCCGGTATGGTAAAGCTTCTTTTGCCTGTTCCCGGTATCTGGCGCAAGGTCTCCATTTTCTGCAATTTCATGATGTATTGCTGGTGTGCTGGTCTTGCAGCGCTGTTACGCCTTAATCCGCACTTGCAATGGGATGTCGAAGGGTTAGAAGGGCTGAGCAAGAAAAATTGGTATTTACTGATTTGTAATCATCGCAGCTGGGCCGATATCGTTGTGCTTTGCGTTCTGTTCCGCAAGCATATCCCAATGAATAAGTACTTTCTTAAACAGCAATTGGCCTGGATGCCGTTCATCGGCCTGGCGTGCTGGGCATTAGATATGCCGTTTATGAAGCGCTACTCCCGTAGCTACCTGCTCCGACACCCCGATCGACGCGGCAAAGATGTTGAAACAACTCGTCGCTCTTGCG [...]
+NODE 1250 612 36120 35689 0 0
+CACATTCCTTCACAAATTATGCCGTTAAAATTCATCAACAATGCTTATCATCACCCGCCAATATGAAAACCTTGTACTTATTGTTACCGTTACTCATACCCGGTGCAAAGTAATAGGGTTTTCTTGTAAGGAAAGCTAATACAAGAGATTGATATCTCTGCAATGAGATCGTATTTCATCATGATAAAATGTGACCTGACTCCTAAATTTTTAGCGACAGACGGTGAGTATCCCCCCTGCCAATAAGCTCTTTTTTGTGCGGCGCCTCAAGGAAAATTTAAGTTGAGATAATTAAAACGTGTGCTTAATAAAGCGTAATTTTGAATTCCTTACATTCCTGGCTATTGCACAACTGAATTTATCGCTCTATTATTAGCTCAACAAACCACCCCAATATAAGTTTGAGATTACTACAATGAGCGAAGCACTTAAAATTCTGAACAACATCCGTACTCTTCGTGCGCAGGCAAGAGAATGTACTCTGGAAACGCT [...]
+AGCAGCAGCAGCGCTTTCTTCTTCACGACGCTCATTAACGACAACTTCTAATTTTTCCAGCATTTCTTCAAGCGTTTCCAGAGTACATTCTCTTGCCTGCGCACGAAGAGTACGGATGTTGTTCAGAATTTTAAGTGCTTCGCTCATTGTAGTAATCTCAAACTTATATTGGGGTGGTTTGTTGAGCTAATAATAGAGCGATAAATTCAGTTGTGCAATAGCCAGGAATGTAAGGAATTCAAAATTACGCTTTATTAAGCACACGTTTTAATTATCTCAACTTAAATTTTCCTTGAGGCGCCGCACAAAAAAGAGCTTATTGGCAGGGGGGATACTCACCGTCTGTCGCTAAAAATTTAGGAGTCAGGTCACATTTTATCATGATGAAATACGATCTCATTGCAGAGATATCAATCTCTTGTATTAGCTTTCCTTACAAGAAAACCCTATTACTTTGCACCGGGTATGAGTAACGGTAACAATAAGTACAAG [...]
+NODE 1251 23 1358 1352 0 0
+ACCCCATTTTCCAGCTACCGCTA
+TGATGGGGATAGTGGCGCTATTT
+NODE 1252 43 43 43 0 0
+CAGCAGCGGGCGCTTCGACGATGCCGCACGTCTGATGGAGCAA
+AGCTGGAAAATGGGGTTTTATGTTCCCGGCGCCATTTCGCTGC
+NODE 1253 2110 115503 112750 0 0
+TTACGCCATGGCGCATTACTGGCGCATTGTTCGCCGTTATCGCCACCATTTTTGTCGTGTCGCCACAGTGGCACTCAACCTCGTTTATCCTGCTCGCTATCCTCCCCTTTTTGGCAGGGTTACTCGCTGGCTGGCAGCCTGCGGGGAATGCGAAAGTCGCCGAGGCAACGGGCTCCATGCTGGTGTCCATTACATGGAACTTCATCGTCGGCTTTTGTGTCCTGGGCGCAGCGCTGGCGATACGTATCGCATTAGGCCATGTCACCATCCAGTTACCCGATACATGGTGGATGTATCTCGGTGGTCCGCTGGGTCTGCTGTCCATCGGGCTAATGGCGATTCTGGTGAGAGGCTTAGGGCTATTGATGCTGGGCGTAGCGTCAACAGCAGGCCAACTGCTTGGCTCAGTGCTAATTGATGAATTGATCCCTTCATTAGGCAATACGGTCTACCTGGTCACCATCATCGGTACGCTGTTCGCGTTAGTCGGTG [...]
+TACCTAATGTTTATGGCCTGGTAGGCGGCGATGCTAACGCGGTCGGTCCGAAGAAGCGTCCGCTGTCGTCGATGTCGCCCACTATCGTGGTAAAAGACGGCAAAACCTGGCTGGTGACCGGCAGTCCTGGCGGGAGTCGAATCATCACTACTGTGCTGCAAATGGTAGTGAACAGCATTGATTTTGGCATGAACGTCGCCGAAGCGACCAACGCGCCGCGTTTCCATCATCAATGGTTGCCGGACGAACTGCGGGTAGAAAAGGGCTTCAGCCCCGATACGCTAAAGTTGCTGGAACAGAAAGGGCAGAAAGTCGCGCTGAAAGAAGCGATGGGCAGCACCCAAAGTATTATGGTTGGACCGGATGGCGAACTGTACGGTGCGTCTGACCCGCGTTCGGTGGATGATTTAACGGCGGGATACTGATTTTTAATTCCAGGCCCGGTGTCAGACACCGGGCTATTTGCAGATTATGCCGTGAGTAATCGGGCTG [...]
+NODE 1254 19 2219 2219 0 0
+GATTTTAGTTTCGGGACAT
+ATACGGATTAACAGTCCGC
+NODE 1255 196 9855 9780 0 0
+CCTGGTGAGTCCGGAGACGTTTAAAAAACAAGAAGTTATCTTTACCCGGTTGACCTGATAAGGTTTGCCGGGTTTTTTGACACCCATAGTTTTTGGGGACTTAATCGGGGGCCTCACGGTTCGTTGAGAAAATGAAGCCCCCTCCGATGGCATTAACCGATACCGCTATCCGCAAGATCAAACCCACCGAGAAATC
+CGGAGGGGGCTTCATTTTCTCAACGAACCGTGAGGCCCCCGATTAAGTCCCCAAAAACTATGGGTGTCAAAAAACCCGGCAAACCTTATCAGGTCAACCGGGTAAAGATAACTTCTTGTTTTTTAAACGTCTCCGGACTCACCAGGATGTCCCGAAACTAAAATCTGGCTCCTCTGACTGGACTCGAACCAGTGAC
+NODE 1256 4073 201350 199569 0 0
+ATCGTTATTTCGAGCAGCAGGTGTCGCTGGCGGCGTTTGCTGATGTGGCGGAGAACGCCCTCGACGACCTGCCGATTATCTGGGCCAGTACGCCGGCGCGAGAAATAGGCTATACCCTGGCCGAACGAATATTGCAGCGTATTGCTCACGACGAGCACCATGTGCGGAGTCAAACGATAGCCGCTCGCCTGGTAACGCAAAAGTAGAGGCTGCGCGTCGTTCGGCGCAGACCGGGTGCAGCGTCGCGACACCCGGCAAGGCGATTATTGTTGAGGCAGCGCCGGAACGTCCGGTACGGAAAGCGCCGGCATCCCAAACAGGCCGACAAAGTCTTCCAACGGCATTTTTTGTCCGTTGAGCGTGATCTGGCCATTGGCGTACTGCAAACTGGAGGCGATAGTATTATCCTTCAGCGTTGTCAGTCGGAACATCTGACCCATTGCGGACAGCCCCTGCACCTGCTGTTTTGCCAGTTTTTCCGCATCATCCTGC [...]
+GGTCGGTAGCGCATCATAGTATTTTGCCGAGGCCAGCTTAACGGTCTTCAGGTTCGCTTCCGCCGAGGTGCCGCCAATGACAAACGCAATGTGATACGGCGGACAGGCGGCGGTGCCCAGCGTACGCATCTTATCGACGAGATAATTTTTGAGCTTACCCGGCGTCAGAAGCGCTTTTGTCTCCTGATAGAGGTAGGTTTTATTCGCCGATCCGCCGCCTTTAGCGATACAGAGGAATTTATATTCATCGCCATCGACGCTGTAGAGATCGATCTGCGCCGGCAGGTTAGTACCGGTATTGACCTCTTTGTACATATCCAGCGCCGCGTTTTGCGAATAGCGCAGGTTATCTTCGATATAGGTGTTATATACGCCGCGAGCCAGCGCCGCTTCATCACCTCCGCCAGTCCAGACGCGTTGGCCTTTTTTGCCGACAATAATGGCCGTACCGGTATCCTGGCAGGTGGGCAACACGCCCTTGGCCGCGATATC [...]
+NODE 1257 1048 214659 212420 0 0
+CCATGCCGCTAAAGCGGCATATTCCATAAGAATTTACATGCGCGTATACTTTATAATCAGTATCAACGAAAGTTGCTTGCCCAAATCAGAGGCAACAATCGCATCAAATAACTTGCGCAGGTGATAATTATGGAGACTTTCGATACTGATAAATTTCGCTCAGAACTGGATCTTTTATCAAAAAGGATCATGCCTGGTTGTGGTCTTGTTTTTGAGCTATATCAACGTCGTTTGAGCGCTGCGATTGATGAATTTATCGCCAGATTGCCGAAAGAACAACATGCTCAGGCGTTTGAACTGGCTCGCCAGGAGTTTGATTATCTTTCTGCAGAAGAGATTGCAGATGAAATACGCCGAGACGCAGAAAAAGGCTATTGTTGCCACGGCTTTGATCGCGATTGCTGCCCTCTTGGTTGCGGTGATTTAGATGATTATTAATTTAAAGGGATAAATATATTTACATACTGAAAATATAGGCTGATTTTTTCTGAA [...]
+CCTTGTTATTTTCATTCCCATAGCATCACCAGGTTCAGTAAAATCAATGATCTCATCAACCTTATAATGACCAATACAGAAATCAGGGCGCTCTGGAGATTTCAGATATTTTTTTCCATTCTCTGTCAGAGCATATTCACGCCCAGGCACTTTTTTACCTGTTTTAGAAAATCCAATAGTTTCATCAACCAGGGTATCTTTTACTGTCAATAAACCAGCTTTAACCAGTGCATCAAACATGGAAAACTCTTTGGTATTTATTTCGTCTGCCCGTTCCTGAGATGTATATCGATTAGTTTGGGCGACAGATAATTGAACTGGATAAGGCTTACTATCAAACCTCCCAAGAGGACTGATTGTAATGCATTCCTTCTCAAGTTTCGTATTAATCGCTTTTTCAAAGTTTGATTTATTGGCATCCTTCGCTGAGTCACACCCTGCCAACAATAATGAACTTAACGCAATCATCACAAATTTTTTTGTATTAACCAT [...]
+NODE 1258 3 1648 223 0 0
+ACT
+TAA
+NODE 1259 12 6785 1072 0 0
+CTTGAGACTTGG
+GCATCAAACTTT
+NODE 1260 5 454 454 0 0
+TATTC
+ATTGA
+NODE 1261 69 14832 14805 0 0
+AACAGCCGGTCGGTTGAAGAGAAAAATCCTGAAATTCAGGGTTGACTCTGAAAGAGGAAAGCGTAATAT
+CTTCAACCGACCGGCTGTTTGTGTGAAGTGATTCACATCCGCCGTGTCGATGGAGGCGCATTATAGGGA
+NODE 1262 937 168193 165080 0 0
+GCATAGCTACATTCTTGCGCCTAAAGGAAGTGAGTTCGTTATCAGGGTCGTTAAAGCCTCCCAGGTAAACGAAATCCTTCAAAGCCGTATTGGATTCCAGGTTACATGGCTTGTATTGCCTGATGGTAACAGGGTCGATTTTAAAACCTCATCGTCTCTTGACCGAATGGGGACTCCGGCGGTTGAAGGCGATGAGGTGGACAGGCATTTGCTCGCTCAGTTTCTTGGCGTAGCGGCCTATGCCCTTGTGGGGACGAAAACCAGCTACGAAGGTTCAGGTGATAGTAACGAGAGTTTTGCCGGGAATTTTGGCGAAGGCGCTCGTACTCAGGCAGGAAATATCGCTCAAAAATACCTCCAGGTTGTGCCAACAACAACGTTACATGCGGGAGCACCGATCAGGGTCTTTACCGAAGATGAGATATACATGAAGCCGTGGAGAAATATTTATGAAACGGATTATACGGGCTGAAATATTGTTTTTTGCTGCAT [...]
+AACATAATTATCAAGCCCAACCAGCAACTGAAGAGCATCAACTACGGGCATTGTGCGTTGCATTCTGGCAATTGGCGGTAATGGCTTATCAACAAGCAGAGAAGCCTCACGCGGTGCTGGATGACTCGTTACCAGGCGATATCCAGTTGGTTCCAGGAGATAGTTCACCGCTGCTCTGATAGTCCTGATGTTATCGGGCCAAACTGTACGCATATAAACACTCAACGGATCGATATACTGCCAGCGAGGATCTTTCTGATTCCTGTCCAGTGGTTGTAACTCCTGAAAGTTTCCCTGCACATGCACATCCTGCTGTGATATCTGAACAGGCGCACTTTCTCGCATCCTGTCTACCTGGAAAGGACTTCTTGCTGCCTGACAGGAAAATGCAAAGAATGCAGCAAAAAACAATATTTCAGCCCGTATAATCCGTTTCATAAATATTTCTCCACGGCTTCATGTATATCTCATCTTCGGTAAAGACCCTGATCG [...]
+NODE 1263 488 26543 26192 0 0
+CGCTGGTTGCCCGGGGGCTGGAAACGCCGCTGCGCCCGCCTATGGATGAACTGGATAATGAAACGCGAAAAAGCCTTATCGCAGGGCATATGACTGAGATTATGCAGTTGCTGAATCTCGATTTGAGCGATGACAGTCTGATGGAAACGCCGCATCGTATCGCTAAGATGTACGTTGACGAGATTTTCGCTGGCCTCGACTATGCCAATTTCCCGAAAATTACCCTCATTGAAAATAAAATGAAGGTGGATGAAATGGTCACCGTCCGCGATATCACGCTGACCAGCACCTGTGAACATCACTTCGTGACCATTGATGGCAAAGCGACCGTCGCGTATATCCCCAAAGATTCCGTGATCGGCCTGTCGAAAATTAACCGCATCGTGCAATTCTTCGCCCAGCGTCCGCAGGTTCAGGAACGTTTGACCCAACAAATTCTGACGGCGCTGCAAACCTTGCTCGGCACCAATAATGTAGCGGTATCGATT
+GAATTTGTTGGGTCAAACGTTCCTGAACCTGCGGACGCTGGGCGAAGAATTGCACGATGCGGTTAATTTTCGACAGGCCGATCACGGAATCTTTGGGGATATACGCGACGGTCGCTTTGCCATCAATGGTCACGAAGTGATGTTCACAGGTGCTGGTCAGCGTGATATCGCGGACGGTGACCATTTCATCCACCTTCATTTTATTTTCAATGAGGGTAATTTTCGGGAAATTGGCATAGTCGAGGCCAGCGAAAATCTCGTCAACGTACATCTTAGCGATACGATGCGGCGTTTCCATCAGACTGTCATCGCTCAAATCGAGATTCAGCAACTGCATAATCTCAGTCATATGCCCTGCGATAAGGCTTTTTCGCGTTTCATTATCCAGTTCATCCATAGGCGGGCGCAGCGGCGTTTCCAGCCCCCGGGCAACCAGCGCGTCATGAACCAGGGCCGCTTCTTTACTGAGTGATGGCATTAATCGTGTT
+NODE 1264 728 41644 41459 0 0
+GCCTGCCATATCCACAGACCGCCAACCAGCATCAGCAGCAGGAATAACGCCAATGGCCACAGCGAGAGCCAGCGTCGCCCCGGAGTGCGTTGAGAAAAAATTACTGACATTGCAAGGTCACCGTTTGGGCAAACTGTTTACCTAAATCCATATCCTCCGGCGGCGCGTCCTCTTTATCCAGCGACTGGGCGAAACGTAGCGTCTCTTCGCCGGGCGCAGGAGTATAAACCTGAATCCGACACTTTTCGCGCAGCGGTTCCGGCATCGTGATATCGCTGTCCTGGTCATAATGCATATCGACATAATAAGAGGGATCAAACGTTGAAAAGGTATAAGTCTGTCCGCTTAACGGCTGCGGTTCAGCCAGCGGTAGCGTAAAGGTCAATACCGCCTGATGCGCGTCACGCGTCATACCGTATTCTGTCGGCCTGTTTTTAAACTTCACTTTCGCGCCATTGCGCCACACTTCTGTAAAGTAGTGCTGCCCAAGTA [...]
+CGGCGCATCCGCACAGCTTCATCCGTCTGCAAACGCAGGTGGTCAGTGAAAATGAGCAATTTGTGGCGTTAAAAATGCGCTGGACAATGGACGCGCTGACGTCCGCAGATCTGCTGTATGACGCCGGAAACGCGGCACCGGGGTCAGAAATATGGAAAAAGTTGGCGGCGGAAGTGATGGCTAACGTACTTGGGCAGCACTACTTTACAGAAGTGTGGCGCAATGGCGCGAAAGTGAAGTTTAAAAACAGGCCGACAGAATACGGTATGACGCGTGACGCGCATCAGGCGGTATTGACCTTTACGCTACCGCTGGCTGAACCGCAGCCGTTAAGCGGACAGACTTATACCTTTTCAACGTTTGATCCCTCTTATTATGTCGATATGCATTATGACCAGGACAGCGATATCACGATGCCGGAACCGCTGCGCGAAAAGTGTCGGATTCAGGTTTATACTCCTGCGCCCGGCGAAGAGACGCTACGTTTCGCCC [...]
+NODE 1265 5769 297265 295138 0 0
+AAAGGGCGCGGAAGTCATTCGCATGATCCACACGTTGCTGGGTGAGGAAAATTTCCAGAAGGGGATGCAGCTTTATTTTGAGCGCCATGACGGCAGCGCCGCGACGTGTGATGACTTCGTACAGGCGATGGAAGATGCTTCTAATGTCGATTTGTCCCATTTCCGCCGCTGGTACAGTCAGTCCGGCACGCCGATTGTAACGGTAAAAGATGATTATAATCCGGAAACCGAGCAGTACACGTTGACCATCAGCCAGCGCACTCCGGCGACGGCGGATCAGGCGGAGAAGCAGCCGCTGCATATTCCATTCGCCATCGAACTGTACGATAACGAAGGCAACGTCATTCCGTTGCAAAAAGGTGGTCACCCGGTCAACGCCGTGCTGAACGTCACGCAGGCGGAGCAGACATTTACCTTCGATAATGTTTACTTCCAGCCTGTTCCGGCCTTGCTGTGCGAGTTTTCAGCGCCGGTGAAACTGGAATATAAATG [...]
+TGCACACAGTCCAGCGGGCCATTCTTGGCTTTAAACTGTTTGTCGGCACGCAATTGCAGGCTGCCCAGCAAATCGGGCGAAGCGCTGAACAGCGACAGGTTCCAGCCGCCAAACTGATTTTTCATGGTACGGCCCAGCAGGCTGTGCAACGCAATCAGCGCCGGTTCGCTGTCCAGACGTTCGCCGTAAGGCGGGTTACTGATCACCGTACCATACGGGCCTTTCGGCAATGGATTACTCAGTTGCGCCACATCTTTCACTTCAAAGGTGATAAGCTCCCCGATACCGGCGCGACGGGCGTTGCTGCGCGCCCGCTCAATGACGCGCGCATCGCTGTCGGAACCGTAGAAATGAGAGGAATACTCCGCCAGTCCCTTACGCGCCCGGGTCTGCGCTTCGGCTTTCACTTCCTGCCAGATAGTTTCGTCATGCTGCGCCCAGCCGCTAAATCCCCAGTGACCACGGTGCAGTCCCGGCGCGCGATCGGTCGCC [...]
+NODE 1266 2244 135869 135126 0 0
+TGCTGAATTCACCTGTGCCTACGGTGCCGGTTGCTGCGCCAACCAGCCAGGCGGTGAAATTCAGGCTTTGCTTCTCATCAAGGATGGTGTCTCCGTCCAGGTCCGCAATGGCCTGTGTATAGGTATCGCCCAGTTTGATATTGTTTTTGCCAGCATCGCCGATTGCCAGGCTTACGTTGCTAATAGCGCCAGTGCCGTCAGTCTTCATCAGCGCGAGATTATCCGTGGCGCCTGTAGCCGCTGTGGTTCCACTACCTGTAGTGAATACCACATTCATATTTTTCTCGGTAGCCCAGGTACAACCCTCAAGATCGATATGAAAGGTACGGGCATTGTTGATGGTCGTTTTACCATTACTCAGCGTGCCATTACCGATACTTGAACCCATATTGACTGTTTGATCTTCCGTATCCAATGTGACAGAGCAGGGGGAATCAACAATATTACCAAGGAAAGTGACCTTCGCTGTGTTGCTACCCGCGGCTTGAGCGC [...]
+GCGGAACCTGAGAAGTTAGGTTTAAAAGACGATGGAATAACCAGGACGGGAAAGCAGTATACCCGAACATGACCTACGCCACAAACTTTCATTATTCCTCCTCTTCGTCAGGCTGACATTCACACAGGGAGGGAGAAAATAGCCCCTTTGAGGCAAATGTTTTTGACGTAAATCAAGCGCTTGTTATTTAAAAAATCACACAAATCGCTCTTGACCGCCTAAAACCTTTAGAGATCAATTTCCTGGCGTTTTACTTCCTGCCAAACTTCTTCCATTGTTTCCAGGTCCACCCCGGTCATTTCCAGGCCTCTGGCTGCGACAATACGTTCAACTTCGCGAAAACGACGTTCAAATTTATCGTTCGCTTTTTGCAAAGCGAGCTCCGCTTTCGTACCTAAATGACGCGCCATGTTGACCGTGGCAAAGAGCAAATCGCCCATTTCCTCTTCCAGTTTAGCCTGATCAACAACCGCCTGCCGCGCCTCGAACATC [...]
+NODE 1267 51 3094 3000 0 0
+ACCTGCATCAGCAAACTGCTGTACCAGGCGATCCACGGAAACCTGTCTCTC
+TATCCGGAAATCTGCTGACGACTCTGTGTCCGCACAAGAAAAACAGACTTT
+NODE 1268 702 43691 43434 0 0
+ACCCGGCGCAGTTCGTCATTAATGCGATGGCGCCGGCAGACGTCGCGTCTATTGTGGTGGACGAAGATAAACATACCATGGATATCGCCGTTGAAGCCGGTAATCTGGCGCAGGCGATCGGACGTAATGGTCAGAACGTCCGCCTGGCTTCGCAATTGAGCGGCTGGGAACTCAACGTAATGACCGTTGATGACTTGCAGGCTAAACATCAGGCTGAAGCACATGCCGCTATCGAGATCTTTACTAAATATCTTGATATTGATGAAGAGTTCGCGACCGTTCTGGTAGAAGAAGGTTTCTCCACGCTCGAAGAACTGGCCTATGTGCCAATGAAAGAACTGCTGGAAATTGACGGCCTTGATGAGCCGACCGTTGAAGCACTGCGCGAGCGTGCTAAAAACGCACTGGCCACTCTGGCGCAGGACCAGGAAGCAAGCCTCGGTGATAACAAACCGGCTGACGATCTGCTGAATCTGGAAGGATTAGATCGCG [...]
+TACGCTTCGTCGCCGAACCAGCAAATATTACGGGCAGCCATAATCAGCTCACCGGCTTTTTCGTCGGTCAACCCTTCGATATCAGCCAGATCATCAATGCCCTGGTCGGCGAGATCTTCCAGCGTACAAACACCACGAGCCGCCAGTTTGAAAGCCATATCGCGATCTAATCCTTCCAGATTCAGCAGATCGTCAGCCGGTTTGTTATCACCGAGGCTTGCTTCCTGGTCCTGCGCCAGAGTGGCCAGTGCGTTTTTAGCACGCTCGCGCAGTGCTTCAACGGTCGGCTCATCAAGGCCGTCAATTTCCAGCAGTTCTTTCATTGGCACATAGGCCAGTTCTTCGAGCGTGGAGAAACCTTCTTCTACCAGAACGGTCGCGAACTCTTCATCAATATCAAGATATTTAGTAAAGATCTCGATAGCGGCATGTGCTTCAGCCTGATGTTTAGCCTGCAAGTCATCAACGGTCATTACGTTGAGTTCCCAGCCG [...]
+NODE 1269 540 29973 29837 0 0
+TCGCCTGTGCGATACCATAGGCGATGGACAGTTTACTGGCCACGCCAGTGACCAGAATGCGCTTACCGGAAAGAAAACCCATAGCTTTAATCCTTATAGTCATTGCTTATTTTTTGCTTTTACGAACAATGGTTAACAGCAACTTTTCAACATTATTCGAAATTAGTCTGAAATTATATCCCACTCCTGGCCCCGTGTGTCACGCTATTTTTCCGCCGCTCTCTCCGGCAGGTGACGTTCTAAAACCACACGGTAACAAAGTCCCTGAGGATTTTGAGCACTCCCCAGGGCCAAACTGGCAAATCAAAGAGTCTAATGGGACAGGCCCTACGGTGCAGTATACCAGCTGGTGTAAGGTTCGCCTCATCCAACCAGAGACACCGGGACGGATAGCAAGTACGATAGCGATGCGCCTTCCACCAGACAAATAAAGGTTCTGTAGGAAGCCTGAATATTCATCCGAATGGTTTACCTCACCTATTAGCGATGTTA [...]
+ACATCGCTAATAGGTGAGGTAAACCATTCGGATGAATATTCAGGCTTCCTACAGAACCTTTATTTGTCTGGTGGAAGGCGCATCGCTATCGTACTTGCTATCCGTCCCGGTGTCTCTGGTTGGATGAGGCGAACCTTACACCAGCTGGTATACTGCACCGTAGGGCCTGTCCCATTAGACTCTTTGATTTGCCAGTTTGGCCCTGGGGAGTGCTCAAAATCCTCAGGGACTTTGTTACCGTGTGGTTTTAGAACGTCACCTGCCGGAGAGAGCGGCGGAAAAATAGCGTGACACACGGGGCCAGGAGTGGGATATAATTTCAGACTAATTTCGAATAATGTTGAAAAGTTGCTGTTAACCATTGTTCGTAAAAGCAAAAAATAAGCAATGACTATAAGGATTAAAGCTATGGGTTTTCTTTCCGGTAAGCGCATTCTGGTCACTGGCGTGGCCAGTAAACTGTCCATCGCCTATGGTATCGCACAGGCGATG [...]
+NODE 1270 3 153 149 0 0
+ACC
+TTC
+NODE 1271 2734 143553 140640 0 0
+GTCGCCAGCGCGAAATTAAGATGTTCGTTTTCCAGCCCCGACACGGCCAGCGCCAGACCGGCATAATGATTGCTGCGCCGTTCTGTCGTCCAGTGCGCCGTTTGCGCCAGCGTCTCTTCCTGAGAAGGAACGACTTCACTGGCAAGAACAGGCGCCCCGGCGCGGGAAAGCTGTAGCGCCAGTAAACCGCTGGTGTATTGCTCGCTCAACGTCAGACTCAACTGCCTTTCCTGCAGTCGGCGGGCTATTTGCGCCGGCAGGTTTTCCGTACCTTCGAAAATCAGACTCTGCCCGGCAACCCGTTTGACCTCTGGCCATAACGCCAGCATCGCCTCCCGTTGCGTCGCCGGGCCGGTCAATTTCAGTTCAATGATCGGCATTGATGAGCGATACCCCATCGTCACGCCGGGCGGCAACGGCAGTAAATCGAGACGCTGCGCGAGGTCACTTTCTGAACGTCCAAAAGTCGTTAACCGCAGGCAAAGCGGCGGC [...]
+CCTGGTTTTCTGCGGGCAGGTCGCTTACGGTGGATAAAAAAATGATGGATTGCGGCAGCGGTATTTATGCTTCAATCAATACGTTACTGAAAAAGTCGCAGAATAAAAATATAGTCATTTTTACCCATAATCATTGTTTAACGTATATTGCAAAAAATAAGCGCGGCGTAAAGTTTGATCCGGACTATCTTAATGCGCTCGTTATGCATGCGGAAAACGGAAAACTCTTTTTAGATGGTGAATTTGTTCCCGGCTAGCCGCATGTTAAAAGCGTAAAGACAGCCTGAAGCGGCTGTCGTCATTATAATAACCCTTTCAATGCTAATGTGTGGCGTGTCGCTACATTCAAATCATACAGCGCCAGTTCTTCTGGCTTGACCCAGGCGTAGTCCTGAAATTCGTCGTTAATACATATATCGCGATTAGCGGAAACACAGTCGAAGATGAGATAAATCATATAAATCTCTTCTTGTCTGCCATCAGCGTAGGTTT [...]
+NODE 1272 51 79 79 0 0
+GACCGTTGGCGCGGGCGTTGTTGCTAAAGTTCTCGGCTAATCGCTGATAAC
+CCGGCCGCCTTCACGGATTGCGAAACGCAGACCGTCGTCCATTGCGATCGG
+NODE 1273 5746 292708 290737 0 0
+CAACGGGCAGGAGGCTAAAAAACTGCTGCTCAGTTTGACCTGGCCAAAATCTCTGACGCGCACAACATGGGACAAGGGACATTCACCAGTGCTATCCGCAACAGGTTGTGATGAAATTAATCCCTGTTGATTGGCCGCCGTCAAAAGCTCCCGGCACTGCGACAGCGTAAGGCGCTGTAGTTTGAAGGTCGTGATCCAGCCTGGCGGATCGGCAAGTTGTAGCGGAGCAAAAGGATTATAATAAGAGGGAAGATAACGATATCCCAGTCCGCCAATGCCGCCCAACAGCACAATAATCAGAAAACCCTTACCTCTCACGCGGCCTCCGTTCTCACATCCCATAAACATTATGGCAGAAGCCCGCGAAACCCGCGTTTTGTCGTGGTAATGTATACGCTTTGCATTCGATGGAATGGGTTTTTAAGATGGCGAAATTGCGGGTAGGAATAGTATTTGGCGGTAAGTCGGCGGAACATGAAGTGTCTTTGCAAT [...]
+CCAGCGGGCGGGTAATCTTTTCTTCAAACAGTTGCGTATAAGGTTTGCCGGAGGCGGTCGCCAGCGCGTCGGCTAACAGGTCGAACGCCAGATTGGAATAGGCCGCCTGCGAGCCTGGCGCGACTTTTAACGTTGCTGTGGAGAGCCAGCTCCAGCGTTGTTCGCGGGTTGGCCAGACAAATACCGGACGATGCGCCGCGCCGCCTGGCTGTTCTCGCGGAAGCGCGCTGGTGTGGGTTGCTAAGTTGACCAACGTAATCGGCGTGCCTTGATACGTCGGGACATGCGCGCCGGGAGGCGCATATTTGCTGAGAGGATCGTTTAATTTTACCGTTCCCTGATCGAGCAATTTTACCAACATTTCACTGGTCATGAGCTTGGTGAGAGAAGCGATACGAATGACCGAATCAAGCTGTGGACGAACATTATTGCCCGGTCTGGTGTCACCGAAACTACGAAACACGCGTTGATTGCCGTCGATCACCACCAGCG [...]
+NODE 1274 2276 128745 126617 0 0
+AAGAACTAAAAGCGAAAGGGAAGTCGGCGATAATGTTCAACCTGCAAGAGCCGTATTTCACCTGGCCTTTGATCGCTGCTGACGGCGGTTACGCGTTCAAATTTGAAAACGGCAAGTATGACGTGAAAGACGTTGGCGTCGATAACGCCGGCGCGAAAGCGGGCCTGACTTTCCTGATCGATATGATCAAGAACAAAAATATGAGCGCCGATACCGATTACTCCATCGCCGAAGCGGCCTTCAATAAAGGCGAAACGGCAATGACCATCAACGGTCCGTGGGCATGGTCGAACATCGACAAGAGCAAAGTCAACTACGGTGTCACCCTGCTGCCGACCTTCAAAGGTAAACCCTCGAAGCCGTTCGTCGGCGTGCTGAGCGCGGGGATTAACGCTGCCAGCCCGAATAAAGAGCTGGCGAAAGAGTTCCTCGAAAACTACCTGCTGACCGATCAGGGTCTGGCAGCGGTGAACAAAGATAAACCGCTGGGCG [...]
+GTATAACCAGCAGGCGTGGTGGTGCCGAGGCGGTCTGGCCCGCCGTTGGTCAATAACTGAATCAGGACAAAGTTATTAAAGTTAAAGGCGAAGCTGGCGATCATCAGCGGCGTTAGCGGCTTAATCAGCAGCGGTAAGGTGATCTTAAAGAAATTCTGAAATGGACCTGCGCCGTCCATTGCGGAGGCTTCGTACAGGTCATCCGGAATCGCTTTCAGCAGTCCCATGCACAGGATCATCATGTAGGGATAGCCCAGCCAGGTATTCACGATAATCACCATTGCCCGCGCGGTGTTGGGGTCGCTGAACCAGGCCGGTTTAATGCCAAACAGCGCGCTCAGCATCATATTGATTTCGCCAAAGCTTTGGTTGAATAACCCTTTGAAAATCAAAATTGAAATAAACGACGGTACGGCGTAGGGCAGAATCAGCAGGACGCGGTAGATAGCTTTACCTTTCAGCGCTTCCCACTGTACGAGGCAGGCCAATACC [...]
+NODE 1275 345 18891 18827 0 0
+GTCAGGACTTCGGTCTGGCGGCGGCCATTGCCACGCTGATCTTCCTGCTGGTAGGCGCGCTGGCCATCGTGAACCTGAAAGCCACGCGTATGAAGTTTGATTAAGGGAGATAATAACAATGGCTATGGTCCAACCCAAATCTCAAAAATTACGTCTCTTCATCACGCACCTGGGGCTGCTGATTTTCATCGCGGCGATCATGTTCCCGCTGCTGATGGTCATCGCTATCTCGCTACGTGAGGGGAACTTCGCCACCGGAAGCCTGATCCCGGATAAAATCTCCTGGGAACACTGGCGGCTGGCGCTGGGTTTCAGCGTGGAACATGCGGATGGTCGGGTAACGCC
+CCAGTGTTCCCAGGAGATTTTATCCGGGATCAGGCTTCCGGTGGCGAAGTTCCCCTCACGTAGCGAGATAGCGATGACCATCAGCAGCGGGAACATGATCGCCGCGATGAAAATCAGCAGCCCCAGGTGCGTGATGAAGAGACGTAATTTTTGAGATTTGGGTTGGACCATAGCCATTGTTATTATCTCCCTTAATCAAACTTCATACGCGTGGCTTTCAGGTTCACGATGGCCAGCGCGCCTACCAGCAGGAAGATCAGCGTGGCAATGGCCGCCGCCAGACCGAAGTCCTGACCGCCGCCGCCTTCAAAGGCGATACGGTAGGTGTAGCTGACGAGCAGATCG
+NODE 1276 4842 273891 268763 0 0
+GGGGATGGCTATTCCGGCGCTCGGTACCACGCACGCGGACTATTTCTTTGGCGATATTCCTTGTACCAGAGCGTTAAGCGAAGAAGAAGTGCAGGGCGAGTACGAGCTGAACACCGGTAAGGTGATCATCGAAACGCTGGGCGAGGTGGAACCGCTGCATACGCCAGGTATTGTGGTGTATCAACACGGGCCGTTCGCCTGGGGGAAAGATGCGCACGATGCGGTACATAACGCGGTCGTCATGGAGGAAGTGGCAAAAATGGCGTGGATTGCGCGCGGCATTAACCCGGCGCTGAATCCCATCGACGATTATCTGATGAACAAGCACTTCATGCGTAAGCATGGCCCGAATGCGTATTACGGGCAGAAGTGAAGTATGAGCTCCGGAATGTGAATATTATCGGGATGTCACAGGTCTAATTCCGGAGCCATCTTTCCGCGAAAAAAGCCCCCTGTTCAGGGGGCAAATCAACTATGGCTTTTTCGTTGGTT [...]
+CAATGCCAGCAACCAGCGCTTCAGGCAACAGCCCTTCAAGACCGGATTCGCTGAGCTGCTGCCCTACCTGCAAACCAATGCCGTAGCTCGCTTGCGCTTCAATAGTGTCAAAAGTCGGGGTGGCCATTATTTTTCCTTCATTGGATATCAAAAAAGTAGCGGGCAGCATAACAGCCACGCTTCTTCTGGTAAAACTTTGTCTCAGGGAGGATGACAAATCGCAGGGAAAAAGAAACAATAGATTATCCGTATTGATGTCACGAAAGCGGATAGCACTACCAGTATCATAGCGTTAGCCATCTATACTCTATGATTAAGGAACGAGATGCGGAGCAGGAGGTAAACCATGCCCGGGCGCTTTGAATTAAAACCAACCCTGGCGAAAATCTGGCACGCGCCGGATAATTTTCGCATCATGGAGCCGCTGCCGCCTATGCATCGTCGTGGCATTATCATTGCCGCTATCGTGCTGGTGATCGGTTTCCTGCTGCC [...]
+NODE 1277 6975 379326 374945 0 0
+TACGCAGGCGACGACAAATCGACAGACCATCTTCACCTGGCAGCATTAAATCCAGTACCATGAGATGGAAAGATTCACGGGTCAGCAGACGATCCATCTGCTCGGCGTTAGCGACGCTTCGAACCTGGAAGCCCTGCTCGGTCAGATAACGTTCCAGTAGCGCCCGCAGACGCATATCGTCATCAACCACCAGAATCTTATAATTCTCTTGCATTGTCTGTACTCCCAAAGGTTCGCAACAAATGTAAGTGTGTATTCTTAAAAAAGCTCACGTGAGTCACCAGCAAATTCTGGTATGAATTTCAGGCTAAATTGTTACAAAGCATATTTAACAGCAGCTTAAATATACAATTAATCGGCAACCCCATTATTTATTCTGTCGGGACGATCACGTTATACCCCGTGTGCGCAATATCGACAGCAAAGGTAAATCAACGAGATGAAAACGCCCCTGATCACCCGCGAAGGGTACGAAACACTCAAACAAGAGCT [...]
+CGGGAGATGAATTTCCAAAAAATCCCGTGCAGTATCGGGGTGGCATAGAAACTGTTTGAATACCGCGTCATGCGGCGTGGATGTTGTTGAGGTCGCCATATCGATCCGTCATCGGTGAAGTTCAATGGCGTGACACTACGCGCAGACCGGGCTGATTGCAGTAGAGGATTAGTGCGCTTGCGAGGCGCGTGGGGAGATAAATGCGCACGGCGGTAACGCTTTCATCTTTGTGGAAGGCATGACGCAAAATTGCCCGGCAGCGTGACGCGTACCGGGCAACATAATGCGGGATAAAGGCCGGATAAGACGCGTTACGCCGCTACCCGGCGAAGGTCAACGCAAGGCCCACCATTCGCGCAGGCAGGCTTTACCTTCCGGACAACTTTTACAGCTGCCTGAAAGGCAGCCGTCCGCTTCTTCCGGGATACGTACCGCTTTACCCATGATCTCCAGTTGATTCAGCATGGCGTCGATCATGGGCTGCGGAGCGTG [...]
+NODE 1278 20 1502 1483 0 0
+TATGCATGGTAAATCATATT
+TCGGAAAACATAAAGACGCT
+NODE 1279 917 61630 61381 0 0
+TATCAGGGAAACCATAATCGCTGCACGCCAGAACAGACACTACGTTACCTTAATCGGTTGTCAGGCCCGTTTCTTGATCGTTTTGACCTTTCGCTTGAGATACCGCTTCCACCGCCCGGGATTCTTAGCCAACATGCCTCAAAGGGTGAGAGCAGCGCTACGGTAAAAAAGCGGGTCATCGCCGCCCATGAACGGCAGTACCGACGCCAGAAGAAGTTAAACGCGCGTCTGGAGGGTCGCGAAATCCAAAAATATTGTGTTTTGCATCACGATGACGCCCGCTGGCTTGAAGACACGCTGGTGCATCTTGGATTATCCATTCGCGCCTGGCAGCGTTTACTAAAAGTGGCCAGAACCATTGCCGACATAGAACTGGCTGACCAGATCTCGCGTCAGCATTTGCAGGAGGCGGTAAGCTATCGGGCGATAGACAGGTTGTTAATTCATTTGCAAAAGCTGCTGGCGTAAAAAAAGGGCATTACGCCCTTTTTA [...]
+ATAAATAGCTCAGACAAAGAATTAGGAGCGTGCAGGATGGCGGAAAGCTTTACGACGACTAATCGATATTTTGACAATAAACATTATCCACGTGGATTCTCTCGTCACGGTGATTTCACGATTAAAGAGGCACAACTGCTTGAGCGTCATGGTCATGCCTTTAATGATCTGGATCTTGGCAAGCGTGAGCCTGTGACTGAAGAAGAGAAGCTGTTTGTAGCGGTATGTCGCGGTGAACGCGAGCCGGTAACGGATGCAGAACGCGTCTGGTCCAAGTATATGACGCGTATCAAGCGTCCAAAACGCTTCCACACCTTGTCTGGCGGCAAGCCGCAAGTTGAAGGCGCAGAAGACTACACCGAAGCTGATGATTAATAAAAAGGGCGTAATGCCCTTTTTTTACGCCAGCAGCTTTTGCAAATGAATTAACAACCTGTCTATCGCCCGATAGCTTACCGCCTCCTGCAAATGCTGACGCGAGATCTGGTCAGC [...]
+NODE 1280 36 1826 1024 0 0
+CCCGCCTCGATAGCCTTCAGCAGGGCCATCTCCGCC
+ACACGGCGATTTCGTCCATGAGCGCCACCTACGGCC
+NODE 1281 14 926 681 0 0
+ATCCCGGTGGTGGC
+CGTCGACGGCGTGG
+NODE 1282 3 228 228 0 0
+ACT
+ATG
+NODE 1283 51 2746 1711 0 0
+GGCTGCGATGGTTTAACGCAACGGCGAAAACAGTACCCTTCATACATAAAC
+CAGCTTGATGCCTGGCGAGAGGCTTTCTCTCAGCCTCCCTATAATGCGCCG
+NODE 1284 4390 224170 221659 0 0
+GCCATAAGCCATTGCCGCCGCCGTGGGTTCATTGATCAAGCGCACGGCGTTTAACCCCGCAAGCTCAGCGGCAAGGCGTGTATGCTTCCGCTGCTCATCGCTGAAATAAGCTGGAACCGAGATCACGACATCCTTGATTGGCTGCTGAAGGTAGTCTTCCGCATCTTCTTTCAGCGAGCGTAAAACCAGCGAAGATAATTCCGGCGCATTAAACGACTCTTCACCCAAATGCCAGTGAGTATTACTGCCCATTGCGCGTTTAAATAAGGCAGCGGTTTTATCTGGATGAGATGTTTTACGGGCTGCGGCAGGTTTTCCCACCAGAATTTGTTTATTTTCATCCATACTAATTATGGATGGTGTTAAATATTCACCAAATTTATTAGGTATTAATTGTGCGGCTCCGTCTTGCCAGACGGCGATTAAACTATTAGTGGTGCCGAGATCGATACCAATCGCTAACGTTGCATTATCCATTGCGTTTAATTTATC [...]
+TATCATGCTGGTCATGAGCCTGGTTGAACGCAAAGTCCGCCTGCCGGGCAACGTGGGGAGCAAATAATGTACGAATTTGACTGGAGTTCGATTATCCCCTCACTGCCTTACCTGCTGGCCGGGTTGGTCATCACGCTGAAGATCACCGTCACCGCCGTTGTCGTGGGGATAGTCTGGGGAACCATTCTGGCCGTCATGCGCCTCTCAAGCTTTACCCCTATCGCCTGGTTTGCTAAAGCGTATGTTAACGTTTTCCGTTCCATCCCGTTGGTGATGGTGCTGCTGTGGTTTTATCTGATTGTACCCGGCTTTCTGCAAAACGTGCTGGGACTATCGCCGAAAACCGATATCCGCCTGATCTCCGCGATGGTGGCATTCTCCATGTTTGAAGCGGCCTACTATTCCGAGATTATTCGCGCCGGTATTCAAAGTATTTCCCGCGGGCAGTCCAGCGCCGCGCTGGCGTTGGGGATGACCCACTGGCAGTCGATG [...]
+NODE 1285 31 2162 2162 0 0
+AATGACCAAATTTATCAGCGGATAGAAGACA
+GGTCCCCCTGCGTCTTTCGCGCTACAGGCGC
+NODE 1286 7 2643 1858 0 0
+TCTCCTC
+ATTACGG
+NODE 1287 27 9349 4950 0 0
+CTAAAGAGTAACGGAGGAGCACGAAGG
+ACCCACCAGACACTGTCCGCAACCCGG
+NODE 1288 5769 309630 304787 0 0
+ATCTGATCCTGGTGCTGTTATCGCTGGTTGATATGACGCTGGTTGGCGGATTGCTGGTAATGGTCATGTTCTCCGGGTATGAAAACTTTGTCTCTCAGCTGGATATCTCTGCGGGCAAGGAGAAGCTGAACTGGCTGGGGAAAATGGATGCGACGTCGCTAAAAAATAAGGTGGCGGCATCGATAGTCGCTATCTCTTCCATTCACCTGTTACGCGTGTTTATGGACGCGAAAAACGTCCCGGATAACAAATTAATGTGGTATGTCATCATCCATCTGACCTTTGTCCTGTCGGCGTTCGTGATGGGCTATCTGGACAGATTGACGCGGCATAACCATTGAGCCGCCGTCAACGGCGGGGCAGTCGGGCAAAGGACGCTGAGCCCGGCTGTAAAACAGCGCTTCTTTAACGGCGGATAACCGTCTCCCTGCAGCCTTACGCAATATTTTTACTACATCTATTCATTTACTCAGTAATAAGACTAAAAGATTT [...]
+AGCACGCTGATGGTATTCGTCAGCTTAACAAACAAATTTTTCTCATCCGGACCGTTTCCTTTCAGGCCTGCCTGAACCAGCGAACCCTCAAATATGACAATGGAGAAGCCCATGATAAACGCGGTCAGAACCGAGAACAGCGGCAGCATTTCATAGCTTTGCCATAGCGGATGTACTTTATAGCCCGCCGAGATCATCAATGACCCCATTGAGGACTGGTGCATCGTCGGCAGCAGCGCGCCCAGCGCGATAATAAAGAACATCACCTTATTCAGACGTTTGAGCGACACTTTCCAGCCCAGACGTTCAAACAGGGCAGGCGCAAACTCCAGCGCCATCACGCCGATGTAGATGGTCATACAGACCGCCGTCTCAAACAGTACCGAGTTCACGTTGAAGTGACCTGGAATGTAGAAGTACGGCAGGTTCCAGTAACGACCGACGTCGATAGTGATCGACAGGCCGCCCAGCGAGTAACCAAACAAGCTTGCC [...]
+NODE 1289 956 54338 54065 0 0
+TCTTGCATATTGCCGGTATTGGTGGTGCTGTCATAAGCGAGTAGATCGTTAAGTTTTGTATCGCCTTCCACCGTGATCTTCATCGTATTGTCGGTACCGCTATTGGCGGTAAGCACCAACTGGAATTCGTTCTCTTTGACCTTAACGATACTGGCGGCGATACCGCTGTCGGCGTCATTGATGGCGTCACGGATCGCCTCCATGGAGGTGTCGCCTTTATCCAGCTTAATTTCCAGCGGCTCTTTACGTCCCGGCTGTTCAATTTTAATTGTCCGGGACGTGACCGACGTATCGCCCAACTGCTCTTTGGTGGTCGCGAAGGTGGTTTTTGTCGCCAGCGACTGTGCGGCGGCAAGCTGGGTTACGTTAATCTTATAAGTCCCTGCGGCAGCGCCAGCGGTAGTACTGACTTTGAGATCTTCAGTGGTGCTGGACGCCACGGTAGACTTAAATAAATCCGCTTTATTTAACGCGGTATTTGCCGTCTGGAAT [...]
+CTTATCAATTACAACTTGATGTTATTGGGCTGTTGCCCACGGTTTCTCACCGTAACCCTTGTATCGGCACCTGAATTTCGAACTTTAGAAAATTTTTCACTTCCCCCGATCTTTTTCTTAGGCGGCGAAATAGCCGCTTTATGCATCATTATTCCGCGCATTATTTTTGCAAAATTATCATTAAACTTTGCCTCCAGATTGCCGATAACGCGCTTAACTACTGTTTGCAATCAAAAAGGAAGAAGGCATGGCTTCAATTTCATCATTAGGTGTGGGATCAAACTTACCGTTAGACCAGTTGTTGACAGACCTGACAAAGAACGAAAAAGGACGCTTAACGCCAATTACCAAACAGCAGAGCGCGAATTCGGCAAAGCTAACCGCCTATGGCACATTGAAAAGCGCATTAGAAAAATTCCAGACGGCAAATACCGCGTTAAATAAAGCGGATTTATTTAAGTCTACCGTGGCGTCCAGCACCACTGAAGATCT [...]
+NODE 1290 51 157 157 0 0
+GAATTTCTGGGACGATGAGACATTGCAGCGGCGTCTGGCCCCTCGCCTGGA
+CCCTTCCGGCACCGCCCACTGCATCTCCTCTTCCAGCCACTGACGCCAGCC
+NODE 1291 1457 76778 73815 0 0
+CGCAAATCGTCTATGAACCGGTGTGGGTTGGCTGGAATGAACAGACCGCCGGGCTGGCCAGCGGCTGGTGGCGGGATGAAATTTTAGCAAATAATGCTATTACTGGGGTGTATGCAAAATCGCCGGTTTAAAAATCAATCGCTTATGAAAAATAATTTTTTGAACGCGCTCGCATTCTCTTGTCATTTCACTTCAATTTAGGGCAGAATACGCCGCTTGCAAAAAATGACACTAACCGACGTTTTAATACGCGTCGGTTATTTTTTTGCTTCAAACACATCATTCAATACCAAGAGGCCGGGCTTCGTACCGGATAGATACTTACTTAAAAATCGACAGTTGTTGTCGCTGAGGAATCCAGAAAATGGGGCAATTTTTTGCTTACGCGACGGCATTCGCCGTAAAGGAGAATGACCATGTCGCATAACGTTACTCCAAACACCTCTCGCGTGGAATTACGTAAAACGCTTACGTTAGTTCCGGTTGTAATGA [...]
+GATGAACGTAACCGAAGAAGCTTTTCGGGAATACGCCGTCGCGCCCCATTACGTACATCAGGCGCGCTACGCCTGCATGCGCTGCCATACCGGAAGCCAGCACGGTGATAGTAGAGAAGATCAGCGCGCCCACCTGGAAGGTTTTACCCGCCACGTACAGCATGATTTCCGGCTGAGACGCATCCGGATCTTTAAAGCGAGAGATATCCGGGAAGTACAATTGCAGGAAATAGGTTGCAAAGATGAAGATCAGGCCGCCAATCAGCGCGGTCAGGAAAATCGCACGCGGGATCACGCGCTCAGCATCTTTGGTCTCTTCCGACAGGTTACTGATGCCGTCAAAGCCGGTAAAGGAGAAGCACAGGATCGTCGCTCCCGTAATCATCGGGATAACGTGCGCATCGCCGGACCAGAACGGACGGGTGCTCGCCAGCGTACCGGCGCCTTCGCCTTCAAATACGCCATAAACCACCATGCCCAGAATGACCGCAA [...]
+NODE 1292 2262 116099 113692 0 0
+AGATAACGCGGTAAATAGCCGCATCCCAGGCCGCTAATTTGCAGCTCCAGCTTGGTTTTAAAATCAAACACGGTAATCGCTTCCTGAGCGTCGAGCAGTTCAGACCCTATTGATCGCGAGGAATGGACGCTATCGCCAACCACAATCGCGCGAAAACGTTTGATCGTCTGGCGGCTAAGCGGTTCCTCTTCATGAACCAGCGGATGATGCGGGGCGACAGCAAACACCAGTTCAAGATCGCCCAGTCTTGCAAAGCCAAAGCCGGTGTCAGGCGGCGGCGCGCGCATGGCGCCAACGATGATATCCGCCCTTCCCTGCGTCAGCGTCTCCCATGAACCGCCGAGAACGCCATTGACAAATTTAAGGCGCGTCACGCTGTGGCGTTGATAAAAAGCGTCGATAAGCGGGGCCAGAAGAGAAAAGGGAAAGGTATCATCCACACCGATGACCAGTTCGTTCTCCCAGCCTTCATGCAGTTTAATCGCCTGCTTT [...]
+GGTTGAGTAGTTCTTCTTCCAGCACGTTCTCGCCGATAATGCCGAGATCGACCACGCCATCCATCACCAGACCCGGAATGTCATCATCACGCACGCGCAGGATATCAATCGGCATGTTTTCCGCCATCGCAATCAGGCGCTGAGTGTGTAAATTAATTTTTATGCCGCAGCGGGCCAGCAATTCTCGTGAATCATCGCTTAAACGGCCTGATTTCTGAATAGCTATGCGTAAGCGGGTGTTGTCTAACATTCTGCGTTCCTCTTTATCCTGTCTGAACCGGTCTGTATCGCGCGCCAAAAAAAAGCCCCCGGAAGATGATCTTCCGGGGGCTTTCTCATACGTTCATGCACCACTGGAAGATCTGAATGTCTTCCAGCACACATCGCCTGAAAGACTAGTCAGGATGATGGTGATGATGGTGGTGTTTAAATTGAACGCGTGTCATAAAAATTCCGATGAATGCTTATTCATTTGATGCCTTTTAACCTAAA [...]
+NODE 1293 47 3315 3315 0 0
+AACAGTTCTTTAAGGTAAGGAGGTGATCCAACCGCAGGTTCCCCTAC
+TGCAGTGCTCACACAGATTGTCTGATGAAAAACGAGCAGTAAAACCT
+NODE 1294 8 612 612 0 0
+GGTTACCT
+CTGTTCTT
+NODE 1295 73 4992 4930 0 0
+GCTATATCCAAAAGAAAGCGGCTTATCGGTCAGTTTCACCTCTTCATAAACCCCGTCAGTGTAAGCTGGCGGG
+AGCCGCTTTCTTTTGGATATAGCGTCGTGGACAGTCATTCATCCTGCCGCCCTGTAAAAGCATAAACCCACCA
+NODE 1296 26 1481 1453 0 0
+ACCTTATCCTGGCAGTCCACGTAGCT
+AGAATGGACGACGAAAGCGATGCTCA
+NODE 1297 25 1244 1244 0 0
+GCGGTAGTCCGCCAGCACCTGATAG
+TGGATGAGTTGTATCGTCGCCCGGA
+NODE 1298 448 27967 27764 0 0
+ATCTTTTCGTTTTTGACCTGTCAGAACGGTTAATATCTTATAAATCATTACTTATCAAAAAGTTAAGCTATTTTTTGTCTGTCGTATGACCTGACGGACAGGGTCTATGCTTAATAAAAGGCGCTCAATATGACCATTTGTTGGAAAGCCCCTGCGGTTAAGGGGTTGAAGTGATAATCATTATCACTAACATGCTGTTATACCCTGGTGATTTAGAACGCGAGGTAACTCTATGGAATTGCATTCAGACACGTTTAACCCGGAGGACTTCCCCTGGCAAGGGCTGACGCTAACGCCAGCGGCGGCAGCGCACATACGTGAACTGGCAGCAAAGCAGCCGGGCATGTTGGGCGTGCGGTTAAGCGTAAAACAGACGGGATGTGCCGGATTTGGCTATGTTCTGGATACCGTTCGGGAGCCGGATAAAGACGATCTGGTTTTTGAAGCC
+CATAGCCAAATCCGGCACATCCCGTCTGTTTTACGCTTAACCGCACGCCCAACATGCCCGGCTGCTTTGCTGCCAGTTCACGTATGTGCGCTGCCGCCGCTGGCGTTAGCGTCAGCCCTTGCCAGGGGAAGTCCTCCGGGTTAAACGTGTCTGAATGCAATTCCATAGAGTTACCTCGCGTTCTAAATCACCAGGGTATAACAGCATGTTAGTGATAATGATTATCACTTCAACCCCTTAACCGCAGGGGCTTTCCAACAAATGGTCATATTGAGCGCCTTTTATTAAGCATAGACCCTGTCCGTCAGGTCATACGACAGACAAAAAATAGCTTAACTTTTTGATAAGTAATGATTTATAAGATATTAACCGTTCTGACAGGTCAAAAACGAAAAGATGTATAGAAAATGACTATTTAATTAATAGGCTGTCGACATTGCCGGGCGGC
+NODE 1299 3335 206268 205117 0 0
+TTAATCTTATTTGCGAGGCGTGACACAGGCATGTTTCTTGATAACGAAATTTGATAAAATTCCGCTCTTTCATAACATTATTTCAGCCTTAAACAAGGCAGACTGTTTGCATAAAAATTCATCTGTATGCACAATAATGTTGTTTCTACTGCCATATTACGGGTGACTTATGCGAAGCTCGGCTAAACAAGAAGAACTAGTAAGAGCGTTTAAAGCGCTCCTCAAAGAAGAAAAATTCAGCTCACAGGGCGAAATCGTCCTCGCGTTGCAGGATCAGGGCTTTGAAAATATCAATCAGTCCAAGGTCTCGCGCATGTTGACTAAGTTCGGCGCAGTGCGTACACGTAACGCAAAAATGGAAATGGTGTACTGTCTTCCGGCTGAACTGGGCGTCCCAACAACATCCAGTCCGTTGAAAAATCTGGTGCTGGATATCGACTATAACGACGCTGTCGTGGTGATTCATACCAGCCCCGGCGCGGCACAACTCAT [...]
+GACGCCGGTTGAAACGGTACAGGACGTCCACAGGCAGTTAAAACGGATGCGGCGTGTCATTGTCTGGACCGGTGAGCGCGAAACGCCCGTCACGCTTTATAGCTGGGTAGGCGCTGCGACGCGCTATCTGCTGCTTAAACGCGGCGTGATCAGCAACACCAAAATCAGCGCGACGGAAGAAGAGATCCTGCAAGGCGAACCCGTGGTTAAAGTGGAATCCGCTGAACGTCACCATGCGATGGTGAACTTCTGGCGCACCACGCTTTCCTGCATACTGGGGACATTATTCTGGCTATGGACCGGCTGGACATCGGGTAATGGCGCGATGGTGATGATTGCCGTGGTGACCTCGCTGGCGATGCGTTTACCCAATCCGCGCATGGTCTGCATTGATTTTATTTATGGCACTCTGGCGGCGTTGCCGCTGGGATTGCTCTATTTCCTGGTGATTATTCCCAATACGCAGCAAAGTATGCTGTTGTTATGTTTGAG [...]
+NODE 1300 1578 86157 85463 0 0
+GTTTTTTCCCGCGAGCAGTTGTTAAACCACCTCTACGACGACTACCGTGTGGTGACCGATCGTACTATCGACAGCCACATTAAAAACCTGCGCCGTAAACTGGAATCGCTGGATGCCGAACAGTCATTTATACGCGCGGTCTACGGGGTGGGATATCGCTGGGAAGCAGATGCGTGTCGCCTGGTATAATGATTATTGGCATAACAATAACAAGGTCGTAAGACGATATTTTCCGCCAACGCTATTCTGGCGGAATTAACACACTGCCCTCTTTCCTTTGGCCGAGCGGTATCCCGAAAACCACGACGAACGCGATCGGGGACAATAAATTATTTGGCCGCTCTTTTTAGTTTACCGATATACTGTGAGTAGTTTTTTAAACTTATTGCGCATTAATTCATTAAGTGAATCTAAAAATACATAAACATAATACCAGCTTAATTATACATGGATTTTTATGACAGAAACGTCATCTCACCGCTATAAACCACG [...]
+CGCAGCCGTCGCCACGTTAGGATCAACAACCTGAAGGTAGCGCAGCGCCTCCGGGGCGCTGTGCAGCAGTAGCCACTGTAAAGCTACCGGGGGAGTGGGGAAGTGCTCCATTAAATGAAAATTGTCATGCAACACATTGAGCAGAAAATTGAGGTCATGAATATGCGTAATAAATTTCCAATCTGAATATTCCGGTGTCGATTCATAAACTATTCCCATCCCTTCACAATCGGCGTGGCGCTCAGGAAGTGGTTGCAGATGGCGTAACAGAGATAAAACATCGTTAGCATATTTCTTAATAGGATGGCGATTTTGCTTACCTTTAATCTGATCAATACTCAGGCCGTTATTACCAACCACCAGGCTTATTGTGACGTGGGGAATATTATTGTCGTCGCGCAGGCTGAACAGGCGAAGTTTTTGTTGTTCAATTTGCCGGGCGTAGTAATCACCGTAGCCGCCGGAAAGCGCGCCTTTATTATCAAAATCTCC [...]
+NODE 1301 45 1969 1969 0 0
+CACCAGTAGCGAACCTTTCGAAATTGAAAGCCTGACGCTACAAAC
+CCCGGCAAGCGTAGGGTGCCATTCATGATGCGGAAACAGCATTTC
+NODE 1302 1634 78760 76150 0 0
+GAGTTTTAAATGTCGTTGTGTTCGCAAAACGGGGAGCTCCGGGCGCGTAAAAACGTCCCGGAGCAGGCGGCTTAGATTTTTTCGATTTCCACCAGATTTGTATGTTGAGGATTCCCTTTTGCCAGGGGGGAAGGACGCAGCGTCGTGAGCGTATTGATGCAGGCGCCGTGGTCAATTTTATCGCCAGCCATATCCGCATTATGCCATGCGCCCTGACCCATCGCGCTGACGCCCGGCAGAATACGCGGCGTGACTTTGGCGGGTAGACGCACCTCTCCACGATCGTTAAAGACGCGAACCCTGTCGCCATTCGCGATACCGCGTTTTTGCGCATCGAGCGGATTTATCCACACCTCCTGGCGACAGGCGGCCTGCAGAACATCAATATTGCCGTAGCTTGAATGGGTACGGGATTTATAGTGAAAGCCAAACAGCTGTAGCGGGAAGGTGCTCCGTTTCGGATCGTCCCATCCTTCAAAAGTAGGGGTATAA [...]
+CGACAACTATTGCATCGGCTACGATGAAAAGACCCTTCCGGCTGACGCGCCCCCCAATGGCCATTATAAGGCTTATATTTTGGGCCAGGGCGAGGACGGTATCGCCAAAACGCCGCAGTGGGCGTCACACATTACCGGCATCCCCGCCGATCGGATTATCAAACTGGCGCGCGAGATAGGTAGCGTCAAGCCGGCCTACATCTGTCAGGGTTGGGGACCGCAGCGTCAGGCGAACGGCGAACAAACCGCTCGCGCCATCGCCATGTTACCGATTCTGACCGGCAACGTCGGCATTCATGGCGGTAATAGCGGCGCACGCGAATCCACTTACACCATTACCATTGAACGTCTGCCGGTCCTGGAGAATCCCGTTAAAACCGCCATCTCCTGCTTTAGCTGGACGGACGCCATTGCGCGCGGCCCGGAAATGACCGCCCTGCGCGACGGCGTACGCGGCAAAGATAAGCTGGATGTCCCGATCAAATTTCTATG [...]
+NODE 1303 1861 99176 98223 0 0
+CGCGCGGTTGCTCTATAACTATCTGGTGAAGGGCGGCGTGCAGGTTTATGAATACCGACGCCGTCCGCTGCATGGCAAAGTGGCGCTGATGGACGATCACTGGGCCACGGTAGGGTCGAGTAATCTCGATCCGCTCAGCCTGTCGCTTAACCTTGAAGCTAACCTGATCATTCACGATCGTACTTTTAACCAGACCCTGCGCGATAATTTACAAGGCATCATCGTGAATGATTGTAAGCAGGTCGATGAGTCTATGCTGCCGAAACGCACCTGGTGGAACCTGACCAAAAGCGTGCTGGCGTTCCACTTTTTACGTCATTTCCCGGCGCTGGTCGGCTGGCTACCTGCGCATACCCCGCATCTGGCGCAGGTTCCCCCGCCTGCCCAGCCAAAAATGGAAACCCAGGATCGCGTTGATCCAGAAAATACAGGAGTGAAGCCCTAATGGCTAAATCGCATCCGCGCTGGCGGCTGGCTAAAAAAGTGCTGACC [...]
+ACGGCGATCATGATGACCATGACATGGATCGTCAGTATAAACATGGTTATTGCGCAGTTTGAGCTGCACAATAAAAAGCATCTGGAGCTGGTCTTCTTCCTGACCGTGGGCTATATCGCTTTTCTTACCCCGTCAAATCAGCTCCTGCTTAAAGGAAGAATGAGCGGGGTCATTATTTACCGCTATGCGCTATTGTTGGCCATTATTTCCGTTACGTTGGCAACGTTCTGTACCCTGTCATCAGTATTCATGGGCGAGTTTCACGAAGTGCTCCTGCTGCTGTTTAGCTGGTCATTGCTGCTTTTTTCCCGCTTACAGATGAATACGTCTTTTTTCTCAGCATATGTTTATTTTTACCGGATAAAACGCGTTGTGCTGGAAAGCGAAAACGCGTCTGCTTAAATTCATTTCGCCATCGCCCGCTCGTTTTTCGCCCGCAACTTCTTCGCCCGGCTCTCCAGGATCAGGTAGCACACCAGCGCCAGCAACAGG [...]
+NODE 1304 48 1926 1926 0 0
+AAAAGTGCTGGTGCGTACGGGCAAACCGGTCACGGCAGAAGCAGAAAA
+CCCGACATTTGCCGCCGCTGCCGCCTGCATATCTTCCAGCTTGTCTCC
+NODE 1305 593 36444 32667 0 0
+AACGGCATCATCATCCCATAACGTCCTCTGTGACTCCACATTCAGGACGGGATTGCCGCGACAACGCCGGCAAATGTACCACATTTGCCGGATGTTACGTATACCCGAGTAAGGAGAACATAATCTCATTGTTGGTTACGGTTTGAATTATGACCGGAGGCGCACTGATAACCCGTCTACCCTAATAGCCATATAAATAACGCGCCGAACAGCGCGCCTACGGCCAGTAGAGTAAACATGATGCTAAAAAGTATTTTGCCCTTTACCAGCAGATGCAACGCAATGCCGATAATCACCGATACCGGCATTAACGCGAGGAAAAAGGGCCAGGTATAGAGGAAAAAAAACAGCGTGTTAGGGCCATAAAGCAGAAAAGGGATCCCCAACGCCAGCAGCCATGACACAAAGCCGACCACCGCCCCCGGAAATGCACTGGTGGCGTCATCGTCGACCATGAAGGCGTCTGACCTTGTGAAAGTAATGTTATGGCTA [...]
+CCGGGCTTGTATGCCCGGTATGGTCAAGGTTACAGGATTTAATATGCGTAATAGCCATAACATTACTTTCACAAGGTCAGACGCCTTCATGGTCGACGATGACGCCACCAGTGCATTTCCGGGGGCGGTGGTCGGCTTTGTGTCATGGCTGCTGGCGTTGGGGATCCCTTTTCTGCTTTATGGCCCTAACACGCTGTTTTTTTTCCTCTATACCTGGCCCTTTTTCCTCGCGTTAATGCCGGTATCGGTGATTATCGGCATTGCGTTGCATCTGCTGGTAAAGGGCAAAATACTTTTTAGCATCATGTTTACTCTACTGGCCGTAGGCGCGCTGTTCGGCGCGTTATTTATATGGCTATTAGGGTAGACGGGTTATCAGTGCGCCTCCGGTCATAATTCAAACCGTAACCAACAATGAGATTATGTTCTCCTTACTCGGGTATACGTAACATCCGGCAAATGTGGTACATTTGCCGGCGTTGTCGCGGCAAT [...]
+NODE 1306 136 15155 14523 0 0
+AGGACGTCAATAGTCACACAGTCCTTGACGGTATAATAACCACCATCATGGCGACCATCCAAAGGATAAACATCATAGGCAGTCGGGAGGGTAGTCGGAACCGAAGAAGACTCAAAGCGAACCAAACAGGCAAAAA
+CCGACTGCCTATGATGTTTATCCTTTGGATGGTCGCCATGATGGTGGTTATTATACCGTCAAGGACTGTGTGACTATTGACGTCCTTCCCCGTACGCCGGGCAATAATGTTTATGTTGGTTTCATGGTTTGGTCTA
+NODE 1307 759 44984 44701 0 0
+CGAACGGGAAACCTACAGATATACCGTAGGCAGAATAACCTGAAACACACAGGGGGTAATGAATATAACCTTCTGGTTAACAGATTAATATAATTAATCGAGTTATACTGAGTATATCTGTATGAACGTTAGGATCTGGAAATATAATCAATAATCGCATACAATACCGCCTGTAATAGTTTTTGTTTTCTGCGTTAAAAGGTTTTTATTGATATGAATTTGATGTTACAGAACTTAAATAATATCCGCACGCTGCGCGCTATGGCTCGCGAATTCTCCATTGACGTTCTTGAAGAAATGCTCGAAAAATTCAGGGTTGTCACTAAAGAAAGACGCGAAGAAGAAGAATTGCAGCAACGCCAGCTTGCCGAGAAGCAGGAGAAAATTAATGCCTTTCTGGAGCTGATGAAAGCAGACGGTATTAACCCGGAAGAGTTATTTGCCATGGATTCAGCAATGCCGCGTTCTGCTAAAAAGCGCCAGCCGCGTCCG [...]
+GCTGATTTATCAAAATGAGCATGGCGCAACGTTCCCTGAATCCCGGTTAATAGAGACAGGAAACGAAGCGCCATCTGTTAAAGGTTATCCGTGATTAGATTAAGAAATCATCCAGAGATTTCCCCGCCGCCAGCGCCTGGGCAATCGGTTTAGGCGTACGACCTTGTCCGGTCCAGGTTTTTTCTTCGCCATTGAAATCAGTAAAACGATATTTTGCCGGACGCGGCTGGCGCTTTTTAGCAGAACGCGGCATTGCTGAATCCATGGCAAATAACTCTTCCGGGTTAATACCGTCTGCTTTCATCAGCTCCAGAAAGGCATTAATTTTCTCCTGCTTCTCGGCAAGCTGGCGTTGCTGCAATTCTTCTTCTTCGCGTCTTTCTTTAGTGACAACCCTGAATTTTTCGAGCATTTCTTCAAGAACGTCAATGGAGAATTCGCGAGCCATAGCGCGCAGCGTGCGGATATTATTTAAGTTCTGTAACATCAAAT [...]
+NODE 1308 1690 109012 100150 0 0
+GTGGTGCGGTGGAGCAGGCGGATGCCCAGTTGATGTTCTAACGCTTGTATTTGCCGTGAGACGCTGCCTTTGGGAAGGCCGATATCCTCTGCTGCACGGGAAAAACTTTCCCGTTCCGCCACGCGTACAAACAATTTCATTGCATATATTTTATCCATCATCAGGCTCTATTATTGTTTTTATTGAAACAGTGACGCTGAGGCGGCTGGTTTTATTGATTTTCTATCATCTAATAAGCCCTTTCGCAATCATTGCTCGCGTGACGAATACGTCTGATCGCGTTGCGCGGCGGATTTATCGTTTTCCGGCCAGGCTTTTTAGCGCCAAAAAGCCGATAAACGGGACGAGAGCGGTAAAACACGCTGATAGCCGCGGGTGTAGTGGGAGAGAGAAATGCATGTACATATACGGTATTGTCATTGACCCATCGTCGCGGTTTTCAGGCGGATTGGCTATTTTTTAACAAAATGTGCTACTTTATTTTTTGTAACA [...]
+CGGGCATATGTTGACGCCGGATGAGACGCTGACGTTCATTACGCCCGACCAGGCGGAGGCATTCTTGCTGGATGACCTCAATAGCTGCGATATGCTGCTACAGAATTGTTTGCCGGAACTTAATGATCGGTTTCAACGCGAAACGCTTATTGCGCTGATGTTCAGCATCGGACATCAGCGTTTTTTATCATTAATCAATACGGGTGATATTTCACAGCCAGAAATAAGCGGACTGCGAATTTAACGTCGTTAATTCGATTCATTTAACATCATGGCGGCCTGGGTACGATTTTTTACATCCAGCCGCCGGTAAAGCGACTCCAGATGCGCTTTAACCGTCCCGGTACTAATATTTAACGCCCGCCCAATTTGTTTATTTGATTCTCCTGCGGCAAGCATCTGTAAAATTTCCCGCTGGCGGGCGCTTAACGCTTTTATATCACGGGACTCCAGCTCCGTTGAATTTAACCAATCCCCCGGTAAAAACATCAT [...]
+NODE 1309 12 1360 715 0 0
+ATATCCACCACG
+AAAAGCGGCTGG
+NODE 1310 110 4617 4617 0 0
+GGCGCAAACAGGCCGATAAAACCGATAATGCCCACCGCGTTGACCAGCAGCGCGCTCAACACAATCGCCAGCGACAGCGCCGCCAGACGCGCTAACGACAGCGCCAGCCC
+GTTGAGCGCGCTGCTGGTCAACGCGGTGGGCATTATCGGTTTTATCGGCCTGTTTGCGCCGCTGCTGGCGAAAATGCTTGGCGCAAGACGTCTGCTGGCGCGCCTGATGC
+NODE 1311 41 2270 2264 0 0
+CGATGGGTGCTGCGAATCTGGCTCATGCCGCCGAGACTACC
+AGGCAACAAATAGAGCAGTCAGTTTACGCATATTTCCATCC
+NODE 1312 51 2757 847 0 0
+ATTCCCGCCGCCACGCTTAGCGATTTGGTGGCGCAGCAGGCGCAAAAAACG
+TCGTTACCGCCGTATTATTAAGGTGTGTTAATTGCGTTTGTTCTTCCGCCA
+NODE 1313 2616 142003 138827 0 0
+AAACGCCGCCGCCCAGACGCTCTACGCCCTCGATCGTAATACGATCGGTGCCCTGCCCGGCGATCTTCGCCCCCAGCGCAACCAGGAAGTTAGCGGTGTCGACAATTTCCGGCTCGCGCGCGGCGTTTTCAATGATGGTCGTCCCTTCCGCCAGCGTAGCGGCGCACATAATGGTGACGGTCGCACCGACGCTGACCTTATCCATCACGATATGCGCCCCTTTAAGACGCCCTTCGACGGAGGCCTTTACGTAGCCCTCTTCCAGCTTGATGGTCGCACCCAGTTGTTCCAGACCGGTAATATGTAGATCAACCGGACGCGCGCCGATAGTACAGCCCCCCGGCAGAGAGACTTGTCCCTGACCAAAACGGGCAACCAGCGGCCCCAGCGCCCATATCGAGGCGCGCATGGTCTTAACCAGATCATAAGGCGCGCAGAACACGTTCACCTGGCTGGCGTCAATGTGTACCGATCCATTGCGTTCCACTTTCG [...]
+GGAGCCGACCTATAAGGTTTATGCGACCTTCGATAACATCGGCGGTCTGAAAGTGCGTTCCCCGGTACGCATCGGCGGGGTGGTTGTCGGGCGGGTTGAAGATATCTCGCTTGATCCGAAAACATACCTACCGCGCGTAACGCTCGACATCGAAGAGCGTTATAACCATATTCCCGATACCAGCTCGTTGAGTATTCGTACTTCCGGGCTGCTGGGGGAGCAATATCTGGCATTAAACGTCGGTTTTGAAGATCCTGAGCTGGGAACGTCTATCCTCAAAGATGGGAGTACGATTCAGGACACCAAGTCTGCAATGGTGCTGGAAGATATGATTGGCCAGTTCCTCTATAACAGCAAAGGCGACGACAATAAGAATTCTGGCGATGCGCCAGCCGCAACGGAAGGCCATACTGAAGCCACAACGCCCGCGGGCGAAACGAAATAATCTCAGGAGAATTGAGGCATGTTTAAACGACTGATGATGGTGGCCCT [...]
+NODE 1314 132 11082 7494 0 0
+CCGCCCATGGCGAAAAAATCGCTCCACGATGAAAATGCCGGACTCACCGGTGCCCCCTTTTCAGTATCAGTTCGCTCACCCACGGGCGGCGTTTTTCCATCAGTAAAATCAGGTTGCGCATCCGCATCAGCG
+TGGGTGAGCGAACTGATACTGAAAAGGGGGCACCGGTGAGTCCGGCATTTTCATCGTGGAGCGATTTTTTCGCCATGGGCGGGTACGCCTTTTTTGTCTGGCTGGCGGTGGCGATGACCGTGGCGCCGCTGG
+NODE 1315 664 44890 44890 0 0
+AAGGGATTTCCTGACTGACATACCACCGGACAATCCCGTTATGATCAAAAGCCAGATTATACCGATCAAAATAAGTGGAGAAATAAAGTCCTTCCTCCATCAGCGAGGCCTGCTGCGCAGGACAGGAGACGCTAATAATAGGGAAGCCGAGGCTCACGTTAGCCGAATCCGTGGGCGGTAATGCGTCTGTCATTACTGTATATTGCCCGACAATTTGCGAGGCAAGGCGTAGGGTAATCTGATTATTCACCGCGGATACCATCCCACACACAGGAATAAGGTTAGCGCCCGGATGTACATCATATTGATAACGCACTGCCTCTGTCGTCGCTTCGCTATCAACAACATTGATCTCAAGCGCGGCAGCTTCATCCATCCAAACCCCCAGATAGAGACTCAACGGGGCGGTCCCGTAGGGATTTACGGTGACAATGGCCTTGTCACTGGTATTAGATTGCGTGATCTCCGCTAATCGTTGTTCATATATGGCGT [...]
+TATCCCAATTAATCAGGAGAAACGTATGAATAAGAAAAGTTCGTCAATGGTTAACATGCCCGCACCGCGTGAGCCGATTAACCAGAAAATCGATACCAATAACGCACTGGTTTTAAACCATAACGCCATATATGAACAACGATTAGCGGAGATCACGCAATCTAATACCAGTGACAAGGCCATTGTCACCGTAAATCCCTACGGGACCGCCCCGTTGAGTCTCTATCTGGGGGTTTGGATGGATGAAGCTGCCGCGCTTGAGATCAATGTTGTTGATAGCGAAGCGACGACAGAGGCAGTGCGTTATCAATATGATGTACATCCGGGCGCTAACCTTATTCCTGTGTGTGGGATGGTATCCGCGGTGAATAATCAGATTACCCTACGCCTTGCCTCGCAAATTGTCGGGCAATATACAGTAATGACAGACGCATTACCGCCCACGGATTCGGCTAACGTGAGCCTCGGCTTCCCTATTATTAGCGTCTCCTG [...]
+NODE 1316 3163 178197 176200 0 0
+AAGATTATGCTTACTTTTTGGGTAAGGCGACGGGAGATAAAACGAGTTTTTTTATCCATGATGACGCCAATAATCGGCTTCGCGTCGTGTTGAAAAAATCCCCGGATGGCGTGTGGCGCCCGCAGCCGGAAAACAACCTGCTGACACAACAATCTAAAGTGAGCGGCGGGTACTATAGCGATGGCACGCTGCGAGAAACCGATTTAGCGCAACTGGCGCAGGCGTGCAGGGTGGAGGGAGACACCGTTAACCTCACCGGCACGCTTCGCCAGCAGGGGGACGGCGAGTCCGCTTACTGGACCCTGACCCCGGATAACCCCCTTGCCTGCGTGCGCGATGCCAATAAGCAGCAGCCTGGCTGGAACCAGACGATGCAACTGGTGCTAACCCCACAAGAGCGGGAATCGCTCAACAATTTGGTCGGTAAAAAAGTCAGCGTCGGCGGCGATATTTTTCTGGCGCTGAGCGCCTCGCATCATACGCCGCTGTTAC [...]
+CCAACTCCGCAGAAGCCGGAAAACGATCTGTCGATGACCTTTTATTATGCGCCGGAAGAGCGCAGTCATTAAAAATGGGGAGTCTCACATCACCAACCCGGCCCCTCCATCACGGGCATGAGTTCCACAATATTCTCCAGTACCAGTGGCGTGTGGTGATCTGAACTTAATGCCAGTAAAACATCACCTGTGACAACAATTTCTTGGTTTAACAAATCGTCGCCGTACTGTACTTTAACTCTTTCTATGATCTCATCGCTCAACAAGAGTTGCACTTGCCCATTCCAGTCGGCTGTCTGCATGTCGGCATCCTGGACGCAGGTTAACGGTTCTTCGAGTTTAACCACCCAATAACGCTGCGCGCCGCTTTTTTGCTCTGCCAGTATTCCGCGCAATGACACGGTATCGCCTTCCCGCACGCAACGCTGTTGCCGTTTTTTCGCCATTTCTTCAACCGTTTTGACTGGCAAAATGTCGGTGCTGTGGTTACAC [...]
+NODE 1317 1097 49536 48863 0 0
+TCAGCGCTAATACAATCGAAATCACGCACAGCCTCGCCGCCGCGCTCTCCCCGCCAGGCGTCTGAATCAAGGTATACATAGCGGAAGGTATGGTGCGGGTTTCGCCCGGAATATTGGAAACAAAGGTAATGGTCGCGCCAAATTCGCCAAGCGAACGGGCAAACGCCAGCACCGTACCGACAATAATGCCCGGCAGGGTAAGCGGTAAGGTGATAGTCAGAAAAACGCGCCAGCGCCCGGCGCCCAGCGTTCTGGCGGCCTGTTCGAGCTTGATATCCACCCCCTCCAGCGCCAGCCGAATGGCCCGCACCATCAGCGGGAAGGACATCACCGCCGCCGCCAGCACGGCGCCGCGCCAGCTAAAGGCAAACGTGAGACCGAACCAGTCATACAGCCACTGGCCAATAAATCCGCGTCGCCCCATCGACACCAGCAGCAGATAGCCGACCACCACCGGAGGCAGCACCAGCGGCAGATGCAGGACGCTATCAA [...]
+AAACCGTTTACCATCGACAACAAAACGGACTGGATTCGTCTGCTGAACGGCGGGCGTCTGGCGGTGGGCGATCCGCAACACGTACCGGCGGGAATTTATGCCAAAGAAGCGCTGCAAAAGCTGGGCGCATGGCAAACGCTTGAACCGAAACTGGCGCCGGGCGAGGATGTGCGCGGCGCGTTGGCGCTGGTCGAACGTAACGAAGCGCCTTTGGGCATTGTATACGGTTCTGATGCGGTCGCCAGCAAGGGGGTCAACGTGGTGGCGACGTTCCCGGAAGATTCACATAAAAAAGTGGAATACCCCATCGCTATCGTGGAGGGGCATAAAAATGCGACCGTCAGCGCGTTCTATGATTACCTGAAAGGACCGCAGGCCTCGGCAATCTTTAAACGTTATGGATTTACGACGAAGTAATGATACTGACCGATCCAGAATGGCAGGCTGTCCTTCTTAGCCTGAAAGTGTCTTCCCTGGCCGTGCTGTTTAGCC [...]
+NODE 1318 51 93 93 0 0
+GTTCGAACCCCCGATACGTTGCCGTATACACACTTTCCAGGCGTGCTCCTT
+CCCCCCCCTCACCGCCATATTTAAGCTGAGAGCCTGTACAGAAGTACGGGC
+NODE 1319 1674 83064 80365 0 0
+ATAGTGAACCCAAGTACGCGTTTTAGGGTGAGGGTGTGCATTGCGGTGTGTCTCCCTGTTTGCATGTGTTATGGCGACGTTAAGAGTCGCGTGTTGTTATGCCATGTTCCGGCAGGGTACTTTGAGCTATAGCAACAGGTTGGGAAGGATTCCAGCGGAGCGTGATGTTTAACACTGTTAAACATCTATTAACAATTATGTTTTGCCCTTATGCGGCTTCGCGTGAACATTCACGATAAAGAATTATCTTAAAAATAGAAACGTAGTGTGACGTTGTCACTTTTTGTAGATAAAAATAGGCCGCAATGGGAGAAAAGGCAGGTAAAATCCTGCCTTTTGTGGGGATTAACGGAATAACGGTTTTACAGCGACGGGAATAATGAGTTGAGCTTGCCATTGCGCCAGCGTCAGACGCGCCAGTTGCCCCAACGCCTGATAAAACGGATGCCCGGCATGATCGATAAATACGTCCAGAAAGCGGGACGACCACGG [...]
+AGGCGCTTCCGCTCTGAGTAATGAAATCGCCGCAGGATCGGTGTTCTTTGCCGTAGGCGGCATCTGGTGGCTGGTGGCGGTACTCGGTAAAATGCCCCCGGCGCTGGGTAAAGTGTGGCTGCTGGTCAGTATGGCGCTCGGCGTTGCATTCATCTGGGCAATGACGCTCGTTTATCAGATAGATACCGTGCCAACCTGGTATAATGGCTACACCACGCTGGCCTTTTTCCTCACGGCATTCCTGTGCGGCCCGGTGTTTGCGGCGTTACTGCTACGCATCGCGCGCGTCCCATTTTGCAGCGTGACGTTTGCCAGTATTAGCGGCCTGGCGTTGGTGGTGTGCGTGGCGGTCATCGTACTACAAGGGCTGTCTCTCTCAACCATTCACAGTTCCGTGCAACAGGCCAGCCATCTCGCACCGGATTACGGTATGCTACAGGTCTGGCGCATTGTCTTGCTTGCTGCCGGATTAGGCTGCTGGCTATGTCCGCT [...]
+NODE 1320 175 6302 6302 0 0
+TCGGCGCGTTAATCGTTAGCGGACTGGGCTGGCTGACGGCAAAAGACGATACCATCGCCCGTCAGCGCATCGTGCGCAGCATGTTTTTTCTGTGGCTGGTGATGGGACTGGGATTCCTCGCGTCGATTATGCATCTCGGCTCGCCGATGCGCGCGTTTAACTCGCTTAACCGCGT
+CGACGCGAGGAATCCCAGTCCCATCACCAGCCACAGAAAAAACATGCTGCGCACGATGCGCTGACGGGCGATGGTATCGTCTTTTGCCGTCAGCCAGCCCAGTCCGCTAACGATTAACGCGCCGACCACGCACTGACCAAAGACCGTGAAGATCATCAACGGCCATTCATGCCAT
+NODE 1321 1609 88513 87880 0 0
+GCCAACTTTTTCAGCAACATACCGCACGCTGGCAGCATGAACTACCGGAGCTCACCAAACCTCAATATGCGGTGATGCGCGTTATTGCTGAACATCCGGGTATTGAACAGGTCGATCTGACCGAAGCGGCGGTCAGCACTAAAGCGACGCTGGCGGAGATGTTAAGCCGGATGGAAAATCGTGGGCTGGTAAAGCGAGAAAACGATCCGCTGGATAAACGTCGGCGTTTTGTCTATCTCACCGTTCAGGGCCAAACGTTGCTCGCCGCCGCGATACCACTGGGGGATCGCGTTGACGATGAGTTTTTGGGGCGACTGAGCGCTGAAGAACGCGAACAGTTTACGCAACTGGTACGCAAGATGATGACGTAAGCGGCTTGCGCCGCTTTGCTATTGTTTGGCCATCAGCAGTGAGATATCCACTTTGGCCAGCGCCCGAATTGCGCTTTCCGGCAGGCCGTCATCGGTGACGATTTGGTTGAATTCCGCCAGC [...]
+AGAATGACTAACGCATCCACGACGCCGGCGAACTCCCTGGCGCTGGCGGCAGCCCCACAAGCCCCTTCAGCAAGAAGATTCGCGCACGCTTGCGGGTTAAGATCGGCCCCCCATGTGGAAAGCCCGGCGCGCAGGCATGAACGCGCAGCGCCCATTCCCATTGAGCCAAGCCCCACAATGCCGACATGAAAATCGGTTCCTGTTGTCATTATCACTCCATGTTAATTTACGTGATATTATGTTTTGTTATGTGAATATAGGCGTTTTTGTAAACAATTGCGGTGAGTTGTTTCACAAAAAATAACAAAATGTGTTATTTTTTGTGAAGGCAATCCTCATAGAACTTCACACGCTGTGACGAGAAATCGCGTAAAATCGCGACAGGACTAAAGAAAGGAGCAGACGTTGATACCTACTGAGCGTCGACAAATCATTCTTGATATGGTGGCGGAGAAAGGCGTCGTCAGTATCGCTGAACTGACCGAGCGCATG [...]
+NODE 1322 4 214 207 0 0
+TGGT
+GCCA
+NODE 1323 20 1103 1103 0 0
+ACCGGCTTCGTTGGCACGCG
+TTCCCGGACGATCCGGCGTG
+NODE 1324 51 5224 3061 0 0
+CAGTGCAGGAATCAGGAAAAATAGCCCGACCGGGAATATTCACCCGGATGG
+GATCATGAAATCGGTTCTGCTTACCAGCCGGCAGCGATCGATAACCGTTCC
+NODE 1325 3 334 334 0 0
+GCT
+ACT
+NODE 1326 51 2428 2360 0 0
+GCCTGGCGCTATTCGGTATCCTCTTCAAGTTGACGATTGCGCACCGATTTA
+CTCCAGATCACAATCATTAGTCCGCGCGCCAGCGGCGAATCCAGACCTACC
+NODE 1327 693 33362 32858 0 0
+TGCCAGTATTCGATCCCGGCGGGCAAGGTGCCTTTGCTAACCTGCTGATAGATGTGCTCGGCGTCGCGTTTTACCTCAAAGGTATCGCGCCACTGGCTACGGAAAAGCTCAATAGCGGCTTTGTCGGTAGGAAATTCGTGCGCGGGCAACAAATTGATGGCCTCGACCTCCTCCAGCGTACGTTGGGTATCCGCGTCAAACAGACGCAGGCTGTCGATTTCATCATCAAAAAAGTCGAGGCGATAAGGTTGTTCGCTGCCCATCGGAAAGAGATCCAACAGCGCGCCGCGCGTCGCGTATTCGCCATGCTCCATCACCTGATCGACATGCCGATAACCGGCGCTGTCAAGCTGCGCGCGCAGAGCGTCGCGGGACAGCCGCTGGCCTTTTTTCATCACCAGCGCATGACCATGCAGATAGCTATGCGGACAAACGCGCTGCATCAGGGTGTTTACCGGTACAATCAAGACGCCGCGCTGCATTGACGGCAAC [...]
+CTGACATGCAAAATGCTCTGCGATTGCATGATGAAATCCGCCAGTTTACCGATCAGATGGTGATGAACCTGGCGGACTGGGAAACGCTACCGTATGACAGCTTCTCCCCGCATCAGGAAATTATCTCTTCGCGCCTGTCCACGCTCTACCAGTTGCCGTCAATGCAGCGCGGCGTCTTGATTGTACCGGTAAACACCCTGATGCAGCGCGTTTGTCCGCATAGCTATCTGCATGGTCATGCGCTGGTGATGAAAAAAGGCCAGCGGCTGTCCCGCGACGCTCTGCGCGCGCAGCTTGACAGCGCCGGTTATCGGCATGTCGATCAGGTGATGGAGCATGGCGAATACGCGACGCGCGGCGCGCTGTTGGATCTCTTTCCGATGGGCAGCGAACAACCTTATCGCCTCGACTTTTTTGATGATGAAATCGACAGCCTGCGTCTGTTTGACGCGGATACCCAACGTACGCTGGAGGAGGTCGAGGCCATCAATT [...]
+NODE 1328 221 13497 13497 0 0
+AGCGTAGCGCAGGCGGCGCCGGTAAGTTCGCCCAACTGGCGCTGATCGCCCGCTTTTGTCGGCAGCGTGTAACGTTGTTTTTCAGGCATAACGGTTGTCAGTATCTCTTTTTGTTTTACGCCGCACTCTACGCGTCACCCTTCAGGCTGCTTCATGGTTGGCTGCGCGCCGGGACAGCATGAAGGACTCAGGTATTCAGGGGCATATGACTGATAAGCAAT
+CGGCGCGCAGCCAACCATGAAGCAGCCTGAAGGGTGACGCGTAGAGTGCGGCGTAAAACAAAAAGAGATACTGACAACCGTTATGCCTGAAAAACAACGTTACACGCTGCCGACAAAAGCGGGCGATCAGCGCCAGTTGGGCGAACTTACCGGCGCCGCCTGCGCTACGCTGGTGGCGGAGATAGCCGAACGCCATGCCGGTCCGGTGGTACTCATAGCGC
+NODE 1329 1734 85273 84568 0 0
+TTTGGCCGCTTTAGTATCGAGATAATGCTCATTATTTGGATTACGACCCACAATGAGCGGAACGCGTTCCACAATATTAATTCCCGCCTCGGTCAGTATTTCGACTTTCTTCGGATTATTGGTCAGCAGGCGAACTTCATCCACGCCCAGTAATTTGAACATATCCGCGCACAGGGTGAAATCACGCTCATCGGCGGCAAAGCCGAGCTGATGATTGGCCTCCACCGTGTCATAGCCTTGATCCTGTAACGCATAAGCGCGAATTTTATTAAGCAGGCCGATATTGCGGCCTTCCTGACGGTGGTAAATCAGAATACCGCGTCCTTCTTCCGCAATATGCGTCAGCGCGGCTTCCAGTTGAAAACCACAATCACAGCGCAGACTAAAAAGCGCGTCCCCGGTAAGACATTCGGAATGAACGCGAGCCAAGACCGGCGTTTTACCTGAAATATCGCCAAAAACCAGCGCGGCATGGTCGTGTCCGGTTGCCAG [...]
+TATTTCACATTACTTCCCGTTATGTGGTTTGCGCGAATAAATCGTGTCCAACTTACCGCATCCAGCCTTCTAAATTACCATTTTCCCGCCTCGCGCGAAATGGAAATGCGCCCGCCATCAGATGATTTAAGGGCAATAGTCAGAAAATCAACCGTTGTCAGCTTTCCTGCTCGCGTTCAGCAATTTCTTGCGCTTCTTCACGAGGCGGCATAAGCGGCCCGCAAATTCGCTGCGCCAGCCAGGTCGCCAGGGTAACTAATAGCCAGGAGATAAGCGTGGCGACCACTAAATCTCGCGGCCAGTGCATTCCCAAAAGCAAACGGCTGCCCATTACGCCGGTCGCCCAGACTAACAAAAACGCGATGGTGAAAGCCCGTCTGCGCGGCCATAACAGACCCACGGCCAAAAGCGCCCAGCTCGCTGCAAACATGGTATGTCCGGAGGGAAACGCAAAGCCCGTCTCTTTTTGCCAGTGCTGACGCAGGAAAACGG [...]
+NODE 1330 42 42 42 0 0
+CGGGCGGCTACACCATGTCGGTGGCGATGACCAACTGCGGCG
+GAAATAACAAAAATCGCCAATACCAGTAAGAAAATGAGTAAA
+NODE 1331 9 204 204 0 0
+GCCCCGCCG
+TCCATGCCG
+NODE 1332 962 47778 47467 0 0
+ACGCGGCGGCGCGTTTATCGGCCTGAACCCGATCCACGCGCTTTATCCGGCGAATCCGGAGAGCGCCAGTCCCTACAGCCCCTCGTCTCGTCGCTGGCTGAACGTGATATATATCGACGTCAATGCCGTCGAAGATTTCCGCCTGAGCGAAGAGGCGCAGTCATGGTGGCAAATGCCTGCCACACAGCAAAAGCTGCGACAGGCACGCGATGCGCAATGGGTGGATTACGCTACCGTTACCGCGCTGAAAATCACGGCGCTGCGGATGGCGTGGACGCGGTTTGCCGCTCGCGACGATGCGCAAATGGCGGAGTTTCGTCACTTTATCGCCCGCGAAGGCGAGAGCCTTTACTGGCAGGCGGCATTCGACGCGCTGCATGCGTATCAGGTAAAAGAGGATGAGCAGCGCTGGGGCTGGCCAGCCTGGCCGGAGGCTTACCAGTCGGTAGAGTCTCCCGCTGTCAAACAATTCTGTGAAGCGCACCGCGAAGA [...]
+GCCAACAGATCGTCAACCGGATACTGAACATATGCCCCGCGATCCGCGGTTTCGCCATACGGTATCCACCACAGACGCAGCAACGACATGACATGGTCAATGCGCAACGCGCCACAGTTTTGCATATTGGCGCGCAGCAGATCGATAAAGGGCTCATAGGCCCGGGCGACAATAATATGCGGGTCCATTGGCGGCAGCCCCCAGTTCTGACCGAGCGGGCCGAGGATATCCGGCGGCGCGCCGACAGATGCTTTCAGGCAGTACAGCTCCCGGTCGCACCAGGTTTCCGCGCCGCCTTCCGCTACGCCAACCGCCAGATCGCGGTACAGACCAATCGGTAGTTTAAAACTCTGGCAGGTATCCCAGCAGGCGGCGAATTGGCGCCAGGCCAGCCACTGAAGCCAGAGGTAAAACTCCACCTCTTCGCGGTGCGCTTCACAGAATTGTTTGACAGCGGGAGACTCTACCGACTGGTAAGCCTCCGGCCAGGCT [...]
+NODE 1333 234 15070 15070 0 0
+TTTGTTGTAACGATTAGCTGACGGGTTTATTTCCAGTTGGGTGATAAGACTATAAAAACCTGCGAGGAGGCTCAAAATGAAGAAATCAGATGGTGAAATTCACGAAAAGACAGCATCCTGGGGCATTTTGCAGTCAGAATGGCTAAAAAAATGTGGACGGCTATTATTGCTGTTACTTTACCGCTTCGTTATCGGATGGGCTTTTTTTCAGTTACTCGCCATGATTGTGGCAGG
+GCGGTAAAGTAACAGCAATAATAGCCGTCCACATTTTTTTAGCCATTCTGACTGCAAAATGCCCCAGGATGCTGTCTTTTCGTGAATTTCACCATCTGATTTCTTCATTTTGAGCCTCCTCGCAGGTTTTTATAGTCTTATCACCCAACTGGAAATAAACCCGTCAGCTAATCGTTACAACAAATATAATTAAGACAAAAACTAAAGAGTAAGGTATTTATATCATAAGTGCTA
+NODE 1334 2016 114999 114176 0 0
+TGAAAGAGGAGACCGTACAGCTACGGCAGAAGGTGGCGCAGGCGCCTGAAAAAATGCGTCAGGCGACGGCTGCGTTGAATGCGCTGAGCGACGTCGATAATGATGATGAAATGCGAAAAACGCTGAGTGCGCTTTCGCTACGTCAGCTTGAGCTGCGCGTGGCGCAGGTACTGGATGATTTGCAAAATTCGCAAAACGATCTTGCCGCTTATAACAGCCAGCTTGTTTCGCTACAGACCCAGCCTGAGCGCGTGCAAAACGCCATGTATACCGCCTCACAGCAAATACAGCAAATCCGTAACCGTCTGGACGGCAATAACGTCGGCGAAGCCGCGCTTCGCCCCAGCCAACAGGTGTTATTACAGGCACAACAGGCGCTGCTTAATGCGCAGATCGACCAGCAACGTAAGAGTCTTGAAGGGAATACCGTTTTGCAGGACACCCTGCAAAAACAGCGGGATTACGTGACGGCCAACAGTAATCGCCTTGAAC [...]
+TAAAGCAGGTTCCAGATAATGACCAGATAGACGGTTTCAATCCAGCGCCCCGCCAGGCGCAGGGTGGTATAGAAATAGCCGGTCGCCGTTAATACCATTAACGCCACCGGAATAATGGAAAGAATCGTCACGGTCACCAGTCGAATGCCGTGAGATTCTTTATCGCGCCAGCTTTCCCGGCACAGTGGCCACACCAGCAATGTTATGACCAGCAGATTGAGGAAAATAACCGCCTGCCCCAGCACGTCATCCATCAGATTCAGCGGCGACAACTCCGCCACCACAGACCAAAAGTGCAGCGGCAGCAATGCGAGGCTAATGCGTACAATCTGGCGACGCCAGTGGCTGGTCAACTGCGCCGGCATACCAAAATGGCGTATCGCCACGCCCTCTTTTTCCAGCACCTTCCAGCACAGCCCAAAGACCAGCCAGAACATCGCGAGCTTTTTACTAAAGGCCCAGAGCAGATCGCTGATATTTAGCTGCATGGTC [...]
+NODE 1335 462 21616 21272 0 0
+CTTTTCGGCATTGTTCCATAGGGTTTCCCGAGGATGAAATGGCGATCGATAATGATTCGGCGTCGGATCGTTTATGCTGGATTATCCTGGCGTATGCGGGAAAGGGATGAAAGATTGTTAGGTGATAACAAATATCAGAACGCTATATAACGAGATGAGCGGTGAGTGAGGGGAATGGGGCAGCACAGCCGTGCCGCCCGCTAATAAACTTAATGCGCTTACTTCAGTTCCAGTTCATTCATTGCCGCAATGCTGAACCCGCCGTCAACATGAACGACTTCGCCAGAAATGCCTGCCGAGAGATCGGAGCACAGAAACGCCGCTGAGTTACCCACATCTTCAATAGTCACGGTGCGACGAATTGGCGTAACGGCCTCACAATGCGCCAGCATTTTACGGAAGTCTTTAATACCGGACGCCGCCAGCGTGCGGATTGGACCCGCAGAGATGGCGTTGACGCGA
+GTATTAAAGACTTCCGTAAAATGCTGGCGCATTGTGAGGCCGTTACGCCAATTCGTCGCACCGTGACTATTGAAGATGTGGGTAACTCAGCGGCGTTTCTGTGCTCCGATCTCTCGGCAGGCATTTCTGGCGAAGTCGTTCATGTTGACGGCGGGTTCAGCATTGCGGCAATGAATGAACTGGAACTGAAGTAAGCGCATTAAGTTTATTAGCGGGCGGCACGGCTGTGCTGCCCCATTCCCCTCACTCACCGCTCATCTCGTTATATAGCGTTCTGATATTTGTTATCACCTAACAATCTTTCATCCCTTTCCCGCATACGCCAGGATAATCCAGCATAAACGATCCGACGCCGAATCATTATCGATCGCCATTTCATCCTCGGGAAACCCTATGGAACAATGCCGAAAAGCGGGTAAAAGCCACTGGTATCATGAAACACAATCCACTATGTCGTCACAA
+NODE 1336 51 2411 2411 0 0
+ACCCCTTCCGGTCCCATAGCGTTTGCCATATAACGCACGTTGGCTTCCAGA
+TTCGCGTCAACGCCATCTCTGCGGGTCCAATCCGCACGCTGGCGGCGTCCG
+NODE 1337 2012 99362 98240 0 0
+AAGTCGGCGATCGGTTTAGGTCTGCTGTTATCGGAAGGTATCGGCGACACGCTGCGCGTATCGTTGGCGGCCGACCCGGTGGAAGAGATCAAAGTCGGTTTCGATATCCTCAAGTCGCTGCGCATTCGCGCGCGCGGCATCAATTTCATCGCCTGCCCGACCTGTTCTCGCCAGGAGTTCGATGTTATCGGCACGGTGAACGCGCTGGAGCAGCGTCTGGAAGATATCATCACCCCGATGGACGTCTCGATCATCGGTTGCGTGGTGAACGGGCCGGGCGAAGCGCTGGTATCAACGCTGGGCGTGACGGGCGGCAATAAGAAAAGCGGCCTGTATGAAGACGGCGTGCGTAAGGACAGACTCGATAACGACGATATGATCGCGCAGCTTGAATCCCGTATTCGCGCGAAAGCAAGTCAACTTGATGAAGCGCGTCGGATTGACGTGCTGCAGGTTGAAAAATAAGAACGTGATGGGAAGCGGCGCGCTTCC [...]
+AACCCCTAAAATCACTCCGACAGCCAGCGCTTTGCCGTTTTCGGCAAAGAAGCGTTTAATCGCATCCACCTGGTCGTGTTCGTTCTCGTAAATTTCCACGCTGTCCTTCTCCTTAGCCCAATAAAGTGCGCAAATGCGCGGCGACGCTGTCCTGCGCCACTGCCGTTTGCTCACCGGAGCGCAAATCCTTCACTACAACAGTCCCATCGGCGACTTCAGATTCGCCAAGAACCAGTGCAATACGGGCGCCCCACTTATCGGCGCGGGCAAACTGTTTCTTAAAGTTGCCGCCGCCGTGGTTTGTCATTAGCTTCACGCCTGGCATTTCATCGCGCAGCCGCTCCGCCAGCGTCATTGCCGCAGACTGCGTTTGTGCGCCGGCAGCTACCAGGTATATATCGACAACAGGAGAGGCAATAAATTCCGGATTAACTGCCTGAACTAACAAAACAAGTCGTTCCAGGCCCATCGCAAAGCCCACTGCCGGGGTAG [...]
+NODE 1338 1809 117314 116143 0 0
+GATGGTGATATCGACCAAAGATAACGAAACGCGAATTCAACCCAATACGAAATGTCCTGAGAAAAGCTAACTATCAGGAGATTTTATGAAGAAAGTTATTTTAGCCACTGTTTTATTCACCCTAAGCGGCTCGGTTTTATCTTCTTCTTTGCAGGATCAGCTTGCGGCGGTAGCCCAGGCTGAACAGCAAGGAAAAAATGAAGAAAACAGACAACGTGATGCTCTGCAAGCCAAACGAGATCAAGAGGCTCAACAGGAAAGACAAAGGCAAGCCAATGCGGCCGCGGTTGCTAAGCAGCGAGCAAAAGCGGCAGAAGCTGAACGGAAAGCACGGCAAGCAAAATTGGCAGCGGAAGCCGCGCAAGATAAAGCGCGCGATCAAAGCTACGAAGATGAGCTTCGTCGTTTAGAAATTCAGAAACAAAAACTGGCGCTGGCCAGGGAAGAGGCCCGGGTAAAAAGAGAAAATGAATTCATCGATCAAGAGCTGAA [...]
+TGCACAGCTTCTGGTGGCAAAGCACTGCATCGACACAATAGTGGGTTTCACTGGCAGCACACAATCAAATCTGACAGTCGGCTTCGAGCGAGGTGCGGACATTGGTAGCCTCAACAACATGACTAGCATTGAGGTGTATTAATCAACGGGAAGCAGGTCAGTTTATTCCGCCAGCCCGACTTTTACGAAAGGGCTACCATGACTGCGCGATTTTTTGATTAGCTTGCCTACGTATAATTCTCTGATTTCTGGTGATGCGATTCGTCCAACAAATTCTGAACGGTTGGTTTCGGGGGGGATGACCAATTCCCGGGTAAAGTATTGCTGAGAGCCTGCCTTCAACCAGCACTGTATCTCGTAAACTTCCATCACCAAACCGCCGTAGGTGGCGTATGCAAATTGTAGGTTTTCATCTTTTGGTACTTTTGCCCAGACGCCACGCGTAGCTTCATATAATGCAAGTGCACTCATGCCAGACTTGTAGGTGCTGTT [...]
+NODE 1339 112 38782 37601 0 0
+CGTTTACGGCGTGGACTACCAGGGTATCTAATCCTGTTTGCTCCCCACGCTTTCGCACCTGAGCGTCAGTCTTTGTCCAGGGGGCCGCCTTCGCCACCGGTATTCCTCCAGA
+TCAGGTGCGAAAGCGTGGGGAGCAAACAGGATTAGATACCCTGGTAGTCCACGCCGTAAACGATGTCTACTTGGAGGTTGTGCCCTTGAGGCGTGGCTTCCGGAGCTAACGC
+NODE 1340 12304 820026 816812 0 0
+TCCCCGTTTTTATCGTGGAAGACAGATATGTTTCGAAAAATAAAAATTCGCAAAATGACGCTCAACCGGGCGCTGGACAAATACCTGAAGACAGTATCCATCCACAAAAAAGGTCATCTGCAGGAGTTTTATCGCGTCAATGTGATTAAACGTCACCCTATGGCCGAGCGCTATATGGATGAAATCACCACCGTTGATATCGCCACTTACCGGGATCAGCGTTTGGCTCAAATTAACCCACGAACAGGGCGTCAAATCACCGGAAATACTGTCCGCCTTGAACTGGCGCTCTTGTCGTCATTATTCAATATCGCTCGCATTGAATGGGGGACCTGCCGTATGAATCCCGTCGAACTGGTTCGGAAACCCAGAATAACCAGCGGCCGCGATCGCCGACTCACTTCCGCCGAAGAACGCAGGCTTTCCCGCCATTTCAGGGATAAAAATCCGCAGCTCTGCGTCATCTTCCATCTGGCCCTGGAAACCGCAATG [...]
+GTGCACAGAGGTATGGGTGAGTAAAATCATTAACGATGAAAATAGAAAGGTTCAGTGGAATGATGCTATTAATGGGCTTCCTGTGATAAGTGATAATATGATTTGATGTGTAATCATGCTTCACCAGCATAAGGCAAGAAGATTATTAATATATACTGGATGTAGTTCGCATCAGAGCGTTTCTGGTTTAAGTGAATAACTATTTTATCTTCAACATTTGCTTGTGAGATAAGAGTTCTGTTGTTTAGAGGGACAGATGTATGGAAAAAGTATCAATAAGAAAAATCAACAGGACAGAGCATTTTCCTTCATTAAATCTTCCTTCTGATACATCCTGGGTTGTTTGGTGGTATGGTTTCTTAAAAAAGAATAAAAGACGAGGTGAACAACCTAAAGTAGCAATTACCTTTCGGGAAGTTCAGGCCGATGGAACTCTTTGTGATAGATATTATGAGCAAGAATGTCTGTTGACTGATTTGTCTTTTTTTAAAA [...]
+NODE 1341 44 2696 2625 0 0
+AACCTTCGTTCCTTCTTTGTAAGTCAAAGATACAGCTTCAACTA
+TCCACCCAGGTTGGAAAAACGTGCCAATTTACCACCGGTCTGGC
+NODE 1342 6546 340844 335699 0 0
+GGCCGTTAATTTCGTCACCCAGAAGCGTAAAGCGTCCATTTCCGGCGTTCAGCGTCAGTTCCGCATCGGCTATAACCGTGCGGCGCGTATTATCGAACAGATGGAAGCGCAGGGTATTGTCAGCGCTCAGGGGCATAACGGTAATCGTGAAGTGCTGGCTCCGCCGCCTTTTGAGTAAACCTGTAAGCCGGATGGCGCTGTGCAGGCTGCCATCCGGCAACAAAATTCAGTATTTTCTTCTTTCCTCATGCTGATTTTTGGCCTGGAATAGAAAGCAAAAGGAGCTCCTGGTCGGGAGTGTCGAAACCTGAGGAATAATGATGAAAAAAATGGCAATCGCCTGTGCATTACTTTCAAGCGTTGTAGCCAGCAGCGTATGGGCTGACGCCGCCAGCTCTCTGAAAAGCCGTCTGGATAAAGTGAGCAGCTTTCATGCCACCTTTACTCAAAAAGTCACCGATGGCAGCGGTGCCGCGGTGCAGGAGGGACAGG [...]
+GAGGTTCGTATGTGACGGGTTCCCCTTCGCCAGCGGAGAAGGACGTTGGGTCGTCAGTACGTTAATACATCCGCCCTGATCCACGCGTTTTGCATCCGGGTCATACCATGCGCCTTCTCCCAGGGCGACCACGCCCGGCATCATGCGCGGCGTCACTTTAGCCTCGATGTGTACTTCGCCGCGATCGTTGAAGATGCGGACTTTATCGCCATTGTTGATACCGCGTTTCTGCGCATCCATTGGGTTAATCCACATTTCCTGGCGACAGGCGGCTTTCAGTACGTCTACGTTGCCATAAGTGGAATGCACACGCGCTTTATAGTGGAAACCCGTCAACTGCAGCGGGAATTTATCCGTTAGCGGATCGTTATAGTTTTCAAAACCTGGCGTGTAGATCGGTAATGGATCGATCACGTCGCCTTCCGGCAGCTCCCAGGTGGCGGCGATATCCGCCAACGCCTGTGAATAGATTTCAATCTTGCCCGATGGCGT [...]
+NODE 1343 4616 226729 225492 0 0
+GTATCGGCTTTCCGCCTGGCATCGCGACCGCTGGCGGTAAATAAACCTGAGATGCGTTTGTCAGTGGACGCTCAGTCCGGCAATACGCCGCGGCCCTTAGCCGCCGGGGATGATGCGAACTGGGAAACCTTCTGATCGACGTGCGCTGTGTGCTGTCGGTTATCGATTAATTTGCGAACCCGCCGATCCCTTTCGTCTGGTTCGCATAGATAAAAGCAAAAAATGTGTAATACGGGAAGCATGGCGCTGCCGCAGGGCGCGCCCGTTGTACTTTGAATGTGATTAAGAAGGCGCTATGACATCATCTCTGCCCTCCGGGCAAACGTCAGTATTGTTACAGATGACACAGCGCCTCGCGCTGTCCGACGCGCATTTTCGTCGGATATGTCAATTAATCTACCAGCGCGCAGGGATCGTGCTGGCCGACCATAAGCGGGATATGGTTTATAACCGCCTGGTCCGTCGGCTGCGTGCCCTGGGACTGGATGATTT [...]
+GGAAGGTTCTCAGGTTGTGGAGGACGTTGCCCGCCCGCAAGCCGCCAGCGTTTAAGCTGCCAGACCCAGGCCAACACTTCCGCAACGGCAGCATATAACTGCCCGGGAATTTGCTGACCAATTTCGGCGTGGCGATATAGTGCCCGCGCCAGCGGCGGCGCTTCTAAAGTGGGAACCCGATGTTCAGCGCCGATCTCGCGAATGCGCAGCGCTATTAATCCAGCCCCCTTCGCGACCACTTTCGGCGCGCTCATTTTGTTTTCGTCATACTGCAGCGCCACGGAATAGTGCGTCGGGTTAGTGACAATGACGTCCGCTTTCGGCACATCTTCCATCATGCGGCGCTGCGCGGCGGCGCGTTGCATCTGGCGAATTTTGCCCTTAACATGCGGATCGCCTTCGCTCTCTTTAAATTCGTCGCGAATGTCCTGCCGCGACATGCGTAATTTTTTCAGGTGGCTAAAGATCTGGAAAAACACGTCAAATCCCACC [...]
+NODE 1344 2398 121445 120435 0 0
+AGATTAAGCTTGCTGGACCGGAGGTCAATTTGCCATTCCGGCTGCTCCGCCAACGTTACCTGAACATGCCCGGTCAGCGAACTGTCATTCGCCGTTAAATTTAAGTGGTTAAATGAAAGACGTTTTTGCGCCTCCTGCCACTGCGCCTGTAATTGTCCCTGCCCCTCAATCCCCTGCGCCGGTAGATCCGCGCCCTGCAATTGCCAGCGCAGTTGCTCAATACCCGCGGTTAAATTATGCGGATAATCGGAAGCATCCACCGTTCCGCTGAATGATAAAGCAAGATCCCGCTGATCGCGGTTCACGCGTCCCGAAAAATCAAACGTGCCGCGATGCTCGGCATCTTGTTCCATATTCAGACGAATATCGCGCACCGTGACCTGATCATCATTTTCATGCTGGAAAACCAGCACGCTGTCGGCAACGCGCAGGCTACGAATATCAAACGACCAGCCGCGATCTTCCGCTACGTCCGGCAAGGTATTATCTTTC [...]
+AAATTCACCGTGGCATAGCGCCGGACTGGTATCGCGCTGCTGAAATCCCTATAATTGCCGCGTTTGGCGTTTCGGCGCCCCCCTTCCTTACATCCAGGTTAATCAGGTCGCTAAATTTATGACTGATCAGTCTCATCAGTGCGTCATTATCGGTATCGCTGGCGCATCGGCTTCCGGCAAGAGTCTTATTGCCAGTACCCTTTACCGCGAATTGCGTGAACAAGTGGGTGACGAACATATTGGCGTTATTCCCGAAGACAGTTATTACAAAGATCAAAGCCATCTGTCGATGGAAGAACGCGTAAAAACTAACTATGACCATCCGAATGCGATGGATCACAGCCTGCTATTTCAGCATCTTCAGGCGCTCAAGCGCGGTTCGGCGATTGAATTACCGGTATACAGTTATGTTGAGCATACCCGTATGCAGGAAACGGTTCGCGTAGAACCGAAGAAAGTGATTATTCTTGAAGGTATTCTGTTACTGACCGA [...]
+NODE 1345 51 2525 2407 0 0
+TGGTCCGCCAGGATAGGGGCCAGCGCTGATTGCAAATTATCCGCAAGCTGG
+ACCATTTTCCCGCCATGCTGACCGCAGAGCAGGTCTCGACGCTTAAAAATA
+NODE 1346 51 3247 848 0 0
+ACGCTTACCGGGCTAATCACGACTACAGGCCGGGCTAACGCGGAGTCGCCC
+TAGCGCTGCCGGGCGCTTTCAGTAAAGGAACCCACACTATGTATATCGGGA
+NODE 1347 1776 112586 111619 0 0
+GGTAGATAAGGTTATTTATCAAACAGATAACGGTTAACCAGATTTTCTAACAGCTCCTGATGACCGCTTTGATGTACTGGCGCCAGATTATGCTGCTCCGCATACTGCGCCAGTTCGCCTAAGGAGAGTTGTCCTTTCAGAATCTGCTGCCCCAGCTCGCCATTCCAGCCGGCATAGCGCTTCGCCACGCGTTTATCCAGCTCGCCGTCTTCAACCATACGCGCGGCGATTTTCAGCGACAACGCCATCGTATCCATCGCGCCGATATGACCGTAGAACAGATCGTATTTATCGGTGCTCTGGCGACGAACTTTGGCGTCGAAGTTGAGACCGCCCGTCGTGAATCCGCCCGCTTTCAGGATTTCGTACATCACCAGCGCGTTCTCTTCAACGCTAATCGGGAACTGATCGGTATCCCAGCCCAGTTGCGCATCGCCGCGGTTGGCGTCAACGGAGCCAAAAATACCCAGCGCGATAGCGGTCGCGATTTCA [...]
+CAGAGTGATGCGGTGACGTTTATCAAACATGAGGATATATCCTGCAAAAGTGAACCTGGACTCATGGATACTATCAAAACGGCTGACATAACGGTCTGGCGAATGATGACAAATTATTTTGCGCCTGAAACGTTATGCGAAATTCATCACAGCAAACGGCGGATGACAATTGTCATTTCTTATCTATATATTACGGTTTTTTGTTTATTTGCCAGGATTCGATCGCGATCGCTTTTTTCTTCTGTGGTTTTCAGCGTTTTTTTGAGAGCCAGAGCACATTTGGGGATTCTCTTAATAGCGGTGTGAAATAACGTAATTGAGCAATAAATCAGGAAATTCCAGTATGACGTTATGTCGTTTACTTGCCGTCTTATCTGATTATGGAGCTCACTATGCAGGCTTATTTTGACCAACTCGATCGTGTTCGCTATGAAGGCCCTCAATCGACTAACCCGCTGGCATTTCGTCATTACAATCCCGACGAGCTGGTTT [...]
+NODE 1348 3050 179510 177773 0 0
+GTCCGTATGTTTCGCGCCACTGCCTGATTGTCAGCAGTCGTCCTTTGGTAATAGTGATCATGCCGCGTTTCCTTCTTTCTTATTAACAATTACACCGTCATATATTTCATTAAGGTGCCCTCTCAACTCCATCCGCCTTAATGCAGATAACATGTAATCGCATTCAACCTGCTTATTCCCGGTAAATGGCTTATCGTCAGGATTACCCCAACAGCAATTACCCCTGGGCCATCCATGTACTTTCCGAACTCTTCCGTTAACAACGTGAAGTAATCCCCAGCCAGGAGGTAAATCCTCAACTGAAATAATTCCCGGCTCACTAATAAAGAATCGCCAGTCGCCCATGCCAAGAGAGGGATTTTTACGGAAACGCTTTTTTCTATCTGCCAACAAATCAGAACGAGAACACTTCACCTCTATCAGGCATGATGCTGAATTTCTGAATCCCATAGCATCTGGCTGTTCTCCAGTGCTGGTTACAGCTATAAAGCG [...]
+ATGGATCTCAAGAGTGGCTATCTGCGGCGATGTGAAGCACTGGGGCTTTCCCGGGAAGAAATGCAGATGCTGCAGGGGCTGAGCATTGAAGAAATTCACTATCTGTCAAATTCAGAAGTGTCGGTGCTGCGGCTGGATATTAACCACAACAATCTTGTGCGCATGTTGCAGCAGGCGCGGACTGAACAGAAACGTCTGCAGCGAATCGATCGCGCTCTGGCGCTGGGGGGCTCTATCGAACTCATGGCGTTTTATTTTGGTCTTTCCAGCGTGGATGTGGCTGCGCGGCGTCGTATCTCCGGTATTGATGTTCGTCCCGGAAGGGGGATCACCCTGAGTGACGATGAGAATTCTGAACTCTGGCGGTTGTGGCAGAAAGCCGGGATCAATGATGTGGAGAGTGTGGACGGGCTGGATGTCATGATGCTTTGTGCTGAACAGATGAACATTCCACTGACGGCCATCTGGCATGCCGTCAGAGGGTGGCATACA [...]
+NODE 1349 663 29844 29612 0 0
+CGCCTGGTCGCCGGGCGAGGAAATATTCGCGGCAGCGAAGGCCCAAGAAACGCGGTGGCCACCGGCCTGATTCTCTCCTGGCACAAGGAGTTTGCGCATGGACAGTAATCACAGCGCCCCGGCTATCGTCATTACCGTTATCAACGACTGCGCCAGCCTCTGGCACGAAGTGCTGCTGGGCATTGAAGAGGAAGGCATCCCTTTCCTGCTTCAGCATCACCCAGCTGGAGATGTCGTTGACAGCGCCTGGCAGGCGGCGCGCAGCTCGCCGCTGCTGGTTGGCATTGCCTGCGATCGACACTCGCTGGTCGTGCATTACAAGAATTTACCCGCATCGGCGCCGCTTTTTACGCTGATGCATCATCAGGACAGTCTGGCCCATCGCAATACCGGTAATAACGCGGCACGGCTGGTCAAAGGGATCCCTTTTCGGGATCTCCATGCTTAATCACAGGAGAACGGCAGTATGAATAACGCACTGGGGCTGGTTGA [...]
+GTCGCCGCGAACCATGACGGTAACCAGGCCAGAACCAATTTTTTCGTAGCCCACCAGCTGTACGTTGGCGGATTTAACCATTGCATCGGCGGCTTCAATGGCGCCGACCAGACCTTTTGTTTCAACCAGCCCCAGTGCGTTATTCATACTGCCGTTCTCCTGTGATTAAGCATGGAGATCCCGAAAAGGGATCCCTTTGACCAGCCGTGCCGCGTTATTACCGGTATTGCGATGGGCCAGACTGTCCTGATGATGCATCAGCGTAAAAAGCGGCGCCGATGCGGGTAAATTCTTGTAATGCACGACCAGCGAGTGTCGATCGCAGGCAATGCCAACCAGCAGCGGCGAGCTGCGCGCCGCCTGCCAGGCGCTGTCAACGACATCTCCAGCTGGGTGATGCTGAAGCAGGAAAGGGATGCCTTCCTCTTCAATGCCCAGCAGCACTTCGTGCCAGAGGCTGGCGCAGTCGTTGATAACGGTAATGACGATAGC [...]
+NODE 1350 47 2466 2454 0 0
+CTAGTTTGCCCGGTAGCCTTTGCTACCGGACGATAAGCGTTATCAAA
+TGCGTCACGCCTTCATAGAGAAGTCTGAGCGCAAACATCCCGATAAT
+NODE 1351 201 9683 9613 0 0
+ATAGTAGGCAAAGACGTTCTGGTGCCAGACGCCGTTATCTTCCTGCCAGTCGCCGCCTGCGTATTCATATATCCGCCGGAAACTGACGTCGGGAGTGAGATCTTTGTAGTCCTTGCAGGCCAGTTCGCAGGTTTTGCAACCGGTGCAACAACTGGAATCAATAAAAAATCCATACTGGGTTGTCATCGGTTACTCCTTACG
+TTGTTGCACCGGTTGCAAAACCTGCGAACTGGCCTGCAAGGACTACAAAGATCTCACTCCCGACGTCAGTTTCCGGCGGATATATGAATACGCAGGCGGCGACTGGCAGGAAGATAACGGCGTCTGGCACCAGAACGTCTTTGCCTACTATCTCTCCATTTCGTGCAACCACTGCGAAGACCCGGCCTGTACCAAAGTCTG
+NODE 1352 976 48502 48492 0 0
+TTAAGGAAGCAAAAGTGAATAAGACCATTAATCTGCTAAAATTACTGCCCGTAGTATTATTAAGCGCATGTACTACATCGTATCCTCCCCAGGATACAACATCGGCACCCGAGTTACCCCATCGTAACGTACTCGTTCAGCAACCTGATAACTGTAGCGTTGGCTGTCCTCAAGGAGGAAGTCAACAAACAATCTATCGCCATGTCTATACGCTCAATAATAATAGCGCCACGAAATTTGCCAACTGGGTTGCCTATAGCGTGACAAAGACCAGCCAGACAAGCGGTCGCCCGCGGAACTGGGCGCAGGACCCCGATTTACCGCCCTCGGATACGTTGGCCCCTTCGGCCTATAAAAATGCCCATACGCTATTAAAAGTCGACAGGGGACACCAGGCGCCGTTGGCAGGATTGGGCGGCGTTTCGGACTGGCCGTCGTTAAATTATTTATCGAATATTACGCCGCAGAAATCCGCCCTGAACCAGGGAGCAT [...]
+AATCAAGGCCCTTGACAGAGTTTCTCCGTTATCTTTCCACGCGCTGTATAGCGCTTCTCATCGACAACCTAACCTCTGCGCCAGACTCCCCTTTGTTGTTTTCACCTCGCTGGCTACCGCTTCAGGCAAGGCAGACCACAGCGTCAGCACTGGCTTCGTTTTATGTTCGATAGCCTCCACGGTAACCTGATAGTCGCAAAAATTCGCCGAACGGGGCGTATTCTGATCCATAATAAACGCAGCGTAATTTCCTTCACTTTTTGACGGCGCCGTTCCGGTGAATAAAACCTTCCAGTACCCGCTGGGAATTTCTACCGTCGCATCTTCTGGCAATGTGGCGATATGCCGCTCAAAAAGGGGGCCGGTCACTACGTGCACTACAGATACATCAGCCTGTTTGGCAAGTTCGCGCACCCGGTTTTCCAGTGCAGCCCATGCTCCCTGGTTCAGGGCGGATTTCTGCGGCGTAATATTCGATAAATAATTTAACGA [...]
+NODE 1353 3 174 174 0 0
+ACC
+GAG
+NODE 1354 48 2517 2495 0 0
+CTAACGCGATGGCAGGATCGTAAGGTAGTAGGCCGTTGTTCTCTTTAT
+TATTTTCAGCGCGCGGCGGAGATTTTGCACCGGCAGTTAGCGCTGCGC
+NODE 1355 2290 102477 98281 0 0
+CACGCGCTATCTTTCTGCAACCAGGGAGGAGCGCTAATGTTCTGGATTGTTCTTATTATTGCCGCCCTATTTTTTAGCTGGCGCAACTACAAAAAAAACAAACCGCTGATTGCGGCCCGTATCGCCGAGGAGAAAGAAAAAGATCGTCTGAAGGATCTGCGTCGCGATACCCGACGGCGGCAATGGGCGCTGGCGCTAGCCGATATCCTCGCCCGGCGCAACGGGCTACCGATCAAAGGCGTTGAGCTGGTCTTCAAACTTGACGATGACAAACACCGCTATCTGGCACAGCAGGTAAAAAAAGAGCTGGGCTTGAGCGAAAACCTCGACGGCGCGGCGTTACGCCACAAGGTCGAGGATATCTTACGCCGCTGGCCTGCGGGCATCGGCAGCTCGCCGCGCACGTTTTATCATCATCTGGCGGCCCAGGGCCAGGTCCGCGACGCGCTGGCTTTCGACTGCATGCGCACCGCCTTTCTGACCCGCTGTATC [...]
+TATTGTGTTCAAGGCCCAGCAGGTTTAGCGCGGCGGGTATATTTCTTTGCGCGCCCAGCTCTGCCAGCGGCACGAAATGTTCCGGGAGCCCGAACCAGTTGAAATTTTTAATGGCCGCCCGCCAGTTATGGTTATATTGAATGTCGGCGACGCTATCGAGCCAGGCGAGACCTTGCGCCTCATCCTTTTCGAAACCCAATAACCCGGCGTACTGAAAGTAGCCACGACGGATTTTCGGCACTGCGAATTCCGTTTGCTGCGCATTCTGACAGAGAAAATTATACATCCACCAGGTGTCAGGAAAATCGCGCAGGGCGAACTTTATCGTGTCATCAGAGAAATAATTGTTGAGCTTAACTTTTTCCATGATCGAACGCTGAAGGGTTCGCCAGAGCGCGTCATTATCGTCCAGATCGCTATAGCAGACCCGCAGCCACTCCAGCGCGTTGTGGCGAGATTCCTGAATATGCGCTCGCAGGCTAATCTCTTCGG [...]
+NODE 1356 968 64632 64100 0 0
+TGATGGCGGCCTGGCTTGCAGAGCAGCGTCGACACAGCGAATGTGAACAGTTACTGGCATGGCATCTGTTCCCATGGTCATCCCGTTTCCTCGGGGTGTTCATTGAGAATGCCGGACATCCTTTTTATCTGGCTTTGGGAAAACTGGCGAGTTTAACACTGGCAAAGTGGCAAACCATGTTATCAATCAATACTAAAAACCTACCTCTCCACCGCTAATATTGCCTATACAGAGGGCTTTATTCAAAACAAATATTCTAATGAGGCCTCCATATTCCAGACTCACCCAGATGAATTAAGTCCTCGTCAGGACAATACGCAACATAGAAAATCTTCTCCGCCACACAAGAATATGTGATTTGTTAGATCAGACGGTCATGTTGATAATTCCCCTACTGTCATTCGTCAATGACTGTGAATACTTTGCTTATCTCGGTCTCTTTTGAAGGAGAATACTATGGCTTACTTACAAATCACCCTGAATATCAGCAAC [...]
+TCCTGTGTTTTGGGATCCAGATGCCCATTTTCTAAAGTCCCCTTGTCCATTTGCTGAAAGCCTTTCATGAACTCCGGCTGCAATGTGGCAAATTTACCAATGGCAGCCAGCAGGCCACTACGATACTCATTCCAGTTTGAAAGCATATCTGTTCCTGTTTTATATTAGAGGATTGTGTATTCAGATCACATAATAAATGCGAATATCTGGTGCCTGGTTCAGAAAAGGCTTCAATTCTTCCACAACGTCTTTTGTAAATAATTCACTGGTAAGATACGCCTGCGCTTGAGCAGTAGTTTCAAAGCCATGTAAAACTTGCACGTCTTCATCCCGAATAAGCAATTCTTTTGAGGTCGCTCCGGCAATGGTATTTAAAAATGGCGCTTTATATTTTTGATAAACATTTGCTGCGGCAGGGCGGTTATGGTTGCTGATATTCAGGGTGATTTGTAAGTAAGCCATAGTATTCTCCTTCAAAAGAGACCGAGATAA [...]
+NODE 1357 1087 63591 63422 0 0
+ACGCACTTTTGCATTCGATGAAAAAACTCCGTTTCTGTTTTACACAGCGGCAGTCCCAGTTGAGTATGAAGTTTGACCAGCCAGGGCTGGGTTAGCCCCGCTTGTTCCATCGCTTCCGTACACGCGAAAACCTCGCCAGGCGCGCCATGCGTCAGGATCTGGCCCTGGCGTAATACGTATACGGCATCGCTAATTTCATAAATAAGATCGATATCATGGCTGGAGATAATGACATGATTTCCCTGCGCCACAATCCGCCTGATGATAGCAATCATCTGAGTGCGCCCTGCGGGATCGAGACCAGCAGTGGGTTCATCCAGCAATAGATAGCGCGCCTGTAGCACCAGCGCTCCGGCGATAGCCACACGTTTTTTTTGCCCATGACTCAAACACTGAATGGGCTGATGGCGAAAATGTTGGGCGTCAACCAGCGTTAGCGCCTCGTCGACGCGGCGCGTGATTTCCGCCTCCGGCACCCCCAAATTACGTAAA [...]
+CCTGCTTACCGAGCAAATCCTGTTAACGTGGCGCTTTCTCTTTATTCTTCTGGATGAGGCGGTGGCAATTCGTCGCGCGCAAACGCTGCGTTTTGGTTATTGCAGCCTGCCGAACGGCTATCGATCTCTGGCAATGCTGGCTGGACTCCTGTTTACGCGGGTGTTAATGCGTTATCAGCAAATGACTACCACGCTGGATATCAAACTGTATCAGGGTGATTTTCACCTGTAAGGACTATTATGCTTGCCACTTCAGACCTGTGGTTTCGTTATCAGGATGAGCCGGTACTTAAAGGGTTAAATCTGGATTTTTCGCTCTCGCCTGTTACCGGTTTGGTGGGTGCCAACGGCTGTGGGAAGTCTACGCTTTTTATGAACCTGAGCGGCCTGTTGCGTCCGCAAAAAGGGGCCGTGTTGTGGCAGGGAAAACCGCTGGATTACAGCAAGCGCGGACTACTGGCGCTGCGCCAGCAAGTTGCGACGGTTTTTCAG [...]
+NODE 1358 911 63436 63436 0 0
+GGGAAATGTTATACCGCCGGATAGCGAGAGTAGTAACCGCTCAGGGAACAAGCAACATAGCTCTTCACAAACATAAGTGCTAGCTTTTATATTAATATCAGAATATCTTTTCAGGTGGGCAGACTGAGTATCAACACAGAGTACTGTTCTATTCATTATCTCATAATAGTAGTGATCCTGGCGTATCACAATGCATAACGGAATATCTTCGCCATCTTTAATGCAGAGATTTGTATATTGATACTCAGCATCTTTATAGTGCTGAAAATGGAAATTTCCTCTGCATGACGGTGATGATAATTCATATAACTTGCAAAATAAATCAAATAAACGTTGCGCGTCAGGCGGAGAGGCAACATCACATAATTCCTTTATATATTGATCGGCAGCAGATCTTCGCGTGCTACAGAAAAAATCTTTAATCTTTTCCCATAGTAACGTAAAGAAGGAGCGTTGAGAGATGGCACTTTGAGAAAACATCTCACTTTTTAA [...]
+TTAGTTTAACTTCTTATAAGACAATTTCTACACGGTTGAGCAACTATTTACTTTCTCTAAAAATAATATAGCGCGTAATTAATCATTACTCATGGTACATGATGATGTGAGAATTAAGAAAACCATTTTACTTTCATTCGTTTTACCTGACATACTTCATGGCCAGGAGACGTGGGCATGACTAAAGCTACGGGTCGATATTAACAATAATTTTGACGGTTCAGGACAAAGCAAAAATCAGGTATTTCACTGATAAGCAAATCGATGGGCAACATGGTATAATATTTCGAATACCACCTATTCCAGTAATGAAGTCTCATATAATCACTTGTGGTCTACATTATGCCAATTACTATCGGGAGAGGATTTTTAAAAAGTGAGATGTTTTCTCAAAGTGCCATCTCTCAACGCTCCTTCTTTACGTTACTATGGGAAAAGATTAAAGATTTTTTCTGTAGCACGCGAAGATCTGCTGCCGATCAATATATAAAG [...]
+NODE 1359 51 3312 3312 0 0
+GGTCTCGTCGTACGTGTTAGTCAGATGATAGTAGATGGTAAAAGTTATCCT
+CACCGTTATTTCCAAAATAAAATCGTCCCTTTTCCCCCGCAGAGGCTTGCA
+NODE 1360 449 19484 19484 0 0
+GCTGGTTGCCGTCGGCACCGCAGTTAGGCACTAACCCGCTGTATATTGCGCGTGAAGCGGAAAAAGCCGGTATGACGCCGGTAGACTATACCGTCAAATCCCTGAAAGAGGGTTCGATTCGCTTTGCCGCCGAGCAGCCGGAAAACGGTAAAAACCACCCGCGTAACCTGTTCATCTGGCGTTCAAACCTGCTTGGCTCTTCCGGTAAGGGCCATGAGTACATGCTGAAATATCTGCTGGGTACTGAGCATGGTATTCAGGGGCTGGATCTGGGTAAACAGGGCGGTGTGAAGCCGGAAGATGTGGAGTGGCGTGACAATGGCCTGGACGGCAAACTGGATCTGGTGGTGACGCTGGACTTCCGCCTGTCGAGCACCTGCCTGTACTCCGATATCGTACTGCCGACCGCCACCTGGTATGAAAAAGACGATATGAATACCTCGGATATG
+GTACGATATCGGAGTACAGGCAGGTGCTCGACAGGCGGAAGTCCAGCGTCACCACCAGATCCAGTTTGCCGTCCAGGCCATTGTCACGCCACTCCACATCTTCCGGCTTCACACCGCCCTGTTTACCCAGATCCAGCCCCTGAATACCATGCTCAGTACCCAGCAGATATTTCAGCATGTACTCATGGCCCTTACCGGAAGAGCCAAGCAGGTTTGAACGCCAGATGAACAGGTTACGCGGGTGGTTTTTACCGTTTTCCGGCTGCTCGGCGGCAAAGCGAATCGAACCCTCTTTCAGGGATTTGACGGTATAGTCTACCGGCGTCATACCGGCTTTTTCCGCTTCACGCGCAATATACAGCGGGTTAGTGCCTAACTGCGGTGCCGACGGCAACCAGCCCATACGCTCGGCGCGCACATTGAAGTCAATCAGATGACCGCTATAGCGG
+NODE 1361 1261 64903 64390 0 0
+GCTACGGCGCAATCTTACAAACCGTCATATACAGCTTATCGCTATTGGCGGCGCTATTGGTACCGGTCTGTTTATGGGATCGGGTAAAACGATCAGTCTCGCCGGACCGTCGATCATTTTTGTGTATATGATCATCGGTTTTATGCTTTTTTTCGTGATGCGCGCCATGGGGGAATTGCTGCTCTCGAATCTGGAATATAAATCGTTTAGCGATTTTGCTTCCGACCTGCTTGGCCCCTGGGCGGGATATTTCACCGGCTGGACGTACTGGTTTTGCTGGGTAGTGACCGGTATGGCTGACGTGGTGGCGATTACCGCCTACGCGCAGTTCTGGTTTCCCGGCCTTTCCGATTGGGTCGCCTCGCTGGCGGTAGTGATCCTGCTGCTAAGCCTCAACCTCGCCACCGTTAAAATGTTTGGTGAAATGGAATTTTGGTTTGCTATGGTCAAAATCGTCGCCATCGTGGCGTTGATTGTGGTCGGGCTGGTGAT [...]
+AGACCCAGCACATCAGCTTACCGAGCGGCATCTTATAGATGGATTTTTCATGCAGGTGGGGACGCTTTTTGCGGTACACCAGGTATGAACACAGAATGATGGTCCAGACAAACATAAACAGGATAGCCGAAACCGTAGTGATCATGGTGAATGCGCCAATCACGCTCGGGTTGACCATCAGCATAACCACGCCGCCCAGCAGGCAGATACAGGAGAAGGTCAGGCCTTTCGCCGGTACCGCGCGTTTTGATAGCTTAGCGAACGCTTTTGGCGCCACGCCTTCTTGCGCCAGGCCAAACAGCATACGGCTGGTCGAGAAGACGCCGCTGTTGGCGGAAGACGCCGCCGAGGTCAGCACGACAAAGTTGATCACGCTCGCGGCGGCAGGCAGACCCACCAGTACAAACAGCTCAACGAACGGGCTCTTATCCGGCACCACGGAACTCCACGGCGTCACCGACATAATGACAATCAGCGCAAAGACGTAGAACA [...]
+NODE 1362 63 4077 4077 0 0
+GTTTATCCAAAGTCGGGCGACGTTGCCGGTATTATTGACGACCGGCTTGATTATGGCGATAGG
+ACTTTGGATAAACGGTATTTTCTGCGTCCTTAGCATATGCACGACCAGTGTCTGCGAGAGCAG
+NODE 1363 276 19132 19049 0 0
+ACCTCGTTAGAAAACGATTTGCCAGAGGGCTAAACACAACACCAACAGGCTAATCAGTAAAAATATCAGCGCGATGATTTTATCGGGTGAGCGATTCATCTGGGCGATCCTCAAACATCATTAAAACCACTGGCCAAAGCGTTTGATATAAAAGCGCTTCATGCCTTGCGCCACCAGACAGTAGCTCAATAATGTCGCCACCAACCATGGGAAGTAGCTCAGTGGCAGCGGCTCCAGTCCAACCATCGCGCCCAGAGGTGAGAATGGAATATAAAT
+GCCACTGAGCTACTTCCCATGGTTGGTGGCGACATTATTGAGCTACTGTCTGGTGGCGCAAGGCATGAAGCGCTTTTATATCAAACGCTTTGGCCAGTGGTTTTAATGATGTTTGAGGATCGCCCAGATGAATCGCTCACCCGATAAAATCATCGCGCTGATATTTTTACTGATTAGCCTGTTGGTGTTGTGTTTAGCCCTCTGGCAAATCGTTTTCTAACGAGGTGACGCCATGCAAAAAAGAGGGTTGGACAAAATTTTTTATCAGGTTGTCCT
+NODE 1364 725 41955 41779 0 0
+GGCTCAGAGCTTTGGTTTTGTCGATACCAATGCTGAACAGGAACAGCAGGTTGTATGGACCGGTTTTTTCTACGATGATGCCGCGTTCATCGAGATATTTGGCGACCAGACTTGCCGGAATACCGAATTCATCCATCGTACCGTCTTTCTTCATCCCCGGCGTCAGGATAGTGACTTTGATCGGGTCGAGGTACATGTGTTCGTTATCGATATTTTTGAAGCCATGCCATGCGCTATCTGAACGCAGCGGCCAGCACTCAGCTCCATCGATATGTTCCGGCTGCCATACGTCAAAGAACCAGCCGTCAGATTCGCTTTTCAGGCGTTTAATTTCTTTACGGAATTTAATCGCACGTTCAATAGAGCCGTTAATCAGGCGTTTACCCGCATTACCTTTCATCATCGCCGCTGCGGTTTCAGTAGACGCTACGATACCGTAGTGCGGAGAAGTGGTGGTATGCATCATGTAGGCTTCGTTAAAGGTTTCTTCGT [...]
+TGAAGTCCATTCATTTTGACTCCGCCTGGGTGCCTTATACCAATTTCTCCCCTATTTATCAGGGTAAATGCGGTATGAGCGGCGACCGTGTAGAAGGCAAAATCATTTATGAAACCCAGTCCACGCATAAACTGCTGGCGGCGTTTTCACAGGCATCCATGATTCATGTTAAAGGCGACATTAACGAAGAAACCTTTAACGAAGCCTACATGATGCATACCACCACTTCTCCGCACTACGGTATCGTAGCGTCTACTGAAACCGCAGCGGCGATGATGAAAGGTAATGCGGGTAAACGCCTGATTAACGGCTCTATTGAACGTGCGATTAAATTCCGTAAAGAAATTAAACGCCTGAAAAGCGAATCTGACGGCTGGTTCTTTGACGTATGGCAGCCGGAACATATCGATGGAGCTGAGTGCTGGCCGCTGCGTTCAGATAGCGCATGGCATGGCTTCAAAAATATCGATAACGAACACATGTACCTCGACC [...]
+NODE 1365 51 2904 2904 0 0
+GTTGAGTTAGTAATAACAGCGTGGACCGGCCAGGTTGCGTTAGGCGTCTCT
+CCTATGACGGTCTGTTGTATAACACTGACTACATCAAGAAAACTCTGGATG
+NODE 1366 77 5121 5121 0 0
+CGTCTTAGAGACTATCCCACCAGGCATTATTGGCGCAGCCAGTTTGGACACGGACAGCGCACAAAAACCGGAGCGTA
+ATGCCTGGTGGGATAGTCTCTAAGACGATATATTCCCGCCTTGAGCCGTGTTAATTTGTTGCATACTTTTAAACGGA
+NODE 1367 3175 149235 145037 0 0
+GGGTAGTGACGATTCGTTGTGCGAAATTGCACGGTAATCAGGTGCGCCTGTTCGCTGGCGCCGGGATTGTCCCTGCCTCTTCGCCAGTCGGCGAGTGGCGGGAAACCGGCGTCAAGCTCTCTACGATGTTGAACGTTTTTGGACTGCATTAAGGAACGATGATGCGTATACCTTTCACCCGTTGGCCGGATGAATTTGCCCGCCGTTATCGTGAAAAAGGCTACTGGCAAGACGTGCCGTTGACCGATATTCTGACCCGCCACGCTGACAGCGACAAGACGGCGGTCATTGAAGGCGAGCGCGCATTCAGCTATCGCCAGCTCAACCAGGCCGCAGATAATCTGGCCTGCAGTTTACGCCGTCAGGGCATCAAACCTGGCGAAACCGCTCTGGTGCAACTGGGGAATGTACCGGAACTGTATATCACCTTTTTCGCCCTGTTGAAGCTTGGCGTAGCGCCCGTTCTGGCGCTGTTTAGCCATCAACGTACCG [...]
+TACGGTTAGCGCCAGGCTTTTCAGCGCCGCTTTAGAGGCGCCGTAGGCGCTCATACCGATACGCGGCGTATGCGCCGCATCTGAGGCTACGGTGACAATCGCCCCTCCCTGCTGACGGCGAAACTGCGCCATCGTCTGCGAAAACAGGTTAAATGCCCCGCCCACATTGACCGCAAATGTCTGCTGCCAGTCGTCGACGCTAAGCGCATCGGTCGCTCCCATACGCAAAATACCGGCGGCGTTGACCAGCACATCCAGCCGCGGCGTTTTTTGCAACACACGCTGGCACACCTGCGCAACCTGTGCGGCATCCGCCACATCCATGACTTCGGTAGCAAAGGGATAATTCTCTTGCGTAAATTCGCGATCGAAGCCGATCACCCGCGCCCCGGCGTCAACAAACGCCAGCGCCGTCGCGTAACCGATCCCTTTCCCCGCCCCGGTCACCCATACCGTTTTGTCTGAAAAATCAATACAGGGCATTACTCTACC [...]
+NODE 1368 8420 422874 418334 0 0
+AAGATGAAAATCGCGCTCCGGGCGTAAGCCCGCGTCGCTGAGCGCTTTATAGCCTAATAAATAGCCGCCAAACGCCTGAGCATCAATCGCGCCGACTGTCTTACCGATGAGATCATGCGCCGTGGTGATGCCGCTATCGCGCCGGGTCAAAATCACGCTGCCAATAACATTACTCACCGCTTTCCCATCGCGCGTGGAACGCAGGGAAGCTAACCAGCGGAGCGGTGCATGGCTGTTCAGTTGGACAAATTGCGCCGGGTTGGTTATCACAAACTGCACGGTTCCCTGGTTAACGGCCTCCTGCATTTGATGCAGATCCAGCGGCTGGATGTGAAAGGTTTCGCCTGGAAGCTGTTGGCTTAATGTCTTTGCCAACGGTTGCCAGTGGCTACGCGTAGACGCCTCGCCGCGCATGGCCAGAATACCGATATTCCACGTCCCTGCCCACGCGCCATGACAAAGTAGCCCTACTGCCGCCAACACCGCCAGGCG [...]
+AAATGACGGCGGGCATAATGACGTTTTTGATATCGTCATCGGACATTGGCGTCAGAGCGTTAAAGAGCCGTATGGCTTCCTGTTGCCACAAGGCGATACTGGCCGGCGAACTGGCCAGTATCGTCCCGCGAAGCCCGGCAGGCTGTAAGCAGGCGTGCTCTGCGGCAAGCATTCCGCCCCAGGAATGTCCCAGTATCGAATACCCGTGCCCAATACCCAGGTGATGAATTAATTGGGTTAATTGACGGAGATAACGCGCAATAGTCCAGAAAGACGCGTCGGCATGAGGAAAATGCGTTGAACGACCGCAGCCATATTGATCGTAAAATATTACCATGCGCCCGTCATCAGCCAGACGGCGATAATTTAATAAATAATCAAAGCCGCCAGAAGGGCCGCCATGAAGGATAATGAGCGGCGTGAGTAATGATTTTCTGTCTCCATAAATCCGATAGCTTGTCAATATGTTTTCAGAAAACATTTCGCCATAGA [...]
+NODE 1369 16237 918805 904974 0 0
+ACTCGGAGACCTTGCGAACCTGGCAGTCATGGCTTCCATGATTGTACTGGCATGTCGTGGCAATATTTTCCGGGCTGTGATAACCGCAATTCCTGTTATTGTCGCCGACTTGTGGATTGCGACCAAAATTGCGCCATTTATTACCGGTATGGCTAAAGATGTCAATTTCAAAATGGCTGAGGGGTCAAGTGGTCAGGTATCAAGCTTCCTTGATGGCGGTAACCCCTTCCGTTTCTGGCTGCTTGAAATATTCAACGGAAATATTATTGCTATCGGGCTGATTCCTGTGCTTGCGCTGATTATTTATGGTGTTTTTCGCCTGACAAAAGGAACGGTCTATGCCTGATTACCACGCAGCGCTTGTCATTGACATTGGCACAACTAACTGCAAAGTCAGCTGTTATTCCTGTCATGACGTGTCAGTTCTGGAAGTCCGCAAGTTTCCGACGCCAATAATATCGTCGGACAAAGGCGAGGTAGATTTCGATATCG [...]
+CGCTGACGTTCAGCCTGTATTTGAAAGGCGCGCAACTGATTGGTGGCCCCAAAGCCAGCATTTTAAGCTGCGCGGAACCGTTAAGCAGCGCCCTGCTGTCGCTACTGCTGTTGGGGATTAGTTTTACCTTGCCGGACTGGCTGGGCACGCTGCTCATTCTCTCGTCAGTGATTCTGATCTCCCTCGATTCCCGTCGACGCGCGCGGGCCGCTTAACGCCGTTGATAATCACGATGACCGGGCGGAAGAGGGAAAAGTTTAATGGCGCTTTGCCTTAATCTCTTCGTCAGAAAGCCCGGTAATCATCAGCACCATCTCTCGCTCGATCCCCTGTTCCAGCATCGTATGCGCAATACGCAAGGCTTCCTCCTGCTTACCTTGATGTATACCTTGTTGCACGCCTTCACGCTTACCTTTTCTGCGCCCCGATTCACGTATTCTGTCTACGATCGTCATTAATCTCTCCTTGTGTTGGGGAACACGACGCGCCACC [...]
+NODE 1370 50 2731 2731 0 0
+GATTATTGCCACGCTCAATAATTACCCCTACGTTCGCCGCGCGCGCGACG
+TGAAATAAAAATAAATAATTTTATATTTTTTAAACCAAACGGTTATATAT
+NODE 1371 24 1865 1865 0 0
+GCGCCAGGCTTGCTCAGTTTGATG
+TAATTATTGAGCGTGGCAATAATC
+NODE 1372 29 1358 1123 0 0
+ACCTGCCGCTGCTCGATCATTTCAGCGCG
+TTTCAGCAATGTGCGTCACCGATTCCGCC
+NODE 1373 51 2787 2656 0 0
+CAGCGATCTGACCTTCGCCATCGGTTTAATGAACTGCTTTAACCGTCTGGC
+GATTTCACGCGCGCTGAAATGATCGAGCAGCGGCAGGTAAACATTATCTTC
+NODE 1374 1553 84015 82553 0 0
+CTGGCGCAGCAAAAGCTCGCCCGAAGCTAACGAGTTACGCCTTATCCGGCCTGCATCGTCTACGCAGGCCCGGTAAGCGTCCGCGCCACCGGGCAAAGGCGTTACATCGCCGCGCGATAAATTTCCACAATCTCATCGTGAGTCGCCTGACTAAGGCGCAAAGAATATGGGCAAAACTATTCTGATAATAGGCTCACGCTGGCTATTTTAAGAAGCCAGAAAAATAAAAAGCAACGCAATAATTGTATTGCTTCATTTGTTATTTAATTTAACCATTTCATTCTTTTTGCGGAAATAATAACGCATCACGTAATAAATGATCATTCCCACGACGTCGTGTAAACCCAATCCGGTCAAAATATTCAAGGATCTGAATGGCCAGCTTCCGCCCTACATTCAGCCTGTCGCGAAAATCCGCCGCACAGGTTGATCCTCTCTCTTGATCCAGCTCGCGGATCATATTGGCGAAAGCGACAATCCGATCGTTACGAT [...]
+TGACCGGCGTTAATACGCCGATGCGCGTACGAAGTCTACACGCGCAAAATCAGCCCACCGACCATGCGTATGCCGGGCAACGTATTGCGCTCAATATTGCGGGCGATGCGGAGAAGGAGCAGCTTAACCGCGGCGACTGGCTGCTTTCCGATGCGCCGGTGGGGGAAGCTTTTTCCCGGGTGATCGTTTCTCTGGCGCTTCATGCGCCGCTTTCCCAATGGCAGCCGCTACATATTCACCATGCCGCCAGCCATGTGACCGGTCGCGTCTCTTTGCTGGAAGGCGGGCTGGCCGAGCTGATCTTTGATACGCCGTTGTGGCTGGCCGATAATGACAGACTGGTGCTGCGTGATATTTCCGCACGCGCCACCCTTGCCGGCGCACGCGTGGTGACGCTTAAGGCGCCGCGTCGCGGTAAACGTAAACCAGATTATTTGCACTGGCTTTCAACGCTTGCCGACGCGCAGGACGATAGCGCGGCGTTGGCCATTC [...]
+NODE 1375 2228 113067 111697 0 0
+GGGGTCTTAACGCGAGATCCATTTTTGCAGTGTTTTTCATTTTAGGGGTTTATTGATGAGCGATATGCACTCGCTGCTGATAGCGGCAATTTTGGGTGTGGTCGAAGGATTGACGGAGTTTTTGCCGGTATCCAGCACGGGCCATATGATTATTGTGGGTCATCTGCTGGGGTTTGAAGGCGATACGGCCAAGACATTCGAAGTGGTGATTCAACTTGGATCTATTCTGGCGGTCGTGGTGATGTTCTGGCGGCGGTTGTTTGGCCTCATCGGTATTCACTTTGGCCGCCCGCTACAGCGTGAAGGTGAAAGTAAAGGTCGATTAACGTTGATTCACATCCTGCTGGGCATGATTCCGGCGGTGGTGCTGGGGTTAGTCTTTCATGACACGATCAAGTCGCTATTTAACCCAATTAACGTGATGTACGCGCTGGTGGTAGGCGGTCTGTTGCTGATTGCCGCCGAGTGCCTGAAGCCGAAAGAACCGCGCGC [...]
+GGGCTACCGGTTAAAGATAAAGATTGGGTCGTTGTCGGCGCCACGCCGCAGGAGATGCTTGATGCGGGCTACCAGCAGGTAGGCCGTGATTTTCCTGTGTTTCTCCATCCGCAAACTCACGAAGAATACGCGCTGGCGCGTACCGAGCGTAAATCCGGTTCCGGCTACACGGGTTTCACCTGCTATGCCGCGCCGGACGTTACCCTGGAAGCCGACCTCCAGCGTCGCGATCTGACCATTAATGCTCTGGCGCGCGACGATGACGGCCAGATTATCGACCCTTACCACGGGCGCCGGGATCTGGAGGCGCGTCTACTGCGCCATGTCTCTCCCGCGTTTGGCGAAGATCCCTTGCGCGTATTGCGCGTGGCGCGTTTTGCCGCCCGTTACGCTCATCTGAGTTTCCGTATCGCCGATGAAACACTGGCGCTAATGCGCGAAATGACCGCGGCAGGCGAGCTGGAACATCTGACGCCGGAACGGGTATGGAAA [...]
+NODE 1376 6938 399341 394900 0 0
+GGAAGATCTGATGCTGGTTACGATCGGCAAAACGCATCACCTTGTCTTCGATCGAAGGACAGTAGCGTGGGCCGATCCCTTCGATCACGCCAGCATACATTGGGCTACGATCGAGGTTATTACGAATCACGTCATGGGTTTTCTCATTGGTATGCGTGATGTAACACGGCACCTGTTGCGGATGCTGAGAAGCATTCCCCATAAACGAGAAAACCGGCATCGGGTTATCGCCATGCTGTTGAGCCAACACGCTGAAATCGATAGTACGCGCATCAATACGCGGCGGTGTGCCGGTTTTCAGGCGGCTGACGCGTAGCGGAAGCTCACGCAGACGGCGAGACAGCGGGATGGATGGCGGATCGCCAGCACGACCGCCGCTGTAGTTATCCAGACCAATATGAATTTTGCCGTCCAGGAAGGTCCCGACGGTCAGTACCACCGCTTTCGCGCGGAATTTGAGCCCCATTTGGGTCACAGCGCCGACAACGCGAT [...]
+AACCACAAAGATGAGTAGCCAGAAGATCAGCGACAGAAAACCAAACACGGCATCTCGTTCAACGCCAAAACCAAACTGACCGGACAAACATTCACGAAGCGTATAAAGCGGGCTGGTACCAATATCACCGTAGACAACCCCAATAGCTGCGAGGGTAATCGCAGGCAACGATTGCTTATTATCAGTGCTCATAGACTCATCTTTCGTTTATACACGTCACCCTTCACGCTACCTCCTTGTCGGCTGCATTCGCTTACCCCAGTCACACGTTGAATGTTAGTGCCAGGGGATTCACTCCTTTGCCGCCTTGATGTAGTTTGAATGAATAAGTGTATAGATATGAAATGTGTGCTTAGTCCCTTGGCCCACAAAAAAGCGCACAGTATGCACGATTAATCATAAAATCGTACCCCTAAATGAAGCCAGATTAACCTGGCTCAAAGAAAAATAAACAGCGCATCAGACGATTACAGCCCCGGTGGTGAAACGTCT [...]
+NODE 1377 15 1973 1721 0 0
+CCCGCTGGTCACCCC
+CGCCAGCACCTGGTC
+NODE 1378 243 8508 8449 0 0
+CACCTCGCAGATTGTCGGCACTCAGGCGGTGCTCAACGTGCTGACGGGCGAACGCTACAAGACCATTGCCAAAGAAACGGCGGGCATTCTGAAGGGCGAATACGGCCACACGCCGGTACCGGTTAACGCGGCGTTACAGGCCCGCGTGCTGGACGGCGCGGAAGCCATCACCTGCCGCCCGGCGGACCTGCTGAAACCGGAACTGGCTGAACTGGAAGCGGACGTCAGGCGCCAGGCGCAGGA
+CAGCAGGTCCGCCGGGCGGCAGGTGATGGCTTCCGCGCCGTCCAGCACGCGGGCCTGTAACGCCGCGTTAACCGGTACCGGCGTGTGGCCGTATTCGCCCTTCAGAATGCCCGCCGTTTCTTTGGCAATGGTCTTGTAGCGTTCGCCCGTCAGCACGTTGAGCACCGCCTGAGTGCCGACAATCTGCGAGGTGGGGGTGACCAGCGGGATAAAGCCGAGGTCCTCGCGCACGCGGGGGATTTC
+NODE 1379 32 12200 6917 0 0
+TCTCACGACGTTCTAAACCCAGCTCGCGTACC
+CCGTGGGCGCTGGAGAACTGAGGGGGGCTGCT
+NODE 1380 39 4432 4432 0 0
+GATGGCCTGGCCTGCGCCAAGGTGCATCAGCCCCATGCC
+GAGCCTGCTGCTGCTGTGGCTGGCGATTGCGAAAAAGTT
+NODE 1381 964 59645 59376 0 0
+GAAAAACCTCAAACGTGATGACTCCGTAAGCCTGGGCCGTCGTCTGCTTAACCATGCTTTAGGCGGCAGTCGTAAGCTGGCGGAAATTCCGCAGGAAAATATTCAGCGCGAACTGGATCGAATGAAGCTGGCAACGCTTGACGATCTGCTGGCGGAGATCGGTCTCGGCAACGCGATGAGCGTAGTGGTCGCGAAAAATCTGCAGCAAGGCGAAGCCGTGGTGCCGACCGTTGCGCAATCGAATCACGGCCACCTGCCGATTAAAGGCGCGGATGGCGTGCTTATCACCTTTGCGAAGTGTTGTCGTCCGATCCCAGGCGACCCGATCATCGCTCACGTAAGCCCAGGTAAAGGACTGGTGATCCACCACGAATCCTGCCGTAATATCCGTGGATACCAGAAAGAGCCAGAGAAATTTATGGCGGTCGAATGGGACAAAGAGACGGAGCAGGAATTCATTACCGAAATCAAGGTGGAAATGTTTAACCATCA [...]
+CACCTGTACCCAACTGTTGCTGCCCGCCGCCGCGGAAGCCATGGTGCGCATCCGGCTACCAGGCCAGATGGCATGGACTTCATGGACGCCAACGGCATCTGCGGTACGAATGATTGCAGAAACGTTATGAGGTTTGTGGACTTGCTCCATGCAGACCGTGAGATCAGGCTGACGCCTGGCGAGCATTTCGCATATACGCGCATAACGTTTTGGATTCATAGCGCTAGTTTCGGTTACGGGTGACTTTAATAACGTCTGGCATCACGCGGATTTTGCGCATGATATTCGCCAGATGTACGCGATCGCGTGCGGTAAGGCGAATAAAGGTACTATAGACGCGACCATCTTTCTCTTCAGTATTCAGGCTTTGAATATTGGAGGTGGTGGTATTAATCGCCGCCGTCAGGTTAGCCAGCGCGCCCTGATGGTTAAACATTTCCACCTTGATTTCGGTAATGAATTCCTGCTCCGTCTCTTTGTCCCATTCGACCG [...]
+NODE 1382 21 2458 2458 0 0
+GCCAAAACGCGTTAGCGTTTT
+AAAATAGCCCTAATGGGATAG
+NODE 1383 779 41926 41542 0 0
+CGTTTACAGGTATTGCGCGACAGCAATGACGGCTTTGTGATTGCGCAAAAAGATTTAGAGATTCGCGGCCCGGGAGAATTACTGGGCACGCGCCAGACGGGTAACGCCGAATTTAAAGTAGCTGATTTGCTGCGCGATCAAGCCATGATCCCCGAAGTTCAGCGTATTGCCCGTCATATTCACGAACGTTATCCGCAGCAGGCACAAGCGCTGATTGAGCGCTGGATGCCGGAAACCGAACGTTATTCCAACGCCTAGTGAGCACGGCGGCTTTAATGCCGCCGTACAAACCCTTATTGCGCGAAAATCGGTAACATCAGGTACAGCTTGATCACCAACGCATTGACGATATCGATAAAGAACGCGCCGACCATCGGCACCACCAGGAACGCCATATGCGAGGGGCCAAAACGGTCGGTAATCGCCTGCATATTAGCAATGGCGGTCGGCGTTGCGCCCAAGCCAAAACCACAGTGACCCGCCGCCAGCACC [...]
+CCTCAGCAATGGCCTGGCGCTGGTGGGTTTTTATCGCGTATTTGAGCGTGCTGTTTCGGTGCTGGGGAACGTGAGTTTGTCACTGTTCCTGGCAATGGCGCTGATGAGCCTGAAGCTGTGGGAACTGGCGTCGCTGGCGCTGCCGATGCTGGCGATTCTGGTGGTACAGACCATCTTCATGGCGCTGTACGCGATCTTCGTCACCTGGCGCATGATGGGGAAAAACTACGATGCGGCGGTGCTGGCGGCGGGTCACTGTGGTTTTGGCTTGGGCGCAACGCCGACCGCCATTGCTAATATGCAGGCGATTACCGACCGTTTTGGCCCCTCGCATATGGCGTTCCTGGTGGTGCCGATGGTCGGCGCGTTCTTTATCGATATCGTCAATGCGTTGGTGATCAAGCTGTACCTGATGTTACCGATTTTCGCGCAATAAGGGTTTGTACGGCGGCATTAAAGCCGCCGTGCTCACTAGGCGTTGGAATAACGTTC [...]
+NODE 1384 4 146 142 0 0
+TCCC
+TGAT
+NODE 1385 2386 107593 106288 0 0
+CCAACCCGACGGAAACCATCATCAATAACAGCATCAGCATGTTGGCGGCGGGCAACAGTATCTACTTTAGCCCGCATCCGGGGGCGAAAAAGGTCTCTCTGAAGCTGATTAGCCTGATTGAAGAGATTGCCTTCCGCTGCTGCGGCATCCGCAATCTGGTGGTGACTGTAGCTGAACCCACCTTCGAAGCGACCCAGCAGATGATGGCCCACCCGCGAATCGCGGTACTGGCTATTACCGGCGGCCCCGGCATTGTGGCAATGGGCATGAAGAGCGGTAAGAAGGTGATTGGCGCTGGCGCTGGCAACCCGCCCTGCATCGTCGATGAAACAGCGGACCTGGTGAAAGCGGCAGAAGATATCATCAACGGCGCGTCATTCGATTATAACCTGCCCTGCATTGCCGAGAAGAGCCTGATCGTAGTGGAGAGCGTCGCCGAGCGTCTGGTGCAGCAAATGCAAACCTTCGGCGCGCTGTTGCTAAGCCCTGCCG [...]
+GCGTACTGCACGCCGCGAACAAGACGCGCGGCCTGCTGCCACATCAGTTGCTGGTCAACTTTGAGCATCGGTTCACACTCGGCGGCGTTCACCAGAAAAATCTCTACCTGCGCCTGTAGTTTGACGTGAGCGGGAAAACCTGCGCCGCCCGCACCCACAACGCCCGCTGCGCGAACGCGCTCGCGAATTTCATCGGCGCTATGGGACATTTCAACGACGTTGACGGCGGTACTCATAGCAGTTCCTCCAGCAGTTCCCGAATGGCTTCGGCATTGGCCGGGCGCGGGTTAGTGCGCAGCGTAACGTCAGCCAGCGCGGCCTGCACCATCGCCGGAATGCGTGCGGAAAAGTCGGATCTTCCTTCTTTAAGCGCAACGGCCAGTGAGGGAAGGGCGCAGTGTTGCTTAAGCAGTTCGATTTGCTGAATCAGCGCATTGATTGCCGCAACGTTATTGGCTTCTACCGGGCAAAAACCGCAAGCTTTGGCCATCC [...]
+NODE 1386 127 8875 8875 0 0
+AGCGTATATTACGCTTTCCTCTTTTTGAGTCAAGCCTTTATTTTCGCTTTCCTCACAGACTTCTTAACGAAGCCTTTCTGACCCGGCGGCCTGTATGCCGTTGTTCCGTGTCAGTGGTGGCGCATTA
+AAAGGCTTCGTTAAGAAGTCTGTGAGGAAAGCGAAAATAAAGGCTTGACTCAAAAAGAGGAAAGCGTAATATACGCTACCTCGCAACGGTGAGCGAAAGCCGCGTTGCACTGCTCTTTAACAATTTA
+NODE 1387 6 431 431 0 0
+AGAGCC
+TACAGG
+NODE 1388 1518 86580 86175 0 0
+TGACAAGACCTAAATGCAAAAAAAAGCTCAACCGTTCACTTTTCAAACAACATTTAAACCAAAAGCCTATTTTCGCCTGGTTTTTAAACAAAAACGAGCCCGTCAGGGCCCGTTTTATTCAAATTTGTGACTTACTGCACTGCCACAATACGATCATCATTGGCTTCAAGGCGAATCACTTTGCCAGGAACCAGTTCACCAGACAGGATTTGCTGCGCCAGTGGGTTTTCGATCTGCTGTTGAATAGCACGTTTTAACGGACGCGCCCCATAGACCGGATCGTAACCGTTGGCGCTCAACAGTTTCAGCGCCTCGTCGGAGATATGGATTTCATAACCACGTTCTTCCAGACGTTTGTACAGACGCTGCAGCTGGATCTGAGCAATAGAAGCGATGTGTTGCTCACCTAACGGATGGAATACCACAACTTCATCAATACGGTTGATAAATTCCGGACGGAAGTTTTGGCTAACCACACCCAGCACCATCTCT [...]
+ACAGACTCGACCGCCGCATTATTCAGCTCAAACTGGAACAGCAGGCGTTGATGAAAGAGTCTGACGAGGCGAGTAAAAAACGTCTCGATATGCTCAACGAAGAACTGGACGACAAAGAGCGCCAGTATTCTGAGCTGGAAGAAGAGTGGAAAGCGGAAAAAGCGTCGCTCTCTGGTACGCAAACTATTAAAGCGGAGCTGGAGCAGGCGAAGATTGCCATCGAGCAGGCGCGTCGCGTTGGCGACCTGGCGCGAATGTCTGAATTGCAGTACGGCAAAATTCCGGAGCTGGAAAAACAGTTGGAAGCCGCGACCCAGTCGGAAGGTAAAACCATGCGTCTGTTACGTAACAAAGTAACGGATGCGGAAATTGCCGAAGTGCTGGCGCGCTGGACCGGTATTCCGGTTGCCAGAATGCTGGAAGGCGAACGTGAAAAACTGTTGCGTATGGAACAAGAGTTACACAGCCGTGTGATCGGGCAGAATGAAGCCG [...]
+NODE 1389 4299 204611 202088 0 0
+CCTAAAACCGCAGTGTGGTTCATCAAGCCGCGTAATACGGTGATTCGTCACGGCGAACCCATTCCTTATCCGCAGGGAGAAAAGGTACTGAGCGGCGCGACAGTGGCGCTCATTGTGGGGAAAACCGCCAGCCGGATACGCCCTGAAGTGGCGGCGGACTATATCGCCGGGTATGCGCTGGCTAACGAGGTCAGCCTGCCGGAAGAGAGCTTTTATCGCCCGGCGATTAAAGCGAAATGTCGCGATGGCTTTTGCCCGCTGGGTGAAATGGCGCCGCTGAGTGATGTGGATAACCTCACCATTATCACTGAAATCAACGGACGAGAAGCGGACCACTGGAATACTGCTGATTTACAGCGTAGCGCCGCACAACTGCTTAGCGCGTTAAGTGAGTTCGCTACGCTTAACCCTGGCGATGCGATCTTACTCGGTACGCCGCAGAATCGCGTTGCGCTGCGTCCCGGCGATCGGGTGCGTATTCTGGCGAAAGGT [...]
+GCTTTTGAGGTCAGGCCGATTTTGTGGCCTTTGAGCGTGCGCCCTTCGGCAATCTTGATATTGACCCATTCGCGCTGTACGGCATAGGCATCTTCAATAGTGATGTTGGGATAATCCAGCGACACTGCGCGAATCTGTTCACGCTGTTTTTCAGCCTGATTAAGTCGCTGAGCGATCAGGGTATGGGTCTGTTTATCGAGCATAGTTGCTTCCTGTTACCTCATTCGGTGCTGCTGCGCCGGGTGGCGACGCGGTGCGTCTTACCCGACCTACGGTTCGGTATTGCTTCGTGCATCGTTTTTTTTGTAGGCCCGGTAAGCGCAGCGCCACCGGGCGAAAGAGTGTGCTATTTAAATAACGCGTGTACGTTGTTTTGTTTGTAATTGAGCGTCGGATGTAACTCGGCAATCTCAAACGACAGCGCCAGATAGCGGTTCTCCATCAGGTCGGCGAAGTGGGCTTTAATCAGCCCAAACAGCATTTCGCCGACTT [...]
+NODE 1390 3 269 269 0 0
+CAT
+CGT
+NODE 1391 7 413 413 0 0
+CTCCGTA
+GAGTGAT
+NODE 1392 51 3748 3748 0 0
+ACCTCGCCATCCCATTTTTACGGCGCTTTTCGGTATGGTGGTATTGACGCT
+TGAAGCGCTCTGAGCATGAACCATGGTTTTTCTCTTTGCTAAAGTAAGGCA
+NODE 1393 4495 255786 250914 0 0
+CCGTGGTCGTGATGGTGGTCGTGATGGTGGTTTCCCGCCAGCCACTGCTGCTCGCCTCGCCATGTCCGCCAAAACATCCAGCACGCGGTGCTCAGAATAATAATCGCAGAAATTAACTGCAGCCATGGTTCCACTGATTGTGCGGTGAATGCCCGGCTAAGATACATCCCACCCAGCGCGATTAACCAGACGATCGCGGTATGAGAAAGCGTTGCTGCCAGACCGAGCATGACGGCCTGTTTAACCGTACCTTTAATGGCAATGATAAAAGCCGCCATCATAGTTTTGGAGTGCCCTGATTCAAGCCCGTGCAAAATACCTAATAAAATGGCGCTGGGAATGAAGAACCAGCCGTTTCCTTGCTGAAGAAGTGTCGAAAATTCACCCATGAGAATGATTCTTAGTTGTTTTATGTGGGCGTCATTCTACTCCCCCCCAGTATGGAATACTACCCCCCAGTAGCATCGTAATGCTATAATTTGTATTCGTTAA [...]
+CCTAAACTATCAAACGCCGGATGCAGCAGGGCTAACCCCTCCGCACTGGCGTCGGCCCGCGGTTGTTCATCCGTATCGACAATTGCGGTCTGCCCATTACGTTGCGTGACGATGGGGACAATCTCATCTTTAAAACGCCCGGTATCAATCGCGGCCCTGGCTTTTTGCTGCGAACTGAGCGCATAAGCATCCTGTAACTCGCGGCTGATGCCATATTCCCGCGCCAGGTTTTCTGCCGTCACGCCAATGTGATAATCGTTGAAGGCATCCCATAAGCCATCATGTACCAGACTATCCACCAGATTGTCGGCATCAGGCAACGCGCCGGTACGGCTGTCATTGAGGACATGCGGCGCACGGCTCATATTCTCCTGCCCGCCCGCGATAACAATGTCCGCTTCGCCGCACTGAATAGCCTGCGTCGCCAGGTGCAACGCTTTTAAACCGGAACCACAAACGTCATTAATGGTAATGGCGGAAACGGTAGTCGGC [...]
+NODE 1394 156 409 409 0 0
+CGCACTCCAAAGCAACCCGACTCTATGGACATGGCGTCGTGCGCAAGGTCCTCACGTTCAAAGACGGGATTCTCACCCTCTATGATACCCTGTTTCAAAGGATTTATGACGTGGGCCTTCCTGACAACCAGCCTCGAAACCACAACTCCGTCATCC
+TAAATCCTTTGAAACAGGGTATCATAGAGGGTGAGAATCCCGTCTTTGAACGTGAGGACCTTGCGCACGACGCCATGTCCATAGAGTCGGGTTGCTTTGGAGTGCGCTATCGGTCTCCCCGCAGTATTTAGCTTTAGATGAAACTTACCACCTGAT
+NODE 1395 58 4370 4370 0 0
+GGTATAAGGAACAGGAGTCTGTAATGAAACTGAAACTAATACCTTTTTATTTTCTCGC
+CTTATACCTCATCATTTATACCTAATCATAAGGATAAATGCCCTGCGATATGTTTTTT
+NODE 1396 49 2861 2861 0 0
+GCTATTTTCTGCCGCCTCCGGGGCTACGGAGATAAACGCCTGCAAAGAC
+CGAGAAAATAAAAAGGTATTAGTTTCAGTTTCATTACAGACTCCTGTTC
+NODE 1397 1025 55592 55518 0 0
+AGGTGGGCCGAGTAATCCGTAGCCAACCCATAAGCAACCTGAAGTATGAAGGGTATAAATAATTTCGTTACGGATTACTGATATTGCGCAAACCTTATCATCAATGCAACAGTAACAGAACCATGAAAAAACGCATTATTGCCGCCGCATTACTGGCAACGGTTGCTTCATTCAGCACGCTTGCGGCAGAGCAGGTCTCTAAGCAAGAAATCAGCCACTTCAAACTGGTTAAGGTCGGCACCATAAATGTATCCCAGAGTGGCGGGCAGATTTCCTCACCCTCTGATCTACGCGAAAAACTGTCAGCATTAGCCGATGCGAAAGGCGGAAAATATTATCATATTATCGCTGCACGTGAGCATGGTCCGAATTTTGAAGCCGTTGCCGAAGTTTATAACGATGCGACGAAATAAAGCTCTGATTGCGCCATAACGAGGGCACTGGCATGAAATAATAAGAGAGCGCCAGCAAGGTGCCATGTTCCGTCACAAT [...]
+CTGATCGGAACATGGAAAACCACGGCAGATAACCCGCCTTATACCATGACAATATTGCCGCCAGTAGAAGGCTGCGGGGAAAAGTGTGTGAAACTGAACGTACGGTATGAACTTGACGTGACTCACCGCAACGCGCTTTATTGCCATGAAGGACAAGAGGGGGTAAAAGGGCAGGGACCCATGGTGATAGCATTTGAAGGGGCGTATGGTGGACACGCTATTGGAACCTATAACCGACAGCTGCAATTACTTTGGGCTGGCGTAATACCGAAAAATAAAAAGGGGAAATGGATAACGAAAATGGAAAATTACTGGTTCAGGCAGGTAAAAGTGCACTAAATATTACCTTAAAACAGCCCGCAAAACCGTCTTATTTACGAAGGGCTTACTGCCTGCGCGCGCACATTCCAACGGCTTGCCTGCCCCGGATGAACTGTTGATAAAAAAGAGGGCCAGCATCTGTTTCCAGACGGCCCTGAGTGGATTGTGACG [...]
+NODE 1398 42 2941 2941 0 0
+CACGCTAAAGAGATTTTTGTATCGGCATCACTGATGCCAGAA
+GCTCCGTCAAGGAATTTATTCTATTTGATGTTGAAATATTTT
+NODE 1399 94 4340 4303 0 0
+CGTTTTGAACTGCACCCGACCCGTGAGGTGTTCCGCCCGCAGCGGACGGTGAGCAAACCCCACACCAAAGGGCCGCAGAGCGCCATCGTCACCG
+CGCTGCGGGCGGAACACCTCACGGGTCGGGTGCAGTTCAAAACGGGTGGAAAAGGTAAAGTGCTGGTCCTGCCCGCTGTGCTGCGCGTTGTCCT
+NODE 1400 3774 214116 212561 0 0
+CGGAATGCGCATATACGCTGAGGTATAACCTCGCCGGTGCAGCCGGAGCGATGTATGCGCATCTTCCGTCACCGTCTCAACGGCGATACCGCCAATCTCATCCAGCGGCTTACGGCGAATCACCGCGCACGATCCGCAAAAGAAAGTGGCATCCCACATATCGTTACCGTCCTGCACCAGTCCGTAAAACAGCGTGCCTTCGTTAGGCGTTTTACGAAAACGTCCCAGGTTGCGCTCAAACGGGTCCGGGGAGAAGAAATGATGCGGCGTCTGCATCATCGCCAGCTGTTTTTCTTTCAGGAACCAGCCCATTGTCATTTGCAGAAACGAGCGTGTCGGCACATGGTCGCAATCGAAGATCGCCACAAACTCGCCTTTCGCGTGTTTTAGCGCATTGTTGATGTTGCCGGCTTTGGCATGTTCGTGCGTGGCGCGGGCAATGTAATGCACGCCAACATGTCGGGCAAACTGACGAAATGATTCGCGCCCGCC [...]
+AACCGCGCAGTTTCAACGGCTGCGTCATCGACAGTAGCGTGGTGATGTCTTCCGGTACGTAACGGCTGAACTGCTGCCCCTGCACGCTTTCAATAAGCGTCAGGCAGCGTGAAAGCGGGGCGTTCCAGGGAATGATCATATTCGCGCCGCAGCCCAGCAGCAGGCGCTCATCGGTGGCGCGCAAACTGGCGATATTTTCGCGCACGACAATTTTCAGCGCGCTTCCCCGCTGGCGCCGCAAAGTATGAATGCGACGAGCAAGCGGCTCGATTTGGTTGTTCTGTGTAAGCGAAAAAATAATTGTCGCGGCCTGCGCCGTGCGCGCGTCGTTGAATAGCGCTTCGTTATTGTCGAAAAGCGTCCAGTGTTCCGAGAGCGGCGGCGCGCCTTCAAGGACGGCGACGTGGCTAAGAATGCGTTTTTCGTCGCTACGCGGCTGAATTGCCGTCTCCTCCTGATGGGATAGCGTCCAGCGTTCGTCCTGCTGACACA [...]
+NODE 1401 7 767 767 0 0
+CTAATTT
+TTTTGCT
+NODE 1402 2643 142152 139535 0 0
+TGTCGCCGGTGAGAATTTTCACCGTAATTCCGCTCGCCTTCAGCGCTTTCAGCGCCGGCGCGGTGGTCTCTTTCGGCGGATCGAGAAAAGCAATATACCCTTCCAGGATCAGGTCAGATTCATCGATACGCTGGTAATCGCCCTCACGCGCAGGCAGGTATTTGGTCGCGACGGCGACCACGCGTAGCCCCTGACGGTTCAGCGTGTCGGTAACGCGTTTCACCCGGCGCAGCATATTGTCGTCCAGCGGCACAATATCGCCGTTGTGGCGCACCTGAGTACACACGTTCAGGATCTCCTGTAACGCGCCTTTGCAGACCAGTTGATGCACGTTCGAATCTTCGGCGACCACCACCGACATCCGGCGACGCTCAAAATCAAACGGAATCTCATCGATTTTCTGCCAGCGTCCGGAGAGCTGACGCGCGGCGGTTTCGTCTACTCCCTCCAGGACCGCCGTATCCAGTAAATTTTTTAGACCGGTCTGATAAT [...]
+CGTAACAGACGGAGGCAAAACCTTGCGCATCTCTTGCCAGCAGCATCAGTGAGGCTTTCCAGGGGGCGATCAACTCTTCTGTGATGCCGGTAAAGCCAAACAGCACCACGCCATCAATGTTACGTCGTCTGAGCATGCCCAGATGTTCCATTACCAGCGTCGGCGAGAACTGACTTTCCATCATAATAGGGTCGTAGCCCTGTTCATAAAACGCAGGCAGCATGGTTTGAACCGCGAGGTTTTCAGACAACGAATCAAGGCGAGTGACGATAATAGCGACCACTTTATCGCTTTGTCCCCGCATCGCACGGGCGGAGCGGGACGGAGAGAAACCGTGTTGATTCATCACCGCTTCGACACGCTCGCGGGTACGTTCGCTTACGCCGCTTTCATTGTTAAGCACGCGGGAAACGGTTGATTTCCCTACGCCGCTCAGGCGGGCGATGTCTTTGATAGTGAGCCGGTTTTGCATCCTGTTTTCCCGTGGCGTGA [...]
+NODE 1403 1057 47123 46684 0 0
+TATGAGCAGAAATTCTCCGGGGCATCATGCCCCCCCTCGGTATCGATCTTTTTCTCTTCTTTCTTGCTGACAGCGGCCCCAAAAAGGCGTGTCAGTTTCGGGAATGAACGCCGGAACCCCGAAAACAGGGGCATGGCGCGGTGTAGTGGTTGTGCGTCACTTTGTCGCTTTGCGCGACGAAAGCGACGCACTGGTCGAGTGCAGTACGCGAAAGATCGCAGACTCTGGTGTTATTTTACGGTCACGCGGCAGCAAAGCCGGACGTCTTTGCAGGCCGCAGCCCGTAAAGTAAAAGGCGTTGATGTGGTAACGGGTGCCGGGTGGAATCGCTTCCGTCACGGTGCAGCATTGACCAGAGATCTGGCGCAGGTACCATCGAGATACTCTTTCAGTTCTTTGGTACCGAACGTGTCGATAGCCCGCTGAGCTGCGCCGAGATTAGACGCCAGCTTGTCACCGCCAATGTCTTTATCGGCTTTAACTGCCGCAGCC [...]
+TCTGGTGAGTCCGGAGACGTTTAAAAAACAAGAACTTATCTTTACCCGGTTGACCTGATAAGGTTTGCCGGGTTTTTTGACATCCATAGTTTCTTGAGGGCTTAATCGGAGGCTTCACGGTTCGTTGAGTAAATAGAGCCCCCTCCTATGGCATTAACCGATACCGCTGGCGGCACGCAGACCGATCCGGGTACAGGAAAACCGTCAGAAAATCCACCCGCCGATCCACCGTCAGATGGTCCCGCTTCTGAAAAACCACACGACCCACCCGCCGATCCCAATAAGCCCACTCCACCGAAAGAAGAAACGCCGCCCGGCGCGCCGGAGAAATACGCGTTCACCGCCCCTGAAGGTCAGGAACTCGATACCAGCGCGCTGGCGCAGTTCGAACCAGTGGCGCGTGAACTGAACCTGACGCAAGAGCAGGCGCAGAAGCTGGTGGACGTCTATCCGAAAGTGCTGGCGGGAGTGCAACAACAGCAAGCGGAGTCA [...]
+NODE 1404 683 36406 34702 0 0
+TGTACGGTACAGGAGAACAAATGTCCATCTTCGCGGGCGATGGCCCCCGGCATGGCAATCTCGACCCGATGCGCGCGCCTGACCTGTTTACTCTCTACCGAAACCGCAACCGCGCCGCCGAGAATGACCAGGTTATAGAAGACCCACACCAGGCTAACGATGACGGTCAGCGTTTCATTTTCCGGCCCGTAATAGTATCGCCATACGCCCGCCGCCACGCCGAGCAGGTTAAGCAAGACAAGGAAGATATACGGACGCGAGATTACCCAGTCGACGTACTTCTCTTCCACCAGCCCGCCTTTCGCCGTGACGTTAAATTTCCCTTTGTGCGGATTGATCAACGCGACCAGAGTCGGCGGTGCGATATACCATGCCAGTACCGTTTCATAGATTTCACTCCAGAAAGAGTGACGATACTTGCCCTGAATCTTCGAGTTAGTCAGGCTGGCGTGGACCATGTGCGGTATCACAAATAGCGCAATCATCAACGCA [...]
+GTTTGGTAAAGGCTTAAAACTGGCGCAGCGGCTGTGCTACCTCAACGCGATGTTCCATTTCTTGTCCGGCATTCCGCGCCTGATCTTTCTGACCGCGCCGCTGGCTTTTCTGCTGCTGCACGCCTATATCATTTATGCGCCTGCGTTGATGATTGCGCTATTTGTGATACCGCACATGGTCCACGCCAGCCTGACTAACTCGAAGATTCAGGGCAAGTATCGTCACTCTTTCTGGAGTGAAATCTATGAAACGGTACTGGCATGGTATATCGCACCGCCGACTCTGGTCGCGTTGATCAATCCGCACAAAGGGAAATTTAACGTCACGGCGAAAGGCGGGCTGGTGGAAGAGAAGTACGTCGACTGGGTAATCTCGCGTCCGTATATCTTCCTTGTCTTGCTTAACCTGCTCGGCGTGGCGGCGGGCGTATGGCGATACTATTACGGGCCGGAAAATGAAACGCTGACCGTCATCGTTAGCCTGGTGTGGGT [...]
+NODE 1405 51 2117 1764 0 0
+TCCGCCTGCCTGTGGATCATCTTCCAGTTCAGGAACAGCCTCGAAGTATAC
+AAAGCAAAATTCATCCGTAAGTGTGAATCTTGTCTGGGGGGTGTTGCTGCG
+NODE 1406 84 117 117 0 0
+CCTGGTGATAAAGGCGGTCAATGGTCTTTATCGGCTCTTCATCCAGTACGGCATCTTTTACCAGCAGCCCCATCCACTGTTCAA
+CCGATAAAGACCATTGACCGCCTTTATCACCAGGCATGTATTGGCGCAGTCCGCTGGGGGAATCTGCCGGATAATGCCCGGGAG
+NODE 1407 51 60 60 0 0
+CGAGCAATTTTGATCGCATCAAACTCTTCGGTTTTAGTCTGCGCTTTCAGA
+GGGCTTCGCCAGACATGATCCGTTCATGGTCTTTCGGTGAAGTTAAAAAGC
+NODE 1408 846 60698 60348 0 0
+CTCCATAAGCAAGAAAAAATAAATAGATACTTTATAAAATCGCCCATACCACTAACCCCTGATTTAATATGTAGAAGGTATCAATTCAGTATTCAGCATTGCCACACTATACACAAAATCACTCAAGTTGCATCAAGGCGGCAAGGATTTGCTATTGCGCAATGCGTAAAAAACAAAAATATATTTTTCATAATAAAATCTACTAATAAGTAGATTAAATGGATTCCATCTTATCAATACGTAATTATCATTTTCTGTTCAACCTCAACCTGATTTCCTCTTAGTACTGAGCATCGTCTGCGATCGTTAATTCTACCTCTGATGATATCTCGTTAAAAAATAACGCTACCGCCATACCCTGGTTTACAAACCTGCACACCCTAAGATTACTCTCTTATTTGCATTAAGAATATCATTGTGTTTTTTTTCGGAATATATAAAGATTCCCCATAGTGGATACATAACGTGAGCCAAATTAGTTAAAGACGTAAT [...]
+GGTGATGGTTTGATTTTTCATCTGAGCGAGCTTCATGGCTTGGGCAAAGGGTGGAGTTTAACACTGCTGGATTTGGTTACGGAAGATTGTAGTGCGTGAGGCATATATGTTTAATCAGGGTAAATAGCTGCTTATTTATATCTTTCTGCTATCAGGATGTTATGACACTGCCCCCAATATTCAGGATTTAAATAAAGCATTTCTTGAATATTAAACTAACTCACTAAAAATAAACTTGAAATTACCTCGGCAACATGCATTAAAGAAAATACTAAAGGTCATTTGACTTATTATAGCGTCAGTGATTACGTCTTTAACTAATTTGGCTCACGTTATGTATCCACTATGGGGAATCTTTATATATTCCGAAAAAAAACACAATGATATTCTTAATGCAAATAAGAGAGTAATCTTAGGGTGTGCAGGTTTGTAAACCAGGGTATGGCGGTAGCGTTATTTTTTAACGAGATATCATCAGAGGTAGAATTAACG [...]
+NODE 1409 889 47976 47747 0 0
+CCAGCGTATCGTTAATCTGATCCATGGAACGCCCGCGGTTCAGGCCAAAGGTGAACATCGCAATCAGTACGGCAATTAACGTAGCCATTACCGGGTCGCCCAGGAACTCGGCAACGGGCAGGAAAGCGTGGCCTTTTGGCAGAATCATCTCGGCAATCGCACGCATCGCCATCAGAATAACCGGAACCAGCGACGTCCAGACGCTGACGCCAAAGCCCGGCATCTCTTCTTCCGTAAAAGTTTTCGCGCTGTACAGGCCTTCCGGGATCGGCTTATCGATGCCTTTCAGGAAACGGGCGTAAACCGGTCCGGCAAGGATCACGGTCGGGATCGCCAGAATCGTACCAAACAGCAGCGTCTTACCCATATCGGCATGGAAAATCGTGGCGATTGCGGTTGGACCCGGGTGCGGCGGCAGGAAGCCGTGTGTGACGGAGAGCGCCGCGGCCATCGGCACGCCGACGTACAGTAACGGGATATTCGCTGCTGCGG [...]
+ACTTCTTCTGATGATCCGCTTCAAAATGAACGGATTTATCGCCCTTGTCCTGGTAGCGCTCGCTGTCGGGTTGATGCAGGGAATGCCGCTGGATAAAGTCATCGGCTCCATCAAAGCCGGTGTCGGTGGTACGCTTGGCAGTCTGGCCCTGATTATGGGGTTCGGCGCCATGCTGGGCAAAATGCTTGCCGACTGCGGCGGCGCTCAACGTATCGCCACTACCCTGATCGCGAAATTTGGTAAAAAGCATATTCAGTGGGCCGTAGTGTTAACCGGCTTTACCGTCGGCTTCGCTCTGTTCTATGAAGTGGGCTTCGTTCTGATGCTGCCGCTGGTATTCACCATTGCCGCAGCAGCGAATATCCCGTTACTGTACGTCGGCGTGCCGATGGCCGCGGCGCTCTCCGTCACACACGGCTTCCTGCCGCCGCACCCGGGTCCAACCGCAATCGCCACGATTTTCCATGCCGATATGGGTAAGACGCTGCTGTT [...]
+NODE 1410 865 51246 51080 0 0
+ACAATATCAGGGGAGTTTTTAGGTTTGAGGTAGATAAGGGCAACAGGAAAATGTCGTTTTTTATCTGCGGACGTCCATTCGCCTTTAATCTCACTGCTGGAGATTTCCGCATTCCAGTAACCCGAAAGCGCCTTTACGCGTTCTTCAAGATGCACCTCTTTATCCTGGAGTGAGCCGCGTAGAACAATCGCTGCCTTGTGCTGATTGCAAGGTTCATAACAGTAATACCCATAAAGCGTGTTACCAAATCGCGTGATATTAACGTTTACCGGTTTCCCCGCGATAGTTCCGGTATAGTTTCGCTCCCAGGCGGGTAGCTCCAGCACCGTGGCGCTTGTTGCGTCCATCCAAAAGCCGATGGCGAGTAACGTTGCCAATCCATATTTTATTTTGCCCATTTCCCTTATCCCTGTAGGCATTACAACCCAAAAACCAGCAACGATTGTGCTGGTTTTTCAGATGAATAGCAAAAAGGTGGGGCATTAGCACCGG [...]
+TCGACGATGCGGCGGATATCCAGGAGGCGTGGGTGAAAGAAGCCGCCTGCGTCGGCGTCACCGCTGGCGCTTCCGCGCCGGATATTCTGGTGCAGAATGTTATTGCGCGTCTGCGCGAGTTTGGCGGCGGCGAAGCCGTCACGCTTGAGGGGCGCGAAGAAAATATTGTTTTCGAAGTGCCGAAAGAGCTGCGTGTGGATGTTCGTGAAGTCGAATAAGATTTCACAATTCAGAAATCTGCCCGATGACGCTACGCTGACCAGATCTTAAGGATTTCTTTTGATATTCAATGTGCGACAGGAAAAATAAGGCGTAGTCGTCATCCGGTGCTAATGCCCCACCTTTTTGCTATTCATCTGAAAAACCAGCACAATCGTTGCTGGTTTTTGGGTTGTAATGCCTACAGGGATAAGGGAAATGGGCAAAATAAAATATGGATTGGCAACGTTACTCGCCATCGGCTTTTGGATGGACGCAACAAGCGCCACGGTG [...]
+NODE 1411 51 2833 2833 0 0
+ACCCCCTCGCAAGGTTACGGGAAATAAGAGGTCATTATGGAAAATTCTAAC
+TAAAGGTATTGTCGATAATCGGCGCGGTATCAGACTGCGGTACGTGGCACT
+NODE 1412 12 2747 2736 0 0
+ACTGCTCTACCA
+CGACCCACCAAT
+NODE 1413 12 3047 3047 0 0
+ACTGAGCTAACG
+TCGAATCCTGCA
+NODE 1414 4 1046 1046 0 0
+ACCC
+AGGT
+NODE 1415 25 1246 576 0 0
+TGGCGGGCAGGACGCCCGCCATAAA
+AGTGCTCACCGGCAGACTACAGATA
+NODE 1416 21 1221 790 0 0
+CTGCCAGGCATCAGACAAGTG
+ACGGGCCGTTGCTGCGCAACG
+NODE 1417 16 728 448 0 0
+AAGAAGCCCGTCCGTC
+TCCTGCCCGCCACCCT
+NODE 1418 9442 580832 574398 0 0
+AGAGTTCTGCATCCCGACTTCGATCGCCAGCGTTCGACAGGTTGACTCATCAAAACCGAACAGACGTCCACCCCAGTAGCCGCCAAGCAGGCCAAGGGTGTTATGCAGGATCACCGCGATGATCACCATAAAGCCGACGGAGGCGATATGTGAAGCTGAACCCGCGACCACCGCGCTGATGATTGCCAAAATGCACACCATCGAGAATGCTGGCAGATAAGGTTTTACCACTTTCACTACGCGCGGAAACAGATGGTGAATCACCAGCCCCAGCGTGATTGGAATGACTACAATCTGTAGAATGCTCAGCAGCATACCCATCACGTCGACTTGAATATGGGCATCGACGTACAGGCGCGTGAGTAGTGGTGTGGCGACCACGCCGACCAGCGTGGAGACCGATGAAATGGTGACTGAGAGCGCGACGTCTCCCTTCGCCAGATAGATCATTACGTTAGAGGCGGTGCCGCTGGCTACGCTACCGACCAGTAC [...]
+CGTATATAGGAGTGAGCGTTTCTGCCCTCTCCCTGATATATGCCATGTGGATGATCATTGATAAATTGATGTGGGGAAACCCTGTTCCTGGTTATCCTTCGCTTATGACCGCGATTCTCTTCTTAGGCGGCATCCAGCTTATCGGCATAGGCATCATGGGTGAATATATCGGACGCGTTTACACGGAGGTAAAGCAAAGGCCTCGCTATATCGTGAAAAACAAAAAAACAATGATGGAATAATGATGGAATAATGATTACTATGCTCAAGATATTACCGAAAACGGCGATGATACTACTGGCTTTTTTGGCCATTTTTCTTATTGAATGGTATACCCCCATTCACTCTGATGATTACCGCTATTACCTTTTAGGAATTTCGCCGGAATCACATTTTCATCATTATATGACATGGAGTGGCAGGATTATAGCTGATTACACCAGCGCACTTATCCTGTATACACGTTCTCAACTCGTGTATTCCATCAGCGCT [...]
+NODE 1419 51 3080 3079 0 0
+GCTTTGCCAGCCAAACAGCGCCTGGCCGAAACCCACCGCAATATGCAAGGC
+CGAACAGCTCTTATTTGGGGAGCTGGGTACTCTAGGTTTACTATGGTTTAT
+NODE 1420 69 2708 2708 0 0
+CGAGACGCTCACGCTTTCTGGCGCCAATTCTTACACCGGCGGCACCACCATCAGCGGCGGCACGCTGGT
+AGAAAGCGTGAGCGTCTCGTCGCCGGATTTCACCACGCTGCCCGTACCGCCAATGTTGTTGGCGAAGTC
+NODE 1421 222 7253 7253 0 0
+CGTGGCGTCGTCGGTGACGTCGCCGCTGCCCAGCGCGTCAACGTTAGTGGCGACCAGCGTGCCGCCGCTGATGGTGGTAGCGCCGCTGTAGCTGTTGGCGCCTGAGAGCGTGAGCGTCTTGTCGCCGGATTTCACGACCTGGCCGCTGCCGCTGATGGCGTTGTCAAAATCGCCGCCGGTGTTCAGCTCCAGCGTGGCGTTATCGGTGACGTCGCCGGTACC
+CGATTTTGACAACGCCATCAGCGGCAGCGGCCAGGTCGTGAAATCCGGCGACAAGACGCTCACGCTCTCAGGCGCCAACAGCTACAGCGGCGCTACCACCATCAGCGGCGGCACGCTGGTCGCCACTAACGTTGACGCGCTGGGCAGCGGCGACGTCACCGACGACGCCACGCTGGAGCTGAACACCGGCGGCACGTTCGACAACGCCATCAGCGGCAGCGG
+NODE 1422 6 412 412 0 0
+CAGCGC
+CGGCGG
+NODE 1423 24 957 957 0 0
+CTCAACGTTGCTGGCGACCAGCGT
+TAACGCCACGCTGGAGCTGAACAC
+NODE 1424 7 926 901 0 0
+GCCGCCG
+TCACCGA
+NODE 1425 5 467 443 0 0
+CTGAT
+CGACG
+NODE 1426 6 307 283 0 0
+GGTGGT
+TACCGG
+NODE 1427 3223 192748 189864 0 0
+CATTGTCATTGCGCATATTGAGGTTGATATGGCGTATAAACACCGGTCAGGCTTTCCAGGAAGGCGACGATATCGTCAATATCGTTTTGCGGCAGATCGGTGCCAACCTGATAACGCAGCATCAGTTTTACCGCGCCATCCAGCGTCGGTACGTCGCCCCGATGGAAATAAGGCGCCGTTAACGCGACGTTGCGTAAGCCCGGGACTTTTTGCCGTAATTTATCGCGAACCTCTTTGGTGACGTTCATACGACCAATATCCGCTGCGGTAATTTCGCCAAAATTAAAGTCTCGCTTTAATCCCAATGGTTCAAAAGAGCGCCCGCCTAAAATGATACCGCCGTGACAGGTTGCACATTTATTCTCTTTAAATAATTGATAACCGTGTTTCTGTTGCGCGGTCAGCGCATTTTCATCTCCACGTAGCCATTTATCAAAGGCGGAATCCGGCGTTATCAACGTTTTTTCGAATTCGGCGATCGCATCAGTAATA [...]
+ACGACCTCGATCAGTTCGGCAACCACTCTAACCGCGGCATTATCGCCATGAAACAGGTGGTGTCGCCGCAGTTTGAAGCGCGTAACGACTTTGATATTTTCCGCGATCTCTGCCGACGCTTTAACCGTGAAGCGGCATTCACGGAAGGTCTTGATGAAATGGGCTGGCTGAAACGCATCTGGCAGGAAGGGAGCCAGCAGGGAAAAGGCCGCGGTATCCACTTACCGACTTTCGAGGTGTTCTGGAATCAACAGGAGTACATCGAGTTTGATCATCCGCAGATGTTTGTGCGCCATCAGGCTTTCCGTGAAGATCCGGACCTGGAGCCGTTGGGCACGCCAAGCGGTTTGATCGAGATTTACTCCAAAACGATCGCCGACATGCAATACGACGATTGTCAGGGCCATCCCATGTGGTTCGAAAAAATCGAACGCTCGCATGGCGGGCCGGGATCGCAGCGCTGGCCGTTGCACTTACAATCCGTCCACCCTG [...]
+NODE 1428 7 1183 1183 0 0
+AACCAAC
+CAGTGTT
+NODE 1429 3 513 513 0 0
+ACT
+TGC
+NODE 1430 1 177 177 0 0
+G
+T
+NODE 1431 2 368 368 0 0
+GC
+GG
+NODE 1432 3 422 422 0 0
+GAC
+ACC
+NODE 1433 14 1851 1851 0 0
+TGGTCAGCAGCAAC
+GTTGGTTGCTGCTG
+NODE 1434 2443 165811 164944 0 0
+CCATTAAAGCAGTTTAGTAAGGCAAGTCCCTTCAAGAGTTATCCATTAGATACCCCTCGTAGTGCGCATTTCCTTAACGCTTAAAAAATCTGTAAAGCACGCCATAACGCCGAAAGGCACACTTATTTTTTAAAAGGTAATACACTATGTCCGGTAAAATGACTGGTATCGTAAAATGGTTCAACGCTGATAAAGGCTTCGGCTTTATTACTCCTGATGACGGTTCTAAAGACGTGTTCGTACACTTCTCCGCTATTCAGAACGATGGTTACAAATCTCTGGACGAAGGTCAGAAAGTTTCCTTCACCATCGAAAGCGGCGCTAAAGGCCCGGCAGCTGGTAACGTAACCAGCCTGTAAGCTTAAAAAGCTCAGAATTTTGAATCCCTGCCTGATGGCGGGGATTTTTTTTATTCCAATTCCCCCTCTCCCCCAGCATAACTTTGCATTACTTTACCCTGCGTTCCTTTGACCTTTCCCTTAGGGGAACCCC [...]
+GCTGCTCCCTATCAACAAAGACAATATCGAAGGCCGCTGGGATGCCTTCGTTAAGATCTTGCTGGCATGATTAACTGGTCACAAACGTCCGCTTCTGGCACAAAGCGGACATCAGTATTCAAAAAATGAAAAACGACGACTTGATGTATACCGTTTGCTATACATGGTGGTTGTGCTATCATTGTAAAGCAAATGCTATACAAGGGGTGTCTCATGAAATCAGATGTTCAACTTAACCTTAGAGCTAAGGAATCGCAGCGGGCGCTCATTGATGCAGCTGCGGAAATCCTTCACAAGTCACGTACAGATTTCATTCTGGAAACGGCCTGCCAGGCTGCCGAGAAAGTGATCCTTGACCGCCGTGTATTTAACTTTAACGATGAGCAATATGAGGAGTTCATCAATCTGCTTGATGCACCGGTCGCAGATGATCCCGTTATCGAAAAACTGCTGGCAAGGAAACCTCAGTGGGACATGTAACAGCACCAGAAC [...]
+NODE 1435 3401 190544 188635 0 0
+AGTGAACTGCCACGTTCCAGCATTGCCGCGGTCGCGCCTTCATCAACCGTAATTTCACCTGCCGGCGGCGCGCCGAAGATCCAACGTTTGCGGTTCTCCAGCGGCGAGGCTTGCGCATGAAAACGGGTGCCGACGGAAATCCCCTCCATCACATCGCCGATCACGCCCGGTTTACTGCCTGAGGCAATAATCGTATCAATACCCGCGCGACAGGCTACGTCTGCCGCCTGAAGCTTAGTGCTCATACCACCGGTTCCCAGCCCGGAAACGCTGTCTCCCGCGATAGAGCGCAGCGCATCGTCAACGCCATACACATCTTTGATAAGCTCCGCCTGCGGATTGCTACGCGGATCGGCGGTAAATAATCCTTGCTGATCGGTCAGCAGCAGCAGTTTATCCGCGCCTGCCAGGATCGCCGCCAGCGCGGAGAGGTTATCGTTATCGCCCACTTTAATTTCCGCTGTCGCAACGGCATCATTTTCATTGATAACC [...]
+CCGACTATTACACCCTGTATGAACGCTATTTCGCGCCGCGCGGTATCGCGATGTTAACGCTTGATATGCCTTCGGTTGGATTTTCATCAAAGTGGAAATTAACCCAGGATTCCAGCTTGCTCCACCAGCATGTGTTAAAAGCGCTTCCTAATGTCCCCTGGGTGGATCATACCCGTGTTGCGGCGTTTGGTTTCCGTTTTGGCGCCAACGTTGCGGTGCGTCTGGCCTATCTGGAAGCGCCGCGTTTGAAAGCGGTGGCTTGCCTGGGGCCGGTGGTCCATGCGCTACTTAGCGATCCGCAACGACAGAGCACGGTGCCGGAGATGTATCTGGATGTTCTGGCCAGCCGTCTGGGTATGCATGATGCTTCGGATGAGGCGCTACGTGTGGAGCTCAATCGCTATTCGTTGAAAGTACAGGGGCTACTGGGCAGACGTTGTCCTACGCCAATGCTTTCCGGCTTCTGGAAAAACGATCCCTTCAGCCCGGAAG [...]
+NODE 1436 899 52938 52850 0 0
+CTGGTTGTTCACGGCATCCAGAATCAGATAGTCGCCGTTTTTCACCTGAGAGGTGACGCTACCGGTACCTACGATCGCTGGCAGTTCCAGAGAACGCGCCATGATGGAGGTATGAGACGTACGTCCGCCCGCGTCGGTGATGAAGCCCAGCACTTTCTGCAGGTTCAACTGTGCGGTTTCTGACGGCGTCAGGTCAGCGGCAACCAGGATAACTTCTTCCTGAATCGCGCTCAGATCGATAATGGCCAGACCCAGGATGTTGCGCAGCAGGCGCTTACCGATATCACGTACGTCAGCCGCACGCTCTTTCAGGTATTCGTCATCCAGTTCTTCCAGGGCAGTGGCCTGACCTTCGATAACTTCATGTGCGGCTGCGTCAGCCGTCATGTGCTTATCTTTAATCAGGGCTATGATTTCCTGCTCCAGCTCCTCATCTTCGAGCAGCATAATATGCCCTTCAAAGATGGCTTCTTTTTCTTCACCGAACGTTTC [...]
+AAGCCTGTTTAAACTGCAGACTCTGGGCCTGACTCAAGGCACCGTCGTCACCATCTCCGCAGAAGGTGAAGATGAGCAGAAAGCGGTTGAACATCTGGTCAAACTGATGGCGGAACTCGAGTAAGTTTTTTCCGGGTTCTTTTAAAAATCAGTCACAAGTAAGGTAGGGTTATGATTTCAGGCATTTTAGCATCCCCGGGTATCGCTTTCGGCAAAGCACTGCTGCTGAAAGAAGACGAAATCGTCATTGACCGGAAAAAAATTTCTGCCGACAAGGTTGATCAGGAAGTTGAACGTTTTCTGAGCGGTCGTGCCAAGGCATCTGCGCAACTGGAAGCGATCAAGACAAAAGCTGGTGAAACGTTCGGTGAAGAAAAAGAAGCCATCTTTGAAGGGCATATTATGCTGCTCGAAGATGAGGAGCTGGAGCAGGAAATCATAGCCCTGATTAAAGATAAGCACATGACGGCTGACGCAGCCGCACATGAAGTT [...]
+NODE 1437 8336 452232 441135 0 0
+CACCTACGGCACCGGAAATGAAGCAAAAAATACCGGCAACGCCACCGTGCGTGATGCGGACTCGGTGGGTTTTGTGGTCGCAGGCGAAAAAAATACCTTCAAAAACAAAGGGGATATCGACGTCAGCCTTAACGGCACCGGTACACAGGTGAGCGGAGATATGTCACAGGTTACGCTGGATGGCGATATCAATGTAACCGCCGTCGAAGACAGCGATAGCGTCTATCGTGGCGCAACGGGTATCGACATTACGGGGGATAACAACACGCTGGATATTGTCGGTAACGTCACAGTCAACGGCGATTATGACAACGACAGCGTGATGGCTGGCAGCACTGATACCCTGCAGGGGATGTCCGTCAGCGGCGACAATAATCAGGTGGATCTCACCGGCACGCTCAACATTAACGTCAGCGATATGAGTAATGTAGACGGGCAATATCTGAATGCCGTTGGCCTTAGTGTAACGGGTGATGGTAATTCCGTGGACTT [...]
+GGTATACGAGACGACGCGTAATGGACAACCGTGGTATGTGCTGGTAACGGGGATGTATGCTTCGAAAGAAGATGCTAAACGTGCGGTGTCCACCTTACCTGCCGATGTGCAGGCGAAAAACCCGTGGGCAAAACCGTTGCATCAGGTTCAGGCCGATCTGAAATAATCCAGGCTGTGTCCTGCAATTGCCTGTGAGTGTCGCTGACAGCTATTTTTGTTCAGGACAGGCGCGAGGGGCGCATTTGCTACCGTCAAATGCGCCGTAAAGCAACGCGGCACAGCCTAAAGCGCAGGATGCTGTCGGAGCTTTCTCCACAGCCGGAGAAGGTGTAATTAGTTAGTCAGCATGAAAAAAAATCGCGCTTTTTTGAAGTGGGCAGGGGGAAAATACCCTCTGCTTGATGATATCAAACGACATTTGCCAAAAGGTGAGTGCCTTGTCGAACCTTTTGTGGGTGCCGGATCGGTGTTTCTTAACACCGACTTTTCTCG [...]
+NODE 1438 4 208 204 0 0
+TCCT
+TGTT
+NODE 1439 712 36388 35928 0 0
+GATCGGGAATGGGCAGCTTATCGACATCGGCTTTGCAGGTGACAGGAGCCGTAAAGCGCGGGCCTTCCCCGGCTTCAAAATAGAGCCCCAGGCCCATCGCGTCCGGAATCGTCAGGATATCCGAGAAAAGGATCGCCGCATCAAGCGGATAACGGCGCAGCGGCTGTAAAGTGACCTCGCAGGCCAGTTCGGCATTTTTGCACAGCGACATAAAATCGCCCGCCTGAGCGCGAGTGGCTTTGTACTCCGGTAGATAACGGCCCGCCTGGCGCATCATCCACACTGGCGTAACATCAACGGGCTGGCGCAGCAGCGCACGTAGATAACGATCGTTTTTGAGTTCGGTCATTTTTACATTCCTTTAGCGTTGATGCGCCCAGTGTAACATGTCAATCATATTCAGCCCGACACATTGCCACCGTATCTTCGATCAAACGGCGCGCGACGGTGCCCGGTGGCGGTAGTAGCGGCAGATCGTCATAACGGTACCAA [...]
+GAACAGGCGGTCGCGCGAGAGGTAATGGAGGAGAGCGGGATTAAGGTGAAAAATCTGCGCTATGTGACTTCCCAGCCGTGGCCTTTCCCGCAGTCGTTGATGACCGCTTTTATGGCGGAGTATGACAGCGGCGAGATTGTCATCGACCCGAAAGAACTGTTGGAAGCAAATTGGTACCGTTATGACGATCTGCCGCTACTACCGCCACCGGGCACCGTCGCGCGCCGTTTGATCGAAGATACGGTGGCAATGTGTCGGGCTGAATATGATTGACATGTTACACTGGGCGCATCAACGCTAAAGGAATGTAAAAATGACCGAACTCAAAAACGATCGTTATCTACGTGCGCTGCTGCGCCAGCCCGTTGATGTTACGCCAGTGTGGATGATGCGCCAGGCGGGCCGTTATCTACCGGAGTACAAAGCCACTCGCGCTCAGGCGGGCGATTTTATGTCGCTGTGCAAAAATGCCGAACTGGCCTGCGAGGTCAC [...]
+NODE 1440 2506 124014 123079 0 0
+AGCGCGATAATGGTCATCAGCAGCAGCGCCAGAACCTGTAGACCCACGCTTTCGGTACGAACAAAAACCAGCAGCAACAGGAAAGAAACAACCAGCGCCGCCAGGTTCATTTTGTGACGGTTAGGCAACATCAACGGCTTAGAAGAGATTTTGCCGCGCAGTTTACCAAACGCTACGATCGATCCAGTGAAAGTGACTGCGCCAATAAAGATACCGAGGAAGACTTCGGTCAGATGGATATTCACCAGCACCGGCGCCAGACTGGCGTCATGGTACAGATAGCTGTTAAAGCCAACCAGTACCGCCGCCAGGCCCACGAAACTGTGCAGAATCGCGACCAGCTCCGGCATCTCGGTCATCTCAACTTTTTTCGCCATGCGGATGCCAATCGCGCCGCCAATAATCATGGCGACCAGAATCCATGCCACGTTGCCGGTATCCGGCCCGAAAATGGTCGCCAGCAACGCGATCGCCATCCCGGCAATACCGAAG [...]
+AAGTTAATTTAATGTTAATTTCTTGATCTCGCCAGGGGTTTAATGATGTTTTGCTGTCAAATTTGAGCGAATTATCAGCCCTCGCAGGCCATTTTCAAGGCATTATGGCTGCTTAGCGGCTGAATCGTTCATGTTTTGCAAATTTGATAAAAAATTCTGTTTTTTGGCGCTAGATCACAGGCGTTATTTTCAGTAGGTTATAGAGAGTTTGTAACGGTTTTATTCTGCTGGGGTAACATTTACCTCAAACGCGGGCAGGCGTACGCTTCTCGCGCTTACTGACAAACCATCATCAAAGATACCGATGGAAGGGAACATTTATGCGAATTGGCATACCAAAAGAGCGGTTACCCAATGAAACCCGTGTCGCTGCGACGCCGAAAACGGTAGAGCAGCTACTGAAGCTGGGGTTTAGCGTCGCTATCGAAAGCGGGGCGGGGCAACTGGCAAGTTTTGACGACAAAGCGTTTGCGCAGGCTGGCGCGGATATTG [...]
+NODE 1441 4012 219402 215379 0 0
+GCGCGACGGTCGAAGAGGCGATTCGCGCTTCCGGCTTGCTGGAATTGCGCACAGATATCGATCTGGCGAAAAATAAAGTGGGCATCTATAGTCGTCCGGTAAAACTCACCGATACGGTGCAGGATGGCGATCGGGTTGAAATTTACCGTCCCTTAATCGCCGATCCAAAAGCATTACGCCGCCAGCGCGCCGAAAAATCGGCTGGCAGATAATTAACCTTGCCGGATAACGGTGTGAAAGCCGTACCACACCTGAAGCACAGGTGTGCCTGTAAGCCAGATGAACGTAGCGCCATCAGGCAAATTCGTACCAAATGGTGGGGAGAGGTTTGCAGGCCTGATGAACGTAACCTCATCAGGCGGTATCACAAAATTACTTCGTCAACGCCGGTTTGTTATCAATATTGGTTAACACGCCGCTGCTGTTAAAGGTGAGCGTCAGAGTCTGCTGCGTCACGTTCTCATGTCCTGGCTGCTGGCGGAAGACATAAAA [...]
+TGCCGCCATATCCGGATTGGCTTTGTCTGCAACTTCCAGCGCGCGATCCAGGCTATCGATTACCGGCAGCAATTCGTTGACGAACTTCTCGAGAGCGAATTTATGCGCTTTTTCGATATCCTGTTCAGTACGACGGCGCAGGTTTTCCATTTCCGCTTTGATACGCAACACGGTGTCGCGTTCGCGAGTCTGGGCTTCTGCAAGCTGAACTTCCAGATTCGCAATTTTTTCATCGCGCGGATCCACCTGCTCAGCAGAATCGTTTGGTTCAACTGCCTCAACCTCTTCGTGCTGATCCATGATAATTTCTTCCGGGGCTTGCCCCTCAGGCGTTTTCTGTTCTTTACTACTCATGAATTTCTCCGCGTTTTTTTTCGCATTCATCTCGCTAACTTCGCTTATTATGGGGATCAGATTCAGGGTTTCAAGGGAAGTACTCACATTGTCATCAATCTTCGCTACAAGGACCTCAGAAAAATGAATAATCATTTC [...]
+NODE 1442 51 2329 2324 0 0
+TAAGTTCGGCGTGGAAGTGATTGCTGAGACCAACGTGCCGCTGGACCCGAA
+ACGCACCACATCCAGCATAGACTTCAGCGTCAGCTCAATCCCTTCGACCAT
+NODE 1443 129 9462 9462 0 0
+CAACTTTTATTTTACTTTATTTCTCCAGGTCAGGAATCGGGCGGGGAAAACGGTCCTTACGCAGGACCGTTAAAACAGAAAGGGGTAAAAATTACTCCATCAATTGCTTACTTAAGCGTGGGTTCGCCT
+TCTGTTTTAACGGTCCTGCGTAAGGACCGTTTTCCCCGCCCGATTCCTGACCTGGAGAAATAAAGTAAAATAAAAGTTGCATCGCCCGGCATTACATGAGTTAATGTGCTCAACGGTTTGACGTACAGA
+NODE 1444 2014 130022 129076 0 0
+GGCAAATAGCCCGATCTTTTTGACAGAACTCATGTTCATTTCTCCTGAGCTGTATTTTTAAGAACCGGGCTTATGCTTCATGTATGCTGCGTGCCCGTTCAACTGTCGACAAGATTAACGAATGGGTTGAGATAAGTCCTAAAGAAAAAGTGAAATAAACACAAACATGAAAAAACTGATAGATTGATTTTTTTGAATTAACATATAAATATCATGGAAAATATCATGAAAGGATAAACATTGTTTAATTACAAAGGGTTATATTTACATTTCTTTGCGATGAATATGTTGCCAAAATTAACATAAGCTATTTTTGGCAACATATTTTTCACAAAATAAAAGCGAAAAATTTAATATCTTTTCGCTTTTATTTGTCATGGTTCAGCGTTAAATTTAATCTTCTGCCAGAAAACTATTCAGATAAGGGACAATTTTCTGAACGGATGTCTGAAATACGCCGTTCTCGATCCAGTACAGAGTGTTTTCACCTGG [...]
+GACTTAGCTCGTTAGGGCATCTTTTTATGCAGCAACCTGTTGTACGCATTGGAGAGTGGCTGGTTACACCTTCTGTTAATCAGATCAGTCGTCAGGGACGCCAGATTACTCTTGAACCACGGCTGATCGATCTTCTGATGTATTTTGCGCATCATCCGGATGAAGTGTTAAGCCGGGATAACATTATTGATCATGTCTGGATGCGCACCATCGTGACCAACCATGTTGTCACCCAAAGCATTTCTGAACTACGCAAATCATTAAGAGATGGCGGAGACAGCAATGCGGAATACATCGTTACCGTACCTAAACGCGGCTATAAGCTGACGGCGCCGGTTATCTGGTGCGAAGAAAATAGCGATGAGATCGATAATTCATCAACGTCGCCGCCGCCGCCGATCGCAGCAACGAATGCAGAACCGACAGAGGGGGCTACTGCCGCTACGCCTGTGCCGCCCGCCTCTTTGCAAACGCCGACTAAAAAGGCGAAAA [...]
+NODE 1445 741 42773 39687 0 0
+CGCGCGCTGCGTGAAATTCATGAGCGTGCGGACGCGGTGCGTCGTGAGCGTTTCAAAGCGATGGCGGCCGAAGGCGTGAAATATCTGGAAGAAAACCGCGAAAAAGACGGTGTGAACAGTACTGAATCTGGTTTACAGTTCCGCGTTCTGACGCAGGGCGAAGGCGCGATTCCGGCGCGTACCGACCGCGTACGCGTGCATTACACCGGTAAGCTTATTGATGGCACCGTATTTGACAGCTCCGTCGCGCGCGGCGAGCCGGCTGAATTCCCGGTAAATGGCGTGATCGCCGGCTGGATTGAAGCGCTGACTCTGATGCCGGTAGGTTCCAAATGGGAACTGACTATCCCACAGGAGCTGGCCTATGGCGAGCGTGGGGCCGGGGCATCTATTCCGCCATTCAGCACCCTGGTGTTTGAGGTGGAACTGCTGGAAATTCTGTAAGCGCCCCGGGTTTGCCGGATGACGGCGTAAACGCCTTATCCGGCAACC [...]
+GTCTATGATACGACGATCCTGTTATCAGGACTCATCGATATTAGGTAAGAATCGGCGGGATGAATACTAAGATTTAAATACAATGTTAATTTTATGTTTAAAATGAGTGTTATATCACTTTGATAATGCGAATTAGCTCACAAAAATACACGTAACGACGCCATTTGCAAAATAAAATATTGGCATCTACTGAAGTCAGGGTTGCCGGATAAGGCGTTTACGCCGTCATCCGGCAAACCCGGGGCGCTTACAGAATTTCCAGCAGTTCCACCTCAAACACCAGGGTGCTGAATGGCGGAATAGATGCCCCGGCCCCACGCTCGCCATAGGCCAGCTCCTGTGGGATAGTCAGTTCCCATTTGGAACCTACCGGCATCAGAGTCAGCGCTTCAATCCAGCCGGCGATCACGCCATTTACCGGGAATTCAGCCGGCTCGCCGCGCGCGACGGAGCTGTCAAATACGGTGCCATCAATAAGCTTACCGGTGTAAT [...]
+NODE 1446 1911 75842 75031 0 0
+TCGCTACGCCTTATCGGCGTGCTGGCGCTGATTCTCACTTCCTGCGGTCTGGCGGCCATTAATGCCGACGATATCTGGTATTTCGCCTCCGGCGGCGTAATTGGCAGCCTGTTAAGCACCACGCTGCAGCCGTTGTTGCATAGTAGCGGCGGAACGATAATGCTTCTCTGTATTTGGGCTGCCGGGCTGACGCTCTTTACCGGTTGGTCCTGGGTTAGTATCGCCGAAAAATTAGGCGGCTGGTTGCTTAATATACTGACCTTCGCCAGCAACCGTACCCGGCGTGATGATACGTGGGTTGACGACGAAGAGTATGATGACGAATACGATGAAGAAACCGACGGCGTGCAGCGTGAATCTCGCCGGGCGCGTATTTTGCGCGGCGCGTTGGCGCGTCGTAAGCGACTGGCTGAAAAATTCAGCAATCCACGGGGCCGTCAGACCGATGCCGCGCTCTTTTCCGGCAAACGGATGGATGATGACGAGGACATT [...]
+CAGGCGTTGATTCGGGCATGACACTCGGCGTGAACAGCGGTTCGTGCGGACCTTCATCAACCAATACTTTCATTGGCGAGAAATCCAGATCGTCCAGTGAGAACGGCTGCGCGCCAGCGGGTTGCTCGCCGGAATATCGCTGCTGTTGCGAAGCGGCAAACTGGCGGGCTAATTCAGCTTCCGCAGCGGTATCGTCATCTTCTGCCTGTTGAGTATCATGCTGATACGTCTCACCATAACGATGCTGCTGCGACTGCGCAAACTGACGGGCTAACTCGTCCTGATGCATTGCATCTATTTCTTCATCGGTTAGCTGCGCGCCCGTCTCGTACTGATTGCGCTCCGCCTCGCGGGCTTTTTCTTCTGCAATCCTCTGTGACGGCAGCTTAATACCGTACGACGCCAGTTCCCGTCGGGTCGGCACGCGAACGCGGTTCGGACGCGGCAGTTGCGGGCCAATCCCCTCTTTCACCTGCGGACGCGGCGCGCCGC [...]
+NODE 1447 161 2608 2608 0 0
+TTGCGGCTGCTGATACTGCGGTTGCGGTGCTATCGGCTGCTGCGGCTGCTGGTACTGTGGCTGCGGCGCTACCGGCTGTTGCGGCTGCTGATACTGCGGCTGCGGCGCTACCGGCTGTTGCGGCTGTTGATACTGCGGCTGCGGTGCTACCGGCTGCTGAA
+GTAGCGCCGCAGCCGCAGTATCAGCAGCCGCAACAGCCGGTAGCGCCGCAGCCACAGTACCAGCAGCCGCAGCAGCCGATAGCACCGCAACCGCAGTATCAGCAGCCGCAACAGCCGGTAGCGCCGCAGCCACAGTATCAGCAGCCGCAGCAGCCGGTAGC
+NODE 1448 51 2874 2874 0 0
+GCTGAACTTTGTCGTCAGCTCTAAAGCGCGCGCTAAAATTCGTCAGTTGCT
+CCAGGCGGCGTTGGGACGCGCGCCCGGCGCGGTAATAATTTCGACGGTCTG
+NODE 1449 1273 47195 46568 0 0
+CGATCTGCCGGAATTACTGCGTACCGTGACCCGGGCGCTGGAAGCCCGCAACGGGGGATAATGGCCCCCGCTGCGCCGGATTAGGGTTCGTGACGGTTGGCGGCCAGCAACGGTTTTCCCGCCAGCAATAGCCAGGCGGGGAGCATCACAATGCAGAGCAGCGGCAGCAGATTGGTATCCGGTACGACGACTGCCGCCATAAACAGACTGAGCCAGCCGTCACGCGTCACTACCAGCACTAAGCCAAGAATCGCGCAGGAGACGGTAATCGCCGCGGGTACGGCCTCAACATGGGCATGGAGCATGAGCCCCAGCGCCGCGCCGATAAACACAGCCGGAAAAATGCGCCCGCCGCGAAAGCCGCTCGCCGCCGCGATGACCAGCGCGGCGAGTTTGACGACGGCTAAGGTAAAATAATCTCCCGCGCCCAACGTCTGGCTAAACGCCATTTGTTGCATTTCGTCCAGGCCTTTAAACAGGGTAAGCGGCCCG [...]
+AAAGTCGCGTCGGTTTTTCAGCAATTTCTTTGGCAACGACTGCCCGCCAGCATCGGCATCGCTTATGATTCGCCGTTCTGGATAGTGGGTATGCTCACGCTAACCGGGATCGTGGTGGGTTTGATTATCCGTTACAGTCCCGGACACGCTGGCCCCGATCCGGCCATCGAACCGTTAATCAGTATGCCGGTCTCGCCATCTGCGCTGCCCGGGCTGCTTCTCGCCTTAATCATCGGCCTTGCTGGTGGGGTAAGTTTGGGGCCAGAGCATCCGATAATGACAATAAATATCGCGCTGGCGGCGGCTTTCGGCTCCCGCCTGTTTCCGCGTATCACGGCGTTAGACTGGACGATTCTGGCCTCAGCGGGCACCATCGGCGCGCTGTTCGGCACGCCCGTCGCCGCAGCGCTGATTTTTTCGCAAACACTTAGCGTCTCTAACGATATTCCCATGTGGGATCGCCTGTTTGCGCCGTTAATGGCGGCAGCGGCG [...]
+NODE 1450 1406 69831 69234 0 0
+TGATTGTCAGCGGCGCGCGCAACGGCTGCATCCCGGGTAATGCCAACCCACGGCGCTTTTAGCAGGATCAGCACTTCTTTTCCCTCCTCCAGGCCGAGACGCTCGCCGCTTTGCGCCGTCAGCGCGACTTTGAGCCGCGTTTTGCCGTCGGCCAGCAGCACGTCGACATGCTGTTGCACCTGATCGCGATCGCGGGCGGTAATGGTGCCGAACCACTGATTTCGGGCGCTGGTTTGCAGTGAAAAGCGGGAGATAGCGGCCAGCAGACTGTCAAGCGGCAGGGCGTCATCGTCGCTTAACACATCGAACGCTTTTTGCTGAATTTGGCCCAGCAAATCGTAAAGCTGGATCAGACGCTGGCCATAGCGGGTTAATACCGCGCCGCCGCCGCCTTTGCCGCCCGTTGCGCGTTCAACCAGCATATGTTCGCTAAGCTGGTTCATGTCGTTTATCGCATCCCAGGCGCTCTTATAGCTGATTCCCGCGTCTTTC [...]
+TTTCGCGCGTCGTGGTATCCACCGCTTTTTTATCGGCTGCGTAATCCATCCATTTCTGGTCAGCAGAGATGAACAGATCCGCCGGCGCGCCCGCTTCTATCTGGCGCGCCAGCGTTGAAGAGGAGGCGAATGAGGAAACCACATCCACATTTTTCTCTTTTTTATATTCTGCCGCAATGTCTTGCATCGCGTTCGTTAGCGACGCGGCGGCAAATACGGTGATCTTGCCTTCATCCGCCAGCGCATGACCAGCGATGACGAAAGATAATGTCGCCCCTGCGACCAGGCGTAACCAGGAATGCGCCATCTGTAACTCCTTGTGCGTTTCGTTATGTAAACGATAATATAACGATAATCTCAGGGGTTTCCCAGCGGTTATTCATACCCATTAACGATTAAACACAGAAAATATCGGCAGGAAAAGCAGGATCTTGAGTAACAAAAACGCCCGACTGAGCGGGCGTTTGGGGAAATCAGCGGTTCTGTCTGGAC [...]
+NODE 1451 51 2277 2277 0 0
+CTTTGATCGGCCATTGTCGTGATCTCTTCCTGCTGTGCCTTATGGTTCTGC
+GCACGGCTGAACTGAACGCAGATAAAGACAGCGGCCAAAGCGTACCGCTGG
+NODE 1452 907 59403 59177 0 0
+GGCGCGGGAGAGTCTTTCGGCGCTGACAAGATTTGAAGACGACATGGTGATGGCGCCTGAGATGCGTTTCAGTAAACGTGAGAAAGAGATTCTGAAGTGGACGGCGGAAGGGAAGACCTCATCGGAGATCGCCATTATTCTGTCGATTTCTGAAAATACCGTTAACTTCCATCAGAAAAACATGCAGAAGAAATTCAATGCGCCAAATAAAACACAGATTGCCTGCTACGCTGCGGCGACAGGTCTGATATGACGTGCTGACGATGCTTCGCGCCAGACGCGAAACCGGCTGAAAGCGATGCTAACAGCCGGTTTTTTACTACTGGCGGTAAGCCTGTTTAATTTGCTTAACCGTACTGGAAAATACCGCCGCTTGTGCTTCATCATCCATCTGCGCGATCTGTTTTTCCATTTTAAGAATCACGCGCCCTGCATCGGCCTGGCCCATCGCCTGCAGCATCAGCGTTAACATGGCTTTCAGGCAGTTGACTT [...]
+CCAACGTTGTAGCCCCTTCTGACGGCGCTGTCCCGGGCTGCTATTTCATAATGGTGACAAAAATTTCACGTTCCGCTGTCTAAACACTAATTAGGGAATCAACTTTGTAACAATAATTAACGAGTAAAATACGCGTAATAAACAAAGAATGAAGAAAATATATGCATCACGCAGCAACGTTTATTTTGTGGGTAACCCCTCCGCTTTTTGATCAAAAAACAACCACTGCTATTTTTAGCGTAGCTTATGGTATACTCCGCCGCCTTAACATCTGCTATCGCACATTTTCACTGAAACATAACGAGGAAAATAAATGAGTACGCCTGATTTTTCCACCGCTGAGAATAATCAAGAACTGGCTACTGAAGTCAACTGCCTGAAAGCCATGTTAACGCTGATGCTGCAGGCGATGGGCCAGGCCGATGCAGGGCGCGTGATTCTTAAAATGGAAAAACAGATCGCGCAGATGGATGATGAAGCACAAGCGGCGGT [...]
+NODE 1453 346 17919 17919 0 0
+AAAATCGGGCGATGTGTTTGCACGGGTGATGTCGCGAATAAATGCGCTCACATCGTCCATTACCTGATGCGACAAGGCGGCATCGAAGGTGGCGCTATCAGCATCACAGAACCCGTGCCGCGCATCGTACATTTTACACTGCACCCGGGGTCGCTTTTCCAGCGCCTGTCGCATGGCGAGGGGATCAAACGCCGGCTCATAACGCGCGATAATAACCAGTGTCGGACAGAGAGGCGCAAGATGAAGGTACTGGCGTATACGGGAACCGTAATAGCAAATGACGCCATCGCATAACCCACTGGCTGCACTTAGCCATGCGAGCGTTGCGCCGACGCTATACCCTACG
+GGTTATGCGATGGCGTCATTTGCTATTACGGTTCCCGTATACGCCAGTACCTTCATCTTGCGCCTCTCTGTCCGACACTGGTTATTATCGCGCGTTATGAGCCGGCGTTTGATCCCCTCGCCATGCGACAGGCGCTGGAAAAGCGACCCCGGGTGCAGTGTAAAATGTACGATGCGCGGCACGGGTTCTGTGATGCTGATAGCGCCACCTTCGATGCCGCCTTGTCGCATCAGGTAATGGACGATGTGAGCGCATTTATTCGCGACATCACCCGTGCAAACACATCGCCCGATTTTCAGCTTTAGTGGAGACTTTTTTCAACGACCTGTTCCAGTTTTTTCAAAGT
+NODE 1454 47 1701 1548 0 0
+TCCGGCTCCAGCAGGCACTCGCCGCGGCGAAGCTGGATAAGCATGTG
+TTTCGATAGCAGGCACCACGTCATCCTCCTGACCATGCCACAACAGA
+NODE 1455 3311 199196 197481 0 0
+ACCTGTTTATGGGCCGCAGGCGTGCGGCATCGCATTACGCCAGAAGCGTTGTCGGCGACGGTAGCGTTTTTCCGACAGTATCTTTAAACGCGGAGTATGCTTACACCCTGGGCTTCAAGCTGTTGCAAAACCTGCGGATTGGCATTTTTGCCGGTAATCAGCATAGCGATCTGATCGGCGCGGCTGAACAGCATTCCCGCGCGCTCGCCAATTTTACTGCTATCGACCAGCGCGACCAGTTTCCCGACGACGCTGAGCATTTTTTGTTCCGCCATGGCGGTTAGCATATCGGTTTTGTACAGGCCATCCGCGGTTAAGCCCTTTCCGCTGGTAAACATCCAGTGGCCAGCATAGAGACTGTTTTCACTTCCCTGCGGGCTCAGGGTAATCGACTGGCTTTTATTATACTGACCACCCATGATAATCACGCTGTCATGCTCTTGATCGATCAGATAATTCGCCAGCGGCAGATAGTTGGTAATGATCTGTACC [...]
+GGCCTCAGAGAGTTCGGCGACAAACATACGCACGCCCTGGGTGATGATGAAGATCGCCACCGCAAAGGAGAAACCGGTTTGCAGGATATAGATTGTCCAGTGGGTTTTACCCGCCATCGCCTGTACGGTATCGATACCAAAGGAGAGCAGAATGGCACCAAAGAAGATGGTCATTACAATCGCCGTGGAGACGATGTTGTCATGGAAAATGTTCAGCCAGCCCGGCAGTTTGAGGTCTTCAACGCTTTCCTCTTTTTTGCCCAGGAACGGCGCGACTTTATAGGCAATCCAGGAAGCAAACTGCTGCTGGTGACCGATGGAGAAACCGCAGCCGTCCGTCACTTCCTGAGTCGGCTTGTACATCATGTTGGAGGTAATACCCCAGTACAGGGAAACCAGTATCGCCGTGCAGATAATGGTGGTCCACATGGAATAGCCGAAGATATAGAAAGAGACCGCAATCAGCCCCGCCTGCTGGAACATGATGTGCCC [...]
+NODE 1456 4033 218526 214857 0 0
+CAGTGCTTTCTCGTAAATACCTAATGGATGATTACGCATGCTTTTCTCCCCAAATGGCGTCAATTTGGGCGTGGAATTCGGCGGCGACCTGCGCCGGATGGGCGGCACCTGCCAGCGCACGTCCGGCGATAAATGCCTTAACGTTAATGTCGCGGAACAGCGGCAGATCCGCTGGGGTAATGCCGCCGGTAATCGATAGTTCAAGGCCGATGTCGGACAACGCCTTCATGCGTGTTAGGTCCGCTTCTCCCCACTGTTGCCCGCTGGCCTGCGCATCGCGTCCGCGGTGGTAAATCGCCTGGCGAACCCCGACGCGATACCAGTCTCGGGCGTCGTCCAGCGTCCAGTTGCCGAACAGTTCCATTTGAATTTCACCGCCACAGGATTGTGCGACGGCGTGGCCTTTCTCGACGGTTGCGAGCGGCGCAGCGCAGATGATAGTCATCCAGTTGGCGCCAGCGCTAAAAGCCTGCTGCGCCAGGGTTTCACCGG [...]
+TCCAGCGGCTTGTCGATCAGCAAGCTGTTTATGGCCGGGATCGCACCGGGCATCATGATGGGCGCGGCGCTTATGCTCACCTGGTGGTGGCAGGCCGGGCGATTAAATCTCCCTTCTCAGCCCAAAGCAACACCGCGTGAAATCTGGCAATCATTGGTTTCAGGTATCTGGGCGCTGTTTTTACCGGTGATTATTATCGGCGGCTTCCGTTCCGGACTTTTCACGCCAACGGAGGCAGGGGCGGTTGCCGCCTTTTACGCCCTCTTTGTCGCCGTGGTTATCTATCGGGAATTAACGTTTTCCAGTCTCTACCACGTGCTGGTCAATGCCGCCAAAACGACGTCAGTCGTCATGTTTCTGGTGGCCGCGGCCCAGGTATCCGCCTGGCTGATTACGATCGCGGAATTACCCATGATGGTGTCAGATTTGCTGCAGCCGCTGGTCGACTCTCCGCGACTCTTATTTATCGTCATTATGATCTCAATTATGGTC [...]
+NODE 1457 47 119 119 0 0
+GTACGCACCGGCAGCCGTTGTTTGCCCTTACGGCGAAAATTCAGCTT
+CTCGCCACTGGCCACGCCGGAAGCGCTGAACCAGAGCTGGTCTGTCG
+NODE 1458 358 42772 38613 0 0
+CTTGAGAACCGGGCGCTGAAAGACGTTATCGAAAAAAAGCTTTAAAACCAGCCTTTAAGCGTGAGCTGGTCACTCATCTGATAACGGCATTCGGACTCAGTATCCGTCAGGCCTGCCGGAGCCTGAACCTGAGCAGAACGGTTTATCATTACCGTCCGGATAACACACGTGACGAACCCGTTATTACCGCACTGCAGGCAGCAGCTGAACGGTATCCACGATACGGTTTTCCGAAGCTTTTTCAGGTTCTGCGGCGGCAGGGATACATGTGGAATCACAAAAGGATCCACCGTATTTATTGTCTGCTGAAGCTGAATTTTCGCCGTAAGGGCAAACAACGGCTGCCGGTGCGTAACCC
+CAGCAGACAATAAATACGGTGGATCCTTTTGTGATTCCACATGTATCCCTGCCGCCGCAGAACCTGAAAAAGCTTCGGAAAACCGTATCGTGGATACCGTTCAGCTGCTGCCTGCAGTGCGGTAATAACGGGTTCGTCACGTGTGTTATCCGGACGGTAATGATAAACCGTTCTGCTCAGGTTCAGGCTCCGGCAGGCCTGACGGATACTGAGTCCGAATGCCGTTATCAGATGAGTGACCAGCTCACGCTTAAAGGCTGGTTTTAAAGCTTTTTTTCGATAACGTCTTTCAGCGCCCGGTTCTCAAGGCTCAGGTCGGCAAACATCTGTTTGAGGCGTCGGTTCTCGTCCTCAAGAT
+NODE 1459 4 1317 66 0 0
+TAAT
+ACTC
+NODE 1460 2845 128689 127274 0 0
+GTGTTTTTAGGCGCAGGCGTCTTTTCGTGGTTAAGTCTGGAGCCGGTTATTTTGCAGCGACTGCGTAGCTGCGGCGAATTACCGGCGGTGCTGCGTACGTCGCTGGGTATCCAACTGGCGCCCGCGCTGGTCGCCTGTAGCGCCTGGCTGAGCGTCAATGGCGGGGAGGGCGACACGCTGGCGAAAATGCTATTCGGCTACGGTCTGTTACAACTTTTATTTATGCTGCGATTAATGCCCTGGTATTTATCACAACCGTTTAATGCTTCCTTCTGGAGTTTTTCGTTCGGCGTTTCCGCGCTGGCGACCACGGGGTTACATCTTGGTCACGGTAGTGAATCAGGGCTTTTCCATATTCTGGCCGTCCCGCTGTTTATTTTCACTAACGCTATTATCGCCTTATTGCTGGTGCGTACATTTCTATTGCTGGTGCAGGGGACGTTGCTTATTCGCACTGAGCGCGCTGCACTGTTGAAAACGGAGGAAAAAAAT [...]
+ATGCGGATAATCCCCCATTCTCTTGCCGCCGCAATGCTGGCGGGAATACTGCTACGCTTCGGCCTGCAGGCGTTCGGGACGCTCAACGGAGAGTTTGTCATGTGCGGCGGTATGCTATTGGCGTGGCTACTCTTTAAAGTATTCGCGCCCCGCTATGCCGTTATTGCTGCCATGGTAATGGGAATAACGGTGGCGCTCATCCAAGGTAAGGTGGCGATGAGCGGTATTCATTTCGCGCCGGTGTGGCCCACCTTCGTTCCCCCCCACTTTTCATTCGCTCAAAGCCTGAGCGTCGCGGTACCGCTCTTCCTGGTGACGATGGCATCGCAAAACGCCCCCGGCGTCGCCACAATGAAGGCGTCTGGCTATCAGCTTCCTGTCTCTCCGTTAATGATTTTTACCGGGTTGCTGGCGCTGCTGCTTTCGCCATTTGGCGTTTATTCTATCTGCATTGCCGCCATTACGGCCGCCATTTGTCAAAGCCCGGACGCA [...]
+NODE 1461 4240 222968 221408 0 0
+AATCACTTCCATCGCTGTGCGTGCGCAGTACAGCTTAGCCAGCGCGGCGCTGGTACGCAGTGACTCTTCCCGATCGGCCTGCCAGGCGACTTTCAACACCATATTGCGCATGTTTTCGATTTTGATGGCCATTAACGCCAGCTTTTCCTGGATCATCTGGTTATGGCCGATGGGTTTACCAAAGGCGATACGCTGGTTGGCGTAACGGGCGGCATCTTCAAATGCGCATTCGGCGAAACCTGTACTGCGCGCCGCATTAATCAAACGCTCCATCTCAAAATTGTACATGACATTGAGGAAACCCATACCTTCTTCACCGACCCGGTCGCTTTCGTCCACCTCGACATTATCGAGATAAACTTCGCATGTACTCAACATGTGCCAGCCAATTTTGTGCAGCGGATTAATCTTTATGCCCGGTTTATTTGAGTCCACCCACCAAAGCGTGAACGCTTTTTTAGGATCTTTTGGCTCCGTATCGCGCGCCAGAAC [...]
+TCGATGAATTAACGCCAGCAGCAAAACTGGTTGGCGCTATCAACACCATTGTTAACGATGACGGCTATCTACGCGGCTACAACACGGATGGTACGGGCCATATTCGGGCAATTAAAGAAAGCGGTTTCGATATTCGGGGAAAAACCATGGTGCTGCTCGGCGCGGGAGGCGCGGCTACCGCCATTGGCGCCCAGGCAGCCATTGAAGGCATTAAGGAAATTAAACTGTTTAACCGTAAAGATGACTTTTTCGAAAAAGCGGTTGCCTTTGCGAAGCGGGTGAATGAAAACACCGATTGCGTCGTTACCGTCACCGATCTTGCCGATCAGCACGCTTTTACTGAAGCGCTTGCCAGCGCAGATATTCTGACGAACGGCACCAAAGTTGGCATGAAACCATTGGAGAACGAATCCCTGATCGGCGATGTTTCCCTGCTCCGCCCTGAATTGCTGGTCACCGAATGTGTTTATAATCCGCATATGACAAAGTTAT [...]
+NODE 1462 192 9625 9446 0 0
+GAACATCGGGATAAAGCCAGGAATAATCAGGATCGAGGAGCCGCAGGCAACCAGGATGCCAACCGCAATCAGCTGGCCGATGGTGCCCCACATAAAGCCCCAGACCACCGCGTTAGGCGCGAAGCTATAAATAGCCGCACAGTCAATCGCCAGTACTGCGCCCGGAATCAGACGCTGGGAGATACCGTTAAA
+CTGTGCGGCTATTTATAGCTTCGCGCCTAACGCGGTGGTCTGGGGCTTTATGTGGGGCACCATCGGCCAGCTGATTGCGGTTGGCATCCTGGTTGCCTGCGGCTCCTCGATCCTGATTATTCCTGGCTTTATCCCGATGTTCTTCTCTAACGCCACTATCGGCGTGTTCGCTAACCACTTCGGCGGCTGGCG
+NODE 1463 406 24934 24625 0 0
+TGAGCCGTATTAAGGTCCGTGAAGCCGCTATGCGCGGTGAAATTCCGGGTCTGAAAAAGGCTAGCTGGTAATTGTCACCAATTGAATCACGGGAGTAAAGACAGATGAGCATGCAAGATCCGATCGCGGATATGCTGACCCGTATCCGTAACGGTCAGGCCGCGAACAAAGCTGCGGTCACCATGCCTTCCTCCAAGCTGAAAGTGGCAATTGCCAACGTGCTGAAGGAAGAAGGTTTTATTGAAGATTTTAAAGTTGAAGGCGACACCAAGCCGGAACTGGAACTGACTCTTAAGTATTTCCAGGGTAAAGCTGTTGTAGAAAGCATTCAGCGTGTCAGCCGCCCAGGTCTGCGCATCTACAAACGTAAAGATGAGCTGCCGAAAGTTATGGCCGGTCTGGGTAT
+GCGCAGACCTGGGCGGCTGACACGCTGAATGCTTTCTACAACAGCTTTACCCTGGAAATACTTAAGAGTCAGTTCCAGTTCCGGCTTGGTGTCGCCTTCAACTTTAAAATCTTCAATAAAACCTTCTTCCTTCAGCACGTTGGCAATTGCCACTTTCAGCTTGGAGGAAGGCATGGTGACCGCAGCTTTGTTCGCGGCCTGACCGTTACGGATACGGGTCAGCATATCCGCGATCGGATCTTGCATGCTCATCTGTCTTTACTCCCGTGATTCAATTGGTGACAATTACCAGCTAGCCTTTTTCAGACCCGGAATTTCACCGCGCATAGCGGCTTCACGGACCTTAATACGGCTCAACCCGAACTTCCGCAGGAAAGCGTGCGGACGACCAGTTTGACGGCAGCGG
+NODE 1464 51 142 142 0 0
+ACAGGCGGCGTTGGGACGCGCGCCCGGCGCGGTAATAATTTCGACGGTCTG
+TCTGAACTTTGTCGTCAGCTCTAAAGCGCGCGCTAAAATTCGTCAGTTGCT
+NODE 1465 18 2141 2120 0 0
+CAAAAACAAGCCAGTACA
+AATGATCTTAATGCGCCC
+NODE 1466 19 1251 1251 0 0
+TAATGGCGAGGACATTATC
+TCGCGCAGACCTCCTGACG
+NODE 1467 46 2469 2469 0 0
+CAGCTTCATGAAGCGAGACGGCGATATTATCAAGGGGTTCAACTTT
+GCAATATTTTGCTGAATGTAATATTACGGAAATCTGCGTTTGAAAA
+NODE 1468 1 98 52 0 0
+G
+G
+NODE 1469 41 4085 592 0 0
+TGGATCAGGGTAACAACCATTTTGATGTTGTCGCCCGGCAT
+AATGGACGACGGTCTGCGTTTCGCAATCCGTGAAGGCGGCC
+NODE 1470 6223 316922 312001 0 0
+CAGACACAGCCAGCCGCCATAATTCTTATTTCCTCTTTTATAAAAATAACCACATAATAATCATGGGTTTATTATAATGTTCAACAATACGCGACTCTCTCGCTGGTGGGCGTTGTTTGCGCTTACCGCGACCATCATGCTTGCCCTTCCCGCGCAGGCGAATACGTGGCCTCTTCCGCCCCCCGGCAGTCGACTGGTGGGAGAAAATAAATTCCATGTCGTTGAAGACGACGGCGGCTCGCTGGAGGCGATCGCCAAAAAATATAACGTGGGCTTTTTAGCCCTGTTACAGGCCAACCCCGGCATTGATCCTTACGTGCCACGCGCAGGCAGCGTGCTAACGATTCCGCTGCAAACGCTGCTACCGGACGCGCCACGTGAAGGTATCGTCATTAACCTCGCGGAATTACGGCTTTACTATTATCAACCGGGGAAAAATACGGTCACGGTCTACCCTATCGGGATTGGCCAACTAGGCGGCGATACCCTGAC [...]
+GGAGGAGCGCGAGATACTGGCGCATCCGCTGGTTGGCGGGCTTATTCTGTTCACGCGTAATTACCATGACCCGGAACAGCTGCGCGAATTAGTGCGCCAGATTCGGGCGGCATCGCGTAACCATCTGGTGGTGGCCGTCGATCAGGAAGGCGGGCGCGTACAGCGTTTCCGTGAAGGGTTTACCCGCCTGCCCGCGGCGCAATCTTTTTTTGCGCTGCATGGGCTGGAAGAGGGGGGACGACTGGCGCAGGAGGCAGGGTGGCTGATGGCCAGCGAAATGATCGCGATGGATATTGATATCAGTTTTGCGCCAGTGCTGGACGTCGGGCATATCAGCGCGGCAATTGGCGAGCGCTCCTATCATGCCGATCCCGCAAAAGCGTTGGCAATGGCAACGCGCTTTATTGACGGCATGCATGACGCCGGGATGAAAACGACCGGTAAGCATTTCCCCGGCCACGGCGCGGTCACGGCGGACTCCCACAAAGAGAC [...]
+NODE 1471 51 4127 4127 0 0
+ACCCGCTCAGGCTAAACACCATTAATAACGCCACAACAGGCGCAAACCAGC
+TGTTTTGATAAAGAAGGCGATCAGCGCAAAGCGTTTGTCGATTTCCTGCAG
+NODE 1472 100 6292 6292 0 0
+GCTTACACTGACGGGTTTTTGCATGAAGAGATGAAACTGACCGATAAGCCGCTTTCTTTTGGACATAGCGTCGTGGACAGTCATTCATCCTGCCGCCCGG
+GGCTTATCGGTCAGTTTCATCTCTTCATGCAAAAACCCGTCAGTGTAAGCTGGTGGGTTTATGCTTTTACAGGGCGGCAGGATGAATGACTGTCCACGAC
+NODE 1473 15 1183 1183 0 0
+ATGACTGTCCACGAC
+GCTTACACTGACGGG
+NODE 1474 8 212 212 0 0
+ACTATACC
+ACCCGCCA
+NODE 1475 3 95 95 0 0
+CAA
+AAA
+NODE 1476 39 1571 1571 0 0
+AAGAAAGCGGCTTATCAGCCAGTTTCACCTCTTCATAAA
+GTCGTGGACAGTCATTCATCCTGCCGCCCTGTAAAAGCA
+NODE 1477 587 30776 30630 0 0
+CCTATCTCCAATCCCCTTAAAACACCATCGGGAAAAATAGAAATCTATTCTGAACGACTGGCCAATATCGCAAAAACATGGGAACTGAAGCCTGATGAAGTCATCGATCCTTTACCCATTTACACTCCAGGCTTTAATGGCTGGGAAGATCCAGCCCGTCGCGAGTATCCATTGCAAATGACCGGGTTCCACTTTAAAGGCCGCGTGCATTCCAGCTACGGCAATATTGATGTTCTGAAACAGGCCTGCCGACAGGAGATTTGGATAAACCCTATTGATGCCCGGGATCGCGGAATCAAAAACGGAGACACCGTTCGGGTATTTAATCAGTATGGCCAGACATTGATTCCCGCAAAAGTCACACCTCGTATCATGCCTGGCGTTACTGCTATGGGCGAGGGAATGTGGCTGCATGCCGATATGTTTGGTGACAAAGTCGACCACGGTGGCTCAATTAACATTCTGACAACACATCGCACTTCACCGCTGGCA [...]
+TACCTTTTCGACCTGAACGAGATTACTGTGCGAAGGATTAGCTTTTGCCAGCGGTGAAGTGCGATGTGTTGTCAGAATGTTAATTGAGCCACCGTGGTCGACTTTGTCACCAAACATATCGGCATGCAGCCACATTCCCTCGCCCATAGCAGTAACGCCAGGCATGATACGAGGTGTGACTTTTGCGGGAATCAATGTCTGGCCATACTGATTAAATACCCGAACGGTGTCTCCGTTTTTGATTCCGCGATCCCGGGCATCAATAGGGTTTATCCAAATCTCCTGTCGGCAGGCCTGTTTCAGAACATCAATATTGCCGTAGCTGGAATGCACGCGGCCTTTAAAGTGGAACCCGGTCATTTGCAATGGATACTCGCGACGGGCTGGATCTTCCCAGCCATTAAAGCCTGGAGTGTAAATGGGTAAAGGATCGATGACTTCATCAGGCTTCAGTTCCCATGTTTTTGCGATATTGGCCAGTCGTTCAGAATA [...]
+NODE 1478 1159 71857 71541 0 0
+TCAGGTGGCGCGACCATTTTCGTGATTGTTGGAATCATGTTTAGTCTTAATGCCTTATTTATTTTCTACCTGAATATCAGTTCTGGTCTATTCAGGCCGTTAATTTTTATGGTGGTAAGCGGGATCATCGCTGCGATAGTTGTCAATAGCCTGGTGGCCAGTAGCACTCTGGTCTGGATAGTCAGTGTACTGACGGTATTGGTGTGGACATTGATTACAGCACTAGAAAAATCGACACTTCATGGTTATGCCCGCATGTTATACCACAGCGAGTTTTCATCCCTGTCTCGTTGCGCTTTATTTGGCGCGCTGACGCTTTACCTTGGCATTATTAATGCTGTGGTTACGCTGTGTCGTTATATCATTTTGATGATTCTGGAAATACTATTATCTTTCAGGCCGTAGGTGTTGCAGGTTTTTTATTCAGGTTGGTGATGATGGGTATAATGAGTAAATTATGTGGCAAACAATTTTGGTTAGCGTTTTGTGAAG [...]
+ATCAACTGCCCTTTTTTCACCAGCTCCGCCAGTGTTTTTCCTGTTAGCCACGTCATCAGATTCATGGGCTTATCATTTCCTTGTCTGTGAGGTGAGATATTTTTGTAATGCGACTCGCACTAATCGACGCCCTAGGCAGAAACGAATCATCATCGTAAACGTTTCGCCATTCATCACCCAGCGGCAAAGCACAACCATAATAATCGCGATAACCAGATCACTCTTTAGTTCGCTATTTTGATTGCACAACACGTCAAATAATCCAGTACCGCAGAGCATAATATTTAATAAAAACAGTAAAACGCAGAGGCGCAACCCCAGGATATAACCCTTGGCAATAAGCCATACCTCAGCCATAACACATAGCATCATACCTATAGCACTGCCCAAATAAATGATTATATTTAGTGGCCAATATAGAATAAACTTATCAAAAACAAAATGCGCACTGCACACACCTCCCACAAGAAGCATAAAACTAAACGCGCAAAC [...]
+NODE 1479 2593 150990 149864 0 0
+CGCATGAGCGATTTCTGGCATTGCTTGATCCCTGGCTGGATAGTCTTCCGGGTGCAATACTGCACTGCTTTACCGGTTCACGCCAGCAAATGCAGGCCTGTGTGGACAGAGGGCTCTATATCGGTATTACCGGGTGGGTTTGCGACGAACGACGCGGGCTTGAGCTACGTGAACTCTTACCGTTTATTCCAGCGGAAAAGCTACTGATAGAAACCGACGCGCCGTATCTGTTGCCTCGCGATCTTACGCCGAAACCAACGTCACGACGCAACGAGCCCGCGTATCTGCCTCACATCCTGGAACGCATTGCGCTATGGCGTGGTGAAGATCCGCAATGGTTAGCGGCGATGACAGATGCCAACGCCAGAACCTTATTTGAGGTCGTATTCTGAACGATCGCTAAATCTTGCGAAAACCGGTGTTTTTTACGCTCTGCTTCACTTCTTTATTGAGTAAATTAAGCAGTAACATCGAACGCGTTTCGCCATCCGG [...]
+GATAGCCAGCTCATCCCAAATCGCATCAATACGCGCGGTAACTTCAGGATCTTTAACAATAGGGCGACCCCACTCGCGTTGGGTTTCGCCCGGCCATTTGTTTGTGGCATCCAGCCCCATTTTTGAACCCAGCCCGGAGACCGGCGAGGCAAAATCCAGGTAGTCAATCGGCGTATTTTCAACCAGCACCGTATCCCGCGCAGGGTCCATACGGGTGGTAATCGCCCAGATCACATCATTCCAGTCGCGTGCGTTAACGTCATCATCGCAAACGATAACAAATTTCGTATACATAAACTGGCGCAAAAACGACCAGACGCCCATCATGACGCGTTTCGCATGACCAGCGTACTGCTTTTTCATCGTCACTACCGCCAGGCGGTAAGAACACCCTTCCGGCGGCAGATAAAAGTCGACGATTTCCGGAAACTGTTTTTGCAGAATAGGCACGAAGACTTCATTGAGCGCCACCCCTAATACCGCAGGCTCATC [...]
+NODE 1480 51 2200 481 0 0
+TGCTTACCATGCAGGAAATGCGTGAGCGCATGAAGCATGGAAAATTTGGGG
+ACCTCATCATCACCGCCGCAGCCGCTCACCTCCCGACTTTCCCCTGCGCGT
+NODE 1481 1357 78159 77808 0 0
+CTTTGGGCCGGTAAAAGACTACGAGTGCCTGTGCGGTAAGTACAAGCGCCTGAAACATCGTGGTGTTATTTGTGAGAAGTGCGGCGTTGAAGTGACCCAGACCAAAGTACGCCGTGAGCGTATGGGCCACATCGAGCTGGCGTCCCCGACTGCTCACATCTGGTTCCTGAAATCGCTGCCGTCCCGTATCGGTCTGCTGCTCGATATGCCGCTGCGCGATATCGAACGCGTACTGTACTTCGAATCTTATGTGGTTATCGAAGGCGGTATGACCAACCTGGAACGTCAACAGATCCTGACTGAAGAGCAGTATCTGGACGCGCTGGAAGAGTTCGGTGACGAATTCGACGCGAAGATGGGTGCGGAAGCTATCCAGGCCCTGCTGAAGAGCATGGATCTGGAGCAAGAGTGTGAAACTCTGCGCGAAGAGCTGAACGAAACCAACTCCGAAACCAAGCGTAAGAAGCTGACCAAGCGTATCAAACTGCTGGA [...]
+CGCCGTTCGCCGGAGACAGGATGTTATTGGTAGACATCATCAGCGCACGCGCTTCAAGCTGGGCTTCCAGCGTCAGCGGTACGTGAACAGCCATCTGGTCACCATCGAAGTCGGCGTTATAGGCCGCACAAACCAGCGGGTGCAGCTGGATAGCTTTACCTTCGATCAGTACCGGTTCAAATGCCTGGATACCCAGACGGTGCAGTGTTGGTGCACGGTTCAGCAGTACCGGGTGTTCGCGGATAACTTCGTCCAGGATATCCCAAACGACAGCTTCTTCGCGCTCAACCATTTTCTTCGCGGCTTTGATGGTGGTGGCAAGGCCACGCAGTTCCAGTTTGCCGTAGATGAACGGTTTGAACAGCTCCAGCGCCATTTTCTTCGGCAGACCGCACTGGTGCAGACGCAGGTATGGACCTACGGTGATTACAGAACGACCGGAGTAGTCAACACGCTTACCGAGCAGGTTCTGACGGAAACGACCTTGTTTAC [...]
+NODE 1482 325 18454 18454 0 0
+GTATCAAGCAACTTTGTTAATCACTTGATTTTGTTATCGTCTGGCAATCAGTGCTGCCGTTCGATGCGTTGCATTCTACTTACCTGACGCACTGAGTCAACGATATTTTTCGTCACTCACGATCGTTTGCTGAAATTTGCGGCGAAACGATCACTGATCAAGCAAATCTCCGCGTGCAGCGCTCAAATATTGCAACATGGACCACAACGTTAGCACCGCTGCGACAAAGAAAAGCGCGATCCCGGCATACTCTACCCAGATATTCGGACGCCACAAGAGCCACGCCAGCGCCACCATCTGTGCGGTAGTTTTGACTTTACCGATC
+TGTGGCGTCCGAATATCTGGGTAGAGTATGCCGGGATCGCGCTTTTCTTTGTCGCAGCGGTGCTAACGTTGTGGTCCATGTTGCAATATTTGAGCGCTGCACGCGGAGATTTGCTTGATCAGTGATCGTTTCGCCGCAAATTTCAGCAAACGATCGTGAGTGACGAAAAATATCGTTGACTCAGTGCGTCAGGTAAGTAGAATGCAACGCATCGAACGGCAGCACTGATTGCCAGACGATAACAAAATCAAGTGATTAACAAAGTTGCTTGATACTGCGGGAATAGCTCAGTTGGTAGAGCACGACCTTGCCAAGGTCGGGGTCG
+NODE 1483 1823 82094 81279 0 0
+TCGCCGGTCAGCGCGGTGGTGGTGAGATCTTCTACGCCCGGCGTGTTGTCCAGCGCAGCCTTGTTTTTGAGGAATTTATCTTCTTTGTTGCCCATCTCCGTTTCATTGGCGCTCTCTTCCGCCAGGGTCGCCAGCAGCGGCGTCAGCTCCTGACGCATCGCGCTGATAATGGCGCTGCGGGTTTTTAGCGGGCACTGCTGATAACGTAAGAACGCCTGGTGCGCGGCATCGATGGCCTCGCTCACGGACTGGAAAATCCCTTTGCCCTGAGGCTGAGCAGGCGTTTGCGCCGGCGTGGTTAATTGCTCGCTAAGAATGGTGCGAATCAGGGTTTCGAGTTCAGAAGTATTCATTGATGAGTTCCCACGTTAATAGCCGCGATGGCGGTCTGTGCTATGTCCATGTCCTGCTCAACGCTGCCGCCGCTGATGCCAAGACCCCCAATTAATATGCCGTCGCGCCACAGGGCGTAACCGCCGCCAAAGGTGACCA [...]
+TGAGCTATCGCGATGTCGCGCTGCTAAGCCGGGGGCGTGTGGTTGTCCACCGCAAATGCATCGTGACCGCCATGGCGCGTGACGCGGCCAATGCGCGGAATATTCAATTAATTAAGCAGGAGTAAATCATGCATCTGGCACGAGTCACGGGCGCGGTTGTCTCCACGCAAAAATCACCTTCTTTGATTGGGAAAAAGCTGCTGCTGGTGCGTCGGGTCAGCGCCGATGGCGAACTCCCCGCCTCGCCTACCTCCGGCGATGAAGTGGCCGTGGACTCCGTCGGCGCGGGCGTCGGCGAACTGGTTTTGCTCAGCGGCGGCTCCAGCGCCAGGCACGTTTTTTCCGGGCCAAATGAGGCCATCGACCTCGCCGTTGTCGGCATTGTAGATACGCTTTCGCGTTAAGGGGCGGTTATGGCGATTTATACCCGAACAGGTGACGCTGGCACCACATCACTGTTTACCGGCCAGCGGGTGAGCAAAACCCACCCGC [...]
+NODE 1484 51 69 69 0 0
+GATCACAATCCTGTCGCGTTAAAACTGGGTCTTAACTATACGCCAGTACCT
+CCCCCGTTCCGGAGTCAAACAGATCCACGCTATCGCCAAAGTACTGCTCCA
+NODE 1485 9 905 905 0 0
+TTTCGCCAT
+GAACATCAG
+NODE 1486 48 2058 2040 0 0
+TCGCGGCATGTCTGCCGTGATTACTCGCTTCTTCCCGGAACCCGTCGC
+GGCGAAAATCAGCAGGAACAGAAACGCCAGCACGAACCCCATGCCGAG
+NODE 1487 26 1829 149 0 0
+GTAATCACGGCAGACATGCCGCGAAT
+CGCGCCCGCACCGCGCGCCGTTCCCG
+NODE 1488 608 30522 30449 0 0
+CGCGCGGCGCCTCGCTGAAACCAACGCCTTTTGTCGATGTAGGCCAGGTATCGGGTTCCCAGAGCGTGACGTTTGCCGTCGCCGTATCGCCGGACTTGAGGTTACGCATCAGACGATCGAAGAAATATTGCAGCGTATTGCCTGCCCATACGGATTCCAGCGCACGCGCGGCAGTACGTCCTAATGTAGAAAAGAGCGCTTCTTTAGGCAGCTTTAATACACTAAGCAGTTGATCCACGGGTTCTTTAAATTCCGGTTTATTTTGATGATATCCAATCAGATAACGCGCCAGCGGACCTACCTCCATCGCATGTCCCTTCCAGCGCGGCGATTTAATCCATGAATATTTAGCGGACTCATCCACCTGTTCGATAAAGGTTTTTGTGCCTTTATAGTGTTCGCCCATGACCAGTTGCGGTTCGGTCAGACCATCCCACGGATGCAGGCCCTTATCGTTATTGCCGTTACCATAGGTATACCAGGAGTGAGTGA [...]
+TTAACGGTCGTTTCGACGAAATTCATCCTGTCGATTTAACCGCCCCCGATGAGATTCAGGAGTTTGTCACTCACTCCTGGTATACCTATGGTAACGGCAATAACGATAAGGGCCTGCATCCGTGGGATGGTCTGACCGAACCGCAACTGGTCATGGGCGAACACTATAAAGGCACAAAAACCTTTATCGAACAGGTGGATGAGTCCGCTAAATATTCATGGATTAAATCGCCGCGCTGGAAGGGACATGCGATGGAGGTAGGTCCGCTGGCGCGTTATCTGATTGGATATCATCAAAATAAACCGGAATTTAAAGAACCCGTGGATCAACTGCTTAGTGTATTAAAGCTGCCTAAAGAAGCGCTCTTTTCTACATTAGGACGTACTGCCGCGCGTGCGCTGGAATCCGTATGGGCAGGCAATACGCTGCAATATTTCTTCGATCGTCTGATGCGTAACCTCAAGTCCGGCGATACGGCGACGGCAAACGTCA [...]
+NODE 1489 53 3255 3222 0 0
+TGCGGTGATGGCGCTAAATATGCTGCGCCGCTGGCTTAATGGCGAGGACATTA
+GCACAGACCTCCTGACGTATTGCCAGACTATACCGATTGGCGCTAAAACGCAC
+NODE 1490 6483 347115 340710 0 0
+CGTGAATTCTCTACGTTTTTTTAATGCCTGCGCCTGTTTTTTAGCGGTGCAAAGATGGCACGTTATGTGCAATAATGTACGGGTAGATGCTCATTCCATCTCTTATGTTCGCCTTCTGGCCTCATAAACTCAGGAATGATGCAGAGCCGTTTACGGTGCTTATCGTCCACTGACAGATGTCGCTTACGCCTCATCAAACACCCTGGACACAACGTTGAGTGAAGCACCCCTTTATGTTGTCATACAGACCTGTTTTGACGCCTGCCCCTTAACCGGGCAGGCGTTTTTTTATGCATTCCGAATGATTTTGCGTAGGCGGTAAGCCCGGTAAGCGAAGCGCCACCGGGCAAGAGGGAATTACTGCGGGGGATTGTTCTGTAATGTCAGCATCAAGCCATCGCGCCGCATGGCGGCGGCCTCTTCCGGTTGATGCAGTCGATCAAGCGCATCGGCAAGCCAGGCATAATCATACGCGTCCGGGCGTTGTTTTAG [...]
+TAGAGCGCTTTCGGCGTCGGAGCAGGCAAGCGCAGCGGGAAATGGTGCGAAACATCGGCGACCATCTCCTGCAACTTAGGCAGGTCGACAATACCGTTGCCCTTAATAAACAGATGCGTTCGCGACGTCAGCAGGCCGTTGAACCACGCCCACGCGACCAGCTTATTAAGATAACGGTTATATTCCAGCGGCTGATGGCTGATGATGGAATCCATGTTCGGCGCGCGGTTGTAGAGATACCAGCCTGAACGGTTGGCGCGTCCCGGCGGCACATGGATAAAGGTTAAATTCGGCTCGGACAGATCCGGCGATATCTGCGGGTTCACCAGCGTGACTTTACCCGGCAACGCTTCAAAAGCCGCGTACAGCTTACGCGTCAGTACGCCGATATCCTGCGGGCTGGCACTCACGCTGAGGTTGTTGCGCCGCGCAAAGCGAATCAGATTACGATAGCTCTGCATCATGGCGTCGAGCAATTCGTTGTGGGCTTCG [...]
+NODE 1491 12 697 684 0 0
+ACCGCCACGCTG
+TATTGACCGGCG
+NODE 1492 1293 70540 69615 0 0
+GAGATTCAGATTCGCTGAGAGAAGCGTTGGGTTTCAGCAAGCCCCCCCCACCTACAGTCCCGTAACCCATTGATATTACGGGCCCGTAGATGGGGTGAAGCAAAGTGCAACCCAACGCCCCTGTCAACGCTTAACTGCGCAACCCGCGCCCACGCTGGATCAGCGACCAGCACAGCAGGTAGAAAGCGGCGATAAAGATCACCAGTACGCCAAACGTCGTCACCAGCGGCACATCATGGATACCCAGGAAGCCGTAGCGGAAGCCGCTGATCATGTAGACGATCGGGTTCAGGTGCGACAGCCCTTGCCAGAACGGCGGCAACAGCGTCAGCGAGTAAAATACCCCGCCGAGGTAGGTTAGTGGCGTCAGCACGAAGGTCGGGATCAGGCTGATATCGTCAAAGGTTTTCGCAAACACGGCGTTCAGCAGTCCGGCCAGCGAGAACAGAATCGCGGTCAGAATCAGCGTTAGCGCGACAAATACCCAGGAAT [...]
+CTATCTGGAAGAGGCGGAAATGCTGTGCCGCAATATCGGTATTATTCAGCACGGCGAGCTGGTGGAAAATACCTCCATGAAAAATCTGCTTTCAAAGCTGAAATCGGAGACGTTTATTCTGGATTTAGCGCCAAAAAGCCCGCTACCTAAGCTTACGGGTTATCAATATCGTCTGGTGGATACCTCGACTCTGGAGGTGGAAGTGTTACGCGAGCAGGGGGTTAACAGCGTCTTTAGCCAACTGAGCGAGCAGGGGGTTCAGGTATTAAGTATGCGTAATAAAGCCAACCGTCTGGAAGAACTGTTTGTGTCGCTGGTGCATGAAAAACAAGGAGATCGCGCATGATGCAGCTTTACTGGGTTGCCCTTAAAAGCATCTGGGCGAAAGAGATCCACCGCTTTATGCGGATCTGGGTGCAAACGTTGGTGCCGCCCGTCATCACCATGACGCTCTATTTTATTATTTTCGGCAACCTGATTGGTTCGCGCATC [...]
+NODE 1493 11 454 441 0 0
+TAATTCTGTAT
+ACTCCTATACC
+NODE 1494 51 3406 3406 0 0
+TAATAATGCAATCCCGCTCCCCATCATATTACCGGCAACGACGCCAGTACA
+ACCCGCCAACCTTGCCAGTATTGGTGGCATTGCCATCTGGGGCTGGGTAAT
+NODE 1495 23 1250 1250 0 0
+TTAACATCAAACTCAGATGTTGA
+TGCGACCAATTGATTAAAAGTCA
+NODE 1496 166 9730 9678 0 0
+ACGTGAAGGATAACGTTGCGTCAGCAACGGCCTGTAGGGCAAGGCGAAGCCGAGTCATCCTGCACGACCCACCATCTTTAGATGGTCCGAGTAAAATCTTTCAGGCAGCACCCGTATGGGTCGTTAGCTCAGTTGGTAGAGCAGTTGACTTTTAATCAATTGGTCG
+TACGGGTGCTGCCTGAAAGATTTTACTCGGACCATCTAAAGATGGTGGGTCGTGCAGGATGACTCGGCTTCGCCTTGCCCTACAGGCCGTTGCTGACGCAACGTTATCCTTCACGTTCAACATCTGAGTTTGATGTTAAATTGGTGGGTCGTGCAGGATTCGAACC
+NODE 1497 6 2318 59 0 0
+CTCGGG
+GCAAGA
+NODE 1498 51 3018 226 0 0
+TGGTAGTCTCGGCGGCATGAGCCAGATTCGCAGCACCCATCGCCAGGGTAG
+ACCGCCGCGCCAGCGGATGCGAAGCCAATGATGCAGCATAAAGGTAAATTT
+NODE 1499 811 68496 65641 0 0
+CGGTAGTTGGGGCCGGTGATGTCCCGCACCTCCCGGAAGGTGAAGCGGTAGTCGTGAATGGTCACGCTGTCGCCCGCCCGCATCCGCACGTCACGCTCCACGCTGTAATTCTGGCTGAAGGCGATGCCGGTAATCGTCACCGCCAGCCCGAGGTGCGCCGCCACCATTCCCCAGTAGCTGAGAGAGGTTTTCGTGCCGCGGGACACGCGCTGTACGGCTTCGGCCACCGCCAGCACCGCAATCCAGCAGGCCATCGCCATCCCCACCGCCGTCATGGCGATGATTTTATCTTCCAGCAGCCATGGCAAAAGTACCGACAGCACCAGGGTGGAGACCAGGGCGGTGAGCAGCAGTTTCCTGATGTTACGCGGCCGGTCCCGGCCCCAGCGCACCAGTGGCCCCACCCCCAGCAGCAGGGCAAAGGGGACCATCAGCCAGGTGAACATGGTGTTAAAGAACGGCTCCCCCACCGAAATGCTGCCCAGCCCCAGC [...]
+CTGGGCACCTTCCTGGTGCGCTCCGGGGTGCTGGTGTCGGTGCACGCCTTCGCCTCCGACCCGGCGCGCGGAATGTTTATTCTCGCCTTTATGGTGCTGGTCACCGGCGGCTCGCTGCTGCTGTTCGCGGTGCGCGGGCACAGGGTGCGTTCGCGGGTGAACAACGCGCTGTGGTCGCGCGAGTCGCTGCTGCTCGGCAACAACGTCCTGCTGATGGCCGCCATGCTGGTGGTGCTGCTGGGCACCCTGCTGCCGCTGGTGCACAAACAGCTGGGGCTGGGCAGCATTTCGGTGGGGGAGCCGTTCTTTAACACCATGTTCACCTGGCTGATGGTCCCCTTTGCCCTGCTGCTGGGGGTGGGGCCACTGGTGCGCTGGGGCCGGGACCGGCCGCGTAACATCAGGAAACTGCTGCTCACCGCCCTGGTCTCCACCCTGGTGCTGTCGGTACTTTTGCCATGGCTGCTGGAAGATAAAATCATCGCCATGACG [...]
+NODE 1500 18 1105 1105 0 0
+CGGCTAATCGCTGATAAC
+ACGGCCGCCTTCACGGAT
+NODE 1501 51 1615 1615 0 0
+ACCGGATACTGCGACAGTTGTTGCAGTATCTCGCTCATGGGACGGTTAAGA
+TATCAACGCGCCTGTCGCTGAACGGCACAATTATTGTGGGCCGCGACATCG
+NODE 1502 4630 241934 240408 0 0
+GCGCGAGGCTGCCGCCGATATTGTGCGCCGCTTCAACGATAGCCCACCAGCGTCCCCGTTCGTTTTTCGAAAACCACGAAGCCATAATTTTCGCCATCGGCGGAAAGCTGGTGCCCTGTAATATCGCGTTGAGACTGTACAGCACGTAGAATGCCGCCACGCTGTCGGAAAAGCCGAACAGAATATTTACAATCCCCACGCCAATCAGCACCGGGCCGGTCATGGCTTTCGGGTTAATTTTATCGACCAGCATCCCGCCGACAAACTTCATCGCGCCATAAAGAATGTAAAAAATAGAAGACATAATGGCGAAGTCTTCTGCGGTCAGCGACGTTTCCGTCAGCATGGCCGGCATCGCGGCGGAGAAGTTTTTACGGGTAAGATAAAAGACGGCATAAGAGATAAAGACCGAGGCGATAATCTCAAAACGAAATTTTTTATAGGTCTGGTCTATCTCTTTTTTCTCTTTTACAATCGGCTTATCGGGCTGGC [...]
+CTCCTGCAGGTGTGGCGCCTCTGCCCTGCATGGGGCAAAGTTTGTCAATATTGTGACAGTGTGATTATTGTGCGTGAGGTAGCGCACATAATCCAGTATTCACGCCCATAATTGTTGAAATTGTCGCTGCCTTTCATGACATCTTTTCCGGTGCGAGAATGCTGGCAGGACAAAGGGCATATTTGTTAACGCAACGTTATTTAAATGATGAAGCATGTTTATGTATTACGGAAGTGAAAGTTACTCACAACGCGGTGAATAATCTGTATTATGAAGAATCTGCATACCTTATCAGGTTCACCATAAAAGGAGCCCTCGCATGGAAATGCTCGAAGAGCACCGATGTTTTGGCGGCTGGCAGCAGCGCTGGCGTCATCATGCCGCCACGCTAAACTGCGCCATGACATTCAGCATTTTTCTTCCGCCGACTCAGGATAATGAACCGCCTCCGGTACTGTACTGGTTGTCCGGGTTGACCTGCAATGATGAGAA [...]
+NODE 1503 38 2587 2587 0 0
+ATTTGAAGAACTACTGAGCTGCAATGTGTAGTGGCTGG
+AACGGTTGGGCGAAGAAAGAGAACCTGAAAAATTATGT
+NODE 1504 7 290 290 0 0
+ATGGCGC
+CAACCTG
+NODE 1505 6 240 240 0 0
+GCTCTT
+TTACGA
+NODE 1506 33 7814 3979 0 0
+CCTTGATTTTCCGGATTTGCCTGGAAAACCAGC
+GGCACTACGGTGCTGAAGCAACAAATGCCCTGC
+NODE 1507 43 2026 2026 0 0
+TATCAAATGACACCAGCGGCCCGACAAACCAGACCAGCAGCGC
+CCCGCTGGCCTCCGTGGGTAGCCGGGTAGTGACCATTGCCCTG
+NODE 1508 8 361 361 0 0
+CAGAACCA
+ACCCTGCG
+NODE 1509 1 233 232 0 0
+G
+G
+NODE 1510 36 4631 4521 0 0
+TCCAAAATGGCAAGTAAAATAGCCCTAATGGGATAG
+AAAATCCTCACGTACTACGTGTACGCTCCGGTTTTT
+NODE 1511 5 1145 1137 0 0
+TGCTC
+GCTCT
+NODE 1512 48 3860 3860 0 0
+ATTGAATTTTTTTACCATTGGGTTTGTTTTTTTTCTGTAACATTGAGT
+TGAGTATTGTGGATTCTCTACTTTTATTACGCCGGTTGATGGCGTTGG
+NODE 1513 6290 299270 297812 0 0
+ATAACATCGGCGTGCCGTGCGAGAAAAGCAAGGTGGTCAGGAAATTGCGTTTCTGTTGCTCGCGTATCGCATTGATGCCCTCGTCGTCGGTTGGCCCTTCTGCGCCATAGTTACAGGAGCGGTTATCATTATGCCCGTCATTATTATCTTCGCCATTGGCTTCATTATGTTTGTCGTTATAAGACACCAGATCGTTCAGCGTGAAGCCGTCATGGGCAGTAATAAAGTTAACGCTTGACCAGGGGCGACGACCGCGCAAATCGTAGAGATCGCCGGAACCCAGCAGGCGTGCGGCGAAATCATTTGTGACGTTGTCACCTTTCCAGTATTCGCGTACCGTATCGCGGTATTTATCATTCCATTCGCCCCACCCTGGTGGAAAGCCGCCAACCTGATAGCCGCCCGGTCCGATATCCCAGGGTTCGCCAATCAGTTTCAGTTTTGCCAGCACCGGGTCTTGCGTTACCGCATCAAAAAAGCCGCCTCTCTGAT [...]
+CCATTAAACGCGAGCGGCAGGATCTGCCTGAGCATCCCGTTGTTAAGGGGGCTAACGCCTGGGAGCAGGGGGAGGTTATCCAGCTACAGCGTGTTCAGGGCTCTGGCGAACACGGGCAAGGCGATACCGCGCACTTCGGTACATCTGAGCAATCCCGACAATAATTCCACGGTTTTACACGCAGATAGGAAAAAGAATGCCTGTTAAGTGACAGTGTCACGTAAAAATTAGCCCCATAGTCTATGCTTGTTTTTCGGATGCTGTAGAGGTTATGGGTTAAACGGAGCGACAAATGAGTTCAAAAATTTTTTGCAAAAGCTGGGGGGCTGAATATATCGCCGCTGATGTCGTCCGCTTTCGTCTTTGGGCCACCGGTCAGCAAAAGGTCATGCTCAGGCTTGCGGGTAAAGACCAGGAAATGCAGGTGAGCGGTGACGGCTGGTTTACGCTGGACGTCTCCGGGGTGACGCCAGGTACGGAGTATAATTTTGT [...]
+NODE 1514 6422 323223 321642 0 0
+AGCGCCGTTTGCTGCCACGCCTGCCGCCAGATCTGAAGATACTGGTGTCGTAATGCAAAACTGTGCATTAATACCCGCTGATAGCCTGACAGCGCGGTGACGATCATTACCATTAGAACCATCGCCACTAAAACTTCCGGGAGGCTAAACCCGCGTTGTAAATTCAGGGGATGCGACATAACGCCACCTCTTTTAACGGACAAAAATCGCTCCAGCCGTAGGGAGAAAAGACAATGCTTCCCTGAATGACGTTGCCCAAACGCCATAACGTCATGCCATCATCTTGCGCCGCCATCACCACCTCATCCCCCGATAATCTCCGCAAACAGACCCTCGCTCCTGAAGGGGAATAGCGCCGACATTCCATTTCGGTTACGCCTGACCATAGCTGCCCCCGCCCCCATTCCAGCGCCGACTGTACGAGCGCCTGGCGTTGTATCGCCATGCTCTGCGTCGTCACGCGGGCGGCATAGCTGGCCTGCTGCTGATTTA [...]
+TCAGCACTCCTGGCAGTTCCCGCAGGGCGGGATAAATCCAGGGGAGTCGGCAGAACAGGCGATGTACCGGGAACTGTTTGAAGAAGTTGGGTTAAGCCGTAAAGATGTGCGGATCCTTGCTTCTACTCGCAACTGGTTGCGTTACAAGTTACCAAAACGTTTGGTGCGTTGGGACACAAAGCCGGTATGTATCGGCCAGAAACAAAAGTGGTTTCTTTTGCAGTTAATGAGCGCCGACGCCGAAATCAATATGCAAACCAGCAGTACGCCGGAGTTTGACGGCTGGCGCTGGGTAAGTTACTGGTATCCGGTTCGACAAGTGGTGTCATTTAAACGCGATGTCTACCGCAGGGTAATGAAAGAGTTTGCAAGTGTTGTCATGGCGCTTCAGGATAATCCCCCTAAGCTACAAAGCGCGCCTGCTTATCGACGTAAAAGAGGTTAAGCCACGCAAATTATGCTCACTCGCCTGCGCGAAATAGTCGAAAAAGT [...]
+NODE 1515 4513 261285 259173 0 0
+TCAGTAGTACTTCCTGGCCTGCATGAAAGCGAGGATCTTCGCTTGCGTGAACGGTGCCGGCGAAATCAATACCAGGAATCATCGGAAAATGACGGATAATTTTCCCTTTTCCGGTGATAGCCAGAGCATCTTTATAATTCAGGCTGGACCAGTGGACATCCACCGTCACATCACCTGCCGGCAGTTGACTCTCTTCGAGATGTTGCACGGATGCGAGGGTTTTACCGTCCTGCTGTTCTAAGATCAACGCCTGCATAACCTGTCCTCACTTTACATGGTAGATTGGAAAAATAGCTACGAAGACTATACTCGCTAATTAAAACGTGATGCCGATGCAACGCAATAAATTGCCAGATAGATCCATTTTGGTAGTATGCCTGCTTCATTGCGCGCCGTGGCGAATTCCGCCTTCAGATTCGCTTTTTCATACTGTTTATAACCGTCGGAGTTAACTCAAGGATGCGATTAACGACGAAATTCTCAGCTTTTATC [...]
+AACGCGAATATCGGTATTGGCGGGCAGATGTTCAAGCTGAAGATCGTCAGTACAGCCGTTACCGGCGGCAATCACGCGGATGTCATTGCGCAGTACCTGAATCGGCAGCGCATGAGTCGCATCGCAAATCAGCAGTACGCGGCTGGTCAGTTTCGCCACGGCGACAACCTGCCCTACGACGCCTTTGTCGCTAATGACCGGTTGACCTTCATATACGCCATTAACGCTGCCTTTATCGATAACGACCTGATCGCTGTAAGGATCGTTAACCGTTGAAATAACCTGCGTCACCATTTTCTGCTCGTCCTGACGCAGCGGCGACCCCAGCAGCTCGCGCAACCGCGCGTTCTCCTGTTTGTACTGCCCCAGCATCAGCAGGTCGCTGTTTTTTAGCAGTAATTCCTGGCGCAGCGCCCGATTTTCCAGCTCAAGCTGGTCGCGAGAAGCCAGCGTTTGCGACACGCTGTCGAGCAGTTCACGAGGGCCGTTTGA [...]
+NODE 1516 325 13988 13842 0 0
+ATGCCGATGAAAGGCAAATCAACGCGGCGGCGGAAGTCGGCGCGCCGTTTATCGAAATCCATACCGGCTGCTATGCCAACGCAGAAACCGATGCGGAACAGGCAAAAGAGCTGGCGCGTATTGCCAGCGCCGCGACCCTGGCGGCCCGTCTGGGGCTAAAAGTAAATGCGGGTCATGGCCTGACCTACCATAACGTCAAAGCTATTGCCGCACTGCCGGAAATGCACGAGCTCAATATCGGTCATGCCATTATTGGTCGGGCGGTGATGACGGGGCTGAAAGAGGCGGTGGCTGAAATGAAACGTTTGATGCTGGAAGCGCGCGG
+CCCCGTCATCACCGCCCGACCAATAATGGCATGACCGATATTGAGCTCGTGCATTTCCGGCAGTGCGGCAATAGCTTTGACGTTATGGTAGGTCAGGCCATGACCCGCATTTACTTTTAGCCCCAGACGGGCCGCCAGGGTCGCGGCGCTGGCAATACGCGCCAGCTCTTTTGCCTGTTCCGCATCGGTTTCTGCGTTGGCATAGCAGCCGGTATGGATTTCGATAAACGGCGCGCCGACTTCCGCCGCCGCGTTGATTTGCCTTTCATCGGCATCGATAAAGAGCGAAACCTGGATGCCAGCCGCCGCCAGGCGCGCACAGGCA
+NODE 1517 1511 78133 77720 0 0
+CCGCTGCGAAGCTGTTGCTCAATAAGCTGGCAAAGGTTCTTCATCCGCGGTACGCCGCTATAGCCGCAGCTCCCGTGTAGCTTATGGACCAGATCGACCAAACCGTTGGGATTTTCTCCCACCAGTTGTTCTTCAATTTTGTTGCGCACTTCCGGCAGAAAATCAATCAGCATTTGCAGCATATCCCGCGCCAGATCGGGCTTACCGGCAGCCTGGCGGAGCGCAAGCTGCCAGTCGAGCGTCGCATTCGGATTGAAGATAAACTCAGCCGGTTCCGGCACCATCAGGCGCGCTGCTACGTTGGCGCCAGGTTTATAGCGCAGCAACAGATTATGCAACTTCTCTTCTTCTATCGGTTTAGCCAGATAGTCGTTCATGCCCGCGCTGAGCAACTTCTCTTTTTGCCCGGCCATCGCATGTGCCGTAACGGCAATAACCGGTGTTTGCTGCTGATGAGGAAGCTGGTGAATCAATTCGCAGGCGCGTATGCCG [...]
+GATTGGCGACCCGCTGCGCCTGCAACAGGTCATTACTAATCTGGTGGGCAATGCCATTAAGTTCACCGAGAGTGGCAATATCGACATTCTGGTAGAAAAGCGGGCGCTCAGTAACACCAAAGTACAGATTGAAGTGCAGATCCGCGATACGGGGATCGGCATTCCGGAACGCGACCAGTCGCGACTGTTTCAGGCGTTTCGCCAGGCCGATGCCAGTATTTCTCGCCGTCACGGCGGCACCGGCCTTGGGCTGGTGATTACGCAAAAGCTGGTCAACGAAATGGGCGGGGATATCTCTTTCCACAGCCAGCCTAATCGCGGCTCGACCTTCTGGTTTCATATTAATCTTGATCTTAACCCAAATGTCATTATTGACGGGCCGTCGACCGCGTGTCTGGCCGGAAAACGGCTGGCTTATGTCGAACCGAATGCTACCGCCGCGCAATGTACCCTGGATCTACTGAGCGACACGCCGGTGGAGGTGGTTTACAG [...]
+NODE 1518 1923 110739 109416 0 0
+GATGTCGTTATTGGCAGTGATATTGAAGGGTTAAGCGACGACGCGCTGGCGGCGCTGGCCGCCCGTACGACGTTGTTTGCGCGTCTGACGCCGATGCATAAAGAGCGCATCGTCACTTTACTCAAACGCGAGGGGCATGTGGTCGGTTTTATGGGCGACGGGATTAACGATGCTCCGGCGTTGCGGGCGGCGGATATTGGTATCTCGGTAGATGGCGCGGTGGACATCGCCCGTGAAGCGGCCGATATTATCCTGCTGGAAAAGAGCCTGATGGTGCTGGAAGAAGGCGTCATTGAAGGTCGTCGTACTTTTTCTAATATGTTGAAATATATCAAGATGACGGCCAGCTCAAATTTCGGTAACGTGTTTAGCGTACTGGTGGCGAGCGCCTTTTTGCCGTTCCTGCCAATGCTGCCGCTGCACTTGCTGATTCAAAACCTGCTGTACGATGTATCCCAGGTGGCGATTCCGTTTGATAATGTCGATGAAGAA [...]
+CACTTCCGGTCAGATCCCGGTCGATCCGAAAACCGGTGCCGTAGCGGAAGACGTATCCGCTCAGGCACGTCAGTCGCTGGAAAACGTTAAAGCTATCGTGGAAGCCGCTGGCCTGAAAGTAGGCGACATTGTGAAAACGACCGTCTTCGTGAAAGACCTGAACGATTTCGCGACCGTCAACGCTACCTACGAAGCGTTCTTCACCGAGCACAACGCCACCTTCCCGGCGCGTTCCTGCGTGGAAGTTGCCCGTCTGCCGAAAGACGTGAAAATTGAGATTGAAGCGATCGCTGTTCGTCGCTAAGCGCCGGACGTCATCCCCGCCGGGCGGCGCAAGTTTGCCCGGTTCGGGGCACCAACAGCCATGGAGAGGCGGCAATGGTAAGAGCGCGTTTTACCGAGGAGCAAATCGCCGATTTTCTGCAACAGTCTAAAAACGGCGTGCCGAATAAGGCGTTGTGCGAAGAATATGGATTTAGCAACAGCACGCTC [...]
+NODE 1519 51 1702 1684 0 0
+ATTCCTGAAAGACTTAAACGCCAAAGGCACCACCATTATTCTCACCACCCA
+TCCCCACATCGAGCGACGCAATTCGATATCGACACCCGCCGTCGGCTCGTC
+NODE 1520 46 7699 7672 0 0
+GCGGTTCCTGGCGACATGAAACTCCCTGGTTAGGGGTATCGGCGCG
+GCCTCCTGCTAAGCCTGACCGCACGGAACCTACAGCTATTCAGGTG
+NODE 1521 4 590 590 0 0
+ACCT
+ATCA
+NODE 1522 1 325 318 0 0
+G
+C
+NODE 1523 19 5823 5678 0 0
+GCATCTGTGACTCTATGAA
+TTCATGTCGCCAGGAACCG
+NODE 1524 51 2596 2596 0 0
+CGCCTGATGCGTCAGCCACAGTCGCGTATCAAACTCCAGTTGATGGTACTG
+GCTGTCGGCACAATAAATTCTGAAAATGCCCCTTCCCCCGTATCTTTTTAA
+NODE 1525 878 48316 48098 0 0
+GGTCGCGTTTTTCATTTCCTGACACGAGGTTGATATGACAGAGATCGTTGTTTCCAAATTTGGCGGTACCAGCGTCGCTGATTTTGACGCCATGAACCGTAGCGCGGATATCGTACTTTCCGACGCCAATGTTCGTTTAGTCGTGCTTTCCGCGTCTGCCGGCATCACTAACCTGCTGGTGGCGCTGGCCGAAGGGATGGAGCCTGGCGAACGTTTCGCTACGCTCGACGCCATCCGTAAAATCCAGTTCGATATCCTTGATCGTCTGCGTCATCCGAATGTCATTCGCGAAGAGATTGAACGCCTGCTGGAAAACATCACTATTCTGGCGGAGGCGGCATCGCTGGCGACATCGGCAGCCCTGACCGATGAACTGGTCAGCCACGGCGAGCTGATGTCTACCCTGCTATTTGTTGAGATCCTGCGTGAACGCGACGTACAGGCCCACTGGTTCGACGTGCGCAAAGTGATGCGTACCAGCGATCGCTTTGG [...]
+AGTAAGGTGGCTGGATGCAGTACTTTTGCGCCGAAGGTTGCCATCTCCGCCGCTTCTTCAAAGTCGATTTCATCAATTCGCTGCGCGACGGGCACCACGCGCGGGTCGGTGGTGTAAATACCGGGCACATCTGTCCAGATATCAACCCGCGCGGCATGGAGCGCTTCAGCCAGCAACGCTGCCGTATAGTCGCTGCCGCCGCGGCCTAACGTCGTGGTGCGGCCTTTGCTTTCACTGCCGATAAAGCCCTGAGTAATGACCAAAGTTTCGCTCAGGCGCGGGAGCAACTGCTGCGCGGCCAGTTCCGCAAGCGCTGCGACGTCCGGTTCCGCACGACCAAAGCGATCGCTGGTACGCATCACTTTGCGCACGTCGAACCAGTGGGCCTGTACGTCGCGTTCACGCAGGATCTCAACAAATAGCAGGGTAGACATCAGCTCGCCGTGGCTGACCAGTTCATCGGTCAGGGCTGCCGATGTCGCCAGCGATGCC [...]
+NODE 1526 598 30691 30057 0 0
+GCGGGATGGCCGGTGCGGTGCCGCGACAGGTGATCCGCTTTTTAAATGATGAACACAACCGGGCGCGCATTCGCGGCGTCATCGCCTCCGGTAACCGCAATTTCGGCGATGCCTGGGGATGCGCTGGCGATGTGATAGCACAAAAATGCGGCGTACCCTGGCTGTACCGCTTTGAGCTCATGGGCACACAACGCGACATCGATAACGTCCGAAAAGGAGTAAATGAATTTTGGCAACAACTACCCCGGAGCGCGTAATGCAGGAAACCATGGATTACCACGCCCTGAACGCGATGCTGAATCTTTATGATAAAGCAGGCCATATTCAGTTCGACAAGGACCAGCAGGCGATCGACGCCTTCTTTGCCGCCCACGTCCGCCCGCATTCCGTGACGTTTGCCAGCCAGCATGAACGTCTGGAGACGCTGGTTCGGGAAGGGTATTACGATGACGCCGTCCTCGCGCGTTACGACCGCGCCTTCGTCCTCCGCCT [...]
+TCCAGGCGCCAAGAAACGTCTGGAAGCGAAAGCCGCTGGCGTGGGCGTGCTCGAACAGGCGGAGGACGAAGGCGCGGTCGTAACGCGCGAGGACGGCGTCATCGTAATACCCTTCCCGAACCAGCGTCTCCAGACGTTCATGCTGGCTGGCAAACGTCACGGAATGCGGGCGGACGTGGGCGGCAAAGAAGGCGTCGATCGCCTGCTGGTCCTTGTCGAACTGAATATGGCCTGCTTTATCATAAAGATTCAGCATCGCGTTCAGGGCGTGGTAATCCATGGTTTCCTGCATTACGCGCTCCGGGGTAGTTGTTGCCAAAATTCATTTACTCCTTTTCGGACGTTATCGATGTCGCGTTGTGTGCCCATGAGCTCAAAGCGGTACAGCCAGGGTACGCCGCATTTTTGTGCTATCACATCGCCAGCGCATCCCCAGGCATCGCCGAAATTGCGGTTACCGGAGGCGATGACGCCGCGAATGCGCGCCCGGTT [...]
+NODE 1527 4 188 188 0 0
+TATG
+TCCC
+NODE 1528 754 41645 41259 0 0
+GCATTGCATTCGCGAGGAACTCGGCTCGCATTTTACGCTGCATCTGGTCGACTTGCCGGGCTATGGTCGCAGCTCGGGGTTTGGCGCCATGACGCTTGAAGAGATGACGGCGCAGGTAGCGAAAAACGCGCCGGACCAGGCTATCTGGCTTGGCTGGAGCCTGGGCGGCCTGGTGGCGAGTCAGATGGCGCTCACACACCCTGAACGCGTTCAGGCGCTGGTGACAGTCGCCTCTTCGCCATGCTTTAGCGCGCGTGAGGGGTGGCCGGGAATAAAACCGGAAATCCTCGGCGGATTCCAGCAGCAGCTTAGCGACGATTTTCAGCGCACGGTGGAGCGTTTTCTGGCGCTGCAAACGTTAGGGACGGAGACGGCGCGTCAGGATGCCCGCACCTTAAAAAGCGTAGTGCTGGCGCAGCCTATGCCGGATGTAGACGTGCTCAATGGCGGACTGGAAATCTTAAAAACGGTCGATCTACGAGAAGCGCTTAA [...]
+GGGCCCGGCAACGCCCTGGTTACAGCGATGATTTTAGCGTCATCAGCGCCTGACAAAACGCCGCCGGATGCGAGATAAACGGCGCATGGGCCGCTTTCGCCATTATCTGTGATGTACTGTGCGGCCATAACGTATCGAGCAAAGGCACAATTTTACGCGGCACCAGACCGTCCAGATAACCATACAAACGCAAAAACGGCATGTTCACATTTTTAAGCGCTTCTCGTAGATCGACCGTTTTTAAGATTTCCAGTCCGCCATTGAGCACGTCTACATCCGGCATAGGCTGCGCCAGCACTACGCTTTTTAAGGTGCGGGCATCCTGACGCGCCGTCTCCGTCCCTAACGTTTGCAGCGCCAGAAAACGCTCCACCGTGCGCTGAAAATCGTCGCTAAGCTGCTGCTGGAATCCGCCGAGGATTTCCGGTTTTATTCCCGGCCACCCCTCACGCGCGCTAAAGCATGGCGAAGAGGCGACTGTCACCAGCGCCT [...]
+NODE 1529 653 45722 45157 0 0
+GGTCATATCGCAGGGAATAACAGTTAAGAAATCAGCATTGAGAACAAGATTATATATTGTGACAACGGAATCTGTTTTAACAATGTTTTCGATGCTGATGCCATTTCGTTGTAGAGTGGTGAGTAATTCGCTGTAGTAGCCCATATTCGTTTGCGGCAACACCCACTGTTCGTCTTTTAACGATTCCAGTGTGATGGTGCCGGTGCATGTTCGGGACTTGCTGGCTACCAGGACAAACTCTGATTCAAACAGCGGCTCGACATGCAGATCCTGTAGTTGCATTTCATTACTGAGCGTACCGATAGCAAAGTCCAGCCGCCCGTCGCGCAGGGCCGGCAGGAATGAAGAGAGCTGGGCTTCGTACATGGATACCTGCGCTTTTGGAAAGACCTCTTTGAACTTATGAATCATATCGGACATGAAGGTAAAGCCAATCAGCGAAGGAAAGCCAAACGAGACGTCGACAACGGTATTGCACGTCATACTGTTCAT [...]
+GTTGAGCTAATTGTACGTAAAAATACCGGCGTTACGTTGACCGAAGCGGGACAGGTACTGCTTTCCTGGTCTGAATCTATCACCCGCGAAATGAAAAACATGATCAACGAGATGAACAGTATGACGTGCAATACCGTTGTCGACGTCTCGTTTGGCTTTCCTTCGCTGATTGGCTTTACCTTCATGTCCGATATGATTCATAAGTTCAAAGAGGTCTTTCCAAAAGCGCAGGTATCCATGTACGAAGCCCAGCTCTCTTCATTCCTGCCGGCCCTGCGCGACGGGCGGCTGGACTTTGCTATCGGTACGCTCAGTAATGAAATGCAACTACAGGATCTGCATGTCGAGCCGCTGTTTGAATCAGAGTTTGTCCTGGTAGCCAGCAAGTCCCGAACATGCACCGGCACCATCACACTGGAATCGTTAAAAGACGAACAGTGGGTGTTGCCGCAAACGAATATGGGCTACTACAGCGAATTACTCACCACTCTA [...]
+NODE 1530 8 345 345 0 0
+ACGTTTTA
+TTTATACC
+NODE 1531 687 47450 45791 0 0
+TCTTTAACTAATGAACCCGCCGCTGCGCCAACGGCTCCGCCGCCAACCGCGCCGGCAGTAGTACCCAAACCGCTACCTGAACCCACGTTATGACCAGTAACGCCGCCCGCTACAGCCCCAAGAATTGCGCCGAAGGTCTGAGCGGTTTTTTTATTGGCGGTGTTATCTACGGCAACTTTCGCTGGCAAAACAGAGATAATATTGACGGTCTTTGTTTCTTGCTTCGCGTTTAACTGCCCGGTTTGGTAAACATCTGCGGCATAGTCATCCGCATTGGACTGGCATCCGGCAAGAGAAAAAGAGGCAAACAAAACCAGAGGCAAAGCATTTTTTTTAAAATTCATCACAATTCCTTGTTTAGGTAATAACGCAAAAAGGAATGTATTTAAGACTAATCTTAAAAAAAGTAAACTATCGTTTCTTGTAGTTGATTGTTTTTTTAGACTAAAAAACAAAGCATTAGATAGTACGATGCTTTGTTTTTATCGGTTC [...]
+ACCATCAGGATAAAAAAGAAGCGCAACAGTCATCGCTTTCTGTCACCACGCCGGGACAACGTTAAGCTGTTATCCGTTGGCGGTATTATCGTCACAGGCTTACTGTGTTATCCAGAACTCTGTTTTCCCTTCCCTGGCTTAGCATGAACCGATAAAAACAAAGCATCGTACTATCTAATGCTTTGTTTTTTAGTCTAAAAAAACAATCAACTACAAGAAACGATAGTTTACTTTTTTTAAGATTAGTCTTAAATACATTCCTTTTTGCGTTATTACCTAAACAAGGAATTGTGATGAATTTTAAAAAAAATGCTTTGCCTCTGGTTTTGTTTGCCTCTTTTTCTCTTGCCGGATGCCAGTCCAATGCGGATGACTATGCCGCAGATGTTTACCAAACCGGGCAGTTAAACGCGAAGCAAGAAACAAAGACCGTCAATATTATCTCTGTTTTGCCAGCGAAAGTTGCCGTAGATAACACCGCCAATAAAAAAA [...]
+NODE 1532 8527 463209 455435 0 0
+TTTGCGTGCCGTCCACCCCGGCGCAGGTCTACCATATGCTGCGCCGTCAGGCGCTGCGCGGGATGCGTCGTCCGCTGGTGGTGATGTCGCCGAAATCGCTGCTGCGTCACCCGCTGGCGGTTTCCACGCTTGATGAACTGGCGAACGGTTCCTTCCAGCCGGCCATTGGCGAAATTGACGAGCTGGACCCTAAAGCCGTAAAACGCGTGGTAATGTGTTCTGGTAAGGTTTATTACGACCTGCTGGAACAACGGCGCAAAAACGACCAGAAAGATGTCGCTATCGTGCGCATCGAACAGCTCTATCCGTTCCCGCATAAAGCGGTGCAGGAAGCGCTGCAACCATACGCTCACGTCCATGATTTTGTCTGGTGCCAGGAAGAGCCGCTCAACCAGGGCGCATGGTACTGCAGTCAGCATCATTTCCGTGAAGTGATTCCGTTTGGGGCCGCTCTGCGTTATGCAGGTCGCCCGGCCTCCGCCTCTCCGGCGG [...]
+CAGCACTATCGCCATCACGAAGGAAAGCGCCCTTAACGGGCGCTTGTCCATTACCGCATACAGTTTTGCGATAATATGGGTCATTAGCTTTCTTCTTGACCGGTTTTACCCGCTTCAACGTGCTCAAGCGCCAGGGCGGTAATGATCCCGAATGCACAGGCAAGAAGCGTTCCCAGAATCCATGCGAAATACCACATTTTAAGCTCCTTACTTAGTACAGAGAGTGGGTGTTGCTTTCAATATGTTCTTTAGTGATACGACCGAACATTTTCCAGTAACACCAGCTGGTGTAGATCAGAATGATCGGTACGAACACCGCCGCAACCCAGGTCATCAGGTTCAGCGTCATCTGGCTGGATGTCGCATCCCACATGGTCAGGCTGGCATTCATCATCGTGCTGGACGGCATCACAAATGGGAACATAGCGATACCCGCCGTCAGAATAATGCAGGCCAGGGTCAGCGAAGAGAACAGGAATGCCCACGCGCCTT [...]
+NODE 1533 226 44779 44378 0 0
+TGTAAATAAGATCATGGCAATGTTAGGAGGTTAAATATGACAAAAATAAAGATACTGATACTTGCAGCTTTTGTCTCATTTGGAACCGTGCATAGCGCCAGCGCGGAAAATGGAAGTGATGCTCTGCCACTGACAGGAGAATTTCTTGAGCAACCTGTTAACAGTAGTGATCCATGTACTGTTTTTCTCTGTATGGCTGGAATGCTTAAGGGGGAATCGCCTGGTG
+CATGGATCACTACTGTTAACAGGTTGCTCAAGAAATTCTCCTGTCAGTGGCAGAGCATCACTTCCATTTTCCGCGCTGGCGCTATGCACGGTTCCAAATGAGACAAAAGCTGCAAGTATCAGTATCTTTATTTTTGTCATATTTAACCTCCTAACATTGCCATGATCTTATTTACATACTGTTGTGTTTCCTTATAAGGGGGGATACCGCCATATTTATCAACAGC
+NODE 1534 2014 112674 111564 0 0
+GATTAATCTGGGCATCGCCCAGGCAGGTGTAACAGCTATTGACGACGCTATCAAAAATAAAATAGCCGCAAAGGTTATTGAGAATACTAACTTAACGAACGCAATATTTGAGCCAAATCATACACAAAGTTCAGTTACTCAATTAGTTTATTCATGTTTGTTTAAGAATGAGATATTAATGAATATGCTTGAGGAAAATTCCTCTCATGACCTGCTATGTTTAAACGATCTTGCTGAATATGTGGCGCTACAAGTTCATAACAGCCTTTTTTCTGAAGATTTATCTTCACTCGTTGAAACAACAAAAAATGAGGCTCATCACCAGAGTTGACCACACCATAAATTATTATGGCTTACAATCCCCTGGCAATACCAAAACCATCTAATACAATACCTTTAAAATTTACTTCCAGGAAATAATGAATTTCGCATGGAACGAATTGGCTCGTTATTTTTATAATTGAGATACTGAGTATAAGTATATTTTCTCAT [...]
+GGACCGAGCATTTTTTTGTTCCCTCCACGGAGAAAACCTTCCATCGCGGCAGCACCGACTATTTTGTTAACGCGCGTAAAGGTGATATTGGCGCATTTGATTCACCAAAATTTATTGGCTTGCCGGTAGGCGAGGTGCTGAATGTGGCGAAGGATTATCTCGACGTAGAAGCTACGGAGCCGTTGGCGAATGGCGATGGTCTGAACGTGTTGATTAAGCGTGAAGTGGTGGGTTTTCGCGCCAATACGGTGGAGAAAACCGGTCATAACCGCTACCGCGTTTGGCCAAATGATATGCCTGCCGACCTGCATAAAGTCCGTCCGCATCATCCGTTGAATCGTAATCTGGATCATAACTGGCAGCAAGCGCTGACAAAAACCTCCAGTGAGCGCCGTGTGGCGGTTGATATCATGCTGGGCGGCTGGCAGGAACAGCTTATTCTGACGCTGACCAGTGAAGACGGTGTCTGCATCACGCATACGCTTGACGGGG [...]
+NODE 1535 51 3032 3032 0 0
+CCTTTAGCGATCTGCTGGAAAAACTGGCCATTGCGCCGGAAAATGTTGCCT
+GCGATCAGCTTATTCGACTGTCCCTGATAAAGATGGACAATCCCCAGCGTG
+NODE 1536 1789 115362 114735 0 0
+ACCTGCATTCTTTTGTCTTCGTCTTCGCTCCATCTTGGCTTAACGAATGCCGTTTTTAATGACAGTTTTTTTGCTATGTAATAAAACTGATTTATGTTTAGGCCCAGATGTTCTGCTGCACGGCAAGCTACCATGCGACCGCAAACTGACTCCATCTCCGCTGGAGTTATATTTAATCTTCTCATTAAGCCACCTGTTTAAGCTCATTTATTCTGATATTCATTACCTGAACGCATTTTGTCTGCGCATCATCGTTACCAGCCAATAATTGCCAGCAATGCTGATAACGCTCAATGAGTTTTTTCCTGTCAGTTTCTGTTGCTGCATATTCACTGAAGTCTTTCAGGATTTGCTCGCAGTCAACCGATGTGGATTTCTGGCTGGTATTTTCTGGTGATGGTTGATTGCAAGATGTTGGCATGGCCCAGCCCGGCAGCGATGGAGGGGACCAGTAAAATCCTGTTCCATCCTTCAGTTTTGCCCTGTGCCATC [...]
+GGAAGTGTCTGGATCGCAATCCGTAGCGGCATCACTCGGAATAGAAGGAAAAGCCAGGGCATCTGAAGGCGGAGCTATTGTGCTTTGCTATCGAGATGAAGATGGCGAGTTAATTCATATCCGCGCCAGTAAGGTTGGCGAGAACGGTATTATGCCGGATATATGGTATCAACTGAATGAAGATGGTGAGTTTGTAGAGTGTGAGTGATGCACTTAATGCGGATTCTGTGATTCCGCATTGCGAGCAATATCGCTCGTAACCAAACGAGGACGACGACTCGTTCTGGTTAATCGAAAAATCATCCCTTGATGTTATTTGCCGCTCGCAGTCAGGGCGGCTTTTTTCGCATACCAATAATGCTTCATTCGAGGAATTTTTGTTATGAAAATTAACTAAGGAGCACGCCATGCAATATTGTTTTGCCGGGTGGCCCATTGCTGGCTGCCCTTCTGAATCACTTCTCGACAGAATCACCAGAAAATTACGAACCG [...]
+NODE 1537 11 2276 2276 0 0
+GGTTGCTGCTG
+TGGTCAGCAGC
+NODE 1538 3 628 628 0 0
+ACC
+GAC
+NODE 1539 2 134 134 0 0
+GG
+GC
+NODE 1540 1 203 203 0 0
+A
+C
+NODE 1541 2 394 394 0 0
+AC
+AC
+NODE 1542 15 2815 2815 0 0
+CGGTCAGCAGCAACC
+TGTTGGTTGCTGCTG
+NODE 1543 2 398 398 0 0
+AA
+AG
+NODE 1544 3 591 591 0 0
+CAC
+GCC
+NODE 1545 4 778 778 0 0
+TGGC
+AGTC
+NODE 1546 6 361 361 0 0
+AACCGG
+CTGACC
+NODE 1547 19 1211 1211 0 0
+TCAGCAGCAACCAACACTG
+TTGCCAGTGTTGGTTGCTG
+NODE 1548 3 577 242 0 0
+ACG
+TCA
+NODE 1549 2275 112106 111111 0 0
+GAAATTTTAGCATTTGTTCAATGGGCGTAAACGAACTATCCATTTGGGCATGACCTCATTAATTTCAGCCGATATAGTAACGACAGTGACAAATAAAGTAAATGTATTATTAATACAAAATCATTCTTTCAGGCTATAAAGCAACCAATGATACGCAGACTGAGACGCCAGCGGGAACATTGGGCCCGGTAAAGCGCCGCCTGCGGCAAATCCAGGAATGACGAGAAAAGCGTGAGTGCCTGCATGAAAAAATCAGGAGAGAACGATAAGCGGGAGGGGCGAAAGCCGGGTAAACGGCCTTACAACCCGATGCAAAAGCCACCGGAATATCACGGATAGCTATCGGTGAACGACCTTCGAATCCTTGAACGGGCGCTATTGGCCTGGGAGCAGATGGGGATGCAGGGCTTTCCATAGAATTATATTATTCTTCACCGGTATAAAAATAACCATGATAAATGAATAGCATAACCTTAACAGACTGGGGAGCTC [...]
+GGGTAAAGATGTCGTCTGGCTACAGGTGCCGTTCTCCTCTCTGCCGGGCGAACAGAAAAATATTGATACTAAACTGCCGAACGGCGCGAACTATGGGTTCCCGGTTAATACCATGCATATTGTCGCCAATAAGGCATGGGCGGAGAAAAACCCGGCGGCGGCGAAACTGTTCGCCATCATGAAGCTGCCGCTGGCGGATATCAACGCGCAGAACGCCATGATGCATGCCGGTAAATCGTCTGAAGCCGATGTTCAGGGCCACGTAGACGGCTGGATCAACGCCCACCAGCAGCAGTTTGACGGCTGGGTGAAAGAAGCGCTGGCCGCGCAGAAATAAGATCGTTTTTTATGCCGGATAAGGCGCAGTTCATGCGCCGCTATCCGGCCAACGCAATCTCTCCTCAAAGCGCACGATTCATCACGTCACTGTTCCCCTTTATTCATCAACATCCGCTATGATTGTTTTCCCAGGAAATAATTATCTGAATCACG [...]
+NODE 1550 1362 86415 85564 0 0
+GACAGAGACAAATAGAATGCCAGCGCAAGCGTAATGTGTCCTGAGTCACACCATTGCGATTCATAATGTTTAAATTACGCAAGCAATATAACCATAACTATGGCGAATACACAATCATACACCAAGTGAATGATCATTTAAGTTTCAATTAAATGTTTATATTATTAATAGCTAAAAAGTTAACATTAATTTATCAATAACTTTATCCTTATCCATTAAGTAAACAAGGTTATTTGTTAAAATATAAAACAAATCAAAAAGATAAACCAAACCTTTAGCATACCTTTAACAGTCCATTCCCCTAACCAATTTGCAAACAAAAATGCCTAAATATTTCAAACAATGAAAAGTATGAATGTCCACTCGTTCTTTTATCCTTTATTGGACGCGCAGCCCAGCACAATTAGCTAAAGTACGTATCCGGATATCGTCAACAAAATGCAATGGCGACAGAAAATAGAGTTGACATTAAACGGCATATCCAGTACCACT [...]
+TCGTGGGTATGAACGGAGATGATAGCTTTGTCGATATTGGGGACACGTTCATACAGGCCGGAAATGATTCCCGCAAACTCAAACGGCATGGTATAGCCCACGGTATCGGGAATATTAATGGTTCTCGCGCCGGCGTTTATAGCGGCTTCCACCACGCGCGCCAGATCGTCAACAGGCGTCCGGCCAGCATCTTCGCAGGAGAACTCTACGTCATCAGTGTAATTACGCGCCCGCTTAACCATGTATACCGCGCGTTCGATGACCTCATCCAGCGTGCTGCGCAGCTTGGTGGCGATGTGCATTGGCGAGGTGGCGATAAAAGTATGGATGCGAAACGCGTCGGCGACCTTCAGCGCCTGTGCCGCGACGTCGATGTCTTTTTCTACACAACGCGCCAGGGCGCAAACGCGGCTGTTTTTGATGGTGCGGGCGATGGTTTGGACAGATTCAAAATCACCCGGAGAAGAGACCGGGAAGCCTACTTCCATGACA [...]
+NODE 1551 155 390 390 0 0
+CTCTTGCCAACGCTTCACGGTCACGCAATAAATTGCGTCCCCGTTCACCGTTTTCGGGTAAGAAGAACGCCGGAAACAGGACTTCCCCTGGCTGAATGGTGTGAAATTCTGCGCTATGCACTTGCGCGCATACTCATGCATGCCGTAAAAACAGA
+TTCACACCATTCAGCCAGGGGAAGTCCTGTTTCCGGCGTTCTTCTTACCCGAAAACGGTGAACGGGGACGCAATTTATTGCGTGACCGTGAAGCGTTGGCAAGAGCATCAAGCATGAAGAGAAGGGGGTCGGATGTACGAATGGTTCAGAGAACT
+NODE 1552 425 26219 25849 0 0
+GCGCAGCGATCTTCTACAAGTTTAGCCTTTCGTCCGGTAATAATGGCAACCTCGATATTGGAGGTCAAAGCACAGCGAATACCGTAGCCGTCACGAACGTTGAAAGCCTTCAGCTCTTCGCCGTTATTGCCCATATAAATCAGGCCGTCAGACAATACGCCATCCACGTCCAGGATGAGCAGGCGGATATTCTCCGCTTTGGTCATGACATGGGTGCTGACGGGGCCATAACAGGTCGCAAGCGACGCACCTGCTTTACTCATCGTTAATTATCCTTGAGTTTCTACACGACGCCTGCACGCAGGAGATCATGCATATGTAACACACCGAGTAACTGGTCGCCATCAGCAACCAGTACGGAGGTGATATGGCGGGACTGCATTAAATTCAGCGCATCGACAGCGAGAATACCGGGACGCACGCGA
+CCCGCCATATCACCTCCGTACTGGTTGCTGATGGCGACCAGTTACTCGGTGTGTTACATATGCATGATCTCCTGCGTGCAGGCGTCGTGTAGAAACTCAAGGATAATTAACGATGAGTAAAGCAGGTGCGTCGCTTGCGACCTGTTATGGCCCCGTCAGCACCCATGTCATGACCAAAGCGGAGAATATCCGCCTGCTCATCCTGGACGTGGATGGCGTATTGTCTGACGGCCTGATTTATATGGGCAATAACGGCGAAGAGCTGAAGGCTTTCAACGTTCGTGACGGCTACGGTATTCGCTGTGCTTTGACCTCCAATATCGAGGTTGCCATTATTACCGGACGAAAGGCTAAACTTGTAGAAGATCGCTGCGCCACGCTGGGGATTGTCCATCTTTATCAGGGACAGTCGAATAAGCTGATCG
+NODE 1553 51 2384 2384 0 0
+TTCGCGTGCGTCCCGGTATTCTCGCTGTCGATGCGCTGAATTTAATGCAGT
+ATGCCCCCTGGCGTCATCACCTCGGCGATCCCCAACTGGCGCATATCGCCG
+NODE 1554 2696 128469 125108 0 0
+TCATCGATGAGGTCGATAGCTTTATCCGGCAACTGACGGTCAGCGATATAGCGGTGAGATAATGTTGCCGCCGCCACAATCGCCGGGTCAGTGATCTGCACATGGTGGTGCAGCTCGTAACGTTCTTTCAGGCCACGCAGAATAGCGATGGTGTCTTCCACTGAAGGTTCTGCGACAAACACTTTTTGAAAACGACGTTCCAGCGCCGCGTCTTTTTCAATGTACTGACGGTATTCATCCAGCGTGGTGGCGCCCACACAGTGCAGTTCACCACGCGCCAGCGCCGGTTTCAGCATATTCCCGGCGTCCATGGCGCCATCAGCCTTACCTGCGCCAACCATGGTGTGCAGCTCGTCAATAAACAGGATGACGTTGCCTTCCTGTTTTGCCAGATCGTTCAGCACGCCTTTCAGACGCTCTTCAAATTCGCCGCGATATTTCGCCCCGGCCACCAGCGCGCCCATATCCAGCGCCAGTACGCGGCGACCTTTT [...]
+CGGATGTTCCGCGCGCGGGCATTGTGCATCGTCTGGATAAGGACACGACGGGTCTGATGGTGGTGGCCAAAACCGTTCCGGCGCAAACGCGCCTGGTGGAGTCTTTGCAGCTGCGCGAGATCACCCGCGAATATGAAGCGGTCGCGATCGGACATATGACGGCGGGAGGAACGGTGAATGAACCCATCAGTCGTCACCCGACCAAACGTACCCATATGTCGGTGCATCCCATGGGCAAACCGGCGGTGACCCACTACCGCATTATGGAACATTTCCGTGTGCACACGCGTCTTAGGTTGCGTCTGGAGACCGGGCGTACGCACCAGATCCGCGTGCATATGGCGCATATTACGCACCCGTTAGTGGGCGATCAGGTCTACGGTGGTCGTCCACGTCCACCGAAAGGCGCATCGGAAGAGTTTATTTCCACTCTGCGTAAGTTTGACCGCCAGGCGCTTCATGCAACGATGCTGCGTCTCTACCATCCTGTAT [...]
+NODE 1555 770 108654 107452 0 0
+GATGGAGCTGCACATGAACCCATTCAAAGGCCGGCATTTTCAGCGTGACATCATTCTGTGGGCCGTACGCTGGTACTGCAAATACGGCATCAGTTACCGTGAGCTGCAGGAGATGCTGGCTGAACGCGGAGTGAATGTCGATCACTCCACGATTTACCGCTGGGTTCAGCGTTATGCGCCTGAAATGGAAAAACGGCTGCGCTGGTACTGGCGTAACCCTTCCGATCTTTGCCCGTGGCACATGGATGAAACCTACGTGAAGGTCAATGGCCGCTGGGCGTATCTGTACCGGGCCGTCGACAGCCGGGGCCGCACTGTCGATTTTTATCTCTCCTCCCGTCGTAACAGCAAAGCTGCATACCGGTTTCTGGGTAAAATCCTCAACAACGTGAAGAAGTGGCAGATCCCGCGATTCATCAACACGGATAAAGCGCCCGCCTATGGTCGCGCGCTTGCTCTGCTCAAACGCGAAGGCCGGTGCCCGTCTGACGT [...]
+CCTTACATTTCAAAAACTCTGCTTACCAGGCGCATTTCGCCCAGGGGATCACCATAATAAAATGCTGAGGCCTGGCCTTTGCGTAGTGCACGCATCACCTCAATACCTTTGATGGTGGCGTAAGCCGTCTTCATGGATTTAAATCCCAGCGTGGCGCCGATTATCCGTTTCAGTTTGCCATGATCGCATTCAATCACGTTGTTCCGGTACTTAATCTGTCGGTGTTCAACGTCAGACGGGCACCGGCCTTCGCGTTTGAGCAGAGCAAGCGCGCGACCATAGGCGGGCGCTTTATCCGTGTTGATGAATCGCGGGATCTGCCACTTCTTCACGTTGTTGAGGATTTTACCCAGAAACCGGTATGCAGCTTTGCTGTTACGACGGGAGGAGAGATAAAAATCGACAGTGCGGCCCCGGCTGTCGACGGCCCGGTACAGATACGCCCAGCGGCCATTGACCTTCACGTAGGTTTCATCCATGTGCCACGGGCAA [...]
+NODE 1556 51 3096 223 0 0
+CGTCTGGTATGCGAATCCAGTTCCCCAATCCTGGCGCTTTGCCTTCGCGAC
+GCCCGTGGATTATTAATGATAACTTCGTAAATAACCTTTCAGACAATGAGG
+NODE 1557 1330 270678 269499 0 0
+GCCCTCAAACGGAGCAGGATAATGTTCAGGATTGTATAAAGAATGATGGTTCAATTTCTCCGAGTGATGAGGATTACTTTAATCCTGACATGATTAGTGATGAAGAGCTAGCGATGATAAATAAAACAGTATCGTCAGACAGTAAATAAAATAAATCTGGCATCTAGCTGATGCCAGATTTTTTAGTTAATAATATGGTGTACATATGGATAAAACGACAAAAACATATCCTTTTGGTGAAATTGAGTTTTTTGACCAGTTAGAGGAACATGCATGGGACCAGATTCATGATGGTATGCTACCAATTATGGATTTGTATCTTGATCCGACAGTAACCGATATATTTATAAACAGGTATGACAATATATATACATCTGTCAATGGCAAGTATGTAAAGACCGACAGTTCCTTTTCCAGTGAACGGGCACTTAAAGCCTGGATTGATCAAATCGCAACGGTGTTGAGGCAGCCATTTTCAACGTCAGGAAACTA [...]
+TGCTAAATGTTCATTTTTTGTCAAACCTGACATGTACTTCTTGCTCTTCATCAAACTTGAATATAGGAACAATTTTCCCTTCACGTATTTCGACGATATCTGTAATTCTTCTTCCATGCTTTGATGTTCTCCGGCACTGAATAATCACGTCAACCTCTGACATAATTAAATCCTGAGCTATCTGAAAATCGATACTGAGATAGCTTGACATAAGCCAAGTCATTTTGCGTATTGCCCCCATAGGGGTAACGGAGTGCAGAGTTGTAGCATTACCTATAGTTCCACTTGCCAGAACCATGTAATAAGCAGCTATAGCCTCTGCCGTTCTTACCTCCCCAACCCATACACGATCGGGATTACCACGCATAGTCAGGTGAACCAGAGAAGGAAGATCCGCATTCACATCTTTACGATGTGCAGCTTCCAGAGCAATCCCTAACGGAAAATACCTGTGTATATGAAGTTCTTGAGTGTCTTCGGCGGTGATAACAC [...]
+NODE 1558 51 3407 3295 0 0
+TTTTGGTGTTGAAATGCCAATAACCGAGGAAATTTATCAAGTATTGTATTG
+ACGGTGCGCCAATTCACGAACTTCTTTCGTATTGCGATAGCCTTCGACCAC
+NODE 1559 168 10799 10799 0 0
+AGATAACCGTACCGTTTACCAGTACCTGCAAAAGCACGGTCTGAAATACCATTCGCTGTGGGATCAGGGCTATCTGTCGGTAGGCGATACGCACACCACCCGCAAATGGGAGCCGGGCATGGCGGAAGAAGAGACGCGGTTCTTCGGGCTGAAGCGCGAGTGCGGGCT
+GCCCGGCTCCCATTTGCGGGTGGTGTGCGTATCGCCTACCGACAGATAGCCCTGATCCCACAGCGAATGGTATTTCAGACCGTGCTTTTGCAGGTACTGGTAAACGGTACGGTTATCTCAGTCGATAATCGGTAGCACTTTAAACACGCCGCGCTGAATCGCTAGCAC
+NODE 1560 39 1868 1868 0 0
+GGATGAAATTATGATCTATGTGGCAGGACGCCAGATTCT
+GATACGTTCGCAGCGAACATCGCGCCAGAAGCGGGAGAC
+NODE 1561 51 3745 3745 0 0
+GTATCAGGCGCATCAATTTGAGCTCTGCTGGCGTGGGTTTTTCGCGTTTCG
+CAGGCGAACCCACGCTTAAGTAAGCAATTGATGGAGTAATTTTTACCCCTT
+NODE 1562 1584 94613 94396 0 0
+CTAATGAACTGGACCGATGGAGCCAGACATATCACAAAAGAAAACTGGCAGTAATTGGACTGCTGGATGACCAGTACCCTTTGGCTATTTTCCATGGGGATGTAGGCACAGGCAAAACAGCTAACGCCGAAGCAATAGCTAACCGTTTAGCCCGTGATGCAAAACTCGAAGATGCCATTCTTTTTAAGCTGAGTAACAAAGTGCGCGGAACAGGCAAAGTAGGCGAAATGGGAACTTTGATTACTCAAGCTTTCGAAGAAATTACCAGATCTATCGGGCCGGGCAAGGGGCGCGCTTTTCTAATCATTGATGAAGGTGATTCTTTGGGAGCATCCCGTAGCCAGGATCATAGCCATCACGAAGATAAAGTAGGTGTCAACACTCTTATTCAATCTATTGATGGTATGCGTAAACATAGTGGACGTATTTTTGTCATACTTTGTACAAATCGGCTGAGAGCCCTTGACGCTGCAGTTATTCGCCGCGCTTCAA [...]
+AAAGAAATTGAGAATTTATCATTCATTATTCTTACAGTTTCATCCTTTTAAAAATTATTAGAAATTTAACGTAACGTTTATTGTAACGCCTGACCCAGCACAAAAAAATTTAGTTATTCTGGGGCTGATTCAAGTCAGTTATCTGCGCAGGCTATAACCGACCATACCCTACGCAGATATTTGACTAATATTAACTATTTTTTTTGCTTAATTCGTAAACTAACCTGAATAGTTCAGCTTGATATTTTGCGTCGTGAAGAGCATCGTGATCTCCCTTTTGGCTTGGACTCACAATTTTATCAATCGCACTGGATCTGGTTTCATACCATGAACATCCCATGACTCCCATGAAAAGGGCCTTGATATCCAACGCAGTGAAACCAAATGGGTTATTTTCTAGATATTTCAGAAAATAGTAGTTCACAAACCCCCAGTCGAACGGCGCATTTAATCCTACAAACACTGCTGTGCTATCTTTAGGTAAGTTATTGG [...]
+NODE 1563 1425 73529 73318 0 0
+TTCTATTATTGGGGCAATGTCGCTGGCTTATGTTTATGCGAGGCTGGCAACCAAAAACCCTCAACAGGGTGGCCCTATCGCTTATGCTGGGGAAATATCTCCGGCGTTTGGTTTCCAGACCGGCGTTCTTTATTATCACGCAAACTGGATTGGTAACTTAGCCATCGGTATTACCGCTGTTTCTTATCTTTCTACGTTCTTCCCGGCATTAAATAATCCAATACCGGCAGGTATTGCCTGTATTGCTATCGTCTGGCTGTTCACCTTTATTAATATGCTGGGTGGGGCCTGGGTCAGCCGCTTGACAACGATTGGCCTATTCCTGGTGCTGATCCCGGTAGTCTTGACCGCAGTCGCCGGCTGGCATTGGTTCGATATCGCGACCTATCACGCGAACTGGAACACGTCCACGACGACCGACTCTCACGCCATTGTTAAAAGTATTCTGCTCTGCCTGTGGGCGTTCGTTGGCGTTGAGTCTGCCGCCGTCAG [...]
+CGGAAATTTAAACCTTCCAGTGCACGATGCAGTTCACGAATAGGCTCTTCTTTAAAGTAGACGCCCATGTGGTTCATGATAGCAATAACGTTCATAGTCTTGTTCCTGGTAAAGTGGGCCCCTCCCGCTACGCTATAGCAGGTGACGAAAGGGGCTTTGAGAAAAAGGAGTTAGCGGTTAAAGCGCTTCAGCCGTATTGTTGTCGCTGTCGTTGTTCTGGCGCTGGTGCATTTTGCGACCGTAGAACATCAGGATGATCAGACTGACGATAAAGGTGCCGGAGAGTTCGAAGGAGCTGGCGCCCATCAGTGCGATGAAGCAAAATGCGCAGCCCAGTACAGAACAAATCAGGCTTACCGAGTTACGGATGTTGAACCCTTCGAAGCGAATCAGGTCAACACAGGAGTAGAAGTACGGCAGCATGGTAAGCAGTACGGCAATCCCGGTCAGTTCGCCGAACAGGTCGGACGCTTTACCGCCGCTGGAGTTCAT [...]
+NODE 1564 2151 121361 119137 0 0
+CAGGCGGGATTAAACGGCTTGTTTTCGTGGAGTTCCGGGTACAACTGGCTCACCCATTTTGTCGTTGCAGGCATAAATTGCGCCATACCCTGCGCGCCAGCCGGAGAAAGCGCGTCAGGCGCCCAGCCGGATTCCTGATGTAGTTGCCCGGCAAAATCCGCAACGGGGGCGTTAAGCCCCCAGATTTCGCGCGCGGTACGAATCACTTCGTTTCGCCATTGCAGAGAAGCGCGCGGCGGTTCGGCAGCGTCGGCAGACAAGAAAGTCATAGCGCAGACCAGGCATACGTATTGATAACGCATCGTTACAGCCCCAGCGCGACGGCAAGGCAAATTGCCGCAACGATGATCGCGCGACGAATCATCGCAGCGGCGCAGCACAGCGATTCTTCCCAGGGACAGAAGGAGTCGGGACGCGCCCAGGGGAAAAGACTGCGGTCGAGCCAGTAACCCAGCACCGCTGATAACGAAACCAGGCTGAGTTTATAGATGA [...]
+TCCGCGCGCTGGCGCTGCGCCGCAATCAAACGCTATTGACGCTGCACAGCCTGAATATGCTGCACTCACGAGGTTTCCTGGCAGAGGTGTTCGGCATTCTGGCGCGGCATAATATTTCGGTAGATCTGATTACCACTTCGGAGGTGAGCGTCGCGCTGACGCTGGATACTACCGGCTCCACCTCCACGGGCGATACGTTACTGACCCAATCCTTATTGATGGAGCTTTCCGCGCTGTGTCGGGTAGAAGTCGAAGAAGGACTGGCGCTGGTCGCGCTGATTGGCAACAACCTGTCAAAAGCCTGCGGTGTTGGTAAAGAAGTGTTTGGCGTCCTGGAACCGTTCAACATTCGCATGATTTGTTACGGCGCCTCCAGCCACAATCTGTGCTTCCTCGTGCCGGGAGACGATGCCGAGAAAGTGGTGCAAAAGCTACATCAGAACTTATTTGAATAATCGCCCTGACACGGCAGCGGGTGAGCGCTATCAGGCA [...]
+NODE 1565 51 2816 2816 0 0
+AATGGTTTCCGGCTTTTTAACTTCACCGAAAGACCATGAACGGATCATGTC
+TAACTACCGTACGTTCAAACCTGAGCGTGACGGCCTTTTCTGCGCCCGTAT
+NODE 1566 270 15105 14894 0 0
+AAAAGTGATCGCCCCTTATCCGCTTTCTACGCCAGTGGCGGATATCGCCGCCCAGGCGCTGAGCCCGCAGGGAATAAACGCAATGCGCGATCGCGTGGCGCAGACAGTGCAGGAACGTCAGTATCTGGTGAATGCCCTGCAACAGACCGCCTGCGTAGAACACGTCTTTGACTCTGAAACCAACTATATTCTGGTGCGGTTTACCGCCTCCAGCAGCGTGTTTAAATCCTTATGGGATCAGGGCATTATCTTACGCGATCAGAACAAACA
+CACGCTGCTGGAGGCGGTAAACCGCACCAGAATATAGTTGGTTTCAGAGTCAAAGACGTGTTCTACGCAGGCGGTCTGTTGCAGGGCATTCACCAGATACTGACGTTCCTGCACTGTCTGCGCCACGCGATCGCGCATTGCGTTTATTCCCTGCGGGCTCAGCGCCTGGGCGGCGATATCCGCCACTGGCGTAGAAAGCGGATAAGGGGCGATCACTTTTAACAGCAGGTTGATCACCTCTTCATTAGCCAGCGTAAAGCCGCAGCGCAG
+NODE 1567 32 1584 1566 0 0
+CGTCAAGGATGACGATCTGTAGAGGGTATTTT
+GAAATGTGAACGCGCCGATTTTATGCCCACGC
+NODE 1568 18 870 814 0 0
+TTATCCACCGCCAACGGA
+TGGCGGCAGGCAATGAGC
+NODE 1569 51 2437 2353 0 0
+ACCGCGCAACAACCATGCTCTCACAATGTGCCCGTTTTATCCGCCGCCTCT
+TTCCGTTGGCGGTGGATAAAAAATACCCTCTACAGATCGTCATCCTTGACG
+NODE 1570 368 22309 22073 0 0
+CGTTTCGCTTTTTCAGCGGCTTCACGCTTAGCTTGTTCTGCGGCCTCGCGTTCAGCTTTTTGTTGCGCCTCGCGTTTGGCCTGTTCTTCTGCCTCACGACGGGCTTGCTCTTCCGCTTCACGCTGCGCCTGCTCTTCCGCGGCCAGGCGTTCAGCCTCTTGCGGATCGCGTTTCACAAAGGTGCGCTTCTTGCGGACTTCGATTTGTACCGATTTACTTTTTCCACCGGTACCAGGAATATTCAGGGTGCTGCGCGTTTTACGCTGCAGCGTCAGTTTATCGGGACCAGAAACCGCTTCGCGGTTCAGGTGCGCCAGTAAAGTCTGTTTTTCTTGTGCGGACACAGAGTCGTCAGCAGATTTCCGGAT
+ACTGGCGCACCTGAACCGCGAAGCGGTTTCTGGTCCCGATAAACTGACGCTGCAGCGTAAAACGCGCAGCACCCTGAATATTCCTGGTACCGGTGGAAAAAGTAAATCGGTACAAATCGAAGTCCGCAAGAAGCGCACCTTTGTGAAACGCGATCCGCAAGAGGCTGAACGCCTGGCCGCGGAAGAGCAGGCGCAGCGTGAAGCGGAAGAGCAAGCCCGTCGTGAGGCAGAAGAACAGGCCAAACGCGAGGCGCAACAAAAAGCTGAACGCGAGGCCGCAGAACAAGCTAAGCGTGAAGCCGCTGAAAAAGCGAAACGTGAAGCTGCGGAAAAAGACAAAGTGAGCAATCAACAGACTGACGATATGA
+NODE 1571 19 810 794 0 0
+ACGCGGTATTGCACGTTCA
+ACCAGCCCGGACGATAGCC
+NODE 1572 5077 274419 273443 0 0
+TTTCAACGCGCACGACGTTTTCATCAGACGTCAGCATCACGCCTGACGCCGCCAGTTCGCGCACCGCTTCGACGTTCACCGGCGTGACGTCGTCAATAAATGTCGGCTTCCAGTTCAGACCTGGCTCTACCAGATGGCTGAATTTACCAAAACGCGTCACAACGCCACGCTCGGCTTCTTTAATGGTATAAAAACCGCTGGCCGCCCAGATAATGACTACTGCCGCCGCGGCGATGGCGACAATACGGCCTCCCAGTTGCGGACGCGGGCCTTGCGATGAGCTACCGCCGCCGGAACCGGTGCCTTTACCGCCCCCAAAACCACCGAGTTTTTTACTCAGCTTACGGAAGATATCATCCAGATCGGGAGGTCCCTGATCGCGGCCACCTTTGTTTCCATTTCCCCCAGAGTTGCTGCCAGGTTTGCTGCTTCCCCACGGGTCGCGGTCCTGTCCGTTATTACCGGGCTGATTCCACGCCATGTTTGTGCTCC [...]
+CGCTGGCCCGTCATGCCACCAGTAAAATCGCCTCGCTTGACGATCTGGAAGCGATTATCAGTCTGGGATTTCGCGGCGAAGCGCTGGCCAGTATCAGTTCGGTCTCGCGTTTGACGCTAACGTCGCGCACGGCGGAGCAGGCGGAAGCCTGGCAGGCGTATGCGGAAGGGCGCGACATGGACGTGACGGTAAAACCCGCCGCGCACCCGGTCGGCACCACCCTGGAAGTTCTGGATCTCTTTTATAATACGCCCGCCCGGCGCAAATTCATGCGTACCGAAAAAACGGAATTTAATCATATCGATGAGATCATCCGTCGTATTGCATTGGCCCGTTTTGACGTCACGCTTAACCTGTCGCACAACGGCAAATTGGTACGACAGTATCGCGCTGTCGCAAAGGACGGGCAAAAAGAGCGCCGGTTAGGCGCCATCTGCGGCACGCCGTTTCTCGAACAGGCACTGGCGATCGAGTGGCAGCATGGCGATCTGA [...]
+NODE 1573 51 2675 2675 0 0
+CATGTTTTTCTTCCTGTACCTGTCTGTGTTGTGCGGGCTCTACGGCCTTTG
+GGTAGATCAGGTAAAAGTCGCAGCCGACGAACAGGCTCCGGCTGAACAGTC
+NODE 1574 2339 117018 115001 0 0
+CCATTCGTCTGCAACGCATGAGTGATTTTTCGCCCATCGCCGTACTTTTCACATAATGCGACAACCCGGCGGAAAAACGGTAGCCCCATCATGGTCGGTTCGCCGCCCTGCCAGGCAAAGTCAATGCGGTCGCCACTCTGCGCGGCAATATGCTGGCGTATAAACTGTTCCAGCGTCTCGTCCGACATCCGCCAGTTTTTATTGCGTTCCGGGTACAGCGCCTCTTTTTCAAGATAGAAGCAATATGTGCAATCAATATTGCAGATCGCGCCGCCGGGTTTGGCCATTACGTGACAACCTGCTACCGCCATGTCAGACATCTCCGTTAAAAAATAAGGTTCACCAACGCCATGAGACAATGCGACGTTTATCGTCGCCAGGGAACATAACAGAATGGAAAACCTCGTTTTGTGCTATGAGAGCGCTGGGCGATCATGACAAGAAAAACGATCTGCGAGGCAATAAAAGCCGCCGCGCTGCTTCCGGGGACGC [...]
+GCCTTCAAACCGGCTTACGACGCGCTCGCCGGCCAGGTGAAGCTGTTGCTGACGACCTATTTTGAAGGCGTGACGCCAAACCTGGACACTATTATCGCGCTACCGGTACAGGGGCTACATGTTGACCTCATTCATGGCAAAGATGATGTAGCGGAACTGCATCAACGTCTGCCGGTCGACTGGCTGCTTTCCGCAGGCTTGATTAACGGGCGTAATGTCTGGCGCGCCGATTTGACCGAAAAATACGCGCAGATTAACGCCATTGTGGGCAAACGCGCGCTGTGGGTAGCATCCTCCTGCTCTTTGCTGCACAGCCCGATCGATCTCAGCGTCGAAACGCGTCTGGATACGGAAGTTAAAAGCTGGTTTGCCTTTGCGCTGCAAAAATGCGGTGAACTGGCGTTGCTGCGCGATGCGCTGAACAGCGGCGAAACGGCGGCGCTTGAGGAATGGAGCGCACCGATTCAGGCTCGTCGTCACTCCCGCCGCGTA [...]
+NODE 1575 14772 734336 728170 0 0
+TATCTATATGGGCGCCAAAGACGTTGAGCGCCAGTCGCCGAACGTCTTCCGTATGCGTCTGATGGGCGCTGAGGTCATCCCGGTTCATAGCGGCTCCGCTACGCTAAAAGATGCCTGTAACGAGGCGCTGCGCGACTGGTCCGGTAGTTACGAAACCGCGCACTATATGCTCGGCACGGCGGCAGGACCGCATCCCTATCCCACCATCGTTCGCGAGTTCCAACGCATGATTGGCGAAGAGACGAAAGCGCAAATCCTCGACAAAGAGGGCCGTCTGCCAGATGCCGTTATCGCTTGCGTCGGTGGCGGCTCAAACGCTATCGGGATGTTTGCGGATTTTATTAATGATACCAGCGTCGGGCTAATAGGCGTTGAACCTGGCGGTCACGGTATTGAAACCGGCGAGCATGGCGCGCCGCTTAAACATGGTCGCGTTGGCATCTATTTCGGGATGAAAGCGCCGATGATGCAAACAGCAGACGGGCAAATTGA [...]
+GTCGGAACGCTGTATGGCTCGCTGTCCGGCTATCTGGGCGGCAAAATTGATTCTGTGATGATGCGGTTGTTGGAGATCCTCAACTCGTTCCCGTTTATGTTCTTTGTGATTTTGCTGGTGACGTTTTTTGGGCAGAACATTCTGTTGATTTTCGTCGCCATCGGCATGGTCTCCTGGCTTGATATGGCGCGTATCGTGCGTGGCCAAACCCTAAGTCTTAAACGTAAAGAGTTCATCGAAGCCGCGCAGGTGGGTGGTGTGTCGACCGCCAGCATTGTGATCCGCCATATTGTGCCTAACGTCCTGGGCGTAGTGGTAGTGTATGCATCGTTGCTGGTGCCCAGCATGATTCTGTTTGAGTCTTTCCTCAGTTTCCTGGGGCTTGGGACGCAGGAACCGTTAAGCAGTTGGGGAGCGTTGTTGAGCGATGGCGCAAATTCAATGGAAGTCTCACCGTGGCTGCTGCTGTTTCCGGCTGGCTTTCTCGTGGTG [...]
+NODE 1576 51 4731 4731 0 0
+TCGAGGAACTTGGCGAGGAGTTAAATGATGGGAGTCAGGTTTTTTTACAAT
+ACTCTAAAGTTACCATCCCATTGAGTTTGAGTAATCGCAAAAGTATTTGCG
+NODE 1577 255 17121 17121 0 0
+TTTATATAATATGCTTTTCCTTTATTGCTTATCTCAAATTGCGGTGATGGATATGGACATGCATTTTCCTCGTCGCCGTTATAGTATAATGCCAAAACACCAGAATTGATTTTTAAAGAGTAGTCACCAATGCATGTTATCCCCGCATGCCAGGTTGTCATGGATAAAGAAGCACGATTATTTTTACTATCTATCTTTAAATTATATTGTAAAAAAACCTGACTCCCATCATTTAACTCCTCGCCAAGTTCCTCG
+ATAATTTAAAGATAGATAGTAAAAATAATCGTGCTTCTTTATCCATGACAACCTGGCATGCGGGGATAACATGCATTGGTGACTACTCTTTAAAAATCAATTCTGGTGTTTTGGCATTATACTATAACGGCGACGAGGAAAATGCATGTCCATATCCATCACCGCAATTTGAGATAAGCAATAAAGGAAAAGCATATTATATAAAAGGAAAAATGTTTTCATATTCTCAGCCTGGTGAATGGTTGCCACTCAAAC
+NODE 1578 51 4922 4872 0 0
+GCGCAAGGGGCTGATTCTATCAGAAAACGATGCTAATGATGGCGCTGAGTG
+CCCTTTTCGCGCACCGTTTATGGCTAACTTTTGAATAATTTATTATGACGA
+NODE 1579 150 11393 8671 0 0
+CCCGCTGCGGGCGCTGGATTTTGGCCCGATAGACGAACTGCGTAAAAAACACGGTGAGCTGGCTGCCGTCGCGCCGCTGCCGCGCGCGCATTTCACGAAGCCGAATATTGTGATTAAACCCAACGCCAACAGCCGCCCGACCGGGGACAC
+CTTCGTGAAATGCGCGCGCGGCAGCGGCGCGACGGCAGCCAGCTCACCGTGTTTTTTACGCAGTTCGTCTATCGGGCCAAAATCCAGCGCCCGCAGCGGGCAGGATTCCACGCAAATCGGTTTCTTGCCTTCCGCCACCCGGTCATAACA
+NODE 1580 78 7970 6131 0 0
+CCACTTCCCATCTTATACCTCCTTCGGATTGGCCAGATAACCGGTAGTGTCCCCGGTCGGGCGGCTGTTGGCGTTGGG
+TCCGAAGGAGGTATAAGATGGGAAGTGGATGGCATGAATGGCCGTTGATGATCTTCACGGTCTTTGGTCAGTGCGTGG
+NODE 1581 1878 99691 98777 0 0
+ATCCCCTCCGCCTGTGGAATGTCCCGCTCCAGACCACTGTGTCCCCGGCGCAGCGGCATCACCCTCCAGCCGCCCTCGGAGTCTGACACCATTACCAGGGCTGATTCATGGGAAAGCACATACAGCCGCCTGTTTTTCCTGTCGTAATGCAGGCCGGAGATATCCTTCAGGAACCACGGCAGGGACAACCAGTGCGTCAGTGAATCACTGACCGACAGAGAGTCATGGCTGTGGTCCGTTTCTAAAAAACGAAGCGGTTTCTTTTCCTGCGCCACTATCAGGGCATTCTCTCCCCGTCCACGGGCAAGGCCTTCAAAACCGGCATTGTCGCTTTTTCTGTCCACATCCAGGGTCAGGGTGTATAACGTCGGCGGCAGGACAGACGTGTTCCTGCCAATGTGGTGGGTGGTGAGCATCCGTTCCCGCTCCCGGGACAGGACATAGCGGTTCCGGCCGAGGTACTCAATGGCCTCAAAATCATGGTCGCCATCC [...]
+GGATATGCCGTGGTGCGACCGGAGATGTCACCTCCCGGGGCATATGACCTGGCCCTGGTGGCACTGAGTGCGGAGCCGCTGGCCGGCTGGGGACGGCATCTGCAGGGCATCAGAATGCTGCACGCGGCCAGTCCGGTTCCCATGGTTGTTCTGGTACCTTCGCGGCTGCAGGAAATGCGACTCCTGAGAGGAACTGCGCAGGTTATCAGTGGCCGGGACAGCCTCCTCCGGCTGCGTGACATGCTGCGTCAGGCGCTTAAGGGAAGTGCCGGGCCGGAAAGCTCAGGTGAACTGACTGACTTGCGAAAGCGGACTCTGATATCCCTGTGTACGGCCATAACCAGGAATGCCTCACTGAAGGCGGCATCACGCAAGGATTATTACCTCCGCGCCTGCCTGGTGGAGTATGCAGGCGTGGAGAACCTGCATGTACTGTGCACGAGCGGCCTGTTACCCGGGGTGATTACAGATGAGACCGGACAACGGTTCTGA [...]
+NODE 1582 48 3276 3276 0 0
+TGGCGTAAACAAGAATGTATTCCCCCTGGATGGAAACGTTATCAGAAT
+ACCGGTCAGGGCGCTTTACGTTTAGAACCGCTTTCTAAAGAGTATATT
+NODE 1583 51 1971 1335 0 0
+CCCTGCCACAATCATGGCGAGTAACTGAAAAAAAGCCCATCCGATAACGAA
+GATATTTTTGTTAGGCGTATTATTATTTCACCCCATAATATTTGTACAGAC
+NODE 1584 51 3060 2902 0 0
+CCTGCCAGGTTCCAGTTAATCGCCGCAATGAATCCCAGCCCGACCGGACAT
+GGTACGTTATTTTCGCTCTGGTACGGGATAAATGAATTTGACCGGATTCTA
+NODE 1585 41 4863 4863 0 0
+AGGCACATTCTCATCTCTGAAAACTTCCGTGGATGTCAAGA
+GTGAGACAGGTGCTGCATGGCTGTCGTCAGCTCGTGTTGTG
+NODE 1586 37 4273 4273 0 0
+CCAGGTAAGGTTCTTCGCGTTGCATCGAATTAAACCA
+GGAAGTTTTCAGAGATGAGAATGTGCCTTCGGGAACC
+NODE 1587 37 4253 4213 0 0
+TTAACTTCCGGCTGCCCAAAAACAGCCCCGTCCTGTT
+ACGTTGCAGTGTACTGAAAAATGGCGCCAGGTTGCAC
+NODE 1588 35 4925 1970 0 0
+CGCCAGCGCTAATGCCTCTTTAATGGCGTGCACGT
+AGCCAGATGGAGAACCTGGCGGTGGACATGGGCTA
+NODE 1589 19 2550 1715 0 0
+GTTAAGCTTCGCGGCAATC
+CATTAGCGCTGGCGCTGCC
+NODE 1590 73 3281 3281 0 0
+TGAACCGTTACTGCTGCTGCCGATTGGCTTCGGCGGCCTGCTCTCCAATATCCCGGAAGCGGGTATGGCGCTG
+TCGGCAGCAGCAGTAACGGTTCAAACTTTTTCGCAATCGCCAGCCACAGCAGCAGCAGGCTCACCAGCAGCAT
+NODE 1591 3729 212386 210580 0 0
+ATTCATACGCCAGGCCGTGCGCCGCTTCCTCCTCTCTTTTCTGATATCGCGCGCTAATCCAACGTTGAGTGAAGGTGTGCGGTGATCCACAAAAAATGAATAAAGCGAGAGAACGCACGACAGGAGAGCCTTGTTTCGCGGCATCATAATTGCTGATGTGATAATCGTGAGAGGATACGATGCGCAAAGATGCCCTGCTTGCTTTCCTGATGAACCAAACGGATTTTTTTGATCCGGAAAATGTCAGTGAGGTGTTTACCGCGCGCTATCTGGCGCAGCGTTTTAATATGCAGCGTAATACCGCCAGCCATTATCTGAACCAACTGGTGGCGCAGGGCGTGCTCTGTAAAATCAATACCCGTCCCGTCTATTTCCTGCATAAGCAGGCATTTAGCCAACAGTTTTTTACCCTTTCGCGTAATGAATACGCCAGCGTCGCGGAGCTGTTAGCGCACGGGGAACAGGAATGCGCGCCGGACGATCACTTTTCTC [...]
+CAATTGAATCGGCAATATTTTTAATAACCAGCTTCACCGCGGGCGGCTTCGCCATTTTAATGGTGGTTTTACGCAGGTCATCATTAGGTACGCTGTCGTTGGCAATTAAAATACAGTCTGCGCCAACGTACTGCGTCCAGGAAAAGGCGACCTGTCCATGTAATAAACGATGATCCACCCGTAAAAAAACAATCATGACGCTTCCTCCCCTTAAAAATCTTTATCGCTTTGCATGGCGCTGGTGATAGTTTGATTGCAGTACTGAATATTTTCTTTTGAATCCGCTAACGCCGTCATTATGGTATGCGTGGTATTGCCATCGTTTTCCGACATAAAGAGATCGATAACCAGCGGCAGGTTAATCCCTGCCAGCAGATGAAAATTTTCCCGTGATAAATAACGGACAAATTCATTATTCACGCTGCCGGCAAAAATATCGGTCAGCGCAATAATTTCATCTTCCGGCGGGATCCGGGCAATTAGCGTATCTAC [...]
+NODE 1592 32 1839 1839 0 0
+CAACAACAATAAAAAGTTTATATTTATCGGTA
+ACCGGCTGGCGCGCGAATTACCCGACATTAAA
+NODE 1593 19 1503 1503 0 0
+ACGCCGCTTTTTATCGCTT
+GAATCCGTGGCGGATGCGT
+NODE 1594 18 3509 3509 0 0
+TAAGGTTAAGCCTCACGG
+GATTTTCAGCACTGATTC
+NODE 1595 3 552 552 0 0
+TTC
+GAA
+NODE 1596 4 925 925 0 0
+ATTA
+GAGA
+NODE 1597 4 1164 1164 0 0
+GTAC
+GGAT
+NODE 1598 10 2945 2945 0 0
+CGGTTAGCTC
+ATGTTTTGGC
+NODE 1599 4 1865 785 0 0
+TTCA
+TCAC
+NODE 1600 12 4898 3998 0 0
+CCCTTCATCGCC
+ACCGTTATAACC
+NODE 1601 19 7642 6436 0 0
+TCTGACTGCCAGGGCATCC
+CGCCGGTAAGGTGATATGA
+NODE 1602 3024 166103 164479 0 0
+CGATGGGCGCTTCCGGTACGATTAAGGCCGCTCATGAAGTTCTCCTGGCGCTGGGTGAGAAAGATGGCTTCATTACGCCGGAGCGCCTCGATAAACTGAAGTCAGAAGTGTTGAAGCACCGCTCCTTTAATGCTCTCAGCCTGCCGGGTCTGTCTGAAGAACGAAAAGCGGTCTTTGTGCCGGGCCTGGCGATTCTGTGCGGCGTTTTTGATGCTCTGGCTATCCGCGAGCTTCGCCTTTCCGACGGCGCGTTGCGCGAAGGCGTGCTGTATGAAATGGAAGGCCGCTTCCGCCATCAGGATGTTCGCAGCCGTACCGCAAAAAGTCTGGCCAATCAATACAACATTGACAGAGAACAGGCCAGACGCGTGCTGGAAACCACCATGCAGATGTACGAGCAGTGGCAGGCCCAGCAGCCAAAACTGGCGCATCCGCAGCTTGAAGCGTTGCTCCGCTGGGCGGCAATGCTGCATGAGGTTGGACTGAATATTA [...]
+GGCTGGGCAGCACTGCCGGGCATTGTGCTTGCTATCTTCTGGCGCAGATACCCGCAGACAGGGCTGTATGAAACCCTTTCCGTGACGATGCACTTTATCATCACTATCGTGCTAAGCTGGGGCGGCTATCGTGTCTTTTCCCCCCGGCGAAACAATGTTTCCCACGGCGACGCCCACCTGTTGTTTCAACGAATATTCTGGCAGGTATTTTGTTCTGCAACATTATTTCTGGTCATCTACCAGTTTGCCGCTTTTGTTGGTATGTACGAAAGCAAAGCCAGCCTGATGGGTGTAATGCCCTTTAATATCAACACGCTGATTAATTACCAGGCGTTACTGGTCGGTAACCTTGTCGGCGTGCCATTGTGCTATTTTATTATTCGTACTCTCCGCAATCCGCTGCACCTGCGGGGGTATTATCAGCAATTAAAGCTACAGATTGATAGCAAGGCCACTAAAAAAGAGATCGTTATTTGGCTGGCCGTATTGACT [...]
+NODE 1603 2971 149137 146814 0 0
+GGTGTTAACCGACAGCAATGGCGAGAAATCGTATTATCGCGCGAAAGGCAATGCGCTGGAGATGCTCGACAGAGAAGGCAATCCGGTGGCTTCGCAGCTTAATTATACGCTTGTGCCTGTTACCGCCAGCCTGCCGGTAACGCCAATGCCGTTGCGTGGTATGTATGTATACAGGGCCGATGCGGCGACCTTTACCGATTGTGCGACCGGAAAACGGCTGCCGGTCGCCAGTAACGCCCAGCTTGAGCGCGGCTATCTGACGGCGAAAGGTGAAGCGGAAAAACCGGTGCTGCTGACGGTAGAAGGGCATTTTGTGTTTGCCGCGAACCCGGACACGGGCGAGCCGGTAAAAATGCTAATAGCCGATAAAAATGCGAAGTTTGCGCCGGGTAAAGATTGCACTCACTAATAAAAGGCCTCGCAGGGTGCGAGGCCTTTACATATCTGCCGGGTGGCGCCGGGCAATCCCAACAAAATGTCGTTTAGCCTTTA [...]
+CGGCGAACTGCATCTGATAGCGCCTTACAACCAGGCCGATGCCGTTCGCGGCCTGGAAGCTTTCAGCCATTTGTGGGTGCTTTTCGTTTTTCATCAGACGATGGACGGCGGCTGGCGGCCGACAGTTCGTCCGCCCCGTCTTGGCGGTAACGCCAGAATGGGCGTTTTTGCCACGCGCTCCACGTTCCGCCCCAATCCGATTGGCATGTCGCTCGTTGCGCTAAAAGGTATCGAGTGCCGGAAAGAGAGCGTAATTCTGAAATTAGGCAGTCTGGATCTGGTGGATGGCACGCCGGTCGTGGATATTAAACCGTATTTACCGTTTGCCGAGGCCTTACCGAACGCCGCCGCCAGCTATGCGCAACAGGCGCCGATAGCTGAAATGCCCGTGAGTTTTACCGCTGAGGTGGCTCAACAGCTTACGACGCTGGAAAGGCGTTATCCGCAGCTACGGACATTTATTTGCGATGTGCTGGCGCAAGATCCTCGCCC [...]
+NODE 1604 568 34698 34607 0 0
+ATGTTATGCTGCCCCCAGGTCCAGAAATTCTTATCTGCCGCATCAATCCCTCCCGGCGAGGTAAGATCGTACAGCGGGACACCATCATCATCGACAGGGGTTAATAAGTATTGCTTGAATTCGTCAGACCAATCCTCATGGTTCGCCATAATAAAGCGCAGTTCGCCGGAATCCACATTTACGCCAAAAATCGCGCTCTGATGTCGACCGGAACAGATCAGCAAATTGTTGGGTTCATTAATATAGCTTTGGTTGATATGCAGCCAGTCATCCATTGATACATCCTGACCTGGCGCGCTTCCGGAAGGACGCGGCGATCTGGAATAATCCATCACATACAGCATATCGTAATAGGCGACTTCAAGTCCGGTAGATAAGTTAATAATAGAAACGCCATCTTTCCCGGTTGAGTAACCATCTGGCCTTCCATTGCTATATTCTGAAGGCGCAATCGCCAGATTGTTCTCAATGGGAAGAATGGAGTGATGGAAC [...]
+TATACGGTTTATCTTCTCGACAATGAGTTCCATCACTCCATTCTTCCCATTGAGAACAATCTGGCGATTGCGCCTTCAGAATATAGCAATGGAAGGCCAGATGGTTACTCAACCGGGAAAGATGGCGTTTCTATTATTAACTTATCTACCGGACTTGAAGTCGCCTATTACGATATGCTGTATGTGATGGATTATTCCAGATCGCCGCGTCCTTCCGGAAGCGCGCCAGGTCAGGATGTATCAATGGATGACTGGCTGCATATCAACCAAAGCTATATTAATGAACCCAACAATTTGCTGATCTGTTCCGGTCGACATCAGAGCGCGATTTTTGGCGTAAATGTGGATTCCGGCGAACTGCGCTTTATTATGGCGAACCATGAGGATTGGTCTGACGAATTCAAGCAATACTTATTAACCCCTGTCGATGATGATGGTGTCCCGCTGTACGATCTTACCTCGCCGGGAGGGATTGATGCGGCAGATAAGAAT [...]
+NODE 1605 102 5242 3978 0 0
+TGGCACCTGACGCTATTTATCGAAAATGGCCGCATTCTGGACTATCCGGGGCGCCCGCTGAAAACCGGCCTGCTGGAGATCGCGAAGATTCATCAGGGCGAG
+GCCCCGGATAGTCCAGAATGCGGCCATTTTCGATAAATAGCGTCAGGTGCCAGTTGTTGTCGATCCCTTTCACCCAACCGATACGATCGCCGCGACCGGTAA
+NODE 1606 3107 170614 169603 0 0
+CTTCCAGATTAAGCCCGCTGCGTCCCAGCGCTGAAATAATCCCGGAGGTGGCGGTTTGCCCAAGGCCAAACGGATTACCGACCGCCACGGCGAAATCGCCGACGCGGAGTTTGTCGGAATCGGCGATGGCAATTTGCGTTAACTTACTGGGATTCTGAATTTGTAACAGAGCGATATCGCTCTGGTCGTCGCCGCCGATCAGCTTCGCGTCGAATTCGCGTCCGTCATTCAGTTGAATACTGATCTTCTGTGCCTGATTAATCACATGATTATTGGTTAATACATAGCCTTTCGCGGCATCGATAATCACCCCCGAACCGAGTCCTTCAAACGGCTGGGACGGCTGGTCTGGCAGATCCTCGCCAAAGAATTTTTTAAACTCCTCCGGCACTTTTTGGCTCTGGGCGGCGGTTCCCTCGACTTTTACGCTGACGACAGCAGGCAGCACTTTCTCCAGCATAGGGGCAAGGCTTGGCAGCGTCGCCTGGCCTG [...]
+AGGACGGCGGGCAATCATCTCTTCAAAGGTCGCTTGTTTGATACCACCGATGTGGCCGGTGTGGTGATAGTACACTTTGTCAGTACGCTTGTTGCCGGTTACAGCAACTTTGTCAGCGTTCAGAACAATGATGTAATCACCGGTATCTACGTGCGGAGTGTATTCCGCTTTGTGCTTACCGCGCAGGCGACGAGCCAGTTCAGTAGCCAGACGGCCCAGAGTTTTACCGGTCGCGTCAACAACATACCAGTCGCGTTTTACGGTTTCTGGTTTAGCTGTAAAAGTTTTCATTAAAAGCTTACCCAAATAAATAAGTTACACGTTGGTGAACACCCAAACGTTTTAAATAGTTGAGGTTCACACGACAAAGTCCGGTAAACCTACCCCCTCGGATATGTTTGGCCGGCACAGAGAAAGTTTGGGAAAAAACTCTCTTGTAACGTGGGGTCGCAGGATTATAGAGAAGTCCAGGTCAAAGATCGACCCCTTTTT [...]
+NODE 1607 71 4016 4016 0 0
+AGCAGTAAACTGATGTAAAAATCAGTGGTTGTAAAAGAATTCGGTGGAGCGGTAGTTCAGTTGGTTAGAAT
+TTTTTACATCAGTTTACTGCTTAATTTGATGCCTGGCAGTTCCCTACTCTCGCATGGGGAGACCCCACACT
+NODE 1608 1198 47784 47720 0 0
+CTATAGATGAACCGCTGGCGGCGCAGGCGATCGTCGGGCTGAACGAGGATGAGCTGCATCGCCTTTCCCACCAGCCGCTGCGCTATCTCGACCACGATCACCTGGTGCCGGAGGCCAGCCACGGTCGCGATGCGGCGCTGCTTAATCTGCTGCGAACCAAAGTCCGCGAAACGGAAACCCTCGCCGCACAAGTGTTTATTACCCGTAGTTTTGAGGTCTTGCGCCCGGACATTTTACAGGCGCTGAACCGTCTCTCCAGCACGGTTTACGTGATGATGATTTTGAGCGTGGCGAAACATCCGCTGACGGTCGCCCAAATTCAACAACGGTTGGGAGAGAAGCCATGATCATTGAACGCGCCCGCGAACTGGCGGTACGCGCCCCCGCCAGAGTCGTCTTTCCCGATGCGCTGGACGAACGCGTGCTGAAAGCGGCGCATTACCTGCAACAGTGCGGTCTGGCTCGCCCCGTTCTGGTCGCCAGTCCGTTTGC [...]
+ACGGGAAAATCATCACGTTGGCGCGGCCTTGCAGCGGGCTGTCAGGCGCTTTTTGCGCGGCGACCTCCGGTACGAAAGCGGCGTCAAACTGCAATTCACCGTCCACAAGCAGTTGCGGCGCACGTTCGCGAACGAGCTCTGTCGCCTGCTGCACGTTGGCAACATTGGGGTGACGGGCGCTGCCGTTGCTTGAAAATGACAGCATCGCCACGCGCGGCTCTTCGCCGGTAATGGCCCGCCAGGTGTCGGCGCTGGCGAGAGCGATATCCGCCAGCTGCGCCGCCGTCGGCTGCGGCACTACGCTGCAATCGGCGAACCCTAATGCCGGGCCGGCATACTGCGGCAGCATCAGGAAAATAGACGACAATGTTTTGCACCCGGGTTGCAGGCCAATCACCCGCAGCCCTGCGCGCAGCACGTTCGCCGTTGACGACAGGTTGCCTGCGATACACACATCAGCCTCACCGGCGCTCACCATGGCGGCAGCGAACA [...]
+NODE 1609 34 7320 7268 0 0
+GGTTCCGTGCGGTCAGGCTTAGCAGGAGGCTGAT
+GTAGGTGGTCGTAGACCGTCGATGTTACAGCAAT
+NODE 1610 68 2799 2618 0 0
+CTTTTTTTCCTTTCACCGTTTTACCCGCCTCTTTTTCGATGGTGATGACCTCATGGCCGGCCTGACGG
+CGGTGAAAGGAAAAAAAGGCGAGGCCAGCGTCACCATTGATAAGGCTATTGATGACGTTCGTCCCGAC
+NODE 1611 165 7119 7119 0 0
+CGTCTGGCCTTCGGTGGCAATCACCTTCCAGATGTTGCCCGCCAGCGGCGCGGTGACCGGTGTGCCGGCGCCTGCCGGGGCGGTGGCAGGAGCAGAAGAGGCAGCAGGTGCAGCCGCAGTGAGCTGGCTGATATCGCCGCCGTCGCTGACCTTCACCACAAAGGC
+GGCTGCACCTGCTGCCTCTTCTGCTCCTGCCACCGCCCCGGCAGGCGCCGGCACACCGGTCACCGCGCCGCTGGCGGGCAACATCTGGAAGGTGATTGCCACCGAAGGCCAGACGGTGGCCGAAGGCGACGTGCTGCTGATTCTGGAAGCCATGAAGATGGAAAC
+NODE 1612 6 601 601 0 0
+TTTGCC
+CACTGC
+NODE 1613 52 6722 5130 0 0
+TTCCACTTCGACGGTGTAGATACCGGAGGCGGCAGGCTTCTCTGCTTTTGCC
+AAGGCAAAGCCTTTGTGGTGAAGGTCAGCGACGGCGGCGATATCAGCCAGCT
+NODE 1614 125 6848 6848 0 0
+TCAGCTTGCGGAAAACGCCATCGACGACGTCCTCACCGTGGCGCTGTTCCCGCAAATCGGCCTCAAATTCCTTGAGAACCGCAATAATCCGGCGGCGTTTGAGCCACTGCCGCAGGCGGAAGCCG
+TCAAGGAATTTGAGGCCGATTTGCGGGAACAGCGCCACGGTGAGGACGTCGTCGATGGCGTTTTCCGCAAGCTGAATGCCCTTCTCCTGCGCCTGGCGCCTGACGTCCGCTTCCAGTTCAGCCAG
+NODE 1615 51 2549 2549 0 0
+TGCAGCCGGTGGCAAAAGCAGAGAAGCCTGCCGCCTCCGGTATCTACACCG
+ACGGCTTCCGCCTGCGGCAGTGGCTCAAACGCCGCCGGATTATTGCGGTTC
+NODE 1616 51 2942 2942 0 0
+CTAAAGGCCAGCGATGCCGCAGTATTGTTATTTTTTATCAACTGCCATTCA
+GCGGTACGTTGCTGGGCTATGTCATCCCCTTATCCAGCGCGGCGATAAACT
+NODE 1617 17 750 726 0 0
+TATCAGCATGGCGGATG
+ACCCAGGCCGCTAATCC
+NODE 1618 1604 70377 69844 0 0
+TGGATAACGCGCTCTACAACGCGTTCGGACAACGCCTGATTTCAACGATTTATACCCAGGCGAACCAGTACCGCGTCGTGCTGGAACATAATACCGCCAGCACGCCGGGCCTGGCGGCGCTGGAGACGATTCGCCTGACGAGCCGCGACGGCGGCACCGTACCGCTCAGCGCGATTGCCCGCATTGAGCAGCGCTTCGCTCCGCTCTCCATCAATCATTTAGATCAGTTCCCGGTTACGACATTTTCGTTTAACGTGCCGGAGGGCTATTCGCTCGGCGATGCGGTGCAGGCGATTCTCGATACGGAAAAAACGCTCGCCCTGCCAGCGGATATTACAACGCAGTTTCAGGGCAGTACGCTCGCCTTCCAGGCGGCGCTGGGCAGCACCGTCTGGCTTATTGTCGCCGCCGTGGTGGCGATGTATATCGTGCTCGGCGTGCTGTATGAGAGTTTTATCCATCCGATCACGATTCTCTCAACGCTGCCTACGG [...]
+GTACGTTGGCGCTGTCGATCGCTTCGCGGACCTCATCCAGCGAGACGCCCTGGTTAAAGAGCGCCTGCGGGTTTAAGCCTACACGTACTGCGGGCAGGGAGCTGCCGCCGACGTCAACGTCGCCGACGCCGTCAATTTGCGCGATGGTTTGCGCCAGTTGGGTAGAGGCGAAATCATACAGTTTGCCCTGTGACCAGCTCTCCGAGGTGAGCGTTAAAATCATAATCGGCGCGTCGGACGGGTTGGCCTTGCGATAAGTCGGGCGGCTGGGCATTCCGCCTGGCAACAAGCTTTGCGCGGCGTTAATGGCGGCCTGCACGTCGCGCGCCGCACCGTTAATATCACGATCGAAATTAAATTCGAGAATAATGCGCGTACTGCCGAGCGAGCTGCTGGAAGTCATTTCATTGACGCCTGCAATGCGTCCCAAAGAACGTTCCAACGGCGTCGCCACCGACGAAGCCATGGTTTCCGGCGAGGCGCCCGGCAGCG [...]
+NODE 1619 1002 62195 62004 0 0
+AGTACGGTTATATTGGATACAATGCTACCGTGATGAATACGGTGCTGGTATTACTTGTCGTTCTGGTTTATTTAATTCAGTTATCCGGCGATCGCATCGTCAGGGCTGTCACGCATAAGTAACGTTAAACACAACACAAATACTCATTAAGGAAATAAGCATGGCGTTCAAATTCAAAACCTTTGCGGCAGTGGGTGCTCTGATTGGTTCTCTGGCACTTGCGGGTTGCGGTCAGGATGAAAAAGATCCGAATCATATTAAAGTCGGCGTAATCGTTGGCGCAGAGCAGCAAGTTGCCGAAGTCGCGCAGAAAGTCGCGAAAGAAAAATACGGCCTGGACGTGGAATTGGTGACCTTTAATGATTATGTTCTGCCTAATGAAGCGCTGAGCAAAGGCGATATCGATGCCAATGCCTTCCAGCACAAACCGTATCTGGATCAGCAAATCAAAGATCGCGGCTACAAACTGGTTTCCGTTGGTAAGACTTTTGT [...]
+ATTAAAAACTTTATTTGCGGCTTCGTACACTTCATCAGACTGGTAAGCCTGAACGAATTTTTTCACATTCTCGGCGTCTTTGTTATCTTCACGCGTCACGATCAGGTTAACGTACGGAGAATCTTTATCTTCAACGAAGATACCGTCTTTCGCTGGCGTCAGGCCAATCTGGCTGGCGTATGTCGTATTGATGACTGCTAACGCGATCTGCGCGTCATCCAGCGAACGCGGCAACTGCGGCGCTTCCAGCTCAACAATTTTCAGATTTTTCGGGTTTTCCACGATATCCAGCGAGGTAGGAAGCAGACCAACGCCGTCTTTCAGTTTAATCAGCCCTACTTTTTGCAGCAGCAGCAGGGAACGACCAAGGTTGGTCGGGTCGTTAGGCACAGCGACCTGGGAACCGTCCTTGAGCTCATCCAGAGATTTGATTTTTTTGGAATATCCTGCAATGGGATAGACAAAAGTCTTACCAACGGAAACCAGTTTGTA [...]
+NODE 1620 51 2991 2991 0 0
+TGTCCATCGCCGCAGAAAGCATAGGAATATTCAGACGAATAGTTTTCGTCA
+ACCGTGACGGAAGCGCGCCTGGCAATTGCCCTGGCCCAGGAAGGCGGCATT
+NODE 1621 198 7371 6783 0 0
+TTCCAGCACGGCGTCGTTGGTGACGTCGCCGGTACCCAGCGCCTCAACGTTGCTGGCAACCAGCGTGCCGCCGCTGATAAGGGTGCCGCCGGAATAAGTATTGGTGCCGGAAAGCGTGAGCGTCTCGTCGCCGGATTTCACCACCTGCCCGCTGCCGCTGATGGCGTTGTCGAACGTGCCGCCGGTGTTCAGCTCCAG
+GCAGGTGGTGAAATCCGGCGACGAGACGCTCACGCTTTCCGGCACCAATACTTATTCCGGCGGCACCCTTATCAGCGGCGGCACGCTGGTTGCCAGCAACGTTGAGGCGCTGGGTACCGGCGACGTCACCAACGACGCCGTGCTGGAACTGAACACCGGCGGCACGTTCGACAACGCCATCAGCGGCAGCGGTCAGGT
+NODE 1622 51 1990 1980 0 0
+ACTTCACACTGTTCCGCGCCGCGCTCGATATGGCTGATCGTTCCCGACAAC
+TGTTGATGGCGCTACCGGACGGCCAGACGCTGTGCGCCACGATACCGACTT
+NODE 1623 1167 49558 49284 0 0
+GCGTCCGGGCGCGCCAGTAATACATTTTCGCGTAGCGTCGCCGCAGGTAATTGCGGGTTTTGTCCAACCCAGGAGAGATGCTGGCGCCAGGATTCCGGCGAGAGATCGCGAAGCTCGACACCGTTAATACGCAAAGAGCCCTGATAGGAGAGAAAACCGGATAATACATTCAACAGAGAGCTTTTACCGGAACCGCTGCGTCCTACCAGGACGGCGCGTTCTCCTGCCGCTAATGAGAAATTCAGCGGCCCGGCAAGCGTTTTGCCTTCTGGCGAGGTGATAATAAGATTGACTGCGTCAATGGTTACAGGTTCGTTTTCCGCCAGCTCAACTTCGCCGCGCGCCGGGTGGGCGAGGGGCGTTTCCAGAAACGTCTTCAGACTATCCGCCGCGCCAACCGCCTGCGCCTTAGCATGATAAAACGTGCCGAGGTCGCGTAATGGCTGGAAAAACTCCGGCGCGAGGATCAAGGCGAGGAACCCGGCGGCGAGC [...]
+GGGTGGTGTGGTTGCGCGAGCGCGTCGGTTTTCATGCCGGACAACATATTCGCTTTGAGATCCGCCGTCAGGTGTTGGATCGTCTGCAGCAAGCCGGCCCAGCCTGGATTCAGGGCAAGCCCGCCGGTAGCTGGGCGACGCTGGTGTTGGAGCAGATTGACGATATGCATGACTATTATGCGCGCTATCTGCCGCAAATGGCGCTTGCCGTTTGCGTACCGCTCTTAATCGTGGCGGCGATTTTCCCGTCAAACTGGGCGGCGGCGCTGATTCTGCTGGGCACCGCCCCGCTCATTCCCCTATTTATGGCGATGGTGGGGATGGGCGCGGCTGACGCCAACCGCCGCAATTTCCTGGCGCTTGCCCGGCTAAGCGGCCATTTTCTTGACCGTCTGCGCGGAATGGAAACGCTGCGAATTTTCGGTCGTGGAGAAGCGGAAACCGAGAGCATTCGCGCAGCATCGCAGGATTTTCGTCAGCGCACGATGGAAG [...]
+NODE 1624 2468 161166 159917 0 0
+GCATTTTTTTGGGGGTATTTGAAGCTGGCTTTTTCCCGGGCATGGTTTATTATCTTGCATGCTGGTTCCCGGCTCGTGAACGCGGAAAAGTCAATAGTTTCTTCATGTTATCTATTGCTGTAGCATCGGTATTGGCTGCGCCGATGTCTGGTTGGATCATCGAGCATTTGAATACCCCGGATTATGAAGGCTGGCGCTGGCTTTTTGCTATTGAAGGTATCCCTACCGTATTCCTTGGCATCCTGACATTTTATTTACTGCCTGACAGTCCAGAAAAGGCTAAATGGCTTACGCCACAGCAGATATCGGCCTTAGTTAATAAATTACGCACTGACAATGAAACCGCAGCTGCATTAAATAAAAATACCAACTCATCCTTTCTTTCCGTAATCAAAAATCCAGTTTTGCTTCAGCTTTCTTTCGCCTACATGTTGATTCAGGCGGCTGCTCTGGCGGCAAACTATTGGTTGCCGGGGTTGGTGAAGGGATTTT [...]
+GCAAGAGGCTGGAAAATCAATACCTCCCGTGTATACCCGTCATACTTCAAGTTTCATGTGCGTTGGCGGCGAGTTACTCGGCCCATCCCTGGGCCTCGCCCCGTCGGGGTTAGCGCAAGCGCTGTTCAAGACGGTTAACCATTTTATCCTGCAACTCGAATTATTTAGGGGATATGCCGGGAGGCATAAACCATAATCAGTATCACCAGATGCTATTTAATCACATAGGCCAGATATTCTTTCACTACCTCATCGTTTAATTCCTGACCCAATCCGGGCTGTTCCGGCGCGACATAATAGCCATTTTCCGGTTGATAATCGTGGGTACAAAGTTCCCGAATAGATGCTTTCATCGCATTGGTATGATGCTCATGAATAATAAAGTTGGGAATTGCTGTTTCCATATGCAGCGCGGCTACCGTGGAAACAGGACCGCCGCAAACATGCACCTGTACAGTGGTGTCATAAATATTAGCATAGTCACAGATTTTC [...]
+NODE 1625 1000 46657 45794 0 0
+GCTGGCTTTTTAATAACCTTGATAATATGAGCCCGGAACTTCGCCTGACGCTTAAACACTACCTGGAAGATGTTCAGGCTGGCGAGCAACGCAGCAATGGAACACCACAATAACCCGCGACGCTCACAAGCCATTGCGGGCGCGCGTCTATGCGCTATGTAAGGTTCCCTGCGCCAGGCCAATTAAAAAGGCGAACTCCAGCGCGACGCCTTCGTAGGATTTAAACCGCCCCGACTTACCACCGTGCCCGGAGTCCATATCCGTACATAACAGCAGCAGACGTTGGTCCGTTTTTAGCTCGCGTAATTTTGCCACCCACTTCGCCGGCTCCCAGTATTGCACCTGAGAATCGTGCAATCCTGTTGTCACCAGCAGGTGCGGATAGTCCTGCGCTTTGACATTGTCATAAGGACTATAGCTTTTCATATAGTCATAATACTCAATATCCTGCGGGTTCCCCCACTCTTCAAACTCTCCTGTCGTTAGTGGGAT [...]
+AACACCTGTGGATCACCGCACGCGACGGTGTCGAAGTGCCGGTATCGCTGGTTTATCATCAGAAGTATTTTCGTAAAGGGCAAAATCCGCTTCTGGTTTACGGCTACGGATCTTACGGTTCCAGTATTGACGCCGACTTCAGCAGCAGCCGACTGAGCTTGCTGGATCGTGGTTTTGTTTACGCAATCGTACACGTTCGCGGCGGCGGTGAGCTGGGGCAGCAGTGGTATGAAGATGGTAAATTCCTCAAAAAGCGGAATACTTTTAATGACTATCTTGATGCCTGCGATGCCTTATTAAAACTGGGTTACGGTTCGCCGTCGCTGTGTTATGGGATGGGCGGGAGCGCGGGCGGAATGTTAATGGGCGTCGCTATCAACGAACGCCCCGAGCTTTTCCACGGCGTTATTGCCCAGGTACCCTTTGTTGATGTATTAACCACGATGCTGGATGAGTCGATCCCACTAACGACAGGAGAGTTTGAAGAGTGGG [...]
+NODE 1626 34 1604 1543 0 0
+ACCCGTCGCTCTCCGGTATCCATATCCAGTTCAA
+GTGCCTGGGTTTGATTCTGGCTGTTATCAGAGCG
+NODE 1627 2075 115701 111984 0 0
+GACGGGAAAGGCGTTCTGGTCGCGCTGCGCCCGGTGCCGGGCATTCGGGTTGAGCAGGCGTTAACATTATGTCGGCCAAACCGAACCGGCGACATTATGACCATCGGCGGCAACCGTCTGGTGCTGTTTTTATCATTCTGCCGGGTCAACGATCTGGATACCGCGTTAAACCATATTTTCCCTTTGCCGACGGGCGATATTTTCTCTAATCGTATGGTCTGGTTCGAAGATAAACAAATCAGCGCCGAGCTGGTGCAGATGCGCTTATTGTCGCCGGAACTGTGGGGAACGCCGCTACCGCTGGCAAAACGCGCCGACCCGGTAATAAATGCCGAACACGATGGCCGCATCTGGCGTCGTATTCCTGAACCCCTGCGATTGCTCGACGACACCGCGGAGCGTGCATCATGATGACCATCAGCGATATCGTGCAAATTATTCTTTTTTGCGCGCTGATTTTCTTTCCGCTGGGGTATCTGGCGCGCCATTCGC [...]
+ATGCCAAAAAATTTCACGCCCGCCGGGACGTTGGTGATGGAGGGGCTGGGAATATCGCGCAGGCCTGAGATCTGCATTCTGTCGCCCTTCAGCGCACCGCCGTGCTCCGGTACGACCACCACCATCACCTTACGCCCGGATTTCTCCAGTTCGGTAAAGAAGGCGTCCAGTTCATCGAACAGTTTCTGCGCGCGGATTTTATAATCCGCCGTTTTGCTGACGCCAGGGAAGTGGTTGCCATCGTGCAGCGGCAGCAGGTTAAAGAAAGTCGCGGAGCGGGAATTGGCTTCACGTTCTTCCCCTGTCAACCAGCGGTTCAGGACCGCCAGATCGTCATATACCGGCGAGCCGTCGAATGACAGCAGGGCGGTTGGCAGGCCGGACTGGTTCATCAGTTCGCTCTGCATACCGCCGTTTTCGCGAACTTCTTTCAGGAAGCCGCCAAATTCACCGTTATGATCCATCATCAGATGCTGAGTAAAGCCCAGTTTC [...]
+NODE 1628 1141 67564 65597 0 0
+ACGCCGCCGCCCAGGGCTTTCGCCAGACACAGAATATCAGGCTGCACATTTTCGTGCTCGCAGGCAAACATCTTGCCGGTACGCCCCATGCCGGTTTGTACTTCATCCAGAATCATCAGCGCGCCGAATTCGTCACAGAGCTTACGTACCTCTGTCAGGTATCCCTGCGGCGGCAGGATCACGCCGCCTTCACCCTGAATAGGCTCCAGAATCACGGCTGCTATCTCGTCGCCCGTTTTTTTGCCTTCGCTAAATGCCATGCTCATCGCGTCGATATTGCCAAACGGCACATGGCGGAAGCCCGGCAGTAAAGGCATAAAGGGTCTGCGGAAGGTGGATTTGGCCGTGGCGGAGAGCGCGCCCAATGATTTGCCGTGAAATGCGCCGCTGGTGGCGATAAAGGTAAACTTGCCGCGCGGCGACTGATACGCTTTTGCCAGTTTTAGCGCCGCTTCGACGGATTCGGTGCCGCTGTTACAGAAAAAGCTGTAC [...]
+CGTAAAACAAGATCTGCTCAAAATGCATCCAATTGTTAACACGTGACATTAAATGTTGTGTAAATGTGATTATTCCTGGTGTTTATCCCGATTTTCACTATGGGCTTAGACCCCCGCTAATCCCTGCAATACTTAATTCAGTATCATGTGATACACGGCCCTCTGGAGCTCATTTTGAACAGGTTACCTTCCAGCGCATCGGCTTTGGCCTGTAGCGCGCACGCACTGAATCTCATCGAGAAGCGAACGCTAAACCATGAGGAAATGAAAGCACTAAACCGAGAGGTCATTGACTACTTTAAAGAGCATGTAAATCCAGGATTTCTGGAATACCGGAAATCTGTTACCGCCGGCGGGGATTACGGAGCCGTAGAGTGGCAAGCGGGCAGTTTGAATACGCTTGTCGACACCCAGGGGCAGGAGTTTATCGACTGTCTTGGGGGGTTTGGCATCTTTAACGTGGGGCACCGTAATCCTGTTGTGGTATCCGCC [...]
+NODE 1629 5551 278498 273070 0 0
+GCGCATTAACGGTCATGCCGCTCATTTTGGGGCAAATATTATAAGGTTTTTGATGTTAAACGCTACTTTCTTTATTGCACATAGCGCCAGACGGATTGCGGAACCTGACCTACATCAAACAGGCGTCCTCCGGAAACCAGTTCGGCACGGCGGTGATCTGCAGCGCGATACATATTAACAATATCCATGTCATCAGTAAGGGTATAGTTAAGGTGGTCGAACAGTTTTTCCAGACTTTCGAGCGAACTAATTTTGCGGAATTTTAATAGATAATCCTGAACAGTCATATAAAGTTGATCCATATTAAATATAATGCCAACGGAGTAGTCACTGATAAAAAATAAACAAAACCGCACCAGTGAGAGGTCAGGGGTGCAGGTAAAAAGGGAATATTCTTACCGGTAAAGAGTCAGGCGCCACATGGCGCCTGGGGCGAAAGGTTAACGCGCTTTCCTACAACAGGCAATAAACGTCAGACCAGATAGGACATAT [...]
+TTTTTCGGCGGTACGCGTTTTGTACCTATCGTTTCCGCCGTTGTGATGGGGCTTGTCGGCCTGGTTATCCCGCTCGTCTGGCCGGTTTTTGCGATGGGAATTAGTGGACTGGGTCATATCATCAATAGCGCCGGCGACTTTGGACCGATGATTTTCGGCACCGGCGAGCGCCTGCTGTTGCCTTTTGGTCTGCACCATATTCTGGTAGCGCTGATTCGTTTCACCGAGGCGGGCGGTACGCAAGAGGTATGCGGGCATACCGTGAGCGGCGCATTGACTATTTTCCAGGCCCAACTCAGTTGCCCAACGACGCACGGCTTCTCTGAAAGCGCCACTCGCTTCTTATCGCAAGGCAAAATGCCGGCGTTTCTCGGTGGGTTGCCGGGTGCCGCGCTGGCAATGTACCACTGTGCCCGTCCAGAAAACCGCCCTAAAATTAAAGGATTATTGATTTCCGGTTTAATCGCCTGCGTTGTCGGCGGTACAACGGAG [...]
+NODE 1630 44 2265 2199 0 0
+ACTGGTATGAACAAGGTATTCCTCACGGAGGCGTTATTGGGCTT
+TGTAGTGGCTGGCCGGATACACAGGTAACTTAATTTCTGGCGGG
+NODE 1631 42 2304 2304 0 0
+TATGGTGTTTCCCTGGTGTTGCTGCAGTTGCTCAAGGTGAGT
+TTATACGACACACGAACAATTCAAAAAATTGACTGCAGACAG
+NODE 1632 656 37470 36842 0 0
+GAGCAACGTTTCGTGGAGCTGCGGATTCTGTTGTTTGATTTCCGTTGCAAGAATCGCCGCCTCAACCTGCATTTCCCGGGTCACAACATCCACCACCTGCATAAAAGAAGGTACGCCCTGGGTTAGTGCCATATCGATACGCGCGGTGCTATTCGGGATAGGTAAACCCGCATCACAGACCACCAGAGTATCAGTATGCCCCAGACGGGAAATGACCGACGAGATTTCAGAGTTGAGTACGGTGCCTTTCTTCATTTTTCTGCTCCACTAGCGAAACGTTTCGCTGGCCGCAGTGTAACCCTGGATGTGTTCATAAAACCATCATGACGTAACAGAATTGTGATCGCCGTCGAAACGTTTCGCTAGCGGAAATCAGGCGATTATCGTGTGGGAATCTACGGATTGGCCAGGCCGGGTAAGCCAACGCGGCCCCCGGCATGGTGATGGGAGGTTAAATCTCGACCTGCGTTCCTAACTCAATCACGCGGTTAG [...]
+CGCACGAGTCGTTGATTGTCGGCAAACGCCCGTGGTATTTGCGTTTGCGCGGTAAACTGTATTTGTTGCTGCAACGTAACGCTCTGCGCGCGCCGGATCAGTTCGAGATCCCGCCTAACCGCGTGATTGAGTTAGGAACGCAGGTCGAGATTTAACCTCCCATCACCATGCCGGGGGCCGCGTTGGCTTACCCGGCCTGGCCAATCCGTAGATTCCCACACGATAATCGCCTGATTTCCGCTAGCGAAACGTTTCGACGGCGATCACAATTCTGTTACGTCATGATGGTTTTATGAACACATCCAGGGTTACACTGCGGCCAGCGAAACGTTTCGCTAGTGGAGCAGAAAAATGAAGAAAGGCACCGTACTCAACTCTGAAATCTCGTCGGTCATTTCCCGTCTGGGGCATACTGATACTCTGGTGGTCTGTGATGCGGGTTTACCTATCCCGAATAGCACCGCGCGTATCGATATGGCACTAACCCAGGGC [...]
+NODE 1633 292 13071 12569 0 0
+ACCTTACTTGAGAAGCAAGGCATTGATCTGATCCAGGGTTATGACGCCAGCCAGCTCGATCCGCAGCCGGATCTGGTGATTATCGGCAATGCGATGACGCGCGGGAATCCGTGCGTGGAAGCGGTGCTGGAAAAAAACATTCCCTTTATGTCTGGTCCACAGTGGCTGCACGACTTTGTGTTGCGCGACCGCTGGGTACTGGCGGTCGCCGGTACCCACGGCAAAACCACGACCGCAGGCATGGCGACCTGGATACTGGAAGCGTGCGGGTACAAACCGGGCTTTGTGATTG
+ATGCCTGCGGTCGTGGTTTTGCCGTGGGTACCGGCGACCGCCAGTACCCAGCGGTCGCGCAACACAAAGTCGTGCAGCCACTGTGGACCAGACATAAAGGGAATGTTTTTTTCCAGCACCGCTTCCACGCACGGATTCCCGCGCGTCATCGCATTGCCGATAATCACCAGATCCGGCTGCGGATCGAGCTGGCTGGCGTCATAACCCTGGATCAGATCAATGCCTTGCTTCTCAAGTAAGGTACTCATCGGCGGATACACATTGGCGTCCGAACCCGTTACTTCATGACCAA
+NODE 1634 31 1768 1753 0 0
+CTGCAATCAGCAGCGCTTTTGTTTTATCGTG
+GGCAGTGGCCGGCAACGAAAATGACGCGTCA
+NODE 1635 2167 107937 107525 0 0
+GGAATATGCACGACCCAATAGGTCCATGCCGCAAGGTAAGCCAACCCCGGCCCCATCGTATGCTTAATCCAGGTACTGACGCCCCCTTTTCCCTCTTTGAAGGTTGAGCCCAGTTGCCCCACGATTAAGGCATAAGGAATAAAATAGAGCGCAAAAATAAACACCCAGGAGAAGACAACCACTAACCCCTGGTTAGCATAGTTATTGACAACATTGCCGAATCCCCAAACGGTAATAAACGACATCAGGGCGATGTTGTACCATCGCAACTGTTTTTCCTGCACATTCGGCATAACGCGATCCTTCGTGAACACAATGCTATTACTATAAATGAAGCGGGGGATTATGCGCGGTAAAGACGAAGAGAGAAAATAGAGGAGCGCAAAATTATAACCTTCGGCACATTTTATTTTTCAGTAAAGCAAGAAAATTATGCAGGTCAATTATTTTACGTAAAACATAAACAAAGAGTATGCAAGACTCACGTCCTGC [...]
+GGTACCGTTGCTCTCTGTCGCCTTCATTCTGATGCTGGCGGGGGAATTGATTGGCCGCGGCGTATTCTATGGGCTGCATATGACCGTGGGCATGGCGGTAGCCAGCTAACGCGTTGACGCGCATTCGGCCTGCAGAACGTGCAGGCCGAATACGCCTTTAGCCGCCATCAATTTAAGGAATATAACCGGGGCGGAGAAGGCGCATATAAATCCATAGAGAAGAAAACGAAGCTAAAGGAACCATGAAATTTTTCGACTGAACAAAACGCCGATTTTGCGGGTTAGATCAATAAAAACAAGGGGATGAATTTTTAGCCTTTCAATATATTCACGTGCAGAATAAGTAAATCAAATCGATAGTCTCAAAACTTGCGGATCGCCCATGCGGAGCCGATTGACAATGTTTTTGGCGATGGCATGATGCGCATGAAATTTGAACTTCCTCACGGTTTTTATTCATGTCCACCTATACCCGTCCCGTCATGCTTTTGC [...]
+NODE 1636 507 21523 21357 0 0
+CGCAAGCAGCACCATACGCCAGGCCATCAGCGAACCATAATCCGGTACCAGAGCAGACGCCTGCTGAATGGAACTGTGAATCGTCGCCAGTTCCGCGCCCTGCATGGCCACCATAATGGCAATAACCACCAGCGCCAGCACCGAAACCGCAGGTAACAGACGCATCGCCCAACCGTTCACGCCCGCGATGCGCAGCAGCAGATAACCCAGTAGCGGGCCCCCCATAAAGAGCGTCAGGAAGAAGCCCAGCGGCGTCCAGACGCTATACCAGGTCGGTACTGTATCGATGCTGTTATAGACGCGTACCATCATCCAGACGAAGACGACGCCCAGTACCATCGTGATAATCAGCCAGAGTGTGCGCAGTGCCGGCGGCAGCTTTTTCAGTACCGCCAGCAGCCAGCCAATCCCGCCGACCGCAAAAAACACCGAGCCGCTGGCAATTTCATTGCTCAGTGCGGAAGCACCCACGCGGTTAAGCGAGTTAAACGC [...]
+ACTGAGCAATGAAATTGCCAGCGGCTCGGTGTTTTTTGCGGTCGGCGGGATTGGCTGGCTGCTGGCGGTACTGAAAAAGCTGCCGCCGGCACTGCGCACACTCTGGCTGATTATCACGATGGTACTGGGCGTCGTCTTCGTCTGGATGATGGTACGCGTCTATAACAGCATCGATACAGTACCGACCTGGTATAGCGTCTGGACGCCGCTGGGCTTCTTCCTGACGCTCTTTATGGGGGGCCCGCTACTGGGTTATCTGCTGCTGCGCATCGCGGGCGTGAACGGTTGGGCGATGCGTCTGTTACCTGCGGTTTCGGTGCTGGCGCTGGTGGTTATTGCCATTATGGTGGCCATGCAGGGCGCGGAACTGGCGACGATTCACAGTTCCATTCAGCAGGCGTCTGCTCTGGTACCGGATTATGGTTCGCTGATGGCCTGGCGTATGGTGCTGCTTGCGGCGGCGTTGTGCTGCTGGATTGTGCCACAGTTAAA [...]
+NODE 1637 95 3817 3817 0 0
+AGGTGTTATGGCAGGCGAAACGTCGTATTCTTGCTACCGTTTTCGCCTTTGCGTGCGTGGGGTTGCTTCTGTCCTTTCTGCTGCCGCAAAAATGG
+CGAAAACGGTAGCAAGAATACGACGTTTCGCCTGCCATAACACCTCTATAAGGCTAAACAAATCGATTTCATGACTGTTGGCGGGCGGCAGTGAG
+NODE 1638 26 1308 1308 0 0
+ACCAGCCAGGCGATTGTCACACCGGC
+CAGAAGCAACCCCACGCACGCAAAGG
+NODE 1639 2724 147028 145708 0 0
+GCTTCCCGTGGAATGTTCTCCATGATCATATGTTGCAGGATACGCGCCATGATCCAGGCCTGAGCGACAATTAATACGCCACTCATGAACCCCAACAGGCGGGAAATATTCAACCACCGTTGGGAGATTACGCTTTGCTGTTTTAACCAGCGGGTCAGCTCTTTTTGACGGGTTTTATTCATTGCACGCTTAGCAGGTGAGTTATTGGAATTTCAGGCAGGGCAATGTTACAACGACGCAAAAATAAAGGCGACTTATAGTCGCCTTTTTTACTTTTGTTACTGATTTGTAAAAACTATTTGCTCGCGTCGGCCAGACCATCGAGATAGCGTTCAGCATCCAGCGCCGCCATACAGCCCGTACCTGCAGAGGTGATCGCCTGACGGTAAATATGATCCATAACGTCACCCGCCGCGAATACGCCAGGGATGCTGGTTTGTGTGGCGTTGCCATGGGTGCCGGACTGAACTTTGATATAACCATTTTCCAGCT [...]
+AAATAAAGAACAGTGTATCGGCCAGCCACGCGCCCGGCGCGCCGCCTAAATTATGGATGGGTTCATGCCAGGCGGTTTGCGACCAACTGGGGTCCGAAGGGTTAAAGCTCAACAAGGCCGCCATCAACCAGACGGCAAAAAGGGCAATAAGTATCAACAACGCTTCCAGAAGTCGGCGCCCGCTGCTTAACTTCGTCAATGTGACGTCTTTGTCTTCAGTATATTCCTGGCTCAAAAAAGGCTCTCCAGGTTCCAGGCTTTTCCCGCCCGATGCTAAAACGGACAACAGCACCGGGTTGCCCCGGCACTGTTGCTGTATGGATTAACAGGAGTGTAATCAAACTACAGCGATTTTGCACCTGTTCCGTGTTAGCGTGTCTTAATAACCAGACGATTACTCTGTTTTACCTCTTCCATCACTACGTAAGTTCGGGTGTCGTTCACACCTGGCAAGCGCAGCAACGTCTCTCCCAATAGTTTTCGATACGCTGA [...]
+NODE 1640 26 137 137 0 0
+CTTCCAAAAATCCAAGAATTTCACCT
+CAAGGATGTTTTCATTAATCAAGAAC
+NODE 1641 50 51 51 0 0
+AGGATGTTTTCATTAATCAAGAACGAAAGTTAGGGGATCGAAGATGATTA
+AGGTGAAATTCTTGGATTTTTGGAAGACGAACTACTGCGAAAGCATTTAC
+NODE 1642 44 438 438 0 0
+CTAATCATCTTCGATCCCCTAACTTTCGTTCTTGATTAATGAAA
+TCGTAGTCTTAACCATAAACTATGCCGACAAGGGATTGGCGGAG
+NODE 1643 7 57 57 0 0
+ACATCCT
+GATACCA
+NODE 1644 51 2064 1363 0 0
+TTACCCGCGCCAGGATGTACCACCAGATCGCGTGGTTTGTTGATAACCAGA
+ACCCGGACGGTACGGTACTGAACGCGTTGCTACATTATTATCCGCCGATTG
+NODE 1645 4636 265271 261863 0 0
+ATGCCTGGTTAGCCGGAGATGACATCCCCGTACCATGACGAACCAGCGCCGGATATGGCGGATACTGCGTCGTCCGGGTAGGTTTCACCAGTCCGGCACAACCGATCAGAAACAGCTGTATACTCTGCTGTATGGCATGGCGGTAACGCGGTGTCTCACATCCTTCAATCCACTGCGTCAGCACATCCAGGCAGACTGACTTACCGGTAATTTCAAAACGATTTCTGCACCATTCGGCCATATTCAATGCTCCTCTGATAAATGAAGAGGGCATTGTCCCGTGAGGTACAATGCCCTCACGGGAAAAGCGGAGTTGTCACACTCCGCCATCGTCAAAAGTCCGTCCGGTTATACAACCTTCCGGTATTTACTGGTTTCTGTCCCCATTTCGTTGATAGCTACGTCGATATTGCCCGGGAAACGATCTGTTTTAATCTTCCACAAATCGTTTTTCCAGTAACGTGCCACTGTCACATCTGGCGGAACGTTGCT [...]
+CTTTGTATACAATGTGACTATGAGTTGTCTCTGGTCTTCTTAAGCGCATCGTGCTGACGCATTGATGTGTTCACCTGACGGATTTTCCAGTCCGTCAGGGCGGAACGTCCGTCTTTTTCATTCGGAGGTTCCGATGTTTATACCACTTTTGTTACGTGCAGATATGCGCATAACGCCTTTCTTTCATCTTCTCAGACAATGTCTGTTTAATCAGAAGCGTTGTGTTCACCCACAACAGCCCTGGTCCGCTCCACAACTGAGGCATCTGTACTGCACTCCGTGGTTTATTAACGCCACCGGCAATCTGTCAGTCAGAGCCTGCATTGTTTCCACCAACGGTGCATTGCGACACTGCTTTGAGTTCCGTGAAGGCTCTCACAGCCGTGAATATCGTTACTGGTTTGAGGCACTTCCGCTGTCTGTCGTGCGGTTTAATGTCTTTACCGGTCGAATATCCGCTCGCCGCACGCTCTCTGCTGCCTCCCGTATGGC [...]
+NODE 1646 40 1804 1804 0 0
+GGTCAATATCGATATCCAGCTCATCAAATATCGCTTTGGT
+TGGGAACGTTATCCGTTTCGCAAATGCAGATGATCGAAAT
+NODE 1647 1104 51767 51187 0 0
+CGCGTCTGAATGACGCCGTCTGGTACGGCCACCAGGCCTGAGCCGAACCCCTGGGTCAGTACGCGCGTATCCGCCGGGAGGTTCACCACCACCCAGTGCCACCAGCCGGAGCCGGTCGGCGCGTCGGGATCGTAACAGGTCACGACAAAACTTTTGGTGCCCATCGGTACGTCGTCCCAGGCCAGATGCGGCGAAATATTATCGCCATCATAGCCCATACCGTTAAAAACGTGGCGATGAGGAAGTTTATCTCCATCGCGCAAATCGTTGCTGATAAGTTTCATGCGCTCTCCTTTTGACTCACCAGAAGTGTAGCCAGAAGCAGCATCGCTTACCGCTGATTAATGGCTAAAAAATGTTTCATTGTGTACCGCGTCATTGACCGCCTGGGTCAAACGGCGCAGTTGATCCGGACGAATAATGTAGGGCGGCATCAGGTAGATTAGCTTGCCGAACGGCCTGATCCAGACGCCTTGCCCGACGAAGAAGCGT [...]
+CATTTGCCCGCCTGATGGCCGCGCATCGCCATGAAATAGCCGCCGTGATTCTGGAACCTATCGTTCAGGGCGCGGGCGGGATGCGCATATATCATCCACAATGGCTCAGGCGTATTCGTAACATGTGCGATCGCGAAGGCATTCTGCTGATTGCCGATGAAATAGCCACCGGGTTTGGCCGTACCGGCAAACTGTTCGCCTGCGAGCACGCCGGGATCGCGCCGGATATTCTGTGTCTCGGCAAAGCCTTAACCGGCGGCACCATGACCCTCTCGGCAACGCTCACGACACGCCAGGTTGCAGAGACTATTAGCAACGGCGAGGCGGGGTGTTTTATGCATGGCCCGACGTTTATGGGGAATCCGCTGGCCTGCGCCGTCGCTTGCGCCAGCCTGACGCTGCTGGAAAGCGGCGAATGGCGTCAGCAGGTGGCGTCTATCGAGTCTCAGTTACGCGCTGAGTTAGCCCCCGCGCAAAGTTCGCCCTGGGTGG [...]
+NODE 1648 47 2295 2288 0 0
+AGCGCACCCGGATGTCTTTAACCTGCTGCTGCAGGTGATGGATAACG
+TCGATCTCATCCAGCAACAGCACCGCATGAGGATGCTTAATCACCGC
+NODE 1649 321 18213 18059 0 0
+AGAGGAGAATGCGGAGAACGGCACCATCTGACCATCGCTACCACGAACGTACCAGTCGTTAATATCATCCGGCAACATGCGGTATTTCGCTTCGGACATCACGTAAACTTTCTTCACACGACCGCGATCGATAAAGTCGTTTACATAGCTGCCGCCCCATGCTGCGCCCAGCGTGGTATTAATGTCGCTAATAGACACGCCCAGCGCCTGAGCTTTTTCCTGGTCGATATCGATTTTAAACTGCGGCGTATCTTCCAGACCGTTAGGTCGAACGCCGACCAGCAGATCAGGATATTTCGCCACCTCGCCGAACAACTGATT
+TCGACCTAACGGTCTGGAAGATACGCCGCAGTTTAAAATCGATATCGACCAGGAAAAAGCTCAGGCGCTGGGCGTGTCTATTAGCGACATTAATACCACGCTGGGCGCAGCATGGGGCGGCAGCTATGTAAACGACTTTATCGATCGCGGTCGTGTGAAGAAAGTTTACGTGATGTCCGAAGCGAAATACCGCATGTTGCCGGATGATATTAACGACTGGTACGTTCGTGGTAGCGATGGTCAGATGGTGCCGTTCTCCGCATTCTCCTCTTCCCGCTGGGAATATGGTTCGCCGCGTCTGGAACGCTATAACGGTCTGCC
+NODE 1650 35 1847 1847 0 0
+GGCGATATTGCATTTCCGTTTCAGTATTTCTACCT
+CTGGACAACGACAAAAATGAACTTCACTACCAGTA
+NODE 1651 124 6992 6992 0 0
+TCTGTCGGCTTATTTAACGGTTATTAAAATATTATTTAACAGTACTTATGAACAACAGCCAATATAGGGGAATTATTGGTGATAGTTTCACTGTGAAATTATTTATTGCCGCTTAGCCATTATC
+AATTCCCCTATATTGGCTGTTGTTCATAAGTACTGTTAAATAATATTTTAATAACCGTTAAATAAGCCGACAGACATTATCTTCTTTTACGATTTCATCCCACCCGATGTTATAAAAAAAGCAG
+NODE 1652 118 7861 7853 0 0
+CTTGAGTTTTTCGCCGCATTTGCGGAAAAGTTTTGTCGATCTTCAGGATCGCTCGCAAAACAACCTGTGGATAACTTTGTGTGTAAATTCTTACCATTACTTTAAAATCAGCGCGATA
+ACAGGTTGTTTTGCGAGCGATCCTGAAGATCGACAAAACTTTTCCGCAAATGCGGCGAAAAACTCAAGTTTTCCTCCTGTATGTGGCATCCTTTAACCATAATCTGTTAAACAGGCAC
+NODE 1653 43 1145 1137 0 0
+TTATGGTGTTTCCCTGGTGTTGCTGCAGTTGCTCAAGGTGAGT
+GGCACTGTTGCAAATAGTCGGTGGTGATAAACTTATCATCCCC
+NODE 1654 3611 247221 243993 0 0
+TCCCGGGCCAGAGATAAACGTTTTAAATACCAGCGCCTGTAGAACAACATCATCCCTACAGAAAGACACAATGACAGCGGAACAAAAATAAAAAGGTTTTGTAACCAGTATGCCGATAACGTTGAGAAGGGGGTTCGCACCATCAGCTGGATAGTGTGATCGGTTGAGGTGAAGCGCTGCGTTAAAAACGCCTTACCGCGCAACGTCGCAGCGCTGGTAATCGCCTCCCCTGTGCCGAATGTCAGGCTAAAGGCTGATGCTCTCTCTGCAGCCAATATCTCCATGAGCTCCTGGACATACTGCGAATCCACGATGACGAAAGCCGCTTTATTCGCTGCTACTTTTTTCACATACACCACAACAAGGCGATCGGGTCCTTCGGCCATACTACCGATAGATCGCAACCACCGTTCCGGATAAGAAGCAGGTAAAGAAAGCCCTGCCAGCCGGGAAAAATGATAGCGTTCGGTTCCTGTGACAAAGGAGCAAGTG [...]
+ATCCATTTTCATCTCAACAACTCCCTGACGATTGAAAATGGTCTGGCGTTTCAACGCCAGACCGTAGCGACAATTATTTATACGAAACGGCGTATTGAAGGGTGGCAGCGACTGTCCCAGCCTCTGCTTTCCCGGTAGAGTAATACCGCGCGGTATAAGTCGCGCTCGCTTCAGAAGCATTTGGTTCCAGCTGTAGGTCGCCGTCGCCAGTAAAGCCGCCGGTCAGATTGATTGGCTCCCCTGAAGTGTCGAGTAATTGGACTTCAACATTTTTCGCGCTGCCAGTATTACCCAGGTTACCGTTACTGGTGACCTGATTACCGACAAAGACAGTGGAAATTTTTGTTGTTTTGTCCTTAGAGCCGGTACACCCGGACAGCCCAATATCAAACGTTATTGGCCCCGCAGTTTTCCCTTGTTCTGATAAATCTTTAGTACTTACTGTTGGCAATAACACGACGGGTTTAGCCTGATTACCATTAATCACGACAG [...]
+NODE 1655 37 11975 6761 0 0
+TAGAGCACTGTTTCGGCTAGGGGGCCATCCCGGCTTA
+ATTCACGAGGCGCTACCTAAATAGCTTTCGGGGAGAA
+NODE 1656 3436 207304 204206 0 0
+GACCACGGAAAATTTCCGTATTACGCTTCACCTCTTCCCGTCCGTAGCCGCTGGCCTGGATTTTCACCAGCATGATTTCCCGCTCAACGTGCGCTCCCTGTCCCAGTTCGCTGACGCGCAGCACATCAACCAGCTTGTGCAGTTGCTTTTCAATTTGCTCAAGCACTTTTTCATCGCCTACCGTCTGGATAGTCATGCGCGACAACGTCGGATCGTCTGTCGGCGCGACGGTCAGGCTTTCAATATTATATCCGCGTTGCGAAAAGAGGCCGATAACCCGCGATAACGCCCCAGATTCGTTTTCCAGTAATACCGATAAAATCCGGCGCATCATCAGGTCCTCTCCGTTTTGCTTAACCACATTTCGTCCATCCCGCCCCCGCGAATCTGCATTGGATAGACATGCTCGCTGCCATCAACGGTGACATCGACGAACACCAGTCGGTTATTACGCACATGCTCAAGGGCTTCGCTGAGTTTACTTTCCAGCTC [...]
+TTCAGGAATTATTTCTGCCTTCAGCCAGAAAAAGGGAGTTAAGCGTGACAGTGGAGTTAAATATGCCAGAGGTCAAAACCGAAAAGCCGCATCTTTTAGATATGGGCAAACCACAGCTTCGCATGGTTGATTTGAACCTATTGACCGTGTTCGATGCGGTAATGCAAGAGCAGAATATTACGCGCGCCGCCCACACGCTGGGAATGTCGCAGCCTGCGGTCAGTAACGCCGTAGCGCGTCTGAAGGTTATGTTTAATGACGAACTTTTTGTTCGATATGGACGAGGAATTCAGCCGACTGCCCGTGCATTTCAGTTATTTGGTTCAGTCCGTCAGGCGTTGCAATTGGTGCAAAATGAATTGCCGGGATCGGGGTTTGAGCCGACCAGCAGCGAACGTGTATTCAATCTTTGCGTGTGCAGTCCGCTGGATAATATCCTGACGTCACAGATTTATAATCGTGTAGAAAAAATTGCGCCAAATATTCATGTCG [...]
+NODE 1657 11 518 488 0 0
+TCGCCGCCGCT
+TGATGAGCTTC
+NODE 1658 51 2910 2894 0 0
+TTACCTGCTGACCCTGGATATCCCGAGCTATCTGCCGGTCATGACCTACTG
+ACCTTCCTGCTCTTTGGCTTCCGCCTGGGCTTTAGCGGCGGCGAGCGCGCT
+NODE 1659 47 2937 2873 0 0
+TCGCGCAGCATATAGACTAAGGCATCGCCAGGAAATCCGGTAAAACG
+AGCGGTGCAGGCGGCAATTGTGCCAGTGTGCCTGTTAGAAAATATGG
+NODE 1660 227 13563 13408 0 0
+AGTCGCTATGCGGAAACAATATCTTTTGGTGTTATAGACCGTGAAGAAATAGGTGACACTAAAATAGCTAGTGCCAGTATCACGATTAAGGCTGAGTTAACGCTTCCACAGTTCATTCAGCGTGGTATTGAGTGGATTTGGAGCAAGATAGATAAATCGCTGGAACAGCAGATCATGACTGGCGACTGGTCAGCAGCAACCAACACTGGCGACTGGTCAGCAGCAAC
+CATGATCTGCTGTTCCAGCGATTTATCTATCTTGCTCCAAATCCACTCAATACCACGCTGAATGAACTGTGGAAGCGTTAACTCAGCCTTAATCGTGATACTGGCACTAGCTATTTTAGTGTCACCTATTTCTTCACGGTCTATAACACCAAAAGATATTGTTTCCGCATAGCGACTTTCTGCAGGAGGGTAATAACTGAAAACATCGAAAGGACATTCACAGGCGT
+NODE 1661 1965 91541 91137 0 0
+CTGTTTTACATTCTGTATGCGCAGATGCCTACCTCGCTGAACTTCTTTGCGATTAATAACGTACATCATGAAATTCTTGGATTCGCCATTAACCCGGTGAGTTTTCAGGCGCTGAACCCATTCTGGGTGGTCGTCGCCAGTCCGGTACTGGCAGCGATTTACACCCGACTGGGTAGCAAAGGCAAAGATCTGACTATGCCGATGAAGTTTACGCTCGGCATGTTCCTCTGCGCGCTGGGTTTTCTGACCGCCGCCGCCGCCGGGATGTGGTTTGCCGATGCGCAAGGATTGACGTCGCCGTGGTTTATCGTGCTGGTGTATCTGTTCCAGAGTCTGGGCGAGCTGCTGATTAGCGCGCTGGGACTGGCAATGGTCGCCGCTCTGGTGCCGCAGCATCTGATGGGCTTTATTCTGGGAATGTGGTTCCTGACCCAGGCCGCCGCCTTCCTGCTCGGCGGTTATGTGGCGACCTTCACTGCCGTACCGGAAAAC [...]
+AACTATCAGGCGGCGCTGTTTATTCTGCGTCAACTGGAGTTCGGTCTGTTTGATTTCCGTCTGCATGCGGAATTTAACCCGCAGCAAGGAGCGAAAATTCTTGAGACGCTCTTTGAAATTAAAAAACAGGTCGCCGTGGTGCCGTCACCGACATGGGGCCGCTTCCCACATGCATTCAGCCATATCTTTGCTGGCGGCTATGCGGCAGGCTACTACAGCTATCTGTGGGCCGACGTACTGGCGGCGGACGCGTATTCCCGCTTTGAGGAGGAAGGCATTTTCAACCGTGAGACCGGTCAGTCGTTCCTTGATAACATCCTGACTCGCGGTGGTTCTGAAGAGCCGATGGAACTCTTTAAACGCTTCCGTGGCCGTGAACCACAACTGGACGCGATGCTGGAGCATTACGGGATTAAAGGCTGATTTTACGTGCAAATCTGCTTAATGGATGAAACGGGCGCCACAGACGGCGCCTTATCTGTTCTGGCTGCC [...]
+NODE 1662 158 7812 7812 0 0
+TCAGTTCTCCGTTACGCCAGCGTCATCAGGGTGTCGCCCACGGAGACCGCGTCCCCGGACTTCACCGCGATGCCGCGTACCGTCCCGGCCTGCGCGGCGCGGATTTCGGTTTCCATCTTCATGGCTTCCAGAATCAGCAGCACGTCGCCTTCGGCCAC
+CGAAATCCGCGCCGCGCAGGCCGGGACGGTACGCGGCATCGCGGTGAAGTCCGGGGACGCGGTCTCCGTGGGCGACACCCTGATGACGCTGGCGTAACGGAGAACTGAAATGGAAAGTCTGAACGCCCTGCTTCAGGGCATGGGGCTGATGCACCTTG
+NODE 1663 742 22193 22128 0 0
+ACGATATGTTCTTCCATGACGGCGGCGATATCCCCACCGACCGTTTTATCGTCCCGCGTATTGAAGTGGAGCTGGCGTTTGTGCTGGCGAAACCGCTGCGCGGCCCTCACTGCACGCTGTTCGACGTCTACAACGCCACGGATTATGTGATTCCGGCGCTGGAACTGATTGACGCCCGCAGCCACAACATCGACCCGGAAACCCAGCGTCCGCGCAAAGTGTTCGACACCATTTCCGACAACGCCGCCAACGCCGGGGTGATCCTCGGTGGTCGCCCCATCAAACCAGACGAGCTGGATCTGCGCTGGATCTCCGCGCTGCTCTATCGCAACGGCGTGATCGAAGAAACCGGCGTCGCCGCAGGCGTGCTGAATCATCCGGCCAACGGCGTGGCGTGGCTGGCGAACAAGCTTGCCCCCTACGATGTCCAGCTTGAAGCCGGGCAGATCATCCTCGGCGGCTCGTTCACCCGCCCGGTGCCGGCGCGCAAGG [...]
+TCACCGTCAATCAGTAGCCAGTCGAAGCCGGCGCCCGCTAACAGTTCAGCGCTGTAACTGTTGGCAAGCCCCAGCCACAAACCGATTTGCGGACGCCCCGCTTTTAACGCGTCTTTGAAAGCATTTTTCATCGTTTTTTCCTTACACAAACCGGCAACTGATCGCGCCCATGTTGCCGTAATCGACATGGAAGGTGTCGCCCTTGCGCGCCGGCACCGGGCGGGTGAACGAGCCGCCGAGGATGATCTGCCCGGCTTCAAGCTGGACATCGTAGGGGGCAAGCTTGTTCGCCAGCCACGCCACGCCGTTGGCCGGATGATTCAGCACGCCTGCGGCGACGCCGGTTTCTTCGATCACGCCGTTGCGATAGAGCAGCGCGGAGATCCAGCGCAGATCCAGCTCGTCTGGTTTGATGGGGCGACCACCGAGGATCACCCCGGCGTTGGCGGCGTTGTCGGAAATGGTGTCGAACACTTTGCGCGGACGCTGGGT [...]
+NODE 1664 125 16378 16092 0 0
+GTGTTTTGGCGGATTGAGAGACGATTTTCAGCCTGATACAGATGACATCGACATGCTAAAGGCGTGTTGATAAACAGAATTTGCCTGGCGGCAGTAGCGCGGTGGTCCCACCTGACCCCATGCCG
+GTTTATCAACACGCCTTTAGCATGTCGATGTCATCTGTATCAGGCTGAAAATCGTCTCTCAATCCGCCAAAACACCTTCGGCGTTGTAAGGTTAAGCCTCACGGTTCATTAGTACCGGTTAGCTC
+NODE 1665 2069 110185 109485 0 0
+CTGCGTCAATAACGCCTGGTGGGACAGGCTCTTAATTTTTATTTTAAGGAACCATATATCTGGTCAACAATCCAGCCATACGTTGCCGCAGGTAATAATCCACTGACAAAAACATTCGGATTCACTTTAGGATTTGCTACCGGCGAGTGCGGCCTGTTACCTAAAATCACAATCGCCATATGATTAACCGGATCGATAGACGTCAGCGTTCCGGTCCATCCGGTATGTCCATACGTTTGCGGACTGGCTAATACCCCGAACGTGGGGGTCATTGAGGCGTTGCCGTTAACGCGCCACCCCAGACCAAAGGTAGCGTCTTCTGGCGAGCGGCGAGTAAACTGCGCAACCGTTTTGTCGTCGAATAGCTTCACGTTACCGTAGCCGCCCCCATTGAGCATGACTTGCATTAACACAGCCATATCATGGGTGTCAGAAAACAGTCCGGCGTGTCCTGAAACGCCGCCCATTGAGTACCAGGCTTTTTCGTCATGC [...]
+AACGGCAGTTCAAGCACCTCAATCTCTTCGTCCTCCACGCCGCCGCCGATGCTGGCACGCTCGCTATCATGATATTCGGCAATGAAGAAATGAATCAGTTCCGTGACGCCGCCTGGCGACATATACAGCTCAAATATCTTGCGTACCTCACCAACGTCATACCCTGTCTCTTCAATGGCCTCTTTACGGATACAGACCTCCGGCTCGTCGTTATCAAGCAGGCCAGCGCAGGTTTCAATTAACATACCGTCTTGATTACCGTTGACCCATGTCGCCACGCGAAACTGACGAACCAGAACCACGGTTTTTTTAGTTGAGTTGTAAAGCAGAATGGTTGCGCCATTCCCGCGATCGTAAACCTCACGCTTGTGACGGATAACCTCGCCATTACGACGGGCCAGGTCATAGGTAATGTTGCGCAGAGTAAAATAATTATCAGAAAGAATTTTATCCTTAATAAGCGTAATGGTTTGCGACATGCTGGCTCCAGGG [...]
+NODE 1666 14 5037 4791 0 0
+ACAGTTCGGTCCCT
+AAATGGCGAACAGC
+NODE 1667 11 4797 4671 0 0
+ATCAACGTCGT
+GGTACTAATGA
+NODE 1668 38 1637 1637 0 0
+TCCAGCCACTACACATTGCAGCTCAGTAGTTCTTCAAA
+TAAGGCGCCAACGTTGCCGGCGCTTTTCCCGCCGCCTG
+NODE 1669 3748 182691 181643 0 0
+TTGCAAAAACCAGGCTTCCCAGCCCTTTACGCCACCGGCAAGCCAGGTCTGAGGATCATCGTCAAAAAAGATTGTGCTTGCCAGCGGGGATAACTCTCCGCGACGTAACAACGCCCATTCTTCAGCGGTTGCCTGTCGGTGGCTAAACAGGGGGAGCCAGTCGGTCAACGCGCGACGGAGCGTTTCTCGCGCCAGCTCCTGTTGTGCGGCCTGCATATCTGGCTTCTCTTCAGGAAACAACAGTAAAGCCGCCGCTACGCTGTGCGCCTGAGCGCACAACGTAAACAAACGTGAAATAAGCGTTTTTGCGTACACCGGTGTTGCGCCCTGTAACAAACGACCGATCGGCGCCTCCTGCCAGATAATCCGTAGCGGGTGAGAATAGACGGTCAATCTTTGCACGAATTATTACCTTCATCGATCACCATAAACCCGGACTTACTGGTTTCGCAAACCGGACAGCACCAGTAATCAGGTAACTGGTTGAAGGGC [...]
+CAGTGTGTGGTACCGACAACCTGGAATGCCGGGCCACGTGACGATAAAGGTCAAATTGGCGCGTACGAAGCGGCGTTAATGGGGACTAAACTCGCCGTTCCCGATCAACCATTGGAGATTTTACGTACTCTGCACAGCTTCGATCCCTGCCTGGCCTGCTCCACCCATGTTATTGATAATCATGGAGGGGAGCTGGTCAGGGTTCAGGTACGATGACGACGATTCGGAGGTCTCAATGCATCTCAAAGAAATAACCAGCCAGGGGTACTATATCTATGAAGCGCCGGTCCGTTTATGGCACTGGATCACGGCGTTATCCATTGTCGTCCTGGCTGTTACAGGATATTTCATTGGCCGCCCCCTGCCATCGATTCAAGGTGAAGCGACCTTTATGTTTTGGATGGGCTGGATACGACTAATCCATTTTACCACGGCGTATATTTTTACTGTCGCGCTGCTGTTTCGTATTTACTGGGCATGTGTCGGCAATGA [...]
+NODE 1670 3 106 106 0 0
+ACC
+AAT
+NODE 1671 1923 103041 101186 0 0
+CCCTGACTTGGCATAATCAAGTTCTCATCTACCGGTAAGGTTTTCAGCAGCGAAGTATGATGGATAATATGTATCAGACGCCGCGCCTGCTGTACGTTGAGCCGTGAGCCCTTTTTGAGGGTTAAATAACAAAAGCCCAGGCTGATACCACTACTTACCTGACTCAGCGTCGCCAGCTCTTCCGGTTTGCCGATGGCAATCTGCACCGGATGGCGGCAACTGGTGCCCAGATCCTGGGCAAACAGTTGCGGGGTGATCCAGAATTCAATCGCTTTCAGCAGCGGATGGCTGAGGTGATAATGGTTATGACTTTCCAGACGCACCAGTTCCGGCGTGAACAACGCCAGGCGAAAAGGACCGGTGCCGATAAGCGGCAGGTCAGGATGCGCCAGACCGCTACAATAGCTCGCCAGACGATGCGCCAGCCAGTAATCAGGTCGGTGAAGGAGAAAGGTCAGGCACTGAGGATGCGTTACTTCGATCCGTGCGACG [...]
+CTGCCAGTGAAAGCCCTAAATGGTTGCTCAATACCGCCAGCGCCGATCCTTTATTGCACCCCAGCGGTAGCACTTCCAGGCAGTCGACGGCAGAGAAACAGAGATGAGCGCGTTCTTCCAGCGCCTCATTGAGCTGAATGCGCAAACGGATCAGATCGTCATGATCGCCGCAAAAACAGATCTTCGTCACCTGATGGGCCGGAATGCTTTTTATATCGATAACCTGATAACGAAAGCCGCTGTAGACGTGCGCCTGGAGTAGCGCGGGGATCTCCTGGCCTGTAAACCAGCCGTTGTCATTAAACACATGCATACTGGCTCGGGTATCCCAGGCATGGTGCATCACCGTATCGGCAACCTGAGGATCGAGATCCTGACGATGCAGCACGTCGCCTTCCAGCGAGTGAATTCGCGTCCCGTTACCGGTAATAAGATAAGCATCCAGTGAAAGCGTCCCCAGAATATGCCGCATTTCCAGCACATGACGACCCG [...]
+NODE 1672 16 5302 4889 0 0
+GGGGGATAACTACTGG
+TCCGCCACTCGTCAGC
+NODE 1673 5 1733 1642 0 0
+AAACG
+ACCCG
+NODE 1674 4 1418 784 0 0
+GTGG
+ACTC
+NODE 1675 213 12028 11617 0 0
+TCCATACGGCGTGATGTAGCTTGAAAGCGCAAACGGCGCGACTTTAATCACCTGCCAGGGCGCAAAAAAACGTTCATCCGACCACGGCCACAGCCATCCGACGCCTTTACCACCCGTGGTGATCGAATCCAGCAGGCTGTGCGACAACAATGAAACGGTTAAAAACAGCCAGCAGCGCACCTGCCCCGCTCGAAACCATCGTCGTCCCGCGAG
+TTTAACCGTTTCATTGTTGTCGCACAGCCTGCTGGATTCGATCACCACGGGTGGTAAAGGCGTCGGATGGCTGTGGCCGTGGTCGGATGAACGTTTTTTTGCGCCCTGGCAGGTGATTAAAGTCGCGCCGTTTGCGCTTTCAAGCTACATCACGCCGTATGGACACCAGGTCATTCTCTCAGAATTGCTGTGGGTGTGGTTGCCGGGAAGTAT
+NODE 1676 86 3024 1326 0 0
+TGGTGAATGGCGGCGGCAATCACCGGCTTTAAGCGGGTGAAGTCGTCCACGGCGGGAACGGCGCGCGGTGCGGGCGCGGCGACGGG
+CCGCTTAAAGCCGGTGATTGCCGCCGCCATTCACCATCACCGCCACCACGTTTAATTTCCCGGAGGGATCCATGACCATTGCCATT
+NODE 1677 51 1407 1367 0 0
+ACCGCCGGGCCATCGACGCCCTCACCCCGCAGCTGCCAGCCGGTATCCGCC
+TATTTTTCTTTCAGGGCTATCACCCCTTCGCGCGCGCCGGTTGCCGTCATC
+NODE 1678 1376 67729 67197 0 0
+TTTCGCCGCGTGTATCCAGCATCATCTGACACCACGCTTGCGCCAGCGGCGGCGAGGCATGACGCAGCATTTCCGCTCCGCATCCCAGCAAGAAAAGCTGCTGCGTAATCTCTCTGCCCATTGCTTCGTCCGGTTTGCGTAAACGTTGCTGTAGCTGACGTACCGCGCGGTCGTAATGGCGATCCTGACCTTTGACTTCCGCAAAAGCTTCACTCAATACGTCATAGACGCCGTGTTGTTTTGTCAGCACCCGAAGTACATCCAGACACATGATATTGCCGGAACCTTCCCAGATACTGTTCACCGGCATTTCACGGTACAGGCGAGGGAGTTCGCTCTCTTCGCAATACCCCATCCCGCCGAGAACCTCCATCGCCTCAGCCACAAAAGGGATTCCCTGCTTACAGATGGCGAATTTCGCCGCTGGCGTGAATAATCGCGCCCATAATGCCTCTTTCGCCTCGCGACGTTGCTCCCAGGCGCGCGCCAGCC [...]
+TGGATGACGTTCGCTTTCATCCCGCCTGGCACCTGTTGATGCAGGGGCTTTGCGCTAATCGGGTACATAACCTGGCCTGGGAGGAAGAGGCAAGGGCGGGAAGTTTTGTCGCCCGGGCGGCGCGTTTTGTATTACATGCTCAGGTAGAAGCGGGAACACTCTGTCCTGTCACGATGACCTTTGCCGCGACACCGTTGCTATTGCAGATGCTTCCCGCCACTTTCCATGACTGGCTGGCGCCGCTGCGCAGCGATCGCTACGATTCACATTTGCTGCCGGGCGGGCAAAAACGGGGCCTGCTCATCGGCATGGGAATGACGGAAAAGCAGGGCGGATCTGACGTACTCAGTAATACGACCCACGCGGAGCGGCTGGCGGATGATTCATATCGGCTGGTGGGACATAAATGGTTTTTCTCTGTGCCGCAAAGTGATGCGCACCTCGTGCTGGCGCAGGCAAAAGGAGGACTATCCTGTTTCTTTGTGCCGCGTT [...]
+NODE 1679 2 185 177 0 0
+CC
+AG
+NODE 1680 150 5731 5545 0 0
+GCCATCGCACTTGGTCATATGACCTTTGGCCGCGTTGTACTGCGGCGCGCCGTACGGGCAGGCCATGTGGCAATAGCGGCAACCGATACAGACCTCTTCATTCACCACCACAAAACCGTCATCGCGCTTGTGCATCGCGCCGCTCGGGCA
+TGAAGAGGTCTGTATCGGTTGCCGCTATTGCCACATGGCCTGCCCGTACGGCGCGCCGCAGTACAACGCGGCCAAAGGTCATATGACCAAGTGCGATGGCTGTTATGACCGGGTGGCGGAAGGCAAGAAACCGATTTGCGTGGAGTCCTG
+NODE 1681 51 3543 3543 0 0
+GGACATTATGGTTCAGATCCCAGAAAACCCACTTATTCTCGTAGATGGCTC
+CGTGCCTGTTTAACAGATTATGGTTAAAGGATGCCACATACAGGAGGAAAA
+NODE 1682 42 14876 11892 0 0
+AGGTTAACCGAATAGGGGAGCCGGAGGGAAACCGAGTCTTAA
+AATATAAGTCGCTGACCCATTATACAAAAGGTACGCAGTCAC
+NODE 1683 20 7076 4035 0 0
+TTGGGCGTTAAGTTGCAGGG
+TTCGGTTAACCTTGCTACAG
+NODE 1684 5 1767 956 0 0
+TATAG
+CCCTA
+NODE 1685 7 2366 1105 0 0
+ACCCGAA
+CCGGCTC
+NODE 1686 198 11919 11919 0 0
+TTTGCGAAGAGATTAGCAAGCTGAACGAGTATATGCCGCTGTACGCCTTCGCCAACAGCTACTCTACGCTGGACGTCAGCCTCAACGATCTGAGAATGCAGGTTCGCTTCTTTGAATATGCTTTAGGCGCCGCAGCCGATATCGCGGCGAAAATTCGCCAGAATACCGATGAATACATCGACAATATTCTGCCGCCGC
+GCCGCGATATCGGCTGCGGCGCCTAAAGCATATTCAAAGAAGCGAACCTGCATTCTCAGATCGTTGAGGCTGACGTCCAGCGTAGAGTAGCTGTTGGCGAAGGCGTACAGCGGCATATACTCGTTCAGCTTGCTAATCTCTTCGCAAAGCTCAAGGTTATATTTATCCCAGTCGAAAATGACGCCGCAAAGGCGGGAG
+NODE 1687 1880 91495 91137 0 0
+CGGTAAACAGCAGTCCGTCGAGATCGTCGAGCGAACTTAGCGCTTGTCCGGTCTCCCGGCCGCCCTGCATCAGATTAAGAACGCCTGCCGGTAGCCCCGCCCGTTCCCAGAGTTTTATTACCGTTTCCCCGGTCCATGGCGTTAGCTCGCTAGGTTTGAAGATCAGCGTATTGCCTGCCAGCAACGCGGGCACAATATGGCCATTCGGTAAATGGCCGGGAAAGTTATAAGGGCCGAATACCGCCAGCACACCGTGAGGACGATGGCGCAACGTCGCGGCGCCATCGACAAGTTCGCTTTTTTGTTCGCCTGTTCTGGCGTGGTAAGCCTTAATCGAGATGGCAATCTTATTGATCATCGCCGTCACTTCCGTTGCCGCCTCCCAGCGCGGTTTACCGGTTTCACGCGCGATGACCTCCGTGAGATCGGCTTTATGCGCCTCCAGCAGGGCGGCAAATTTCTCTACGATAGCCTGTCGTGCGGCAAAAGGCT [...]
+AAAAGCAGGCGTGATGGTGCTCATCGCCGGCGGCGACGTGGTGCGTTTTGCGCCAGCGTTAAATGTGAGCGACGAGGAGATAGCCACCGGGCTTGATCGTTTTGCCCTGGCGTGCGAACGCCTTCAGACGGGAGGCGCATCATGCGGGTGATTCGTCCTGTCGAACATGCGGATATCGCCGCGCTGATGCAGCTTGCAGGCAAAACGGGCGGCGGCTTAACCTCGCTACCGGCAAATGAAGCGACGCTGGTGGCCCGCATTGAACGCGCGCTAAAAACCTGGTCCGGCGAGCTGCCAAAAGGCGAACAAGGGTATGTATTCGTTCTCGAGGACAGTGAAACGGGTGAGGTTGGCGGGATCTGCGCCATTGAGGTCGCGGTCGGCCTTAACGACCCCTGGTATAACTATCGTGTCGGTACGCTGGTTCATGCCTCCAAAGAGCTGAATGTATATAACGCGTTGCCAACATTATTCCTGAGTAATGATCACACC [...]
+NODE 1688 3286 194649 193034 0 0
+GACGTTCTTTCGTTTTGGCGCAAAGATATTGAACCCATTCATGTTGTGTACGGCCTTCGGTAAAAGTCTGGTAAACATCAGGTCCAAGGCGTTTTGCTATTTCACTCATTGTCCAGTAAATAGGCTTGCGTTCAAATTTTGGCGATGTTGATGGTTGTCCCAGAATAACATATGCCATATTCCCGGCCTCTTCATGCGGGATAAGATCTTCCTGCTCAGTAGGCATCAGGTCAGGGAGTAAAATATCGCTATATTTTGCTGAGGCAGTCATGAAATGGTCAATGCAGACAATCATTTCGCACTTATTTTCATCCTGCAAAATTTCATGTGTGCGACTAATATTGCTGTTCTGATTTATCAGCGTGTTGCTGGCGTAGCACCACATGAATTTTATTGGCACATCTAGTTTGTCTTTACCTCGTACGCCATCACGAGTAGAGGTCATTTCAGTTCCGCGCTCAATAGCTTCGGTCCAGGTAAAGGAGGATATTT [...]
+AAAATCATCATAAACAAAGAAATAAATCATCAGCTTATTATCTTATTCAAGATAAGCAAAACAACGTTTATCCGGTTCCGCATGAGTATTTACATTGAAAATTGAGGAAGAAAATCTATCTCGATCACGTATACTAGTTCCATTGTATGAGATGGAGAATAAAATGCGTTCGCTTAATCGCTTGAAATGGCTGCACGCTTTTGAAGCAACTGCGCGTCATGGTAGCTTCACAGGTGCAGCCAAAGAGCTAGGCGTCACCCCGGCAGCCGTAGGACAACTGGTTCGGGCACTTGAAGACTGGGTAGGCCACCCCCTTTTACACCGTACACGTTCTGGTAAAGAAAGGCTCACGCTCGTGACTGAGGCTCAGGATGCGCTAAAAGAGATCACTCAAGGGCTCGATAGCCTTGAGTCAGGACTTAATAAACTGCGCGGTCGTCAGGCTCGATCCGTCGTCATTCTCACGGCCTCACAAGTTCTGGTGATGAACTG [...]
+NODE 1689 593 27454 27237 0 0
+TGAATTTGCTGAAGTCAGGCTGACGCTTCTGGTTAAAGGCGTTACGGCCTTCCTGCCCTTCTTCGGTCATGTAGAACAGCATGGTAGCGTTGCCGGCCAGCTCCTGCAGCCCGGCCTGACCGTCACAATCGGCATTCAGCGCCGCTTTCAGGCAACGCAGCGCCATCGGACTGTTTTGCAACATTTCGCGGCACCAGCGCACGGTCTCTTTTTCCAGATCCGCCAGCGGCACAACGGTGTTAACCAGCCCCATATCCAGCGCCTGTTGCGCATCGTACTGGCGGCACAGGAACCAGATTTCACGCGCTTTCTTCTGACCAACGATACGCGCCATATACGAAGCGCCCCAGCCGCCGTCAAAGGAGCCGACTTTCGGACCAGTCTGGCCGAAGATGGCGTTTTCCGCCGCGATGGTCAGGTCACACATCATGTGCAGCACATGACCACCGCCAATGGAATATCCCGCGACCATCGCGACAACCGGTTTTGGAC [...]
+CCGGCGTGCATCACCTGAACGTGCTGGATTTCCAGCGCCAGATTCGTACCTGTCCAAAACCGGTTGTCGCGATGGTCGCGGGATATTCCATTGGCGGTGGTCATGTGCTGCACATGATGTGTGACCTGACCATCGCGGCGGAAAACGCCATCTTCGGCCAGACTGGTCCGAAAGTCGGCTCCTTTGACGGCGGCTGGGGCGCTTCGTATATGGCGCGTATCGTTGGTCAGAAGAAAGCGCGTGAAATCTGGTTCCTGTGCCGCCAGTACGATGCGCAACAGGCGCTGGATATGGGGCTGGTTAACACCGTTGTGCCGCTGGCGGATCTGGAAAAAGAGACCGTGCGCTGGTGCCGCGAAATGTTGCAAAACAGTCCGATGGCGCTGCGTTGCCTGAAAGCGGCGCTGAATGCCGATTGTGACGGTCAGGCCGGGCTGCAGGAGCTGGCCGGCAACGCTACCATGCTGTTCTACATGACCGAAGAAGGGCAGG [...]
+NODE 1690 548 22778 22705 0 0
+CCAATACTCTGGTGGTGAATACCGGCTCGCTGGAAACCAGCGCCGAACGCTTTCAGGCCGATACGCTGGCACGTTTTGAAAATCGCGGCGTCGATCCTATGCGCCCGCTTTTGCCGCCGGAAGCCCTCTGGCTACGGGTAGATGAGCTCTTTTCCGAGCTTAAACGCTGGCCTCGCCTCCAGCTTAAAACCGACCATCTGCCGGAAAAAGCCGCCAATACCAATCTTGGTTTCCAGAAATTACCGGATTTGGCTATCCAGGCACAGCAGAAAGCGCCGCTGGACGCGCTGCGTAAATTCCTCGAATCTTTCAGCGGTCCGGTGATTTTTTCGGTGGAAAGCGAAGGACGCCGCGAAGCGCTGGGAGAGCTCCTGGCTCGCATAAAAATCGCGCCGAAGCGAATATTACGCCTGGACGAGGCGCAGGATGCGGGACGCTATCTGATGATTGGCGCCGCAGAACATGGCTTTATCGACACCCAACGCAATCTGG [...]
+TCAGCGCCAGATTGCGTTGGGTGTCGATAAAGCCATGTTCTGCGGCGCCAATCATCAGATAGCGTCCCGCATCCTGCGCCTCGTCCAGGCGTAATATTCGCTTCGGCGCGATTTTTATGCGAGCCAGGAGCTCTCCCAGCGCTTCGCGGCGTCCTTCGCTTTCCACCGAAAAAATCACCGGACCGCTGAAAGATTCGAGGAATTTACGCAGCGCGTCCAGCGGCGCTTTCTGCTGTGCCTGGATAGCCAAATCCGGTAATTTCTGGAAACCAAGATTGGTATTGGCGGCTTTTTCCGGCAGATGGTCGGTTTTAAGCTGGAGGCGAGGCCAGCGTTTAAGCTCGGAAAAGAGCTCATCTACCCGTAGCCAGAGGGCTTCCGGCGGCAAAAGCGGGCGCATAGGATCGACGCCGCGATTTTCAAAACGTGCCAGCGTATCGGCCTGAAAGCGTTCGGCGCTGGTTTCCAGCGAGCCGGTATTCACCACCAGAG [...]
+NODE 1691 1616 85584 84664 0 0
+AATAGGAATATCAGGCGGCAGAACGGCATCCAGCACATGATCATCACGTAAGTAGGCATGGGCCAGCACATAATCGCCAATCGCCTGACTTTCTCGTAACCCTCCACAGTGCCCAATCATAAGCCAGACGTCAGGCCGCAACACGGCCAAATGGTCGCAGATCGTTTTAGCATTTGAAGGGCCGACACCGATATTTACCAGCGTAATCCCCTGCCCATCTGCCGTTACCAGGTGCCAGGCGGGCATCTGATGCTTCTTCCAGGCCAGATCGGAAATAGCCTCTTCCGGCGCTTCCGTTTCTGCCGTGATCCAAATTCCGCCAGCACAGGAAAGCGCGACATAGGGACTGTCAGGATCAAGAATTTGGCTGCATCCCCAGCGCACAAACTCATCGACATAGCGGGTGTAGTTGGTAAACAAAACGAAGGGCTGAAAATGTTCAACCGGCGTACCGGTATAGTGCCGTAACCGGGCCAACGAGAAGTCAACACG [...]
+TGCTCGGGGCAATGATAAGTTATGGTAGACAATATTGAACAGCAAGTTTACGAGCTTGTACGGCCTTATGCTGGCACATATCTTTTCAACATTAAGCAAGTGGAATTAACACCAGAGATTGACCTTGATACTGATCTGAGCATTGATGAACTTGAAGCCGAAGATCTCATGAATAAATTCTTCGAGAAACTCAATGTCGAGCGAGGTAACTTCAGAATAGAAACCTATTTTCCTAATCACCCTTTTTCATGGCATCCGTTCAAGAAAACGGAGCCTGTACCCGTCCCAGATTTCACTATCAGCATGCTGATCGAGTCAGCAAAAGCCGGGAAATGGTTATATGACTAATTGTAATGAACTTAACAAATGGCTGTACCAGTACCCTTCTTTTTGAGCGATGATGGTGGCGCTAAGATAGTTCTCTTTTCTTTTTAAAGGGTTCATGTTTACTGCTGCCACCCTTACGCTAACCCCTTTAGTTTCCTCCTTTGC [...]
+NODE 1692 3 134 18 0 0
+TTA
+ACC
+NODE 1693 1246 69412 68861 0 0
+CGCTTACCAGGTATTAAATACAGAGTCGCTTATCTGCTGCTGGGTTGAAGGTCTGACAACTATTGCTGCCCCCGGCGCCTGTTAATACCGTGGTCTCCGCCTGGAACCCAGGCACCTGTAATCTTAAAAGGCGCTCGCCTGGCAGGAGCGCCGTGGAAAAGAACGTCGTTATGTGTTTCTACGCGCCAGCAGTGGGAAAATTAATCCCAACCCGACCAGGACAAAAGGCGTCACGATGTTCAACGTCAGCTGGAATGTCCACTCCGGCGTGAACGCCTCCATTTTGGGGAAAATACCGGTAAGGCAGGCAAACGCGGTGAAGGCAAAACACCATATCCCCACAGTTAACGCCAACGCCCGGTTGCGAATAAACACATATTCGGGTTTGTACTTTTGCGCCAGTCGAATGACGGCAATAAAGGCGACAAATACCCACAGATAGCGCAGCGGCATAACAACTGAGTTGAGATTAAGCAGCCATTTGTACAGGTT [...]
+GGCTGACGCTGGCATTGTTTGTTTTCTTTATGTGGGTTGCTTCCAGGGGGATGAAATCGCTAAAGGTTGTTGGGTCTGTGGCCGGAATTGCCATGTTTATCATGTCAATTTTATATGTTGTGATGGCAGTGACCGCGCCGGCAATTACAAACGTTGAAATTGCGACCACTAACATCACCTGGCAGTCATTTATTCCTCATATCGATTTTACCTATATCACCACCATCTCTATGTTGGTCTTTGCGGTTGGTGGGGCAGAGAAGATCTCGCCTTACGTTAACCAGACGCGGAATCCAGGAAAAGAATTTCCGAAGGGGATGCTCTTTTTAGCCGTCATGGTTGCGGTCTGCGCTATCCTCGGTTCGTTGGCGATGGGAATGATGTTTGATTCCCGGCATATACCTGACGATTTAATGACCAATGGGCAATATTATGCATTCCAGAAATTGGGTGAGTATTACCATATGGGTAATTCATTAATGGTGATTTATG [...]
+NODE 1694 1 144 46 0 0
+T
+A
+NODE 1695 3 833 779 0 0
+AGC
+TGA
+NODE 1696 1 280 270 0 0
+A
+G
+NODE 1697 19 3602 2289 0 0
+ACCCTCACAGGCCACCTTC
+ATAAGTAACGATAAAGCGG
+NODE 1698 9 1872 1345 0 0
+ACGCTCCCC
+TATCAGAAG
+NODE 1699 37 3737 3737 0 0
+TCGACTTCGAAGGTTCGAATCCTTCCCCCACCACCAT
+ACAGTCTGCTCCCTTTGGCCGCTCGGGAACCCCACCA
+NODE 1700 258 12337 12219 0 0
+GGGGTAATTCAAATTGTAGGTAAAGCTTGAAGATGGTGGTGGGGGAAGGATTATTCGTCGCTTCGCTCCTCACCCTACGGGCCGTTGCCGTTGGCAACGTTCTCTCGCTTTCGCTCGAGTCGAACCTTAATCGAAGGTTCTCACCCTTCCCCGACAAGTGCAAACTTCTGCATTGCTCATCGAGTTAACTACATCGCTGTAGTGAATAATGGTGGTGGGGGAAGGATTCGAACCTTCGAAGTCGATGACGGCAGATTT
+TATTCACTACAGCGATGTAGTTAACTCGATGAGCAATGCAGAAGTTTGCACTTGTCGGGGAAGGGTGAGAACCTTCGATTAAGGTTCGACTCGAGCGAAAGCGAGAGAACGTTGCCAACGGCAACGGCCCGTAGGGTGAGGAGCGAAGCGACGAATAATCCTTCCCCCACCACCATCTTCAAGCTTTACCTACAATTTGAATTACCCCTGGTGGGGTTCCCGAGCGGCCAAAGGGAGCAGACTGTAAATCTGCCGTCA
+NODE 1701 51 1999 1999 0 0
+AGCCGGTCCCGGCGGGGCGCGGCGAACTGACGGCGGCCATTCGTGAGTTTT
+TCTTCGCCATCCTTAACTACCGGCGCTTCCGCCAGCATGGCGCGGATGCGG
+NODE 1702 18 6648 691 0 0
+ACCGCAGCAATTGACGTT
+GTACTTTACAACCCGAAG
+NODE 1703 51 1615 1615 0 0
+TCCCGCCGCACGATCAACCCGGATACGTTGATTCGTAACCTGGCGGAGCTC
+AATCCAGGCGGCGACGCGCCACCCGCTCACCCAAGAGATCGCTTTCACAAA
+NODE 1704 11 4136 3522 0 0
+GGGACACGTGG
+ACGGGGCTGTC
+NODE 1705 4 327 152 0 0
+ACCC
+TGGC
+NODE 1706 16 1635 1635 0 0
+TTTTTATTGATTCCAG
+CCTTTTCAACCTGAAC
+NODE 1707 42 3001 3001 0 0
+CTGAAGCAGCCAGCGGGCAAAGAGTATGCGTTTGCCGGTCCT
+CGCTGGCGGCGACTTCATCCTGCAATGCGGCATCCAGACGAC
+NODE 1708 902 43898 37733 0 0
+CAGCGCCATGATTTTCCAGCCGTACACGTCCATCCCCAGCAGCAGCGCCACCAGCGGGGAGAGCATAATCAGCGGCAGGCCGGTCACCGCCCAGTGGGCCAGCACCTTCGCCAGCACCACCGCCGGCAGCGGCACCGGCAGCAGCATCAGCTGCTCCAGGCTGCCGTCCTGCAGGTCGTCGCGAAACAGCCGCTCCAGCGCCAGCAGCGAGGCCAGCAGCGCCGCCACCTGGATGATGCCCGGCGCGATACGCGCCAGCAGCTGCGGCTGCGGCCCGACGCTTAACGGAAACAGGGTGATGACCATCAGGAAGAACCACAGCGGGCCGGCGATGTCCGCGCCGTGGCGGAACGCCACGCGCAGCTCGAGACAGAAGACACGCCACATCACAGCCCTGCCCCCCCGCCGGTCAGCGCCAGGCGGCGGACGGTATCCGCGGCCCCCGGCAGCGGCTGGTGGGTGGTGAGAATGACCATCCCGCCCTGCGCCGTG [...]
+GCGCCCGGACGGCGGCGAGGTGTACTGGCAGGGCGAGCCCCTGCGCCGCGTGCGCGACAGCTTCCATCGCAGCCTGCTGTGGATAGGGCACCAGCCGGGGATAAAAACCCGCCTGACGGCGCGGGAGAACCTGCACTTCTTCCACCCCGGCGACGGCGCGCGTCTCCCGGAGGCGCTGGCGCAGGCCGGGCTGGCGGGATTTGAGGACGTGCCGGTCGCCCGGCTCTCGGCCGGGCAGCAGCGCCGGGTGGCGCTGGCCCGCCTGTGGCTGACCCGCGCCGCGCTGTGGGTGCTCGACGAACCGTTCACCGCCATTGACGTTAACGGCGTGGCGCGCCTCACCCGGCGGATGGCGGCACACACGGCGCAGGGCGGGATGGTCATTCTCACCACCCACCAGCCGCTGCCGGGGGCCGCGGATACCGTCCGCCGCCTGGCGCTGACCGGCGGGGGGGCAGGGCTGTGATGTGGCGTGTCTTCTGTCTCGAGCTG [...]
+NODE 1709 47 2483 2483 0 0
+TGAGCCACAACCGCTGGCTGGAGCAGGAAACCGACCGCATCTTTAAT
+TGTTAAACCATTTCATTCTTTCATCCTCGTATTAACGACGTTTCGCC
+NODE 1710 79 3483 3483 0 0
+TGTAAGCCTGTGAAGGTGTGTCGTGAGGCATGCTGGAGGTATCAGAAGTGCGAATGCTGACATAAGTAACGATAAAGCG
+GCCTCACGACACACCTTCACAGGCTTACAGAACGCTCCCCTACCCAACAACGCATCAGCGTCGCTGCCGCAGCTTCGGT
+NODE 1711 1 116 112 0 0
+G
+T
+NODE 1712 45 2496 2414 0 0
+TATCGCCAAGCGGTAAGGCACCGGTTTTTGATACCGGCATTCCCT
+TCCGTACAACGCTTATCGGTGAATGGTGCGGGAGGCGAGACTTGA
+NODE 1713 6 561 542 0 0
+GGTTCG
+ACCCCA
+NODE 1714 20 1726 105 0 0
+AATCCAGGTACCCCAGCCAT
+GTGCCTTACCGCTTGGCGAT
+NODE 1715 438 19180 18985 0 0
+AGGTATAGTTATCCACCATCATGGTGTGACGCTGGGGCAACCTTTGCAAGGCTCAGTGGCGCTGGTTGAAGCGCCAGGGGCCTCGGGGGTGCCAGTTGGCGGCTGGCCTGGCGTTAAGACGGATTTTCGTGGCGACACCACAGTGGGCAACCTGAACGTCTATCAGGAGAATACAGTCAGCCTCGATCCGTCGCGACTACCGGATGACGCAGAGGTCACACAAACCGATGTGCGCGTGGTGCCAACCGAAGGGGCGGTGGTGGAAGCGAAGTTTCACACTCGCATCGGGGCCAGGGCACTGATGACGCTGAAACGGGAAGATGGTAGCGCCATTCCTTTCGGGGCGCAGGTTACAGTCAATGGGCAGGATGGCAGCGCTGATCTGGTGGATACTGATAGCCAGGTTTATCTCACTGGTCTGGCGGATAAGGGCGAACT
+CACCAGATCAGCGCTGCCATCCTGCCCATTGACTGTAACCTGCGCCCCGAAAGGAATGGCGCTACCATCTTCCCGTTTCAGCGTCATCAGTGCCCTGGCCCCGATGCGAGTGTGAAACTTCGCTTCCACCACCGCCCCTTCGGTTGGCACCACGCGCACATCGGTTTGTGTGACCTCTGCGTCATCCGGTAGTCGCGACGGATCGAGGCTGACTGTATTCTCCTGATAGACGTTCAGGTTGCCCACTGTGGTGTCGCCACGAAAATCCGTCTTAACGCCAGGCCAGCCGCCAACTGGCACCCCCGAGGCCCCTGGCGCTTCAACCAGCGCCACTGAGCCTTGCAAAGGTTGCCCCAGCGTCACACCATGATGGTGGATAACTATACCTCCCGCGATATTGGCTCCCATCTGGCGCATCGCCCGGCTGTAGCTATAGTC
+NODE 1716 51 54 54 0 0
+GAAAGGTATTGTCGATAATCGGCGCGGTATCAGACTGCGGTACGTGGCACT
+CCCCCCTCGCAAGGTTACGGGAAATAAGAGGTCATTATGGAAAATTCTAAC
+NODE 1717 25 1147 1147 0 0
+ACCCCTGTTACCGCCGTGAAAGGGC
+TTCAAACTGATGAGGTCAAACCTCC
+NODE 1718 27 6361 4467 0 0
+CTGATGGCAACGCCTTTCACACATTAC
+CACGTTTGAGATATTTGCTCTTTAAAA
+NODE 1719 18 3688 3158 0 0
+AAGGCGTTGCCATCAGTA
+GGGATTCGAACCCCTGTT
+NODE 1720 21 4752 3083 0 0
+TCTCAAAACTGACTTACGAGT
+CGCGCAAGTGGCGTCCCCTAG
+NODE 1721 51 2085 1974 0 0
+ACTGGCTTCCACCTCCTGCACGCCCAGACGGTGGGCTACCGGCGGGGTGTA
+TATCGAAACTCTGCGCAACTACATCGACTGGACGCCGTTCTTTATGACCTG
+NODE 1722 2 315 315 0 0
+TA
+CA
+NODE 1723 662 41175 41022 0 0
+TGTAAGCGAATTGCCCGGTGGCGCTTTACCGGGCTTATGTTTCTGTCGCCTGGATAAGGCGTGAGCCACTATCCAGTCAGCGTTACTGTAGCTGAGCGGCAATGAGCGGCCAGCGGGCGTCGAAATCGTCCGTTGGGCGGTATTTAAATTCGCTACGCACGAACCGTGAAAGCATACCTTCACAGAAGGCTAACAGCTGGCTTGCCAGCAGATTTTCATCCGTCGTGTAGCCTTCGCCTTCACGCATTCTTTTTTCTCGTAGCACCTGGCGGAGCTGCGCTTCGATGCGTTCAAAAAGCTGATTAATGCGCCCCTGCAGGCGATCCTGTTCAAACATCAGCGCGTGCCCGGTAAGAATGCGCGTCAGGCCAGGGTTGCGTTCGCCAAAACCCAGAATCAGCAACACAATCAGGCGCAAACGCGTGCTGGTGTTTTTTTCATCTTTTAAAATCAGATTGATACGGGTAATCAGACTATCTTCGATAAACTCAA [...]
+TTGAATCCAGCGATGGAAGCCAACGCATCACGACGGCAAAACTGGCGGCCTCGGTCGGCGTTTCCGAAGCGGCGCTATACCGCCATTTTCCCAGCAAGACCCGCATGTTCGATAGCCTGATTGAGTTTATCGAAGATAGTCTGATTACCCGTATCAATCTGATTTTAAAAGATGAAAAAAACACCAGCACGCGTTTGCGCCTGATTGTGTTGCTGATTCTGGGTTTTGGCGAACGCAACCCTGGCCTGACGCGCATTCTTACCGGGCACGCGCTGATGTTTGAACAGGATCGCCTGCAGGGGCGCATTAATCAGCTTTTTGAACGCATCGAAGCGCAGCTCCGCCAGGTGCTACGAGAAAAAAGAATGCGTGAAGGCGAAGGCTACACGACGGATGAAAATCTGCTGGCAAGCCAGCTGTTAGCCTTCTGTGAAGGTATGCTTTCACGGTTCGTGCGTAGCGAATTTAAATACCGCCCAACGGACGATTTCG [...]
+NODE 1724 92 4346 4346 0 0
+ACCGGGGATGCCGCCTGAACCGGTGCGGAAGACGGGGTGGCAGCAGTGAGCTGGCTGATATCGCCGCCGTCGCTGACCTTCACCACAAAGGC
+TGCCACCCCGTCTTCCGCACCGGTTCAGGCGGCATCCCCGGTTGCTCCGGCAGGCGCCGGCACCCCGGTCACCGCGCCGCTGGCGGGCAACA
+NODE 1725 645 37164 37099 0 0
+TTATGAAGTTCAGTACGTAGCTATTACTGTAAATGAGATATTTCGAAATTCCTTCCATAATACTGCTGCCGCCGGTAAGGATAATTTGCGCCATCTCAACCGCGGCGAGCGCGACCACTATACCCACCACCAGATAAAAAAAACGCAAAATCTTTCGGTGGTTATGCGCGGAAATGGTTTTGAATCGGATACTCCAGACCATCCCGATAATGACCACAATATAGACAAACAGCATCGTGGACGTGACATATTTACCGGCATTCAGCGACTGGCCGAACAAGAAGTTAAATGCCGTAAGCCCCGCGCCGATGCCTAAGGCGATCATCAATTTTTTTACGCTAATGCGTTCCACAAATAACAGCAGCAACAGCGGTAAAAAAGTGACGATGGTAATGGGAAAGCTTTCCCCCAGTTGGGCAATCTTGACATTGACCAGTAGGTAGATCAGCGGCAGCAGCAGATAGCTACAGATTCTGATAGAACGAGACATAC [...]
+AGCGGCGTAAGCCAGAGATTGCTCAGGCGGTATTTGGCGCCACGCTGGACGCCTTTCGTATGCGTAGCCGCGTCGCGTACAGCGGTCAACAGATGCTGGAGGAGTATGTCTCGTTCTATCAGAATCTGTAGCTATCTGCTGCTGCCGCTGATCTACCTACTGGTCAATGTCAAGATTGCCCAACTGGGGGAAAGCTTTCCCATTACCATCGTCACTTTTTTACCGCTGTTGCTGCTGTTATTTGTGGAACGCATTAGCGTAAAAAAATTGATGATCGCCTTAGGCATCGGCGCGGGGCTTACGGCATTTAACTTCTTGTTCGGCCAGTCGCTGAATGCCGGTAAATATGTCACGTCCACGATGCTGTTTGTCTATATTGTGGTCATTATCGGGATGGTCTGGAGTATCCGATTCAAAACCATTTCCGCGCATAACCACCGAAAGATTTTGCGTTTTTTTTATCTGGTGGTGGGTATAGTGGTCGCGCTCGCC [...]
+NODE 1726 51 163 163 0 0
+GGAGCGATCCGGCACTGAAAAAAGGGTTACGCGAGAATGCCGGACTGGGCA
+CCCATCCCCGCCGCATTTTTCATCGCAGCAATGAGCGTGCCCTCCGTATAG
+NODE 1727 24 44 44 0 0
+CGGAAGCAACCCGTGCTGAAATAC
+CCTTTTTTCAGTGCCGGATCGCTC
+NODE 1728 42 17897 17419 0 0
+TGAAACATCTAAGTACCCCGAGGAAAAGAAATCAACCGAGAT
+GGTTCGCCTCATTAACCTATGGATTCAGTTAATGATAGTGTG
+NODE 1729 5 1928 1838 0 0
+TCCCC
+CCCCC
+NODE 1730 6436 389895 387540 0 0
+AACGAAAACAAGCGAAGACTTTCGGCGTGAGTTGGCTATAATACTCGCCACTTGTTTGTCATAAATTCAAAGGAAACAGACATGAGCTTACTCAACGTCCCGGCGGGTAAAGAACTGCCGGAAGATATCTACGTCGTTATCGAGATCCCGGCTAACGCAGATCCGATCAAATACGAAGTTGACAAAGAGAGCGGCGCGCTGTTCGTTGACCGCTTCATGTCCACCGCGATGTTCTATCCGTGCAACTACGGTTACATCAACCATACCCTGTCTCTGGACGGCGACCCGGTAGACGTTCTGGTCCCGACGCCGTACCCGCTGCAGCCAGGCGCCGTCATCCGTTGCCGTCCGGTTGGCGTACTGAAAATGACCGACGAATCCGGTGAAGATGCGAAACTGGTTGCCGTACCGCACACCAAACTGAGCAAAGAGTACGATCACATTAAAGATGTGAACGATCTGCCGGAACTGCTGAAAGCGCAGATCACTCAT [...]
+GAAAGGACAAGATATTCCGCAGGCGACCATCACGCTGGATGCCAAAGGGAATGAGCGGCAGATTAATCTCGATAAACTCACCGTCGCCGCTCTGGAGGGAAAAACCGAACTGAAAGCGCTGGTGGACTGGCAGCAGGCGATTAGCTGGCGTGGCGAACTGACGCTGAATGGCATCAATACCGCTAAAGAGATCCCGGACTGGCCCGCGAAGCTTAACGGCGTCATGAAAACCAAAGGCAGCCTCTACGGCGGCACCTGGCAGATGGATGTCCCGGAGCTCAAGCTGACCGGCAATGTGAAGCAGAACAGCGTTAACGTCAACGGGACGCTAAAGGGCAACAGCTACATGCAGTGGACGATCCCGGGGCTGCACCTTGCGCTGGGCCCAAACAGCGCCGATATAAAAGGCGAGCTTGGCGTTAAGGAGCTGAATCTTGACGCCGCCATCGATGCGCCGGGGCTGGATAATGCGCTGCCAGGACTGGGCGGCAT [...]
+NODE 1731 3041 157163 153422 0 0
+AGAGAACCGTGCAGATTGAACGCGCCAGCCGGGGCGAGGTGCAGAATTTCTTCGCTTAACAGGTTGCGGTAATAGAACGAAAAAATAATATCCGGCGCAAGCTCAGCGATGCGGTCGACCCAGATAGGATGGTTTACGTTATCCGGCGCATAAACCGGAATCCCTAATTCTGCCGCCAGCCGGGAGACGGAGCCAAAAAAGGTGTTTTCCGCAGGATTGTCGGCATGAGTAAAAATCGCGGCAATCTCATACCCGGCATCCAGTACGGCCTGCACGCCCTGACATCCCATATCGTGATAGGCAAAAATAACGGCTTTCATTGGTGACTTTCCTCAGTAAACGGCGTGCTTTCCGGGTAGATAACTTGTTGAACAAAATAACGGGGGCGGGCGCGGACATCGTTATAAATGCGACCGATGTATTCGCCCAGCAGTCCCATACCGATGAATTGCGCGCCGATGAAGGTAAACAGAACGGCAAAGAGCATAAATA [...]
+CCGTTGACCGTAATCCCCGTGCTGTCTGACAGGCAGGTATTATCGGAACGATCGCACCGCTCGGCATGGCGGAATAACACGACTACCGGATGCTGCTTCGCCAGCGCCGCCAGCGCTTTACCGTTAATCTGCGGTAGACCGTTACCACTCCAGGCATGTTGTGAGGTCAACCCGGCGATAATAACCAACGCCCCCGCCAGAGTCGCGAGATAGCGTTTGTTTTTAATAAAGCGTAGGGTAAATGCCAGCACATTAACCTCTCAGGCAGACAGTGCAGCTAACTTAATAGCAATACGATTAAAATGAAATTCCGCAACGGAAGACCAGGCCAGAAACATAAAAACAGCTTTTGGGCATGCATAAAATGCCTTAAACTTTCGGCGAAAGCAAAGCATAATTCCGTTAAAAATTATCTTTTTACTTCACCTTAATTTCTTAATGTTAATTTAATATTCATCCAGTAGGGTTCAGCTAAATGCGTTAAAAAATAAG [...]
+NODE 1732 30 1511 1511 0 0
+TCCCGCCGGAAGCGATTAACCCAACGGAGC
+CCCTCGATTCCTTTTATTATCTTCGGCGTT
+NODE 1733 69 2653 2653 0 0
+GCGGCGCTTCATCCACGTTTCTGTTAAAGGTTTTGCCTGCTGTTCGACAAACAGCGCGGAGCGCAGCGC
+AACGTGGATGAAGCGCCGCCTGACCCGCATCGAACATCTGGGCAGCTATGCCTGCCGTAATATTTATCA
+NODE 1734 311 13359 13359 0 0
+ATTGTTGCTTGAGGCGCAAAATCTTGGCTTAGGCGCGCAGTTCGGCGGCAAATATTTCGCTCACGATATTCGTGTCATCCGATTGCCGCGTCACGGGGCATCGTGTCCGGTAGGTATGGGCGTATCCTGTTCCGCGGATCGAAACATTAAAGCGAAGATCAACCGGGACGGGATCTGGATCGAGAAGCTGGAGCGCAATCCCGGTAAATATATTCCAGAGGCGCTGCGCCAGGCGGGAGAGGGCGAGGCGGTGCGCGTTGATCTTAACCGTCCCATGAGCGAGATACTGCAACAACTGTCGCAGTATCCGG
+TCAACGCGCACCGCCTCGCCCTCTCCCGCCTGGCGCAGCGCCTCTGGAATATATTTACCGGGATTGCGCTCCAGCTTCTCGATCCAGATCCCGTCCCGGTTGATCTTCGCTTTAATGTTTCGATCCGCGGAACAGGATACGCCCATACCTACCGGACACGATGCCCCGTGACGCGGCAATCGGATGACACGAATATCGTGAGCGAAATATTTGCCGCCGAACTGCGCGCCTAAGCCAAGATTTTGCGCCTCAAGCAACAATTCTTTTTCCAGCTCAATATCGCGGAAGGCCTGCCCGTGTTCATTGCCTTC
+NODE 1735 187 8497 8296 0 0
+CCGGTGGTTTTATTGTTCTGGCTCTGGCGCTGATGAAGGGCGACCTGCGCGCGGAAACGCAGCAGCGGGTGATCGCCTGTATGTTTGGTCTGTGGGTGCTGATGGGGATTGGCTTTATCGCCTCGATGCTGCATCTGGGCTCGCCGATGCGCGCGTTTAACTCGCTTAACCGCGTGGGTGCTTCCGC
+CAGATGCAGCATCGAGGCGATAAAGCCAATCCCCATCAGCACCCACAGACCAAACATACAGGCGATCACCCGCTGCTGCGTTTCCGCGCGCAGGTCGCCCTTCATCAGCGCCAGAGCCAGAACAATAAAACCACCGGCCACGCACTGACCAAAGACCGTGAAGATCATCAACGGCCATTCATGCCAT
+NODE 1736 4701 260400 258727 0 0
+TAGCGGAATGCCCGGCGAAGAGGTGAAACAGCGACTGCGCACGGGAACGGTCGTCACCACGGATGATCGTAACTGGGAGCTTCGTTATTCCGCATCGGCGCTGCGATTCAACCTTAGCCGCGCGGTCGCGATTGATATGGAGAGCGCGACGATTGCAGCCCAGGGCTATCGCTTCCGCGTGCCTTACGGCACGCTGCTTTGTGTTTCTGACAAACCTTTACACGGTGAAATTAAACTGCCCGGGCAGGCAAACCGGTTTTATGAGGGGGCTATTTCAGAACATTTGCAAATTGGTATTCGTGCTATTGATTTACTACGCGCAGAAGGTGATCGTTTGCACTCACGTAAATTACGCACGTTTAATGAGCCACCGTTTCGCTAACGAAATGAGCTGTCGCCTGCTGTTGGACAGGAGTGGAAGAGGCGTATTTATGTGATATGAAAAGCGGCTGAATGAAGCCTTAGCGGGAGGCGATTTTGCATCCCGCCAAG [...]
+GCCTTTGAAGGCTATACCAACGAAGAAAACTTCGCTAACCGACAACGTGTTTCTGTATTTAAATCTTTCTATGAAAGCGGCAATCTCAAAAGTATTTATCATTATAATGCACAAAATAAGCGTGACGGAAAAGCTGAAACTTACTTTGATGAAAAAGACAAAATAGCGGAAACGCTGACGTTTAAAGATGGTCAACCCGAAGGGGAATACATCGTATACCATGAAAACGGAGCCGTTGAAAGTAAACGTTACTTTGCCCAAGGTAAAATTAAAGATGGCGAATGCCCACATTTTTATGATAACGGCGTTTTAAAACAAAAACACAGCTATTTAAATCAGAAACTGGAAGGCCCGGCATTTGAATATTTCCCTGATGGGAAAATAAAGGGGAAATATTCATACAGTAAAGGCACCATTGTCGGCACTAGTACGGAATATTATTCTACCGGTAAAATTCGTGGTGTTTACCACAGAAATAACCAAGGTGAAAAC [...]
+NODE 1737 13 1241 492 0 0
+TGGAAAGCTACCC
+AACCTCATCCAGA
+NODE 1738 413 25634 25117 0 0
+AGGCGCAAATTTTAATGCCATATGACTATAGACCATATCTACGTCGTTTCCAGTGTGCATAAGTATATTTACCTTTTGATTACAGTTATTCAGAATTATCTAAACATCAGCTCATTTTTCTCAGTATATGCCTTCATTTTTCACAGGAAGTGTGCGCCCGCCCGCAAACTGGCATCCCCTTTGCGGGAAAAAGCATCAATCGCACATATGATTAACTATCGGCCCAAAGTGGTCGGATCACCTGCAAAAAAATAAAGAAGGAATGACCATGACCCTACGTAAAATTCTGGCGATGTCGTGTCTGCTACTCCCCATAATGGCTTGTGCGCATAACCTTGAAGTTAACCAACGGGTGCCGCCGGTAGGCATTGCCGATCGTGGCGAACTGACGTTGAATAAAGATGAGTTTAGTT
+ACCGGCGGCACCCGTTGGTTAACTTCAAGGTTATGCGCACAAGCCATTATGGGGAGTAGCAGACACGACATCGCCAGAATTTTACGTAGGGTCATGGTCATTCCTTCTTTATTTTTTTGCAGGTGATCCGACCACTTTGGGCCGATAGTTAATCATATGTGCGATTGATGCTTTTTCCCGCAAAGGGGATGCCAGTTTGCGGGCGGGCGCACACTTCCTGTGAAAAATGAAGGCATATACTGAGAAAAATGAGCTGATGTTTAGATAATTCTGAATAACTGTAATCAAAAGGTAAATATACTTATGCACACTGGAAACGACGTAGATATGGTCTATAGTCATATGGCATTAAAATTTGCGCCTTAAAACTGTTGGGCCGATTGTGGCACCGCAAGGGCGTAATACACTGCAGG
+NODE 1739 32 1688 456 0 0
+TATCTGAGTTCCAGTATATTGAAACAGAAACT
+ACCCTGACGCTGAAGCCATATCCGTTTCATTA
+NODE 1740 7 339 329 0 0
+TAATCAT
+ACCCGCC
+NODE 1741 122 6434 4310 0 0
+TGTACGGAATAAGCGATACTCTCGCAGCGAATATTGAGCTTAAATTCCCCATAATCGACCGTATCCGCCACCATGATTACCTGAAGCACCCAAAAGAGCGCGGTCCCGATATTCAGGAAAAT
+GGTGGCGGATACGGTCGATTATGGGGAATTTAAGCTCAATATTCGCTGCGAGAGTATCGCTTATTCCGTACAGACGATGGTTGTGAAGGGCGGCTCGGCGTTTGCGGCGTTCTTTATCGCTC
+NODE 1742 120 4569 4569 0 0
+ACTCGCACACCTTGCGGCGCCAGAACCTAAATCTGGTGCGTCTACCAATTTCGCCACTCCCGCAAAAAAGATGGTGGCTACGACGGGATTCGAACCTGTGACCCCATCATTATGAGTGAT
+CTTTTTTGCGGGAGTGGCGAAATTGGTAGACGCACCAGATTTAGGTTCTGGCGCCGCAAGGTGTGCGAGTTCAAGTCTCGCCTCCCGCACCATTCACCGATAAGCGTTGTACGGATGGGG
+NODE 1743 29 2929 2929 0 0
+ACAGGTTCGAATCCCGTCGTAGCCACCAT
+GTGCTCTAACCAACTGAGCTACGTAGCCA
+NODE 1744 1590 77368 77051 0 0
+GCAATTGTTCGTGGGCAATAGTCTGGTGGTGCGTCTGATCGACGCGCTGTCACAGTTGCCGGCCGGCTATCCGGTATACAGCAATCGCGGGGCGAGCGGCATTGACGGCCTGCTTTCCACGGCGGCGGGCGTGCAGCGCGCCAGCGCTAAATCGACGTTGGCTATCGTCGGCGATTTATCCGCGCTGTACGATCTTAACGCGCTGGCGTTACTACGTCAGGTATCCGCGCCGTTTGTGTTGATTGTGGTCAACAATAACGGCGGGCAAATCTTCTCCCTGCTGCCGACGCCGCAAAGCAAACGTGAGCGCTTTTATTTGATGCCGCAAAACGTCCATTTTGACCATGCGGCCGCCATGTTTAACCTGCGCTATCATCGCCCGGAAAACTGGGAAGAACTGGAGTCTGCGCTGGCTGGCGCGTGGCGAACCCCGGCGGCAACGGTGATTGAGCTGGTGGTAAACGATACGGATGGCGCGCAGACGCTGCAGCA [...]
+GCGCAAAACGCTTTATCGCCTTCGCCGGTCAGAATAATCACGCCCACGTTGTCGTCGTAACGGGCATCCGCCAGCGCCTGAATCATCTCTTTGACGGTCAACGGACGAAATGCATTGCGCACCTGCGGACGATTAATGGTGATTTTTGCAATACCGTCGGTGGATTTTTCATAACGAATGTCGGTGTAACCCTCCGAGCAGTCGTGCCATTCTACCGGTGCGTAAAGCATTGTTTCATCAGGATAGATCATAGTGTGTCCTTTAGTCAGAGACGCAGAATCTGAGCCAGACTGTCTACCACGCCAGCGGGGTTTTCCCGATGCGCGTTGTGTCCGGCGTTACGAATAACATGGCATGTCGCCGCCACTTCCTGCGCCAGGGCGCGGAATTTGCTGTCGCGTTCGCCACATAAATAATAAAACGGAAATGCCAGCGCGTTGAGCGCCTCGCGTAAATCCGGCTGGGCGGCAAGCGATGTCGCCTCCAGCATCG [...]
+NODE 1745 2433 132579 131871 0 0
+CCCGCTAATGCCGATAAATATCGTCACCATCGCGGAGATCGCGATCCCGACCGACAGGCTGGAGGCGATATCGTTCAGCGGCGTGCCGCGAGACGCCTCGCCAAGCGTAATCGTAAGAATAGCCCCCCACCACAGCCCTGTCGGCCCTTCCATAATGGCGCGGCGATGGCCGCAAAATGCCTGAACCAGGCAGGCCAACGCGGTGGTCAAAAAAGCGTATTGTGTGAGCATTAACAGGTTATCAGCGGGAAGATGAAAAGCGGACAGCAAGGTAGGGGGAACCACAACCGTGTTACAGAAAATAAAGAAAAACCACTGAAAGCCGGACAATACACTTTCGCGGTTAATAACAGGGAACATATCCACACCTTAAAATAGAGAATGCCCGTCGTGACGACGGGCATTAAATCACACCGGATTACTGCTGATGTTTAAGGATAAACTGACCTTTTGGCGGCACAGGGAAGCCATGCTCGATGTCATAAATAACAT [...]
+TTCTTTGCGGTGCTGGTGATTCTGATGACGACAATTTCAACCAACGCTACCGGTAATATTATACCTGCGGGGTATCAAATTGCGGCGCTTGCCCCGACAAAGCTTAACTATAAAAATGGCGTAATGATTGCCAGTATTATCAGTCTACTGATTTGCCCATGGAAATTAATGGAGAATCAGGACAGTATTTATCTGTTCCTCGATATTATCGGCGGTATGCTTGGCCCGGTAATCGGCGTAATGTTAGCTCATTATTTTGTGGTAATGCGTGGAAAAATTAATCTTGATGAGCTGTACACCGCCAGCGGTGATTACAAATATTATGATAATGGATTTAACCTGACTGCATTTTCAGTCACTCTGGTCGCAGTCATTCTGTCATTAGGCGGCAAGTTTATACCATTTATGGAGCCTTTATCCCGCGTGTCCTGGTTTGTAGGCGTAATAGTTGCGTTCGTTGCTTATGCGCTATTGAAGAAACGCACGGGTTTT [...]
+NODE 1746 3 1159 1122 0 0
+ACT
+TTA
+NODE 1747 3081 186884 184004 0 0
+ACTCGGCATGGGGATGCGCCTTTTTTATTATTGTTTATACAAATGTTTATACAGCTTTGGCTGAACAAACAAAAAAGCACCAGAACAATTCTGATGCTTTATGCCTTTAGTAACCAAAGTGTTTAGTACTCAGGAAGGTTTTCTAAGTTATCCTTGGATGTACCATTAGGTCTAGTAGTAATGTAATCAGTACCGTTGACACGGTCCTTAACCACTTTTTGACCTTTCTTCCACTTACCGTCATCACCTTTGAAAATGGTGTAAAAGGTATAGCCGCTATCGATTTTATTCACTACCCACTGCCGTGTTTCTGATGTCCCTTCTCCAACAGTATCGCCATTATCGACATGCACATACACATGGGTAATGTGAGTGTGTTTATCGTTATATCGGACTTTAGAAATAAGGTAATCAGCCCATTTATCAGTCATATTTCACCAGAAGTTTGAACAGGAAAAGCCCTGCAATACATTTATAAACAACAAAACAGAC [...]
+TTCTGTTCTGGCCTGAGTGGAATCACCAGCCGTTATGCCAGATGCATCATAACCAGAAGACCACGCAGCAAGACCCCATCACCAAAGCGAACCGTAAGGCAGGGCTGTACCGAGAGCAGGAAAAGCGTGCAGCCCATCGCAATGACTGGATCTATGAGGCCAGCAATGAATGAGAAAGACGTGGTGAATCTGTACCGATCGTTGATGCGCTGCCGTGATGGCTTCATGCGGGGGCGAAGCAGATGCAATGAGCGCCAGCCTGCGCAGCGTATGACCGAGCGTGACCGGGAGTTGCGGGAATGCTTCCGCAATCGCTGACAGGCCGCATGGACGGGGTGGGGGAGGTTTTCAGGACAAACCTCAAGGCGCCAGGCACCGCCCGCCCCCTCAAATTTTTACGCACGGTGATTTTTTTGAAAATAAAACGCGATGGAAACGAGAAATTTTTATGGCAAGACCACCAAAACCGCCAGCTTACCTTGATGAGTTAGC [...]
+NODE 1748 18 673 554 0 0
+ATTACGTCCCTGCCCTTT
+ATTCCTCGTTCAAGATTA
+NODE 1749 39 2935 1874 0 0
+GTACACACCGCCCGTCGCACCTACCGATTGAATGGTCCG
+ACGTAATCAATGCAGATTGATGATCTGCGTTTACTAGGA
+NODE 1750 51 136 136 0 0
+ACGGACCATTCAATCGGTAGGTGCGACGGGCGGTGTGTACAAAGGGCAGGG
+TTGAAGGCTCGGGATTGTGGTTGGTTTCCTTCATTGGGAGTTGATCGCGAG
+NODE 1751 51 3360 472 0 0
+ACTCGCTGGCCTGCCAGCAGACAATCGCAACAGCGCTTCGCAAACTGTAAC
+TCAGGTTGATAGAGTGGTGATCCCAGAGGTATTGATAGGTGGAATCAACGT
+NODE 1752 834 40432 40211 0 0
+GAAAGATTTGTATTGTCACTTTACAGACGCATTTCTCCCGTGCAGGTCACATTTGCCCGACACGGCGGGGCAAGAGGCTTGAACAGACGTTCATTTTCCGTAAAACTGGCGTAATGTAAGCGTTTACCCACTATAGGTATTATCATGGCGACCATAAAAGATGTAGCCCGACTGGCCGGTGTTTCAGTCGCCACCGTTTCTCGCGTTATTAACGATTCGCCAAAAGCCAGCGAAGCGTCCCGGCTGGCGGTGACCAGCGCAATGGAGTCCCTGAGCTATCACCCTAACGCCAACGCGCGCGCGCTGGCACAGCAGGCAACGGAAACCCTCGGTCTGGTGGTCGGCGACGTTTCCGATCCTTTTTTCGGCGCGATGGTGAAAGCCGTTGAACAGGTGGCGTATCACACCGGAAATTTTTTACTGATTGGCAACGGGTATCATAACGAACAAAAAGAGCGTCAGGCTATTGAACAGTTGATTCGTCATCGTTGC [...]
+CCAGCCGATCGTTAGCCGGGATATGGCTTTCCGCCAGCGCATCGTAATAGCCCCTCAGGCGATCTTCGGCATCAGAGATGGTGTGGTTGGAACAGATATACCCAATACGCGTATGACCTTGCTGGATCAGATGTCGGGTCGCCAGCCATGCCCCGTAACGGTCATCCAGCGCGACACAGCGGTGTTCTAACCCCGGTAAAATGCGGTTAATCAGCACCATGCCGGGGATTTGCTTCATTAATGAGGCCAGGTCCGCATCCGGAATCATTTTGGCGTGTACCACTAACGCTGCGCAACGATGACGAATCAACTGTTCAATAGCCTGACGCTCTTTTTGTTCGTTATGATACCCGTTGCCAATCAGTAAAAAATTTCCGGTGTGATACGCCACCTGTTCAACGGCTTTCACCATCGCGCCGAAAAAAGGATCGGAAACGTCGCCGACCACCAGACCGAGGGTTTCCGTTGCCTGCTGTGCCAGCGCGCGCGCGT [...]
+NODE 1753 51 148 148 0 0
+GAAGGCCAATCAAACCGGGAGATAGCTGGTTCTCCCCGAAAGCTATTTAGG
+CCCCCCCCAGCCACAGGTCATCCGCTAATTTTTCAACATTAGTCGGTTCGG
+NODE 1754 610 27934 27359 0 0
+AGGATCAATTTTTCGCCCGGCTCATTACCGACCTGTACCGCGACAATATGATCCTCGTTGACTTCAATCACTTTCAGTTTCGGCCCCCCCATTCGGGGCTGTACGATATCGCCTGGTGTGAACATCACGCCCTCCCGTTGAACAATGGTATAAACCCGCCTTCAGTCTACTACACACTTACCGACGCGTGGTGAAGGTACCGCTTAATGAGTACGGGTATTCCAGGGCATTTTTTCCAGTAGTCGCGCCATTCCGCAGAAGCCGGTCATGCCTGCCAGCATTAACCCGGCCCCGACAAAACCACTAATGAGGAAAAAGCCGCCGTGAACCGTATAGCCCAGAATCACCCCAAGCAACGTCAACCCGCCGGCGGCGATTTGCACCTGACGCATCAGTGGCAACGGTTGCGATTTGTCTTCTGTGACGGGCAATCCTGCCGCTTTCCATCCGTCGATGCCGCCTTCCAGTAGACTGACCTGAGCTGGGGCGGCA [...]
+GAACAGATTATTTTTCACTGTCAGTCAGGTAAACGAACCAGCAGCAATGCAGCAAAACTACAGGCCATTGCCGCCCCAGCTCAGGTCAGTCTACTGGAAGGCGGCATCGACGGATGGAAAGCGGCAGGATTGCCCGTCACAGAAGACAAATCGCAACCGTTGCCACTGATGCGTCAGGTGCAAATCGCCGCCGGCGGGTTGACGTTGCTTGGGGTGATTCTGGGCTATACGGTTCACGGCGGCTTTTTCCTCATTAGTGGTTTTGTCGGGGCCGGGTTAATGCTGGCAGGCATGACCGGCTTCTGCGGAATGGCGCGACTACTGGAAAAAATGCCCTGGAATACCCGTACTCATTAAGCGGTACCTTCACCACGCGTCGGTAAGTGTGTAGTAGACTGAAGGCGGGTTTATACCATTGTTCAACGGGAGGGCGTGATGTTCACACCAGGCGATATCGTACAGCCCCGAATGGGGGGGCCGAAACTGAAAGTG [...]
+NODE 1755 4135 215379 213638 0 0
+TGCCGCTTTTTGCTCAACCTCCGTCATCGGCGCGCCATGAGCATGATGACCATGCGCGAAGGCAGGACTATTTACCAACAGCATTCCCAGAAGCATTGTCAGTTTTTTTAAATGAATCACCAAAACGTTACCCTCATCTTTCTTAGAAAGATGATTGTTATATTATAACATTGCATTTATTTCAACAGAAACTCAGCGGCCACCGCGCAGGTGGCCTTTTTTGATATCAACTGGTCCGCCATCGAGGAATTGAACCCCGAACCTTAGAGGTAGAAGCTCTATGCTCTATCCGGTTGAGCTAATGGCGGAAGAAAAATTACGCGGCCATTTTAAGGCAGGCGTCTGCGCATTGGCTGCATGCCCGCGCGCAATTCTGGCAATGGTCGTGATCGTGCCTTGCACACTCTTCGGCGCAGGCTTTGCAGATATCCGCGCACAGGCGGCATAATTTTTGTGAGTACTCGCTTTCCAATGCCATAAATTGCGCCGCCA [...]
+GCACCGATAATCTGGGGCGTGATGTATGGCTTCGTTGCTTTCAGGGGGCCTTCACCAGTTTACAAATTGGCGTTGGCGCCGCGCTGTGCAGCGGCGTTATCGCGCTAGTGATGGCGGCAGTGGCGCGCATTCATCCCCGGCTGGACCTCCTGATGCGGCTGATAACCGATGCCATGCTCGCCATGCCGCATTTACTTTTGCTGATCCTTATCTGTTTTACGCTCGGCGGCGGTAAAAGCGGCGTCATTGCGGCCGTGGCGTTAACGCACTGGCCCCGTCTGGCGCTGATTCTGCGCGCCGACGCGGAGCGGGTAGCGCAGAGTGACTACCTGACACTGACCTATCGTCTGGGGCATGGACACCTTTATTGCTGGCGATATCACTATTTTCCGGCGTTATTGCCGCAATGGTTGACGGGAACGTTATTGATGTTTCCTCATGCGGTATTGCACAGCGCGGCGTTAAGTTTTCTGGGGTTTGGGCTGGCGCCGC [...]
+NODE 1756 157 7153 7153 0 0
+GCTAAAAGCAGGGTGGTTCGAATACCGCTGGCGACAAACCGGCGAGCAACAATTTATCAGGCTGGCCGATGAAACCTGGCGCCAGCTACGTATGAAAGGATAAGGAGAGCAGTGTGGGCCCAGTAATGTTGAATGTCGAAGGATGTGAGCTGGATGC
+CTCCTTATCCTTTCATACGTAGCTGGCGCCAGGTTTCATCGGCCAGCCTGATAAATTGTTGCTCGCCGGTTTGTCGCCAGCGGTATTCGAACCACCCTGCTTTTAGCATAATGACCCAGGGGTGCCATAATCGTATCTGTCGCCATAGCTGCCGGGC
+NODE 1757 238 13706 13603 0 0
+CCGGATGATCTGCGAGCGCAAATAGAGCCGTTACATGCCATGGTTAAAGCCATGGGGTTACCTCTGCTGGCAGTCTCTGGCGTAGAAGCGGATGACGTTATCGGTACACTGGCGCGAGAAGCGGAGAAGGTGGGGCGTCCGGTATTAATCAGCACCGGCGATAAAGATATGGCACAGTTGGTGACGCCGAATATTACGCTGATCAACACCATGACTAACACCATCCTCGGCCCGGATG
+GGCGTCACCAACTGTGCCATATCTTTATCGCCGGTGCTGATTAATACCGGACGCCCCACCTTCTCCGCTTCTCGCGCCAGTGTACCGATAACGTCATCCGCTTCTACGCCAGAGACTGCCAGCAGAGGTAACCCCATGGCTTTAACCATGGCATGTAACGGCTCTATTTGCGCTCGCAGATCATCCGGCATCGGAGGACGATGCGATTTGTAGTGTTCAAAGAGCTCATCACGGAAGG
+NODE 1758 51 2811 2811 0 0
+AAGTCGTTAATAAGTACGGCGTGCCGCCTGAGCTGATTATCGACTTTCTGG
+TCATCCGGGCCGAGGATGGTGTTAGTCATGGTGTTGATCAGCGTAATATTC
+NODE 1759 51 2049 1600 0 0
+GCCGCCATATCTTCCGTCATCAGATCATAGCTAAACGTTCCTTGCGGGTTA
+CTTTTGTTAAAGCGCTGAAGCTGGAAAAACCGCTGGTGATGGGTTACAGCG
+NODE 1760 260 13051 12892 0 0
+AAGTGACTGGCCCGGATTTCCGGGCCAGTTTTTACAGCGAAGAATCGTAATAAAAATGGATATCCAGGTTTTCATCGGGCTTGAAGTTTTTTTGTTTAAACTCCAGGGTTAACGGATCAATTTGTTTTAGCGGGTAATTAAAGCAGGGGACAACCACTTCAGTCTCATCCTTCTTATGAATGCGCAAGGTAAAGTCGCCAATGACACCCTCTTTCCAGTTAGCGCCAGTTTTCAGAATATAGCCCAGATAGCCCCAGCCG
+AGGGTGTCATTGGCGACTTTACCTTGCGCATTCATAAGAAGGATGAGACTGAAGTGGTTGTCCCCTGCTTTAATTACCCGCTAAAACAAATTGATCCGTTAACCCTGGAGTTTAAACAAAAAAACTTCAAGCCCGATGAAAACCTGGATATCCATTTTTATTACGATTCTTCGCTGTAAAAACTGGCCCGGAAATCCGGGCCAGTCACTTTTACACCGCAGTCTGGAAAATCACGCCGTCCGCTTTCTCAGTGTACTGAG
+NODE 1761 3449 174985 173721 0 0
+ACCGTTACCGCCAGCCGTAAGATTCCCTACCACAACCACCGGTACCGGCGCTCGCCAGGCGCGTTTAAAACCAAGCTTATAGCTCAGACGAATCGCCCCGCTCACCAGGCCATACAGCCAGGAGAGCGGCAACAGTAACCGCCATAGCGGGGATTCACCCGACCAGATACGCGCAATCATTGGCCAAATTGCATCTTATGTAGCTGGGCGTAAACGCCGTGTTGCGCCAGCAGCTCGCTATGAGTGCCGCGCTCAACGATAATACCGTCTTCGACTACAACGATCTCATCCGCCTGTTCGATGGTGGAGAGACGGTGCGCAATCACCAGAGAGGTACGGTTTTTCTGCAGCTCATCCAACGCTGCCTGAATCGCACGTTCAGACTCGGTATCCAGCGCAGACGTAGCTTCATCAAGGATCAGAATCGGGCTGTCGCGCAGTAAGGCGCGGGCAATCGCGATACGCTGGCGTTGACCGCCGGAAAGCAGTACG [...]
+CTTACAACCGCCTGCGCTGCGCACGGTGGCGGCACTGAGCGTCTGGGGAGGATTAAAATTAAGCGGACGACAGTGGAGCGGCTGGCAAGTCTGGTGCTGCTGTCTGGCCGCGATTATTTTCGCCGATCCTGTGGCGGTTATATCACAAAGTCTTTGGCTGTCAGCATTTGCGGTTGCCGGCCTGTTATTCTGGTATCAGTGGTTTCCTGCGCCAAACGGAAATTTTCCACGGGGCTTACGCTGGTTGCTTAACCTGCTTCACCTACAGGCAGGCATTACACTTCTGCTTTTGCCTCTCCAGGTGGCGCTTTTTCATGGCATAAGCGTTACCGCAATGCTGGCGAATCTTTTTGCCGTACCCTGGGTCACATTTGTGACGGTTCCGCTCATCCTGGCGGGAATGATTCTGCATTTAACCGGGCCGTTTTTTCTTGAAGAGTGGGTATGGTACCTGACCGATCGCGCGTTAGCCGCGCTATTTTACCTGTTGAA [...]
+NODE 1762 600 25935 25628 0 0
+TGCCACTAGCGTTGATGCGCTGGGTACAGGCAACGTCACCAACAACGCCACGCTGGCGCTGAACACTGGCGGTGACTTCATCAATAACATCGGCGGTACGGGCCGCGTGGAAAAATCCGGCGACGACGCGCTCACGCTCTCCGGCAGCAATACTTATACCGGCGGCACCCTCATCAGCGGCGGCACGCTGGTCGCCAACGATGTAAACGCGCTGGGTACTGGCGACGTTACCGACAACGCCGCGCTGATGCTGAACACCGGCGGTGACTTCATCAATAACATCGGCGGTACGGGCCGCGTGGAGAAATCCGGCGACGACACGCTCACGCTCTCCGGCAGCAATACTTACACCGGCGGCACCCTTATCAGCGGCGGCACGCTGGTCGCCAACGACGTGAACGCGCTGGGTACTGGCGACGTTACCGACAACGCCACGCTGGCGCTGAACGCTGTCGGCGATTTTAACAACGCCATCGGTGGCAGCGGCAAGGT [...]
+GCCGCCAGTGTAAGTATTGCTGCCGGAAAGCGTGAGCGTGTCGTCGCCGGATTTTTCCACCTTGCCGCTGCCACCGATGGCGTTGTTAAAATCGCCGACAGCGTTCAGCGCCAGCGTGGCGTTGTCGGTAACGTCGCCAGTACCCAGCGCGTTCACGTCGTTGGCGACCAGCGTGCCGCCGCTGATAAGGGTGCCGCCGGTGTAAGTATTGCTGCCGGAGAGCGTGAGCGTGTCGTCGCCGGATTTCTCCACGCGGCCCGTACCGCCGATGTTATTGATGAAGTCACCGCCGGTGTTCAGCATCAGCGCGGCGTTGTCGGTAACGTCGCCAGTACCCAGCGCGTTTACATCGTTGGCGACCAGCGTGCCGCCGCTGATGAGGGTGCCGCCGGTATAAGTATTGCTGCCGGAGAGCGTGAGCGCGTCGTCGCCGGATTTTTCCACGCGGCCCGTACCGCCGATGTTATTGATGAAGTCACCGCCAGTGTTCAG [...]
+NODE 1763 203 9463 9463 0 0
+TGGCGGCAAAACGTGGTTTAACGCCACACAGAGCTCGACGTCGGGAGTCTGGGATTACACCTGGCTGGCTGATGTGGGAGAGGGGAAGCATACCCTGACAGTGGAGGCGACCGACAAGGCGGGAAACAAGGCAACACAGCAACTGGAGTTCACCATCGACACCCTACTGTCAGAGCCGACTATCGCTCTGGACAGCACGGACG
+GTGAACTCCAGTTGCTGTGTTGCCTTGTTTCCCGCCTTGTCGGTCGCCTCCACTGTCAGGGTATGCTTCCCCTCTCCCACATCAGCCAGCCAGGTGTAATCCCAGACTCCCGACGTCGAGCTCTGTGTGGCGTTAAACCACGTTTTGCCGCCATCAATGCTCAGGCGCACCACGTTGACATCCGTCGGTACCGTCACCTGGAA
+NODE 1764 159 7905 7905 0 0
+GAAAAGCTGAAAAAAGCGCCAGTTTTTGCTTTCGACACGGAGACCGACAGTCTGGATAATATCGCCGCCAACCTGGTGGGCCTCTCGTTTGCTATCGAACCTGGCGTTGCCGCGTATGTACCTGTCGCGCATGATTATCTGGACGCTCCGGATCAAATC
+CAACGCCAGGTTCGATAGCAAACGAGAGGCCCACCAGGTTGGCGGCGATATTATCCAGACTGTCGGTCTCCGTGTCGAAAGCAAAAACTGGCGCTTTTTTCAGCTTTTCAATCCAGCTTTCCAGCGTAACGTCGTCCAGAATCGTGACATAATTTTCAT
+NODE 1765 51 1829 1829 0 0
+TCCCGCCAGCGTGCTCTGGAACTGCTGAAGCCGCTGCTGGAAGATGAAAAA
+AGATTTGATCCGGAGCGTCCAGATAATCATGCGCGACAGGTACATACGCGG
+NODE 1766 51 2541 1420 0 0
+TATCCATACCATAATGAATACTGGCTCCGGCAATAATGCACACGCTGGCTA
+ACCTGGAACGTGCTGGATATTGTGCAGCGCTGGGACAGTCTGTTTGCTTCA
+NODE 1767 185 11231 11156 0 0
+CGGCGAATAATATATACGCTACGATAAGCCCCAGCGTTTGTCCCAATGCCTGAGCGCGAAATGAATGCGCGTTTTGCGTGAAATCGGACGCGCTCACCGCTGGCGCAGCCCAGACGGCGACTACGGCGTTAATCACCACCAGGAACAGAAAGCCGCTGTGCTCTGCTTTTTGCACGCCTGAAGGC
+TGATTAACGCCGTAGTCGCCGTCTGGGCTGCGCCAGCGGTGAGCGCGTCCGATTTCACGCAAAACGCGCATTCATTTCGCGCTCAGGCATTGGGACAAACGCTGGGGCTTATCGTAGCGTATATATTATTCGCCGTAGCCAGCGTGTGCATTATTGCCGGAGCCAGTATTCATTATGGTATGGAT
+NODE 1768 811 51318 51203 0 0
+GCAACGTATTGCTTCAGCTTAAAAATAATTATATCTACTGTTTCTTTATTTTATATTTATTTGTTCCTCATAGCTAAACCCATAACAACGTTATCCGATGCGTGAAAAGAGGGATTTATGGAACATCAAAGAGAGCTATATCAGCAGCGCGGTTATAGCGAAGACTTATTACCTAAAACAGAAACCCAACGAAACTGGAAGGCATTTAACTATTTCACCTTATGGATGGGATCTGTACATAACGTGCCAAATTACGTTATGGTCGGCGGTTTTTTTATACTGGGGCTATCAACATTTAATATCATGTTGGCCATTATTATCAGCGCATTATTTATTGCGGCGGCGATGGTAATGAATGGCGCGGCAGGCAGCAAATATGGCGTTCCTTTTGCTATGATATTGCGAGGTTCTTACGGCGTCCGCGGCGCGCTATTCCCTGGATTATTACGAGGGGGAATCGCAGCAATCATGTGGTTCGGCTTGCAGTGTTAC [...]
+AGATAGTCCAGAATCGGGCCAATGCCGACCAGCGATATTGCCCAAATAGCCATGCCGCCAAAGACAATGTAAATACATGGATTGAGGATAGCGGTAAATTTATTTAATACTTTACCACCGCCAAAACCGATGCCAACGTTAATAATCCAAAAAATTAGAAAAGTAATTAGTCCTGGCAGTGAAAGACCCAGCAGCTTGAAATCTCCGCCTAATGTCAGAAATCCTGGCCAGATCTTCCCAATCAAAATAAGAAATGCCAGCGATCCCGCGTAACACTGCAAGCCGAACCACATGATTGCTGCGATTCCCCCTCGTAATAATCCAGGGAATAGCGCGCCGCGGACGCCGTAAGAACCTCGCAATATCATAGCAAAAGGAACGCCATATTTGCTGCCTGCCGCGCCATTCATTACCATCGCCGCCGCAATAAATAATGCGCTGATAATAATGGCCAACATGATATTAAATGTTGATAGCCCCAGTATAAAAAAA [...]
+NODE 1769 278 15067 14696 0 0
+CACGAAACGGCGCCAGGCCGGTGCTGTTCAGCAGCTCGGTAATACGCGCTTCGCGTTCAGCTTTGTCATGACCAAAGAGACGAGCGAAAAAATCGACGTTCTCATAAACCGATAACGTGTGATAAAGGTTTTTCCCCAGCCCCTGCGGCATCCAGGCGATGCGCGGACAGACGTCGCGGCGATGTTTCGCATCGCGCATATCGCCGCCCAGGACGATAACGTTCCCTTGCTCAATCACCCGCGCGCCAGAAATCAGCGACAGCAGGCTCGACTTACCC
+AAGGGAACGTTATCGTCCTGGGCGGCGATATGCGCGATGCGAAACATCGCCGCGACGTCTGTCCGCGCATCGCCTGGATGCCGCAGGGGCTGGGGAAAAACCTTTATCACACGTTATCGGTTTATGAGAACGTCGATTTTTTCGCTCGTCTCTTTGGTCATGACAAAGCTGAACGCGAAGCGCGTATTACCGAGCTGCTGAACAGCACCGGCCTGGCGCCGTTTCGTGACCGTCCTGCCGGGAAGCTGTCCGGTGGGATGAAACAAAAGCTGGGGTTG
+NODE 1770 9 529 512 0 0
+ACCCCGTCC
+TGATTGAGC
+NODE 1771 489 23033 22682 0 0
+CCCGCCGCCGGGTTCGAATACCGGCGCGGAGCACCGCAGTTTACCTTCGGGATAAATTTGCGGCGTGATTGTTGCGCTATCGAGAGAGGGCGCAAGCGTCAACGTATAGATACGTACCATCGTTACCTCCTGTTAGGCTGATTTCAGTCTGGCACTTAATCCCCGGAAAGTGAAGGAATTAACAATATGATTTTCCGGATCTTTATTTAAAGAAGTACGATGTAAAGTTATATAAATAAATGAATGCTTCGGGAGGGTTCTTATTCAAAAAATGAAATAGTAATTGATTGCTATGTTATTCGGGGCTTCTTATAATTCGCTACCTTTCCAGGGGCGTTTGTTATTGATCCCTATGAAAGTTTCCGGGACCGTCGTGGTCTCTTTTTTAGTTGTACGGACTCTATATAAATGAAGCTTTTGAAGGCAGTACCCGCTGTAGTTATGCTGGCGGGTGGCGTGTTCGCGTCTCTGTATGCCGCCGCCGATGAT
+CTACAGCGGGTACTGCCTTCAAAAGCTTCATTTATATAGAGTCCGTACAACTAAAAAAGAGACCACGACGGTCCCGGAAACTTTCATAGGGATCAATAACAAACGCCCCTGGAAAGGTAGCGAATTATAAGAAGCCCCGAATAACATAGCAATCAATTACTATTTCATTTTTTGAATAAGAACCCTCCCGAAGCATTCATTTATTTATATAACTTTACATCGTACTTCTTTAAATAAAGATCCGGAAAATCATATTGTTAATTCCTTCACTTTCCGGGGATTAAGTGCCAGACTGAAATCAGCCTAACAGGAGGTAACGATGGTACGTATCTATACGTTGACGCTTGCGCCCTCTCTCGATAGCGCAACAATCACGCCGCAAATTTATCCCGAAGGTAAACTGCGGTGCTCCGCGCCGGTATTCGAACCCGGCGGCGGGGGTATTAATGTCGCTCGCGCTATTGCGCATCTTGGCGGCACCGCGACCGC
+NODE 1772 27 1090 1090 0 0
+ACGCGAACACGCCACCCGCCAGCATAA
+TCCGTTTTTACTGTCATGGATGATCCC
+NODE 1773 292 13951 12975 0 0
+GTCACCGAATAGCGACAAATAAAGTCTGGGATATCGCCAATAAACCATAATGGCAACACGTGCGGGATAAGTAGTTGAAAATGAACAGAAAACAAAAAACCCCGCCGAAGCGGGGTTCAAAATTGGTCGGCGAGAGAGGATTCGAACCTCCGACCCACTGGTCCCAAACCAGTTGCGCTACCAAGCTGCGCTACTCGCCGATATACTGCTTTTTTGAATTTTTAGTTCAATTCATTGAGTCGTGGTGCGAGGGGGGGGACTTGAACCCCCACGTCCGTAAGGACACTAACAC
+CGACTCAATGAATTGAACTAAAAATTCAAAAAAGCAGTATATCGGCGAGTAGCGCAGCTTGGTAGCGCAACTGGTTTGGGACCAGTGGGTCGGAGGTTCGAATCCTCTCTCGCCGACCAATTTTGAACCCCGCTTCGGCGGGGTTTTTTGTTTTCTGTTCATTTTCAACTACTTATCCCGCACGTGTTGCCATTATGGTTTATTGGCGATATCCCAGACTTTATTTGTCGCTATTCGGTGACGAATAATCTATTGATTTATAATCACTTTATAAAAAACATCCTGTTCTGTC
+NODE 1774 6 777 717 0 0
+CTGAAG
+GCACCA
+NODE 1775 31 4377 4227 0 0
+CTAGCGCGTCTACCAATTCCGCCACCTTCGC
+TACGGACGTGGGGGTTCAAGTCCCCCCCCTC
+NODE 1776 3 10 10 0 0
+CCA
+CCT
+NODE 1777 1144 58868 57559 0 0
+AACGCCTGCTGATCGAGGCTCAGTTCCTCTACCGGACGACCAAAGTAATACAGGCTCGCCAGAGGAAAACCGCGAATTTCATTATCCCCGCTTTGACCGAGGTAGACCTCGTTCATGTACAGCTCAAGAATACGATCTTTACTGTAACGGGCATCCATGATCAGCGCCATGTAGGCTTCATTCGCTTTACGCCAGTATGATCTTTCGCTGGAGAGGAACAGGTTCTTCACCAGCTGCTGGGTTAGCGTACTTGCCCCCTGCACCGTACGTCCCGCCGTCAGGTTGGCCAGTACCGCACGCCCGATAGAGTAAAGACTAATGCCATCATGCTCATAGAAATGACGGTCTTCCGTCGCCAACAGCGTATCGACCAGCAGATCCGGGAAACCGCTGCGCGGGACGAATAAACGCTGCTCGCCATTTGGCGAAGAAAGCATGGTGATAAGCCGCGGATCGAGACGGAAGAAGCCAAACTGGCGGTTGTTATCCAGA [...]
+TCTGTCGTCTGGCGGAAGAATAGAGAATCGGGCCTTTGCGCCTGTATGTTGCGGAGAAAAAGCATGGCGGGGAATGACCGCGAGCCGATTGGACGTAAGGGGAAACCGTCACGTCCTGTGAAACAAAAGGTGAGCCGTCGTCGGCAGCATGACGACGATTATGATGATGACTATGAGGATGAAGAACCGATGCCGCGTAAAGGTAAGGGCAAAGGGCGTAAGCCTCGTGGCAAGCGCGGCTGGCTGTGGCTATTGCTAAAACTGTTTATCGTTTTTGTGGTGCTGTTCGCCATTTACGGCGTCTATCTGGATCAAAAAATCCGCAGCCGTATCGATGGCAAGGTCTGGCAGCTTCCGGCGGCGGTATATGGCCGGATGGTGAACCTTGAGCCAGACATGCCTGTCAGCAAAAACGAGATGGTGAAATTGCTGGAAGCGACGCAGTATCGTCTGGTGACGAAGATGACCCGTCCCGGCGAATTTACCGTGCAG [...]
+NODE 1778 20 1161 1125 0 0
+TCCGGCCTGGAGGCAACGTA
+TAAATTGAGAGATTTCTTCT
+NODE 1779 3352 169858 165102 0 0
+TCACGATCGAACGGTTCCAGTTCAGCAATCAGCTTTTTCGCGACCTGATGAGGGAAACCGCTTAACGCAGGCGTTGGATGCAGCAGACAGGCCAGCGTCAGCGCGTTTTCTCCGGCGTTGGCCTTGCCCTCAAACGGCGTACCGAGATGCCATAGCGTCGGCGTGGTGATCAACTGCGGAGAGGAAGGTAATTGCAGTTCCGTGCTGCGATCGCGCAGGATCTGCTTCATCGCCTGCGTCACCAGCTCATGTTCATGGCGATCTTTTTGTGAAGCCAGCAGTCGGTTTCCCGCCTCGCGATCCAGAACGTCATCCGGCTGTCGACGTGCCGAGCCTGCTAACGGCAGCGAACTAAACCGCTCGCCCTCTTTGCGTAGCAGCAATTCGGGGCTGGCGCCCAGCAGAACGCCGCCATCCGCCAGTGGCACATGGAAGTTGTAACTAACTGGATTCTGCGCAACCAGCCGCTCCAGCAATGCTCCGCTATCCACC [...]
+AAAAGGTGATTCTGCTGGCGCGCGGTACTTGCGGTATTGGCTTTATTGGCCTGTGCGTGAACGCGCTGCTGCCGGAACCATCATTGCTGGCGATATATCTCCTTGGCCTGTGGGACGGCTTTTTCGCGTCTCTGGGCGTGACCGCGTTACTGGCGGCGACGCCAGCGCTGGTCGGAAGAGAAAATCTGATGCAGGCCGGCGCGATTACCATGCTGACGGTACGTCTGGGATCGGTTATTTCCCCGATGTTGGGGGGCATATTGCTTGCCAGCGGCGGCGTAGCCTGGAACTATGGGCTGGCGGCCGCCGGGACGTTTATTACGCTATTGCCGTTACTGACGCTGCCGCGACTGCCTGTTCCTCCGCAGCCGCGGGAAAATCCATTTATTGCGTTACTGGCGGCATTTCGTTTTTTGCTCGCCAGTCCGCTTATCGGCGGTATTGCGCTGCTTGGCGGTCTGGTGACGATGGCAAGCGCGGTACGCGTCCTCT [...]
+NODE 1780 23 5449 5314 0 0
+GTCCTGGGCCTCTAGACGAAGGG
+TTCGAATCCCCTAGGGGACGCCA
+NODE 1781 378 19701 19517 0 0
+GTCAGAATACGTTGCCTGCCACATTACGCCACGCGAATTTGTTTTACGGAGAGTTACGGAGTGAAACAATCCCGCCGCGGTGAGCGGCAGGTTGCTTACAAGGTGAATGGATCGGCATCGCGCCAGGCTGGAAATTTTTCGCGATAGTCCTGCAAGGCGACGAGAGAAAGATCGGCATCGATACGTGTCGCCTGGTGTGGTTCGGCGGTGGCGATAATGTCGCCCTGGGGATTAATGATCCGGCTATCGCCGCGATAATGTAGCCCGTTACCATCGGTGCCAACCCGGTTGCAGCCTGCGACATAAGCCTGATTTTCAATAGCGCGCGCCGTCAGTAATGTTTGCCAGTGTAGCGAGCGCGGCGCGGGCCAGTTCGCT
+CGCGCGCTATTGAAAATCAGGCTTATGTCGCAGGCTGCAACCGGGTTGGCACCGATGGTAACGGGCTACATTATCGCGGCGATAGCCGGATCATTAATCCCCAGGGCGACATTATCGCCACCGCCGAACCACACCAGGCGACACGTATCGATGCCGATCTTTCTCTCGTCGCCTTGCAGGACTATCGCGAAAAATTTCCAGCCTGGCGCGATGCCGATCCATTCACCTTGTAAGCAACCTGCCGCTCACCGCGGCGGGATTGTTTCACTCCGTAACTCTCCGTAAAACAAATTCGCGTGGCGTAATGTGGCAGGCAACGTATTCTGACTAAGAGCCTATCCCATTAGGGCTATTTTACTTGCCATTTTGGACCTGGGC
+NODE 1782 4812 252500 248589 0 0
+TGCACCGGCCACTGCGCAACCTGATGGAGAAATTGTCTTGTGGTATCCGCCGTAAACGTTAACGCCAGCAGGCGCGGCGACTGCGCCGAAGGGGCAAGGGTGAAACCAGTATGGCGTTGGGCTAAATCATCTGTGTTCGCTTTTACGGCAGTCAGTGCATTCATCAGAATCATTCCTCTCGGTAGATGGTCAGGGAGACATGGCGATGCTCATTTCGTAGCCATAAATTAAAAATATCGACATTTTCCAGGAACGCGTATGAAATAACCGCTTTTGTTTAATTATTGTGATCAAAAACAACAAATATTTAACAATGCGAAAGGTGAGGTTAACGGCGCCACGAGCCTGACAACGGCAAGAAGGGGTGTAAAATGAGCGAGTTATGGAAAGAGTGATGCTGGCGGGGTTGCCCGGCCTGGCACATGAGCGCGTAGGCCGGACAAGTACAACGTATTTCAGCAGTCAATTAACCGGCGTCAACCTGCGGTTTAC [...]
+CCTGTGAGATCCAGGAAGAGAACAGCAGTTGGCCCGCCAGATAACGACGGGACTGCAGCGTTTCTGCGACATAAATCTCCGCCATGCCGATAATGCCGCCTTCGTTGACCGGCTGTAGCAAACGCGCCACGCGGATCGCCTCGCCGCGATACTCGGTATGATAGAACCACGCCAGCGCCGGATAAAGCCGGGTACGGGGCGTAGCGGGCGGCATGGCAGGCAGATCGTCATAACCGGAAATAACCTTTCCGGAAGGGTCAACGACTTTGTAATAGAGTCGATCATTCATATTAAGCTCGAAGCTATCCAGCACCACCCAGGGCACGTTAACTTCCAGATGCTTATTGCGCACCACCAGCCGTTCCGATACCGTTCGCGCCGAGGAGAGCAACGTACGATCATAAGCCTGAGTGGCGGCCTGTAGCGCATTGACATAGCTGTTAAACGCCGACAGCCCCCATAGCAGAATCAGCGGCAACCCCAGGAACAGCA [...]
+NODE 1783 5836 342203 338043 0 0
+GTTTCGACAACGGTTACAACAACTGGCGGAAACGGACATTGCCGTATGGTTTTACGGTGAGCATGGCACTGGACGTATGACTGGCGCCCGTTATCTCCATCAACTGGGGCGTAACGCGAAAGGGCCGTTTGTACGCTATGAACTCACGCCGGAGAATGCCGGGCAGTTGGAGACATTCATCGACCAGGCGCAAGGAGGTACGCTGGTGTTGAGTCATCCCGAATATCTGACACGCGAACAGCAGCACCATCTGGCGCGTTTACAAAGCCTGGAGCATCGGCCTTTTCGTTTGGTGGGCGTTGGCAGCGCTTCGCTGGTGGAGCAGGCGGCAGCTAACCAGATTGCGGCCGAGCTTTACTACTGTTTCGCCATGACCCAAATCGCCTGCCAGTCTCTTTCTCAGCGACCGGATGATATCGAACCGTTATTTCGCCATTATCTTCGAAAAGCCTGCCTGCGGCTCAATCATCCAGTGCCGGAAATAGCGGGGGA [...]
+GAAGTGAAGAGTCGGTAAAAAGCAGGCTATCACGTTTACGAAAGAAATAACCCTATACCTACCACATTATTCGGATAACCTACCATGGAGTAAATTATGCCAGCGCCTCTATATGGTGCGGACGACCCGCGTCGCTGTTCCGGCAAATCCGTCTCGGAGGTGCTGGATAAATTCAGAAGAAACTACGGCCTGATAATGTCGCTACCGCAGGAAACGAAAGAGGAAAAGGAATTTCGTCACTGTATATGGCTTGCAGAAAAAGAAGAACGCGAGCGAATTTACCAGACATCCATCCGGCCATTCCGCAAAGCCACTTACACCAAATTTATTGAAATAGACCAGCGCCTTCGTGATTACCGTTCGCGTTACGGCGCTATCAGCAATAACTGAGGAATTCATCATGAGAGGTTTGTCCTACGACCCCGGTATCCTGCCATCTGAAATGATTATTCGACACCGCTTCAAGCCCATCAACGATATTCCACGCGAAGA [...]
+NODE 1784 12 2730 2715 0 0
+ACTTCGCAGTGA
+ACACAGAACAAC
+NODE 1785 165 8483 8394 0 0
+GTTGTTGTGCCTAAGGTATGGGCGGTAGGTTCGGATCGGGATTACAGCTTTTTAGTCATGGACTACCTCTCGCCCCGCCCGCTGGATGCTCATAATGCGTTTATTCTTGGACAACAGCTGGCGCGCCTGCACCAATGGAGCGATCAACCTCAATTCGGCCTCGAT
+GTTGTCCAAGAATAAACGCATTATGAGCATCCAGCGGGCGGGGCGAGAGGTAGTCCATGACTAAAAAGCTGTAATCCCGATCCGAACCTACCGCCCATACCTTAGGCACAACAACGGTTTTACTGCGGGAGAGCAGCTCCAGCTGATCGGCTTCAGCGGTAAAAC
+NODE 1786 51 2901 2863 0 0
+ACCACGCGTCTATCATTGACGGCGTGCGTTTGTGTAAAGCGAAGCGCTATC
+TTCAGCGCGTCGGAAATAATAGCGTCTTCCGCGCCCAGCAACGTCTCAAAC
+NODE 1787 153 4759 4527 0 0
+CCGCGGCATGTCCGCCGCCGTCAACCGTTTCTTTCCTGAACCGGTCCCGGTACCGAAGGCGGCACCTGCCGCCGCCGCGCCCGCTGACGACTTTGCCCGCCTCAAGCCGGTGATTGCCGCCGCTATCCACCACCATCGCCGCCTTAACCCTTA
+GAGGCGGGCAAAGTCGTCAGCGGGCGCGGCGGCGGCAGGTGCCGCCTTCGGTACCGGGACCGGTTCAGGAAAGAAACGGTTGACGGCGGCGGACATGCCGCGGATGGCGAAAATCAGCAGGAACAGAAACGCCAGCACGAACCCCATGCCGAG
+NODE 1788 108 4631 4631 0 0
+GTCGAGCTGAGCGGCAATCGGCAGCATGTCGTCAAGGCGCAGGCGGGTGGCGAACAGGGACTGGTGGGCGTCACGCAGGACGACGTCGGTAATGGCAATGGTCATGGA
+CCTGTTCGCCACCCGCCTGCGCCTTGACGACATGCTGCCGATTGCCGCTCAGCTCGACGACGTGGGCTACGGCTCCCTCGAATGCTGGGGCGGCGCCACCTTTGACGC
+NODE 1789 1135 54083 53370 0 0
+CATCGGACGCTTTTACGCTCACTTTGAACTGATCAAAGTTGAGACGATCGAGATGATCGACATGGCGCATGGCTGATTCCAGCAGCGCCTGCGGCGTCGGCTCACCGTATTTTTCCTGCAGATCTTTTTCCAGCGATCCGGCATTTACGCCGATACGAATAGGGATGTTTTTGTCTCGCGCGCAGTCCACCACCATACGAATACGTTCTTCGTTACCGATATTGCCGGGGTTGATACGCAAGCAGTCAACGCCGTATTCCGCCACCTTCAGCGCAATGCGGTAGTCGAAGTGAATATCGGCAACCAGCGGGACGTTAACCTGCTGTTTGATAAGCTTGAACGCTTCGGCGGCGTCCATGGTCGGTACAGAAACACGAACAATATCTGCGCCAACGCGTTCCAGCGCTTTGATCTGTTTAACCGTCGCTTCCACGTCAGTGGTACGCGTGTTAGTCATCGACTGGACGGCGATGGGGGCGCCATCGCCAATCG [...]
+ACACCCGTGACGCGACAAGCCAGGATACGACGCCAGCGCAAACGGCTCCGGCGCCTGCGACGCCGGTTGATTCTACGGCGGCGACGCAAACGCCAGCGCCAACGGCGGCGGCGACGCAAAATACGGTAGTCGCGCCTTCGCAGGCGAATGTCGATACGGCTGCGACATCTGCCGCGCCAGCGGCAACGGAAACGCCGTCCGCGCTGCCGACCAGTCAGGCTGGCGTAGCGGCGCCTGCTGCCGATCCGAACGCGCTGGTGATGAATTTTACCGCTGACTGCTGGCTCGAAGTCACTGACGCCACGGGTAAGAAGCTGTTTAGCGGTATGCAGCGTAAAGATGGTAATTTAAACCTAACCGGTCAGGCGCCTTATAAACTTAAAATTGGCGCGCCGGCCGCGGTGCAGATCCAGTATCAAGGAAAACCTGTCGATCTGAGCCGCTTTATCAGAACTAATCAGGTTGCGCGTCTGACCCTTAATGCCGAACCGA [...]
+NODE 1790 3240 155992 154952 0 0
+TTTTAAAACGTCTGCCGGAAGGCAGCACTTTACCATGGCATCGGGTGGTGAACCGCCACGGCGCAATATCACTTACCGGGCCGGATCTACAGCGGCAACGTCAGGCATTACTGGCGGAAGGCGTGGTGGTGTCGGGAAGCGGACAAATCGATTTACAACGCTATCGCTGGGTGTATTAACCCTCTCCGTAACGGAGAGGGTTGGCGCAGGATTAATACTGGGTAGGCGCAGGAACGGCAGAAGACGGATTGACCTGGGTCGGTGAGGTCGATGGAACCGTCGTCGTCGCACCGCCGCTGGCCTGCACAGGCACCGCCGTTTGCTGTACCGGTACCAGCGTCAGATCCGCTTTAGTGCCGCCATTGTTAATCACCGGTTTCACGCTATCGGTAATAAATACCAGCTTATTGTCAACGGTGATGGCCGCGCTCAGGAGAATACGCGCGTTAGGTTGAATATCTGATGGGTTAAACGGCAACACAAAACTGAAAG [...]
+GGCTAACGATAGCCGCGCCAGCGGTTGCCGATAAAGCGGATAGTGCTTTTATGATGATTTGCACCGCGCTGGTGCTGTTCATGACGATACCGGGTATCGCGCTGTTTTACGGCGGATTAATTCGCGCAAAGAACGTGCTGTCAATGTTAACGCAAGTGACCGTCACCTTTGCGCTGGTCTGTATTTTATGGGTGGTGTACGGCTATTCGCTGGCTTTTGGCGAAGGGAATCATTTCTTCGGTAATGCTGATGGGGCGATGTTGAAGAATATCGCGTTGACGGCGGTAACGGGTACGATTTATCAGTATATTCATGTCGCGTTTCAGGGATCTTTCGCCTGCATTACCGTCGGGCTGATTGTCGGCGCGCTGGCGGAGCGTATTCGTTTTTCGGCGGTACTGATTTTTGTCGTGGTGTGGTTCACGCTCTCTTATATCCCGATTGCGCACATGGTGTGGGGCGGCGGCCTGCTGGCTGCTCACGGCGCGCTGG [...]
+NODE 1791 3917 196251 193726 0 0
+GCTCACGCCACGGCGGGCGGCTTTACGCATTGCGTGGAGCAAGCGATAGCCGGGGAAAAAATAGGCGTTAGCGATAATCACTTCACGCTTTGCCTGGGTCAGCATTTTCAGATAATGACGTTCGATATCGTCGCGGTGCTCTTCATTATCCCGCCAGACAAACAGCGCCTGCGCTTCGCCGGGGTGACGGTTTTCTTCTGCCTGGTGATGGCGCTTCCACCAGCGGCGCGCGGGGCTTTGCCCCGGCAGATTCTCGACTTCGAATTGCAGGATATCGGCCACAACAGGCCCTTCGACCCGTACCGCGTAGTCTTGTTTCGCCTGCGGGCCGTAATCCGACATATGTTCGGCGGAGTAGTTAATGCCGCCGACAAAGGCAATACGATCATCAATCACCACAATTTTGCGGTGCATTCGGCGGAAGATATTAGTTCGCAACCCCAGTAGACGCGGGCGGGGGTCGTAATAGCGAAAAATAACTCCCGCCGAGGT [...]
+GACGTCCAGACGCGCTACTGGTTTAACCCGGCGGCGATCAGTCAGCATTTTATTATTCCCGGGGCGGTGACCATTATCATGACGGTAATTGGCGCAATCCTCACCTCGCTGGTCGTTGCCCGCGAATGGGAGCGCGGCACGATGGAGGCGCTGCTCTCAACCGAAGTGACGCGTGTTGAACTGCTGCTGTGTAAGCTTATTCCCTATTACTTTCTCGGTATGCTGGCGATGCTGCTCTGTATGCTGGTATCGGTGTTTATTCTCGGCGTGCCGTATCGCGGTTCGCTGGTGATTCTGTTTATCATCACCAGTCTGTTTTTACTGAGTACGCTGGGGATGGGGCTGTTGATTTCCACCATTACTCGCAACCAGTTTAACGCCGCGCAGGTGGCGCTGAACGCCGCCTTTTTGCCCTCGATTATGCTGTCCGGATTTATCTTCCAGATAGACAGTATGCCTGCGGTGATCCGCGCGGTGACCTATATTATTCCG [...]
+NODE 1792 3 285 285 0 0
+CGT
+GGT
+NODE 1793 62 2675 2675 0 0
+CTAAACTTGCATTCTCATTGTAATTGGTTGCGGGGGCCGGATTTGAACCGACGACCTTCGGG
+ATGCAAGTTTAGACGGACGCGGGGTGGAGCAGCCTGGTAGCTCGTCGGGCTCATAACCCGAA
+NODE 1794 1437 69726 69266 0 0
+CAGGAGACCGCTACACTACTGCGTTTGCCCAGCTCCGCCATCCATTCACGCAGAGCAGAGATAATAATTTCGCGGGCTATCATCGTCGCCGCAGGTAACGTCACCCACCAGCTATGATAATGCTCGGTGACCAGCACCATGGCGATCGCCACCAGCACCTTGTCGGCGACGGGGTCGAGGAAAGCGCCGAAACGCGTACTCTGGTTCCAGCGTCGCGCCAGAAAGCCGTCAAACCAGTCGGTAATAGCGGCAATACAGAAAATCAGCGCGCTGACCATCGGCGCCCAGGCGAACGGCAAATAAAACACCACGACAAAGAATGGAATCAGGATGACGCGAAACAGCGTGAGCAACGTAGGGATATTAAATTGCATAGTGACGGGTAACTATCTGTTGTCAGTGAAATTACCCCTATGTTGCTACAGTGGCCTCAATGTTTCAACGACCAGAAGATCTTTTCTGCCAGACCTTGCGAAATACCCGGCACTTTTG [...]
+GGCGAAGTGGTGGAAACCTTTGTCGGGCAGTTTTACCTGCAGGGTAGCCAGATGCGCACGCTACCGGGCGAGATACTGCTCGATTTTAATCTGAGTGATAAAGCGCTGCTCGCCGACTCGTTGTCGGAACTTGCCGGACGGCGTATTCATGTCCAGACAAAACCGCGTGGCGATCGCGCCCGTTATCTCAAGCTGGCGCGGACCAACGCGGCAACGGCCTTAATCACTAAACTCTCGCAGCAGTCCACCATCACGCAGCGTTTGACTGCGCTGGCGGCGGTATTAAAACTTCCTGCGATCAAGCGGATGGAGTGTTTTGACATCAGCCATACCATGGGGGAGCAAACGGTCGCATCCTGTGTGGTATTTGACGCTAACGGGCCGTTACGCGCCGAGTATCGTCGTTATAATATCGCGGGCATCACGCCGGGTGATGACTACGCGGCGATGAATCAGGTGCTACGTCGGCGTTATGGCAAGGCCATAGAAGAA [...]
+NODE 1795 33 1112 673 0 0
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT
+NODE 1796 8 12 12 0 0
+GAAAAAAA
+CTTTTTTT
+NODE 1797 51 2742 2300 0 0
+TGGCTCCGCCACTCAAGATGCGGCCCGCATGACGGACAGGCAACGGGCTGG
+AACATGAACGAGCGGAAAAAGAGGCGGCTTTGCAGGCGGCGGTCGCCCAAC
+NODE 1798 53 1858 1807 0 0
+GCGCAGGCGCAGCCACGGGTCCTCGCCGAGGAAACGGATGCAGGCGTCAAAGG
+CGCGAACTCAAAAAAGCCATGCCCAAAACCCCGCTGCAGATGCTGCTGCGCGG
+NODE 1799 37 1283 1283 0 0
+TGGCGCCGCCCCAGCATTCGAGGGAGCCGTAGCCCAC
+CATCCGTTTCCTCGGCGAGGACCCGTGGCTGCGCCTG
+NODE 1800 51 1583 1548 0 0
+TCCCCCGCCGCCAGCCTGTGCGTACCCTCGACCAACCGTTTGACCGGGGCG
+ATTTTACCACGCGCGTGACCCCAACCAGCGCCGATGAGCTGGGAAAACTGG
+NODE 1801 600 38497 37324 0 0
+GCGAGCGAGCCAGCATCGCCAGCCCCCCCATGAAAGTGCCACAAATTCCCAAAATATGAATGCGCATACGTCACTATCCTTTTTTTATCTGCGAGCCATTTTACGCACATGTCTGGCAAGTGAGAAACGCATTTCAGGTAAATCTGTACTTTGCTGGCGCGATTCACCTGAGCGCATCATCTGAAATGTTTGTTAAGATTGTTACGGTCGCTTTACTCCAATCAATTGCAGGGAAAGTGTTATGAAAACGTTAGGTGAATTTATTGTCGAAAAGCAGCACGAGTTCTCTCAGGCTACCGGTGAGCTCACTGCTTTGCTGTCGGCAATAAAATTGGGCGCCAAGATCATCCACCGCGATATCAACAAGGCCGGTCTGGTCGATATCCTGGGTGCCAGCGGTGCTGAGAACGTACAGGGCGAGGTTCAGCAGAAACTCGATCTGTTCGCGAACGAGAAACTGAAAGCTGCACTAAAAGCGCGCGATATTGTAGC [...]
+CGCGTGTTCGCAGCCTTCAAAGACGACGATTTCGTCCTCTTCTTCCGATGCGATGCCCGCTACAATATCGCGCGCTTTTAGTGCAGCTTTCAGTTTCTCGTTCGCGAACAGATCGAGTTTCTGCTGAACCTCGCCCTGTACGTTCTCAGCACCGCTGGCACCCAGGATATCGACCAGACCGGCCTTGTTGATATCGCGGTGGATGATCTTGGCGCCCAATTTTATTGCCGACAGCAAAGCAGTGAGCTCACCGGTAGCCTGAGAGAACTCGTGCTGCTTTTCGACAATAAATTCACCTAACGTTTTCATAACACTTTCCCTGCAATTGATTGGAGTAAAGCGACCGTAACAATCTTAACAAACATTTCAGATGATGCGCTCAGGTGAATCGCGCCAGCAAAGTACAGATTTACCTGAAATGCGTTTCTCACTTGCCAGACATGTGCGTAAAATGGCTCGCAGATAAAAAAAGGATAGTGACGTATGCGCATT [...]
+NODE 1802 519 26677 26526 0 0
+CGACATCAAAGTAGCCTTTATGCTGCTGATAATGGGCAACCTGTTCTTCATCGCGCGGATCCATCACCGCTGTGGCCCCCATCTGGCGTGCCAGTTCCAGACAGCGTGGGCTGAGATCGGATGCTACCAGTTCAGATGCTCCGGCACTGCGTGCCGCCGCGAGGATCAGACAACCAATGGGGCCTGCGCCAATCACCAGTACGCGTTTGCCGGTCAACTGGCCTGCCTTTTTTACTGCATGAATGGCGACCGCTAGCGGTTCCGAAAAGGCCATCACGTTTGCGGGCACGCGCCTGTCGTAAGGAATGCATTGCTCCGGTTTTACCACCACGTATTCAGAAAAACCGCCATTCACATGCGGATTGAACTGCGCGCTGCCCATAAAGCGCATGGAGCCGCACAGATTTTGATGGCCGGAAAGGCACATCTCGCACTGATTGCAGGGGCTGGACGGGTTCACCGCAACCGTCTGGCCCACTTTCAGGTCGCTGC [...]
+ACGGTTGCGGTGAACCCGTCCAGCCCCTGCAATCAGTGCGAGATGTGCCTTTCCGGCCATCAAAATCTGTGCGGCTCCATGCGCTTTATGGGCAGCGCGCAGTTCAATCCGCATGTGAATGGCGGTTTTTCTGAATACGTGGTGGTAAAACCGGAGCAATGCATTCCTTACGACAGGCGCGTGCCCGCAAACGTGATGGCCTTTTCGGAACCGCTAGCGGTCGCCATTCATGCAGTAAAAAAGGCAGGCCAGTTGACCGGCAAACGCGTACTGGTGATTGGCGCAGGCCCCATTGGTTGTCTGATCCTCGCGGCGGCACGCAGTGCCGGAGCATCTGAACTGGTAGCATCCGATCTCAGCCCACGCTGTCTGGAACTGGCACGCCAGATGGGGGCCACAGCGGTGATGGATCCGCGCGATGAAGAACAGGTTGCCCATTATCAGCAGCATAAAGGCTACTTTGATGTCGTGTTTGAGGCCTCCGGCGCGCCG [...]
+NODE 1803 3034 200220 198605 0 0
+CGCTGATGGTGGCAATGCTGTCGGCTCTGAACCATTTCCCGGTTAACGCGTCCGTCATACTTATCACCAGTGCGCTATTTATCGTCATTTATCTACCGCTGAGTTTTATCCTTTACCGCTCACAACGGTAATTCGTATCGGTTCCAGAAGCTGACGCTTCCCCTTATACTGGCGCTATCACTCAATAGCGAGATAAAACAATGAACGACAGTGAATTTCATCGCCTGGCTGACGCCCTGTGGCTCACCATTGAAGAACGCCTCGATAACTGGGACGGCGACAGCGATATCGACTGCGAAATCAACGGCGGCGTGCTGACCCTCAGCTTTGAGAACGGCAGTAAGATCATTATTAACCGTCAGGAGCCGTTGCACCAGGTATGGCTGGCGACCAAACAGGGCGGCTATCACTTTGACCTGAAAGGTGACGAGTGGATTTGCGATCGCAGCGGCGAAACCTTCTGGGAGCTGCTGGAGCAGGCGGCGACGCAGC [...]
+ACTTCCGTAAGCTGGACGTTTTCAGCTTTGGCGAAGAGCAAAACTGTCTGATAGGCAGTATCGACTTGTTATATCGCAACTCGTGGAACGAAGTGCGTACTCTGCACTTTAACGGCGAGCAGGCGATGATCGAAGCGCTGAAAACGATTCTGGGGAAAATGCACCAGGATGCCGCGCCGCCGGATAGCGTCGAAGTGTTCTGCTACAGTCAGCATCTTCGCGGTCTGATTCGCACCCGCGTGCAGCAACTGGTCTCCGAATGTATCGAGCTACGTCTTTCCAGCACCCGTCAGGAGACCGGTCGCTTCAAGGCGCTGCGGGTTTCCGGGCAGACGTGGGGGCTATTCTTCGAACGCTTGAATGTCTCGGTGCAGAAGCTGGAGAACGCTATCGAATTCTACGGCGCGATTTCGCATAACAAGCTGCACGGGCTGTCGGTACAGGTGGAAACCAACCAGGTGAAATTGCCGTCAGTGGTGGATGGCTTCGCCA [...]
+NODE 1804 376 20353 19965 0 0
+TCCTGCTGCGGCAACATTAAGCTGTTAAGAAGGGGCGAGTCTTTTCCGCCCCTATCGCAAAGACTTCGCTGGCCGCCATCTGCCAGTAGCCAGGGTTAAACAGTTCCAGCGAACAGATCCCCTCATAGCCCTTCTGCACTAGCTCATGCGTGATCTCATGCAGTGGGATCACGCCGTTGCCAGGAAACAGACGATGGCAATGCTCCAGCGTTGCCAGCGGCAGATTATCGGCGTCATCAATATGGTAAACGAAGATCTTTTCCACAGGGATCTGGCGAAGCGTGGTCAGATCCCGCCATTGATCGTGCAGGTAAAGGTTAAAGGCATCGACGACCAGCCCGACATTACTGCGATCGACCGCATCTACGATCTCCAT
+TGCCTTTAACCTTTACCTGCACGATCAATGGCGGGATCTGACCACGCTTCGCCAGATCCCTGTGGAAAAGATCTTCGTTTACCATATTGATGACGCCGATAATCTGCCGCTGGCAACGCTGGAGCATTGCCATCGTCTGTTTCCTGGCAACGGCGTGATCCCACTGCATGAGATCACGCATGAGCTAGTGCAGAAGGGCTATGAGGGGATCTGTTCGCTGGAACTGTTTAACCCTGGCTACTGGCAGATGGCGGCCAGCGAAGTCTTTGCGATAGGGGCGGAAAAGACTCGCCCCTTCTTAACAGCTTAATGTTGCCGCAGCAGGAGATGGACAACCGCCGCGCCCAGCAGCGCGCAGGCCGCGGCCAGAAGAAAG
+NODE 1805 6 758 758 0 0
+CCCCAG
+TATATA
+NODE 1806 7 569 569 0 0
+TCACATA
+TGAAGGG
+NODE 1807 30 2150 2150 0 0
+GTTATCTATGCTCCTGGGGACTCACTCCCT
+GCGTAGCCAACACATAAGCAACTTGAAGTA
+NODE 1808 900 40733 38434 0 0
+CCGTCAGCAGTATGCGTTTCCGACGGGACATGGCATTTTCCATTTATCCTGCCCCCGCTAACTTAACGCCGGGCTTATCAGCCCTGCCAGCATGGCTGCCAGTCCCACAAGAACCAGCAGATAAACCGTGACCAGTACACGTACAGATATTTTCATTACGATCCCTGCTCAGAAATAGTTCACTACCGGCGTCAGGTTGCCCTGCCAGCGCGTCACGGGCTCCTCCGCACCGGGAAAACGAACCCGGATACCCTCCAGGGATGTCACCCGGGCCCCGGCAATTTGATTTTTTGTGCCGTTATCCGGCAGGAAACTGCCGGGCATTACCGTAAAGGCGTCCGGCCGGGTCTTCAGACCCGAGTAAGACGGGTTCCACCGGTAATCTCTTACCTGCCACAGCAGGCGTTTTATCTCCTGTGCCGCATCCGGCGTGACGTTGCCGCTGACCACGCTCCAGCCCTTCTCTGCGGTGGTACTGTCCTGCCAGGCCAG [...]
+ATCCGCATCCGTGAGCAGCCAGCCGCTGACAGTCGTACAGGCCCACTGGCAGGAAGGCATGGCCGTGGGCGTGACTGAACTCAGCGGCACACTGTATATCCGGGATACGGCCTGGCAGTGGCAGCCCGTCCCGCTGGAGATGAGCCGGCAGGAGGGCATGGTGAGTGAAAGCCGTCCGGGGAGACGTTATTACATTCTTAAAGGGTATACCACGACCCTGACATCAGCCCGTCCCGGGCTGCAGCCGTCGGTAAGCCTGCTGCATGCCGGACATGGCGTCGTCCGCCTTGAGGCCCGGGGCAAACTGGCGAAGGGGCAGGTGCGGTATGGCGAAATTACCTTTACTGCCAGCCATGTACTGGCCTGGCAGGACAGTACCACCGCAGAGAAGGGCTGGAGCGTGGTCAGCGGCAACGTCACGCCGGATGCGGCACAGGAGATAAAACGCCTGCTGTGGCAGGTAAGAGATTACCGGTGGAACCCGTCTTACTC [...]
+NODE 1809 30 13097 12944 0 0
+AACGCATCGCTGCGCTTACACACCCGGCCT
+ACCGTGAGGCTTAACCTTACAACGCCGAAG
+NODE 1810 164 8172 8172 0 0
+AATTTTGGGCGGCGTTCGCGGTATGGAACGCAAGGTGCATCCCAATGATGACGTCAATAAGAGTCAAAGCTCAAACGATGTGTTCCCAACCGCCATGCACGTGGCGGCGTTACTGGCGTTACGCGAACACCTCATCCCGCAATTATCTGCATTAACGGATACGC
+AGTAACGCCGCCACGTGCATGGCGGTTGGGAACACATCGTTTGAGCTTTGACTCTTATTGACGTCATCATTGGGATGCACCTTGCGTTCCATACCGCGAACGCCGCCCAAAATTTCACTGGCGCGGTTCGCTAACACCTCATTCATATTCATGTTGCTTTGCGT
+NODE 1811 1 133 133 0 0
+A
+C
+NODE 1812 1 80 80 0 0
+C
+C
+NODE 1813 1246 56243 56074 0 0
+ATGAGGTGGAGTCGGAGCTGGGTACGCAGCCGGGCCTGGGGCTGCTTAATACAATCACTCGCTTTGCACAGGATAAAACCACGACGCAGGTTAACGCGACAATGTCAGGCGAGCTGCCCGGCTGGCTGGCTGCCGCGGCGGGGCTACCGGTACGCGGTTATGAAATTCACATGGGGGAAACGGTGCTACAGGAAGGATGCTGTACGGCCATGACGTTACAGAAAAATGGATGCTCTGTGGCGGATGGCGCGGTCACCGCCGATGGACTGGCGTTTGGCACTTACCTTCACGGCCTGTTTGACAGCGATGCGTTTACCCGTGCGGTGGTCAATGGGTTACGGGCGCGAAAAGGACTTACGCCGTGGGAAACGACTTTTTGTTATGCGGAGCATAAAGCGCGGCAATTTGATCTGCTGGCGGAAGCGATGCGGCAACATATTGATATTGATAAAATTTATACCATCATGCAACAACATCAGGAGCCGGTATGAT [...]
+TGCAGGAGGATGAAAATCAGGCCGCTTACGCCCCCCAGAATCAACCCGATAAAGGGAAACATCACGATCCCACGCGAATACTGCTCGAAATCCAGTCCCTGCGACCAGCGTGACGGCACGGGCAAGCGGCTAATAAAAGCGAGCATGGCCCAAAACAGCTTACTCATTTAATTTTGACTCCAATACCTGAGACTACCAGCCAGACCTCATCCGCCGCTGCCGCCAGTCGTTGGTTGACCCGACCGGCAATATCACGAAAATGGCGCGCCAGACGGTTTTCCGGGACGATCCCCATTCCCACCTCATTTGTCACCAGTACCACTTTCGCCGGGCAGCGCTGGCAGGCTGCAATTAAAATCTGAATTTCATCGTCAATGGCGCGCTCCATCGCCGCGTAATCCCACTGTTCGGGATCGTTCTCGCCTCCCAGCGCAAACAGCAGATTCGTCACCATGGTGGTAATACATTCCAGCAAAATCGCGTCGTCAGGGG [...]
+NODE 1814 138 11731 11511 0 0
+CCAGCTTGCGGGAAACGCCATTGACGACGTCCTCACCGTGGCGCTGTTCCCGCAGATTGGTCTCAAATTCCTTGAGAACCGCCACAACCCGGCGGCGTTTGAGCCACTGCCGCAGGCGGAAGCCGCGCAGCCGGTGGC
+GTTGTGGCGGTTCTCAAGGAATTTGAGACCAATCTGCGGGAACAGCGCCACGGTGAGGACGTCGTCAATGGCGTTTCCCGCAAGCTGGATGCCCTTCTCCTGCGCCTGGCGCCTGACGTCCGCTTCCAGTTCAGCCAG
+NODE 1815 15 661 646 0 0
+GAGTAACCGACCAGG
+GTCAAATCGGCTATC
+NODE 1816 20 1024 999 0 0
+GTGATTAGTGTAATGGTTGC
+CGTCGGCGCAGGCGGCCTCG
+NODE 1817 2109 123997 123664 0 0
+CATATAAGAAGCCGCCATATCGATATGCAGGAAATCACGCGCCGAGATAAGCATTCCTGGATGCGGCTTGCGGCAATCACATACCTGACGGAACTCTTCTATGCTGCCCTGCGGATGGTGAGGACAATAATAGATGCCGTCCAAATCAACATCGCGATCCGCCAACGACCAGTCCATCCATTCGGTTAACGTTTCAAACTGCGCCTCAGTGAATTTGCCGCGCGCGATTCCGGACTGGTTCGTCACCACCACCAGCGCATAGCCCATTTTTTTTAGCTCGCGCATAGCGTCAATAACGCCGTCTATAAACTCAAATGCATCGATTTCATGTACGTAGCCGTGATCCACATTAATGGTGCCGTCACGGTCGAGAAAAATTGCGGGTACAGACTTTGCCACCTTTTATAGCTCCTGAGTAAAGCAAGTGGCGCTAGTATCGCATGTTTCAGCAGGCAAGAAAGTGCTCATCGTATAAAGCCTGATTGATTTAGA [...]
+CGCATTCACCAGACCAGGCAGCGCTTCCGGTAAAAGGATTTTACGTACAATTTGCAGCGGCGTGGCGCCCATCGCTCGCGAGGCTTCAATCAGCCCGGCAGGGATCTCTAATAACGCATTTTCCACCATACGGGCGATAAAAGGCGCGGCGCCGACGGTCAGCGGTACAATCGCGGCCTGCAAACCAATGGAGGTGCCGACAATTATTCGGGTAAAAGGAATCATCCACACCAGCAGGATGATAAAGGGAATCGAGCGGAAAATATTGACCACCGCAGAGAGGGAGCGATACAGCCTGGCGTTCTCCATAATCTGCCCCGGGCGCGTAACATACAGCAATACGCCAACCGGCAGGCCAATCACGAAACCGAAGAAACCGGAGACAAAGGTCATCGCCAGCGTTTCCCAAACGCCACGAACCAGTAACCACATCATTGCCTCAGACATAACCCAGTACCTCTACTTTCACATGGTGATCCTGCAGCCAGGCAA [...]
+NODE 1818 46 2445 2445 0 0
+AGACGATTAATAAAATAGCGAACAGAAAGGCGGGGATCGCATAACC
+TGCCGGCGGCAGCTACTACGATATCTTTCCGCTACGTGGCCTGGTC
+NODE 1819 33 1133 952 0 0
+ACTTGAACCCCCACGTCCGTAAGGACACTAACA
+TTATCTTATCCTTCCTTTGTCTCTTCATTTTCA
+NODE 1820 1 83 73 0 0
+C
+A
+NODE 1821 125 3542 3542 0 0
+CGGTTGGGCGCACTACGTCGGCCAGGAAAAACTGCGTCCGCAGACCGGCTGGCAGCCGCTGGCGTTTGCCCTTGACTGGCAGCGTCCGGCGCGTCACATGAATAGCACCTCTTACTTCTATAACC
+TCAAGGGCAAACGCCAGCGGCTGCCAGCCGGTCTGCGGACGCAGTTTTTCCTGGCCGACGTAGTGCGCCCAACCGCCACCGCTCTGACCAACGCAACCACAGAACACCAACATATTAATCAGCCC
+NODE 1822 9 207 207 0 0
+ACTCCAGCC
+CGCTGCCAG
+NODE 1823 37 37 37 0 0
+CCAGGTTCTGCCATATTTTTGGGGCGCGTTTGACGTG
+ATAGAAGTAAGAGGTGCTATTCATGTGACGCGCCGGA
+NODE 1824 51 339 339 0 0
+GTTCATAGTGGCCGGAGATAAACGCCAGCGCTTCCGGCTCCCAGCACCAGT
+CCCGGCGAGCCGTTGCCGAAGGAACTGCTGGATAAAATGCTGGCGGCGAAA
+NODE 1825 390 20742 20673 0 0
+CTACGCCGACGACGTGGTGGAGCGCTTCGTCGAACGCGCGGTGAAAAACGGTATGGACGTGTTCCGCGTCTTCGACGCCATGAACGACCCGCGCAATATGAAAGCCGCACTGCAGGCGGTGCGCAGCCATGGCGCCCACGCCCAGGGCACACTCTCGTACACCACCAGCCCGGCCCACACCCTGCAGACCTGGCTGGATTTAACAGAGCAACTGCTGGAAACCGGCGTTGACTCGATTGCCATCAAGGACATGTCCGGCATTCTCACCCCGATGGCCGCTTTTGAGCTGGTGAGCGAAATCAAAAAACGCTATGACGTGCGCCTGCACCTGCACTGTCATGCCACCACCGGGATGGCGGAGATGGCCCTGCTGAAGGCTATCGAGGCGGG
+ATGACAGTGCAGGTGCAGGCGCACGTCATAGCGTTTTTTGATTTCGCTCACCAGCTCAAAAGCGGCCATCGGGGTGAGAATGCCGGACATGTCCTTGATGGCAATCGAGTCAACGCCGGTTTCCAGCAGTTGCTCTGTTAAATCCAGCCAGGTCTGCAGGGTGTGGGCCGGGCTGGTGGTGTACGAGAGTGTGCCCTGGGCGTGGGCGCCATGGCTGCGCACCGCCTGCAGTGCGGCTTTCATATTGCGCGGGTCGTTCATGGCGTCGAAGACGCGGAACACGTCCATACCGTTTTTCACCGCGCGTTCGACGAAGCGCTCCACCACGTCGTCGGCGTAGTGGCGGTAGCCGAGCAGGTTCTGGCCGCGCAGCAGCATCTGCAGCGGGGT
+NODE 1826 4633 256198 253050 0 0
+GGCCATCTTTCATCAGGTTGATGAAGCCCACTTTCTTCGCATGGCGCAGGATTTTTTTACGCATGGGCACCGGAGCGGAGCCATCCACGGTGAACAGGTCGCGCGCGATATTGACCGCCATTTCGGGATAGGCGGTAAACATGCGGGGATTATCAAGAAAAGCTGGCAGTTTCTGATACATACGCATATCGCGCATCGGACCTTCGTCCAGATGCTGACGGTATTCCCCCAGCGACTGCTTGCTAAAATCGTCGCGCTTCATCGCCGAAAGCACCGTCTTCGCCGCCGCTTCGCCTGCGGATATGGCGAGATCCATACCCCGGATGGTAAAGCCGAGGTTCATACACATGCCGGCAGCATCCCCGGCAATCAGTACGCCATCGCCCACCAGTTCAGGCTGCATATTCATTCCCGCCTCGGGTACAACGTGCGCGGCATATTCCACCAGCTTGCCACCGGCGATCAGCGGCGCAACGGCCGGATGCTGTTTGA [...]
+ACCCATCACCATCCCGAAGCACAGTTCACGTACGGTACGACCACGGGAAATACGGGCCAGGAAGATACTCATCTGGATGGCGTAAATAACCCACCACGCCCAGTAGAAAACGGTCCAGCCCTGTGGGAAGCCGCCTTTACCGATGGCGTCGGTATAGAACAGCATCCGTGGCAGGTGCATTAACAGCATCCCGACGGAGTCGGTGAAGTAGTTCATGATGAAGCTGGCGCCGCTGACGATAAACACCCAGCCGAGCATCAGGAAGCTCAGGTAACTACGCACATCGCTGGCGATTCTGACCCCTTTTTGCAGGCCGCAGGCCACGCAAATCGCGTTCAGAATGATCCAGCAGGTAATGATGATGGCGTCGAGTTGCAGCGTATGCGGAATACCGAACAGCCATTGCATACACTCGGTGACCAGCGGGGTAGCCAGACCGAGGCTGGTACCCATCGCGAAGATCAGCGCCACCAGGTAGAAGTTATCGACGAT [...]
+NODE 1827 28 1939 1939 0 0
+TGCCGCCAGCCTTACGCATAACCAGAAT
+CACTTTCACAGATCTGATTATTGCAATG
+NODE 1828 13 1610 1610 0 0
+GGCCTGCGGAATG
+AGTACCTCAAGTA
+NODE 1829 145 7741 7636 0 0
+GTAGCGGTCTCGGTTCCGGTAAGGTCTCCGTCACTAATCTTTCATTTGAACATTACATCGATCGCGCCAGCCGAACCTGTTCAAATACTGCTCTTCCGGTAAGCACATTCCGCAGGCCATTCTGGTTATGCGTAAGGCTGGCGGC
+AAGAGCAGTATTTGAACAGGTTCGGCTGGCGCGATCGATGTAATGTTCAAATGAAAGATTAGTGACGGAGACCTTACCGGAACCGAGACCGCTACCGGCGTGCATGGTGGATTCCTGATGAATATTCCAGCGCCAGCTCAGTACT
+NODE 1830 2827 190896 188407 0 0
+GTGGCGGACGCTGGCGCCGGAGGCATTCATATTTGCTGACTAAATAAATTCTTAATTCTCCGCCGGATGCTGGCTGATTGTGGAGCTTAGGGTGAGCGAGTATGGGCGCGACATCCTGGCACCGCGCCTCCCTCTCCCCGGCCAGTACCGGGCGGTGATGAGCAACCGGCTACCGGGGCCGTATTTTGACGATGAAACGGGCCTGCATTAAAATCTGTTCAGATATTATGCACCGGAGTGTGGCAGGTTCGTCAGTCAGGGCCCGACAGGGCTGTAAGGAGGATTAAATCCTTACCACTATCCGTTGAATCCCGTCACAGATACAGATCCGCTGGGATTGTTTACATGTGAATTATGTAGTCGCATGATAGATGAGACTAATAATAGTCTGGATAGTCTTCCATTTAATCCGGCAAAAATGTTAACGGCTAGTTTAAATATGGCTAATTCTGCAAGATTGCACGCAAGTGGGGTAGCCAAACTCGGGATAGG [...]
+ATCACGCCGCAGCATACCCGCGGACTCTTTGGCTGTATTGAAGGGATGGGCGTGATCCGCATTAATAAACGGAATGCAGAACAGTGGTTAAAAACATTTCTGGGGGCGCTGAACAATACCGGAGATATTCCGGTGATTAAACGCAAAAGAACGGAACAGGAGTTAATGAGTAATTGATAATAAAAAGCCGGGAAAAGATAACCCCTCCGGCTTTTACACATTATTCATCCGGTTCCAGATGTTTTATTTCAATCCTTTTGGTTTTATTTCTGGATGCTTTTCATATAATGGATTCATTATTTTAATAAGCATTTCACCCATGATAAAACCAACCGCTTCTCGATATACCTTAAATTCATCCTCATCACAACGGGACTGAACAACAGCAACAGATTCATCAAGTTCCTTACCGAATCTCAACATTAAATCACTAATTAATATAGCTGTATCCTTATCGTTAACCATACTTATTCCTGTAGTAAAAACATCAAT [...]
+NODE 1831 42 2766 2766 0 0
+TACGATCCGCCTCGCATCGTGAGGACTATCCTTCAATCGGAT
+GATCCATCACACTTTTTATGAAAATTCTGTAACCGCTTCCAC
+NODE 1832 51 3755 3737 0 0
+CCTGTGACGTCGCCAGGAAATGGCCGTTATCCATTCTGACAAAATTATAAG
+GGAATAAACCATTGTCTGAATATGTATGAATTTGACATTATGGGACGGGTT
+NODE 1833 44 2812 2686 0 0
+ACGCGAGCCGGAAGATCAGTTTGGCCTGATGCTATTAGCCTGTA
+TCAGTGAATACCATTCCCTGCGACTGTAAAAAAGCTCGATAATC
+NODE 1834 11 448 448 0 0
+TACCGGCGACG
+TTGATAAGGGT
+NODE 1835 1 86 85 0 0
+C
+T
+NODE 1836 325 13663 13446 0 0
+GACGCCACGCTGGAGCTGAACACCGGCGGCAAGTTCGATAACGCCATCAGCGGCAGCGGCAACGTAGTAAAATCTGGCGCAGACACGCTCACCCTCTCCGGCAGCAATACTTATACCGGCGGCACCACCATCAACGACGGCACGCTGGTTGCCACTAGCGTTGATGCGCTGGGCACCGGTGACGTCACCGACGACGCCACGCTGGAACTGAACACTGGCGGCGATTTTGACAACGCCATCAGCGGTAGCGGCCAGGTAGTGAAATCCGGCGACGACACGCTCACGCTTTCCGGCAGCAATACTTATACCGGCGGCACCCTTATCA
+TCGTCGCCGGATTTCACTACCTGGCCGCTACCGCTGATGGCGTTGTCAAAATCGCCGCCAGTGTTCAGTTCCAGCGTGGCGTCGTCGGTGACGTCACCGGTGCCCAGCGCATCAACGCTAGTGGCAACCAGCGTGCCGTCGTTGATGGTGGTGCCGCCGGTATAAGTATTGCTGCCGGAGAGGGTGAGCGTGTCTGCGCCAGATTTTACTACGTTGCCGCTGCCGCTGATGGCGTTATCGAACTTGCCGCCGGTGTTCAGCTCCAGCGTGGCGTCGTCGGTGACGTCGCCGGTACCCAGCGCCTCAACGTTGCTGGCGACCAGCG
+NODE 1837 37 18628 18271 0 0
+TGTGGGGTCTCCCCATGCGAGAGTAGGGAACTGCCAG
+TACGGCGTTTCACTTCTGAGTTCGGCATGGGGTCAGG
+NODE 1838 9 623 623 0 0
+ACATCAAAT
+CATCGGCGC
+NODE 1839 2 137 137 0 0
+AA
+AC
+NODE 1840 348 23162 23162 0 0
+ACGCAGCACCAGTACGGCGCCACACTCAGGACACAGTTGCCCCTCCAGAATTTTAACGATATGCCCGTCCGCCTGACTTTTCAGCGGACGAACATAATCGCATTCCGGATAGCGAGAACAGCCGAGAAACGGACCATGTTTCCCGGAACGAATTACCAGTTCGGCCCCGCACTGCGGGCAGGGCTCATTTTTACGCACCGAAAACAGTGCTGATTTAGCCATATTCACTCATGCAGCATTAACACCTATCAATGCAGCATACCTTCATTTACCTCAAAGAGTAATTCTTCCATTTGCTGATAGGCGTTTTCACAGCCCGGAATGTTGAATAACACCATCAAAATAACC
+AGCAAATGGAAGAATTACTCTTTGAGGTAAATGAAGGTATGCTGCATTGATAGGTGTTAATGCTGCATGAGTGAATATGGCTAAATCAGCACTGTTTTCGGTGCGTAAAAATGAGCCCTGCCCGCAGTGCGGGGCCGAACTGGTAATTCGTTCCGGGAAACATGGTCCGTTTCTCGGCTGTTCTCGCTATCCGGAATGCGATTATGTTCGTCCGCTGAAAAGTCAGGCGGACGGGCATATCGTTAAAATTCTGGAGGGGCAACTGTGTCCTGAGTGTGGCGCCGTACTGGTGCTGCGTCAGGGGCGCTTTGGCATGTTCATCGGATGCAGTCAGTATCCGCAATGTGA
+NODE 1841 51 3978 1692 0 0
+CATTTCAAGTCTTCCAGGTCAAACTCTGCGGTATCCAGCGCCAGCACACGC
+GGGTTATTTTGATGGTGTTATTCAACATTCCGGGCTGTGAAAACGCCTATC
+NODE 1842 45 5963 5849 0 0
+ACTTTCTGAAGCAGTATCCACACACTATCCCAGCCACAAGGGGGT
+AAAATCCATCTGGTAAAGTTCCATCAGATAAGTCAGCACGATATT
+NODE 1843 78 5918 4728 0 0
+GATTATGACGATAGCAGAGCAACTGGAAGAGAAAGGTCTGGAGAAAGGTCGTGCTGAAGAGCGCTCCAGATTAGTGCT
+TTCCAGTTGCTCTGCTATCGTCATAATCACCCCCTTGTGGCTGGGATAGTGTGTGGATACTGCTTCAGAAAGTTCAGC
+NODE 1844 42 3187 3187 0 0
+TAAGTTATTCACTTTCCGAATCAGGCGTGATGACTTTGACGG
+AGACGGCAATTTTATTGAACATGGTGGGATCGGACTGGTTTC
+NODE 1845 9 674 674 0 0
+ACTCAAAAA
+AACCATTCC
+NODE 1846 1 332 227 0 0
+A
+T
+NODE 1847 51 3563 3563 0 0
+ACCCGCGCCGCACTTGGCGTCAATGCGCCGCCTATCACTATAGAGGTGCAT
+TATGAACAATCGCCAGTGACATAATCCCTCCTGTTACGTGGATTATGCGGA
+NODE 1848 12 600 600 0 0
+ACCTTGGCAAGG
+CTTATCTACAGT
+NODE 1849 2 104 104 0 0
+TC
+TT
+NODE 1850 1 169 169 0 0
+G
+A
+NODE 1851 26 6749 6749 0 0
+TGCTCTACCAACTGAGCTATTCCCGC
+GAGTTCGAGTCTCGTTTCCCGCTCCA
+NODE 1852 12 870 858 0 0
+ACCTTGCCAAGG
+CTGTGCTTAACA
+NODE 1853 1 71 70 0 0
+T
+T
+NODE 1854 9 1265 1261 0 0
+CGGGGTCGC
+TTGGGTGCG
+NODE 1855 6 308 308 0 0
+CGGTGA
+GACACA
+NODE 1856 21 1093 1073 0 0
+CGGTGGACACGCAAATCGCCA
+TTCCCCGCTTTATCTTCGACT
+NODE 1857 2 112 110 0 0
+TT
+TG
+NODE 1858 765 51981 51846 0 0
+AAACTAAAATCTGGCTCCTCTGACTGGATGCGATTCTTTTAGTATTTCATTGAAATAAAATGATTTTTATCAGAGGATTAAAAATAGGGCCCTTGAAAAGGCCCCCTAATGATATGATTGGCTTAAATCGCGATGTAAATCACGTTTTTCAGCAATTAAAGGACAAAAACCTACATTAGCCTTTAGCAGGCTGGTTAATTAGCTCAAGATTCACCACTATAAAAATGTAGAGCAGGGCCGGATAGTCTTGAGCTTTGACAGTTTTAGTCCTTTTTTACAGTGCTGTCAGGTCAAGTGCAATTATCCATCTTTACGCATTTTCCTGTAACTTACATCAAATATATAATTAGATTGAGGAGAGAGCCTCTCACGTTCTTGTTTGATGAGTATTACTTGAGGAGTAATGGAACAATGGGGGCTATTAAAAGAATAAACCCGGTACCTGCGACTACACCAAATGACACTCGGAAGCACCTTCCATAAGTCCATGTC [...]
+TTTGTTTGCAGCAAGGCGGTAAATACAGTTATCTGGCATCGGCACTGGGATTATTTATAGTTTTTATTTCATTTATTTTTTATAAATTAGATGAGCGAGTTTCTTTGCTGATAAAAAAATCTGAAGTAGCTCTAAAAATATTAGAGGAAGAATTTAATGAACCAACAGCAATGATCTTTAAAAATGAAAGCATCGATAATTCTCTGAATAAATCTATACTTTCGACATGGACTTATGGAAGGTGCTTCCGAGTGTCATTTGGTGTAGTCGCAGGTACCGGGTTTATTCTTTTAATAGCCCCCATTGTTCCATTACTCCTCAAGTAATACTCATCAAACAAGAACGTGAGAGGCTCTCTCCTCAATCTAATTATATATTTGATGTAAGTTACAGGAAAATGCGTAAAGATGGATAATTGCACTTGACCTGACAGCACTGTAAAAAAGGACTAAAACTGTCAAAGCTCAAGACTATCCGGCCCTGCTCTACATT [...]
+NODE 1859 6 362 352 0 0
+AAACTG
+TTTTAC
+NODE 1860 7 423 411 0 0
+ACCGATA
+TTTTTGC
+NODE 1861 51 2686 2662 0 0
+CCAAGCTCTTTTTCAAGCTGCCGAATATTAAAACTCACTACCGCTTTTGTT
+GCGTAACGTTACTGCTACGTTCCACCCGACGATTGACGCTCACAGACGCTG
+NODE 1862 108 4925 4816 0 0
+AGGCGGCGACTGGCAGGAGGATAACGGCGTCTGGCACCAGAACGTGTTTGCCTATTACCTCTCCATTTCGTGCAACCACTGCGAAGACCCGGCCTGTACCAAAGTCTG
+GTAATAGGCAAACACGTTCTGGTGCCAGACGCCGTTATCCTCCTGCCAGTCGCCGCCTGCATACTCATAAATGCGGCGGAAGCTGACATCCGGGGTCAAATCTTTGTA
+NODE 1863 734 43622 43431 0 0
+TAACGTCTCTGTCGGTACGATTTTCTCGATTTATCGCCGCGTGACGCCCGTCGGCACGCCGGTCACCGAAGAAGATTTCCTGCAACCCGGCAACAAACAGGTCGCTGCGGGATATGTCGTGTATGGCTCGTCCACCATGCTGGTTTACACCACCGGCTGCGGCGTACACGCTTTCACCTACGATCCGTCGTTGGGCGTGTTCTGTCTGTGCCAGGAACGTATGCGTTTCCCGGAAAAGGGTAAAACCTACTCCATTAACGAAGGCAACTACATTAAATTCCCGAATGGCGTGAAGAAGTACATCAAATTCTGCCAGGAAGAGGATAGTTCAACAAGTCGCCCTTATACCTCACGTTACATTGGCTCTCTGGTGGCCGATTTCCACCGCAACCTGCTGAAAGGCGGCATCTATCTCTACCCCAGCACCGCCAGCCATCCGCAGGGGAAACTGCGTCTGCTGTATGAGTGCAATCCGATGGCGTTCCTCGCGGA [...]
+TGCCCAATGGCGGCTTCATGCGTTATTCCGCATGGTGGTAAAGATTACGCGTCCGGGTATTCGCGGATAAAGCGTTCCACATCGTCAACCATATGGCGGTTGCCGACGAAGAACGAGCGGCGCTGGTGCAGGCTTTCCGGAATGATATCCAGAATACGTTCTTTACCATCGCTTGCTTTGCCGCCGGCCTGTTCCGCGAGGAACGCCATCGGATTGCACTCATACAGCAGACGCAGTTTCCCCTGCGGATGGCTGGCGGTGCTGGGGTAGAGATAGATGCCGCCTTTCAGCAGGTTGCGGTGGAAATCGGCCACCAGAGAGCCAATGTAACGTGAGGTATAAGGGCGACTTGTTGAACTATCCTCTTCCTGGCAGAATTTGATGTACTTCTTCACGCCATTCGGGAATTTAATGTAGTTGCCTTCGTTAATGGAGTAGGTTTTACCCTTTTCCGGGAAACGCATACGTTCCTGGCACAGACAGAACACGCCC [...]
+NODE 1864 28 3533 3533 0 0
+GCGGTTCGATCCCGCTTAGCTCCACCAA
+GCGCTCTCCCAGCTGAGCTATAGCCCCA
+NODE 1865 14 4271 3983 0 0
+GCTAATCCTGGTCG
+ACCGCCCCAGTCAA
+NODE 1866 12 3973 3816 0 0
+GACATCAGGAGG
+CTTTAGGAGGAG
+NODE 1867 2025 116412 115644 0 0
+GTACCAGTAATGGCAGCTACAAACCTGTAAAGTAAAAAGGCCGCGTTTTCCCGGGGAGGCTTTTAGACAGGAGAAGGCCATGGCGTTAAGGATCAGAGTATTGCTCGAAAATCATAAGGGAGCTGGAGCGGATAAATCGTTGAAGGCCCGGCCAGGGTTAAGCCTGTTGGTCGAGGATGAGTCTACGTCTATCTTGTTCGATACCGGCCCTGATGGCAGTTTTATGCAAAACGCGTTGGCGATGGGGATCGACCTGTCCGATGTGTCTGCTGTGGTGCTTTCGCATGGTCATTACGATCATTGCGGCGGCGTGCCGTGGCTTCCTGATAGCAGTCGAATCATCTGCCATCCCGATATTGCACGTGAACGTTATGCAGCAATGACTTTTCTTGGTATTACCCGAAAAATAAAAAAATTGTCGTGTGAGGTGGACTATTCACGCTATCGAATGATGTACACGCGTGACCCCCTGCCGATTGGCGAAAACTTTAT [...]
+CGCATTGCCGGTTTGCGAAGCGGAGATAAGCGTAACCCCCGGCATCTTCCCCTCAGGAGCAGGCGTGACGGCAACAGCGCCTGAGCGCGGATTCAGTACGCCCCAAAAATAGCCGGAGACCCAGGCAAGCTGTTCGGGAGTAAGGTCGGTTGTCGCGGCCTGAAGGCGCGCCAGTTGCTCCGGATTAAGCGGAAGCAACCCAGTCAGTGGAGCCGGTGTCGTCATGCGTCGTTATGTTCCAGTAAGCAAAGCGGATCTATACACAAAATCATTCAAGTTCGCCGTAAGCTGAGCGCGCCCCAGGAGCGTACATAAATACGTGACTGGGGTGAGTAAACGCAGTCAACACAGATGCGGCTTGAAAGATGAAATGTATAAGCGATAAATCCCAAACTGAGGATAAGGTTAACGGTGAGAGGAATAACAATTAAAGAAGGGTTGGAAATAACAAATAACCAAATGAACTAACCTGTTTTAGTTATCGTTATTAAC [...]
+NODE 1868 9 4317 1823 0 0
+ACTATCATT
+TTATAACGG
+NODE 1869 4 1971 844 0 0
+AACT
+CCGG
+NODE 1870 28 13631 7488 0 0
+GAATCCATAGGTTAATGAGGCGAACCGG
+CACACTGGGTTTCCCCATTCGGGTATCG
+NODE 1871 6 2813 2309 0 0
+GGGAAC
+ACGAGT
+NODE 1872 102 5680 5626 0 0
+GTTATTGTTTTTTTTAAACGTCTCCGGACTCGCTGGGATATCCCGAAACTAAAATTTGGCTCCTCTGACTGGACTCGAACCAGTGACATACGGATTAACAGT
+TTAGTTTCGGGATATCCCAGCGAGTCCGGAGACGTTTAAAAAAAACAATAACTTATCTTTACCCGGTTGACCTGAGAAGGTTTACCGGGTTTTTTGACATCC
+NODE 1873 4 457 452 0 0
+CCGC
+AATT
+NODE 1874 91 11339 7624 0 0
+CACCAGCGCCATATACGAGTACGCCGCCACCGCGATGGCCCCCAGCAGCTCCGGCGCCAGCTTGCCCGACAGATAAATCGCCGTCGGGCCG
+GGGCCATCGCGGTGGCGGCGTACTCGTATATGGCGCTGGTGCCGTTAATCCAGCCGCCGATTATGAAGGCGCTGACCACGGAGACGGAGCG
+NODE 1875 21 1817 1784 0 0
+TGTCGCGCCGCTGGTCATCTT
+CGCCAGCACCCCCGGCGTGTA
+NODE 1876 96 4325 4230 0 0
+CATGGGCGTCGGCGCGATGACCGACTTCGGCCCGCTGCTGGCCAACCCGCGCACCCTGCTGCTCGGCGCGGCGGCGCAGTTCGGTATCTTCGCCAC
+GTTGGCCAGCAGCGGGCCGAAGTCGGTCATCGCGCCGACGCCCATGAAGATGACCAGCGGCGCGACACCGGAGCCAATCGCCACTTTATAGAACAG
+NODE 1877 5 804 773 0 0
+TTGAT
+TTCGG
+NODE 1878 252 14265 14080 0 0
+AAGCAGAATGCAAAGCCCTCCTGAATAAAGACCTTGCCACGGTCGCCAGACAAATTAACCCGTACATTAAAGTCGATATACCGGAAACAACGCGCGGCGCTCTTTACTCGTTCGTCTACAACGTGGGTGCTGGCAATTTCAGAACATCGACGCTTCTTCGCAAAATAAACCAGGGCGATATCAAAGGCGCATGTGATCAGCTACGGCGCTGGACATACGCTGGCGGTAAGCAATGGAAAGGGCTGATGACTC
+AGCTGATCACATGCGCCTTTGATATCGCCCTGGTTTATTTTGCGAAGAAGCGTCGATGTTCTGAAATTGCCAGCACCCACGTTGTAGACGAACGAGTAAAGAGCGCCGCGCGTTGTTTCCGGTATATCGACTTTAATGTACGGGTTAATTTGTCTGGCGACCGTGGCAAGGTCTTTATTCAGGAGGGCTTTGCATTCTGCTTCGGTATACGTTTTACCGAGCATGATGTCTTTTCCGGTGTGTCCGTGACAT
+NODE 1879 34 1679 1644 0 0
+TACGTAGTACGTGAAGTTTGACTCGCTACGCTCG
+CGCGCTGTCCGTGTCCAAACTGGCTGCGCCAATA
+NODE 1880 31 1516 1496 0 0
+CCCTTCGGGCCGCCGCAAGCGGCGTTCAAAA
+TTCACGTACTACGTATACGCTCCGGTTTTTG
+NODE 1881 5 1248 1248 0 0
+TGCTC
+GCTCT
+NODE 1882 1 190 190 0 0
+G
+G
+NODE 1883 12 3162 1455 0 0
+CCGAAGGGCGAG
+GCGAGCACTGCC
+NODE 1884 867 51910 49886 0 0
+GGGCGCTCATTAAGAACGTGTAGGCCATTGCCCCGCCAGACCATCACCAGTTCACAAAACTCATGCGTATGTTCCGCAAAAACATCCTGTGGATAGCGATCGGCAACCGTAACGGCCTGCTGCTCATCAGTAAAAAAATCTTTTTTCAAAAGGATTAACTGATTTGCCACCGCAGCACCTCATGTTGAATGCTTGCCGGATGGCGCTACGCTTATTCTGTCTACCGCTCGCCGCCGTAGGCCAGGTAAGGCGCAGCCGCCATCCGGTATTAAAGGGTATAATTATCAGCATATTGGCGACGAAAACGTTGATAGCGTTCGCGTTACTGGATTATCGCATCGCGTCCCTGACGGATATCCCGCGGCGACCAGTTAAATTCTCGGCGAAACAGAGTCGAAAAGTGGTTACTGTCGCCAAAACCGCAGCGGTACGCGATTTCTGTCACGCTATGATCGCTATGGCGCAATAAATGCCGGGCTTTGATCAAACGCA [...]
+CGGGTGAATCAGAGTGTGTTGCAGCAGGTGCGCCAGTTGGTCGGTCTGATGGAGCGCGCCGGAGACGGCATGGATGCGCCTGCCGTGGCGAATCGCGAAATTTTGTTTATGCAACTACTGGTGTTGTTGCGCCGCAGTAGCCTGATGGAAGGCGCGACCAATAACGACGCCAAACTCAACCAACTGATGGCATGGCTGGAAGACCATTTTGCGGAGGAGGTCTGCTGGGAGGCGGTAGCTGAACAGTTTTCGCTGTCGCTACGTACGCTGCATCGTCAGCTTAAACAGCATACCGGCCTGACGCCGCAACGTTACCTTAATCGCCTGCGTTTGATCAAAGCCCGGCATTTATTGCGCCATAGCGATCATAGCGTGACAGAAATCGCGTACCGCTGCGGTTTTGGCGACAGTAACCACTTTTCGACTCTGTTTCGCCGAGAATTTAACTGGTCGCCGCGGGATATCCGTCAGGGACGCGATGCGATAATCCAG [...]
+NODE 1885 51 2964 2688 0 0
+CGACCTGGGCGTAGGGAACGCAACCGCTGCGCCATTAGTTTGCGGGTGTTT
+GCCCAGCCATAATGGATTAGGTTGCTTATGAAGCGCGTGTATTAAAGGATC
+NODE 1886 339 18441 15721 0 0
+TGGCGAAAGGATCGCTAAGCGACACAAATACCCTCAGTTCGATTCTCTGAGGGTGTTCATGCGACTGCCCAACAGCAATGTTTCAACCTCTTCTAACGCAACGGAAGGAAATAACGTGCCCTGGGTTGCCCAAATGCCTGCCGTTTTTAACGCCGGCAAATAGCGTGTGTTTTCCTGGCCACCCACCACGATCTTGTCACAATAACGCCGGATATGTTTGACGAGCAGCGGAAACGTCATTTTTTCAATTTGTGAGATAAAAAAGCTGCGATCAAGTTTTACGCCGCTAAAACACCCGCAAACTAATGGCGCAGCGGTTGCGTTCCCTACGCCCAGGTC
+TAGCGGCGTAAAACTTGATCGCAGCTTTTTTATCTCACAAATTGAAAAAATGACGTTTCCGCTGCTCGTCAAACATATCCGGCGTTATTGTGACAAGATCGTGGTGGGTGGCCAGGAAAACACACGCTATTTGCCGGCGTTAAAAACGGCAGGCATTTGGGCAACCCAGGGCACGTTATTTCCTTCCGTTGCGTTAGAAGAGGTTGAAACATTGCTGTTGGGCAGTCGCATGAACACCCTCAGAGAATCGAACTGAGGGTATTTGTGTCGCTTAGCGATCCTTTCGCCATGCGTCAGCGGTCAGCGCCTCGCCAAAATGGCCTGCGATTAAACGGCGGG
+NODE 1887 1917 88584 88404 0 0
+GCCGGCTGCTGGAAGAAACGGGCGCCGGTTTCGCACTGTTCACGGCGGGTATTATACTCGCTGCCCACCAGCGTGCGCTTAAAGTTACTATTGATGATCACCACGGCGACACCTTTCGGCATGGAAACCGCTTTGGCGCCGAGCGTACGGCAATCAATCAGCAACGCATGATCTTTTTTGCCGAGCGCAGAGATGAGCTGATCCATAATGCCGCAGTTACAGCCGACAAACTGGTTCTCGGCCTCTTGTCCGTTGAGCGCAATTTGCGCGCCGTCCAGCGGCAGGTGATAAAGCTGCTGGAAGACGGTGCCCACCGCCACTTCCAGCGAGGCGGAGGAGCTTAACCCGGCGCCCTGCGGCACATTGCCGCTGATGACCATATCCACGCCGCCAAACGCGTTGTTACGCTGTTGCAGGTGTTTCACTACGCCGCGCACATAGTTAGACCACTGCTGGCTATCGTGGGTCACGATCGGCGCATCCAGTGAAAAT [...]
+ACTGGCGCGTCACCCGCACGCTTGACGAAATGGCGCAGGACACCTGGCACTGGCAGTCACGCCATCCGCAGGGATACCCAGATTAAGGACGTTGTTATGACCCCATTTAATCCCATCGATCATCCGCATCGCCGTTATAACCCGCTTACCGGCCAGTGGGTTCTGGTTTCGCCGCATCGCGCAAAGCGCCCCTGGCAGGGGGCGCAGGAAACGCCGTCTCAGCAAATGCTGCCGGCCCACGATCCCGACTGCTTCCTGTGTGCGGGCAATACGCGTGTCACCGGCGATAAAAATCCCGATTACAAAGGGACTTACGTCTTTACTAACGATTTCGCGGCGCTGATGGCCGATACGCCGGATGCGCCGGACAGCCACGATCCGCTGATGCGCTGTCAGAGCGCGCGCGGCACCAGCCGCGTGATCTGCTTTTCTCCCGATCACAGTAAAACGCTGCCGGAGTTGAGCCTGCCCGCGCTGACGGAAATCGTCAGA [...]
+NODE 1888 169 7982 7982 0 0
+GCGTCCGTCATCAAAGGGAACCGTGTCGGTATGGCCGGTCAGCAGCAAACCGCCCGCGCCATGTCCGGTGCTGGCGAGCATATTGAATTTGTTTCGCGTTCCTGGAACCGGTTGAACCTCTACGTTGAAACCAAGATCGCTGAACCAGCCTGCAAGCAAAGTGATTAAA
+AGGTTCAACCGGTTCCAGGAACGCGAAACAAATTCAATATGCTCGCCAGCACCGGACATGGCGCGGGCGGTTTGCTGCTGACCGGCCATACCGACACGGTTCCCTTTGATGACGGACGCTGGACGCGCGACCCGTTCACGCTGACCGAGCACGACAATAAGCTCTATGG
+NODE 1889 18 820 727 0 0
+CCGCCGTCGGAGAAGTCA
+TGTTGGAAGGGCAGAAAG
+NODE 1890 5 604 604 0 0
+TGCTT
+GCTGG
+NODE 1891 5 320 320 0 0
+ACCGG
+AATCC
+NODE 1892 5055 258264 257281 0 0
+TATACCCCGCTCGCGCCTTGGCGGAAAGCCCCGCCATTAGCGTCCCCATAAAGTCCGTCGTCCGGTCAGCCTCTTGCGGATACCGCATGGCGACATAAGTGCGAATCAGGTTTTCAGCAGCGATGTAAAACTCGCAGGCGGCCTCTCGTGCCGGTTTATCGTTACAATGAGCGCCCTCCAGAACCAGACATCCAGTGGCATCAGGATCGGCAGCGTAACGTCTTGCCGCTTCCATCAGCACATCGATAAGGCACTTCGCGGTCGGGCGATCGTGACGCAGAAGCGCCCCGAGCGGAATCGCGTCGGTCATCCTGTAACGCTTTAATACGCGAGTATACAGCCCCAGCTTGCTGCCAAACGCCGCATAGAAACTGGGAGGATTGATCCCGAACGCTTTTGTCAGATCCGCTACGCTCACCGCGTCGTATCCGCGCGAATGAAATAAGTGTTGAGCGGTTTCAATGGCTTGCTCCGGATCGAACTGGCGAGGGC [...]
+ATCTTAAAAAGGAGTCACAAGACAGTTGTCGTAAAGCATGAGTAATATTTACCTCAGTGTCAGGAAGGTAACCGGTGTAAGTTATGGCAAAATAAGAGGAACGACACCCGCAATCGCAATTCAAGCTGTGGCTTTTTAGTGTTTATCTCTGGGGTGATGAGAACAAGAGAGCACTTTAATATCATTCTTTCCTTTATTCTTGAGGGCGCATTCAGTTTTGGGCCGGAACCGGAAGCTATTCGTGACGCTATCTCTATGGATTAAAGCGTTTTGTTAAAAGCATCGTTAGATCACAAAACGGAAAACTATTTTCCCTACGGTAAAAATGTCGGCATCAGTTTTTGCAGATAAGAAAAAAGCATTATCAGACATGGTGTTACAGCAGGAGCACATAACCAGGCACTGATGCGTACTGGTTTCTTGTTAACGCAAGGTAACCACGCCAGCCGCCTGGTGCTGGCAGAAGGCATGGGGATTAAGCGAGCGCCTGAT [...]
+NODE 1893 51 53 53 0 0
+GATCCATACCATAATGAATACTGGATCCGGCAATAATGCACACGCTGGCTA
+CCCTGGAACGTGCTGGATATTGTGCAGCGCTGGGACAGTCTGTTTGCTTCA
+NODE 1894 254 12026 11950 0 0
+CGAGCGGAAAAACAGCGGATTCGCGATATCCAGCGTGCAAGACGCGGCTGAAGCCACTAAAATCTTCCACTATGGCAATGCGTTGCCGCGCGGGTCGCGGCATCATTTTCAGGGAAGACATTCATTGGGATTTATAAAGCAATCAACCTCATCACATGCCCGTTTAAATGTGCCTACGCTGGTGCAGGTTGCGGCTATGGCGATTATTTTGATTCGCGGTCTCGATGTGCTGATGATTATGAATACCCTCGGCA
+ATCGCCATAGCCGCAACCTGCACCAGCGTAGGCACATTTAAACGGGCATGTGATGAGGTTGATTGCTTTATAAATCCCAATGAATGTCTTCCCTGAAAATGATGCCGCGACCCGCGCGGCAACGCATTGCCATAGTGGAAGATTTTAGTGGCTTCAGCCGCGTCTTGCACGCTGGATATCGCGAATCCGCTGTTTTTCCGCTCGCGCCATCAGGTACCAGGCAATAAATCCGACGATTCCTACCACGCCGAGGA
+NODE 1895 219 12237 10934 0 0
+CCCTGCCCCTCGCGGAACAGGTCCGGCAGTATCCCCTCATAGCTCACCGTCACCGACCCTTCGGCGTCGTAGAGGCTGAAGTTCACCTTCAGCGAGTCCGGGTCGCGCCTGACGCTGCCGGGCATCACCATCCCGCCGACGCGCAGGCGCTGGCCCGCCGCCGGCAGCTGCTGCGTCTCGCGCTTGCCGTAGAGGATTTCGCCGGGGGTATAGAACAGG
+AGCTGCCGGCGGCGGGCCAGCGCCTGCGCGTCGGCGGGATGGTGATGCCCGGCAGCGTCAGGCGCGACCCGGACTCGCTGAAGGTGAACTTCAGCCTCTACGACGCCGAAGGGTCGGTGACGGTGAGCTATGAGGGGATACTGCCGGACCTGTTCCGCGAGGGGCAGGGGGTGGTGGTGCAGGGCACCCTGGAGAAGGGCAACCACGTCCTGGCGCACG
+NODE 1896 37 1186 1186 0 0
+GCGGCACGCTGGTCGCCAGCAACGTTGAGGCGCTGGG
+GCCGCCGGTATAAGTATTGCTGCCGGAAAGCGTGAGC
+NODE 1897 6 229 229 0 0
+TACCGG
+AAGGGT
+NODE 1898 1033 61794 61195 0 0
+GGTGCAGCAGATCGCTAAAACCTGCCCGAAAGCGTGCGTGGGCATTATCACCAACCCGGTGAACACCACCGTTGCGATTGCGGCGGAAGTGCTGAAAAAAGCAGGCGTATACGACAAAAACAAACTGTTTGGCGTCACCACGCTGGATATCATCCGCTCTAATACCTTTGTCGCAGAGCTGAAAGGTAAGCTGCCAACGGAAGTTGAAGTCCCGGTGATTGGCGGGCACTCCGGCGTGACGATTCTGCCGCTGCTGTCGCAGATTCCAGGCGTAAGTTTTACCGAACAAGAAGCGGCCGAGCTGACTAAACGTATTCAGAACGCCGGTACTGAAGTCGTCGAGGCGAAAGCCGGCGGCGGATCGGCAACCCTCTCTATGGGTCAGGCTGCCGCGCGTTTCGGACTTTCTCTGGTTCGCGCTCTGCAGGGCGAAAAAGGCGTGGTGGAATGCGCCTATGTGGAAGGCGACGGTCAGTATGCCCGTTTCTTCTC [...]
+GCCTCAAGATGCGCGACCTGCATGTGCCTGTTGGGCAGTCGGATTAAAAAACCTTCCTGTTCGAGTGACTGTAGCGCTTCTCGAACCGGCATTCGTGAAAGACCAAGCTGCTCCGCAATACTTTCCTGCGCGAGTTCTTCTCCCGCTTTTATATTGCCGGAAAGAATTTCATAGCGAAGCATTTGCGTAATGTGATCGCGGGTTTGCGTTCTTTGGATCTTTTTCACGACGTTCTCGTTAATAACCGATAAGACGTGAGGAGTTTAGCAGATTTAGTACTTGATTTCGTGGCTTGTTTACAGTCAAAGAAGCCGGAGCAAAAGCCCCGGCATCGGGCAGGAACAGCTTATTTATTAATAAAATCTTCACCCAACTGAATATCTTTTTTCAGCGTATCCAGCATAGCGTCCAGCGAATGTTGCTCGAAAGCGCTCAGTGTGCCGATGGATTTACGCTCTTCTACACCGTTTTTACCCAGCAGCAGCGGCTGAG [...]
+NODE 1899 2 268 268 0 0
+CC
+TA
+NODE 1900 10 2648 668 0 0
+GGGTGAGCGA
+TGCCGCCTTT
+NODE 1901 25 4496 550 0 0
+ATGTTTGAATATAGGCAGCGCAGGG
+CTCGTATATGGTATCGCTGCCAGCA
+NODE 1902 1 181 179 0 0
+T
+A
+NODE 1903 1144 60943 60538 0 0
+GTGGTTCGCGCCCGGAAAGTGTTTGGCGAAAGCCGCATTACGATTATCTCGCAAGCATTTCATAATCAACGGGCGATCTGGCTGGCGCAACAATATGGCATTGACGCTATCGGCGTTAACGCGCCGGATCTGAATAAAAGGCACGGAACCTACACACGACTTCGGGAAAAGCTGGCGCGGGTTAGCGCGGTGCTGGATGCCAAAATTTTGCACCGTCAGCCTAAATATCTGGGCGCTGGCGTCACTATTGGGGCTGATAGCGCACACGGGTGCCCTTCTCGCCAGTAAAATGCCAGAGTGCGTCGCAGCGCACTGGCAAGGGCGGAAAGGCGTGCTACATTGACGAAAATCCCTTTCTGGAGTCCGCTGACGTTTATGATACGTTTCGCTGTAATTGGGACTAACTGGATCACGCGCCAGTTTGTCGACGCCGCCCATGAAACCGGCAAATTCAGGCTCGCCGCCGTTTACTCCCGTAGTCTTGAACAGGCG [...]
+ATTTCACTGGCCAGTACCGAGTCGCTGACTTTGGAATGCTGTAGCGTGACGCTAAAATCGCCGTAATCCATAACCACGACGCCGTGCGCATCTACTCCGCTTTCCAATAAATTCGCCGACGCCTGAACGCTGCGCGGCTCGCCCCATAGCGCGATCGCCGACGCCAGACAGTAATACCCGATATCCATAATCGAACCATTGGAGAAGGCCGGATTAAACGTATTCGGATTTTCACCGTTCAGATAGCGCTGATAACGTGAAGAGTACTGGCAGTAATTTAGGAATGCTTTATGCATTCTGCCGATTTTCGGCAACGATTCCCGCAGCAGCAGGAAATTGGGCAGGCAGGCGGTTTTAAAGGCTTCAAACAGTACCCGCTGATTATCGCGCGCGCAGGCGATAGCGGCATCAACCTCCGCCAGGTTAGAAGCCAGCGGCTTTTCGCACATGACATGTTTTTTATGCTGCAAAAAGCGCTGCGTTTGGGAGAAA [...]
+NODE 1904 42 964 964 0 0
+ACAGCCGACAGCGCCGCAAGACAGCTTGATCCACCCGCTGTT
+CTGATACTGTGGCTGCGGCGCTACCGGCTGCTGCGGCTGCTG
+NODE 1905 51 69 69 0 0
+GTTTTCCTTTGGCGTCAAACACCACCGCAGCATGCGTCGGCTGATACTGCA
+CCCTTCCGTGATGAGCTCTTTGAACACTACAAATCGCATCGTCCTCCGATG
+NODE 1906 2175 129932 128624 0 0
+AAACCCAATAATTTCTGTGCTTGAACATCAAGTTGGGCTGTTGGAAGGTTAGTTTTTACTTCGAATACTGATGAGTTACTCACGAAAAATCCTCTCTGTTTGTGCCAAAACCATTACTGCTATAGTTACGACCAGCAGAAGAGGCTAGTCCTTTGTGACCGACATCGGTTGAGGCTGGCACCCAAGATATCTTCAGAGGAAGCTTCGCGCGTTCTTCCGCCGATGAAGAATCGGTATAGCGCAAATGGATACGAACCCACCCGCCTTTATCTTTTGGTGTCAGCGGCCACAATACACCGCCGGGCCTTCCTGTTCCCGTTGCACCTTCAGTCTGAAACTCATATTTGACTGCGCGGACTTCAGTGGAACCGTTCATAAGCGTCACATCAGCGAATTTAAGATAGTTTTTCTTGGCCAAGACTTCGATATCGTGGGCATAGTTTGCTGCATCGGACTCAGTCATCGCCTTGGTCGAGCCAGCAATCATAATCA [...]
+GAATCGCTGCGGGTCTACGGGATAAGTGCGCTCTGGGTGAAGTCGTCATCGCTGAGCGAGTTGTCGCTTATGAAGGTGCGGCTTTTCTTGAAGAGGGCAGAGTCGAAAATCGTCCGGAAATTAGCAGATTAAGTATGCGAGTTCGCCAAGATGTTAGTTCATACCTTTCCAACAGGGCGACACTCGAATTTCGCCTTACAGAAAGTTATAGAACACTGGGTATTGAATTCCCCGACCAAGTGGAGGCGGGTCCCGTCATTCAAGGAGTCATGCCGAAGACAGCCACTGTTGCTAGTGGTGAAAAGCTTCTTCGAGATCCCGATAAATTCTTGGGCATGCGTGAGCTTCACGGTAAGACTGAAGTTGCAGAAATGGAAGGCGCAGGACTTTTCGCTGCATGCGCCAACTTTGGCAAACCAGTGCTGATGATTCGGGGTATTAGCGATTTTGGTGATTCGAAAAAGGACAACCGATTTCATCTCTTGGCAGCGA [...]
+NODE 1907 51 177 177 0 0
+GTCGGTCGCTGGGGCTGCGGCAGGCGCTATCATCTCACTCATAAAAGACTC
+CCCGCCAGGTGAGCGAGTGGGCGAGGAGGCGCAAGGGAGTCAGAGGTTGAT
+NODE 1908 19 217 210 0 0
+TTGACGAACAGTCAAACCC
+TCGTAAGACAGTTTGGTCC
+NODE 1909 42 901 901 0 0
+AGTGGCGCTACGAGACGGTGACCGCCGAGGAGTTACTGTCGC
+TGGTTATAGAAGTAAGAGGTGCTATTCATGTGACGCGCCGGA
+NODE 1910 501 29884 29730 0 0
+ACTGGTCGTCGTCACAAACAATCTCCGCGAATTTGAACGCATTCCGGGTATCCGAATCGAAGACTGGTGCTAATTTCTGCATCAGATGTTATCCCCGGATTCAAACTCTTTTCCGAATTTAGTGGCACAGTCAATTTGGTTACCTGCTTAATGGTGGTTTGCATCACATTTTTAGCTGGTGGTATTTTTTTATGTTGACTGGAGATATCTGCCAACAGCATAACTTTTACGGCCAGATAATAAATAAAAGAGTACCAAAATGTCGTATTCTGACATGTTTACGAAGGGAGTACCGCTCCCTTCTTTTTTTGTTTCCTGGATACTCACTGAATAATGCCGTTACTGCCCGATAACTGCCGCCCCCCCTCACCATAGCCGTTTCCTGCAACTAAGTCACAGACGTTGATTTACCAGGCCGATATGCCTTCTTTCCCGTTATATACCCTTCATACTTCAAGTTGCTTATGTGTTGGCTACGGATTACCCGGCCCA [...]
+TATGAAGGGTATATAACGGGAAAGAAGGCATATCGGCCTGGTAAATCAACGTCTGTGACTTAGTTGCAGGAAACGGCTATGGTGAGGGGGGGCGGCAGTTATCGGGCAGTAACGGCATTATTCAGTGAGTATCCAGGAAACAAAAAAAGAAGGGAGCGGTACTCCCTTCGTAAACATGTCAGAATACGACATTTTGGTACTCTTTTATTTATTATCTGGCCGTAAAAGTTATGCTGTTGGCAGATATCTCCAGTCAACATAAAAAAATACCACCAGCTAAAAATGTGATGCAAACCACCATTAAGCAGGTAACCAAATTGACTGTGCCACTAAATTCGGAAAAGAGTTTGAATCCGGGGATAACATCTGATGCAGAAATTAGCACCAGTCTTCGATTCGGATACCCGGAATGCGTTCAAATTCGCGGAGATTGTTTGTGACGACGACCAGTCCGCGGCTACGGGCATGGCCAGCAATCATCTGGTCATAAGG [...]
+NODE 1911 11 884 843 0 0
+CTCGCCCTGAC
+GCAACTTGAAG
+NODE 1912 207 7634 7634 0 0
+CCTGCTGCTGCCGGACGCCGCGCCGCTGCTGGGGATGTTCTGCTTTGGCAACCTGATGCGTGAAAGCGGCGTGGTGGAGCGTCTGAGCGACACGGTGCAGAACGGGCTGATTAATATCGTGACCATTTTCCTCGGGCTGTCGGTGGGCGCAAAGCTGGTGGCGGATAAGTTCCTGCAGCCGCAGACGCTGGGCATTCTGCTGCTGGG
+CAGCTTTGCGCCCACCGACAGCCCGAGGAAAATGGTCACGATATTAATCAGCCCGTTCTGCACCGTGTCGCTCAGACGCTCCACCACGCCGCTTTCACGCATCAGGTTGCCAAAGCAGAACATCCCCAGCAGCGGCGCGGCGTCCGGCAGCAGCAGGGCCACCAGCAGTAACAGCACCACCGGAAAGAGGATTTTTTCCCGCTTACT
+NODE 1913 35 1534 1534 0 0
+TGTGATTGCGTTCGGGATTGGGACGGCGGCCGGGG
+CCCAGCGTCTGCGGCTGCAGGAACTTATCCGCCAC
+NODE 1914 31 13133 12960 0 0
+GTCGTAAGGGCCATGATGACTTGACGTCATC
+CAATGGCGCATACAAAGAGAAGCGACCTCGC
+NODE 1915 3 268 268 0 0
+ATT
+CTT
+NODE 1916 168 8812 8766 0 0
+CCCGGAGGGATCCATGACTATTGCCATTACCGATGTCGTCCTGCGCGACGCTCACCAGTCCCTGTTCGCCACCCGTCTGCGTCTTGATGATATGCTGCCCATTGCCGCCGCGCTCGATGACGTGGGCTACGGCTCCCTCGAATGCTGGGGCGGCGCCACCTTTGACGC
+ATCGAGCGCGGCGGCAATGGGCAGCATATCATCAAGACGCAGACGGGTGGCGAACAGGGACTGGTGAGCGTCGCGCAGGACGACATCGGTAATGGCAATAGTCATGGATCCCTCCGGGAATTAAGGGTTAAGGCGGCGATGGTGGTGGATAGCGGCGGCAATCACCGG
+NODE 1917 142 6168 6168 0 0
+ACCCAGCGCCGCATCGCGGTTTTTCGGGTCCAGACGGTAAGCGTTCGCATACGCCCCGGTGGCGGTACCGGCATTACCCAGTACCATACCGGTGCGCCCCAGCATGAGCCAGCCCTCAACATTGCCGGCATCATTCTGCAGG
+CCGGTATGGTACTGGGTAATGCCGGTACCGCCACCGGGGCGTATGCGAACGCTTACCGTCTGGACCCGAAAAACCGCGATGCGGCGCTGGGTTACGCGGAGGCGCTGACGCGCTCGTCCGACCCGGAGGATAACCGCCGCGG
+NODE 1918 83 3067 3067 0 0
+GATGGCGCGGCTGGCGCTGGGGCTGCGCACCCGCCTGCAGAATGATGCCGGCAATGTTGAGGGCTGGCTCATGCTGGGGCGCA
+CGGGTGCGCAGCCCCAGCGCCAGCCGCGCCATCTCCTCCTCATTCAGCGGCTGCGCCTGCGGGTCCAGCGCCCGCGCCAGCAG
+NODE 1919 3490 207692 205928 0 0
+CAAAGCGATGGCTCTTTTGTCCTGCTGGCGACCGAGCGTAATTTACTAACCTTCAACCGCGCATCGGCGGAAGAGATTCAGGACCATAGTTGCGCCATTTTGTCTTCCCGCTGATTTTCGTTCCACCCCCTGCTCATTATCTTATTGATTCTTATCCCGGTTTAAAACTGGGGTAAGATCGTGTCTATAAAAATATGTGAAACCGATCAAAAGATATAAAGGTATACCTTTATATCTTTTTGTGGTTAGTTACACTCTCTTCATAGCCTCCATAGATTGTCTGGTGGATGGCTTATATAAAAACGTTTTTATTTCATGTAGTGACATCATTAATTGTTCACCAGATTTGCGCTGTTAAGCGTAAAGGAATATCAACATGAAACTTTCTATCGTGGAAAAAATCGGCTTCGGCGCGGGAGATATGGCGATAAACGTTGTGATTATCGCCATGCAGCTGCTCCTCGCCTATTTCTATACCGATATCTACGGCCT [...]
+GCGATGACGTTTACCGATATCCACGGCCAGTTCAATGCGTCGGGCAACGGAAGGCCCGGCGACCATCATCGCCCCTTGCTCCTGCGCCAGCAGATAGCCCCTTTGCGCACCGTAAATACCGGCGGCAATAATGCTGTCTGCGTTGGTCTGCGCTCTTAACGCCTCGCTGGTTGCCGCCGCCATCGCCGCTGCGCCGGACATCGCCAGCACGTTATTATGCGTAAAACGGCAAATCTGTAGCGCGCAGTCAATCGCCGCGTCAATATCACCCGGATGCAGCACCGCCGCTGGCCAAATCTTCATGGCGGCGCCGTTCGTTGCCTCCGCGTTACCCTTATTAATAATCTGTACCGACTGTTTCTCGCCTTCCAGCTCACCCTGTAAAGAGGCGCGGTTATCATTGAATATTGCCTTCATTGCCGCACGCGTCGTCGGGCCGGTAAAGTTGGCGTAGTACGGATAATCCAGCCACTGCTGAAAAGCCTCGCGCAT [...]
+NODE 1920 202 10844 10586 0 0
+TGCTCCTGTACCTGCTGTTGCTGACTGCCGACAGGCGCTGCTTCAGAAGGCACTCCCAGACTTACCGGGCTGGCTTTCCCCATCATAGGCAGGGTATTGAAAACCGGCGTTTCAGGTTGTTGGGATGTTTCAGATTGCCCATTATAGTGCTGGACACCGACGATAACTGCAAGTGAAACGCACGCCGCCACGCCCATTTGGG
+CAGCACTATAATGGGCAATCTGAAACATCCCAACAACCTGAAACGCCGGTTTTCAATACCCTGCCTATGATGGGGAAAGCCAGCCCGGTAAGTCTGGGAGTGCCTTCTGAAGCAGCGCCTGTCGGCAGTCAGCAACAGCAGGTACAGGAGCAGCGTCGTCGCATTAATGCCATGTTGCAGGACTATGAACTGCAGCGCCGAC
+NODE 1921 115 6924 6913 0 0
+GCGCACGTTGTTGGTCTGGTTGTCATTGGGGATACCACTGTCGTTAACCAGTTCAATATTGTCGATGCCGATTTGGGTATCGACAGTGACCTTCAGCGATGCAGAATGGCTGGTG
+TCGACAATATTGAACTGGTTAACGACAGTGGTATCCCCAATGACAACCAGACCAACAACGTGCGCCCGCAGTTCCAGGTGACGGTACCGACGGATGTCAACGTGGTGCGCCTGAG
+NODE 1922 91 5232 5183 0 0
+GTCACCACATTTGACGCGACTAAAGACGCAGGCGGATGGACCTTTACGCCGCCGACATCATGGGGGGCGGGCGATTATACCCTGAGTGTGT
+GTCCATCCGCCTGCGTCTTTAGTCGCGTCAAATGTGGTGACGCCGCCGCCATGCTCCACGCTGACCGTAACGCGAACGGCATCATCATCAA
+NODE 1923 22 1591 1058 0 0
+CCCACGTCGCTCCGGCGACCAC
+TATGGAACATTGGTGGTCGCCG
+NODE 1924 15 1752 1732 0 0
+AGGTGTAAAACTGAC
+AACATCCCTGATGTA
+NODE 1925 77 9851 7756 0 0
+CACCCGAAGGCGCTCCTCACAGGTCATATGGAGCATTGGTGGTCGCCGGAGCGACGTGGGCCACCCGAAGGCGTTCC
+ATGACCTGTGAGGAGCGCCTTCGGGTGGTCAGTTTTACACCTCCGTAGCCTGAAAGGAGCTGTGAGTACTGAAGGGA
+NODE 1926 51 2086 2023 0 0
+ACCACGCAGTTACCCGCCGCCAGCGCTGGCGCCATTTTCCAGCTTGCCATC
+TGCTTAAACCGGCACGCCTGACGCCGCTTTCCGTTCTGCTGTTAATGGAAG
+NODE 1927 166 910 910 0 0
+TTGTTACGACTTCTCCTTCCTCTAAATGATAAGGTTCAAGCAACTTCTCGCAGATAGGTAACTTGCGAAACCTACCCAGCAATCCGAAGATTTCACCGGACCATTCAATCGGTAGGAGCGACGGGCGGTGTGTACAAAGGGCAGGGACGTAATCAACGCATGCTGA
+CCTACCGATTGAATGGTCCGGTGAAATCTTCGGATTGCTGGGTAGGTTTCGCAAGTTACCTATCTGCGAGAAGTTGCTTGAACCTTATCATTTAGAGGAAGGAGAAGTCGTAACAAGGGCAGGGACGTAATCAACGCGAGTCATCAGCTCGCGTTGATTACGTCCC
+NODE 1928 1 38 35 0 0
+T
+A
+NODE 1929 7 76 76 0 0
+GCTCCTC
+GTAACGG
+NODE 1930 1128 58466 57946 0 0
+CCTGAGCGCCGAAACACGGCGGACTGGAGTAAATTCGGCGCACCGTCGCTTTTAGCTGTCCCAGAACCCGCGCGGCAATTTCAGCATCTTCACACACCACGGACAGGCCGCCGACGCGCTCGCCGTACAGCGAGAAAATCTTCGAAAAAGAGTTACTGACTAACGCAGGTAACCCGGCGCTGGCAATGGCGCGAATAGCGTAAGCATCCTCGTCCATGCCTGCGCCAAACCCCTGATAGGCAATATCAAGGAACGGAATCAGATCGCGCGCTTTCACTATTTCAATCACCGCATCCCATTGCGAAGGCGTTAAATCCGCCCCGGTCGGGTTGTGACAACAGGGGTGCAGCAGCACGATACTGCGTGCAGGTAACGTATTCAGCGTGGCCAGCAGATCGTTAAAACGGATGCCGTTAGTCGCGTCGTCATACCAGGGGTAAGTACTCACTTCGAATCCTGCCCCGGCAAATATCGCAATATGGTTTTCCCAGG [...]
+GTATATTGATTAAATACGCGGCAGGCCGGGTGGCGCTTGCGCTTATCCGGCTTGTCTCGCGCATTGGCTGTAGGCCGGATAAGACGTTCACGCCGCCATCCGGCAATATGCGCATCCACCACAACATCCTCTCGATCTTCTCGTCCTTCCGGTTTATTGTGTTATTTCCTGCCCTCTGTAAACCTGGAGAACCATCGCGTGTTTCAAAAAGTTGACGCCTATGCCGGCGATCCGATTCTTTCACTGATGGAGCGTTTTAAAGACGACTCCCGTCACGACAAAGTAAATCTGAGCATTGGCCTGTATTACAACGAAGACGGGATTATCCCACAGCTCAAAACGGTGGCCGAAGCCGAAGCCCGGCTTAACGCGCAGCCGCATGGCGCTTCGCTGTACCTGCCGATGGAAGGACTCAATACTTATCGCCATACTATCGCGCCTTTGCTCTTTGGCGCCGATCACCCGGTTCTTCAGCAACAGCGCGTGGCTACT [...]
+NODE 1931 43 2100 2100 0 0
+CAGTGATTTACTGAAACCGATCAGGCCCGCTTTCGCCGCAGCG
+AAGTTGCGTCCCGTGGTATTACTGTCAATGTTGTGGCTCCGGG
+NODE 1932 45 1631 170 0 0
+CCTGGCGACCGCTGGAAGACGATAATTTTCGTCTGGGACTGGGCT
+TCCCAGCCATAACCGCCTATGGGTTCCCATTTGTTAAATGAATCT
+NODE 1933 26 1460 1426 0 0
+TCATCAGGAATCCACCATGCACGCCG
+TCAATTTCATTTTTGTGTTTGTCATC
+NODE 1934 104 5375 5375 0 0
+TTCAATTGATTCGCGAGACGCAATTTCCCCTCCCTGGCTTCCGCTGGGCGATACCATTGCAATAATCAGATCTGTGAAAGTGTACTTGAGGTACTCCAGCGGAT
+GTATCGCCCAGCGGAAGCCAGGGAGGGGAAATTGCGTCTCGCGAATCAATTGAACTCTCCTTCAGCACCGTGAAGCAGGAATACGTGGTGCAGAACCAGCAGGG
+NODE 1935 121 5437 5367 0 0
+GATTATGTGACTGCCTCCCGCGTGGCGGGCGCAGGCGCGATGCGTCAGATGTTCGTCAATATTTTCCCGAACTGCCTTGCGCCGCTGATTGTTCAGGCATCGCTCGGTTTCTCTAACGCCA
+TTCGGGAAAATATTGACGAACATCTGACGCATCGCGCCTGCGCCCGCCACGCGGGAGGCAGTCACATAATCGCGGTTCACCTCTACCAGAACCGCCGCGCGGGTTAAGCGGACATAGTGCG
+NODE 1936 51 2007 1831 0 0
+CGGGCAAGACTATTGAGCGTGTCAATGTGCATACCGGCGACGTGGAGGTGA
+GTAAATGACGCGCCTGAAGGCCGCACATCAAAGACCAGCCACTGGCTGTCA
+NODE 1937 31 6740 2753 0 0
+ATTTGCCTGGCGGCAGTAGCGCGGTGGTCCC
+AATTCTTTATCGCATCAGCGGCGTTGCCTGC
+NODE 1938 16 3330 1022 0 0
+ACCTGACCCCATGCCG
+TTTATGCTCAGTACGC
+NODE 1939 5 2108 1461 0 0
+GCCAG
+GTGAA
+NODE 1940 9 3142 1983 0 0
+GCAAATTCT
+AACTCAGAA
+NODE 1941 51 2010 1963 0 0
+ACCGGACCCGGTCTGCCAAATCGCCAGCGGAAACTCATCAGCATGTTTTCC
+TACGCAAAGCAACATGAATATGAATGAGGTGTTAGCGAACCGCGCCAGTGA
+NODE 1942 46 3243 3243 0 0
+AGGGGAATAAAAAAAGTCTGTGCAAATCGTGTTATTATTAACGTTT
+TGTAAAAGAAAGGCATAAAAAGCAGCGCAATAAGCAGGAGAACGGG
+NODE 1943 51 232 232 0 0
+GTTATTGCTGATAAATCTGGAGCCGGTGAGCGTGGGTCTCGCGGTATCATT
+CCCAGCCAGCCGGAAGGGCCGAGCGCAGAAGTGGTCCTGCAACTTTATCCG
+NODE 1944 51 2775 2775 0 0
+ACCCCCGCTGAATTCCGCCTGCTAAAAACCTTATCGCTTGAACCGGGTAAA
+TTAAATCCAGCGCTTTACCACACCAGGAGGCCTGAAAGCGGCTTTCATCAA
+NODE 1945 12 1325 1325 0 0
+CAGAAGCAATGG
+TGCCAGTGATTC
+NODE 1946 33 1653 1653 0 0
+TAAAAATATACGATGTCTCATAATATCACCCGT
+GTCGGCTACAGCCTTTTCGGCATCGGCGATGGC
+NODE 1947 850 45075 44762 0 0
+GGTATAGTTCAGCTCCTGCCACTTGCCATAGACGCGCAGCGGCACCGGCGTCTCTTTCAGGAAGGTGATCAGGTTGCTATCGCCGTTCCAGCCGCCCAGCACACGCAGATTAAATTGCGTATCACAGCTCTGCTTAACCAGATCCAGCGTTCCGCTGCCGGTTAACGCCAGCATAGAAGATTGCCCGACCATGTCGTCGAGCGTCAGCGTGCCCTTATTTAGCGTCAGATCGGTCGTGAAGCGATCCAGTCGGGTCGCGTTGTCCATATTTTCCTGCGACTGCTGCGCGTCGCCGCCGCTTCGCTCTACGGCCTGCTGCACCAGTTGCTGGAAATTCATTCCTTCGAGGCGCGTATTGCTCATGTCAACATGCGCTTTTCCTTTCCAGCTATGGCGAAATGCCTCTGCGTCAATATCCGCCCCGGAGAAATCGCCAACCAGCGACATCTTACCGGTCAGGCTAATCGGATAATTGAAGGCTTTCAGGATAGT [...]
+TGTCGCAGGGGCAAAATACGCTCCCCCTGACCAGGCCAGTTATCGCGTCGCGTGTTGGTGCGCCGCCTTATCAGGGGCTGCAAAGCTTTACGGCGGAGATTGCTTTACAGGCGGATTCAGTTCGCTGGCGGGGAATGGACTTTACCCAGGTTTCGACGAAGATGTCTAATCAGGCCGGATTGCTGGATATCACCGAGTTGCAGGGGAAACTGGCCGACGGAGAGATGTCGCTGCCCGGCACGCTGGACGCCCGCACCGCCAGTCCGCGCATCGAATTCCACCCTCGCCTCAACCATGTTGAGATTGGGACTATCCTGAAAGCCTTCAATTATCCGATTAGCCTGACCGGTAAGATGTCGCTGGTTGGCGATTTCTCCGGGGCGGATATTGACGCAGAGGCATTTCGCCATAGCTGGAAAGGAAAAGCGCATGTTGACATGAGCAATACGCGCCTCGAAGGAATGAATTTCCAGCAACTGGTGCAGCAGGCCG [...]
+NODE 1948 2445 160696 160154 0 0
+TCGAAAGCGTCGTAGCAGTATTCAGAAAGACTGTGTCTTGATTACGCCGCAAAATACCCGCAAACTTTGGGCTGTGTTGAAGAGATGAGCGTGACGTATATCAACCAGCGAAACATTAAAGCATGGCTGAAAAACTTTCCCGGTGCGCTGAATGATACCGGGGGATATTCCGGTGATCAAACGTGGCAGATAATTGATATGGTCCCGGTGATGAACCGGAATCTTCAATAGGTCAGTGCGGATCAGTTACTCATTTCTCTCATACGGCGAATGCACTACCCGACTGCCATCAAATAGCGCTTCGATATGCGTCAAAACAGCCACGCGTCCGCCGAATCCGGCCACGCTGTCGCTGCCCCCCAAGTCTTTCTATACTTATTTATTCCGATTTTCATAAAAAACAATAGATGATTACATGGGGGAGTAGTATGATAATAAAATCTAAATATTATTTGGGGTTTATTACAGTGTGACAAAGTTTCAGCCCATGGA [...]
+GGCGAACGACGACACCAGCGACTTTTATCCCATACTCATCGGCCCGGACGGCGCGCCGCAGGAGATGTACAGCGCGAACGGGCGGAAGGTGTGGCGGCGGCAGCGAAGCCTGTGGGGGCTGGCGGCGGCGAATGACGCGTCGCCTGACGGGCGTGAAAGCTGTGACGCGGGCTTTATGGGCCAGTGGCAGGACGAGGAGAGCGGGCTGTGGTATAATTTACACCGCTACATGGACTCACGGACGGGGCAATATTTAAGCCAGGACCCGCTGAAACTGGGCGGCGGGCTGAACACGCAGTCGTATGTGCATGATCCGGTGGGGTGGTGCGATCCGTGGGGGTTGATGGACTGTCCGTCTTCAGCGGAGGCGGAGATATTCTATCGGACTATGTCAGAAGATAATTATGCCACATTACAAAGTACAGGGCGTATGCCTGGAACAACCGAAACGACGATATCGCCAACAAGAGTGTTTTCTGAAGCATATGATGG [...]
+NODE 1949 51 6088 6063 0 0
+TGTCGCTGCCGCAGCTTCGGTGCATGGTTTAGCCCCGTTACATCTTCCGCG
+ACTGTGTGTTGTTGGGTAGGGGAGCGTTCTGTAAGCCTGCGAAGGTGTCCC
+NODE 1950 33 3498 3063 0 0
+TGCGAAACGCAGACCGTCGTCCATTGCGATCGG
+TACCGTTGGCGCGGGCGTTGTTGCTAAAGTTCT
+NODE 1951 51 3472 3472 0 0
+GGCGTAAACCAGCGCATTTATGAGCTGCTGGATAAGACAGATATTGATGAT
+CGCTTTGATCCAAAAACTGGTTAAACGCATCGGCAGTGGTTGCAAAACCAT
+NODE 1952 165 10043 10043 0 0
+CATCCGACGAAAGCTGCGCATAGGCATCGCGGATGGCGTTTTCCAGCTCCGGCTGGAAAGGAGTGTCGATAATCCACTGGCGGATCTGCGCGCCCGCTTTCGCCAGCTGGGAGACATCATCAATATCTGTCTTATCCAGCAGCTCATAAATGCGCTGGTTTACGC
+GTCTCCCAGCTGGCGAAAGCGGGCGCGCAGATCCGCCAGTGGATTATCGACACTCCTTTCCAGCCGGAGCTGGAAAACGCCATCCGCGATGCCTATGCGCAGCTTTCGTCGGATGATGAAAATGCCTCTTTTGCCGTGCGTTCCTCCGCCACGGCGGAAGATATG
+NODE 1953 16 5061 3252 0 0
+AGCAAGCTGCTTCCTG
+TCTGGGAAACTGCCTG
+NODE 1954 51 2363 2363 0 0
+TATTGATTGTCGGTTTAAGCGCGATGAACGGTTTCGAACGCGAGTTGAATA
+ACCGCCACGCCCAGCGCGATACCGATGGTAGAAATGACGGAAATGAGCGAA
+NODE 1955 51 2597 2021 0 0
+CAAGATGGCATCAGGATGTACAGGCGGTTAAAGCGTACCTTTAACCGCCAT
+GCTTTGTCCATCCCATACTTATCACTTTTACGTTCCGTGCTCTTTTTGCCT
+NODE 1956 545 27589 25871 0 0
+CCACGTCTTTGCCCCACAGCGGACGATGCTGGAACAGATAGTTAATGGCGACCGCCAGATAATGGTTCGGGTTCATCAGCCCTGCAGGCGTCACGATGCCATGACGGTCGTAGTCCGGGTCGTTGGCGAAGGCCAGGTCAAACTTGTCACGCAGCGCCAGCAAACCCGCCATCGCACATTCGGAGGAGCAATCCATACGGATCGCGCCATCTTTATCAAGGTGCATAAAGCGGAAGGTTTGATCAACCTGATCGTTAACTAACGTCAGGTTAAGTTTGTAATGCTCAGCGATACGTTTCCAGTATTCAATACCGGAGCCGCCCAGCGGATCAACGCCCAGCGTCAGACCGGCTTTCTGAATCGCCGCCATATCAACGATATCCGCCAGCCCTTCGACAAATGGCTGCACCAGATCTACCGCTTTAACGTGGCCCGAGGCCATTGCCGCATCCAGAGAGATGCGCTTAACGCCTTGCAGGCCGCCCGCCAGCA [...]
+CGCTGCTGGCGGGCGGCCTGCAAGGCGTTAAGCGCATCTCTCTGGATGCGGCAATGGCCTCGGGCCACGTTAAAGCGGTAGATCTGGTGCAGCCATTTGTCGAAGGGCTGGCGGATATCGTTGATATGGCGGCGATTCAGAAAGCCGGTCTGACGCTGGGCGTTGATCCGCTGGGCGGCTCCGGTATTGAATACTGGAAACGTATCGCTGAGCATTACAAACTTAACCTGACGTTAGTTAACGATCAGGTTGATCAAACCTTCCGCTTTATGCACCTTGATAAAGATGGCGCGATCCGTATGGATTGCTCCTCCGAATGTGCGATGGCGGGTTTGCTGGCGCTGCGTGACAAGTTTGACCTGGCCTTCGCCAACGACCCGGACTACGACCGTCATGGCATCGTGACGCCTGCAGGGCTGATGAACCCGAACCATTATCTGGCGGTCGCCATTAACTATCTGTTCCAGCATCGTCCGCTGTGGGGCAAAGACG [...]
+NODE 1957 145 5294 4959 0 0
+ACCGTCGCACTTGGTCATATGACCTTTGGCCGCGTTGTACTGCGGCGCGCCATACGGGCAGGCCATGTGGCAGTAGCGGCAGCCGATACAGACCTCTTCGTTCACCACCACAAAACCGTCATCGCGCTTGTGCATCGCGCCGCTC
+AGGTCTGTATCGGCTGCCGCTACTGCCACATGGCCTGCCCGTATGGCGCGCCGCAGTACAACGCGGCCAAAGGTCATATGACCAAGTGCGACGGTTGTTATGACCGGGTGGCGGAAGGCAAGAAACCGATTTGCGTGGAATCCTG
+NODE 1958 43 2021 2021 0 0
+TAAATATTCTCTTCATATACACTCCACCACCATTTCAATGTCA
+ATTATTACTTTGCGCATTCGCATGTTCTGCTAATGATAATGTT
+NODE 1959 51 3298 1745 0 0
+ACAAATCCCCGCCGTTTATACGCCGGGGATTTGTTATTTGTTTTAACTTTT
+TTTAATGGTTCCCTCGTTGAATCAGTTCTATTTTGCTATATAGCGCATCCA
+NODE 1960 347 19837 19452 0 0
+CAAACCTGGCCTGGCGCCTGCCAGATAACCATGCCAGACATCGCCGCGACGTCCTGGCAGGTCATAGCGACGCTCATTCCCTCGGGAATCAAAAACGCACAGCTCTACGCGCTCCGCATGGGCGGAAAAGAGCGTGAAATTCACGCCATGACCGTCATACGTTGCGCCATGCGGCGTTGCTTCGCCGATCGCAAGCTGCGTCATTCCCCCTCCCGCATCAGCCAGATCGTCGCCAACGGCGGTAACGTCAGGTTAAGAGAGTGCTGACGGCCATGGCTTTCGATCTCATCGCTGTGCACCACGCCGCCATTGCCGGTGTTGCTACCGTGATAATGCATCGAATCAGT
+GCACAGCGATGAGATCGAAAGCCATGGCCGTCAGCACTCTCTTAACCTGACGTTACCGCCGTTGGCGACGATCTGGCTGATGCGGGAGGGGGAATGACGCAGCTTGCGATCGGCGAAGCAACGCCGCATGGCGCAACGTATGACGGTCATGGCGTGAATTTCACGCTCTTTTCCGCCCATGCGGAGCGCGTAGAGCTGTGCGTTTTTGATTCCCGAGGGAATGAGCGTCGCTATGACCTGCCAGGACGTCGCGGCGATGTCTGGCATGGTTATCTGGCAGGCGCCAGGCCAGGTTTGCGCTATGGCTATCGCGTACATGGCCCGTGGCAGCCAGCGCAGGGGCATCG
+NODE 1961 28 4374 4374 0 0
+GCGCAGGCCAGGCCATCATGCTGCTGGT
+CTGAAGCAGGGCGTTCAGACTTTCCATT
+NODE 1962 38 4481 4481 0 0
+ACCGCCAGCTGCCCGGCGTCGTGATGCGCCAGCAGGCT
+GCTTAACTGCGCGCCGGACGTGCACGCCATTAAAGAGG
+NODE 1963 2478 124420 120916 0 0
+TATTTTTAATCATATGCCACTGTTCTTCCAGCGGCATCATTCCCTTTGAGGAGGTTAATGCGTGCTGCGGTTCGTACACGGTCAGACGGCCGCGACCGCTATTTTTCGCGGCGTAGCAGGCTATATCGGCCTGAGACACGACCTCTGTGAGCTGGCAGTTATGTTCATTTATCATTGTGATCCCGGCGCTGGCGCCGATCCGATGCAGGCGTCCTTCCCACATAAAGTGATATTCATTAACGGCGTTGATAAGCCGCGTCACGATAAAACGCGCGCTGTCACTATTACAATCCGGCAGCAACAGGCCAAACTCATCGCCACCCAGACGGGCCAGAAGATCGCCGGATCGAAGCATACTGAGCATCAGTGACGCGAGCTCGCGCAATAAGGCATCGCCGGCGGCATGTCCCGCGCTGTCGTTAACCGCTTTAAAACGGTCCAGATCGATAAACACCAGCGCATGATGTTGAGGCGATTCCTGTATTGTTTGCA [...]
+GGCAGCGGTTTTATCGACCCGTCTGGAGGAGGAATACGCCGGGAGCCACAATTTATATTCAGCCAGCGTATAAATCATTACGCGTTTATACTAGCATAATCACAGAGTAAACTGACGCGTCCGGTATTCCGCGACGTTACCGGCGATTCGGATAGAGTGGTAATGAGTAAACCATCCCAACATGTTTTCGTTACCGTCCCCCACCCGCTATTGCGTCTGGTCAGTTTAGGCCTGGTCGCGTTTGTCTTTACGCTCTTTTCGCTCGTATTATCGCGTGTCGGCACCCAACTCGCGCCGCTGTGGTTCCCCACCTCCATTATGATGGTCGCGTTTTACCGCCATGCGGGCCGTCTGTGGCCAGGGATCGCGGTCGCCTGCTCGCTCGGCAGCATCGGCGCCTCACTGACTTTATTTCCTGCCGCCTCGCTTAACTTTAGCTGGACGGCAATAAATATTATCGAGGCGGCCACTGGCGCGATACTGCTGCGAAAA [...]
+NODE 1964 45 63 63 0 0
+TTGCAACCTCAGCTCCACTTCATCGTAGGTAAACGAGGAGCAGCG
+CGCTGGCTTTCGGCGCTACCACCACCAGGCTATTGCCAAGCAATG
+NODE 1965 50 3242 3242 0 0
+CCTGCGGCAAGTTACGCAAAATCCAGCTACGAATGCCGGTGGCGGAGATA
+GCGTGGCCCACGGAACCGGTATCGGTATTGGCCTGTTTTTGTTGCTGATT
+NODE 1966 1099 59243 57832 0 0
+GAGGTGCCGCGTTGCGTATACACCAGTTTCGGCTCCGGATAATGTCTATCGAGCTTGAGGTTCGCCTGGGCGAGATTTTCCCGCAGACGGCGCATCACGGCCTGCTGGATAGCGATAGGGAGACGAGGGGTTTTCATAGCGGCAGAGAATAGTGCGACGGAAGAGGGACTGCAAGAAAAACGCTTCCTCCTGTGGCAGGAGGAAGCGTGGAGGGATTAGTCGTGGGCGCCGATTTCGCGCAGTTTACGACCTTTCATCAGGTTACGTTCAATGTGTTCCAGCGAAACGTGTTTGGTTTCCGGCACCAGCCACAGGGTCAGCAGGATAAACAGCACGTTCAGGCCAGCGTAGACCCAGAAGGTGTTGGCGTTACCCAGATTGTTCAGCATGGTCAGGAACGTTGCGCCGACGATCATATTGGCGATCCAGTTGGTCGCGGTGGAGCAGGTGATGCCGAAATCGCGGCCTTTCAGCGGCTGGATTTCGGAGCAC [...]
+GTCTTCTTCCTACCGGACAGCCCGCGCTGGTTTGCGGCAAAACGCCGCTTCCATGATGCTGAACGCGTCCTGTTGCGCCTGCGTGACACCAGTGCGGAAGCAAAACGTGAGCTCGATGAAATTCGCGAAAGTTTGCAGGTTAAACAGAGCGGTTGGGCGCTGTTCAAAGAGAACAGCAACTTCCGCCGCGCCGTGTTTCTTGGCATTTTGTTGCAGGTCATGCAGCAATTTACCGGGATGAACGTCATCATGTATTACGCACCGAAAATCTTCGAACTGGCGGGGTACACGAATACCACGGAGCAGATGTGGGGCACCGTTATTGTTGGTCTGACTAACGTGCTGGCAACCTTCATCGCTATCGGCCTGGTTGACCGCTGGGGCCGCAAGCCGACCCTGACGCTGGGCTTCCTGGTCATGGCGATTGGTATGGGGATTCTGGGTACGATGATGCACATCGGCATCCATTCGCCGTCTGCGCAATACTTCGCT [...]
+NODE 1967 50 4649 4649 0 0
+TGGCGATCTCCTACAGACTTTGTAAGAGATCTCTCACACCCGTTAGGGCA
+GGATATCAGCGGATACTGAGTTCCGTTTTCTTATGTAAGTCTATATAAAA
+NODE 1968 51 2234 1544 0 0
+TAATTTCTGGGACGATGAGACATTGCAGCGGCGTCTGGCCCCTCGCCTGGA
+ACCTTCCGGCACCGCCCACTGCATCTCCTCTTCCAGCCACTGACGCCAGCC
+NODE 1969 51 2897 2897 0 0
+AGCGGCGGCAGAATATTGTCGATGTATTCATCGGTATTCTGGCGAATTTTC
+TGACAAAAGCACTGTTCAAATATGTGCGCGAAGGGAAATATACTTTCTGTA
+NODE 1970 51 3719 3719 0 0
+ACTCCCGCCTTTGCGGCGTCATTTTCGACTGGGATAAATATAACCTTGAGC
+TTATTTTCAATCAGCTTCAGCAGGTCTTCTCGGTCGTTTGGATAGACGATA
+NODE 1971 1626 79551 78323 0 0
+CCTCTCTATTGCTTGTAACCATTGCGATGAGCCGGTATGTGTCTCCGGCTGTCCGACCGGGGCGATGCATAAACGCAAAGAAGATGGTCTGGTCGTGGTGGATGACAGCGTATGCGTCGGCTGTCGCTATTGTGAAATGCGTTGCCCCTACGGCGCGCCGCAGTTTGATACGCAGGCGAACGTGATGCGTAAATGCGACGGTTGTCTTGACCGACTGGAGAACAATCTGCGCCCTATTTGTGTGGATTCTTGCCCGCAGCGAGCGCTGGATTTTGGCCCTGTCGATGAATTACGGGCAAAATATGGCACGGAGAATCAAATTGCGCCGCTGCCTTCGGCGTCGTTCACCCATCCTAACCTCATTATTAAACCGCATCCGAAAGCGAGACCCACAGGTGATACGGAAGGCGCAATCATGAACATTCGGGAGGTGCGCCATGCATGAGTTACCGCTGGTCTTTTTTACGGTCTTTACCCAGAGCGCGGTCGGCG [...]
+GGCGGTGGTTTCCCCCATCAGCAAATTATCTTTTTCCAGATAGACCGATCCCCAGGGCGGGACGGGCATCTTTCCCTGGCCTTCAAACAACACAGAAAATTGCCATGTAAGCGCATCATCATCCGGTAGCGACCATGACGCACACAGTGATTCAATAGGTCCGCGATCGCGCCAGGGGTAAAGCTCAGGCAACGTTGGCAAACAACCGAACAACGCTTTCACCTCCGGCCTCGCAGGGGAGTAGTAAAACAGTGCGCCGAGGATACGCGGCAAAACAGCACGGGAAAGCATAGCAATAGCTCCTGAAATATCTCGCCTGATGACGCTACGCTGATCAGGCTTACATGGCATAAGCCGGGCAAAAACTACATTGGCAGCGTCCACAGATTGTAAAACGCAATCCTACCCGCCAACTCCGCCGCGATAACCACCACAGCCGTCATGGCCAGCACCGCAGCGCTCGATTTCAGGCGCGCGCAGACCACCACCCCG [...]
+NODE 1972 51 2840 2662 0 0
+TCCGCCGGGCGACACGCTAAAACCTCGCCAGCGGCGGGGGGATGACAATCG
+AGACAGAACAGGATGTTTTTTATAAAGTGATTATAAATCAATAGATTATTC
+NODE 1973 51 1145 1083 0 0
+ACCCGCCGTATATGGGCGGGAAAGGAATGAATGGCGAACTGAAAGAGTTTG
+TTTGCCACCACCGCATCATAACGCTGCGCCAGAATCCACGCCTGCTGGATA
+NODE 1974 689 56389 53188 0 0
+ATTTCGCCATTAAGTTTCTGCCACAATATGTCGCAAGACGTGCAAGCGTTCCACCTCACCTGATGAACGACACCACCATCAATAAGACGTTATTGCTGCAATTCAATTATTAAGAATAAAAAAAGAACCAGAAGAAAATTACAAAATAACTTATCCAGCATATTAGCTATTGTTAAAATCAAAGTAATCCCCCGTAAAAGCTGGATATTTTTATTTCTCATAGACGAGAATTTATATATTATGATATAATACGGCAGAAAAACATGCAGGTTATTAACCTGCCATTAATGTAAATAATTTTTTGAGGAGATATTTCCAGTGGGACGTAAATGGGCAAATATTGTTGCTAAGAAAACGGCTAAAGACGGTGCAACGTCTAAAGTATATGCAAAATTTGGTGTAGAAATCTATGCTGCGGCTAAACAAGGTGAACCAGACCCGGAATCAAACTCAGCTTTAAAATTCGTTATTGAACGTGCGAAACAAGCACAG [...]
+AATCGTACGGTTAACATTAGACGTCAACGTTTCAGCGATAACCATTGAACCATTGGGTCCAAAGCCTTCATAACGCCCTTGCACGAACGTTTCATCTCCGCCACCTTTGGCTTTATCAATGGCTTTATCAATAACATGTTTTGGAACCTGTGCTTGTTTCGCACGTTCAATAACGAATTTTAAAGCTGAGTTTGATTCCGGGTCTGGTTCACCTTGTTTAGCCGCAGCATAGATTTCTACACCAAATTTTGCATATACTTTAGACGTTGCACCGTCTTTAGCCGTTTTCTTAGCAACAATATTTGCCCATTTACGTCCCACTGGAAATATCTCCTCAAAAAATTATTTACATTAATGGCAGGTTAATAACCTGCATGTTTTTCTGCCGTATTATATCATAATATATAAATTCTCGTCTATGAGAAATAAAAATATCCAGCTTTTACGGGGGATTACTTTGATTTTAACAATAGCTAATATGCTGGATAAGTT [...]
+NODE 1975 98 6078 6078 0 0
+AAGCAGACGATCGCGTGACCATAGAACGCCATCAATATCAACTTGCTTCCCATAATCGTAGCTGTCATCTGGATAATCGGCATGGGCAATCACGTACT
+AAGCAAGTTGATATTGATGGCGTTCTATGGTCACGCGATCGTCTGCTTGGTTCGTTACAGGGGAATATCCATCCAATACGCGGTGCGGATACTTTTAT
+NODE 1976 416 23761 23761 0 0
+CTTTCAGGAGAAAAAAGGCCGCTCCGCCCATAATCGCCAGCGTCAGGTATTTTGGCGTGTAGCGATTTCGTTGCCGCTCAAAGGGATTGACCGGTTCGGCTATCCGTCTTATTGCCGAATGGCCTACGCCGGATGTGCTTCTGGATTTTCGTTTTTTTGCCATGATCTTCCGTTACCATGTCATACAGGCAGCGTTAAAAATACCGCCAGCCAGCGCTGCGGTTCCCATAAATAGCCCCGCCGCCACGTTGTGATTAATAATTTTTTCGCTCAGCGTAGGCATGTATAACCTTACGCAACCATAAATCAGCAGCTGAATAACCAGCGCAATGCCGCCCCAGGCAAAATAGTCCGGGATACTGACCGAGTTTATCGCCGCGCTGGATAAGGGGATGACATAGCCCAGCAACGTACCG
+CGGTCAGTATCCCGGACTATTTTGCCTGGGGCGGCATTGCGCTGGTTATTCAGCTGCTGATTTATGGTTGCGTAAGGTTATACATGCCTACGCTGAGCGAAAAAATTATTAATCACAACGTGGCGGCGGGGCTATTTATGGGAACCGCAGCGCTGGCTGGCGGTATTTTTAACGCTGCCTGTATGACATGGTAACGGAAGATCATGGCAAAAAAACGAAAATCCAGAAGCACATCCGGCGTAGGCCATTCGGCAATAAGACGGATAGCCGAACCGGTCAATCCCTTTGAGCGGCAACGAAATCGCTACACGCCAAAATACCTGACGCTGGCGATTATGGGCGGAGCGGCCTTTTTTCTCCTGAAAGGGTACGGTGACGGCAGCAATAGTGACAACGACGGCGATGGGACGTTTTAC
+NODE 1977 42 2640 2640 0 0
+AGTTGATAAAAAATAACAATACTGCGGCATCGCTGGCCTTTA
+TTATGCGGCGTTATCTTTGAGTAAATAAAAAGAAATACAATG
+NODE 1978 34 1843 1836 0 0
+TGAACGTGGCGGGATGCCGGTTCGTCAAAGGTAG
+ATCGAGAAGGCGAAACGTCTGGTTGAACACAAGA
+NODE 1979 1791 98307 97986 0 0
+GCCATTGCACAGCCCATAAAGGAACAGCGAGCGCGCCAGACGATGCTTGAGGCTACCGGTGGGATGCGTGCTTTCGTCTTTCAGGTAAAGCTGGATACCTGGAAATGCCGACAGGGGCAAACGAATAAGATGCGTATCCGCCGAGCGCTGGTGGTCAGCGTTAATTTCATTAATGGCATTTTTAACCCAATTGCTACTCATCATTAATATCCATTTATCATTTTGTGCCAAGAGTAGCGAAAAGTACGGAAAAAATTGTTGCTATTTGACCTTTAAATTACAATGTAAGGAGAAAAATATTCTCTATGGAGTGGGTATGTTAGATAAAATTGACCGTAAACTGCTTTGCTTATTGCAGCAGGACTGTACCCTCTCTTTGCAGGCGCTGGCGGATGCCGTTAATCTGACGACAACGCCTTGCTGGAAGCGGCTTAAACGCCTGGAAGATGACGGTATCCTGCTTGGCAGGGTCGCGCTGCTGGACCCGGAAAA [...]
+CTGTATGCGGCGCTACCCCGCTCCACGATATTAAACATCCAGGCCAGCGCCAGCATCGGCCAAATCATCAACCCCAGATACATCATAAAGCTGGTGAGTTCGCCCAGCGTCAGGCTGCCGTTAACCACCATCCAGCTTCCGCCGCTAATCGCGAGCAGGTTCGCCATGCCAATGGCGATGTAAATGGTTGGATCAAAACGCGCGTCAATACGCGCCACGCGCATATTTTTCTTGCCGGTATCTTCGGCATCCGCCGCAAACAGCGAAGACTGGCGGTCCTCCAGACCAAACGCTTTGATCATGCGGATGCTGGTCAGACTCTCCTGCGTGCGGTCGTTCAGGCTGGAAAAGGCAGCCTGCGCCAGTTTGAAATAATCATGCAGCCGATCGCCGTAACGTTTGATCATCAGCGCCATAATCGGCATCGGCAACAGCGCTAATAGCGTTAGCTGCCAGCTAATTTGCGTCGACATAACAATCAGTACCGCGCAG [...]
+NODE 1980 3605 181565 180107 0 0
+GACGATAATACCCTGCCGCTTTAGGTAGGGTATTCCTGTTGAGTTTTATTGCGGAATATATTTGATGAATAACACATGGAAAAGTGTTCTTTGCCCAATAGCGTGCGGAGTGGGAATGCTTCTAAGCGCCTCCCCTTATAGCGCGTCAGGCAAAGACATCGAATTTAATACCGATTTCCTCGATGTAAAAAATCGCGATAACGTTAACATTGCACAGTTTTCTCGTAAGGGTTTTATTCTGCCAGGCGTCTACCTCTTACAAATTAAAATTAACGGACAGACTCTGCCGCAGGAATTTCCTGTTAACTGGGTTATACCAGAACATGATCCACAAGGAAGCGAGGTTTGCGCAGAACCAGAATTAGTTACGCAATTGGGTATAAAACCGGAACTCGCGGAAAAACTCGTCTGGATAACGCACGGTGAACGACAATGTCTGGCGCCAGATTCACTGAAGGGCATGGATTTTCAGGCCGACCTGGGACACTCCAC [...]
+GCACAGGATTACTTATTCGCTTTCTTCTCAGCGTCACGGGTTTTCTCCTCATTGACCTTGCAGGTATTCCCTGAGCAGGTGAAAACCAGCAGGCGATGGCCGCCGTAATCATCGACGTAGCCCACCACCGGCGAACTGCCGAGCGAGGCACCTTTGATGGGAGAGGTCACTTTTTCACGCGGGGCAATCAGCAGGTTTTTAAAGCCGGAGGCGGTTTCGTTCTCTTTGCTACCGGCATTGCTGATGACGAGGTAAAACGGTGTGGGGTTGTCGAAGATCACGCCATCGCCCTGGTAGGTCAGCGTGAGCTTCGTTTGCCACGGGTGCGTCTTATCCACCTGCCGGGCGACGGCTACCGGGCGGTAGAAAAACTTAATACGCGTTTGCAGCGCCAGCTGGAGCGTATTAGGCTTATCGCTTTTCGGCGGAATTTCCCGCACGTTGAAATAAAACAGACTTTCCCGGTCCTGCGGTAGGCTAGCCGCGGCTGGT [...]
+NODE 1981 46 19478 19366 0 0
+ACGTCAAGTCATCATGGCCCTTACGACCAGGGCTACACACGTGCTA
+CCCACCTTCCTCCAGTTTATCACTGGCAGTCTCCTTTGAGTTCCCG
+NODE 1982 780 32244 32087 0 0
+CGGACAGACTCGGGGCTTTCCGGAAGTGCAGATGATGTGTCGCTCATTTTTTTTCCTCTGATGGGAATTTTTGTAGGGTACTACGGTTGCCCGGTAGCGCTACGCTTACCGGGCCAGGCTTAATAGACGCCGGACGCACCGGACAGTTTTTTTTCTGCGCCAAAGCGCGCCGCCAGCGCCTCCGCGCCGCGCGCCAGCAGCGTGGTGTCAACGCCGACGGCGACAAATAGCGCCCCCAGTTCCAGATAACGTTTCGCCAGTGCTTCATTGGCCATCAGAATCCCCGGCGCTTTCCCCACCGCGCGTATCTGCACGATGGCGTTCTCAATCGCCGCCTGCACTTCCGGGTGCTGCGGATTGCCGGCAAAGCCCATATCGGCGCTGAGGTCCGCCGGGCCGATAAACACGCCGTCAATGCCATCCACGTCGAGAATTGACGCCAGATTGCTCATCGCCTCACGCGTTTCAATCTGCACCAGTACGCACATGGCG [...]
+CGCCTTATCCCAGCCAGCCGGTGGTGCGTCCGTCATGGAACGATCCGGTACAGATTAAGCAACTGCTCGACGTCGGCGCGCAAACGCTGCTGATACCGATGGTGCAGAATGCCGATGAAGCGCGAAACGCCGTGGCGGCTACGCGTTATCCGCCTGCCGGTATTCGCGGCGTGGGCAGCGCGCTGGCGCGGGCATCGCGCTGGAACCGCATTCCGGACTATCTCCACCAGGCCAACGACGCCATGTGCGTACTGGTGCAGATTGAAACGCGTGAGGCGATGAGCAATCTGGCGTCAATTCTCGACGTGGATGGCATTGACGGCGTGTTTATCGGCCCGGCGGACCTCAGCGCCGATATGGGCTTTGCCGGCAATCCGCAGCACCCGGAAGTGCAGGCGGCGATTGAGAACGCCATCGTGCAGATACGCGCGGTGGGGAAAGCGCCGGGGATTCTGATGGCCAATGAAGCACTGGCGAAACGTTATCTGGAAC [...]
+NODE 1983 12 594 580 0 0
+TCGCCCCAAGCA
+ACCATGCCGCCG
+NODE 1984 109 6261 6261 0 0
+GCCCTGGATTACGTCCCGGTGCAGCGTAATGGTGCGCTAAATCAGGACTGAATAACCGGAAGACTCTGTTCCCTTTTACACCACGCCTGCCTTGTGCAGGCGTTTTTTT
+CCGGTTATTCAGTCCTGATTTAGCGCACCATTACGCTGCACCGGGACGTAATCCAGGGCCTGCAGCAACTGCTCATCTGTCAGATCCAGAAAATCTTTGATTTCCTCCA
+NODE 1985 12 1827 1813 0 0
+ACGCCACCTCGC
+CAGGATTTTTCT
+NODE 1986 43 5476 5395 0 0
+AACGGTGAGCGAAAGCCGCGTTGCACTGCTCTTTAACAATTTA
+GGCGTATATTACGCTTTCCTCTTTCAGAGTCAACCCTGAATTT
+NODE 1987 51 3150 3150 0 0
+CATCAGCGCGCATCGTTTATCCGCGCTGACCGACGCCAATGAAATTATCGT
+GATGACCGTACGCCCTTCGCCCCACTGGCGCAAATTATGCAAAATCTGATG
+NODE 1988 110 5771 5771 0 0
+ACTGCGTGCTGAGATCGGCAGTATTCGGCAAAACGGTGGAGTGAGCGGGAACAAGGAGGACGTCGTCAAACGTCAGGGCTTCTTTAGCGATACGTAGCATGGGCAATATC
+TCCTCCTTGTTCCCGCTCACTCCACCGTTTTGCCGAATACTGCCGATCTCAGCACGCAGTTGACGAAAACTATTCGTCTGAATATTCCTATGCTTTCTGCGGCGATGGAC
+NODE 1989 27 1336 1202 0 0
+TAAATTAGAGAGCTTCGTAACCGAGTT
+ACCCGCCATCAAACGCTGGTAGTAACG
+NODE 1990 702 41813 41681 0 0
+CCAACATGCTATTTGGTCGTCTGGAAGTATTCACTTTGCTGGTACTTTTTACCCCGACTTTCTGGCGTGAATAATGGAGTAACACGTGAAAACATTGATTCTTTTCTCTACCCGGGACGGACAAACGCGCGAAATTGCCTCTTATCTGGCTTCTGAACTCAAAGAGATGGGGATCTGGGCCGATGTCGTTAATCTGCATCGCGCAGAAGAACCGGACTGGGATTGCTATGATCGCGTAGTGATTGGCGCGTCTATTCGTTATGGCCATTACCACAGCGCCTTTCAGGAGTTCGTTAAGAAATACGCCACGCGGTTGAACGGAATGCCGAGCGCCTTTTATTCCGTTAACCTGGTGGCGCGTAAAGCTGAAAAACGGACGCCGCAGACTAACAGCTATGCGCGTAAGTTTTTAATGAGCTCTCCGTGGCGACCTGACTACTGTGCCGTCATTGCAGGCGCGCTTCGCTATCCCCGCTATCGCTGGTATGACCG [...]
+CGCACTTTTTATTCTTTGCGTTTATTTTGCCGACGATTTGTTGGTTAAATGGGCTATTTCACGGGCAAAGTGCGCAACCTGCTCCCAGTCGGTGTACACCACTTCTTTACTGGTATCCGTTTCGCCGCCCGACATCTTCATAATAAGCTTGATCATCAGACGGTCATACCAGCGATAGCGGGGATAGCGAAGCGCGCCTGCAATGACGGCACAGTAGTCAGGTCGCCACGGAGAGCTCATTAAAAACTTACGCGCATAGCTGTTAGTCTGCGGCGTCCGTTTTTCAGCTTTACGCGCCACCAGGTTAACGGAATAAAAGGCGCTCGGCATTCCGTTCAACCGCGTGGCGTATTTCTTAACGAACTCCTGAAAGGCGCTGTGGTAATGGCCATAACGAATAGACGCGCCAATCACTACGCGATCATAGCAATCCCAGTCCGGTTCTTCTGCGCGATGCAGATTAACGACATCGGCCCAGATCCCCATCTCTTT [...]
+NODE 1991 51 2032 1985 0 0
+TGAAGATATAGCCCTGCTGCGTATGCTCATCGAAGATGACGGCCCGCCTGC
+ACACCCGTTTCCCCCGGCGCACGCCGCCTGCGTCTGTCCGCTATCAAAGAC
+NODE 1992 26 55 55 0 0
+AGGGGATCGAAGATGATTAGATACCA
+GCATTTACCAAGGATGTTTTCATTAA
+NODE 1993 52 875 875 0 0
+GGACTCCGCCAATCCCTTGTCGGCATAGTTTATGGTTAAGACTACGATGGTA
+CCTTTAATAGCTCCGTCAGCACCTTATGAGAAATCACAAGTCTTTGGGTTCC
+NODE 1994 14 491 491 0 0
+CGCCGCTAGCGGCG
+GCTACGTGTACGCT
+NODE 1995 1 188 105 0 0
+T
+T
+NODE 1996 1906 96394 93595 0 0
+GCGTTCCCAATCGAACGCCAGATCGTTATCGCGCGCCGCTTCCAGCGTGACCGGCGGCGTGCGCGGTTTTTTGCGGGCGTGCTGAATACGCACGGTTTCGTACTCTTTGCGGGTACGGGCGACAAAGTCATCGCGCTGGTTGTCGGAGAGTAGCGCCGCCACCACGCCCACGGTACGCGAAGCATTCTGCACGTAGACCGTCGGACCGCTGTAGTTCTGCTCGATTTTCACCGCGGTGTGCGCTTTCGAAGTGGTTGCGCCGCCGATCAGTAGCGGGATAGTAAAGCCCTGACGCTCCATCTCTTTCGCCACGTTGACCATTTCGTCCAGCGACGGGGTGATAAGCCCGGAAAGGCCAATCAGATCGGCATTCACTTCACGCGCCGTTCTGAGGATTTTCTCCGCAGGCACCATCACGCCAAGATCGACGATTTCGTAGTTGTTACATTGCAGCACCACGCCAACAATGTTCTTGCCAATGTCGTGCACATC [...]
+GCTTCCTGAATATCGTTGGCGGCTGCTGTGGCACTACGCCGGAGCATATCGCCGCCATGAGCCGCGCCGTTGCCGGTTTGCCGCCGCGCCAGCTGCCGGATATCCCGGTCGCCTGCCGCCTTTCCGGCCTGGAGCCGCTGAACATTGGCGACGATAGCCTGTTTGTCAACGTCGGCGAACGTACTAACGTCACCGGCTCGGCCAAATTTAAACGGCTGATCAAAGAAGAGAAATACAGCGAAGCGCTGGATGTCGCCCGTCAGCAGGTCGAAAGCGGCGCGCAGATTATTGATATCAACATGGATGAGGGGATGCTCGACGCCGAAGCGGCGATGGTGCGTTTCCTCAGCCTGATTGCCGGTGAGCCGGATATTGCCCGTGTACCAATCATGATCGACTCCTCCAAATGGGAGGTTATCGAAAAAGGGCTGAAGTGCATTCAGGGTAAAGGCATCGTCAACTCTATTTCGATGAAAGAGGGCGTGGAAGCCT [...]
+NODE 1997 3267 185915 183311 0 0
+TATTAACCGGCGAGCGTCACTACACGCGTAACGATGATATCCGTCAGGCGATACTGGCTCTGGGCGCGCCGGGAACCTTCATGACGCAGGATGTGAACATTATCCAGAGCCAGATTGAGCGTTTGCCGTGGATTAAACAGGCCAGCGTCAGAAAACAGTGGCCTGATGAATTGAAGATTCATCTGGTTGAATATGTGCCGATTGCGCGTTGGAATGATCAACATATGGTCGATGCTGAAGGGAACACCTTCAGCGTGCCGTCAGACCGCATCGGCAAACAGGTTTTACCCATGTTGTATGGCCCGGAAGGCAGCGCGAGTGAAGTGTTGCAGGGATACCGCGAGATGGGGCAGGTGCTGGCTAAGGATAAATTCACTCTAAAGGAAGCGGCGATGACCGCACGTCGCTCCTGGCAATTGACGCTTAATAACGGCATTAAGCTCAATCTCGGCAGGGGCGATACGATGAAAAGGTTGGCTCGCTTTGTAGAAC [...]
+GTATAATCTCGCCAAATTACCTATCCAACCGAAGTGTACTATACATTCGGCGGGCCAGTTTAGCACAAAGAGCCCAGAATCCCAAATTCCAGCTAATTCTTAATCAGCTTGCTTACGCAGGAATGCGGGGATATCCAGATAATCCGGCTCTTTCGCCGCCTGTGGTGTATTGTCGTTAACCACTTTCGCGACCGTTTTTTGCTCCTGCGTCAGCGGCGCCATACCGTGCTGCTGATAACGATCCAACACCGGCTGCTGCACCTGTTTATTGGTGACCAGGGTGATTTCCGGACGTTTGTCCATACCAATACCGGTCGCCACTACCGTCACGCGCAGTTCATCATTCATATCCGGGTCCAGAGAGGTACCGATAACCACGGTGGCGTTATCCGACGCAAACGCGCGAATAGTGTTACCGACGGTTTCGAACTCATCCAGACGCAGGTCGAAGCCCGCAGTAATGTTGACCAACACGCCGCGCGCGCCGGACAG [...]
+NODE 1998 72 3913 3878 0 0
+CACCAGCTCATACGCCGCCATCGGAGTGAGAATGCCGGACATATCCTTGATGGCAATCGAGTCGACGCCGGT
+GATGGCGGCGTATGAGCTGGTGAGCGAAATCAAAAAACGTTTTGAGGTGCGCCTGCACCTGCACTGTCACGC
+NODE 1999 72 3410 3410 0 0
+CTCTAACAGCTGTTCGGTTAAGTCCAGCCAGGTCTGCAGCGTGTGCGCCGGGCTGGTGGTGTAACTCAGGGT
+CTTAACCGAACAGCTGTTAGAGACCGGCGTCGACTCGATTGCCATCAAGGATATGTCCGGCATTCTCACTCC
+NODE 2000 87 4580 4580 0 0
+TTACGCCGACGACGTGGTGGAACGCTTCGTCGAACGCGCGGTGAAAAACGGCATGGACGTGTTCCGCGTCTTCGATGCCATGAACGA
+GCGTTCGACGAAGCGTTCCACCACGTCGTCGGCGTAATGGCGGTAGCCGAGCAGGTTCTGGCCGCGCAGCAGCATCTGCAGCGGGGT
+NODE 2001 111 8677 6557 0 0
+CCCGCGCAATATGAAAGCCGCCCTGCAGGCGGTGCGCAGCCACGGCGCGCACGCCCAGGGGACCCTGAGTTACACCACCAGCCCGGCGCACACGCTGCAGACCTGGCTGGA
+CCCCTGGGCGTGCGCGCCGTGGCTGCGCACCGCCTGCAGGGCGGCTTTCATATTGCGCGGGTCGTTCATGGCATCGAAGACGCGGAACACGTCCATGCCGTTTTTCACCGC
+NODE 2002 46 3486 3486 0 0
+ATGCAGAAAAATTTTCTCGATCAAGATTTGAACAAGAATTTAAGAA
+TCTACAAGCCTGAGATGTAAAAAATGATGCATTTTTTTCAAACTCA
+NODE 2003 11 1107 538 0 0
+TGCTGGGGGGA
+GCGTCAGCATC
+NODE 2004 58 3729 3607 0 0
+TGCGGCCAGCGCTTTTAGGGTTACATCTGTCATGCTGTTCCTTCCTGCTACAGTTTAT
+TGGCCGCAGAGAGACAGGTTTCCGTGGATCGCCTGGTACAGCAGTTTGCTGATGCAGG
+NODE 2005 182 6089 6089 0 0
+CGCCTTGACGATATGCTGCCGATTGCCGCTCAGCTTGACGATGTCGGCTACGGCTCGCTGGAGTGCTGGGGCGGTGCGACCTTTGACGCCTGCATCCGTTTCCTCGGCGAAGACCCGTGGGTTCGCCTGCGTGAACTCAAAAAAGCCATGCCCAAAACCCCGCTGCAGATGCTGCTGCGCGG
+ACGCAGGCGAACCCACGGGTCTTCGCCGAGGAAACGGATGCAGGCGTCAAAGGTCGCACCGCCCCAGCACTCCAGCGAGCCGTAGCCGACATCGTCAAGCTGAGCGGCAATCGGCAGCATATCGTCAAGGCGCAGGCGGGTGGCGAACAGAGACTGGTGGGCGTCACGCAGGACGACGTCGG
+NODE 2006 24 2207 2187 0 0
+CCAGAACCTGCTCGGCTACCGCCA
+TTTGGGCATGGCTTTTTTGAGTTC
+NODE 2007 51 1977 1977 0 0
+GCCCGCGTCTCCAAAGCCGATGGCTCGCAGTCTCTCGACCTGCAGCACGAC
+CATATCCGATCAGCATGTATCACAAACGTTGGTTTGAGGCGGCGCTTCGGC
+NODE 2008 84 3958 3688 0 0
+ATTTCTTCGAGTTTGCGGTTCACCGCGACGGTATTGGGGTATCGCCAAGCGGTAAGGCACCGGTTTTTGATACCGGCATTCCCT
+ATACCGTCGCGGTGAACCGCAAACTCGAAGAAATATGGCTGGGGTACCTGGATTCGAACCAGGGAATGCCGGTATCAAAAACCG
+NODE 2009 575 32651 32484 0 0
+ACCAAATAAATACATGGTTCCCAGGGTAATCACCAACGGGTTTACGCCGGTATAAATAATAAGTCCGGCATTTATCAGCCCACATATTGCGCCGAGTAGTAGGGTAATAATAATCGCTAAAGGTAGCGGCATACCGAGCTGAAACAGCACACCCAGGGTAATCGCGCATAGCCCGATTGTAGAACCAAATGAAATATCCATACCACCGCTGACAATAACCATTGTTAGCGGCAAAGCGACAATACCGATACAAATAAAATCGCTAGTGCTAAAAAGTAAGACATTAATATCTAATAAACGTGGATTAATCAGACCGAAAGCCAGAATTTCAAAGATCAATAAGGCTGCCAGCGCAATTTCCCAGCTATAGCGTCGCCATGGATTCATTATGCCACCTCTTTGTTTTTATTCTGTTGTGCGTGCGTTTTTGCTTCCGTCTGTAGTGGAGTGGGTGGTGATATAAAACGGGCATATTTCTGGCGGCGCAGATTG [...]
+ATTCGATGGGCGGCTGCGTTGTGCATTACAACGCAATCTGCGCCGCCAGAAATATGCCCGTTTTATATCACCACCCACTCCACTACAGACGGAAGCAAAAACGCACGCACAACAGAATAAAAACAAAGAGGTGGCATAATGAATCCATGGCGACGCTATAGCTGGGAAATTGCGCTGGCAGCCTTATTGATCTTTGAAATTCTGGCTTTCGGTCTGATTAATCCACGTTTATTAGATATTAATGTCTTACTTTTTAGCACTAGCGATTTTATTTGTATCGGTATTGTCGCTTTGCCGCTAACAATGGTTATTGTCAGCGGTGGTATGGATATTTCATTTGGTTCTACAATCGGGCTATGCGCGATTACCCTGGGTGTGCTGTTTCAGCTCGGTATGCCGCTACCTTTAGCGATTATTATTACCCTACTACTCGGCGCAATATGTGGGCTGATAAATGCCGGACTTATTATTTATACCGGCGTAAACCCGTTG [...]
+NODE 2010 949 54835 50499 0 0
+GGTTCATACCAATACATGTATGAAAGGTACAACGCAGGATAACTGGGAGACAGCAGGCGCTATTGCTGGCGGCGCTGCGGCGGTAGCAGGGTTGACGATGGGTATCATTGCGCTTTCTAAATGATACATGCAGGCGCGGCAATGCCGCGCTTTCAGTAATAATATAAAGGTCGTAAGGATACTCAGCGACGTAATCTATTCAGCCTATCCCCCGAAAGTTAACACGATAAAACGCTCTCTTTTCTTACTCGCCCATCCCGATGGTATTTATTCTATTCCTTGTCCGATGCAGACAAAATTGTAGCTTGATAGCATCGTAAGCCGCATTACAAACACGCTTTATACAGTAAGACTTAGAGCGTGGTCATTAGGCATAAATTATTACAGACAGTCTGGATATAAACCGGAGCATACACGTAATACATGAGGATTTTGAGCACTGTCCCAGGGCCAAACTGGCAAATAAAATAGCCTAATGGACCAGATTCTTAG [...]
+AACAAAAGGCTCAGTCGAAAGACTGGGCCTTTTGTTTTATCTGTTGTTTGTCGGTGAGTAGTCTCCTGAGGAGGACAAATCCGCCGGGAGCGGATTTGAACGTTGCGCAGCAACGGCCCGTAGGGTGGTGGGCAGGACGCCCGCCATAAACTGCCAGACATCAAATAAAGCAAAGGGCCCAATCGAAAGACTGGGCCTTTTTGCATTTATCTCTCTATGGAAAAAGTTATCGGATAATGACGCCGACGCGTTTTAAACATCTTCGTAGAGTGGATAAAAACCGTTTTAGTCAACGTGATTTCCCGCCATATATCCGCCTGAACCATCGAATGTGAACCGTGCTGAAGTAGATGTACAAACGGCTTTTACTTACGCCTCTAATAAGCAATAGAGATATTCGCTGAGGACTAAGAATCTGGTCCATTAGGCTATTTTATTTGCCAGTTTGGCCCTGGGACAGTGCTCAAAATCCTCATGTATTACGTGTATGCT [...]
+NODE 2011 1 113 113 0 0
+A
+A
+NODE 2012 51 2076 2076 0 0
+ACCTTAAATCGAATATCGGACAACTCATGTCTATTATTACAAATTTACGAT
+TACATTTTTATGCGACTTTTTGGTTACGCTCGGGTCTCAACCAGTCAGCAG
+NODE 2013 177 8554 8554 0 0
+TTAATAGACATATTAATGTAACAGTTTTACGATGTCCGATAATTTATAACATTTCGTACGGTTGGAAAAATGTTACTAAATGCCCGTCAGGCAGGGAGGCCGATATGCCCGTTGACTTTCTGACCACGGCACTGTTGCAAAGTTAGCGATGAGGCAGCCTTTTGTCTTATTCAAAGG
+GTGGTCAGAAAGTCAACGGGCATATCGGCCTCCCTGCCTGACGGGCATTTAGTAACATTTTTCCAACCGTACGAAATGTTATAAATTATCGGACATCGTAAAACTGTTACATTAATATGTCTATTAAATCGTAAATTTGTAATAATAGACATGAGTTGTCCGATATTCGATTTAAGG
+NODE 2014 1362 72516 72082 0 0
+AGGCGTAGTGGAAACATCGCTGAACGTTGGCGTGGTCACAATGTCTGATGCGAATGTCGAAATTCACTGCCTGATTCGCTCTCTTATCGACAGCGGTAAAGATTATGTGGTGAGTATGCTGGATTCGCTGGGCAAGCTGGCTGGCGCGAAAACCGAAGCAAAAGGCAGCTATCCGGGCTGGCAGCCCGATGCGAACTCGCCGGTCATGCACCTGGTGCGGGAAACCTATCAGCGTCTGTTCAACAAGACACCGAACATCCAGATTATCCACGCCGGCCTGGAATGCGGTCTGTTTAAGAAACCCTATCCGGATATGGACATGGTTTCTATTGGGCCTACCATTACCGGACCTCACTCTCCGGATGAGCAGGTACATATCGAAAGCGTCGGCCACTACTGGACTCTGCTGACCGAATTGCTGAAAGCGATTCCTGCGAAGTAAGAAAGCGCTAAAATGCCCGTCCCATTTCTGGACGGGCTATCAATATGGAA [...]
+ATCGATAGCGTGGTGGATTGTCTGGCAGACGCCGGACTGATTACGCCGGTTGCCTGCCTGCGTCCGGTGCTGACGCTGAAAACCTCAGGGGAGAAAAGCGCATGATCTTACTGCAACTTTCTTCTGCGCAGGGACCGGACGAGTGTTGTCTGGCGGTAAAAAAAGCGCTGGATTGTCTGACGAAAGAAGCCGCCAGAGAAAAGGTATTGCTGACACGGCTTGAAACGGAGCCGGGACGATTACCAGACACGCTGCGTTCCGCGCTGGTCTCGCTGGACGGCGAAAAAGCTATGGCTTTCAGTGAACGTTGGTGTGGCACGTTACTGTGGATTTGTACCAGCCCGTATCGCCCGCACCATGGGCGAAAAAACTGGTACGTCGGCATTGGGCGCTTTTCCGCCGACGAACAGATGCAGTCTGATGAGATTCGTTTCGAGACTTTGCGCTCTTCCGGCCCGGGTGGGCAGCACGTTAATAAAACCGACTCGGCAG [...]
+NODE 2015 768 36354 35931 0 0
+CATCATCGGTGGCGTGTGTGACGGCGAGCTCCACGCATTTGAACTCCACGGTCTGACGAAAAATCATCATATCGTGAAACTCTTCGCGGCTAAGGTGCATGATTGGGCGGGGATCGTTACTCAACATCTGCGGGGTGAAGTTTTCGCTCACGTAGCTGCCGCTGCCCTGACGCGTCACCACAATCCCCAGGTCACGAAAACGCTGTACTGCGCTGCGAACGCTGACCCGGCTGACGTTAAATGAGGCGGTCAGTTCCGCTTCTGAGGGCAAACGGCTACCCGGCGCCCAACTGCCGTCCAGCAGTTTGCTGCTTATCTGATCATAAATTTCATTTACAACATTCTGTTTTTGAATGGATTTTATGCTCAAGATGGGTATCCGTTAAGATGTCGCCGAAGTGCTTTATTATATAACAATTCTCTTTTAAGAACAAAGCGCCCGGCCGGGCGCTTTACACTGTTAATCGAAACGAATGAGTACCTTAGCAGAGA [...]
+GGCACTATCGTTCAGGTGGGGATGGGCGCCAGCCCGGTAAGCTGGCCGGTGTCAACGATGCTGGTTAAAGAACTCAACTGGGTCGGCTCATTCCGTTTTATCGGTGAGTTCATCACCGCGGTACGCTGGCTGGAAGATGGGCGCGTCGATCCTCGCCCGCTTATCAGCGCCGAGTTCCCGCCCCAGCAAATTGAAGACGCGCTGATTACCGCCACAGACAAAAATGTCTCTGCTAAGGTACTCATTCGTTTCGATTAACAGTGTAAAGCGCCCGGCCGGGCGCTTTGTTCTTAAAAGAGAATTGTTATATAATAAAGCACTTCGGCGACATCTTAACGGATACCCATCTTGAGCATAAAATCCATTCAAAAACAGAATGTTGTAAATGAAATTTATGATCAGATAAGCAGCAAACTGCTGGACGGCAGTTGGGCGCCGGGTAGCCGTTTGCCCTCAGAAGCGGAACTGACCGCCTCATTTAACGTCAGCCGG [...]
+NODE 2016 32 7503 6931 0 0
+GCCACCACTGACACGGAACAACGGCACACAGG
+TCTGCCTGACAAGAGGAAATTTAAAATAATTT
+NODE 2017 12 4495 2333 0 0
+CCGCCGGGTCAG
+TAGGGAGTTATT
+NODE 2018 48 3310 2937 0 0
+TTTAACGATCAGAAAGACGGGATGCTGCGCCAACTGGAGCAACTGTCG
+ACCAGCCGGAACCAAACTGCACTTTTCCGGCAATTCCCGGCCCCTGGA
+NODE 2019 51 3336 3336 0 0
+TAACAATTTTTTATACGGCAGACAAACCAGCTGGCAACCATACCCAGGAGG
+ACCCCTTCTACTTTGTTGCGCTCCTGTTAATCATTAGCGTGGTCTGTTCCT
+NODE 2020 608 42333 42048 0 0
+TATCCCAGTTGGCCGCCAACGAGAATAACACCAATACGATCGGCTGGAATAGACAGTGATTTACTCCAAAAATAAACACCATACGACGATCCCAGCGAACTGATAAAAGAGAGCACCAAAAAGAAAAAAGTGATCCCCCAGAATCGATAGCTACTCAGGAGATCGGCGCAGGTCCATTTTTTATCTGACATTGACGGTAAAGTAATTTCCATATTTATCCCTTGTTTTCCATAGAAAATAAGAATGTATAGAACTATTTAAATTGATAATAAATATTGATTATGTGAATAACGTTTATAGCCAATTTTAACTTAAAACGAAGGGCCATTTTATCAAATAGTTCTATTCTTTTTCAGCGTATAAAAGTAGGATGTGAGGTGATTAAATCTATAGCGCCTTCTGAATGATAATCTGTGATTTTTTATGCGTGGCATTACATCATTGGGTTAAATGTGATTCCATTGTGAGTTATATTTTTCCGTCAGCAAATAC [...]
+GCTATGGCAACAACCTGAATTCCAGCAAAGCGCCCACTATTCCGCCAAACGCGTCACGCAAATTCTGTATTTGCTGACGGAAAAATATAACTCACAATGGAATCACATTTAACCCAATGATGTAATGCCACGCATAAAAAATCACAGATTATCATTCAGAAGGCGCTATAGATTTAATCACCTCACATCCTACTTTTATACGCTGAAAAAGAATAGAACTATTTGATAAAATGGCCCTTCGTTTTAAGTTAAAATTGGCTATAAACGTTATTCACATAATCAATATTTATTATCAATTTAAATAGTTCTATACATTCTTATTTTCTATGGAAAACAAGGGATAAATATGGAAATTACTTTACCGTCAATGTCAGATAAAAAATGGACCTGCGCCGATCTCCTGAGTAGCTATCGATTCTGGGGGATCACTTTTTTCTTTTTGGTGCTCTCTTTTATCAGTTCGCTGGGATCGTCGTATGGTGTTTATTTTTG [...]
+NODE 2021 46 2808 2808 0 0
+GCTGGAAAACATCGACATCGTGCCGCTGTATTTGGCTGCTGAACGC
+TGTATTGCCAGATATCCTGCTCAGTCCAGTTGGAGAGCGGGAAGAC
+NODE 2022 39 40 40 0 0
+AACGCCGAACGGCGTGATCCGCAATTCAGACGTGGCGAA
+CCAAATACAGCGGCACGATGTCGATGTTTTCCAGCCAGA
+NODE 2023 51 2327 2218 0 0
+ACCGACCACCGGTATGCTGCGCACGCGTGCCTACATTGGCCAGCATATGCC
+TTCCAGCTTATAAATCAGGATAGCGTGATCATCTTCACGGCTGGAAAAATT
+NODE 2024 51 1588 1551 0 0
+ACCTGCCGCTGTAATCTCCAGGCCGCGTTTACCCTGCTCCTGACCGATCAC
+TGGCCATAATCTGCTATTGATCGGCCCGCCGGGTACGGGTAAAACCATGCT
+NODE 2025 773 37874 37710 0 0
+CGCGCCTTCTGCGTCGTTATGGCTCACCAATATCTGTGTGCAAATCTGTCTGGTGCTGATCTGGCTGACCGGTTCGGACTACAACACGCTATTGACGATTGCGTCAGAAATGATTCTGGTGCCCTACTTTCTGGTCGGCGCATTTCTGCTGAAGATTGCAACGCGTCCCCTCCATCGGGCGGTCGGTATCGGAGCCTGTATTTATGGCTTATGGTTATTATATGCGTCGGGTCCCATGCACCTGCTGCTGTCCGTCGTACTGTACGCGCCAGGATTACTGGTTTTCCTGTATGCGCGTCGGACGCACAAGCATGACAACGTATTAAATCGTCAGGAAGTCGTGCTGATTGGTTTATTGCTGGTCGCGGCGGTTCCGGCTACGTGGATGCTGGTGGGTTAACAACCTCCCCATCGTAATATCCGTCTGTATTACGATGGGGAAACCACGGTCTTTGCCAATATTAATGCCATTTAATCCAGCAAAAAATCAGC [...]
+TTATTATATCGCCGGATTAATTCCTCTGTTTCCAACGTTTGCGCTTATCGCGCACTATATCGTGGCCAGCGAGCGGGGCATCGACGCGATGCGTACCACCATCGTCTTTAGCATGTGGTCGATCATTCCTTATTTCATTTATCTTGCAACGCTATGGTATTTCAGCGGCGTGATGCGCCTGCCCGTCGCGCTTGGCGGTGCGGTGGTCTGCTGGGGGCTAAGCGCGTGGCTGCTGATTTTTTGCTGGATTAAATGGCATTAATATTGGCAAAGACCGTGGTTTCCCCATCGTAATACAGACGGATATTACGATGGGGAGGTTGTTAACCCACCAGCATCCACGTAGCCGGAACCGCCGCGACCAGCAATAAACCAATCAGCACGACTTCCTGACGATTTAATACGTTGTCATGCTTGTGCGTCCGACGCGCATACAGGAAAACCAGTAATCCTGGCGCGTACAGTACGACGGACAGCAGCAGGTGCATGGGA [...]
+NODE 2026 184 10615 10615 0 0
+CCTCACCATACCCCCTTTCGCTATGAACAGCAGGAGGAGGCTTACCGTCACTTTTCAGCAAATGTCGGCTTTGATCCCGCCGTCGTTACCACGTTACTCCACGAGCTCAGAACGCAGTACGAGACGTTAATCGTCGTAGGGTATAGCGTCGGCGCAACGCTCGCATGGCTAAGTGCAGCCAGTG
+ACGATTAACGTCTCGTACTGCGTTCTGAGCTCGTGGAGTAACGTGGTAACGACGGCGGGATCAAAGCCGACATTTGCTGAAAAGTGACGGTAAGCCTCCTCCTGCTGTTCATAGCGAAAGGGGGTATGGTGAGGAAACAGCGCGGGAATATAGATGTCGAATCCGCGCGTCATCCATTCATGGC
+NODE 2027 1531 90720 90247 0 0
+CCCAGCTGCCCGGCGCGGGACTGCTTACGTCCCAAAAAGAAAATCACGCCAATAAAAATCAGCAGCGGCGATAGCCACGACAAATCAAAGGTGAGAATACGCGCCATTAGCGCAGTACCCACATCAGCGCCCAGCACAATCACCAGAGCTGGCGTCAGGGCGACAAGATCCTGGGCGACAAACGACGTTACCAATAAAGTGGTGGCGTTACTGCTTTGTACCAGCGCGGTAACACCGATACCCGCACAAAAGGCGAGCGGTTTCTTTTCCACGCTGCGGCTGAGGACAGTGCGTAGACGCGCGCCAAACACGCGCATTACGCCAGTACGAACGATATGTGTTCCCCATACCAACAGCGCAACGGCAGAAAGTAGATGGAGCAAAGTTAACACGGCGTCAGGTTCTCCTTATCGTTATACGTTTTCCTGAAGCTCACTTGCGATAAATTGCCTGATGGCGCACAGCGTTAAGGCCTGCTGGCGTTGCACGCCA [...]
+GTCGCTGGCCGGCAAATACCCGCGCATTCTGGAAGATGAGGTGGTGGGCGTTGAGGCGCAGCGTCTGTTTAAAGACGCCAATGATATGCTGGATAAACTAAGCGCCGAGAAACTGTTGAATCCGCGTGGCGTGGTGGGCCTGTTCCCGGCGAACCGCATCGGCGATGACATCGAAATCTATCGCGATGAAACCCGTACTCATGTTCTGACGGTCAGCCACCACCTGCGCCAGCAGACCGAGAAAGTTGGTTTTGCTAACTACTGTCTGGCGGATTTTGTCGCGCCGAAACTGAGCGGCAAAGCGGATTACATCGGTGCTTTCGCGGTGACCGGCGGTCTGGAGGAGGATGCGCTGGCGGACGCCTTCGAAGCGCAACACGACGACTATAACAAGATCATGGTGAAAGCGATTGCCGACCGTCTGGCGGAAGCGTTTGCCGAGTACCTGCATGAGCGTGTACGTAAGGTTTACTGGGGATATGCGCCGAACGA [...]
+NODE 2028 37 5306 5306 0 0
+ACCGGGACAACCGTCGCCCGGCCAACATAGCCTTCTC
+TGTGTGTTCCAGGTAAATCCGGTTCACTTTAACACTG
+NODE 2029 44 7666 7633 0 0
+AGAGTTGAGTACGCAATAATTTGCGCAGCAGCAAGGCGGCAAGC
+GTGCTGAAAATCTTCTCTCATCCGCCAAAACATCTTCGGCGTTG
+NODE 2030 4 1716 989 0 0
+TGCC
+ACGC
+NODE 2031 4904 272345 270898 0 0
+ATATCGTCATCTTCATAAACAATATCTAACGGGATATCCTGCGCTTCAAAACGAATCTCTTCGTCGATCTCCGCATCAATAGCCACCCGCTCGCCGCCTAACACTTTTTCTTTTGGCTTATCGCAAAGTTGACCATTGACCAACACGCGCTGATTCAAAATCCATTCTTTTATACGCGAACGTGAATAATCCGGGAACATTTCGGCCAAAGCCTGATCTAAGCGTTGACCGAGTTGGTTTTCGGAGACCGTTGCGGTGAGTTGTACTCGTTGTGCCATATACAGCTTCTTCGTTTAACGTTGGGTTTTACGGCTTTGCCGTTTAATATAGTGTGCTATTGTAGCTGGTCTTAACCGGGAGCAGGAACAGAGAATCTCCCGTAAAACATTTTGAGGAAAGTCAAAACGTCATGACGCGCATGAAATATCTGGTGGCAGCAGCCACGTTGAGCCTGTTTCTGGCGGGTTGCTCGGGTTCAAAGGAAGAGGTGCC [...]
+GGGCTATCAGGTCCGTATTCTGGAACAGCAGGACTGGCCGCGCGCCAGGGACATTGTTGCCGATGCCGGAATGGTGATCGTCAGCGTGCCGATTCATGTTACTGAACAGGTCATAGCGCAACTGCCGCCCTTGCCGTCCGACTGTATTCTGGTCGATCTGGCATCGGTGAAAAGCGGTCCGTTGCAGGCAATGTTGGCGGCCCATGATGGCCCCGTGTTGGGCTTGCATCCGATGTTTGGTCCGGACAGCGGGAGCCTGGCGAAGCAGGTGGTGGTCTGGTGTGATGGGCGTCAACCGGAAGCGTATCAGTGGTTCCTTGAGCAAATCCAGGTGTGGGGCGCGCGGTTGCACCGAATTAGCGCAGTCGAGCACGATCAGAACATGGCTTTTATCCAGGCGTTGCGCCACTTTGCTACCTTCGCTTATGGGCTGCATCTGGCGGAAGAGAACGTCCAGCTTGAGCAGCTTCTGGCGCTATCATCGCCGATTTA [...]
+NODE 2032 484 24654 24463 0 0
+GGGCGGTGGTAATTAAGTCTTCTTTATTTAATTGCGGCCAGACATGTTCCTGAGTGGTTTGCTGAAAATCATTAAATTTTAATTTAACGCCCTGTCGGGCAATCAGTAAATCGGGCTTCACTATAGCCAGACGACGCTCCAGTTCCGGATATAAATGTTCAATAATGGCCTCGCAGTCCGACCACTCATGAATATCCTCCGCCAGAGTACGCTCAACGCCTACCGATTTACGCAGCCTTTCGCTGTTAACATCACGCTCGTCAATACCCTGACTACGCTCCCATAATACCCGGCCAAATTTACCGAAGCGTTTGAGAAGCATCGCCAGATCGCACTGTTGAATATCCCCGCAGGTTCTTAACCCCATATTTTCCAGTTTGGCGGCGGAAACTTTCCCCACGCCTGGAATTTTGGCTAACGGCAACGTTTTAAGAAAGCCGGGTACATCGGCTGGCGTAATAACATATTGTCCGTTCGGTTTATT
+TCTTAAAACGTTGCCGTTAGCCAAAATTCCAGGCGTGGGGAAAGTTTCCGCCGCCAAACTGGAAAATATGGGGTTAAGAACCTGCGGGGATATTCAACAGTGCGATCTGGCGATGCTTCTCAAACGCTTCGGTAAATTTGGCCGGGTATTATGGGAGCGTAGTCAGGGTATTGACGAGCGTGATGTTAACAGCGAAAGGCTGCGTAAATCGGTAGGCGTTGAGCGTACTCTGGCGGAGGATATTCATGAGTGGTCGGACTGCGAGGCCATTATTGAACATTTATATCCGGAACTGGAGCGTCGTCTGGCTATAGTGAAGCCCGATTTACTGATTGCCCGACAGGGCGTTAAATTAAAATTTAATGATTTTCAGCAAACCACTCAGGAACATGTCTGGCCGCAATTAAATAAAGAAGACTTAATTACCACCGCCCTTAAAACCTGGGACGAGCGTCGCGGCGAGCGCGGCGTACGGCTGGTGGGG
+NODE 2033 229 12705 12668 0 0
+CGGCGGCGCGCAGTCACGTCCACAGCAATCCGCGCCAGCGCCGTCTAACGAACCGCCAATGGATTTTGATGACGACATTCCGTTCTGATTTTTGGTAAAAAACTCAAAGCGTTATTTGCATTTTCGCTATAGTTCTCGTCTGCTGAAATGCCTGGTGTAAACCAGGCATTTTCTTACCTGGTATTATTGTCTTAGAGCCTATCCCACCAGGCGTTATTGGCGCAGCCAG
+AGGTAAGAAAATGCCTGGTTTACACCAGGCATTTCAGCAGACGAGAACTATAGCGAAAATGCAAATAACGCTTTGAGTTTTTTACCAAAAATCAGAACGGAATGTCGTCATCAAAATCCATTGGCGGTTCGTTAGACGGCGCTGGCGCGGATTGCTGTGGACGTGACTGCGCGCCGCCGCTGAACTGGTTGCCGCCCTGCGGCTGCTGAGGTTGTTGCGGTTGACCCCA
+NODE 2034 4 589 589 0 0
+GCAG
+TAGT
+NODE 2035 51 2773 2147 0 0
+CGGCAGATAGCAGCCATAAAAAAACCCGCTTTACGCGGGTTTTTCTACAAA
+GTTTTGCTCGTCAACCGCTGGCGCTGACCTCACTCGTTCACGCTCTTCCTG
+NODE 2036 10 20 20 0 0
+GTAGATGCCT
+CCCTCTTTTT
+NODE 2037 8 977 977 0 0
+TCTGAGTG
+TATAATGC
+NODE 2038 28 5774 5746 0 0
+CGTTCTACCGACTGAACTACAGAGGAAT
+ACTGGTTCGAGTCCAGTCAGAGGAGCCA
+NODE 2039 3 421 421 0 0
+CGT
+GTC
+NODE 2040 3 297 297 0 0
+GTG
+TAT
+NODE 2041 1 156 73 0 0
+A
+G
+NODE 2042 439 24571 24334 0 0
+CATACAATATCGGGAAAAATACTCGTAATCTGAGCATTGGCGTACATGCGTACTGCTCGTGGACATACCTTAATGGCTCGCCTTTTGGTGGTTTTCAGCAGATATACGCCGACCAAAACAAGGTTTGGTATGTGAATAATTATGCGTGGGGAAATTATGAGTCCGGTGGCACAATTACAGTGACATGCCTCAACCTTCCTGGTGCCGGAATCTAACCAAAAGGGCAACAGTAAGCATCGACGTGCTCTTCATCAACACCATCTCCGATGCCGTACATTCTTGTACCTGTCATGACGTACCCGGCAGGGCACTGAATCGGCTTGTAATAAATAGAACCTCCACTTCTGCCACCGATAAAATGTGCGGAGGTCGCTTCATACCATTTACAGGCAGAATAGTTCACTTTATTGCCTCCAAGCCACAAACCGGATTGGCACTG
+CTGTAAATGGTATGAAGCGACCTCCGCACATTTTATCGGTGGCAGAAGTGGAGGTTCTATTTATTACAAGCCGATTCAGTGCCCTGCCGGGTACGTCATGACAGGTACAAGAATGTACGGCATCGGAGATGGTGTTGATGAAGAGCACGTCGATGCTTACTGTTGCCCTTTTGGTTAGATTCCGGCACCAGGAAGGTTGAGGCATGTCACTGTAATTGTGCCACCGGACTCATAATTTCCCCACGCATAATTATTCACATACCAAACCTTGTTTTGGTCGGCGTATATCTGCTGAAAACCACCAAAAGGCGAGCCATTAAGGTATGTCCACGAGCAGTACGCATGTACGCCAATGCTCAGATTACGAGTATTTTTCCCGATATTGTATGTACTGGTAGTGAAGTTCATTTTTGTCGTTGTCCAGATACCGGATTGGCAC
+NODE 2043 19 887 887 0 0
+CGTTAAAAAGATACGGGGG
+CGCTCATTGCCTGCCGCCA
+NODE 2044 32 1150 1150 0 0
+AAGGGGCATTTTCAGAATTTATTGTGCCGACA
+GGCGTGGGCATAAAATCGGCGCGTTCACATTT
+NODE 2045 51 1474 1431 0 0
+TTGCCGTACAAAGGCAACGCACGAGTTATTAGTGGCTATAAGGGCGTTTCA
+ACGCCCTCATCCTGTTGAGGATATTGCTATGAGCATCACTTTACTTGACGG
+NODE 2046 1 142 142 0 0
+C
+A
+NODE 2047 4978 327740 326380 0 0
+AGCACCCCGTACAAATTAATAGATAACGGAGGCTATACCGACTATGAAAATGACCTGCAAAATATTCATTTCAGCATTGGCATCTGCAACCAGCGTCTGAGTAAACAAGAACCTGATACCGAAAAACGTTCCGCTTATGAAAAAGAACTGCTCGATAATCTCTGGCTGGCGCATCAGTTCGGGCATAAAGAGGCCTGGGGCTTGTTCCTGCTGAATATTTTTGAAGTGAAGGATATTACGCTGGCGCATAAGCATCTGGAACTGGTGCAACAAGAGGCCAACAAAGGCACGCTACATGCTATGGTGACCCTATCGCGTCTGCACGGTAATAAACACGATCGAACTCTGTTTAATATGAAGCTAAGCGCACGCTGGGCGCATTTTGCCTTCACACTTTACCCGGATAATGAAATCGTTATGGACTGCCTGGACCACCTGCATTTCGATTCTTTCTGGAAACGCTTTCGTTTCGCCTGGTATACCGTCCGTATC [...]
+TGATGGTATGAAATATTAATTGGATATGTCGTGAACATATTTTTGTTATATGTTTTCAATGTGTATGACAAGAAAATTTGCATGAAAAGATTATATGAGATGGTTTGAAAAATGAATGAAGTTCACATAAAAGCAAGGTCATTCTGAAACGAATTTGTCAAATTTACTGAATTATATATCAATAATTCCTGACTATCGACAATAATGTGAAATCGAGTACAAACTCACGGATTTGTAGTAATTAGGGCAAAGAACAAGTCAGATAAAAAATTTCTCATTATTTATTCAAAAAGCAAGTGCAAACTGTTAGTTTGAATTTGTACTTCTTCATAGAAGTGTTGAATAATATTGACGTCAAACATGTTCTGCCTTTTTTTACTAAACTGAGTAAGGTAACTTTAATATTATAATTGCAATGATACAAAATCACATCAATATATAATGAGGAAAACTATATGCCCGCCGCCGCTCGACTAAACGACAAAGGTATGC [...]
+NODE 2048 1378 56860 56758 0 0
+CCTCCATCCAGTCTATTAATTGTTGCCGGGAAGCTAGAGTAAGTAGTTCGCCAGTTAATAGTTTGCGCAACGTTGTTGCCATTGCTGCAGGCATCGTGGTGTCACGCTCGTCGTTTGGTATGGCTTCATTCAGCTCCGGTTCCCAACGATCAAGGCGAGTTACATGATCCCCCATGTTGTGCAAAAAAGCGGTTAGCTCCTTCGGTCCTCCGATCGTTGTCAGAAGTAAGTTGGCAGCAGTGTTATCACTCATGGTTATGGCAGCACTGCATAATTCTCTTACTGTCATGCCATCCGTAAGATGCTTTTCTGTGACTGGTGAGTACTCAACCAAGTCATTCTGAGAATAGTGTATGCGGCGACCGAGTTGCTCTTGCCCGGCGTCAACACGGGATAATACCGCACCACATAGCAGAACTTTAAAAGTGCTCATCATTGGAAAACGTTCTTCGGGGCGAAAACTCTCAAGGATCTTACCGCTGTTGAGATCCA [...]
+TCTCTTGATCTTCAGGTCAGAGCACTCAAAGACGCAGGTGTGAAAGCAAACCGTATATTTACCGATAAGGCATCCGGCAGTTCAACAGACCGGGAAGGGCTGGATTTGCTGAGGATGAAGGTGGAGGAAGGTGATGTCATTCTGGTTAAGAAGCTCGACCGTCTTGGCCGCGACACTGCCGATATGATCCAACTGATAAAGGAATTTGACGCTCAGGGCGTGGCAGTCCGGTTCATTGATGACGGGATCAGTACCGACGGTGATATGGGGCAAATGGTGGTCACCATCCTGTCGGCTGTGGCACAGGCTGAACGCCGGAGGATCCTAGAACGCACGAATGAGGGCCGACAGGAAGCAAAGCTGAAAGGAATCAAATTTGGCCGCAGGCGTACCGTGGACAGGAACGTCGTGCTGACGCTTCATCAGAAGGGCACTGGTGCAACGGAAATTGCTCATCAGCTCAGTATTGCCCGCTCCACGGTTTATAAAATT [...]
+NODE 2049 832 42070 41785 0 0
+CAATTTTGAACGCGGCGCGAAGGTCGACGCGCAGCAGATTGTGATTGTCAGTGGCGCGCGTCAGGCATTCTGGCTATGCGGGCAACTGCTGGCAGAGGCCGGACAGTCGGTGGTGATGGAAAATCCAGGCTATCCCGGCGCACGTCAGGCATTCTCTGCCGCACAGCTCAACCTTCTTCCCATTGAAGTCGATAGAGACGGTATTCGGGTGGATAAACTGCCGCCTGCGCCGCTGGTTTACGTTACGCCGTCGCACCAGTTTCCCTCCGGTCATTTGCTCTCTCTGGCGCGGCGTCATGCCCTGATTGACTGGGCGCGGACGCATAATGCCTGGATTATCGAAGATGACTACGACAGTGAATTTCACTACAACGGCGCGCCCGTCGCCTGTATGCAGGGGTTAGATCGCGAGCAGCGCACCCTGTATGTCGGCACCTTCAGCAAAACGCTCTACCCCGGTCTGCGCATTGGTTATCTGGTGGTGCCTGCGTC [...]
+TTAACCCGGCCCGCCGCGCGGCGTTAAGGGTCTGTTGTTCGTCAATACCTTCATGTAGCCAGCAGGGCATTTGTAATCCTCCGGGCGTCACGACCGGCGTCACCCAGTCACTAAGATGCTGATTGATGGCCTGCGCCAGGCACGCCTGCCGCACCGCGTACATACTGCGCATGGTGCGGATATGGGCGGCAAAATGGCCGGATGCGATAAATCGCGCCAGCGTCAATTGGGTCAACGCGGGCGTTGCGCCATCAAGCAAATTGCGCGCAGCGGCAAAATGCGCGGCCAGCGACGCAGGCACCACCAGATAACCAATGCGCAGACCGGGGTAGAGCGTTTTGCTGAAGGTGCCGACATACAGGGTGCGCTGCTCGCGATCTAACCCCTGCATACAGGCGACGGGCGCGCCGTTGTAGTGAAATTCACTGTCGTAGTCATCTTCGATAATCCAGGCATTATGCGTCCGCGCCCAGTCAATCAGGGCATGACGCC [...]
+NODE 2050 821 49100 47693 0 0
+ACATACAGTGGTTATTGATAAACCGGATGAAACGGCGATTGCCTGTCCAGCCTGCCAGCAAGGACATTTGGTCCAGCGCCGTTCTCGTTACGGTAAAATCTTTCATTCCTGCGATCGCTACCCGGAATGTCAGTTCGTCATTAACTTCACACCGGTTGCGGGGGAATGCCCCGAGTGCCATTATCCGCTACTCATCGAAAAGAAAACCGCGCAGGGCGTGAAGCGCTTTTGCGCCAGTAAACAATGTGGAAAGCCGGTTCCGGTGGAATAAACAAGTGAATAATAACCTGCCAACAGGATCTATCGCCGCAGCGGTAGATCTCCTGAATAAAGAAAATGTCATCGCTTATCCAACAGAAGCCGTTTTCGGCGTCGGCTGCGATCCCGATAGTGAAACAGCCGTTACGCGCCTGTTGGCGTTAAAACAACGGCCCGTCGATAAGGGACTCATTTTGATTGCCGCCAGCTTTGAGCAGTTAAAACCTTATGTTG [...]
+CAACCACCGGAAAATCATCACCAAATTGCGCACGCACCTCTTCAACGGTACGGCATGGCGGTAATCCGCTCAGATTAGCGCTGGTGGAAACCAGCGGTTTGCCATACGCATTGCATAGCGCGACCACCAGCGGGTGGTTGGTAACACGAACGGCCAGGGAATCAAAACGTCCCGTGAGCCACCGCGGCGTTGTCGCGGGCGCAGGAAAAACAAACGTTACCGGCCCGGGCCAGCAATCAAATACTGCTTTACGCTGTGCGGCGGTAAGTATGCTGTCATCAACATAAGGTTTTAACTGCTCAAAGCTGGCGGCAATCAAAATGAGTCCCTTATCGACGGGCCGTTGTTTTAACGCCAACAGGCGCGTAACGGCTGTTTCACTATCGGGATCGCAGCCGACGCCGAAAACGGCTTCTGTTGGATAAGCGATGACATTTTCTTTATTCAGGAGATCTACCGCTGCGGCGATAGATCCTGTTGGCAGGTTATTAT [...]
+NODE 2051 51 2714 1736 0 0
+ACCTACATTTGGGCGGTAGCCATCGTCATCAATCACCGGACTACCTCAACA
+TATCGTAATTTGTAATCGTCAGGGGCAGGTGATGTGGGCCCGGCGATTTGG
+NODE 2052 51 92 92 0 0
+GTTTATCCAGACGAAACGCTTCGCGAAAGAAGAAAATAGTGACGACGATAG
+CCCGGCCGCAATAAAATGTTCGTGGCGTTTATTCTGATGATTGAAGCCGTG
+NODE 2053 51 3824 3824 0 0
+ACCGGCCGCAATAAAATGTTCGTGGCGTTTATTCTGATGATTGAAGCCGTG
+TTTTATCCAGACGAAACGCTTCGCGAAAGAAGAAAATAGTGACGACGATAG
+NODE 2054 51 3337 3285 0 0
+ATAGGGGGAGCGAATAACGCCGATTTGTTCAAACTGAAAGCTGCTCATTTC
+TAAAGAAAAATTCGCCGTTCCGCGCCAGCCTGGTCTGGTCAAAAGCGCCTG
+NODE 2055 1522 97468 96603 0 0
+GATTGAACACAGGAAAAAATTGATGAAGACGCAGATTAGGTACGTTGAAACAAAGCTTTCAAAGCCCCTCAGGCCGAGGTCTTAGTTGACGCGAAACATGGCATAATAGCCATTTCGAACTGGTAACCACGACGATTACGCTGGAAGACGGTTCAACTGGCACCGGATATACCTATACCGGCGGAAAGGGAGGGTATGCAATTAAAGCGATGATCGACCACGATCTTGCCCCGGTACTGTCAGGGAAAGAGGGCGCTGCGATTGACGATATCTATGACTTTATGGAATAGCATATTCACTATGTGGGTCGCGGAGGCATCGCATCGTTTGCGATGTCTGCGGTGGATATCGCTCTTTGGGATTTGAAAGGCAAACGTGAAAAACTGCCGCTGTGGAAAATGGCTGGCTGAAGGCGGCGCGTCTGTCGACGAATGGCGGTCTTTCGGTATGCTCGCTCGGTATGCAGGAATTACACGTCAGACTGGTTTCCGC [...]
+GGAACAAATTTTAACCAAGCGGCGCTATTTTGATATAGGGCTGCAAATAGAAGAACTACTCTATTCAGGGGTATTTAAAGCTGGCGAGCGACTTCCGGCGGAGAGAGAACTTAGCGAGCGTTTTCAAACCAGCCGCACGACGATTCGTGAGGCGATTATTATGCTTGAGCTGAAGGGAGTGGTAGAGGTTAAGCAAGGCGCAGGCACTTACTTTATTGATAGTCTGGAGAAAATCAATCAAAAAGCGCTCTTGCCTTACTCAGACATTGGCCCCTTTGAATTGCTACAGGCCCGGCAGGTCATCGAAAGCAACATCACCGGTTTTGCCGCTACGCAAATAAGATTTAATGAACTTAAGCAGCTTAAACGTATTATTGAGCAGCAGGAAAAGCAGATTGGCGGCGACAGCGACAAATTTGAAGAACTGGATCGCCAGTTCCACAATATCATCGCGGAATCCACGCAAAATCGTGTATTAATGAAACAATCTGC [...]
+NODE 2056 51 3515 3515 0 0
+CAAATCCTAATGTTTATGGTAAACAATTTCCCTGCCAGAGAGTGGTCGTTT
+GTTTACACTACCCTCAAGTGGAGCAATTGCTGTCTACATAGGTATGTGCAT
+NODE 2057 51 123 123 0 0
+GAATAATGCAATCCCGCTCCCCATCATATTACCGGCAACGACGCCAGTACA
+CCCCGCCAACCTTGCCAGTATTGGTGGCATTGCCATCTGGGGCTGGGTAAT
+NODE 2058 42 2920 2920 0 0
+GACGCTTTTCAGCGTCTCTTTTCTGGAATATTGGTACCGAGG
+CGTCTGTTGAAACTGCTCTCAGAGAGGAGGTTGAAGCACGCT
+NODE 2059 1285 68167 66544 0 0
+CCGCCTGTTAGCGGAGCGTGGGTTTCACTGCACAGGCGTAGATTTCTCTCCGGCATCCATCACATGGGCTCGCCAGCAGGCGCAAGCCGCAAACCTGAATATTGACTACATTCAGCAGGATATTCGTACATACCACCCCACGGAACCTTTTGATTTCATTATGATGACGTTTGGGGAACTGAATGTCTTTAGCGCTGCTGATGCGCAAAGCCTCATCAGTCATTGCGCGCAGTGGTTGAAACCGGACGGCAAACTGCTTGTTGAAGTGCATACCTTTGATGAAGTTAAACGCCAGGGCATGGCGCAGCCAGGCTGGCAGCGTTGTCCGCACGGCCTGTTTCTTGCCATGCCTCATCTGCTGTTAACGGAAAATGCCTGGGATGAAGAGGCCCAAACCAGCTCAACGCAGTTCTGGGCGATAGCGGAAAACGGCTGTACCACCCGTTTCGGCAGTCAAATGAAGGCCTGGCGCGATGATGAATATATCAGCCT [...]
+TCGCGGCTTCATATCTGTCCCAGCCTTGCGGGTCCGCCAGCACCATTTCCACTACGTCATAGCCGAGTTGGTCAAAAAAGGCGACCAGCTCGGGCAGGGGACGAAAATCGGCGACGGATGAGACGCCACAGGCGTGGGCGATCTCTTCCGTTGCGGGGATCCGACGCCAGTACGGTTCGCCGATGAGAATGATCCCGCCTGGTTTGAGGCTTTTGGCCAGCAGATCTATTGTCCCAGCGACACCGCCCGCAATCCAGGTGGCGCCTACGCAGGCCGCCACGTCATATTTTTCCTCGTCGATATAACCGGCCGCGTCGTTATGAATAAAATGTACGTATTCACTGACGCCGAGCTCTTCTGCACGTTGTTTTGCCTGTGTGGTGAAGAGCGGGCTTATATCAATGCCAGTACCTGTAACACCGTAATCGCGAGCCCAGGTGCAGAGCATCTCACCCGAACCGCTACCGAGATCGAGAATCCGTGTGCCTGGTT [...]
+NODE 2060 61 2570 860 0 0
+CACATTTTTTGTGAAAAACCGCTCAGCATGAATGAAGATGAGCAGGCCTCAATGGCGGTGC
+CAAAAAATGTGCTTCCCCGCCTGCGCTGCCGCCGTGACGATCTCTTCGTGCATATCCGTTG
+NODE 2061 51 4336 4336 0 0
+CGTTTGAGTGGCAACCATTCACCAGGCTGAGAATATGAAAACATTTTTCCT
+GTATCACACTAAAATAATTCTATATTTCATAAATTATGATGATGAAGTTAA
+NODE 2062 51 2423 829 0 0
+GCCCGATATGACCCGCCAGTAAGTGAAAAATTATGATAAATGCAAATCGTC
+CTGACCTGGTTAATGCTGTGCATTCAGAAACAAGCAATTCCATTTGTAATG
+NODE 2063 3 114 112 0 0
+ACG
+CTG
+NODE 2064 5 309 309 0 0
+GCCCG
+TGAAG
+NODE 2065 29 1713 1563 0 0
+ACGGCGATTTATCTGTCGGGCAAGCTGGC
+AATGCCGATGGCCGCCGCCTGCGGCAGGG
+NODE 2066 5 1346 1318 0 0
+GACAC
+AGGGG
+NODE 2067 5 493 486 0 0
+CACCA
+TCGCT
+NODE 2068 42 2610 2610 0 0
+ACCGCGGCCTCAGGCGTATCTTCAATCACGCATTCCGGGTGT
+AGAAATGTAAGTGGACGGTCAACGCGCTGATTAACCACCATT
+NODE 2069 9 538 538 0 0
+TCGTTGGTG
+TGGGGCTGG
+NODE 2070 51 1927 1921 0 0
+ACCCGACGCGTCGCTGACCACTTGCACCTCATCGCCAGGTTTTAGCGCCGC
+TTTCTTTGTACTGGATGAAGTGCCTGACTGCGAGACGCTATGGATGCTGGC
+NODE 2071 1239 69494 68312 0 0
+CAGCCGCGGGCTGAGCTTTCCTTGCGGCACCGTCACCAGATAAAACTCTAAATTCGGATTGTCAGGCGCATTGACATAGGAATACGCGCGCTGAACGCGCTCGCCATCGATCTCCAGTCCGAGTTTGGTAAATTGGCCTGCAGTAAAAGGATTAATGGGGGCGTGAACGGTCAGGCTGAACAGTGCGTCAGTCCAGTTTTGCACCTTAGTGACTTTACCTGTTACCCAATCGGCCATGGTTTTCTCCTGTTCTGAATCGCTAACCTTATCTTCGTTCGTCAGGAGAAAGATTTCCAGCCCCGCGAGGCTGGAAGGCTCTAACTAACAAATGCGCTAGAGGATATGCGCCTGTACATCCGGATCTTTACGATCAAGATAGTGGATCGACTGAATGCGGCGGATGGTGCGTGATTTGCCGCGGATCAGCAGCGTTTCCGTCGTGGCAATATGGCCTTTCCGGCTAATTCCTTCCAGCAGATCGCCTTTCGTGAT [...]
+CATCGTGATTGGCGAAGGCGAAATCGACGAGGCCCCGATGCTCTATATCGGCGAGAAAGTCGGTACCGGCCACGGCGATGCGGTAGATATCGCCGTCGATCCGATTGAGGGCACGCGCATGACGGCGATGGGTCAGGCGAACGCGCTGGCGGTGCTGGCGGTCGGCGATAAAGGCTGCTTCCTGAATGCGCCCGATATGTATATGGAAAAACTGATTGTCGGTCCGGGCGCCAAAGGGGCGATCGATCTCAATCTGCCGCTGGCGGATAACCTGCGCAACATCGCGGATGCGCTGGGTAAACCGCTTGGCGATCTGACCGTGACCATTCTGGCAAAACCGCGTCATGACGAGGTCATCGCAGAGATGGCCAAACTGGGCGTACGCGTGTTTGCCATTCCTGACGGCGACGTCGCGGCCTCAATTCTGACCTGTATGCCGGATAGCGAAGTCGACGTGCTGTACGGAATTGGCGGCGCACCAGAAGGCGTGGT [...]
+NODE 2072 51 72 72 0 0
+GTCAGTCTGCTAACAGCACTAACTCCCAGTCTGACCTCGACTCCATCCAGG
+CCCGCCAGTTCACGCACACGCTGCAGGTTGTTGTTGATTTCGTTCAGCGCG
+NODE 2073 158 7929 6073 0 0
+CTGCTGGCGCTGCACACGGTGCTGCAGCGCCGGGCCATTCTGCGCGGCGTGGCGCAGCAGCGGGCGCGCGAGGCGCGGATGCGTGCCGCACAGGCGCAACAGGAGGCGGCGTGAACCTGCGACGTAAAAACCGGCTATGGGTGGTCTGCGCGGTGCTG
+CGCCTCCTGTTGCGCCTGTGCGGCACGCATCCGCGCCTCGCGCGCCCGCTGCTGCGCCACGCCGCGCAGAATGGCCCGGCGCTGCAGCACCGTGTGCAGCGCCAGCAGCACCAGCGGCGCCACGGTCATCGCCACCGCCAGCCAGACAAAAAAGGCGT
+NODE 2074 51 3366 3289 0 0
+ACCGTCCGGGCGACGAACACCCTTCTTGGTGCGCACCACTACCGCCTTCAG
+TTCTGTCATTCGCTTCGATGGTAATGCATGCGTTATTTTAAACAATAACAG
+NODE 2075 4 213 213 0 0
+CTCT
+GCGA
+NODE 2076 2 752 244 0 0
+GT
+AC
+NODE 2077 51 2576 2576 0 0
+GCTGGGGTGAGCGAGCGTAGCCAACACATAAGCAACTTGAAGTATGAAGGG
+CCACAGAGTTATCTATGCTCCTGGGGACTCACTCCCTTGCCGCCTTTAAGC
+NODE 2078 916 49552 49202 0 0
+TCCGCAAAGCGGAATTTACCTCCAGCGCGGCTTAATTATTTTTGCATTATTGTGGATAGTCGCTGGTTGGTTTGACTGGTTTGGCATGTCTATGGCGAACGGCGCGCACATCGCCGGGCTTATCGTCGGTTTAGCGATGGCCTTTGTTGATACGCTGAATGCGCGAAAACGAACGTGAGGCGTATCCGGCCTGTGGTCGAGATATTTTTCCAGGCCGGGTAGGGCGAATGCCGCTATCCGGCGCAAGGTTGGTTACTTTCAGAGATTATTCATGAAACAAACACAACGGCATGACGCGATCATTGAACTGGTGAAAAAACAGGGGTACGTCAGTACGGAAGAGCTGGTGGAGCATTTTTCTGTCAGCCCGCAAACCATTCGTCGGGATCTTAACGATCTGGCGGAACAGAATATGATTTTGCGCCACCACGGCGGCGCGGCGTTGCCCTCCAGCTCGGTGAACACGCCGTGGCACGATCGTAAGGCGACGCA [...]
+AATTTTCGATAATCGCGCGCTTGGTGCGTACCTCATGATAATCAAACTCCAGCAGCGAACCATCGCTGTCGATGCCGCTAATCCCCAGAATACCGAAATCGAGACGGAACTGGGAGATGAAATCCTGCGTCGCCTCGCCAATAATGCCGCCGTCGCGGCTGCGGAGTTCGCCGCCGGCGAGGATAATACGAAAATCCTCTTTCGCCATTAGCGTGTTCGCTACGTTCAAATTGTTGGTCACGATCCGCAAATTACTGTGCCCTAACAGGGCGTGCGCTACGGCTTCCGGCGTCGTGCCGATATCAATAAACAGCGTTGAACCATTGGGGATCTGGGCCGCGACTTTGCGAGCGATGCGCTCTTTTTCTTCCGTTTGCGTCGCCTTACGATCGTGCCACGGCGTGTTCACCGAGCTGGAGGGCAACGCCGCGCCGCCGTGGTGGCGCAAAATCATATTCTGTTCCGCCAGATCGTTAAGATCCCGACGAATGG [...]
+NODE 2079 104 5545 5545 0 0
+TCCGCCCAACGCATTGTCGATATGCTGGTTGCCGAGTGCGACAAAGGCGGCGTAACGATGCGCCTGCGTAGCGAGGTACTGAGCGTCGAGCGTGATGAGTCGGG
+TACGCCGCCTTTGTCGCACTCGGCAACCAGCATATCGACAATGCGTTGGGCGGAATCATCGCAAAAAAGCTGTCCCAGCGTTTTCTCATGCCAGGCTATCCCAT
+NODE 2080 47 2128 2128 0 0
+ACTGGAAACCTTAACCTGGCAGTATCGTATTCAGGGTTGGAACGTGG
+TGCGCCGCCGCCATTCGGGCGCGCTGGAAGTTTTCTTTATTGATAAC
+NODE 2081 49 69 69 0 0
+CCGACGCCGGAGAGATTGTCGCCAGTCAACGCGTCGCTATTGCGCAGGA
+GTTAACCAGAACCCAGTTTAGCGGCGCACGGCCACGATAGGCAGGCAAT
+NODE 2082 59 3475 3475 0 0
+GAAAAATACACGATGTCTCATAATATCACCCGTAAATATTAAGATTATCCTTGCTGTTA
+GTATTTTTCCCATTGCTTCTGGTGTTGTCGGCTACAGCCTTTTCGGCATCGGCGATGGC
+NODE 2083 1680 67878 66910 0 0
+GCAGAAGCGGGAGATGAACCGGTATTGATTTATCAACGGACCGGCGCGCCTGTCGCGGTGGCGCCTGAACGCGCCGCGGCGGTGAAAGCGATTCTGGCGGCGCATAATGTGCAGATTATTATCACCGACGATGGGTTGCAGCATTACCGACTCGCGCGAGATATTGAAATTGTGGTGATTGACGGGGTGCGCCGTTTTGGCAACGGCTGGTGGCTTCCTGCCGGTCCTATGCGCGAACGCGCCAGTCGCCTGAAAACCGTAGACGCCGCTATCGTGAATGGCGGCGTCGCCCGGGCGGGCGAAATCCCCATGCAGCTAGCGCCTGGACTGGCGGTGAACTTACGCACGGGAGCGCGTTGCGATGTGGCGCAACTGAGCAATATTGTAGCGATGGCGGGCATCGGTCATCCGCCGCGCTTTTTCGCCACGCTGGAAGCCTGTGGCGCGCATCCGCAAAAGTGCGTCCCGCTGGCCGATCATCAAACGCTCGCC [...]
+TCCGAAAAGCTGCGCTGCCCGCTTGCGATCCCATACCACAGGATCGAAAGGCGACAGTACTGCGCTATGGGTCGCCTTTAAGGCGTTATTCAGCGCCGGTTCCAGCTGCGAAAGAAGATCGGCATGAAGCCACATCCGCCCCAACGTTTCCACCTCGACCGGAATAATCTGCTGCTGTTCCGCCCGGCTCTCCCGCCATCCCTTCAGGTCAGGACGTTTCAGGCGGTAGTAATCCGCCAGCCACTGTTCACGGAAAATCCCCAGACTGCGCGCGCTATTATCCAGCATCAGGTTTTCCGCCTGCGACTGTGACAGTCCATCGCGTTCATCATCCCAGTGCGGCATCACACGGGGCGTTAAATCATATACACGTTGAAAATTACGCCGCTCAACAACCATGACTTTTCCGGCGGTAAATAAACCCTCAAGGTGGCGTTTATGTGGTTTCCATTCCCACCAGCCGCTGACGCCTTTCCGCGCATGTTCAAAATC [...]
+NODE 2084 51 145 145 0 0
+GATTGATTGTCGGTTTAAGCGCGATGAACGGTTTCGAACGCGAGTTGAATA
+CCCGCCACGCCCAGCGCGATACCGATGGTAGAAATGACGGAAATGAGCGAA
+NODE 2085 30 1116 1116 0 0
+TGCGGCGCTGAAGATTTGTCTGGTGATGGG
+AGCGAACACGCCGATAGTGGCGTTAGAGAA
+NODE 2086 147 10229 10148 0 0
+TTCCTGTGTATTGATGGGTAACAAGACCCGCGCATACTAATAAATTCAATGAACCGTGAGATGTGACTATCTTCACTGAATGGTTGTGTTTTTAATTAATTTAATTATTTTTATTAACTCTGGTTAATTAAGGAAATAAAAACCATA
+AATTAAAAACACAACCATTCAGTGAAGATAGTCACATCTCACGGTTCATTGAATTTATTAGTATGCGCGGGTCTTGTTACCCATCAATACACAGGAAAATGTTTATGACCAACATGACCCAGGCTTCGGCGACGGAGAAAAAGGGGG
+NODE 2087 9 257 257 0 0
+ACCCGTCGC
+AGCAAAGAT
+NODE 2088 5 239 228 0 0
+ACCGC
+GATTG
+NODE 2089 113 6049 6025 0 0
+CGGTTATACCTTCACGCTGGAAAACTATCCCACTGCCGAAGTCAATCAGGAATACCTGCTGATGCAGACCTTGCTGTTTGTGCAGGACAACGCGCAGCACAGCGGGCAGGACC
+ATCAGCAGGTATTCCTGATTGACTTCGGCAGTGGGATAGTTTTCCAGCGTGAAGGTATAACCGGTCATGAGTGTGCGGATATTCCCTCCCCCCAGCACCCGACTGCCGGGGCT
+NODE 2090 20 1879 1879 0 0
+AGCACTTTACCTTTTCCACC
+GCACAAACAGCAAGGTCTGC
+NODE 2091 66 7245 4403 0 0
+GACAATCTGTGAGGTCGGGGTGACCAGCGGGATAAAGCCGAGGTCCTCGCGCACGCGGGGGATTTC
+GACCTCACAGATTGTCGGCACCCAGGCGGTGCTCAACGTCCTGACCGGCGAGCGCTACAAAACCAT
+NODE 2092 51 2752 2752 0 0
+CAGGGAAGTTACTATGTCATGCTCGTTTTCCGTGACGCGCGCGTTTGCCGT
+GATAATGATAGTAATTATCGTTATCTATCTTATTTGGTTATGTTAGCATGT
+NODE 2093 51 2477 2433 0 0
+ACTTTTTTCAGTGCCGGATCGCTCACCATTCCCGCCGCATTTTTCATCGCA
+TGTTACGCGAGAATGCCGGACTGGGCACGGAAGCAACCCGTGCTGAAATAC
+NODE 2094 2670 153864 152051 0 0
+CGACTCACCGTCGATGCCGTCAATTTTCAGAAAAATGTCATAAGCCATTTTTATATCCTTATTAAGTTTTACTTAAAATAAACCTGATTTTATCTATATCTTTTTGTTTATAGATAAATCATTGCCGTACAGAATCCTTCTCCAATAACTTCAGGAGAACAGAAGACTGTATATTTTTTCGGTACCGATAATGTATTTAGTTATTTTATGAATTTGCATTATTTAATGCATATGAATAATGCTTCATAACTTCCGATAATAAAAACCATAACCTGTACTGAAATTTTCACGTCTCAAATCGCTAATTACAGATAAAAGATACAGACTGGTTTTCTGGCGATCCCTCAAAATTATGAGTCTTACAGCGAGTAGAAGAAGCAGGTATTGGTTGCGTCAACCATATCTGTTCATGACCATAAATACACGAAACCCAATAGCGATCGGTTTCTTTATCGCTAACACGTTCTGTTTCCCATACAGACCAATTTTCAC [...]
+CGAACCTCCAGACCTACATGGATGGCAAGGCCGGGGCGGAAAATCTGGTCAATAAACTGTTGCAGGACCCGACTCTGCTGAAAACGCTGGCGAATGCGCCGAAATCGGCCGCTACCCAGCAAGGTGTGTCAGCGGATAATGAATCAGCGGAATAATGTCGAATTTTTAAGGAATTTTCATGGCAAACAGTAATATGCAGGCAACCGACGCGGTTGCTCAGGATACCGTCTCCGCATCCGGTGAATTTGATGCGTTGCTGAATCAGGCCTTCCGACCCAAGACTACCCAGGCGGCAAAAGCCGTGGAAGCCGCGGTGCAGACGCTGGCTCAACAGGCGCTGGCGAACACGATCACCGTCAGCGATGACGCCTATAAAAGCATCAGCGCTATTATTGCGCAGATCGACTTTAAACTGACCGAACAGATCAAACTGATCCTGCAACATCCCGACTGGCAGAAGCTGGAATCCTCGTGGCGCGGTATGGAGCATCT [...]
+NODE 2095 72 4796 4695 0 0
+ATGCGCCCACGCCCCAGGAAAGCGCGTAGAAAATCATAAAGAACAGCATACCAAATAGCGCGAAATAACCGG
+CTTTCCTGGGGCGTGGGCGCATGGGTGCTTATTTCTGAAATATTCCCTAACCGGATGAGGTCGCAGGGAATG
+NODE 2096 793 46889 46738 0 0
+GGTTTTCAGTGCGGTATCCGCCAGACCTTTACGCGCACCGTGCGTGGAGATGAAGTACTGGAGTACGTTCAGACCTTCACGGAAGTTCGCGGTGATTGGCGTTTCGATGATGGAGCCATCCGGCTTCGCCATCAGACCACGCATACCAGCCAGCTGACGAATCTGTGCCGCAGAACCACGCGCACCGGAGTCGGCCATCATGTAGATGCTGTTGAAGGAGACCTGCTGCTCTTCCTGGCCGTCACGGTTAATCACGGTTTCGGTTTGCAGGTTATCCATCATCGCTTTGGATACACGATCGTTCGCCGCAGCCCAGATATCGATAACTTTGTTATAGCGTTCGCCAGCGGTTACCAGACCGGACTGGAACTGCTCCTGGATCTCAGCAACTTCAGCTTCCGCCTCAGAGATGATCTCGTGTTTTTTCTCCGGGATGACCATGTCATCAATACCAACGGACGCACCTGAACGCGCTGCATAAGCAAAGCCGGT [...]
+CTCTGCATGCGCGCGTTAAAGTGCGTATCACTGAATATGAAAAAGATGAAAACGGCGAATTCGTTGCGCACACCAGCCTGAAAGACACGACCGTTGGTCGCGCCATTCTGTGGATGATCGTACCGAAAGGTCTGCCTTTCTCCATCGTCAACCAGGCGCTGGGCAAGAAAGCGATCTCCAAAATGCTGAACACTTGCTACCGTATTCTGGGCCTGAAACCGACCGTTATTTTTGCGGACCAGACGATGTACACCGGCTTTGCTTATGCAGCGCGTTCAGGTGCGTCCGTTGGTATTGATGACATGGTCATCCCGGAGAAAAAACACGAGATCATCTCTGAGGCGGAAGCTGAAGTTGCTGAGATCCAGGAGCAGTTCCAGTCCGGTCTGGTAACCGCTGGCGAACGCTATAACAAAGTTATCGATATCTGGGCTGCGGCGAACGATCGTGTATCCAAAGCGATGATGGATAACCTGCAAACCGAAACCGTGA [...]
+NODE 2097 6 393 393 0 0
+ACACGG
+ACAATA
+NODE 2098 1 138 138 0 0
+A
+G
+NODE 2099 744 47393 47312 0 0
+AATGTTACGAACCATAACACGTCTGGCTGTCCATGGGGTGTAACCGCCTAACCATGTCGGAAGGGATATTCCAAAGGGAAATTTTGACTTTTTAAACACTGCACGTGCAGTCCTGGACGCGTATGATGTGCCTTTAGTCGCTCCAGCGGGTTTCGCCCTTGTCCAGAGATTATTACGACCTGATAGCAGAGCAACAACGGCCCCGAAATCTGCAACACCAATCCCAAACTGGCTTGCGGTATTCTCACAAAAAATCATAAACAGAAGTTCGGCAGCAGTCAGATTGGATTTTCCTGCATAGAAGTATGTTCCATTTAGTTCTTCTACTGTATCCATTAGAAACTCTATAGTTGCTATTTTGGTTTACTTATTGTACAGCCTTGTTTCGAATGAAAGAAATCAATCTTTTGGGAAAGAACGGATCAAGATCACGGGAAATATCTGAAATCAGATGAAAGAGACGGTCGCGATTCCCACCAGGGGCATCACCTC [...]
+GACCCGGTTGACCTGAGAAGGTTTACCGGGTTTTTTGATATCCATAGTTTTTGGGGCTTAATCGGAGGCTTCACGGTTCGTTGGAAAAATGGAGCCCCCACGTATGGCATTAACCGATACAGCTATCCGCAAGATCAAACCCGTATCAGTATGCTGACATATAGATGTGTTCGGTTCAAACGGAGCGATCACACAAGCTTGCGAGGTGATGCCCCTGGTGGGAATCGCGACCGTCTCTTTCATCTGATTTCAGATATTTCCCGTGATCTTGATCCGTTCTTTCCCAAAAGATTGATTTCTTTCATTCGAAACAAGGCTGTACAATAAGTAAACCAAAATAGCAACTATAGAGTTTCTAATGGATACAGTAGAAGAACTAAATGGAACATACTTCTATGCAGGAAAATCCAATCTGACTGCTGCCGAACTTCTGTTTATGATTTTTTGTGAGAATACCGCAAGCCAGTTTGGGATTGGTGTTGCAGATTTCGG [...]
+NODE 2100 20 1112 1015 0 0
+TAATGAGGGATTGCATCGTG
+ACCCCGCCTGCGGTATCTAT
+NODE 2101 703 39315 38753 0 0
+GATAGCAATCATCCTGATTTTACTGACTATCTGGATACGATAAGCTGCTGTTGGCGAGCCCCGCTTAAAATAAGAATCGATGTAGTTGTTCTTTTTATGGCGGGGCGCTATTTTCATGGTATCCCACATCAGAAGGGCAATATCATGAATAATCGTCGTGGTTTAACCGCCGTCCTGGCGACGTTGATTACGTTTTCCCTGAGCGCTACGCCTGTGCTGGCGAATCCGGGAAATGGTAATGGCGGCGGACATGGTAATAACGCGGCTAATCAGGGTAATAACGGTAACGGACATAAAGGAAATGCCGGGCAAAAAACGGAACACCGTAAAAATGGCGGTAAACCGGATCACGTCGAGTCGGACATTAGCTATGCTGTCGCCAGGCAACTGGCAGTGAATTTAGGGCTGACGGGTTATCAGTCTTTACCTCCGGGGATTGCGAAAAATCTGACGAGAGGAAAACCGCTGCCGCCGGGAATCGCTAAAAAAACG [...]
+ACGCCAATAACGCCTGGTGGGATAGGCTCTTAATCAAATACGCCATTAATAATCGCCGTGACCACCGCGGTACTGAGCGCGATCAGCACCAGATTATCCCCAACGATTTTCCACTCATAGCCCGGATAATAAGGTAATTGTCCCAGCATAGACGCCGGCACCGTTTTTTTAGCGATTCCCGGCGGCAGCGGTTTTCCTCTCGTCAGATTTTTCGCAATCCCCGGAGGTAAAGACTGATAACCCGTCAGCCCTAAATTCACTGCCAGTTGCCTGGCGACAGCATAGCTAATGTCCGACTCGACGTGATCCGGTTTACCGCCATTTTTACGGTGTTCCGTTTTTTGCCCGGCATTTCCTTTATGTCCGTTACCGTTATTACCCTGATTAGCCGCGTTATTACCATGTCCGCCGCCATTACCATTTCCCGGATTCGCCAGCACAGGCGTAGCGCTCAGGGAAAACGTAATCAACGTCGCCAGGACGGCGGTTAAA [...]
+NODE 2102 1290 65843 64432 0 0
+GTTTCACAACTCTATATTAATGGGGTGGCTAATGGGATTCGAACCCACGACAACTGGAATCACAATCCAGGGCTCTACCAACTGAGCTATAGCCACCACTGAAACTTTTTACGCGGTATTAAACCACCGCAGCTCAAGCACCTAAATAAATGGTACGCCCGACAGGATTCGAACCTGAGACCTCTGCCTCCGGAGGGCAGCGCTCTATCCAGCTGAGCTACGGGCGCTTAGCGCCGTTGCGGGGGTGGATAATACGGACTTCACACCCCGCTGTCCAGTGCCTTTTTAAATAAAATGCGCGTTTGGTTATGCTTTGCGCATTTTGGCGCTTATTCCCCCACCTTGTGGGCGGTTCCGTGACGATTCAGGCCGAAAACTTTGTAGACCAGCGTGACGGCCAGCAGGAAGATGACGCCGACAAACAGCGACATGCGCGTATCTTCATTAAAGTACATGCCGATTAAAACGCAAACCAGAAACGCCATCGTCAAA [...]
+CCACGATTATTGTGATGATCATCATCGGCCTGGGGGTGATTTTCTTCGGCTTTGGTAACGGCGGCCAGGCGATTGGCTTTGGTAATCTGACCGAGCATGGCGGCTTTTTTGCCGGCGGCTGGAAAGGCTTTCTGACCGCATTATGTATCGTGGTGGCCTCTTATCAGGGGGTTGAGTTGATCGGTATTACCGCCGGTGAAGCGAAGAATCCGCAGGTGACGTTGCGTAGCGCGGTGGGTAAAGTGCTGTGGCGTATCCTGATTTTTTATGTTGGCGCGATTTTCGTGATCGTCACCATTTTCCCGTGGAATGAGATTGGCAGCAACGGCAGCCCCTTTGTACTCACCTTCGCGAAAATCGGCATCACCGCCGCGGCGGGCATTATCAACTTTGTCGTGCTGACGGCGGCGCTCTCCGGCTGTAACAGCGGAATGTATAGCTGTGGGCGTATGCTTTACGCGCTGGCGAAAAACCGTCAACTGCCGGCGGCAG [...]
+NODE 2103 240 13762 13633 0 0
+ACAAAGCCATGCCAGATGGCGTGGTTATAAGGTATGCGTTTGCAAACATAGAAAATTACGCCTAGCGAGTAAACGACGCCACCTACCGCCAGCAGCGTCACGCCGCCTATCGCCAGCTTAATCGCCAACTGATAAACCACTATCAGCGACAGCCAGCCCATTGCCAGATACGTAACCAGTGAAAGCACTTTAAATCGGTGCGCAATCGTCAACTTGAAGAGGATACCGAATAGCGCCAGG
+AAGTGCTTTCACTGGTTACGTATCTGGCAATGGGCTGGCTGTCGCTGATAGTGGTTTATCAGTTGGCGATTAAGCTGGCGATAGGCGGCGTGACGCTGCTGGCGGTAGGTGGCGTCGTTTACTCGCTAGGCGTAATTTTCTATGTTTGCAAACGCATACCTTATAACCACGCCATCTGGCATGGCTTTGTGCTGGGCGGCAGCGTGTGCCACTTCCTGGCCATCTATTTGTATGTGGGAC
+NODE 2104 1036 50957 50518 0 0
+TAACGTAGCCCGAACCATGACCTGTCAGGACAAATCACTTTTAGCCCCCGCTCTCGCTTCCACGCCCGTCATTCCGCGCTATCGCCAGATCATACGCAAACGGGCTGTGCTCATGTTAGCTATTGCGTTGGCGATGATGGCTTCACTGATGGTGGATGTAACCTGTGGGTCTTCTGGTTTACCGCTCAGTGCGCTATGGCAGGCGCTTTTTCAACCGGAAAAGGTGAATGCGGGCATACACGTTATTGTCTGGGATATTCGTTTACCCTATGCCCTGATGGCCCTACTGGTGGGCATGGCGTTAGGGTTAGCGGGCGCCGAAATGCAAACCATTTTAAATAATCCGCTGGCGACGCCGTTTACCCTTGGCGTATCGTCCGCAGCGGCTTTTGGCGCTGCGCTGGCGATTGTGTTGGGGATCGGTATTCCCGGTATTCCTGCCACCTGGTTTATCCCGGCCAATGCGTTCATCTTTGCGCTTTTATCCGCGTT [...]
+CAATAGAGGCCAGCGATAACACCAGCCCGCCTATCAGCACGCTGCCCGGAAGGTAGAAACGGTGATCTTCCCCCAAAAGTATTCGCGCAATGTGCGGTGCAACGAGACCAATAAAACCAATCGGCCCGACGAAAGCTACCGCCAGCGCTGATAACAAGCTGATACGCAACAATGACAGCAGGCGTAAACGGCGGACATGAATCCCAAAGCTCATCGCCCTCTCTTCGCCCAGACGTAATGCCGTGAGTTGCCAGGCGCTTCGTAACGCGCAAAAAAGCACAGCAATAAACACCACGGCCAGTACGCCCAATTTTTCCCACGACGCGCGGACCAGGCTCCCCATCGTCCAGAATACCAGCCCCTGCAGCGTATCTTCATCAGCCACAAACTGCATAATGGCGACCAACGCGTTAAAGGTGAATACCAGCGCAATACCGAACAACACCACTCCGGATGCGGCGACGCCTGTCCAACGGGTAATACCGTCCATGA [...]
+NODE 2105 112 145 145 0 0
+CAAAACAATCAATACCCAGTCTCGGCTACCTCCCTTCACCGGATAACTTGCAAATATAAGGTTTTCACATCCAAATTCAGCCAAAACAAGAAACGAGATTTTATTAACAAAT
+ACCTTATATTTGCAAGTTATCCGGTGAAGGGAGGTAGCCGAGACTGGGTATTGATTGTTTTGTACAAGTTCTAATGCATAATGTGTCCATATAGTAGCGTTAGCATAGGGCG
+NODE 2106 26 3993 1631 0 0
+TGTATGAAGGAATGGTGTATGCGGAT
+ACCAGCCTGTGGGCACGATCAATAAC
+NODE 2107 840 153782 143513 0 0
+TATTTTTGTGGCTTTCCTGGCTATTGCAACGGTGATTCTTTGCTTATTTATGACGGGGTGTGCACAACGTTATGAGAGTGGTCATGATCAGCTTTTCGAACTGTCAGAACGCCATATCATTTACCGGGATCTGACTGTTCCGGCATCGATGAGCAATTTGCCGGAGAAGCAGCAGATAAGCGTACCGGGGATTGAACCGTGAACGTCCGGTTAATTTTCATGCTGGCGTTTCTGATATCTGGCGGTATCAGCGCATCAACGGATGAAGAAATTCTACTGGCGTCGATAACCGCGCCAGGAGTTACCAGCTTTACCGATGAATCACCTTCTTCGGAATGGATTACAGCGATGCAGGGACGTTGGGGTAGTACAACTGATATGAAGGATATGCGTAGTTTGCGCGAGATAAGAGAAGCGGTGATTGCTGAAATTAATGCCGTGTCAGAGCCGGTGGTGGAGAAAACAGGGCCAGAAAACAAAGAATCGACCACA [...]
+CTTCCCCAGCGTTATATGCAGCCAGAGCAAGCCGTAAATCCCCGTATTTATCGAGAAGATATGAAAGATGCCCTGTACCAATTTTCACGTTGGTTTCAACATCAAATGGATCAGCATTATGCCTTTTGGTATGTACAGGCATTAACTGCATCAGTCCCTTTGCACCTTTTCTGCTGACAGCGTTTGGATTAAATCCAGACTCCGTTTTAATTAACGCTTTCAACAAAGTTTCACTAATTTGATATTTTTCTGCGTATTTATTGATTATCTCCTGTATTTTTTCAGATATTTTTATTCCTGTGGTCGATTCTTTGTTTTCTGGCCCTGTTTTCTCCACCACCGGCTCTGACACGGCATTAATTTCAGCAATCACCGCTTCTCTTATCTCGCGCAAACTACGCATATCCTTCATATCAGTTGTACTACCCCAACGTCCCTGCATCGCTGTAATCCATTCCGAAGAAGGTGATTCATCGGTAAAGCTGGTAACTC [...]
+NODE 2108 9 708 643 0 0
+AGGCGGAGT
+CGGCGATGA
+NODE 2109 24 1963 1421 0 0
+TACATCGTCATCGCCGCTATCGTC
+CGATGTAACCCCGCCCGACGATAG
+NODE 2110 2293 118636 116477 0 0
+CGCTCATGATCTCCGTCGGCAACAGACGCATCGGAAGATTATCGGTCACCAGCGGCAGCAATCCGGTTGGTCGTAACGTCAGCACCAGGGTAGAAACCAGAATACTGGAAGGCTCAAAGAAACCGCGAATCCGATCGACTATACTGGCCGCCTCCCCGCAGGTGATCGAGACTTCGTCGCCGTTGGTCATATCAACCAGGATTTCACGTCGCTCGCCGGGCGCCAGTGACAACTGTTTGACGGAAACCGGCGCAGGTAAAAAGCCCTGATCGCCTGAAATCACATGCAGCGCCCGGCCATCGCTCATCTGAAGCTGATAGCGCCGCGAGTTCGAGGCGTTCAACAACCGTAACCGCACCCAGCCGCGGGACACTTCGACATAGGGGCTTTGCGCGCCGTTCACCAGCAGCGTATCGCCGACAAAACCACCGCTTCCCGGTTCGCTGTACTCCGGCGTCCCAAAGTTATCCAGCCGTTTATCCTGGATAATGA [...]
+TGCGCCCTGAAGAGTTACAGAAAGTGGTCGGCGAACGCGGACGCCGTGGCACATTAATGCGCGGCCTGCAGCGTATCGATCGCATTGAGATTGATTCACCGCATCGCGTAAGTCATGGCGACAGCGAAGAGTAAGACAGGGGCACCCGTAGGCCGGACAAGGCATTTAAGCCGCCATCCGGCGCTCTGCCGTTGCCGGATGACGACGCAGTAGCGTCTTATCCGGCCTACGGTTTCAGATCGGATTAACATTAAAATTTCCCGTAAAACCGTTGTTTATTCGTGCATTGCGATTAACAATACGTTTTTCCAGAGAGCCACACTTACCAAAATCCTAACCTGAATTTCAGGTGACGTAGAATGCCGGGCTCTTAGGCCTTCAGAGGTTGTTATGCTATATATTTTTCGTCTTATTGTTACCGTTATTTACTCCATTCTGGTCTGTGTTTTCGGTTCTATTTACTGCCTTTTCAGCCCACGTAACCCAAAACAC [...]
+NODE 2111 892 46262 45877 0 0
+GCCTGGCAGCGCCTGCGTTGGTGCTGTTGGGCCGGTTATTACAAGGATTTTCTGCGGGCGTTGAGTTAGGCGGCGTCTCGGTCTATCTGTCCGAAATCGCAACGCCAGGCAATAAAGGGTTTTATACCAGCTGGCAATCTGCCAGTCAGCAGGTCGCGATCGTTGTCGCCGCGTTGATTGGTTATAGCCTGAATATCACGCTGGGACACGACGCGATATCGGAGTGGGGCTGGCGAATTCCGTTCTTTATCGGCTGTATGATCATTCCGCTGATTTTTGTTTTACGTCGTTCATTACAAGAAACAGAAGCGTTTTTACAACGCAAGCATCGCCCCGACACCAGGGAAATTTTTGCAACTATCGCCAAAAACTGGCGCATTATTACGGCCGGAACGCTGCTGGTAGCGATGACCACCACAACGTTTTATTTTATCACCGTTTATACGCCGACCTATGGCAGAACCGTGCTTAATCTCAGCGCGCGGGACAGTT [...]
+CTTTACCAGCGCGGTAGAGATGGCTGGCGTCAGGCCGCCAAAAATTGCCGTCGCCAGGCTAAAGGCCAGCGAGAAACCAACGGTACGCACATAGACTGGCATCACTTCGGTTAACGCCGCGACCATTGCGCCGTTATACATGCCAAAAAAGAAAGAGAACCACAGCAGTACCAGCGTCATGCGGGTAAAGTCGGGCGCGGCGGTCAGCCACTGCATGACGGGCCAGGTGGTGATCAGCGCCAGCAACGTAATGCCCATTAATACGGCGCGACGGCCAATCCGGTCGGAAATCGCGCCGCCAATGGGTAACCAGATAAAATTGGACACCCCCACCAACATGGTGACGATCAAACTGTCCCGCGCGCTGAGATTAAGCACGGTTCTGCCATAGGTCGGCGTATAAACGGTGATAAAATAAAACGTTGTGGTGGTCATCGCTACCAGCAGCGTTCCGGCCGTAATAATGCGCCAGTTTTTGGCGATAGTTGCAAA [...]
+NODE 2112 2723 166282 164819 0 0
+AGGCGTTTGCTCAGCGTAAACAGAGGTAATGAAGAAAAAAGGAAATATAAGGCTGAAGAAACGGCGTGCGCGTAGTGTTTTCCTTGCCATAGAGGTCTCATCCAGATTGCGCCATTATCTTTAATGGCGATTTTTTATCGTTTTCCATAACAGCAACCGCACAAATACTGTTATTACATTGCTCTCCTCTATGTGTAACAAATAACCACACTTAAAATGTTGTCTTTAATCAATTGTAAGTGTATGTAAAATACCACTTTAGAGTTAGTAACCTGGACAAAACTCCCTCTCTTTTCTGATTTCCGGACACGGATCACTTTTTTAAAAAATTTCATATAACGTCATGTTATCCCGAAAATTTATCTAATTTTGCGGGACACAATCAAAAAATAGATTGCTGCTTATTTGCACAGTTCCCTTTTTGCGTGATCTGTCGCCCAAATACTAAACAAAACTTATTAAGACCCTACATTTAACGTTTGTGCGACATAT [...]
+GTTGGCCGCACTCGCGCGCCCCAGCCACATAGTGAACTATGCTGCTGAGGATGTGCTCGCTTGCCGCCTTCCTGTAACACGAAATCCTTTGGGGGAGGGTTTTTTTATATTTCCCTCTCCCGGTTTGAGAGAGGGCAGGGGTAGGGTCGTAGGCCGGATAAAACGCGTTCGCGTTGCCATCCGGCATTTATGGTTATGACGGCATCGCGATGGCCTGCTTCTCTTCGAGCAGTTTCTCCACCACGCCAGGATCGGCGAGAGTCGAGGTATCGCCCAGATTGCTGGTATCGCCCGCCGCGATTTTGCGCAAAATACGGCGCATAATTTTGCCGGAACGGGTTTTTGGCAGTGAGTCGGTCCAGTGCAGCACGTCCGGCGTCGCCAGCGGGCCAATCTCTTTACGTACCCAGTTGCGCACCTCCGCGTACAGTTCTGGCGACGGCTCCTCGCCGTGGTTGAGCGTCACATAAGCGTAAATCGCCTGGCCCTTGA [...]
+NODE 2113 51 2274 1669 0 0
+TTCAGGTCCGGTGAAAGCGCAGGCGGAAGCGGAGGGTCTGGACAAGATCTT
+ACCCGGCACCACCAGCGCCTGCACGCCCGGCGCAACTTTGCGCCCTTTGGC
+NODE 2114 5 2398 804 0 0
+TATTC
+ATTGA
+NODE 2115 12 1008 1008 0 0
+TAAGAATCCGTA
+TGAACACGTAAT
+NODE 2116 33 2660 2660 0 0
+TCTTCGAGTGCCCACACAGATTGTCTGATAAAT
+GCAAGACGAAAAATGAATACCAAGTCTCAAGAG
+NODE 2117 1 104 104 0 0
+A
+T
+NODE 2118 2 103 103 0 0
+CA
+CC
+NODE 2119 115 6118 5922 0 0
+GTTATCTTACTTTTTGATATCGCCTCGTTGGTGCGAGGGGGGGGACTTGAACCCCCACGTCCGTAAGAACACTAACACCTGAAGCTAGCGCGTCTACCAATTCCGCCACCTTCGC
+TACGGACGTGGGGGTTCAAGTCCCCCCCCTCGCACCAACGAGGCGATATCAAAAAGTAAGATAACTGTGCGAAGGTGGCGGAATTGGTAGACGCGCTAGCTTCAGGTGTTAGTGT
+NODE 2120 447 20640 20578 0 0
+AAATACCGCCAGTGACCACATCCGGCGGCAGCGACGCGCCCACCGAAAAGGAACCGATAAACGCCAACTCCAGCGTCGCGCCCATCACAATTCCGGTTTCCATGTCGCCCAGCACCAGTCCGGTTAAAAGTCCGGTCACGATAGGTCTGGAAATCAGCGACGTCCCTAATGCATATTCAGACTGGGCGATAAACGCCACCAGTCCAAGTAAAAGCGCCTCTACCATAATATGTCCTCAGGAGGGTATCCGCTCAGGCAAAAAGTTGTTTACGATCGTTAGGCACCAGCCGAATTTCTATCTCTACTCCGCCAGCCGCCAGCTCCCGAAGTTGAGTCATTTCATCCGCTAACAGATTGATGGCTTTAGCAATATTCTGGCTCCCTTCACGTACCTTCGTGCCGCCTAAATTAATGCTTTTAATGTCGGGTAATTCGCGCGCCAGCCGG
+CGAAGGTACGTGAAGGGAGCCAGAATATTGCTAAAGCCATCAATCTGTTAGCGGATGAAATGACTCAACTTCGGGAGCTGGCGGCTGGCGGAGTAGAGATAGAAATTCGGCTGGTGCCTAACGATCGTAAACAACTTTTTGCCTGAGCGGATACCCTCCTGAGGACATATTATGGTAGAGGCGCTTTTACTTGGACTGGTGGCGTTTATCGCCCAGTCTGAATATGCATTAGGGACGTCGCTGATTTCCAGACCTATCGTGACCGGACTTTTAACCGGACTGGTGCTGGGCGACATGGAAACCGGAATTGTGATGGGCGCGACGCTGGAGTTGGCGTTTATCGGTTCCTTTTCGGTGGGCGCGTCGCTGCCGCCGGATGTGGTCACTGGCGGTATTTTAGGTGTGGCCTTTGCGATTAATTCCGGCGCTGGGGCGGAAACCGCGCTG
+NODE 2121 3594 159122 157219 0 0
+GTTACTGGAAGTCGTCAGCCCCAATTACGTCACCCCCACGCCATCAATGGCAGTGGTAAAGCTGTATCCCGATACGCAGGAAGGCGACCTGGCGAAAGGGGTCACCGTGCCGCGCGATACCGCGTTCGTTTCCCCTATCCCGGAAGGCGAAAATACCGCCTGCCAGTTTCGCAGCAGCCAGGACGTCACGCTGTGGCCGCTGTCCATCGAGGAGGTACGCCTGACCGCCGCGCCACCGGATATGCCCGCCCTGCACCGCTATCTGCCGCCTAATATTCATGTCGCCGGGGCATTGCGCATCACCCTGCGAACCTTCGGGGAACTGACTTTCAGCGAGCTGGCCGGTCCGGCACGGCTGCCCTTTTACCTCTGCGGCGAAGAACGCATTGCGTCACACCTGTTTGAGCTGCTGCATACCAGCGCCGTCGCCACACTGGCCGGTGAACCCGGTCACTTTGACGGCGAACTGAATGTGAATCTTCAACACCCGGT [...]
+ATCGCGAATTGGCCCCGGTTCAGCATTGTGTGGGAGGGATATACCGGGTGGCGCGTTGACAGGCGGCACATCCTCTGCCCGTGCCGGAACGGCATTATCCATAACCGTGCCTGCGGGAGCTGGCACTGGCGCTGGCGAAGGAGGGATTTCCGGTGTGGTTGTCTGTACCACGTCAGGCAGCAGCGCTAACAACTGCCGCAGGCGTGAAAAATCTGGAGCCAGATCGCCTAATGTCTCACGCGCCCACACTTGCAGGCGTTCTGCGCTTTCCTGCGCTTCGCGAAACGCTGCCAGCGGTAATGCCCCACGGGCTTCGAGGTCGGCCAGTTGCTGGCGGACGGATTCGGGGGCCAGCGCATCAGCCGGGCGAGGGGCGGATAACGCTCGCTCCACATCCCGTACCTGCAGGCGCAGGGCGGCACTGTTTGACAGCGTGATACCGCGAATGTCTGCCATCACGCCTTCGTGATCCAGCAGCGCCGCCAGGGCATT [...]
+NODE 2122 172 9611 9523 0 0
+TAGTGTGCTGATATGGCTCAGTTGGTAGAGCGCACCCTTGGTAAGGGTGAGGTCCCCAGTTCGACTCTGGGTATCAGCACCACTTAATACGGTTAAAGTTCGGCATTTGAAAAAGAATTTGTCTGGCGGCAGTAGCGCGGTGGTCCCACCTGACCCCATGCCGAACTCAGAA
+ACAAATTCTTTTTCAAATGCCGAACTTTAACCGTATTAAGTGGTGCTGATACCCAGAGTCGAACTGGGGACCTCACCCTTACCAAGGGTGCGCTCTACCAACTGAGCCATATCAGCACACTAAATTTGATGCCTGGCAGTTCCCTACTCTCGCATGGGGAGACCCCACACTA
+NODE 2123 1955 109231 107531 0 0
+TTAATCCTCTCTTGCCTGATGGCGCGCTTATCTGGCCTACCTGTCGTCCTCAGGCCGGATAAGGCGCTTGCGCCATCATCCGGCAACTATCATGATTTCTTGAGCGGCATTACTACCAACTGATGACGCGAATTATAGAACTTCCGGTAGGTTAAATAGCAGGCAATGATGGTAGACAGGCTGGCTGTCGACAACAGCATAAACGTTACCATAATTTGATATTTAATCGCTTTTACCGGATCGATCCCGGCAAAAATCAGCCCGGACATCATCCCCGGCAGGCTCACCAGCCCAACGGTCTTTGCCGAGTCGATCGTCGGGATAAGCGATGCGCGGATACTATCGCGGATAAGCCCGGCGGAGGCCATTTTCGGCGTTGCGCCCAAACTTAACTTTTCCTGGATTTGCTGCTGCTCGCTATGAAAACGTAGCCCCAGTTGGTTGTAGCACAGCCCTACCGCTACCATCGCATTACCGGCGACCATGCCAGCG [...]
+TTGAGATCACCTCCTGCGACGGAATATCCAGCACCTGCTCCATCATATTGATCTTGCGGCCAATTCTGTCCATAAACGGTACAACAAGGCTTAATCCCGGCTGCAGGGTTTTGGTGTAACGTCCAAAGCGCTCCACCGTCCACTGGTATCCCTGCGGAACGATTTTGACGCCCGCGCCGACGATCACCAGCGCGACGAAAATGAGAATAGGGATAAGAATGAGCATAGCTAAACCTCCTGTTGCGTTGTCCATAAACCGATTTTGCTGACGAATTAAGCGAATTATACCTGATTCAGTAAAGCATGTTCCCCCCTTATTAATTACAGGGATACACTATCGCTATAAAAATATGAACAACGGATGCGCAATAAATGACAGAACGTAGCATGTTGCTTGAGTTAAAGCAGGTCGGTTACCGGACTGCGACGACAAAAATAGTGAATAACATCAGTTTTACGCTGCAACGCGGCGAATTTAAGTTAATTACCGGT [...]
+NODE 2124 23 1023 1023 0 0
+GATGCGCCGCGCGCCGCCTATGA
+GATAGTGACGTTGGCGTTATCTT
+NODE 2125 28 1373 1373 0 0
+AGTCAGTAACCTGGAACTGGCGATCATT
+CGATAACCTGAATAAAACAGACCGCATC
+NODE 2126 124 933 933 0 0
+TAAAGGGGGTGAAAAGCCCCCTCGCCGTAAGTCCAAGGTTTCCTGCGCAACGTTCATCGGCGCGGGGTGAGTCGGCATTCGCACTTCTGATACCCACAGCAGCTTTTACAAGCTACCTTCGCAG
+CGACTCACCCCGCGCCGATGAACGTTGCGCAGGAAACCTTGGACTTACGGCGAGGGGGCTTTTCACCCCCTTTATCGCTACTCATGTCAGCATTCGCACTTCTGATACCCACAGCAGCTTTTAC
+NODE 2127 69 4046 4046 0 0
+CAGACCTTTCTTCAGACCTCTCTCTTCCAGTTGCTCTGCTATCGTCATAATAACCCCCTTGTGGCTGGG
+AGGTCTGAAGAAAGGTCTGGAGAAAGGTCTGGAGAAAGGTCGTGCTGAAGAGCGCTCCAGATTAGTGCT
+NODE 2128 27 1792 1792 0 0
+ATAGTGTGTGGATACTGCTTCAGAAAG
+GACGATAGCAGAGCAACTGGAAGAGAG
+NODE 2129 51 3145 3145 0 0
+CGCGGATTTGCAAACGCAGATCGACAGGCTTGCCCCGTTGCTGGAGACGCT
+GAACTCGGTCTGACGCTGTTGCCATATTTTCGCTTCGTCGGCGCGCTCATT
+NODE 2130 27 788 788 0 0
+GCCGCAGCCACAGTATCAGCAGCCGCA
+ATACTGTGGCTGCGGCGCTACCGGCTG
+NODE 2131 12 155 155 0 0
+GCAGCCGGTAGC
+CTGCGGCTGCTG
+NODE 2132 42 42 42 0 0
+GTATGCACCACGGAACCCGCCATCGCTTTCATCAGGTCGTAG
+AATACGGGCGCCAGAAGATCCTGGCGATCACGATTGTGATTA
+NODE 2133 4 1671 494 0 0
+TTGT
+TCCA
+NODE 2134 35 6218 5784 0 0
+GAATAGCAAGGCGTCTTGCGATTGAGACTTCAGTG
+ATCTGTGTGAGCACTGCAAAGTACGCTTCTTTAAG
+NODE 2135 51 2901 2901 0 0
+ACCGCCGCTTCCCTGCCGACGGCGAACCGTTCTTACAGTTTGCCAGAGACT
+TGAACCCTGAACCGCGCTATACCATCTTATCTGGTTGTTTATTATCATTAA
+NODE 2136 1540 82692 82027 0 0
+CTGGTTGAAGGCACCAATACGCTGCGTTTTACCGCACGCTATAAGGCAACCGCCACCGCCACGACGCCAGGCCAGGCTAATGCCGACGCCACCTTTATCATGAAATACGAATAATCCCGTCCGGGAACGCCAGGGAAGGGAGGCGCCTCAACGGAAGAGGCTATCGGGGATAAAAGAGAACATAGCAGATGATAAGGAAAGGCGCGGCGCTAGTGGGGCTTGTTTTGATGTCGCCCGTTATTGCGCAGCCGGTAATGGTGGAGAGCGGGCGTATTCACCTGCGCGGACAACTGGTCAATGGCGGCTGCGCTGTCGCCACAGAAAGCCAGGATTTGCGCGTACTGATGGGACAGTACCGCACGAATGCGTTTACCGGTCCTGGCAGCTTCGCTCCCGTCAGCGTTCCATTTTCGTTACGGTTAATCTCCTGTAGCGCGGAGGTCTGGCGTCATGTCGGCATTGCGTTTGCCGGCGTTACGCCTGCGGAAGATC [...]
+ATCGTGTTCTCGTGTGGCTTCACGCGATCTGCTTAACCGAGACTGGCCGTTGTCGCCGACGTCAATGCGCCGTAATCATTGACGGTCTGAAATGTCACGCTGCCCTGCGCGCCAGTCGGTAAGGGAATTTGCATGTCGCTTTTTGGCGCGATCATCACGTTATCAATCTTTTTCGCGCCCACGCTGATATTGACCAGCGTGAGGTAATAAGCAGATGGGTTGGTTATCTTGAGATGGTTGCCGACACGGGAAAATTTCAGCAAGGTCGGCGCGTCTTCCGGCGTCTGCGGCAAATTCGCCGGACGCACGAACAGTTTGATGCGCGACAGAATCGCCAGTTGCAGAACGTTTTTTCCTTCAATATGACTTTTATCGACCGACGGGATGGCTTTCACGTTCATCCAGAATAACGACTCCCGATCCCCGGGTAGCGGTTGCCCGGCGTAGATAATACGCAGCGTGTTTTCGCTTTTGGGTTCGCTGACGAATAAA [...]
+NODE 2137 48 1856 1856 0 0
+GATAAACCATGCCATAGCCAAAACCGTTTCCCCGCGCCTGGTGCTTTT
+GACAATCCGGAAAGTGTGGCGCGCACGTTATCTGCTCGCTACTACAAA
+NODE 2138 51 62 62 0 0
+GTTTTCAAATTGCGTTTACGTAACCTGGCGCTGAGATGATGTTGTGTTGCG
+CCGCGTTTCGCCTTGAATTGCCGGTACAGGGTCTCCATATGGTTATTGTGG
+NODE 2139 1763 82713 81315 0 0
+CGGGCTACCGTTTTGCCAGTGAGATGTTCCGTCAACGCGTGCTGGTCGCTGGTACGCTGAATAATGCGAAAACAATTCGTATTGAGCCACCGCTCACGCTAACCATTGAACTGTGCGAACAGGTATTGAAATCAGCGCGTAATGCGCTGGCGGCGATGCAGGTGAGCGTTGAAGAGGTTTAAAAACGATGCCGGATGGCGCTGTGCTTATCCGGCCTGTTTTCCCCGGGTCGCAGCCTCTTTTTTGAATCCCATCACAATCACCACATTCCCCTTTTCCCTTTTACCTCGCGACGGCTACAGTAGTAACTCATCCGACCACATAACAATAATTTTACATACTGGATACGCTTATGAGCTACCCGTCGCTGTTCGCCCCGCTCGATCTGGGCTTTACTACTCTCAGAAACCGCGTGCTGATGGGATCGATGCACACGGGTCTGGAAGAACATCCTGATGGCGCCGAGCGCCTGGCGGCATTTTATGCCGAGCG [...]
+AGATCCTCTGCGTTCACCCGTTGGTTCAGTTTCAGCGTAACGCCAGTAATATCGATCATTCGACGGTAGTAGCGCAGCGTTTCGTAAAACTCCTCTTTACCCGGGATCTGCCTGGCGATAGTAAACTGGCCGCCAATTTCACTCTGGGCGTCAAACAGCGTGACATGATGGCCGCGCGACGCGGCGTTAATCGCGAAAGCCAGCCCCGCCGGGCCTGCGCCGACAACGGCCAGGTTCTTTTTGCGTATGGCCGGCGTTATCGGCATGTGGGTTTCGTGACAGGCGCGTGGGTTCACCAGACAGGAGGTCACTTTGCCGATGAAGATCCGATCCAGACAGGCTTGATTACAGCCGATACAGGTGTTGATCTCATCTGCGCGTCCGGATTGCGCTTTAGTCAGGAATTCGGCATCGGCAAGGAAGGGACGCGCCATCGACACCATATCAGCATCGCCGCGCGTCAGGATCGTCTCGGCGACCTGCGGATCGTTA [...]
+NODE 2140 18 986 942 0 0
+ACCCGCCCCGGCAACTGC
+TGATATGCCCCTGCTTTA
+NODE 2141 9 3670 2642 0 0
+AGTGTCTGG
+ATTAAAGGG
+NODE 2142 4 1645 1150 0 0
+TGGG
+AAAC
+NODE 2143 17 6977 4739 0 0
+TAGTTTGACTGGGGCGG
+GTCCACGTTAGAACATC
+NODE 2144 45 6501 6454 0 0
+AGAGGGTTAAATTCACTTTTACCTGTTCATGAAAACACAGGAAGG
+TGCAGAGGGTTTTTATTTATGTGCATAGATGAGTTTTCTGTGTAG
+NODE 2145 437 20780 20717 0 0
+CCTGCGGTTTGGCCGCCGGTTTCGCGCTCTTTGCCTGTAGCCATTTGCCTGCCTCGACGTCCGCCGTCCAGCGCTTGAACTCATATTTTTTAAACAGGCCCAGCAGTTCATCCGCAATCGGCTGCTGCACTTCAAGCTGTTCGCAGGTCAGCTCCAGCTCAACATCCGTTTTAATGGTGGCGAGTTTATAAGACAGGTACGCTACGTCTTTATTCTGCGCTAATTTAGCGGCCATCGTTTTGGCGCCGCGGAAAGTGAGACCGGCAATTTTTTCCGGCTCGGCGTACAGCGTATCCAGGCCGCCCAATCCCTGAAGCAAGGCTTGCGCCGTCTTCTCACCCACGCCTGGTACGCCCGGAATATTATCCGAGGAGTCCCCCATCAGCGCCAGAAAGTCGATAATCAGCTCAGGCGGCACGCCGTACTTATTAACGACT
+CGCTGATGGGGGACTCCTCGGATAATATTCCGGGCGTACCAGGCGTGGGTGAGAAGACGGCGCAAGCCTTGCTTCAGGGATTGGGCGGCCTGGATACGCTGTACGCCGAGCCGGAAAAAATTGCCGGTCTCACTTTCCGCGGCGCCAAAACGATGGCCGCTAAATTAGCGCAGAATAAAGACGTAGCGTACCTGTCTTATAAACTCGCCACCATTAAAACGGATGTTGAGCTGGAGCTGACCTGCGAACAGCTTGAAGTGCAGCAGCCGATTGCGGATGAACTGCTGGGCCTGTTTAAAAAATATGAGTTCAAGCGCTGGACGGCGGACGTCGAGGCAGGCAAATGGCTACAGGCAAAGAGCGCGAAACCGGCGGCCAAACCGCAGGAAACGGTCGTTATTGATGAATCGCCCAGCGAACCGGCAGCGGCGCTCTCT
+NODE 2146 25 68 68 0 0
+GTGCCAGTGTTGGTTGCTGCTGACC
+GACTGGTCAGCAGCAACCAACACTG
+NODE 2147 1 177 177 0 0
+C
+T
+NODE 2148 6 1083 1083 0 0
+AACACT
+CGCCAG
+NODE 2149 1 174 174 0 0
+G
+T
+NODE 2150 2 341 341 0 0
+GC
+AG
+NODE 2151 51 2764 2764 0 0
+ACTGCCCCACACCACGCGAAGTTCGCCTTGCTGTTCTACGCCGCGCACGTA
+TGGTAAAGAAAGCACCTGTACAGTGCGTTACCAATTAGCTGAAACCACGGC
+NODE 2152 11 1006 1006 0 0
+CTCCAGCGCGG
+ATTGCCGCGAA
+NODE 2153 10 984 984 0 0
+TCAGCGCCAT
+GCTGGCGGTG
+NODE 2154 153 5718 5718 0 0
+GCCCGCTTCCGGGATATTGGAGAGCAGGCCGCCGAAGCCAATCGGCAGCAACAACAACGGCTCGAACTTCTTCGCTATCGCCAGCCACAGCAGCAGCAGGCTGACCAGCAGCATGATGGCCTGGCCTGCGCCAAGGTGCATCAGCCCCATGCC
+CAGCCTGCTGCTGCTGTGGCTGGCGATAGCGAAGAAGTTCGAGCCGTTGTTGTTGCTGCCGATTGGCTTCGGCGGCCTGCTCTCCAATATCCCGGAAGCGGGCATGGCGCTGACCGCGCTGGAGAGCCTGCTGGCGCATCACGACGCCGGGCA
+NODE 2155 461 22677 22502 0 0
+TGCTGCTGCCAAACGCGCCAAAGCGCGACGGAAGCGGTTAATAACGCCGGCTGCGTCTGCCAGGTTTTATTCAGTTCTTCCGCTGGACCTTGCTGGGTGAGCGCCCACAGATCATATCCCAGAGCCGCAGAAGCTTCAGCAAACGTTTCTTCTACGATAGGGTAATTTGCCGCCATCTCGGCCAACATCCCAACGCTCTGAGAACCCTGACCGGGGAACACAAATGCAAATTGCGTCATGTTTAAATCCTTATACTAGAAACGAATCAGCGCGGAGCCCCAGGTGAATCCACCCCCGAAGGCTTCAAGCAATACCAGCTGACCGGCTTTAATTCGCCCGTCACGCACGGCTTCATCCAGCGCGCACGGCACAGAAGCCGCGGAGGTATTGCCGTGCCTGTCCAGCGTGACGACGACATTGTCCATCGACATGCCGAGTTTTTTCGCTGTCGCGCTAATGAT
+CGTCACGCTGGACAGGCACGGCAATACCTCCGCGGCTTCTGTGCCGTGCGCGCTGGATGAAGCCGTGCGTGACGGGCGAATTAAAGCCGGTCAGCTGGTATTGCTTGAAGCCTTCGGGGGTGGATTCACCTGGGGCTCCGCGCTGATTCGTTTCTAGTATAAGGATTTAAACATGACGCAATTTGCATTTGTGTTCCCCGGTCAGGGTTCTCAGAGCGTTGGGATGTTGGCCGAGATGGCGGCAAATTACCCTATCGTAGAAGAAACGTTTGCTGAAGCTTCTGCGGCTCTGGGATATGATCTGTGGGCGCTCACCCAGCAAGGTCCAGCGGAAGAACTGAATAAAACCTGGCAGACGCAGCCGGCGTTATTAACCGCTTCCGTCGCGCTTTGGCGCGTTTGGCAGCAGCAGGGCGGTAAAATGCCTGCGTTAATGGCAGGTCACAGCCTGGGCGAATATT
+NODE 2156 101 4400 4400 0 0
+ACCCGCTGCTTTTGCTTCGCTTACGCCTTTTTCAGACAGGTCAACATCATACCAGCCGGTGAAACGGTTCTCTTTGTTCCATTGACTTTCACCGTGACGTA
+TATGATGTTGACCTGTCTGAAAAAGGCGTAAGCGAAGCAAAAGCAGCGGGTAAACTGCTAAAAGAAGAAGGTTTCAGCTTTGATTTTGCCTACACTTCCGT
+NODE 2157 3077 171662 168194 0 0
+TTAAAGGAATGGCCCATACCGTACCGAAAGTCTGAATAATCCCTAACAGGAAAGTACAAATAATAACGGAACGATATCCCCCCATTCGGTTGGCTAATACGCCGATGGGACCGCCGGAAAAGAAGAGCGGAACAAAACCAGGCAATACCATAATAGGGCTATGGATGAGCAGCAGAATGCCCATGGAAAAAATCGTGCCGAAGGTACAAAAGACGAATCCCAGCGTAGCCGCGTTCGGCGAAAAAGGTAATAAAGCAGCAACATCCACAGCCGGTATAGCGTTAGGAATAAAGCGATCCTGCCATCCTTTAAACGAACCGTTAATTTCGCCTACCATCATCCGCACGCCCTGCAGCAAAATGACCATATACATAGAGAATTGCAGGCCCAGATTGATGATATAGATATACCAGGGTTTGCCTTTCGCCATTAACTGTACGTTATCGATCCCTGTCGCCAATAGAAAACCGCCAACGAAGAGCGTCATCACAA [...]
+TACGCGGGATGGGCGAGTTTATTCATCGCAGCGTGCAGACGTGGAGCTTAACCCTTGTCTTTCTGGCCAGCTTAGTGCTGGTCTTTGTTGAAATTTATTGTGCGTTTTCGCTGGTGAAAGGCCGTAGCTGGGCGCGCTGGGTGTACCTGGCGACACAAATTATTGTGAGCGGATATCTGTGGGCGGCGTCGTTAGGCTACGGGTATCCGGAGTTGTTTAGCATCGCGGGAGAATCGAAGCGTGATATCCTGCATTCCCTGGTCATGCAAAAACTCCCCGATCTTTTAATTCTGTTTCTGCTGTTTATTCCCGCTCCCAGCCGTCGGTTCTTCCGGCTGCAATAATGTGTATAATCGTCGCCCCGGATAATATGAAGGTTTTTTGGTATGCAGTGCGCACTCTATGACGCGGGTCGCTGCCGTTCCTGTCAATGGATTACGCAGTCGGTTAACGAACAACTTTCCGCAAAAACAGCCGATTTACATCGTTTGC [...]
+NODE 2158 51 3388 3360 0 0
+CGCCAGCATGGCGTACATTATGGTCAGGGCTGGTTATACAGTAAACCCCTA
+GTAGCCACTGTTCTTGCCTGGTCGTTTCGATGCCTTCTGCGACCATCTTGA
+NODE 2159 11 1143 1118 0 0
+CATCCGTTTAT
+GGCGGTCGGCA
+NODE 2160 2354 107471 105072 0 0
+CCACCCCCTTTCCGCCGCGGTCGATCCTGCCTGGGAATCCAAAAGCGACTGGGAGATCTACAAAGGCATCGCCAGCGCCTTTTCTGAAGTGTGTGTCGGACACCTCGGACAGGAAACCGATGTGGTGTTACACCCGCTCCAGCATGATTCCCCGGCGGAACTGGCGCAGCCATTTGATATTCTCGACTGGCGTAAAGGCGAGTGCGAACTTATTCCGGGCAAAACCGCCCCCAATATCGTCGTGGTTGAACGCGATTATCCGGCCACCTATGAACGTTTTACCTCGCTGGGTCCCCTGCTGGATAAATTAGGCAACGGCGGTAAGGGTATTGCCTGGAATACGCAAGATGAAGTCGATTTCCTCGGTAAGCTCAATTACACCAAACACGATGGCCCGGCGAAAGGACGTCCGCGAATAGACACCGCGCTGGATGCTTCGGAAGTGATTCTTGCCTTAGCGCCGGAAACTAACGGTCAGGTGGCGGTGAAAGC [...]
+CGGCGACCGTTGGGCGGCGTCGATGACGTTTTGCGGGATGCCCTGTTTAAGCGCCTCTTCAATGACCGCCGGATCGTGCGGATTGAGAAACACATCGCACTGACGTTCATACAAATCTGTCTCGTGTTCGGTACTGGCCGCTTCTTCAATCCTGTCGGCGTCGTAGAGCAGAACGCCAAGATAACGGATGCGCCCGACGCAGGTTTCCGAACAAACGGTCGGCTGGCCGGATTCAATACGCGGATAGCAAAATATGCACTTCTCAGACTTGCCGCTCTTCCAGTTAAAGTAGATTTTTTTGTACGGGCAGCCGCTGATACACAAACGCCAGCCCCGGCATTTATCCTGGTCGATTAGCACGATGCCGTCTTCTTCACGCTTATAAATAGCGCCACTTGGGCAGGTGGCGACACAACTGGGGTTCAGGCAGTGTTCGCACAGGCGCGGCAGGTACATCATGAAGGTGTTTTCGAACTGACCGTACATCTCTTT [...]
+NODE 2161 1445 71748 70497 0 0
+GATCGGGATCAAAGCCCATTTCACGGGCATGGGCGGCATAGTTGCGACCCACGCAGTAAACGCGACGTACCGGAAACTGCTCATCGCTGCCCGCCACGGGTACTGTCACCGGGGCCTGCGGCTGGAATACATATTTGGTCATGTTCTCTCTCCCTAATTAATAACGTGCTTCGCGGAACAGCCCCAGGGCTTCCTGAACCGGCTTGTCCGAAAAGCTGAATAACACCGTGTCTTCGCTGCTGCGAAACGACACCTCATGCCAGGTCGGCGCCACAAAAATGTCTTTTGCGGAAAAATGAAAAGTTTCGTTGCCGATAGTGACCAGTCCTGCCCCTTCAACGACGTGGTAGATAGTGCTGTCGGTGCTCCGCGCCACACGCGAGGCAAAGCCTTTTGGCAGCAGTTGCAGGAACGCGCCCATCGACGGCATCGGATAACCGCCGGTGACGGGATTAACGTAACGCAGCTTGTAACCTTCCCACTCATCCGGAT [...]
+GGGGCGATTGTCGGTTCGCTCTCCGGCGGCATGATGATGGCCCTCAATTTCTCTTTCGATACGTTGTTTTTTGTCATTGCTATTCCGGCGGCTATCAGCGCGGTAATGCTTACCCTGCTGACGGTGGTTGTCCGCCTTTCGATTTCTGTACCTGACGACCTGCCGCGTGCCAGCGTCGTAAACGAATAAGGAGAATCTCCATGTCTGAAATAAATCAGAACGTAAAAGATAGCCGTCAGCAGTATTACCAGCATATTTCCGGGCAGAATCTGACGCCGCTGTGGGAATCGTTACATCACCTGGTACCGCAGACGCCAAACGCCAACTGCGCGCCGGCCTACTGGAATTATCAGGAAATTCGTCCGCTACTGATGGAAAGCGGCAATGTCATTGGCGCGAAAGAGGCGATCCGCCGGGTGCTGGTGCTGGAAAATCCGGCATTGCGCGGTCAGTCGTCGATCACGGCGACCTTATACGCTGGTTTACAGCTGA [...]
+NODE 2162 6 763 763 0 0
+TTCCGG
+GGGCAT
+NODE 2163 3 265 265 0 0
+TTT
+GAA
+NODE 2164 38 2226 2188 0 0
+ACCAGCACCACAACACCCGTCGCGACCAGGGTAGAGGC
+CAACGTCTTTACCATCATCCAGCCGGTGATTGAAGCTG
+NODE 2165 1660 89967 88973 0 0
+ATACGCTTCGGCGTTCAGTAACACGCGTTAACATGCTGAACAGCCGGGCATTTTTTTACGCTATACCCTACATAATAAAACCGGAGCTACCATGAATAAGAAGGTACTGACCCTTTCTGCCGTGATGGCAAGTCTGTTATTCGGCGCGCACGCGCACGCGGCTGATACTCGTATTGGCGTGACGATTTATAAATATGACGATAACTTTATGTCCGTGGTGCGTAAGGCTATTGAAAAAGATGGCAAATCCGCGCCGGATGTTCAGCTACTGATGAATGACTCGCAAAACGATCAATCTAAACAGAATGATCAAATTGACGTTTTATTGGCGAAAGGGGTTAAAGCTCTGGCGATTAACCTGGTCGACCCGGCAGCCGCCGGTACGGTGATTGAGAAAGCGCGCGGGCAAAATGTGCCGGTGGTGTTCTTTAACAAAGAGCCTTCCCGCAAAGCGCTGGACAGCTATGACAAGGCGTATTATGTCGGGACTGA [...]
+ATCCTGGTACATTTTATCCTGGTCGACAAACATACCTTTGGTGGGATAACGTCCCAACCACATGTTATCCATGACCGAACGTTGCAATACCAGATTTAACTCCTGGTGTACCATCGAAATCCCATTCTCCAGCGCTTCTTTCGCCGAATGGAAGTTCACTTCTTTTCCCTGAAATACAATGCTGCCGGAGTCTTTTTGATAAATACCGAAAAGACATTTTAATAATGTTGATTTGCCTGCGCCGTTTTCGCCCATTAATGCATGAATAGAGTGCGGACGAACGTTTAAGTTGACATTATCAAGCGCTTTCACGCCGGGAAATGATTTGTTAATGCCACGCATTTCCAACAAATATTCACCCGACGACGGAGAGATCGTGCTGCCCATAATGATACCCTGTCGGCCTTTTTAATTATGACTATCCGCGCCGGATGGCAAAAGAAATACGTTATCCGGTCTGCGGCGCGTCACCCTTCCACGGTTTCAGGGCGC [...]
+NODE 2166 1280 63485 63090 0 0
+GCCTTTGTTTTCCCGCGCCAGACCAAGCGGAATCGCGATACAAAACATCACCGGCAGGAAGCTAAAGGCAAAAGAACCTACTTTACTCATCCAGGTGAAGATAGCCTGTAGCAAGGGATTACCCAGCACGGGGAGCAGGGTGATAACGTCGTGGCTACTGAGTGAGCTGCCGATACCGAGCATAATGCCGCAGAACGAGAGCAAGGCGACGGGCAACATAAACGTTTTGCCCAGTTGCTGGAAAAATTCCCATAGCGTTATTTTTGGCGTGGTTTTCGTCGTCATCTAACGACTCCTTGTTAATAAAGGCCGGTGTCAGGTTATGATGGCGAAAAGATAAAACGTTTTATCAAATTTTAGTGCGGCATTAATCACATTACTGACCGATAATAACGCGTATAAAGATAACAGATAGGTAAAACGTTTTATCTGTCAGATTCTGGAGCGATTTGTTGACATGGCTATCGCCAAAAAAATCACTATCCACGATGT [...]
+GCCCCCATCGCAATGGTTTCGTTGTAACAAACGACAGCGCTAATGGTCGGATTGTATCGCAACAGCGCGGTAATGCTTTCTGCTGCCTGTTTCTGACTGGAAGCGCATTCCACGACCCACTCGCTGTGAAACGGTAGACCGTATTTTAACAACGTCGCGCAATAGCCGCCCACGCGCTCCGCGCGGGTTAAAGATGCGCTTTGTCCTCCCAGCCAGGCGATGCGCTGATGGCCCTGACGAATAAGGTACTCCGTCAGGAGCTGCGCCGCCTGCATGTTGTCAGGCCGAACGGTATCCGCATCATCAAGATAGCTGGCGCGTGACGCAAACACCACCGGAATACCTTGTGCGTCGGCCTGCGCTCTCAGCGCTTCGCTACTACCCGCCGCACCGGCGATCACCATGCCATCCACGCCCTGATTAAGCAGCATGGTAAAACGCTGATTTAGCTGTTCGCCATCTTTCCCCCCGTGCAGGAGAAAAACCATACGG [...]
+NODE 2167 7 353 353 0 0
+TTTTGAT
+ACCCTCG
+NODE 2168 51 1391 1391 0 0
+AGGACGGGCTTCTTTGCGTGTGTGGTAACTGTAAAAATGTAGGCCTGATAA
+TGACGGACGGGCTTCTTCACTTGTCTGATGCCTGGCAGTTTATGGCGGGCG
+NODE 2169 21 1544 1544 0 0
+GCGCAGCGCCATCAGGCAACC
+CACACGCAAAGAAGCCCGTCC
+NODE 2170 16 547 547 0 0
+GGCACCGCCGGATGGC
+ATTTTTACAGTTACCA
+NODE 2171 51 3169 1261 0 0
+CGTCCAGCTTTTTGGTGAACGGTTTTTAGCATAACAGCTTCGCGAAATAGT
+GCCATACGCGCCCTGTTCGGGCCTGGCTCAAGCTATTATGGCAGCGTATCG
+NODE 2172 36 2735 2735 0 0
+AAAATCCTCACGTACTACGTGTACGCTCCGGTTTTT
+ACCAAAATGGCAAGTAAAATAGCCCTAATGGGATAG
+NODE 2173 139 6031 5642 0 0
+GTCGCCCGTACCCGCGTGATGGTCTGGCTGTTCCACGCGCAGCCAAGCCAGCGCGCTAACGGTTGACATAACAGATCGCTTTGGTTAAATCCCCGCCGCCAGTGTCGGCGCGACCAGAGCGGAACGCTGACGATTCTGT
+TTTAACCAAAGCGATCTGTTATGTCAACCGTTAGCGCGCTGGCTTGGCTGCGCGTGGAACAGCCAGACCATCACGCGGGTACGGGCGACCGCAACACAACATCATCTCAGCGCCAGGTTACGTAAACGCAATTTGAAAA
+NODE 2174 291 14582 14463 0 0
+GCGGTAAACTCCAGCAGCGACTCATAGGTCAGACGTGAGTCAACGCGAATTCGGTCCAACTGCGCATCGGCGAAATCGCGCAGCACGCGCTGCGCCAGCGCCAGTTCGCCATACATCTGGTAGCGCGTTTGCGGACGCTTTTTGCGCTCCATGACTTTCGTCCAGACGCGCTTGAGATAGGCGGCATCAGACGCGAGATCCTCTTCACACACGCCTTCCGCCGCGGTACGGATAATAAACCCGCCCTGTTCGTCGCAGTATTCCGCCACCACCTTTTTCAGGCGCTCGCGT
+GGTTTATTATCCGTACCGCGGCGGAAGGCGTGTGTGAAGAGGATCTCGCGTCTGATGCCGCCTATCTCAAGCGCGTCTGGACGAAAGTCATGGAGCGCAAAAAGCGTCCGCAAACGCGCTACCAGATGTATGGCGAACTGGCGCTGGCGCAGCGCGTGCTGCGCGATTTCGCCGATGCGCAGTTGGACCGAATTCGCGTTGACTCACGTCTGACCTATGAGTCGCTGCTGGAGTTTACCGCAGAATACATCCCGGAAATGACCAGTAAGCTGGAGCATTACAGTGGCCATC
+NODE 2175 177 8682 8461 0 0
+GAGTAAATCCGCCGGACGGCAGGTCACCGGGGCTGCCCCTTCCAGCACGCGGGCCTGCAGTGCCGCGTTCACCGGCACCGGGGTGTGGCCGTATTCGCCTTTCAGAATGCCGGCCGTTTCTTTGGCGATGGTTTTGTAGCGCTCGCCGGTCAGGACGTTGAGCACCGCCTGGGTGCC
+CGCCAAAGAAACGGCCGGCATTCTGAAAGGCGAATACGGCCACACCCCGGTGCCGGTGAACGCGGCACTGCAGGCCCGCGTGCTGGAAGGGGCAGCCCCGGTGACCTGCCGTCCGGCGGATTTACTCAAACCGGAACTGGCTGAACTGGAAGCGGACGTCAGGCGCCAGGCGCAGGA
+NODE 2176 24 954 880 0 0
+ACCACCAGTCCCGCCCCTTTCACC
+TAAACGTGGGCGATACGCTATGGT
+NODE 2177 136 4846 4846 0 0
+CGACAACGCCACGCTGGAGCTGAACACCGGCGGCGATTTTGACAACAACATCGGCGGTACGGGCAGCGTGGTGAAATCCGGCGACAAGACGCTCACGCTCTCCGGCGCCAATTCTTATACCGGCGGCACCACCATC
+TGTCGCCGGATTTCACCACGCTGCCCGTACCGCCGATGTTGTTGTCAAAATCGCCGCCGGTGTTCAGCTCCAGCGTGGCGTTGTCGGTGACGTCGCCGCTGCCCAGCGCCTCAACGTTGCTGGCGACCAGCGTGCC
+NODE 2178 32 2328 1886 0 0
+AGCGGCGGCACGCTGGTCGCCACCAACGTTGA
+ATAAGAATTGGCGCCGGAGAGCGTGAGCGTCT
+NODE 2179 9 1892 796 0 0
+GGCGCTGGG
+GCCGCCGGT
+NODE 2180 89 3484 3484 0 0
+CGTTCAGCTCCAGCGTGGCGTTGTCGGTAATGTCGCCAGTGCCCAGCGCCTCAACGTTGCTGGCGACCAGCGTGCCGCCGCTGATGGTG
+CTGGCGACATTACCGACAACGCCACGCTGGAGCTGAACGCCGGCGGTGACTTCGCCAACAACATTGGCGGTACGGGCAGCGTGGTGAAA
+NODE 2181 2 229 154 0 0
+GT
+CA
+NODE 2182 3231 179646 178789 0 0
+TCAGTAAGTAACATATCTGCATCAAGATATATGCAACCGCCGCCTGGTTGCAGATGATGACAACCAGGTTTACCAGCTTCCAGAAAAGCATCGCTTCCTTTTAGCAGGAAAAGATTTCTGTAGAAGTCAAACCATAAGTGCCCTTTGTCTTTATTATGAGATGAAATAAGCGTTTCCTCCGGATTGTTTTTCAAGACATCTTCCAGGCTTTTTTTTACCCCGTTAAGCAAGACCTCATCTCGTTCACTTGCTGACTGAGCTTCCAGTTTGGTGATGTTTTCTAAATAAATCGTCGTTAACTTTTTATCATACATGCTATAATTAAGGTCAGAATTATAAATAACCTTTATGTTTCTATAATTTTGTTCCAATTTTGCCAATGCTTTTCTTTGTCCCTTGCTAAAATCGCCATCAACGAAAATACCGATAATTCTTTCTTTTTCTATTATAGCAGCATTGATAATATTATTAAGATAAGGGTTTTTCTGCGTA [...]
+TGGCGTTTGCTATACGGGTATCAGACGCCTGATCCCCATTATCCGCTCCATTCACCATGCTAAACGTCAGCAGCGCATTATCAGAACCGGTATAGCTGACAAAAAAACCGGCGTGATCCCATCCCTTTTCACAAACGTACTCAACCTCCGTGTGGTGATCAAATTCGTTATCCACAGGAATATGCTCTGAAAACCAACCTACCTGCCCCAACAGGTAGTTAAAACCGGGTATCGGCTTATTAATATCAAAACTTTTCATCCACTTATAATCAACCCCAGCCCCAATTCGGTACAGCACATACATCCCAACTTTTTTATCAATCAGGGTATTAATTTTCGCGTTGTCTCGCTGCTGAAAAGCGATAATCACCTGTCTTGCCGTCTCTTCAAACGACGGAGCGGCACAAACGGGATGCGCGACCATTCCCAGCAGACTCAACGCGATGGCCGTGCGGCTCATTTTCATCATTGGCTCTCCATTAACATCCGGTG [...]
+NODE 2183 33 1533 1533 0 0
+TGAGGTTTGACTCGCTACGCTCGCCCTTCGGGC
+GCGGTTTTTGCGCGCTGTCCGTGTCCAAACTGG
+NODE 2184 2251 125632 123866 0 0
+ACATCACGAGGCCCGCGATGGGGTAGTACCAGGAACCGCCAATAGCAACCAGCCAGACACCTCCGATAAGAAGATACAGCCCACAAAGTGCTGCAAAGAGGGCCGTCAGCGTCACGAGTAATCGTGGCGATCGTGCGTTATTTTCTGCCATAAAAAGACACCATCCCAAATTGTTAATTTTTTAGTAGCAATTAAGTATAGGAATTAACATGTGTGATCGTCATCACAAAATGAGCTTTCTTATCAAATGCCGCGAATGAATACGTTTGCTGTTATACTGCGTGCCTTGCGCGTCAATGCGGCGTTATTAGTCACCGGCATTGAGTGATTTGTTTTTAAATCATATGGTTATAAATATGAAACATACTGTTGAAGTCATGATCCCCGAAGCGGAGATCAAAGCACGTATTGCCGAGCTGGGTCGTCAGATTACCGAACGTTATAAAGACAGCGGCAGTGAAATGGTGCTGGTAGGTCTGTTGCGTGGCTCAT [...]
+GAGAATCAATAGCTTAGGCTCATGCATCAATGCGCGGGCGATCATCAGGCGGCGTTTCATCCCACCGGACAGCATCCGCGCGCGTTCATGACGTTTTTCCCACAGATCGAGCTGTTTTAAATACTTTTCGCTACGTAAAACCGCCTCTTTATGCTCTACGCCGTAATAACCGGCCTGATTCACTACGATCTGTTGCACCGTTTCAAACGGGTTAAAGTTAAATTCCTGTGGTACCAGTCCAAGCTGTCGCTTGGCGTTAACCACGTCTTTTTCCAGGTCATAACCAAAAACGTTAACGCGCCCGGACGTTTTATTCACCAATGAGCTGATAATACCGATGGTGGTCGATTTCCCTGCTCCATTTGGCCCCAGAAGCGCGTAAAAATCCCCCGCTTCGACCTGCAAATCTATGCCGCGCAGCGCCTGAACGCCGCCGGGATAGGTTTTTTTAAGTTGTTGAAGTTCCAGCGCAATGGTCATAAATTCTCACTT [...]
+NODE 2185 45 3443 3443 0 0
+ACATATCGCAGGGCATTTATCCTTATGATTAGGTATAAATGATGA
+TCCGGGAAATGTTGAGCCGCTGTTCAGAGAAATGTCGATGAGTGT
+NODE 2186 47 48 48 0 0
+TTGAATTTTTTTACCATTGGGTTTGTTTTTTTTCTGTAACATTGAGT
+GAGTATTGTGGATTCTCTACTTTTATTACGCCGGTTGATGGCGTTGG
+NODE 2187 1680 106679 106249 0 0
+TTCCGTCTGGGTAATGGTGGGATCGGATACGATTGTAGTCATTCGATATATGACAATGAAAGTGATGTTGGCTCCAAAATACAAAGCGCCTGGTAATAATTATCAGGCGCTTTGCAGACAGAAAACCATCAAACATCGGTTTCTCGTTCTCCAGGATCTACTGGAAAATATGGCAACCCACAGTTAGTGGATTTTACTGTCGGGTCTTGCCAGGGATTTTGTGTTACCCCCAGGTCTTTTAAAAGACTTCGTAACAGCACTAACTCGCTGGGTGTCATTTTTTGCTTTGATTCACCCCCTTTAGGTGGACGAATATCCTCCTGACTAGTACATGTAACACAATAACCTTTTAACTCTATCCACTTAGGCTTAGAGGGGGCCTTAGGATCGGGAGGCATCGGACTGGCAACGCATGAACAGGCACTTATACATCCAGGCATAACGTTTTCCTTTTCAAACAATTCGCTTTAGTTGGAAGTTCTACTTGAGAAA [...]
+CTTCTGCTGCTATGCGGCAAGCTACCTCTCCCAAAACTATTCTGGAATATATCATCAACTTTTTTACCTGTGGTGGGGTACGTCGGAAAAATGAAGCACAATATCAGGAATTGATAGACACTATGGCTGATACATTGAAAAGTTCAATGCCTGACAGAGGTGCTCCGTTGCCAGAAAACATTATACTGGATGATATGGATGGGTGTCGTGTCGAATTTAATCTTCCTGGTGAGAATAACGAAGCTGAACAAGTTATTGTACGGGTCAGTAAAGGCGACCATTCTGAGACGAGAGAAATTCCGCTTGTCTCTTTTGAAAAAATATGTCGAGTTTTACTATTCAGATACGAATTTTCTATCCCTCAGGATTCTGTAATGTTAACTGCCCAGGGAGGCATGAATCTTAAAGGCGCTGTCCTTACCGGAGCAAATCTGACGGCAGAAAATTTATGTGGCGCAGACTTAAGCGGCGCAGATTTAGATGGGGCAGTAC [...]
+NODE 2188 539 34124 33918 0 0
+AGGTGAAAATAAAAACTGCCTCTATATCATCACGCTGTAAAAGTTCCTGATAATTTTTATACCCTGAAGTTATATTTACCGAATAAAGCCAATCGCTCATCTCCTCAATAAAATAATCGGCGGCGCAGATAATATCTAATTGAGGCAGTAAATACATATTCTCAACATGCATTTTACCTACCCGACCGAGGCCAATAACACCACATCGAAGCTTTTTCATTCGTACCTCTTAATCTCATGAATAGTAAATTTAAAACCGCAAAAGAAAAGCATCCGTAATTCTGCGAAAAACGGATCGTTTTATTTTGCCGTTCTGAAAAGCAAACAATGCGTTGACGCTGTATCGTTCAGGTTGCAGAACAATAACCACACTTCTGCAACCTGAGCGACGGCAAATTAATCAGTACTGCCGGGCCTGTCCGATATGTTCTTCAAGCATACGCGCTACCGCCTGGATACGTTCGCTACGGGATACCTGCGCCCCACCAACGC [...]
+TTGGTGGGGCGCAGGTATCCCGTAGCGAACGTATCCAGGCGGTAGCGCGTATGCTTGAAGAACATATCGGACAGGCCCGGCAGTACTGATTAATTTGCCGTCGCTCAGGTTGCAGAAGTGTGGTTATTGTTCTGCAACCTGAACGATACAGCGTCAACGCATTGTTTGCTTTTCAGAACGGCAAAATAAAACGATCCGTTTTTCGCAGAATTACGGATGCTTTTCTTTTGCGGTTTTAAATTTACTATTCATGAGATTAAGAGGTACGAATGAAAAAGCTTCGATGTGGTGTTATTGGCCTCGGTCGGGTAGGTAAAATGCATGTTGAGAATATGTATTTACTGCCTCAATTAGATATTATCTGCGCCGCCGATTATTTTATTGAGGAGATGAGCGATTGGCTTTATTCGGTAAATATAACTTCAGGGTATAAAAATTATCAGGAACTTTTACAGCGTGATGATATAGAGGCAGTTTTTATTTTCACCTCAA [...]
+NODE 2189 41 2969 2634 0 0
+ACCTGCCAGTGCTTCAGATGGTATTGTTATAGACCGTATAA
+TTCATACCAGTATTGATTTTAATGCAGTTTGTTTTTTATTG
+NODE 2190 821 53217 53031 0 0
+ATGCTGTGACATAATCAGCAGGTGAGTAATAAATGTAATTTGTAGGTTGTAACCCAAACTCAGTAAGTAAATTATGCGCCGATATGATTATCGCAGAATAAATAAGGTACTGACAAATAAGCTTTGATCTGCTTTTTAAAAATTTACTAAATCTGTCAGCATACTTGTCGTAATGAAAGAAATAACCCGATAGCAGAAAAAATCCGGCAACTTGATAGTAATAGAATACCTCCCCAAATGGGAAATTTGCAATGTGTCCAGCAACAACAGACAGCATCATAATTCCCTTGGCTATATCAAGACTTCTGTCTCTGTTGCTTCTTACAGATGGAGTTTGCAATAATTCTGGCGTTAGATTGTGCATGTCGTACAAAAAGTGAATTAATCAGTGCGAGAAATTTAACATATTACACTGGAAAAGAAAAACAACTTACCACTTGTGAGCAAAACCATCGCGCCAGAAAATTTACAAACATAAAAACCGTCTCTGCA [...]
+AATACCAGAATCTGGCTTGAGTACCCCGGCCCGCTGGAGTGATGGTGTCACAGCCGCCCTGCTGAGCTATAACCTGATGACGAACCTGTGGTCTACATTCCACTGGTATTGGCATCTGAAGCTGCACGCGAAAGATCTGGCTGGAAAATGGCATAGCCATTCATAGTCTCAGCCAAGCATGTACTGCAATTGACCCTGCAGATCCCGTCAATTTTGAATCTCTGGCTGTCGCTTGCATATGCTGGGTTCTCCTTAGCCCCCTCGTTCCTAAGTTTGTAATGCAGAGACGGTTTTTATGTTTGTAAATTTTCTGGCGCGATGGTTTTGCTCACAAGTGGTAAGTTGTTTTTCTTTTCCAGTGTAATATGTTAAATTTCTCGCACTGATTAATTCACTTTTTGTACGACATGCACAATCTAACGCCAGAATTATTGCAAACTCCATCTGTAAGAAGCAACAGAGACAGAAGTCTTGATATAGCCAAGGGAATTA [...]
+NODE 2191 29 6235 6212 0 0
+AACGCGGCTTTCGCTCACCGTTGCGAGGT
+TCAGACAATCTGTGTGGGCACTCGAAGAT
+NODE 2192 47 9027 8912 0 0
+TGAAGTCTCAATCGCAAGACGCCTTGCTATTCACTTTTCATCAGACA
+TCCCCTTCGTCTAGAGGCCCAGGACACCGCCCTTTCACGGCGGTAAC
+NODE 2193 1270 66068 64842 0 0
+TTTGACCGTGAAAAGCGACAAACCGGTGGTGTTTACCGCTGCAATGCGGCCCGCGTCGGCAATCAGCGCCGATGGCGCAAGGGCAGCCTGGACTGGTGTCTGACTCGCTCAACCCGGCGAAGGCGCGAGTCTTGCTGATGACGGCATTAACTCAGACGCGTAATCCGGAACTGATCCAGAGTTATTTCAGTACGTATTAATCATGCAGGCCTGTGCGCCCACCCTCGAAGATGGGCGCGCAAGATATTAACGCATGGTCACAAACTCTTCCGATGCGGTCGGGTGAATGGCGACGGTATTATCGAAGTCTTTCTTGGTAGCGCCCATCTTCAGCGCCACTGCGAAGCCCTGCAACATTTCATCCATGCCGAAGCCGATACCGTGGATACCCACAATTTTTTCTTCCGGCCCGACGCAGACCAGCTTCATACGGCACGGCTGGCGGTGCGTCGTCACCGCGGTATACATAGCGGTAAACGATGATTTATAGAC [...]
+GCGAAACCATCACCGCCGACCATATTTTGATCGCTACCGGCGGCCGTCCGAGCCATCCGAGCATTCCAGGCGTGGAATACGGCATTGATTCCGACGGTTTCTTTGCGCTGTCTGCCTTGCCGGAGCGCGTCGCAGTGGTAGGCGCAGGTTATATCGCCGTTGAACTGGCTGGCGTTATCAACGCGCTGGGGGCGAAAACGCATCTGTTTGTCCGTAAACATGCGCCGCTGCGCAGTTTTGACCCGATGATTAGCGAAACGCTGGTTGAGGTGATGAACGCCGAAGGCCCGCAACTGCATACTCACGCCGTGCCGAAAGCGGTGGTGAAAAACGCCGACGGCAGTCTGACTCTGGAACTGGAAGATGGCCGCAGTGAAACCGTTGATTGCCTGATCTGGGCCATTGGTCGCGAACCGTCGACCGACAATATTAATCTGGCGGCAGCGGGCGTGAAAACCAATGAAAAAGGTTACATCATTGTCGATAAATTCC [...]
+NODE 2194 4 98 98 0 0
+GGAG
+GTTC
+NODE 2195 26 125 125 0 0
+GAATGTCTGGGAAACTGCCTGATGGA
+GAAGCAGCAAGCTGCTTCCTGTTACC
+NODE 2196 15 871 868 0 0
+GTTTATGAAGAGGTG
+AGGGCGGCAGGATGA
+NODE 2197 2083 108897 107920 0 0
+TCGGCGCAGGCAACGTCACAAAACTGGCTAACCAGGTGATCGTGGCGTTGAATATCGCCGCCATGTCTGAAGCGCTGACGCTGGCGACTAAAGCGGGCGTTAACCCGGATCTGGTCTATCAGGCGATTCGCGGCGGTCTGGCTGGCAGTACGGTACTGGATGCGAAAGCGCCGATGGTCATGGACCGAAACTTTAAACCAGGTTTCCGTATCGATCTGCACATTAAAGATCTGGCGAATGCGCTGGATACCTCCCACGGCGTTGGCGCGCAGCTCCCGCTGACCGCCGCCGTTATGGAAATGATGCAGGCGTTACGCGCGGATGGACACGGTAATGACGACCATAGCGCGCTGGCGTGCTACTACGAAAAACTGGCGAAAGTGGAAGTCACTCGCTAACGACGTTGTGCCCGGATGGCGTGTAGCGATCCGGGCCTGAATTTCAGGCTGGATAAGTGAAACGCCATCCGGCGTTGTGCAGTAACAGGCTACC [...]
+ATAAGCCGGGTTCTGTCGTGGACAGTCATTCATCTAGGCCAGCAATCGCTCACTGGCTCAAGCAGCCTACCCGGGTTCAGTACGGGCCGTACCTTATGAACCCCTATTTGGCCTTGCTCCGGGTGGAGTTTACCGTGCCACGGACTGTTACCAGCCGCGCGGTGCGCTCTTACCGCACCCTTTCACCCTTACCTGATCCCACTTACGTGGGCCATCGGCGGTTTGCTCTCTGTTGCACTGGTCGTGGGTTTCCCCCCCAGGCGTTACCTGGCACCCTGCCCTATGGAGCCCGGACTTTCCTCCCCTCCGCCCGTCTCCCCGAAAGGACGACGACGAAGCGGCGACTGTCTGGTCAGCTTCGGCGCGCAGTATAGAGGGTTCGCGCGACTTTGTCACCCTGCGCTGCGCATTCCTATCGCCAGAGCGGCAGCAACATTTCTGGATGCCCGATAAATATTGTCAAAAGCGCCCCGAAAAGCCTCCTCCAGCGTC [...]
+NODE 2198 1 134 50 0 0
+T
+A
+NODE 2199 29 1828 1828 0 0
+GGTGGTTTTGCCCTTATGTTTGTGATGGG
+ATTATAAAAATGAGAAAGTAATAAAGTAA
+NODE 2200 22 1643 1643 0 0
+GGCCATTTTTGGTGAAATCGGC
+CGACTAAGTCAGTCGGTATAGC
+NODE 2201 29 1759 1759 0 0
+AAACGTTTACCGATCTTCAATAAATATAT
+CCCCATCACAAACATAAGGGCAAAACCAC
+NODE 2202 51 3054 413 0 0
+ACCTTCACCCGCGTTATCGGCGCGCATCACGAAGGTGAGATATTTGATGGA
+TGGAATTTTGACGCTGATGTCGCTTGCCGGGCGTAATACCTCGGCGCGCAC
+NODE 2203 2 70 70 0 0
+TA
+TG
+NODE 2204 49 1888 1888 0 0
+TTCGTTGGGCGCGGGGCATGGTGCAAATTTTCCGCCTCGATAACCCTCT
+ACGCTGCCCGATATGCGCCGACAGGCTTTCCGTCGCCAGCCCCGCCGCC
+NODE 2205 2309 128536 127542 0 0
+TCAGGGGAGCTATGAGATGCGGGGTAATACCTTCCGTAAAGAGAGTTTTGTCTGCTCTTTTGATGCAGATGGGCAGTTTTTACATCTTTCTATGCGGTAAAAGCCGCGCCTGGTGAGGTGTGATGCCGCGAAATCCGGCAATTTTCGCTAAACAAACCGGTTTCATACTGTATATCTCGCATCCAGCGGGTATACTGGCTCCTTCCTTTAAATCCACACGTATCCAGCACGAAATAATATGCAAAAGTTTGATACCAGGACCTTCCAGGGCTTGATCCTGACCTTACAGGATTACTGGGCTCGCCAGGGCTGTACCATTGTTCAACCATTGGACATGGAAGTCGGCGCGGGAACTTCTCATCCAATGACCTGCCTGCGTGCGCTGGGGCCGGAACCGATGGCGACTGCCTACGTGCAGCCGTCCCGTCGTCCAACCGATGGCCGCTATGGCGAAAACCCGAACCGCTTACAGCACTACTACCAGTTCCAGGT [...]
+CGGTCGGTCTTGTCGCGCAGCGTGCCCAGCTGTTGCTGGAACAGCACGGTTTGCAGACGCGGCAGATGGTCTTCCAGACGTTTTTTACGGTCGGTATTGAAGAAGAATTCAGCATCTGCCAGACGCGGACGCACCACTTTCTCGTTACCGGAGATAATCTGGGTCGGATCTTTCGACTCGATGTTGGCGACGAAGATAAAGTTCGGCAGCAGCTTGCCCGCGTTGTCATAAACCGGGAAATACTTCTGGTCGCCCTTCATGGTGTACACCAGCGCTTCGGCAGGCACGGCGAGGAATTTCTCTTCGAATTTCGCCGTCAATACCACCGGCCATTCCACCAGCGAGGCCACCTCTTCCAGCAGGCTTTCGCTCAGATCGGCATTACCGCCAATCTTGCGCGCTGCTTCTTCGGCGTCCGCTTTGATTTTGGCTTTACGCGCTTCGTAGTCCGCAATGACTTTACCGCGCTCCAGCAGAATTTGCGGGTACTGG [...]
+NODE 2206 58 2319 2319 0 0
+CGAAGATGCCGAACTGCGCCGCCGCGCCGAGCAGCAGGGTGCGCGGATTCGCCAGCAG
+CATCTTCGCCACCGTGCTGGGGGCGCTGACGCTGAACTACTTCGGCCTGATTGCCTTC
+NODE 2207 6 371 371 0 0
+CGGGCC
+GTTCGG
+NODE 2208 78 2754 2754 0 0
+GAAGTCGGTCATCGCGCCCACACCCATAAAGATGACCAGCGGCGCGACACCGGAGCCAATCGCCACTTTATAGAACAG
+TATGGGTGTGGGCGCGATGACCGACTTCGGCCCGCTGCTGGCGAATCCGCGCACCCTGCTGCTCGGCGCGGCGGCGCA
+NODE 2209 1518 71619 71182 0 0
+CACCAGCGGCAGCGCGAGCGAGTTTGCTTCTCGCCAGAAGTGAGAAGCGTCAACCTGGCTTCCGGCGGCGAGTTGGCGGCGAAGGCGCGTAGCGGTCTGTATAGCGACAGGAGCGACGGGCGGGCTCAGTCTCATTCTTTGTATTCCATCTCATTTATATTTCGGTCAGTATCAATAGCTAAAGCGGCTGTTACAGGAACAGCCGCTTGCGGGCTTTCTTTTGCGTAAATCGTGGCGATAAAAACTATCCTATGACCTCTCCTTGCGTATCGCGTGTCTGGCCGATGCTGTCCCGCCACAGACGAGCATACAGGCCATGAGCCGCTATCAACTGCTCATGGCTGCCATATTCAGCGATACATCCTTTATCGATTACGACAATAACATCGCAGCGACGAGCGGTGGTCAGCCGGTGCGCGACGATAAGCGCGATGCGTTTCTCGGTATGCGTCACTCCGGTAAGCGAGGTTATTAAGCGCTCCTCGGCGCTGC [...]
+TTGAGCTCGCCTGCCTACGCCCAGGCACGGCTGGAAATTGGTAAGGTGAACAGTACGCTTCAGGAAAAGGTCTCCGGTATGCGGGTAGTGCAGTCACACGGTCAACAGAAGCAGGAAGCCGCCAGGCTACGGGCGTTATCAGACAACTTCCGCGCCACCCGCGTGCGGGCGCAAAAATACCTTGCTGTCTATTTTCCGTTCCTGACCTTCTGCACCGAGGCCGCCTATGCCGCCGTGCTTTTAATCGGAGCGACCCGGGTCGCCGAAGGCGAAATGACGCCCGGGATACTGGCGGCGTTCTTCCTGCTACTGGGACAATTTTATGGCCCGGTACAGCAGTTGTCAGGCATTGTTGATTCCTGGCAGCAGGCGACCGCCAGCGGCAAACATATCAATGCGCTATTGGCGACTGAGGAAACGGAGAATATTGAACCGTCCTCCATAACGCCTGGCACTGGCGGCGCGCTACGTCTGGAGGCATTGACATTCCGC [...]
+NODE 2210 51 2004 1621 0 0
+CCGTTAACGCAAGAATGGGGTCAAGCCAGAACATTGCCGCGGCGATAGCGA
+GCATTAAGCGCCGTACCTGTAGTGATACTGGCGACGTGGATTTACCGCCGT
+NODE 2211 80 5262 5166 0 0
+CCTGATTGCCTATCTGGAAGAAAAACCTGATATGGCTGAGCATCTGGCGGCTGTGCGAGCATACCGGGAAGAATTTGGCG
+TCAGGTTTTTCTTCCAGATAGGCAATCAGGTCTTTCAGCGTAATGATGGAGATAACCTTACAACCATAGTCGCGCTCCAC
+NODE 2212 8 420 76 0 0
+GGCGTGGG
+CGTGAAAT
+NODE 2213 16 2113 2113 0 0
+ACGAGCAGTAAAACCT
+TACGCTTCTTTAAGGT
+NODE 2214 51 2816 2798 0 0
+TAAGTGGGAACCGGTTAACGAACAGACCATTTTGCGGTTGTGACCTTGCCC
+AGAACAAGGTGTCGCCGTTAATCTGGCGGCTAGTCGCCGCTTTGTTACCTG
+NODE 2215 51 60 60 0 0
+GGGAATTTTGACGCTGATGTCGCTTGCCGGGCGTAATACCTCGGCGCGCAC
+CCCTTCCCCCGCGTTATCGGCGCGCATCACGAAGGTGAGATATTTGATGGA
+NODE 2216 1825 109996 107079 0 0
+AGTAGGCGGTTTCATCGAGCGTGTCAGTGCCATGAGTAATAACCACACCGTCAACATCGTCCCGCGCCAATAACGCATTCACCTTCTGTGAAAGTTTCAGGATAATATCGCTGGTCATATTTTCGCTACCAATATTCGCCACCTGCTCGCCGTCAACGCGAGCGATATTATTCATTTCCGGCACGGCATTTATTAATGTTTGCACGCCAAGTTCACCAGATTTATATCCGGCGGTTTGCGTATGATTGGCTGCCGTCCCGGCGATAGTACCGCCTGTCGCGAGAATAACAATATGCGGTAGTGACGTTGTGCTAAATACACAGTGGCTGATGAGCAGCAACACGGCGGCCATGAAAACTCTGATTTTCATTTTCTTCCTCTGAATTAAAAATAATAAGTGACGTGTGCTATAAAAATATTAATAACAATCAGGCCAGAACCATTTTTCCTATTAACAGCCCGACAATGACCGAGACAATCACGTTAACTAAT [...]
+CTCACTCCAGATAACCCAGGAGGAAGTATGTTTTGGACGGAATTATGTTTTATCCTTGTGGCCCTGATGATAGGAGCCAGGATCGGCGGCGTATTTTTAGGGATGGTCGGCGGGTTAGGCGTCGGCGTGATGGTTTTTATTTTTGGCCTGACGCCTTCTACGCCACCGATTGATGTTATTCTGATAATTCTTTCTGTTGTCCTGGCGGCCGCATCTTTACAGGCCTCCGGCGGGCTGGATTTACTGGTCAAACTGGCGGAAAAAATTCTGCGTCGCCACCCTCGTTACATTACGTTATTAGCGCCGTTTATCTGTTATATCTTCACGTTTATGTCAGGAACGGGGCATGTCGTTTATAGCTTGCTGCCGGTTATTTCTGAAGTCGCACGGGATTCAGGTATTCGACCGGAACGTCCTTTATCTATTTCTGTTATTGCATCGCAACAGGCGATCACCGCCAGTCCTATATCTGCCGCCATGGCGGCGATGATT [...]
+NODE 2217 51 6586 6586 0 0
+ACTTTACCGCTACTAAATGCCGCGGATTGGTTTCGCTGAATCAGGTTATTA
+TTAGACCAAACCATGAAACCAACATAAACATTATTGCCCGGCGTACGGGGA
+NODE 2218 2174 114506 113935 0 0
+ACGATGTCCATCTTTATCGCCAGCCTGGCATTTGGCAATGTCGATCCGGAACTTATTAACTGGGCGAAATTGGGCATTTTGATTGGTTCATTGCTCTCCGCAGTGGTGGGGTATAGCTGGTTGCGCGCGCGTTTGAACGCGCCGGCATAACCAGTACGAAGGAAAGGGGGAGCGATGTATCGCTCCCTTGCGACATTGAACAGGGAGAGGAATGAGCATGTCTCATATTAACTACAACCATCTTTATTACTTCTGGCATGTCTATAAAGAAGGTTCTGTCGTGGGTGCCGCAGAGGCGCTTTTTCTGACGCCGCAAACCATTACTGGTCAAATTAAAGCCCTGGAAGAGCGTTTACAGGGGAAGCTATTTAAACGTAAGGGACGCGGTCTTGAGCCCAGCGAACTGGGCGAGCTGGTTTTTCGCTATGCGGACAAAATGTTTACGCTAAGCCAGGAGATGCTGGATATCGTCAATTACCGCAAAGAATCAAA [...]
+CGACTCATCCGGGCGCGCGCGACTACGTCTGGGGCAAAGCCAAACGCAACTATTACGATAAAGGCGTGAAGTTATTCTGGTTAGATGAAGCCGAACCTGAGTTCAGCGTTTACGACTACGACAACTATCGCTACCATGCCGGGCCGGTACTGGAAGTGGGCAATATCTACCCACGTATGTACGCTAAAACCTTTTTTGACGGCATGAAAGCCGATGGCGAAGACCAGGTTATCAACCTGCTACGCTGCGCCTGGGCCGGCAGTCAGAAGTTCGGCGCACTGGTCTGGTCAGGGGATATTCACTCCTCGTTTAGATCGCTACGCAACCAGTTTGCCGCCGGACTCAATATGGGAATCGCGGGGATACCGTGGTGGACGACGGATATCGGCGGTTTTCATGGCGGTAATATTCACGACCCGAAATTCCATGAATTGCTGATTCGCTGGTTCCAGTGGGGCGTCTTTAGCCCGGTGATGCGTCTGCACGGCAACC [...]
+NODE 2219 39 2448 2337 0 0
+GACGGTGAGCTGAAAGCCGCGTCGCACCTGCTCTTTAAC
+TATATTACGCTTTCCTCTTTCAGAGTCAACCCTGAATTT
+NODE 2220 51 1366 1366 0 0
+TCCCCTTTAGGCGGCGCCGCGCCGCCGTAGCCCGCTTTACCGAAATCGGTA
+AAACGCACCGCTATATCTTTACGGTTCACGCGCTGGACGTCGAGCGTCTTG
+NODE 2221 51 179 179 0 0
+GTTCAACTTCGGGTAATTCAGGCATAACGTCTCCGGCTGTGTGGCAGGGCT
+CCCAGCCGCCGGGGTATTGAACCCCATTTAGTTGGCGCTACTATCCTGCAC
+NODE 2222 22 1494 1494 0 0
+GCATCGTCGATGAAGTGGTGGC
+TTCGCTGCGATGCGCCTGGCGT
+NODE 2223 19 3205 3113 0 0
+AAAACGAAGGGCCCTGTCG
+TGGGGAGACCCCACACTAC
+NODE 2224 1235 53735 53370 0 0
+ATATTTCGATTGATGACACGGTGGCCTATCTCATCGGTTTCCAATAAATATCCTCCGGCATAGCCCTGTCTCTTGATCAGATCTCCTGATCAAGAGACAGGGCCTGGCTGGGGGTTTTCCATAGACAAAAAAAGCGTGGAGCCATCCACGCTTGAGGCTGCTGACAACGTGTAACCAGGTGGCAATGTTCCAACCACGGACCTACAAAAAGTACGTAATCTGTTGATATTCTCGTTTCGTAAGTCAGGCAAAGCGCTAGCTGCCTCTCGCAGAAATGCCAACACAACAGATAATTGTCAGCAGTCCTCATTTTTCAGTCAGCAAATATCGGTCCGGCAGGGAATTTCGCCAGAAACCCGGTGACGGCCAGCAGCGACCACAGCCCGGGCCACTCAATCTGGCGCTCCCGCAGTTCATCATCCAGCGTCATAAGCGCAAACTCACCTTTATCGCCCAGCACGCCGCCCTGCCAGAGCAGCCGCTGCGCCTGCT [...]
+GATTGGCTCGGCGATAGCCGCCGGGGTGATGCTGAAGTACGTGCTGGCGATGTAAATCTGTTCCTTTCCCGGAGGCGGCGCGTTGCGCCTGTCCGGGCTACCGGATTGCATGGATCTGTAGCCCGGACAGATGCGCAGCATCGCCTCCGGGAATGTCCCATAAGGAGACTTTGATGAATGAAACCATAGCATTTCGTCCGGAAGGCCGGGCATCGACAAAAGATGTGGTTGTCAATTACACGCTGGCGTCACTGGACGAGCTTGAACAACTGCACCCGGCGCTGAATCTGCTGGCGCACCCGTCAATCGTCCGTGGCAGCCATGATTTCTTTGTCCGTTGTTATGACGCGGGCGTACAGCATGCGCAGGCCGGGGCGGCTGAAACGGTAGCGGTTTTGCCTGATTCGCTGCCACAAGAACGGCAAAGGAGCGGGCTGCTGTGTGCCGCAGCAGGTCGTCTGGATGCCCTGCGCCAGCCGCTGACGCACAATC [...]
+NODE 2225 122 5856 5856 0 0
+CACCTGGGCCACGAGGATACGGCTGTCGTAGCCCTTCAGCTGGCCTTCAAAGGCGTGATACTTTTTGCGCACCTCGCGGAAGTATGCGGCGATATTTTCCAGCTTCAGGATATCCAGCCCGG
+GTGCGCAAAAAGTATCACGCCTTTGAAGGCCAGCTGAAGGGCTACGACAGCCGTATCCTCGTGGCCCAGGTGCCGGGCGGAATGCTCACTAACCTCGAAAGCCAGCTGAAGCAGCAGAACGC
+NODE 2226 13 734 734 0 0
+TGTCGTGCTCAGT
+ATACTTCCGCGAG
+NODE 2227 12 1227 1199 0 0
+ACCTGCCAACGT
+AAATATCGCCGC
+NODE 2228 201 10869 10598 0 0
+TATCCGTTTTCTCGGCGAAGACCCGTGGCTACGCCTGCGCGAACTCAAAAAAGCCATGCCGAAAACCCCGCTGCAGATGCTGCTGCGCGGCCAGAACCTGCTCGGTTATCGCCACTATGCCGATGACGTGGTGGAGCGCTTCGTTGAGCGGGCGGTGAAAAACGGCATGGACGTGTTCCGCGTCTTCGATGCCATGAACGA
+CCGCTCAACGAAGCGCTCCACCACGTCATCGGCATAGTGGCGATAACCGAGCAGGTTCTGGCCGCGCAGCAGCATCTGCAGCGGGGTTTTCGGCATGGCTTTTTTGAGTTCGCGCAGGCGTAGCCACGGGTCTTCGCCGAGAAAACGGATACAGGCGTCAAAGGTGGCGCCGCCCCAGCATTCGAGGGAGCCGTAGCCCAC
+NODE 2229 1314 77616 76990 0 0
+TCGGCCATTATGTCGGTTCACTGCGCCAGCGCGTCGCGCTACAGCAGGATCACCAACAGTATGTCCTGATTGCCGACCTGCAGGGACTCACCGATAACGGCAGTAATCCGCAAAAAATCCGCGATAATATTCCGCAAGTGTTAGCTGACTATCTGGCCGTCGGCATCGATCCCGCGCTAACGACGATCTGCCTGCAATCCGCATTACCCGCCCTCGCTGAATTAACGGTGCTGTATATGAATATTGTTACCGTCGCCCGAGTGGAGCGTAATCCTACGGTAAAAAATGAGATTGCCCAAAAAGGCTTTACCCGTTCCCTGCCGGTCGGGTTCATGGCGTATCCCATTAGCCAGGCGGCAGATATCACCGCCTTTAAGGCCGAAATGGTACCGGTTGGCGACGACCAATTGCCCATGATTGAGCAAACGAATGAGATCGTTCATAAGATGAATAGTCTTTTCTCCTCGCCGGTATTGCGACCCTGTCAGGCGC [...]
+AAGCGACCCATAACAGTATGTTGGTAGAGCTCTTCCGTCAGTCCTGGCAATGGCGTGAAAATAATCCGATGTGGCTCCAGCTTCATAGCCATCTGGGCGATACGCTTTACCGTAAGGAGTGGCTGGTCGATCATAAGCAGATCCTCGCGGCGTTAATTAAGAAAGACGCCCGCGCAGCGAAGCTGGCGATGTGGCAGCACCTGGAAAACGTGAAGCAGCGTCTGCTGGAGTTTTCCAATGTTGATGACATCTACTTTGATGGCTATCTGTTTGAGTCATGGCCGCTGGACAACGTTGATGCCTGATTATACCTGGAATAGCGTGGGCAGACCCAGTCCACGTTTTACTTCCTGTAGCGTCTTTTGAGTGACCTCATGCGCCCGCTCGCTACCTTTTTTCAGCAATTCCATTAGCATTCCCTTATCCGCAATAAAGGTTGCCCGTCGTTCGCGTATGGGCGCGATCAGTTCTTGCAGGCAGGTCTCCAGCTCA [...]
+NODE 2230 51 2935 2935 0 0
+TTTGTTCATTGATGCCCAACACCACCGCCCCTTTATTAGGGCGCACTTTTA
+ACGATCCGTGAACACTATGAAATTCGCGCGCTGTTAGAAAGTGAGGCGGTG
+NODE 2231 38 84 84 0 0
+GTAAAACGAGTATTTGACATGCTTCCTCCACTTAACAC
+TACGTTAGTCGCCATTAAACCGAATAAACATGCGCCCA
+NODE 2232 1984 111709 108695 0 0
+CAACGAAGGTAATATTTTGGGCCATTCGCCGCGCAAATTGGGGATTGGCATGGTGGAGATCAAAGTGGTGAATGTTGAGGGTTAAAAGAGAATGTCGTATATGCCGGGTGGCGGCTGCGCCTTACCCGGCCTACACATCATCTTTATCAATAAACTGGCGCGTAGGCCTGATAAGCGAAGCGCCATCAGGCACTGTATATGCTACACGCCCCTTTCTGTTAATAATCGAACTGACGGTAGTAACGACGAATATCCAGACTGTGGCCGGTATATTTCTCGAAGTGCGCCGCCAGCCGATCAACCAGCAGTGTCGAGACGACGCAGGGCGCCATGATCCAGCGGAACTCATCATCAATGCCGTCCAGCGCATACGCTTTCGGATCAATCACCACCAGGTTATCGGTAATCTTACTGGCGAAGCGTTCCACGCGCTCGTCCAGCTCGCGGCATTTCCCTTCCCCTTTCACCAGAATGAGCGGAACGTCTTTTTCC [...]
+TCTTGGCAAGGCCAGTGATTATCCACTGGATATTCTGACCGGGATTGAGTCCGTCGGCTTTGTTACCCGTGGATTTAGCGCGACGGTACTGAATCTGTTGCTTATCGCGTTGTTAATTGCCCGTCAGCAGCAGCGACTGACGGAATCGCAGGTCGAGGAGTATGTGGCGCAGCTTCAACGCATCGCGGCAACCCTGCCGTTGGTTATCGTGCGTACGGAAGCGTTTATTCACCAGCACCAGTCCGTTTTACGAAACGGGACGCGTTTTGTGGCGATAGGCTACGGCGCGCTGGTTGGGGTGGCAAAAGAGTTGGAAACTAAATTTACCGAGACGGTACGTGTTCCCTCAAGCGGGTTTGAGTTGGAAGCCTATATGCACGGCCCGTATCTGGAAGCCAATGCGGAACACGTGATGTTCTTCTTTGAGGACCGGCCCGACGCGCGCTCCAGGGCGCTACGGGAGTATATGACGCCTGCGGTCGCCAAAACCTT [...]
+NODE 2233 51 2342 2342 0 0
+ACCCGGAGCCACAACATTGACAGTAATACCACGGGACGCAACTTCACGCGC
+TTTTATTGAAACGGACATGACGCGTGCGCTGTCTGACGATCAGCGTGCGGG
+NODE 2234 45 1741 1445 0 0
+TCGATGTCATCTCGCGCTAATATCCCCTCAGGCAACACCAGAAGC
+ACCTGCCGATTCGCGCCGCGCAGCCGCTGGATGGCGCGTTTATGA
+NODE 2235 4757 242040 239209 0 0
+GCAATCTGTGCCGGTGAAAAGTCGTCCATATTTTCCAGCGTGATATCGACCATCAACTGACCTTCACCCGTCAGCGTATTCGGCACAGCGAACGCCACGCGCGGCGCAATGGCTTTCATGCGCTCATTGAAGTTATCAATATCAATATCGAGGAATTTGCGATCCGTCACCGGCGGCAGTTCTTCACGCGGTTTCCCGGCCAGATCGGCCAGCACCGCCATCACGAACGGCAGCTCGATTTTTTTCTCAGAGCCGTAAATCTCTACGTCATATTCAATCTGCACGCGCGGCGCGCGGTTGCGCGCGATGAATTTCTGCGCGCTATTGTTGATAGCCATAATCCTTCATTTCCTTTTTAGTCAACTGGTTGCCGCCAAGGGGAGCGGTATACCGGTACAGTTTTTAAAATCGCACTACGGACACTTCGAACGGCCGGTTTCAGCAAACGATCTCAAAAACAATCTGCTCATCACCATTAACGCCGATATCAAT [...]
+CAACCTCACCGGTATCGTCATGACAGGCGAGTGCCGCCAGCAGTGACTCCACCCAAACGGGTTGCGGCAGAAGGAAACCGGGTCGTTGTTCACCCTGAAAAACGGTGCGGCGGAACATTTCGCAGCGAACCAGCTCCCGGTACAGCCGGGCCTCCTGGGTATAATTGGCCTCCATCCTGGCGCATAGCTGAAGCTGGTGTAGCGCCCGCGACCAGTCTCCGGCCACACACAGCAACTGAAACAGGCTGTGGCGGCAGAGCGCTTTCGCCGGATTTTCCCGAACCTGCTGCTCCGCCATCTGAATCCCCTCCGCAATAGAGTATTCCTGTAGCAGCGCGGACAGGGTAGCAGGAAGCGTGTCAGTTTTTTTCATGGGCGGTATTTCCATTTTTCTGTGTCGGAGTGATTCGGTAGTGGCTGTCGATGCCAATAATACGATGCTCGCGGCGGGTCAGATCGGGCAGTATCTCGCTATGTGCGGTTTTCCCCGCC [...]
+NODE 2236 1245 68607 66553 0 0
+AATTTTTTCTCTTTATCATAGGGGAGGGGCATATGGACTACTGTTGTTGCCTGACGTTTAACCGTCGGTTGCAGTTCATCATCCAGCCACAAGTCAGACGATCTTTTCATGTATTCGGCACCGCACAGCGCTTCGGTACATAGCTCGATTCCAGTCAGCATGGGCGTGCCGCCAGCATCGCACTGATCGACCGTCAGGTAAAAATAACGGTCATCGAGAATAGCCGGTCTTAAACTGCGTATTTTATTAATATATTCTTCTGTCGTCAGTCCCATTGATTCTGCGCGCGCAGAAAGGGTATTAGTATTACAGGGTGTTTTATCTTTAAAATAATAACGGTCGGCGAGTAAAAGTTTCAGGTCACTGCTAATGGCGGTTTTATTAAAATCGATATTTACAATTTTGGAGATGAAACTAACGGGTTTGGATTCTGTACTGGGGGATTGTTTTGCACATATATTCGCGCAATATAATGAAACTATAATTGTTATG [...]
+TGGTCTGACTGGCGCATATTCTCCGCATTCCCTGCGTTATGCGTGGGCGCAGGATACCATTAGTCACTATCTGGCGCAGGGGTTCAACAGGAAAGAAGCGCTGGCAATTTTGGCGATGGATCTGGGGCATGGGGACGGGCGTGGGCGGTATGTGGCGCAGGTGTATGGGCAAATTTGACAGTTGGCTAAGAGCGAGCAGCGGATGGAGCAGGTTACCACAGTTCACAGTTAGTGAAAGACTGGGCGGAGGTGGTAAATATCAGGCTGCATTACCTTCCCCCTTACAGTCCAAACCTGAATCCGATAGAACGAATGTGGAAATTAATGAACGAACATGCCCGGAATAATCGCTACTTCAGCAGTACGCGAGAGTTCAGGGACGCAATATCTGTCTTTTTTAACCAGACGCTGCCGGATATAGCGGACTCACTGACATCCCGAATTAAAGATCACTTTCAGGTGCTCACTCCCGCATCTTGAGGTTTATTGGGT [...]
+NODE 2237 323 16704 16588 0 0
+GTTGAATGCCCGGCATCGCTTCAATCATTAAAGACATCAATCAACGGAACGCCATCCGGGTATTCAACAAAAATATTAACGAATGGAACAAAAGGCTCAGCCGACTATATGGGGGTGTCAGTAGCGCGCGCATCCAAACCAGATGAACCTTTTGTTATTAACTCCACCGCCGATTCAGAACGTCTGGTCTGGAGTGAGGTAGAAATTAACAATAAAGAGGTTCCGCTGATCGCCATCATGAAAGAGACCAAGGCAAATTCGGCTACCACCGGGGCTTTCTCAGCCGTTGCGACTTTCGTATTTAGCTACGAGTAATTAACGCA
+CCCGGTGGTAGCCGAATTTGCCTTGGTCTCTTTCATGATGGCGATCAGCGGAACCTCTTTATTGTTAATTTCTACCTCACTCCAGACCAGACGTTCTGAATCGGCGGTGGAGTTAATAACAAAAGGTTCATCTGGTTTGGATGCGCGCGCTACTGACACCCCCATATAGTCGGCTGAGCCTTTTGTTCCATTCGTTAATATTTTTGTTGAATACCCGGATGGCGTTCCGTTGATTGATGTCTTTAATGATTGAAGCGATGCCGGGCATTCAACAATCACTAATTTAAAATCTGCCGTTGCTGTTCCCGCTCTTACATCATCAA
+NODE 2238 165 9264 9183 0 0
+CGGGTAGGGGCCAAAAGCCAGCTTTTTCTCTTTGCCATCGACGCGGTACTTCATGTACCAGAGTTTTGAGCCGTTGGGTTTGATCAGCAGGTAGAGTCCTGAACTGTCGGTAATTTTGAAGGATTTCTCGGTGGGTTTGATCTTGCGGATAGCGGTATCGGTTAA
+AATTACCGACAGTTCAGGACTCTACCTGCTGATCAAACCCAACGGCTCAAAACTCTGGTACATGAAGTACCGCGTCGATGGCAAAGAGAAAAAGCTGGCTTTTGGCCCCTACCCGGATGTTTCCCTGTTCAAAGCGCGTCAGCTACGTGATGCCGCACGCGCCAG
+NODE 2239 6 589 589 0 0
+CTTCAA
+TGCCAT
+NODE 2240 5 271 250 0 0
+ACGCA
+TAAGC
+NODE 2241 51 69 69 0 0
+GATGGGCGCCGCGCTTTTAGGGTTGCTCAATGCGGAATTACGCGCCGGCGT
+CCCCCCTGCCGCGCCCGCGCCGGGAGCATTAATCACCTCACGCCCCGTAGC
+NODE 2242 1260 69482 67717 0 0
+CCCCCGGTCTGAAGGTACGGACAGCATTCGCTCATTCATAACAATCTGATTTAAAGGAAAAACTTTATGAATACAGAAAAACAACTGCCGTCCGGCATTGGATCTGAAGTGAAATACACCCAGCAGTTCTGGCTGCTGAGTAACGGAAAGGTCATGACGGAAAAAGACGGGCTCTGTAACCCCTTCCCCCCGAACTGTATTGAATCGGCTCATCCTTTCACTCCGTTTCAGCAGAATCAGTGGATTGAACTGAACACTGTCGGGTCGAATGGACCGGTGAAAGCGACATTTCTTGTGCACAGCGTACTTCATAAGCTGAAACGTCAGGGTGGCTCCCTGAATGATGACTGCCGGCCTGAATACGGCCGGAGCATTGCTCACTGGCACACTGACGTGTTTGTTGAGAAAAAAGCGCTGCCTGACTGGCTGAGAGCATTCCACACTGACGTTTCGCACTCGTAAAGACACGTTCAGCCCGACGGGTCATATTTT [...]
+GCCCTTTTTCCTTTTTTTACACAGCCAGGTTTCCGGTTATCTGCGGGGAAGTGACGCACCTGGCGGGCAGAGAGATATGGAGGTGAAAGTATGTCTTCCTCAGTGAAATATTCTCCGGTTCCGGCGGTGTTAACCCGCCCTGAATTGCTGGCTGAACTGAACCTGCTGATGACCCGGATTGCCAGTGGGTGTCGTGTGGGGGTTCCGGCGTCATGTCGTCCGGTCATTGCGGTGCACGGTGGTTATGTTTCATACAGTTCTCCACGCGCCGGACGTGTTTTTCAGGACGGTTCCCGCCCGGAGATAGTGATGGCCGTCAGTAACCGGGAACGGATGTGCGAATGGTTCAGTCAGGTCTGGCTTCCGCTGCATCTGGCTGCCCTTGAAGGCGATGAGAGTGCTTTTTTCAGTGCGGAGGTCAACATGGTGCGCCGCGAGCTGCAGCGCGTTCCGGGGAATTCAATGAACTGCATGTGCTGGGCAAGCCTTGCT [...]
+NODE 2243 6 589 589 0 0
+CTACAC
+CGACGA
+NODE 2244 51 3670 3670 0 0
+TCCTGCTGCCAATCCTTTTCCCTTTTCATCCGTAATTAACGGAAGCTGTTC
+ATCAAGCTGACAATGGTTGAAACGATAATCAGGGGGATACCGGCCTTAGCG
+NODE 2245 9 1560 484 0 0
+ACGTCGCGT
+ATAGTTATC
+NODE 2246 21 820 738 0 0
+AACCTTATAATCCCGTGGCTG
+ACCTGCCGTAGCCTGGGAGCA
+NODE 2247 1855 104009 103365 0 0
+ACGGGCGAACTGTTTCGACAGGGGTAATATGATGGAAACCTATGCTGTTTTTGGAAATCCGATTGCGCACAGCAAATCGCCATTTATTCATCAGCAATTTGCTCAGCAGCTAGATATTGTTCACCCCTATGGTCGCGTGCTGGCCCCTATTAATAATTTCATTAATACGCTTGATGCCTTTTTCGCGGCAGGGGGAAAAGGCGCAAACATCACAGTACCTTTTAAAGAGGAGGCGTTTGCGCGATCGGATGAGTTAACGGAACGAGCATCGCTGGCGGGAGCCGTCAACACATTAAAACGGCTGGAAGATGGTCGTTTGCTTGGCGACAATACTGACGGTATCGGTTTATTAAGCGATCTCAAACGTTTAAATTTTATCCGCCCAGGATGGCGTATTTTGCTGATTGGCGCGGGCGGCGCATCCCGGGGCGTGCTGTTACCTCTGCTTTCTTTGGATTGCGCGGTCACTATCACTAACCGTACAGCTTCACG [...]
+TCCCATTTTTTTGCACAAGCGTTTTTTGGATCTTTTTTTCTGTTTGTTGATTTTTCATCCCTTTCGCTCCATTCCTGCGCAAAGTGGCGATTTTTTGATGCTATCTCCCCTTGCACAACGCCATTAAAGCAACCAAAGTCTTCATGACTATTCATTTATGATGAGGTAGACATGTCTGACACATTACGTCCTTATAAGGATCTTTTTCCTGAAATCGGTCAGCGCGTGATGATCGATACCAGCAGCGTGGTTATTGGCGATGTCCGTCTGGCGGATGATGTCGGGATCTGGCCGCTTGTGGTGATTCGCGGCGATGTGAATTACGTTGCGATAGGGGCTCGTACGAACATTCAGGATGGCAGCGTTCTTCACGTAACCCACAAGTCTCCATCCAATCCACACGGCAACCCATTAATCATTGGCGAAGACGTTACCGTTGGCCATAAAGTTATGCTGCACGGCTGTACCATCGGTAACCGCGTACTGGTCGGT [...]
+NODE 2248 51 2307 2216 0 0
+ACCTGACGTTGTTTCATCAACGCTGCCATACGCACTGCGTTACGGGCATAT
+TGATGGTTTACACCCACGACTCCATCGGTCTGGGCGAAGATGGCCCGACGC
+NODE 2249 4183 205232 202417 0 0
+GACCCGCGCAAAGCCGCGGTGGAAGCGGCTATCGCCCGCGCCAAAGCCCGCAAGCAGGAGCAGCAGGCCGGAGGCGAACCTGCCGAACCGGTCGATCCGCGTAAAGCCGCGGTGGAAGCGGCCATCGCCCGCGCCAAAGCCCGTAAGCAGGAGCAGCAGACCGGAAGCGAACCTGCCGAACCGGTAGACCCGCGTAAAGCCGCGGTTGCTGCGGCTATCGCCCGCGTTCAGGCAAAAAAAGCAGCACAGCAGCAGGTTGTTAACGAGGATTAAATGGTATTCAGAATCGCAAGCTCGCCTTATACCCATAACCAGCGCCAGACATCGCGAATCATGTTGCTGGTATTAATCGCCGCTCTGCCGGGGATTGCCGCGCAGACGTGGTTTTTTGGTTGGGGAACGCTTTTCCAGATCGTTCTGGCTGCTATCACGGCGCTCGTCGCAGAAGCCATTGTCCTCAGGCTGCGCAAACAATCGGTCGCCAGTCACCTG [...]
+ATCACCTAACCAACCGCCAATGGCGACCAGGCCGTACACCAGCGCACTGAAGGAAGAGAAAAGGGTGATGGAATCCGCTTCTGACATACCCAGTTGTTTTACCAGGTAGACGGCCATAATGCCTTGCAGGCCGTAATAACCAAAACGCTCCCATAACTCTATCGAGAAGATGAGATAGAACGCCTTCGGTTGTTTGAAAGCGTTCAAACTGACGCTTTCAGTTGGTTTTTTGTTTGCAGTAGACACTTTTACCTCTTTTTTACGCCCCGTATTAACAGGGATTGTCTGGCGCGTGATGAGTCAGACTCATCCGTCCGATTGTTATATTGGAGGGGAAACGGCAGGTAATGTTCACTATCTTTCCTCTCCAGACAAGAGCTTTGTAATAATCTGTTACATATAACTCTTCTGGTTGAATCGTCCGATGTCAGAAATGTTATCCAGCGTTAAATTTCTTCATTTGAAGAATGGCAGATTTTTACACTGCAAAAA [...]
+NODE 2250 3 320 320 0 0
+GCA
+CAT
+NODE 2251 2931 148841 147650 0 0
+GAGGTCAGAACCCCATTTTTTGTATGGATACCTGGCGTTGCGCTCTTTATAATCCGCTGCGGTTCTATAACTCAGTTTGAGCTATAGGTTTATGTAAACTCTTTCCGGCATTTCAGGTGCTGAATGAGGCAAGAGGCTTAAAATATGGTTGTTACGCTCGCGTATATCGTACTTTTTTTGGTTTTCTCGTGGGTCATCTTGAGAATTAATCAAAAAAGCGATTCCCTGTCGAAAAGCGTTTTTATCGCTATCTTTTTAGGGGCTGTTATTGGTTTATCCCTGCATTTTATTTCAGCAAATCACACTAAAACTATTATCGAATGGTACAGCATCGTCGGCAATGGTTACGTCCACCTGTTAAAACTGGTCGCTATACCGCTAATTTTTATTTCTATTCTTTCCGCCATCAATAAACTGGAAAATAGCGCCGGCATCGGAAAAATGTCGCTGACGATCGTCGGATGCATGTTATGCCTGGTGATGGTTGCCGGT [...]
+AGCGCGGCGATTTTCATGTGTTGCTGGTGAATGAATGGCTGGCGCAGGAAATAAATGCAAGACTGTCCGTCGAGGTGAGCGGCGAACCGTGGTACTTTTTTGGTCATTGTACGGAAGTCACGGCTTTACCCGGCGCGCCTGCGCAGTGGGCCGCCATCTTTGCCCATTTTGGCGCGAAGCTGGAAAATGTCAGCGTAGGCTGCTGCGGTATGGCGGGCACTTATGGACATGAACTCACCAATCATAAAAATTCGCTGGGAATTTATGAGCTATCCTGGCATCAGGCGATGCAACGTCTACCGCGAAACCGCTGCCTGGCAACCGGCTATTCCTGCCGAAGCCAGGTTAAACGCATTGAAGGTACGGGCGTGCGTCACCCGTTGCAGGCATTACTGGAGATTATAGGTTGATCTGGAAACGTGAAGTGACCCTCGATGCGCTTAATGCGATGGGGGAAGGAAATATGGTTGGCCTGCTTGATATCCGCTTTGA [...]
+NODE 2252 37 2769 2760 0 0
+ACCATGCCTTCGCCTTTGGCGTTAACACAGTCACGGG
+AAAGAAGCTGAGCGTATCTATCGCGCAGGTCTGGCCT
+NODE 2253 1875 113867 112643 0 0
+AATCATCATCGGTTCGCTATAGCCCAGATGGCTAATTTTTACTGCGGAAATCATCGCGGTATAGGCGGAAATCCCCGGAAACATCGGGATCACGGCCGCGACGGTAAACACTTTAGGGTGAGCGAGATACCAGCGTGACCACTGAATACCAATACTGCCGACCAGTAGCGAAGCCATAAACGTCGACCATTCGATATTAAAACCAGCGCTCATCATCAGCATACGCGAGCCATGACCCAGCGCCCCCAGTAGCGCGCACCACGGAAGCGCCCGGTGGGGAACATTAAAGACCATCGCAAACCCGACGGCGGGGATCGCAGACAAGATCATGTCCTGCATTAGCGCCAGTAAAAAGTCGATTATACCCATCCTCGTAGCCCCCATATTGTCATTGACATCACTACGCCCACACAGGTGGCCAGTGTCAACAGGCTGGCGATAGCCCAGCGCGCCAGCCCGGTATTAATATGTCCTTTAAACATATCTGCCACG [...]
+CCCTTTCATTGCCCCATTAATAAAAACACTATTAACAATGATCGCAAAGAAATATAGGCCGAGTGGATTAATTATCCTTGTTTTATTTTTAAATATCTAACATCGATTGCGCTACAATCCACATAGCACAAAAACATGAAATCACTATCGCATAGTTACTCATAAAACCAGAAGCAAGACAATTAAATTAACTAAATTTGCACATTAGCAATTCTAACGAAAACTCATCATATTAATAAATTTAAAATATGAGTTCGTCCTTCATTCATATTGCTGAGTCCTAAAACAAAAGCCCAACAATACTGTCTACCATCCATAAAACCCATGTAATATCTGCGAATTACACTAAGGTATGCCTATTTTTACGCCCGCTGCTCACGCCATTGTGGTTAAACCATTAATGCATATCGTTGATAAAATTCACCACATCATTGATTCAAAAATGAGCGGCCAGGCTGGCATAATGCCTCTATTCTGGAAACGGACATACGA [...]
+NODE 2254 2950 132963 131492 0 0
+ACCGTGCATTACCGTGTACCGGCGGTAAATTGCGCCCAAAAATGGAGGGGATGACGTGTATAATCCCGTTCACGCTTTTTTTGCATGGAACAATTATGCGCATCCTCCACACCTCTGACTGGCATCTGGGACAAAATTTCTACAGTAAAAGCCGCGCCGCGGAGCATCAGGCTTTTCTGGACTGGCTGCTGGAGACCGCGCAGGCCCATCAGGTGGATGCCATTATTGTCGCTGGCGATATTTTTGATACCGGTTCGCCGCCAAGCTATGCCCGAGAACTTTATAACCGTTTCGTCGTTAATTTACAGCAAACGGGCTGTCATCTGGTGGTGCTGGCCGGTAATCATGATTCCGTCGCCACACTAAACGAGTCACGCGACATTCTGGCGTTTCTCAATACAACCGTGATCGCCAGCGCGGGCTATGCGCCGCGGCTACTTCATCGTCGCGACGGTTCTCCGGGCGCCGTACTGTGCCCCATTCCCTTTTTGC [...]
+CCAGCGCGTCGCGGCGGGGTTGATTCGCGCTCAGCTCCAGCGCCTGATAGGCGGCGATGGCGGGGTGTGTCGTCGAGCCGCAAAGCGGACACGGCTGGCCGGACTGTAAGTACGCCCGCTGGCTTTCCAGATCTTTGATGCGCGCCTCCTGCTCGCAAATAGTGCGAACGTCCGCAAGCTCCTGCGCTTTAGTCTTATAACTCAGGCGTTTATCCGCCAGACGTTGGGTGTATTGCGCCTGCTCCTGATGATGACGCGCGATAGCTGCCTGTAGCTGCGCCTGACGCTTTTGTTTCGGGACAATTTGCCCCTGAAGCGCGGCGAGACGATGGCGTAGCGGACGCTGTCGGGTATGCAATGCTCTGGCTTCCGCCAGCGCCTGTGGCGTGAGGTCGAGCGTGAGCGGCGGTAGCGCATCACGCTGACGCGTATCGCTCAGCAACTGCTGTTGCCATTGGCTCAGTTGCGCCCGGTCGTGGGATTGTTGTGTTA [...]
+NODE 2255 51 3188 1517 0 0
+TCCCCTGCGGCAGATGCGCCAGCTTGAAACGCAGCGCCAGCCAGCAAAACA
+ACCACTTATCAGCAAATCATGGCGGTCGGCATTTTGTGTGGCATTGGCTTT
+NODE 2256 392 16320 16172 0 0
+CGCGAGAAATGTTGCATGCTGTAGGGCTGGAGCATCGCGCAACCCATCGACCTTCGGAACTTTCCGGCGGTGAGCGCCAGCGTGTCGCGATAGCGCGCGCGTTGGTGAATAACCCGCGTCTGGTACTGGCGGATGAGCCGACCGGTAATCTGGATGCGCGTAATGCCGACAGTATTTTTGAGCTTCTGGGCGAGTTAAATCGTCTGCAGGGAACCGCGTTTCTGGTGGTGACTCACGATTTGCAACTGGCGAAACGTATGAGCCGCCAGCTTGAGATGCGCGATGGCCGCCTGACGGCGGAACTGAGCCTGATGGGGGCTGAGTAATGGCGTCGCCTTTATCATTGTTAATTGGCTTGCGTTTCAGCCGTGGACGGCGGCGCGGCGGTATGG
+GATAAAGGCGACGCCATTACTCAGCCCCCATCAGGCTCAGTTCCGCCGTCAGGCGGCCATCGCGCATCTCAAGCTGGCGGCTCATACGTTTCGCCAGTTGCAAATCGTGAGTCACCACCAGAAACGCGGTTCCCTGCAGACGATTTAACTCGCCCAGAAGCTCAAAAATACTGTCGGCATTACGCGCATCCAGATTACCGGTCGGCTCATCCGCCAGTACCAGACGCGGGTTATTCACCAACGCGCGCGCTATCGCGACACGCTGGCGCTCACCGCCGGAAAGTTCCGAAGGTCGATGGGTTGCGCGATGCTCCAGCCCTACAGCATGCAACATTTCTCGCGCCCGAGCGTCAATCTCCGCCGGTTTCTTTTTGCCAATCAATAATGGCATC
+NODE 2257 374 17834 16939 0 0
+CATAGTCAGCGCGCATTGCGGAGGCGATTTTCCCTTCTCCCGCCGCGCCAATAAAGACGCCATGTTTCAGCGCGGCAGGGACGCTCGCCAGGTAGTTTTCCGTATACCAGCCGTTACGTAATAGCGTGTGAGGAATACCTGACTCAGCCAGCATCTTTTCCGTTTCAATATGTTCATCGGCGAGCGCCAGCGGCGATTTATCCGCATGTAGCAGGCTGGTATAGGCGATGAATTTCACCTTCGCGGCAATGGCGGCCTGAATAACGTTGCGGTGCTGCGCGGTGCGTTGTCCCACTTCGCTGGATGATATAAGCAGCAGTTTATCAACGCCCTGTAAGGCGGTGGTCAGCGCGGCTTCGTTAGCGTAATCCGCC
+ATAAACTGCTGCTTATATCATCCAGCGAAGTGGGACAACGCACCGCGCAGCACCGCAACGTTATTCAGGCCGCCATTGCCGCGAAGGTGAAATTCATCGCCTATACCAGCCTGCTACATGCGGATAAATCGCCGCTGGCGCTCGCCGATGAACATATTGAAACGGAAAAGATGCTGGCTGAGTCAGGTATTCCTCACACGCTATTACGTAACGGCTGGTATACGGAAAACTACCTGGCGAGCGTCCCTGCCGCGCTGAAACATGGCGTCTTTATTGGCGCGGCGGGAGAAGGGAAAATCGCCTCCGCAATGCGCGCTGACTATGCCGCCGCCGCCGCGCGCGTCATCTGTGAAGAGGGTCACGCCGGGAATGTC
+NODE 2258 41 1872 1872 0 0
+ACCCGCTTCCGGGATATTGGAGAGCAGGCCGCCGAAGCCAA
+ACCGCGCTGGAGAGCCTGCTGGCGCATCACGACGCCGGGCA
+NODE 2259 1553 76623 76199 0 0
+TCGCTGGTCGGGGTTCCGTTCTTTTTAAGCATTGTATTGCGACATCGGGGGAGTCTCTGATGCGCGGGTTAATGCTCCGCTCATTTAGTGCCGGCTATTCCACTCAGCCAGTTATTGCAGACCTCAACGTTCCCTTACTGCCGCGCGGGAAAATTACCATTTTGCTGGGGCCGAACGGCTGTGGTAAATCGACGTTACTACGTTCGCTGGCCGGGCTGAATAACGCCGACGGCGAGGCGCTGCTTGATGGCGAAGATCTCATGTCGTTATCGTTTGCCGAGCGGGCGCAGAAAGTTGTGTTTTTGCCGCAGTCATTACCGCAGGGCGTACATCTGCATGTACTGGAGTCGATTATCGTGGTACTGCGGGCATCAGGCGGCAGAGACAATGCGCAGGGCAGAGCGCAGATACTGGCTATCCTTGAGCAATTGGGCATAACGCATCTGGCGTTGCAGTATCTCGACCAGCTTTCCGGCGGTCAGCGGCAGTTAG [...]
+ACTGAAACGCGCTATCCATACGCTGTGGAACGTACTGGATGAACTGGATCAGGCGTGGCTACCGGTGGAAAAATCCTGGAAACTCAATGAACGTCACTATGGCGCGTTGCAGGGGCTGAATAAAGCGGAAACGGCAGAAAAATATGGTGACGAGCAGGTTAAGCAGTGGCGCCGCGGTTTTGCCGTGACGCCGCCGGAACTGACCAAAGATGATGAGCGTTATCCGGGTCACGATCCACGTTATGCCAAACTGAGCGAGAAAGAGCTGCCGTTGACCGAAAGTCTGGCGCTGACCATCGACCGCGTTATTCCTTACTGGAACGACACCATCCTGCCGCGTATGAAGAGCGGTGAGCGCGTGATCATCGCCGCTCACGGTAACTCATTGCGTGCGCTGGTGAAATACCTGGATAACATGAGTGAAGATGAGATTCTTGAGTTAAACATCCCGACCGGCGTTCCGCTGGTGTATGAGTTCGACGAAAACTTCAA [...]
+NODE 2260 51 2774 2525 0 0
+ACCAGCCGTTAGATACTCTCATCATTAAAGACAACACTATCACGGTAAAAA
+TAGGGTAATATAACCAAATTATTACCATCTGAATTATTAGGGCAGTTATTA
+NODE 2261 322 17429 16839 0 0
+GGGTAGGCGATCAGCTTGCCGTTATAGCGTACCGCATCCCAGGTGAACGGATAGAGTTTGTCCTGAAACGCTTTATCCGGAGTGACCTCCGCCAGCAGACCAGACTGCGCGTAGCCGCCAAAACGGTCGTGCGCCCAGAAGATAATGTCAGGACCGTCGCCGGTGGCTGCCACCTGCGGGAATTTCTCTTCCAGCTTATCCGGGTGCTCAACGGTCACTTTAATGCCGGTGTCTTGCTCAAATTTTTTACCGACCTCGGCCAGACCGTTATAGCCCTTGTCGCCGTTGATCCAGATAACCAGTTTACCTTCTTCAATTTTGG
+TATAACGGTCTGGCCGAGGTCGGTAAAAAATTTGAGCAAGACACCGGCATTAAAGTGACCGTTGAGCACCCGGATAAGCTGGAAGAGAAATTCCCGCAGGTGGCAGCCACCGGCGACGGTCCTGACATTATCTTCTGGGCGCACGACCGTTTTGGCGGCTACGCGCAGTCTGGTCTGCTGGCGGAGGTCACTCCGGATAAAGCGTTTCAGGACAAACTCTATCCGTTCACCTGGGATGCGGTACGCTATAACGGCAAGCTGATCGCCTACCCCATCGCCGTTGAAGCCCTCTCCCTGATTTATAACAAAGACCTCGTCCCAA
+NODE 2262 18 1622 1622 0 0
+GAAGCGAGAGAACGTTGC
+TCATCCTCGTCAGGCTTC
+NODE 2263 3 570 233 0 0
+AAA
+CTC
+NODE 2264 2 717 56 0 0
+GT
+GA
+NODE 2265 49 5896 5862 0 0
+ATATCGTGCTGACTTATCTGATGGAACTTTACCAGATGGATTTTGCTGA
+CTGGTGAACGCTGCTGCCATACTTATCCGTCAGTGTGATTGATTTACCA
+NODE 2266 15 602 602 0 0
+CGATGGCGGACAAAT
+CGCCACTGGCTGGAG
+NODE 2267 51 2274 2274 0 0
+CCCGCTATAGCGGTCATCTGATTGACTTCAATGTGCGCGCCGAGCGTATGG
+GATTTGTCCGCCATCGGCGACAGTAACTCCTCGGCGGTCACCGTCTCGTAG
+NODE 2268 32 1024 1024 0 0
+GAGCGGCAGCACCAGAATGCCCAGCAGGACGC
+TTCGCCGCCGCGGCGATGGACGCGGCATCGAT
+NODE 2269 79 2557 2557 0 0
+CGCCGCGCCGCAGGCCGGCCGTCAGCGCAACGCCCGGCGCGGCGAGAAACCCCAGCGCCGGCGTGCCGAGCAGCAGCGT
+TGCGCTGACGGCCGGCCTGCGGCGCGGCGGCGTCCTGCTGGGCATTCTGGTGCTGCCGCTCAGTGTCCCGGTGCTGATT
+NODE 2270 47 76 76 0 0
+GGAATATTTACAAGCCTCGCAATCCGAATGGGATATATTTATTGAGG
+CCCCCCTCCACTACCTGACGGTCATAGGCTTTATTCGCGTTAAATAA
+NODE 2271 51 177 177 0 0
+GTGGCGCGCTCTTTAAGGCGCCAACGTTGCCGGCGCTTTTCCCGCCGCCTG
+CCCAGCCACTACACATTGCAGCTCAGTAGTTCTTCAAATTACGACAACCTG
+NODE 2272 25 3303 2023 0 0
+GTCGTTGGCACCAACCTGGATGGTC
+AGCAGATCAACTCTCAGACCCTGGG
+NODE 2273 51 6088 3080 0 0
+AGGGTGTTGTCCTGCGCCAGGACTTTCACGCCGTTGAACTGAGTCTGGCCG
+TGACCATCCAGGTTGGTGCCAACGACGGTGAAACTATCGATATCGATCTGA
+NODE 2274 138 5855 5855 0 0
+ATCAGCGCATCCAGCATAATGTCGCCCGTCAGCGACGCGAAAATGACCTGCACGCCATTAGCTTGAGTGATCGGCGTCACCGCCTGCACAATCAGCTCCAGCGCCAGTAGAATCAGGCCAAGCCCGATACCGACGCGA
+TGCAGGCGGTGACGCCGATCACTCAAGCTAATGGCGTGCAGGTCATTTTCGCGTCGCTGACGGGCGACATTATGCTGGATGCGCTGATTGGCGCGATGTTCGCTATTATCAGTTATTCCAGCCTGGCGGCGGTGTTGC
+NODE 2275 156 572 572 0 0
+TGAGCTGACCTTAGGACACCTGTGTTATTCTTTAACAGATGTGCCGCCCCAGCCAAACTCCCCACCTGACGTTGTCTCCCGCGTAGCTCGCTGCAAGCAGCTTCAAGCTGGGGCGGCACATCTGTTAAAGAATAACACAGGTGTCCTAAGGTCTCA
+TTGAAGCTGCTTGCAGCGAGCTACGCGGGAGACAACGTCAGGTGGGGAGTTTGGCTGGGGCGGCACATCTGTTAAAGAATAACACAGGTGTCCTAAGGTCAGCTCAATGAGAACAGAAATCTCATGTAGAACAAAAGGGTAAAAGCTGACTTGATT
+NODE 2276 51 3988 3988 0 0
+TTGTAGGCCCATAAAATTACATAGAGAAGCGACGCGCTGATAATTAAGAAT
+ATCCCCCTAATAATTAAAAAGGGGTGTGAGTATGAGTAAATTTAAATTTAA
+NODE 2277 100 3953 3160 0 0
+GCCCACCACCCGCGCCGCCGTGACCAGCCCGCTGATATGTCGTTTACCGCCACCATCCAGTTCGATGTTGACGCACAGATCTTTGCCCACCATCGGTTTG
+GCGGTAAACGACATATCAGCGGGCTGGTCACGGCGGCGCGGGTGGTGGGCCATGAAGGGCGTTCGGTTACCTATGAGCTGCGTATGGAGCCGTGGGTAAA
+NODE 2278 71 5523 4424 0 0
+AGCGGCAGGTTGGCCGCCGGGGAGACATAGCCCAGATTCAGGGTGTCGGGCGTTTTTAGCTGTACCACATA
+CCCGGCGGCCAACCTGCCGCTCAAACCGATGGTGGGCAAAGATCTGTGCGTCAACATCGAACTGGATGGTG
+NODE 2279 4054 244049 241662 0 0
+CACCGTCTCGCCGGTGGCCAGGTTGAGCGCCTCAAGGTGCGGTGCCGCAACGTGGATGATATTCAGCGATGACAGGGCTTTTTGGCCGACGGCAATAAACTTTGTCGTCAGACGGTAGCTCCCGGCCGCCGGCGCTGGCGTCACGTATCCGCAGGATTGAAGCCCCTGCAACAAACGATGGACGGTACTCTTGTTCAACCCCGCCAGCTCCGACAGGTGCGCCAGTGGGCAACCGTTCGGGTAGTTACTCAAAATTTCTATCAACATCAGGCCACGAAACAGGCTCTGACTCCCCGCAGGCTTCTCTTTATCGTTGTTCTGGCTCATCAGAAAACTCTCTCCTTTCTTGGGCGATCAGATGGTAGCTCAAAGTGTGTTGCAGTTCACGATATCAGCATAAAAAACATAACCCGATGATTTTAATCGTTTTTAAAAACCTTCTCTGGCGTTGCCATGTCAATTTTTGATCTATATATTTGGAACTACATTTCG [...]
+GGTTGATCGGGTAGTTTGCGGAGCGCATCATCGGCACCAGCAGCGCGGCGACCGCAGCGGTATCTGCTACCGCAGAGCCGGAAAGGCTGGCCATAATCATTGCCGCAATGACGCCCACGTAGCCCAGGCCGCCGGGCTTATGGCCGACCAGCTTCATCGGCAGGTCGACAATTCGCTTTGACAGGCCGCCCGCGTTCATGATTTCACCGGCCAAAACAAAAAAGGGAATGGCCAGCAGGGAGAAACTGTCCGCGCCGTTAACCAGGGTTTGCGCCATAATCTGCACGTCAAACATATCCAGGTATGCCATCAGAGCAGCGCCGCAAAGCAGCAGCGACCAGGCGATGGGTAAACCTATCGCGATCCCGCCGAGCAGACAGCAGAGAAATATCACCACGGCCATGATTAGGCTCCTTGCTGTGGTTGTTGAAAGGAATCGTTATGCGTTATTAAGTGATAAAGCCGACGCAGCTCGATTAACGCGATGGCAAC [...]
+NODE 2280 51 1567 1157 0 0
+ACCTGCTGATAGCCGATAAACGGCGTCAGCAGGCCCGCTATTGGTCCGGTA
+TCTTTCTTCTGGCCGCGGCCTGCGCGCTGCTGGGCGCGGCGGTTGTCCATC
+NODE 2281 47 2649 2649 0 0
+ATCATGCGACGAGTGGGCCAGCAGCGTAACCACTTCATCCAGCGTGT
+GGGCTGGAGTTGACGTTAAATATTAAAAACGACGTCCCGGATAATGT
+NODE 2282 51 3295 3295 0 0
+TGGCAGCGGCGGCACCATTACCGCAGGCTACGACTTCAAGGCCAACAAAGA
+ACCCTGCTGGTTCTGCACCACGTATTCCTGCTTCACGGTGCTGAAGGAGAG
+NODE 2283 556 29242 28812 0 0
+GGCATCGGCTTCGCATAGAGATAGCCCTGTAACATTTGCACGCCATGCTGGCGCAAATGCTGTGCCTGCGTCTGGTTTTCGACCCCTTCCGCCACCAGTTCAATATTCAGTCTTTGCCCCAGCGCGATAATAATATCGGTCACCGTTGAATTGACCGCATCGGTACCGATGGCGGCGGTGAAGGATTTATCGATTTTCAAAATATCCGGCCGCAGTTTTTCCAGCCAGGAGAGCGAGCTGTTTCCTGTGCCAAAATCATCGATGGCTAACTTGACACCTTTACGATGCAGCTCGCGCATCAGGCGGTAATCAACGTCAAGCAACGCGTCGCGTTCCGTGAGCTCCAGCACCAGTTGCTGAACAGGTTCCGCACTAAACCAGTACTGATTAAGATCTTTGAGAAGCACGCCGTGTCGGAAATGGCTTGCCGCCACATTGATGCCGATATGAAACTGATGGTTGATGGGGAAGTAGTGCCGCTGCCGAATGGTT [...]
+TATGTGATTGCGGAAACCATTCGGCAGCGGCACTACTTCCCCATCAACCATCAGTTTCATATCGGCATCAATGTGGCGGCAAGCCATTTCCGACACGGCGTGCTTCTCAAAGATCTTAATCAGTACTGGTTTAGTGCGGAACCTGTTCAGCAACTGGTGCTGGAGCTCACGGAACGCGACGCGTTGCTTGACGTTGATTACCGCCTGATGCGCGAGCTGCATCGTAAAGGTGTCAAGTTAGCCATCGATGATTTTGGCACAGGAAACAGCTCGCTCTCCTGGCTGGAAAAACTGCGGCCGGATATTTTGAAAATCGATAAATCCTTCACCGCCGCCATCGGTACCGATGCGGTCAATTCAACGGTGACCGATATTATTATCGCGCTGGGGCAAAGACTGAATATTGAACTGGTGGCGGAAGGGGTCGAAAACCAGACGCAGGCACAGCATTTGCGCCAGCATGGCGTGCAAATGTTACAGGGCTATCTCTAT [...]
+NODE 2284 166 10507 10465 0 0
+ATATTATTCAGGACGGGCTATTGCCCGTCTTGTCATTTATGCAAGCTCCTGATTCAATATCTGGCAATTAGAACATTCATTGAGGAAATATTATGCGTGCTTTACCGATCTGTTTATTGGCACTCATGCTGGGCGGTTGTTCCATGCTAAGCAGATCCCCTGTTGA
+TAAACAGATCGGTAAAGCACGCATAATATTTCCTCAATGAATGTTCTAATTGCCAGATATTGAATCAGGAGCTTGCATAAATGACAAGACGGGCAATAGCCCGTCCTGAATAATATTACAGATTGTGGAATCAGCCTAAAACTTACCAGCCTTTCACCGCGCCGCC
+NODE 2285 51 118 118 0 0
+GTTCCTGAAAGACTTAAACGCCAAAGGCACCACCATTATTCTCACCACCCA
+CCCCCACATCGAGCGACGCAATTCGATATCGACACCCGCCGTCGGCTCGTC
+NODE 2286 102 5732 5732 0 0
+GCTGGCGATACATACCGGTCAAATCCGTGCCGAACTGGCCCGCAAGGGAACACCTGTCAGGCCTTATGACCAGATGATTGCTGGCCATGCCCGTAGCCGCGG
+TGTTCCCTTGCGGGCCAGTTCGGCACGGATTTGACCGGTATGTATCGCCAGCCTGAAGGGGCATGTTGGCTTTGACGATCAGGCAAAAAACAACGGCGAATA
+NODE 2287 13 535 535 0 0
+TGGCGGCGATGTC
+GAGTGACATCGCC
+NODE 2288 11 372 372 0 0
+ACTCCGCCGGA
+ATCGTCCGGCG
+NODE 2289 3 206 206 0 0
+CGA
+GCC
+NODE 2290 37 1145 1139 0 0
+CGGTGGCGATGTCTCTCCGCCGGACGATGGCGGCGAT
+TGACATCGCCGCCATCGTCCGGCGGAGTGACATCGCC
+NODE 2291 1444 71907 70358 0 0
+AGGGCGACGCGGCGCAGTACTTGCAACGTTCGCGCGAGGTGCAGAACGAGCAGCAGCAGGTATATACCCTGGCGCGAATTGAAAATCAGATTGTTGACGACCTGCGCGACAGATTGAATGAGCTCAAGTCTGGCAATAATGACGGGATGCTGGTGGAGACCCATATTCGCTATCTGGAAAACCTAAAAAAAACGGCGGATGAGAATATTCGTGCGCTCGATGACTGGCCCAGTACGATCACGCTGCGGCAAACCATCGACGAACTATTGGAAATCGGGATGGTAAAAAATAAGATGCCCGATACCATGCGCGATTATGTTGCGGCGCAAAAAGCCTTACTGGACGCCAGCCGCGCCAGAGAGGCTACGCTAGGGCGCTTTCGCACGCTGCTTGAGGCGCAGTTAGGTAGTAGTCACCAGCAAATGCAGACGTTCAATCAACGCCTGGAGCAGATTGTCCGCGTTAGCGGCGGGCTTATTTTAGTGGCGACGC [...]
+CGTCGACGCCAGACGCAGGTCGCCCTTCATTTGCGCCATCAGCGACACGCTAATCGACAGCCCAATACCCAACCCGACAGCTTTACTGGTGGTAAACGGCTTGAGTAAAGAGGGCAACAGCGCCACAGGCCAGCCAGGGCCGTTATCTGCAATATAAACCTCCAGCGCCTCTCCCTGCGTCTGCCACGTCACCGCGATCGCCGCATCATGCGAACAGGCGTCAAGCGCATTCGCCAGCACATTCACCAGAACCTGCTGAATACGCACTTCATCGCCGCTGACCCATACGGTGTCGGTTGGCAGTGAAAGCGCTCCCTGCCGGGATTGGTGGCGCATGGCTAATAGCTCCCATGCCGCCACAAAGGTTTGGCGCAGATCAACGGGATACAATGGCGTTTCCAGCTCCGCCCGGCGGGTAAACTGCCGCAGCGAACGGATGATGGCGTCAATCCGGTTAATGAGCCCTTCCGCTTTGGTGAGCGTATTTCTCGC [...]
+NODE 2292 51 3676 3676 0 0
+TTATGGTTTTTATTTCCTTAATTAACCAGAGTTAATAAAAATAATTAAATT
+AAGCTTATAAAAGCAAGGGGGAAAGTGTGATGTCTATTCCAGACGAGTAAT
+NODE 2293 51 3487 3487 0 0
+GCCCCCTTTTTCTCCGTCGCCGAAGCCTGGGTCATGTTGGTCATAAACATT
+CTAGCGATTTACTCAGATTCAAAATCTTTGGTATGCCGCTACCGCTTTATG
+NODE 2294 34 1708 1622 0 0
+GGTGAACGCTTTCATCCCGGCCATAAAACCGATG
+GTATTGGCAGCATTCCGGGCGCGATGATCGGCGG
+NODE 2295 51 202 202 0 0
+GTTGCCACCACCGCATCATAACGCTGCGCCAGAATCCACGCCTGCTGGATA
+CCCCGCCGTATATGGGCGGGAAAGGAATGAATGGCGAACTGAAAGAGTTTG
+NODE 2296 13 6699 4987 0 0
+TGTTAAAGAGCAG
+GATTCTTGACGTC
+NODE 2297 17 860 860 0 0
+GAAATGTCCATAAATAG
+TCGGTCAGGTGATGGGG
+NODE 2298 51 2739 2739 0 0
+CGGCAGCGGCGGCACCATTACCGCAGGCTACGACTTCAAGGCCAACAAAGA
+GCCCTGCTGGTTCTGCACCACGTATTCCTGCTTCACGGTGCTGAAGGAGAG
+NODE 2299 39 4211 4211 0 0
+AATTTAACGGTTGTTTTTCCGGCCAGATTTATATCTGGC
+CTTGAAGTCGTAGCCTGCGGTAATGGTGCCGCCGCTGCC
+NODE 2300 1268 75261 74540 0 0
+GGCTGCGTACCGCGTCGTTGCTAAACGTGGTCGTCGCGCATAGTGGTTGTCTGGAGAGCAGCATTAACCATTATGTTCAGCAGGAAACCTTGTGCCAGCAAGGTGAAGAGCGCCAAATTTCTCTGGCGCTTCAGGCCATTTATTTCGATAGTTTGCAAGGAGAGCAATGATGGACTTTTTCAGCATTAACAATGTAATGGTCAACATTCCTCTCGGCGAGGGTGGGTATGCGCTGTCGTGGATTGAGGCTATCGGCACCGTCTTTGGCTTATTGTGCATCTGGTGCGCCAGCCGGGAAAAAATCGTTAATTACCTGTTTGGTTTGATTAACGTCACTCTGTTTGCCGCCATCTTTTTTCAGATTCAACTGTATGCCAGCTTGCTACTTCAGGTGTTTTTCTTTGCGGCGAATATTTACGGCTGGTACGCATGGAGCCGGCAGAATGACGCCCGGGAAGCCGCTCTGAAAGTACGCTGGCTTTCTCGTCAACA [...]
+TTACGGCCGAGCGTCTGCCCGACGCGTTCTTTCATCTCACGCGCTGCCTTGTTGGTAAACGTCACCGCCGCAATATGCCGGGCCTGATAGCCGCATCCGCGGATCAGGTGGGCGATTTTATTGGTAATTACGCGAGTTTTACCAGAACCCGCTCCTGCCAGCACCAGGCAGGGTCCGGTGACGAATTCGACAGCGTGTTGTTGGCCGGGATTTAAACGCATGGGAATAGTGCTCAATCTTCGAACGGGGGAGGGATTGTAGCAGAAAGCGAGGCCCAGAGAAGACCAGGCTGCTTTTTCAGGCAGCCTGGAAAAGGTCAATCAGCAGGCTCTGGCGGCAAGCGGCGTATAGCCATTACGCTGTGCGCTCTTGATCCAACTGTAAGAACCCATTAGCGCGATCGCCGTCAGCAGAACATACTCAAGCGACATCGCATAAACGCCCTGTACTGCATAGATCACGACGCTAATTACATCAATAATCACCCACAGC [...]
+NODE 2301 51 3337 3337 0 0
+ACCTGCCGACCAGATCGATAAAGTCCCACTGGGTATAGCGGGCTAATGCTG
+TATGGGATAGCCTGGCATGAGAAAACGCTGGGACAGCTTTTTTGCGATGAT
+NODE 2302 45 154 154 0 0
+ACTGGCGACCGCTGGAAGACGATAATTTTCGTCTGGGACTGGGCT
+TCCCAGCCATAACCGCCTATGGGTTCCCATTTGTTAAATGAATCT
+NODE 2303 51 2268 1068 0 0
+ACTCCTGTCAGGTGTGGAAACCCTGCCACAAACGGTCATGGCAGGTTAAAG
+TATGTAATGTCCAAGCAACAGATCGGCGTCGTCGGTATGGCAGTGATGGGG
+NODE 2304 566 29777 29435 0 0
+CGGGAGGGATGAACCATCGGCCTGCAGCAGTTCAAGTGTACTGTCAATATTGGCAGTGACGGTAATATCCTTCTGAACCGCAGAAACAGAAAAAGAATAAACGGTGGCCAATGCCACAGCTGCGGCAATAAAAGATGTTTTCATGTTCATAAAAAATAACCTTGCTTTGTTGTTTATTACAGTGATATATGTACACTCGGTATACATCCGCTCCCCCTGAGAATAAATGTAGGGTATAGCGTACGCTCCGTGTGTTTTTACTTTCCGGCTGCTGTTAAATCAGCAGAGATTACCGGTGAATTTGCACCCGTACGATATTCCACACGAAATGCATTACTTTTTATTCCGGCCGGAATATCAGCACTCCCGCCGGGATAAATACTTTTGTCTATATTCTGCCAGTGGCATGTGGTGTCGCAGTTGCCGGCCCGAATAAGAGAAAGCCGGGTATTTCCCGTATTCAGCAGGTGGTGACCGTTCGTTACCAGCGCA [...]
+TGTTTCTCCGTCAGACCCCAGGCCTGCGCTGGTAACGAACGGTCACCACCTGCTGAATACGGGAAATACCCGGCTTTCTCTTATTCGGGCCGGCAACTGCGACACCACATGCCACTGGCAGAATATAGACAAAAGTATTTATCCCGGCGGGAGTGCTGATATTCCGGCCGGAATAAAAAGTAATGCATTTCGTGTGGAATATCGTACGGGTGCAAATTCACCGGTAATCTCTGCTGATTTAACAGCAGCCGGAAAGTAAAAACACACGGAGCGTACGCTATACCCTACATTTATTCTCAGGGGGAGCGGATGTATACCGAGTGTACATATATCACTGTAATAAACAACAAAGCAAGGTTATTTTTTATGAACATGAAAACATCTTTTATTGCCGCAGCTGTGGCATTGGCCACCGTTTATTCTTTTTCTGTTTCTGCGGTTCAGAAGGATATTACCGTCACTGCCAATATTGACAGTACACTTGAACTGCTG [...]
+NODE 2305 25 4482 4412 0 0
+TCCAGCCATACAGAGAAAAACAGTA
+AATGTAGTGGGGCAAAGAAAAAATT
+NODE 2306 536 31687 31372 0 0
+TCTTCTGGATTCTCATGCTCGGTATACACCACGCCGGAACAGCAGTAGCCAAACAGCGGCGCGCGCCAGTTTCGCTGGTTGTTAATTTCATTGAAGGTCATCCAGTATTTGACCTTATGTTTGTAGCGTTCAAACACGACTTCAGCAAAGCGGACAAAGAAATCAACCACTTTACGATTGGTCCAGCCGCCGTAGTGCTGTACCAGATGTAATGGCATTTCAAAGTGAGAAAGGGTAATGACCGGTTCGATGTTGTATTTGAGTAACTCATCAAACATGTCGTCGTAGAATTTCAGACCGGCCTCGTTTGGCTGGGATTCGTCGCCATTCGGGAAGATACGCGTCCAGGCAATAGAGGTACGGAAGCATTTGAACCCCATTTCGGCGAAAAGACGGATGTCTTCTTTGTAATGTCCGTAAAAATCCACCGCCTCGTGGTTCGGATAGTATTTGCCAGCAACGACATTCTGGGTGATTTCGCGTGGCACGCCG [...]
+GCCACGCGAAATCACCCAGAATGTCGTTGCTGGCAAATACTATCCGAACCACGAGGCGGTGGATTTTTACGGACATTACAAAGAAGACATCCGTCTTTTCGCCGAAATGGGGTTCAAATGCTTCCGTACCTCTATTGCCTGGACGCGTATCTTCCCGAATGGCGACGAATCCCAGCCAAACGAGGCCGGTCTGAAATTCTACGACGACATGTTTGATGAGTTACTCAAATACAACATCGAACCGGTCATTACCCTTTCTCACTTTGAAATGCCATTACATCTGGTACAGCACTACGGCGGCTGGACCAATCGTAAAGTGGTTGATTTCTTTGTCCGCTTTGCTGAAGTCGTGTTTGAACGCTACAAACATAAGGTCAAATACTGGATGACCTTCAATGAAATTAACAACCAGCGAAACTGGCGCGCGCCGCTGTTTGGCTACTGCTGTTCCGGCGTGGTGTATACCGAGCATGAGAATCCAGAAGAAACCAT [...]
+NODE 2307 51 2632 2632 0 0
+GACTTCTACCACGAAATGACCGACTCCAACGTTATCGATAAAGTATCCCTG
+CGTTACCCTCACGAGTACGTTCACCTACGCCCGCAAACACAGAGTAACCGG
+NODE 2308 51 2561 2561 0 0
+ACCGCCGCTCTGGCAGCGTCTGGTGAGCGTCAGTGACTATACGCCGCCCTT
+TTTTTGCAGGCAGCGACCGCAGGGGAGCGAAGGATGCGCGGCGGGTAATCC
+NODE 2309 118 4510 3068 0 0
+GAGTTTACTGGTGCATCAGCTTAAATTTACCCGCCGCAGCGAAATTGCCGCCGCACTGGCGCGTCTACTGTTGCAGGAAGTCCTCATGGCGCGCCGCAGCACTGGCTTGCAGCTTCCC
+GTAGACGCGCCAGTGCGGCGGCAATTTCGCTGCGGCGGGTAAATTTAAGCTGATGCACCAGTAAACTCAAGGGCGGCGTATAGTCACTGACGCTCACCAGACGCTGCCAGAGCGGCGG
+NODE 2310 51 1336 1305 0 0
+CGGGAAGCTGCAAGCCAGTGCTGCGGCGCGCCATGAGGACTTCCTGCAACA
+GACAGAATCGTCAGCGTTCCGCTCTGGTCGCGCCGACACTGGCGGCGGGGA
+NODE 2311 51 3036 2944 0 0
+CTTTGTACAGAGTCGCCATGGTAATTACTTATTACTGACGAATAAAGAGCG
+GCCAGCCACTGGCGCAGGCAGATACTTGCTTTCATCATGAGAAGGCGCAAT
+NODE 2312 180 7949 7860 0 0
+CTTCAGCAGGTCCGCCGGGCGGCAGGTCACCGGAGCGCCCCCGTCCAGCACGCGGGCCTGCAGTGCCGCGTTTACCGGCACCGGAGTGTGGCCGTATTCGCCTTTCAGAATGCCAGCGGTTTCTTTGGCAATGGTTTTGTAGCGCTCGCCGGTCAGGACGTTGAGCACCGCCTGGGTGCC
+TGCCAAAGAAACCGCTGGCATTCTGAAAGGCGAATACGGCCACACTCCGGTGCCGGTAAACGCGGCACTGCAGGCCCGCGTGCTGGACGGGGGCGCTCCGGTGACCTGCCGCCCGGCGGACCTGCTGAAGCCGGAACTGGCTGAACTGGAAGCGGACGTCAGGCGCCAGGCGCAGGAGAA
+NODE 2313 62 4163 4141 0 0
+CGGGCAAATCTGCACACCTTTGAGAGCAGATGTCACCACGGTTTTACGTGATGATGAAGGCA
+CAGATTTGCCCGTACATCAGGGATGTTTCCCTTCAGTACTCACAGCTCCTTTCAGGCTACGG
+NODE 2314 471 23685 23624 0 0
+CGTGAACAACTACTGGAGGTTGGCGATTTCTTAAAGAAACTGCCGAAACCTTACGTCATGCTGTTTGACTTACACGGCATGGATGAACGCCTGCGTACGCACCGTGACGGGTTACCCGCCGCGGATTTTTCCGTTTTCTACCACCTGATTTCCATTGAGCGTAATCGCGATATCATGCTCAAGGTGGCGTTGTCTGAAAACGACCTGCGCGTGCCGACCTTCACTAAACTTTTCCCTAACGCCAACTGGTACGAGCGTGAGACCTGGGAGATGTTTGGTATTGATATCGAAGGTCACCCGCACCTGACGCGCATCATGATGCCGCAAACCTGGGAAGGCCATCCGCTGCGTAAAGATTATCCGGCGCGCGCGACCGAATTCGACCCGTTTGAGCTGACCAAAGCCAAGCAGGATCTGGAAATGGAAGCGCTGACCTTTAAGCCGGAAGACTGGGGGATGAAGCGCGGGACT
+TTTCCAGATCCTGCTTGGCTTTGGTCAGCTCAAACGGGTCGAATTCGGTCGCGCGCGCCGGATAATCTTTACGCAGCGGATGGCCTTCCCAGGTTTGCGGCATCATGATGCGCGTCAGGTGCGGGTGACCTTCGATATCAATACCAAACATCTCCCAGGTCTCACGCTCGTACCAGTTGGCGTTAGGGAAAAGTTTAGTGAAGGTCGGCACGCGCAGGTCGTTTTCAGACAACGCCACCTTGAGCATGATATCGCGATTACGCTCAATGGAAATCAGGTGGTAGAAAACGGAAAAATCCGCGGCGGGTAACCCGTCACGGTGCGTACGCAGGCGTTCATCCATGCCGTGTAAGTCAAACAGCATGACGTAAGGTTTCGGCAGTTTCTTTAAGAAATCGCCAACCTCCAGTAGTTGTTCACGCTTGACCCAAACAACGGGGATACCGGTGCGGGTCGCCTGAACGGTAAAGG
+NODE 2315 333 16977 16832 0 0
+CTATGTTCACAGTGAAGATCGCCTACGCTATCCGGAATACCGCGCGCCGGGTTCCGACAAGTGGCAGCGCATTAGCTGGGATGACGCTTTCACTCGTATTGCTAAATTAATGAAAGCCGACCGCGACGCCAACTTTATTGAAAAGAACGAGCAGGGCGTCACGGTTAACCGCTGGCTCTCTACCGGAATGCTGTGCGCCTCGGCGGCCAGCAATGAAACGGGGATGCTGACGCAGAAGTTTGCGCGTTCTCTCGGTATGCTGGCGGTAGATAACCAGGCGCGCGTCTGACACGGACCAACGGTAGCAAGTCTTGCTCCAACATTTGGTCGCGG
+GCGCGCCTGGTTATCTACCGCCAGCATACCGAGAGAACGCGCAAACTTCTGCGTCAGCATCCCCGTTTCATTGCTGGCCGCCGAGGCGCACAGCATTCCGGTAGAGAGCCAGCGGTTAACCGTGACGCCCTGCTCGTTCTTTTCAATAAAGTTGGCGTCGCGGTCGGCTTTCATTAATTTAGCAATACGAGTGAAAGCGTCATCCCAGCTAATGCGCTGCCACTTGTCGGAACCCGGCGCGCGGTATTCCGGATAGCGTAGGCGATCTTCACTGTGAACATAGTCCAGCAAACCGGCCCCTTTCGGGCACAGCGCGCCACGGCTTACCGGATG
+NODE 2316 21 1983 1961 0 0
+TGCGATGACCAACCACTGGGT
+TACCGTTGGTCCGTGTCAGAC
+NODE 2317 1123 58914 58675 0 0
+CCGCTTGGTCACAAAGTTCAGAATGCCGCCCGTGTTGTTGTCGCCCGGGAACCAGTTTTGTACGGTGGAATATTTTACTTCAGCATCTTTATGGATGATGACTTCCACTACCGCGGCGTGGAGCTGATAACTGTCGCGTACGGGCGCGGAGCAGCCTTCGATATAACTCACATAGCTGCCTTCATCCGCCACCAGAATCGTGCGCTCAAACTGACCGGTTTTCTCGGCGTTAATGCGAAAATAGGTGGATAACTCCATTGGGCAACGCACGCCTTTGGGAACATAGATAAATGTCCCATCGGAAGCGACTGCCGCATTCAGCGCGGCAAAAAAGTTATCGTTCCCCGGCACGACGGTGCCAAGATATTTCCTGACCAGGTCAGGGTGATCGTGTATCGCTTCGCCAAAAGAACAGAAAATAATGCCCTGTTCCGCCAGTTTTTCACGGTATGTGGTCGCTACGGAGACCGAGTCAAAAATCGCATCGACGGC [...]
+GAAGGCGCAAAGCTTTTCGCACCGTTACAGGCGATGCCTTTTATTGACGGAACAGAAGTGGATTACGTACAGGAAGGGCTGAACCAGTTATTTAAATTTCATAACCCCAAAGCCCAGAATGAATGCGGCTGCGGCGAAAGTTTTGGGGTATAGGCGGTACTATGTCTCGTAACACTGAAGCAACGGAAGAGGTCGGCATCTGGACAGGCGGACGCCTTAATTACAAAGAAGGATTTTTCACGCAACTACCCACTGATGAACTGGCAAAAGGCATCAGCGAAGAGGTGGTGCGCGCGATTTCCGCAAAGCGTAACGAACCTGAGTGGATGCTGGAATTTCGTCTCAATGCCTATAGAGCCTGGCTGGACATGGATGAACCGCACTGGCTGAAGGCGTACTACGATAAACTGAACTATCAGGACTACAGCTATTACTCTGCGCCATCATGCGGAAACTGCGACGATAACTGCGTTTCCCAGCCGGGAGCCGTAC [...]
+NODE 2318 2195 107394 106526 0 0
+GATTTTCGTCGTAGTGTTCGTAACGCGCGGTCCCCATTACATTACCGCCTTGTGCAGCGAACGCTTTTGATGCCACGGCACGTGTCCGCATTTCATGTTGCGGTGCTTCGGCTGTTGCCAGAGATCCCGCTTTGGCATCTGCCAGAGATGCCGCTTTGGCATCTGCCAGGGCTTTGGCTTCAGCTTTCGCTTTATATTCGGCTGCTTTTTTCGCAGCCTGTTGGGCGGCCTCGGCTTGTCTTTTCTGGACAGTGTCATCCCCGGCCTGAGCGCTATTTTCTTTCTGGATAGCCTGCTCCTGTTTTAACTCAGCCGGATTATTTCCCTGCGGGTCGGAGGGCTCCGGCCCACAGCCCGAGAGAACAACCCCACCCAACAACAGCATTAATGTTTTTCCATTAAGCATACAAATTCCTTTTCAATTATATTCGGGTAACTCTCTGCAGATGTCCTGCATTATATTCCGCTTTACTTTTATTATCTGCATGGCGA [...]
+GTCACTCCGCCAGACGATGGCGGCGATGTCACCCCGCCGGACGATGACGGCGATATCACTCCGCCTGACGGCGGCGACGTCACGCCCGTGGCGCCGCAGTACCGCGCCGACATTGGCGTTTATCTCGGCAACCAGTGGATGGCGCGCAACCTGCAAATGCAGACCCTCTACGACCGGGAAGGCAGCCAGTACCGTTCCGCCGACGGCAGCATCTGGATGCGTTTTAAGGCCGGTAAAGCCGAATCGCAGGCGGTTAACGGCAATGTAGATATCGACAGCGACTACTCGCAGTTCCAGCTCGGCGGCGACATCCTGACCTGGAGCGACGGCGCGCAGAGCGTCACCGTTGGCCTGATGGGCAGCTACATCAACGCCAGCACCGACAGCACCGGCAACCGGGGGGCGGACGGCAGCCAGTTCTCCGCCAACGGTAGCGTGGACGGCTACAACCTCGGCCTCTACGCCACCTGGTTTGCCGATGCGCAAAGCCAT [...]
+NODE 2319 11 15 15 0 0
+TAAACCCACCA
+ACTATACCCAA
+NODE 2320 19 1063 1063 0 0
+CGCTTCGCTGCCTGGCAAT
+TGGTGATATAGATCCCTCA
+NODE 2321 16 6518 2714 0 0
+ACTCAAAGGAGACTGC
+TTGCGCTCGTTGCGGG
+NODE 2322 37 42 42 0 0
+GCTCACGACGTTCTAAACCCAGCTCGCGTACCACTTT
+CTCTGCCGTGGGCGCTGGAGAACTGAGGGGGGCTGCT
+NODE 2323 24 1380 1380 0 0
+ATAACGTTGCTTAGAAGGGATAAT
+GCGAAAAATGTAGCTGCTTTTTTT
+NODE 2324 2643 139118 138235 0 0
+GCGCGGCCCAGCGCGGCGTCAGCTTCTTTACCGGTCAGGTTTTTATCCACCAGGTCCAGCAGGAACAGGTGGTTTTCAGTGCCGCCAGACACCACTTTGTAGCCGCGGTTCAGGAACACTTCTACCATCGCTTTGGCGTTTTTCGCCACCTGCTGCTGGTAAACTTTGAACTCCGGCTCCATCGCTTCTTTCAGCGCTACCGCTTTACCCGCGATCACGTGCATCAGCGGGCCGCCCTGCGCGCTTGGGAACACGGCGGAGTTCAGTTTTTTATACAGCTCTTCATCGCCGCCCTTCGCCAGGATCAGGCCGCCGCGCGGACCCGCCAGGGTTTTGTGGGTGGTGGTGGTGACAACGTGAGCGTGCGGAACCGGGTTCGGGTAAACGCCTGCGGCAATCAGGCCCGCCACGTGCGCCATGTCGACAAACAGGTATGCGCCGATGCTGTCAGCGATTTCACGCATTTTTGCCCAGTCAACCACGCCAGAGTAG [...]
+GAGGAAAACGGGCGTTCGCCTTAACGATAACGCCCGTTTTTTCAGCGGATTTCTTGCAATTACAGCACTTTATGCGGGCCGAAGCATTCGTAATGAATGTTTTCGTTATTCACGCCAAGTGAAACCAGTTGTTTTGCGGCAAACTGCATAAAGCCTACCGGGCCGCAAAGATAGAACTGCATTGCCGGATCGCTGATCGCGGCTTCCAGTTTGCTTAAATCCATCAGCCCTTCGCTGTCAAAGACGCGTTGGGCGCGATCGGCCTCGGTTGGCTCGCGGTACCAGGTATGGGCAGTGAAACGCGGCAGTGTACGACCCAGCTCGCTCACTTCGTCGGCAAACGCATGGACGTCGCCGTTCTCCGCCGCGTGGAACCAGTTCACCTGCGCGGTATGCTGTCCTTTCGCCAGCGTATCGAGCATCGCTAACATCGGCGTCTGGCCGACGCCAGCGGAAATCAGCGAAACGGGGGTATCAGCGGCGACATTCATA [...]
+NODE 2325 179 17735 12948 0 0
+GTGAAACTGATTTTGATTTTCTTCAGCGACTGATGCAGGAGTGGGGCATCTACTGGTGGTTTGAGCACAGCGAGGACAGCCACACGCTGGTGCTGGCGGATGCCATCAGCGCCCACAAAGCATGTCCGGACTCGCCGCTGGTCGAGTGGCACCAGGAAGGGCTGAAGCTGGACAAGGAG
+CCGGACATGCTTTGTGGGCGCTGATGGCATCCGCCAGCACCAGCGTGTGGCTGTCCTCGCTGTGCTCAAACCACCAGTAGATGCCCCACTCCTGCATCAGTCGCTGAAGAAAATCAAAATCAGTTTCACCGTACTGCACCTGCCAGGTGCGTACCGGGTAGCTTTCCACCAGCCGCTTT
+NODE 2326 48 3486 2735 0 0
+CGAACCCCCGATACGTTGCCGTATACACACTTTCCAGGCGTGCTCCTT
+TCCCCCCCTCACCGCCATATTTAAGTTGAGAGCCTGTACAGAAGTACG
+NODE 2327 28 2763 2732 0 0
+CAGCCACTCGGACACCTCACCATATTGT
+GTATACGGCAACGTATCGGGGGTTCGAA
+NODE 2328 2240 117905 116162 0 0
+AGATGCGCGGGCTTTACCAGTTCGAGCAATTCGCTTACCACCCGGTTCAAACGGTCGGCCTCTTTGGCCATCACCTGCGCCAGTTCATGCGACTCGCCGCCGGCAGGCGTGCGCTCGGCAAAGTATTTCGCCAGCCCTTTGATGGACGAGAGCGGGTTACGAATTTCGTGCGCGACGCCCGCCGCCAGATGCCCCATCGCCACCAGCTTTTCTTTACGCTTCATTGTATCAAGCAGTTCTCTGTGCGAGCGCTGATAACGCTGATGCCAAAAAAACGCCAGTAACGTTGCCAACAGCACCGTCGCTAACGCAGACAAAACAATCAGCGTATTACGCCACTCCCTTGCCTGTGTCGCGGCCAGCTCGCTGGCGTCAAAGGCAATAAAAATAGTTTGTTTCGCTGGTTCGTCGTCATTGGCGCTACGCGCCATGCCGTGCCCCCTCATACCGTGACCTCTCATACCGAAAAGCGGCTGGAACTGACGGTAAATT [...]
+CCATCTGCTTTCTGTTTTTAGCCCGTGGCATAGCGGCAGCACGACGACCAGCGAATATCGTTGGCAGGGTGATACGCTTTCGCTTATTGAACTCAATATTTACAGCAAACCGCCAGAACATATTCGCGCGCGTTTCGACGCTCATGGCGAACTCAGTTTTATGCAGCGTGAAGTCGGGGGGCAGAAGCAGCAGCTTTCCAACGATCAGATTGCCTTGTATCGCTATCGCGCCGAACAAATCCGTCAGACCAGCGACGCCTTGCGCCTGGGGCGGGTCATACTACGCCAGGGACGCTGGCACGCCGACCATACGGTAACCACCTGTGAAGGTGAAACGCTGAAACCGGATCTGGATTCCTGGGCAATAAGCCACATTGAGCGCCGCCAGAACCACTCATCGGTAGAGGTGAGCGTAGCATGGCTGGAGGCGCCGGAAGGATCGCAACTTTTGCTGGTGGCGAATTCAGATTTCTGTCACTGGCAGCCGCAAGC [...]
+NODE 2329 51 2446 1467 0 0
+ACCGTTTGAAAAAACGGACTGCGGCATGTACTACCTGCCGTATGCGACGTC
+TAATGTGGTTGGCTTTCCTTGCAGAAAAGAGGAACAAATGGCCGGAGACGC
+NODE 2330 51 2867 2867 0 0
+ACCGGCCACACCATGTTCCTGACGCTGGGCGTCAAAGCAGGCACCATCAGC
+TAAACAGTTCGGAACCGGCGATGATGACCAGCGTTAAGGCGATACCGAAGG
+NODE 2331 198 10171 10101 0 0
+CAGTTTGTCCGCCGCGTTCTGCTGCTTCAGCTGGCCTTCCAGGTTAGTGAGCATTCCGCCCGGCACCTGCGCCACCAGAATGCGGCTGTCGTAGCCCTTCAGCTGGCCTTCAAAGGCGTGGTACTTTTTGCGCACCTCGCGGAAATACGCGGCGATATTTTCCAGCTTCAGGATATCCAGCCCGGTGTCGTGCTCAGT
+GTATTTCCGCGAGGTGCGCAAAAAGTACCACGCCTTTGAAGGCCAGCTGAAGGGCTACGACAGCCGCATTCTGGTGGCGCAGGTGCCGGGCGGAATGCTCACTAACCTGGAAGGCCAGCTGAAGCAGCAGAACGCGGCGGACAAACTGGACCAGGTGCTGGCGGAAATCCCCCGCGTGCGCGAGGACCTCGGCTTTAT
+NODE 2332 29 1603 1603 0 0
+CAAAATTGCGCGACTCCGCATTCTTGATG
+GTAATCCGGATCGACTGCAACCAGAGAGC
+NODE 2333 22 1421 1421 0 0
+AGTGAGGATTGTAATCATTGAA
+GGCTTTTATGCATTTAATTTGC
+NODE 2334 29 1942 1942 0 0
+TTTGTGAATTAAGGTCGCCGCCGCGGAGC
+TCATCAAGAATGCGGAGTCGCGCAATTTT
+NODE 2335 289 14929 14929 0 0
+AAGCGCCGGGGTTGCGTCTTCACCGGAGAAACCTTTGATTTTTACAGCGGTGGGGATGTGGCTCAAATCAACGGCCACACCGGGAGTCACTGGAGCGATGTCGTACAGGGAGAGTTCTGAACCTGAAGGCAGTTGGTTTTTTAAAAGTAATGCCAGCGCCTGACCGATACCACCAGCAGCGCCGAGGACTGCGACTTTCATCCTAAACTCCTTATTATATGATTAGCTAAGTGTCTATTGCTCCGCGGCGGCGACCTTAATTCACAAATTCAATGATTACAATCCTCAC
+AATAGACACTTAGCTAATCATATAATAAGGAGTTTAGGATGAAAGTCGCAGTCCTCGGCGCTGCTGGTGGTATCGGTCAGGCGCTGGCATTACTTTTAAAAAACCAACTGCCTTCAGGTTCAGAACTCTCCCTGTACGACATCGCTCCAGTGACTCCCGGTGTGGCCGTTGATTTGAGCCACATCCCCACCGCTGTAAAAATCAAAGGTTTCTCCGGTGAAGACGCAACCCCGGCGCTTGAAGGCGCTGACGTAGTACTGATTTCTGCGGGTGTGGCGCGTAAGCCGGG
+NODE 2336 51 108 108 0 0
+CGCGTAGCGCACAGCGTTTGCCATTCCTCAGTAAGCGCTTGCTCCTCCTGC
+GGGGCGTTCAGCTCCAGCCGCAAGAAGACCTCGCGGGCTGGTTGACCGCCG
+NODE 2337 8 18 18 0 0
+GTCATATC
+CTCGTCAC
+NODE 2338 31 12678 91 0 0
+ACCTTACCGGCGCTTATCGCAGATTAGCACG
+GGCGATACCCGAATGGGGAAACCCAGTGTGA
+NODE 2339 19 66 66 0 0
+CTTGCGCGGTAATGTGTGA
+ACCGCCGTGAAAGGGCGGT
+NODE 2340 346 17043 16900 0 0
+ACCATTAAAGATCGTCCCGGTACGTTAGGTTTGCCCAACGTGGGGCAGTGGCGTAACGACCCGACGGAACTGGCCCAGGTCAAGGCCAGCCCGGTCAACCTGAGCTTCTGGCAGGTTTTTGTGAAATATATCCTGACCAATCCACTGGTATGGATCATTATTATCGGTGATATGTCGGTTTATATTGCGCGCACTATTCTTAACGACTGGCCGCAGATTTACTATTCGCAGGTTCACGGCTGGAGTCTGATAAAAGCGAACTCGATTATTTCCTGGTTTGAGGCGGGCGGACTGGCAGGTGGGTTGCTGGCAGGCTACTTGTCTGACTTTATGTTCAAAAGTAACC
+GCCAGTCCGCCCGCCTCAAACCAGGAAATAATCGAGTTCGCTTTTATCAGACTCCAGCCGTGAACCTGCGAATAGTAAATCTGCGGCCAGTCGTTAAGAATAGTGCGCGCAATATAAACCGACATATCACCGATAATAATGATCCATACCAGTGGATTGGTCAGGATATATTTCACAAAAACCTGCCAGAAGCTCAGGTTGACCGGGCTGGCCTTGACCTGGGCCAGTTCCGTCGGGTCGTTACGCCACTGCCCCACGTTGGGCAAACCTAACGTACCGGGACGATCTTTAATGGTAAATAGCGCCACTATCCCCATCAGCAGCGAAATGGCGCCGGGAACATAAA
+NODE 2341 51 2889 2889 0 0
+ACCAGATCGCACTGGAGGAAGCGGGGCGCTATGCGGCAGAAGATGCGGATG
+TTAAAGGTGAGCTGGTTTTTACCTTTACCGGCAATGTCTTCAAAGGTGATA
+NODE 2342 777 41642 41237 0 0
+TCACGTTACAGTTGCATCTCAAAATGTGGCCTGAGCTCCAGCAGCACAAAGGCCCGCTGAATGTTTTCGAAAACATCGAAATGCCGCTGGTGCCGGTACTGTCACGCGTTGAGCGCAATGGCGTAAAAATCGATCCTGCCGTCCTGCACAAACATTCGGAAGAAATCACACTACGTCTGGCGGAACTGGAAAAGAAAGCGCATGACATTGCGGGCGAGGCGTTCAACCTGTCCTCGACGAAGCAGTTGCAGACTATCCTGTTTGAAAAGCAGGGTATTAAGCCGTTGAAGAAAACGCCTGGCGGCGCGCCGTCAACGTCGGAAGAGGTGCTGGAAGAGCTGGCGCTGGACTATCCGCTGCCGAAAGTGATTCTGGAGTATCGTGGTCTGGCGAAGCTAAAATCCACCTATACCGATAAGCTGCCGCTGATGATTAACCCGAAAACCGGGCGCGTCCATACGTCCTATCATCAGGCGGTAACGGCGACGGGAC [...]
+AGCGGCAAGCCAAAGACTTCCGCCGCCGTTGCGCGGTGAATATCTTTCCCTTCGGCGAACGCCGTGAGCAGCCCTTTATCACGGGAAAGATGCGCCATAATACGCAGCTCAATCTGTGAATAGTCCGCAGACACGATGAGATAATCCTCAGGCGCAATAAATGCCTGACGAATGCGGCGGCCCTCTTCATTGCGCACCGGAATATTTTGCAGGTTCGGATCGGTGGACGATAAACGTCCCGTCGCCGTTACCGCCTGATGATAGGACGTATGGACGCGCCCGGTTTTCGGGTTAATCATCAGCGGCAGCTTATCGGTATAGGTGGATTTTAGCTTCGCCAGACCACGATACTCCAGAATCACTTTCGGCAGCGGATAGTCCAGCGCCAGCTCTTCCAGCACCTCTTCCGACGTTGACGGCGCGCCGCCAGGCGTTTTCTTCAACGGCTTAATACCCTGCTTTTCAAACAGGATAGTCTGCAACTGCTTCGTC [...]
+NODE 2343 750 36965 36488 0 0
+CCTGGCCAGCGAGCAGGCCGCACGAATGGTGGCGATGAAAGCCGCAACCGATAATGGCGGCAGCCTGATTAAAGAGCTGCAGTTGGTATACAACAAAGCTCGTCAGGCCAGCATTACTCAGGAACTCACCGAGATCGTCTCGGGGGCCGCCGCGGTTTAACCAGGTTATTTCGTAGAGGATTTAAGATGGCTACTGGAAAGATTGTCCAGGTAATCGGCGCCGTGGTCGACGTCGAGTTCCCTCAGGATGCCGTACCACGCGTGTACGATGCCCTTGAGGTGCAGAATGGTAATGAGAAGCTGGTGCTGGAAGTTCAGCAGCAGCTTGGCGGCGGTATTGTGCGTACCATCGCGATGGGGTCTTCTGACGGTCTGCGTCGCGGTCTGGATGTAAAAGATCTCGAACACCCGATCGAAGTCCCGGTAGGTAAAGCCACGCTGGGTCGTATCATGAACGTCCTGGGCGAACCGGTCGACATGAAAGGCGAGATC [...]
+AGTGCTCGATCGCGATGTTACGGATAAGCTCCATCATGTTTACGGTTTTACCTACACCCGCACCACCGAACAGACCGACTTTACCGCCCTTCGCGAACGGACACATCAGGTCGATAACTTTGATACCGGTTTCCAGCAGTTCCTGAGAGTTTGACAACTCTTCGTAGGAAGGCGCTGCGCGGTGAATCGCCCAACGCTCTTCTTCGCCGATCTCGCCTTTCATGTCGACCGGTTCGCCCAGGACGTTCATGATACGACCCAGCGTGGCTTTACCTACCGGGACTTCGATCGGGTGTTCGAGATCTTTTACATCCAGACCGCGACGCAGACCGTCAGAAGACCCCATCGCGATGGTACGCACAATACCGCCGCCAAGCTGCTGCTGAACTTCCAGCACCAGCTTCTCATTACCATTCTGCACCTCAAGGGCATCGTACACGCGTGGTACGGCATCCTGAGGGAACTCGACGTCGACCACGGCGCCGATTACCT [...]
+NODE 2344 9 739 739 0 0
+AATTTGTTG
+TCGGGGTCG
+NODE 2345 12 971 971 0 0
+CTGTCGTAATTC
+ACCTTGCCAAGG
+NODE 2346 31 1501 1501 0 0
+GGTGCAGGCCTGCAGCCGGTGCGACCGGAGT
+TCCACCCGTTTACGTTTCAGGCTGTCCATAT
+NODE 2347 1320 83117 82647 0 0
+TTAATGGGTGGCTTGAGCTATGGGGGGCATGGGTTTATTCAGGAAGACTCGAAAAACGCATGAGCAGCGTTATAGCGCAGTTTATGGAGAGGGTAGAACCATCAAGAGTGATGACAAGGCCAATGTGCAATGATGATGACGGAATGTTGATTTCTCAGGTCGTAGATTCCGTTATGCGCATCGACACAAAGGCCTTTGGCATTCTGCTTAGCTATTACGCACATGGTTCCTCTAAGCGAGCAATTGCATCCTACTATCACGCGACTGCAAAGCCACGCAAGATGTGTGGACGTGGTGGCGAGGGATGGAGAAAACCTTCACTGGCAACCTGTAGAAATGAAATTGACGACATCCTGAAAGCGTCATTATTTTTTTTATACCAGCCAATGCAAAATGCTTTCAAAATGCGTAAACGTGTTGAGAAAGTTAAGCATGTTGTTGTTAAAAGTCTTGACATGCAATTATCCATTTAGCCATAATTAGAGGGTAAGC [...]
+ACAGTCCATACACCAACAATATCTTTGTATGGTATGTAGCTGACACCTTCCAGACCATCGTTACCACTCTGACCTGTGATTAACACAGATGCTATAGCAATAGCCCCGCCACTTATCGCCGCTATTACGCTATTTCGTAGTGCCGGTGACATTGCCATTCAATCTGTCCTCACGCTCTTTGCGTTTGTAGTACCAGTTGATGCCAAATGTGCCGACAGTACAAAGAATACCAACGATTACAGCCCAGTCATTCAGGGAGAGAATGCCACCCATCGCAGTCAGTCCTCCGAAGCTGTAACTGAACCATTCTCTGATTTTGTCCATACGGTACATGCTCTACCCCCTTTATTGAGGGGATTTGCTCTATTGAATTAGGAATAAGGTCGATTACTGATAGAACAAATCCAGGCTACTGTGTTTAGTAATCAGATTTGTTCGTGACCGATATGCACGGGCAAAACGGCAGGAGGTTGTTATCGCAACCTCTTGCCA [...]
+NODE 2348 33 1485 1485 0 0
+TGCTGCCGTTGTACCCGCAATACTCTTGCTCAA
+TCGCTTGCTAACAGTTCATCGACAGCGCTTTCC
+NODE 2349 138 271 271 0 0
+CAAAAGCCCTTCTAACTAGAAGTTAGAAGGGCTTTTGGTGTAATGAGGAGCTTGGCGGTGACCTACTTTCACATGGGTAGTCCACACTATCATCGGCGCTAAGTCGTTTCACTGTACTGTTCGGAATGGGAAGGAGTG
+AGTGTGGACTACCCATGTGAAAGTAGGTCACCGCCAAGCTCCTCATTACACCAAAAGCCCTTCTAACTTCTAGTTAGAAGGGCTTTTGGGTTTTTCGCTTTACTCGCTATGGCCGCCAAGCAAAAAAGCGTAGTGATG
+NODE 2350 51 2421 2421 0 0
+TCAACGTTGTGACAACAGTGCCAAAGCGGGAAAGACAGGTAATGGCCCCAT
+ATATATATTGCCATCATTACGCTTACCGGCGTGTCATTAGCTTACCTTTTC
+NODE 2351 66 2653 2608 0 0
+CTATCCTGTAACGCTACCTCACCGGCCAGCGCCGCCAGCGCGTTAACCGACCACGGCATTTGTTGG
+TAGCGTTACAGGATAGCGCCTGGCAACAGGCGACCTGGCATTGGTTACGGGAGGAGGGCGCCCGGT
+NODE 2352 325 16890 15705 0 0
+TAGGTTCACGTAGCGCATCCAGTGTGCGTCGTTCAAATTCAGGCAATTCATCAAGGAACAAAATTCCGTTGTGCGCCAGCGATATCTCTCCCGGGGTGGGTATTGCGCCGCCGCCGACCATAGCAGTAAGTGAGGCGCTATGATGAGGTGAGCGAAAGGGGCGTTGCTGCCATCGTTTTTGTACCGTATCGGCATTAACCAGACTGAGGATCGCGGCGCTTTCCAACGCCTCTTCATTGCTTAATGGTGGAAGAATCCCGCTCAGTCGACTGGCCAGCATGGTTTTACCCGTACCCGGCGGGCCGATCAATAGCAGATTATGGCC
+GGCCAGTCGACTGAGCGGGATTCTTCCACCATTAAGCAATGAAGAGGCGTTGGAAAGCGCCGCGATCCTCAGTCTGGTTAATGCCGATACGGTACAAAAACGATGGCAGCAACGCCCCTTTCGCTCACCTCATCATAGCGCCTCACTTACTGCTATGGTCGGCGGCGGCGCAATACCCACCCCGGGAGAGATATCGCTGGCGCACAACGGAATTTTGTTCCTTGATGAATTGCCTGAATTTGAACGACGCACACTGGATGCGCTACGTGAACCTATAGAATCCGGTCAAATTCATTTATCCCGTACCAGAGCGAAAATAACGTAC
+NODE 2353 19 860 860 0 0
+TTACTATCCTTCTCACTGG
+ACCCCGCCAGGAACTGGAA
+NODE 2354 4 8 8 0 0
+GTTA
+CCCG
+NODE 2355 51 2650 1203 0 0
+ACCCGCGGCGATATTTGCAACGCCTGTGGCAGGGCATCCACGTCACTTAAT
+TCATCCGTTTGCTGAACGTGGCAGGTTTGCTGCGCCATTCCGTTCAGGAAG
+NODE 2356 1338 64087 63701 0 0
+CGTTATGGGTAAGTGAAGATGCCGAACAGCAGCGCATTCGCGGTTTCGGCGAACAGTTTAAGCTCGGCATACCGCTCGGTAAAATCGCCCGTCCGCAGGAGATAGCCAATACCATTTTGTTTCTTGCCTCCGATCTGGCCAGCCACATTACCTTGCAGGATATCGTGGTGGACGGCGGTTCAACATTGGGAGCCTGACGATGATCTGGAAACGGCATTTAACGCTGGATGAATTGAACGCTACCAGTCAGAACACGCTGGTGGCGCATCTGGGCATTGTTTACACCCGTCTGGGCGATGACGTGCTGGAGGCGGAAATGCCCGTCGATGCCCGCACTCATCAACCGTTTGGTCTGCTACATGGCGGCGCATCGGCAGCGCTGGCGGAGACGTTAGGATCAATGGCGGGTTATCTGATGACCCGCGACGGGCAGTGCGTGGTCGGGACCGAGTTAAACGCCACCCATCACCGCGCCGTCTCGCAGGGGAAAGT [...]
+ACCAGCGCGATCACCCCTGCCGTCGCGCCCATCTCCTCTTTAACCAGCTCGCCAAGCGAACGCCCATCGCGCCGGGTCGAGACGAACAGCACCATAAAGTCCTGCACCGCTCCCGCCAGCACAACGCCCGCCAGCAGCCAGATCATCCCCGGCAGATAGCCCATCTGCGCCGCCAGTACCGGCCCGACCAGCGGACCTGCGCCAGCAATGGCAGCAAAATGGTGACCGAACAGCACTTTCTTATCGGTCGGGACATAATCCAGACCATCATTATGACGTACCGCGGGCGTCATACGCGTTGGGTCAACCGCCAGCACTTTTTTGGCGATATAGAGCCCATAAAAACGATACGCAATTAGATAGACACAGACCGACGCCACCACGATCCATAGCGCGTTGATCTGTTCCCCACGATTTAACGCAATATAGCCCAGGGCAAACGCACCCAATACTGAGAGCGCTGTCCAGACGAGGTATTTCCCTGATTTATTC [...]
+NODE 2357 37 2061 2004 0 0
+ACCCGTGACTGTGTTAACGCCAAAGGCGAAGGCATGG
+CCCAATACCACGTCCTGAGACGGAACGATGATAGGTT
+NODE 2358 14 857 855 0 0
+TGCTGACTGGCCCG
+TCATATAGTACAGA
+NODE 2359 97 18687 14131 0 0
+GAAGGAAAGGAAGGAGCATACAGAAGTATGTGACTGACTTTACGAGCGCAGGCAACGCCGCTGATGCGATAAAGAATTGCGTACTGAGCATAAAAGA
+GCTCGTAAAGTCAGTCACATACTTCTGTATGCTCCTTCCTTTCCTTCGCTTGCCGCCTTGCTGCTGCGCAAATTATTGCGTACTCAACTCTGAATCA
+NODE 2360 2073 105467 104338 0 0
+AGCTCTTATTCAACTCTTTATTTTTGTCCGGTAGTCGCGGGATATTGTGATAACGGTTTTTATAAGCGAAATACCCCAGCAAAACTGACAACTAACTGTTACACATTAGTTACAGTGCGACAAACGTTGTCATCATAGCTATCACAATGTTAATAAACTGTGAATTTACTCACAGATTGAAAACGGTTACATGCGGGGCGTAATCAGTTAGTGATCAGTACCGCATTCTGTCGCCACGCCACCGAATGGCGCCGTACCAGGGTCGGCATAAAGCAGTGCGTCGCCGTGATATCCAGCGTGCCTGCGGCCCCCTGTAACGCCAGCTCGGTCGCGATTTTCGCCATAGAAGCAATAGGATAGCGCACGGTAGTCAACTGAGGATCGGTATAACGAGCAATAGGGATATCATCGAAACCGATGACAGACAGATGCAAGGGAATGGCGATGCCGTTATCTTTTAACGCCGTCAGCGCGCCCGCCGCCATGTTATCG [...]
+TCGGCAATATTGTATGAAAAATACTGGAAGCTGAACGGCGGCATGGAGGCTATCAGCAACCGGGCAGAGATGCTGTCGAATAGTTTACTGGCGCTCGGCGCGCAGTATGGCTGGCAACTGGCAGGTATGATGCTGCTGGGCGCCGCGCTAATGCGTAGCGGCTGGCTGAAAGGTCAGTACAGTCTGCGGCACTATCGTCGTACTGGGGTTCTGCTGGTGGCGTTAGGGCTAATGATCAACCTGCCTGCGGTCATTTTACAATGGCGGCTGGACTGGGCGTACCGCTGGTGTGCCTTCTTATTGCAGGCGCCGCGCGAACTGAGCGCGCCGTTGCAAACGCTGGGCTATGCCGCGCTGATGTTTGGCTTCTGGCCGCAGCTTAGCCGATGCAGACTGACGCTTGCCATTGCCTGCGTAGGGCGAATGGCGCTGACCAATTATCTGCTGCAGACGATCATCTGTACCACACTGTTTTATCAGTTTGGCTTATTT [...]
+NODE 2361 15 688 647 0 0
+TCACAACCGCAAAAT
+TCCCTGCCATGTTTT
+NODE 2362 46 46 46 0 0
+ATTGCGTTAATGCATAAGAAAATGGTTTATTTACTAATTGTAATGT
+GGATCTATATCACCACCTTCTGGCTGCTCATCCACCACGTTGATAG
+NODE 2363 5 485 485 0 0
+GGCAG
+AAGAA
+NODE 2364 5391 290005 286054 0 0
+CTGCGGAATACGAAGCCCCGCCTGATATAGCGCCTGATAGGCGCCGACAGCCATCGCATCGTTTCCGGTAAAAACCGCTTGCGGTCGCTGTTGATGGGCGAGTAACGCCTGCATGGCGTCAAAGCCGCCGCCAAATTCAAAATCGCCGGTGATCTCATAGCCTTGCGGAATAGCCAGCCCTGCGCGTTTCATCGCCGCCCGATACCCTTCCAGCCGTAAACGCGCTGGCGTTTTGTCCAGCGGGCCGGTAATACAGGCTATTCGGGTAAAACCTTTATCGATAAGGTATTGGGTGGCAAGATCGCCGCCTAACAACGAATTATCCTGAATGAGATCGCTATCGCCCTCACCATCAAACGGCGACCAGTCCATCATGACGGTAGGAATAGACGGATAACGCTCCATGATTTCACGAGAAGGCTGATGCGTTTCGGTACACAGCAGCAGTAAACCGTCTACCCGTTTTTGCATCAGCGTCTCCAGGTTGCGGTT [...]
+TCAGGCAGTGATTCGCAGCGGGGAGTGTTCCCCGTATGCGAACGTCATTCTTTGCGCTGGCGTCACTTTCTGAGGCCGCTATGGACGCATTACTGCAACTCAAAGGGATCGATAAAGCGTTCCCCGGCGTGAAGGCTCTCTCCGGCGCCGCGTTAAACGTTTATCCTGGCCGCGTTATGGCGCTGGTGGGGGAAAACGGCGCCGGAAAATCCACCATGATGAAAGTATTAACCGGCATCTATACGCGAGATGCGGGATCGTTGTTATGGCTGGGTAAAGAGACCACCTTTAACGGGCCTAAATCGTCTCAGGAAGCCGGGATCGGCATTATTCATCAGGAACTGAACCTGATCCCGCAGTTGACCATTGCGGAAAACATCTTCCTGGGCCGTGAGTTTGTGAATCGCTTTGGCAAAATCGACTGGAAAAAGATGTATGCCGAAGCCGACCACCTCTTAGACAAACTCAATCTGCGCTTTAAGAGCGATAAGC [...]
+NODE 2365 819 53855 50178 0 0
+ATAGGCACGATGACATTATCGACATCGTACAGATCTTCCATAATTTCCAGACCAATAGTGCCCTGTCCGGCAATGACTTTTGGATCGTCGTAAGGCGGAATAAAAATGCGGCCTTCGGTTTCGACAATTTCACTCACCTTAGCAATGGTGTCATTGAAGTTGTCACCGTGGAGCACCACTTCCGCCGAATAATCACAGGTGGCCGCCACTTTTGACTTTGGCGCGCCCTTCGGCATCACGACTTTGCCGTCAATACCCAGCATTGCGCAAGAAAGAGAAACGCCCTGTGCATGATTACCTGCGGAACAGGCCACGACGCCTTTACGTTTTTCCGCCTCCGTTAACGAGCTAAGTTTGTTAAAAGCGCCACGAATTTTAAATGAACCCGTACGCTGCATATTTTCAAACTTGAGAAATATTTCGCCTTTGCAACGTTCACTAAAATAGTTAGAGCGAGGCATTCCCGTTTTATATATCTTCCCCGCCAGTCTT [...]
+TTATGCGGCGGTATGGTCTAAAAATTATCGTATCAAAAAAGCCGCTTCAGTATTAGTAGAATTGGCTAAGCAATATTCATCATATAATGGATGCAGACGCAGGCAGTTAATAGAAATTGAATGATATGGAATAAACATATTTAGCGAAATTGACGTCACCTGTTTCTTTTAAACAGTGGACAACGGTAACTTATTTTTAATACCCAGGTTAAGAGGTTATAATGCACATTACATACGATCTCCCGGTTGCAATTGAAGATATCCTCGAAGCGAAAAAAAGACTGGCGGGGAAGATATATAAAACGGGAATGCCTCGCTCTAACTATTTTAGTGAACGTTGCAAAGGCGAAATATTTCTCAAGTTTGAAAATATGCAGCGTACGGGTTCATTTAAAATTCGTGGCGCTTTTAACAAACTTAGCTCGTTAACGGAGGCGGAAAAACGTAAAGGCGTCGTGGCCTGTTCCGCAGGTAATCATGCACAGGGCGTTT [...]
+NODE 2366 14 1214 822 0 0
+CCCGGCCACCGAAG
+TCCACGCCGTCGAC
+NODE 2367 4 1404 774 0 0
+CCCT
+ACCC
+NODE 2368 51 107 107 0 0
+GTTCCTTGACAGCCGCATTCGTCGCTTCCAGTCTTTTGCGGAAATCAGCAC
+CCCGGAGGGCTGCGCATCCAGTTCGCGACGCAGTTTACAGAAGCCTTCCAG
+NODE 2369 49 2378 2378 0 0
+CGGAGGGCTGCGCATCCAGTTCGCGACGCAGTTTACAGAAGCCTTCCAG
+TTTCCTTGACAGCCGCATTCGTCGCTTCCAGTCTTTTGCGGAAATCAGC
+NODE 2370 17 736 713 0 0
+TCCAGCCGATAGTTAAA
+TTATTTTGTGCTGCCGC
+NODE 2371 105 40532 36244 0 0
+GCTCCATGCAGACTGGCGTCCACACTTCAAAGCCTCCCACCTATCCTACACATCAAGGCTCAATGTTCAGTGTCAAGCTATAGTAAAGGTTCACGGGGTCTTTCC
+TGATGTGTAGGATAGGTGGGAGGCTTTGAAGTGTGGACGCCAGTCTGCATGGAGCCGACCTTGAAATACCACCCTTTAATGTTTGATGTTCTAACGTGGACCCGT
+NODE 2372 16 18 18 0 0
+GGGTATTTCAAGGTCG
+TACCCGGGTTGCGGAC
+NODE 2373 4 230 230 0 0
+CGAT
+ACCC
+NODE 2374 48 49 49 0 0
+ACTTTACGCACCTCAAGCTCGATGCCGCGCTCGTTGAGCTTTTTAAAG
+TCCACCGATCCGAAACTGAAAATGATGGATTTAATTGCCAAAGTGGCG
+NODE 2375 51 2846 2846 0 0
+GCTTCAAGCGTATTGCTGAAGAAGGTCAGCGCGTGAAAGTTGGCGATCCGG
+CCTTCGCCTTTCAGCTCAACGGTGTCGATACCGAAGTGAACGAACAGCTCA
+NODE 2376 277 18567 18567 0 0
+TACGAACTTCACCACTACTATTACCAATGATTAATTCCTGTACCGTGTCGGAGCCTGTACCACCGACCAGTTTCATGTTGCACGTCGTCTCTAAAATTGTGGCCGTGAAGTTAACATCCAGGTTAGTGGAGTTAGCGGCAAGCGCGCTTCCAGAAGCTGCCATTACGGCAAGTGCCGCGATGGGAAGACTGAGGCGGTTTCTTTTCATATAAACTCTCATTAGTTTTTCCCTAAACAGGTCATTACATGTGACAAAGTTGATTACTCAGTACGGGGG
+AAAACTAATGAGAGTTTATATGAAAAGAAACCGCCTCAGTCTTCCCATCGCGGCACTTGCCGTAATGGCAGCTTCTGGAAGCGCGCTTGCCGCTAACTCCACTAACCTGGATGTTAACTTCACGGCCACAATTTTAGAGACGACGTGCAACATGAAACTGGTCGGTGGTACAGGCTCCGACACGGTACAGGAATTAATCATTGGTAATAGTAGTGGTGAAGTTCGTATTGATGATGTAAGAGCGGGAACAGCAACGGCAGATTTTAAATTAGTGATT
+NODE 2377 25 85 85 0 0
+GTTAGCCCCGTTACATCTTCCGCGC
+ACGTATCACTTAAAGCGATTCAGCG
+NODE 2378 26 65 65 0 0
+AGGCCGACTCGACCAGTGAGCTATTA
+CCCATGCACCGAAGCTGCGGCAGCGA
+NODE 2379 23 39 39 0 0
+GCACACTATCATTAACTGAATCC
+AAATCGCCGGTTATAACGGTTCA
+NODE 2380 28 55 55 0 0
+ATAGGTTAATGAGGCGAACCGGGGGAAC
+CCGAGTCACACTGGGTTTCCCCATTCGG
+NODE 2381 42 48 48 0 0
+CGTGGGAACGTTATCCGTTTCGCAAATGCAGATGATCGAAAT
+CGGGTCAATATCGATATCCAGCTCATCAAATATCGCTTTGGT
+NODE 2382 2 153 145 0 0
+AC
+TG
+NODE 2383 1170 75590 75453 0 0
+TGTTCATATGTAAACCTCGAGTGTCCGATTTCAAATTGGTCAATGGTCAAAGGTCCTTAAACCCATTGCTGCGTTTATATTATCGTCGTGCTATGGTACATACATCCATAAATGTATGTAAATCTAACGCCTGTAAATTCACCGACATATGGCACGAAAAACCAAACAACAAGCGCTGGAGACACGACAACACATCCTGGATGTGGCCCTGCGTTTGTTCTCGCAGCAAGGCGTATCAGCAACCTCGCTGGCGGAGATTGCGAACGCTGCTGGCGTGACGCGCGGCGCAATCTATTGGCATTTCAAAAATAAGTCGGATTTATTCAGTGAGATCTGGGAGCTATCAGAATCCAATATTGGTGAGCTTGAGATTGAGTATCAGGCAAAATTCCCCGACGATCCACTATCTGTATTAAGAGAAATTTTAGTTCATATTCTTGAAGCTACTGTAACAGAAGAACGACGCCGCTTATTGATGGAGATTATATTCCA [...]
+ACGAGCTTATCCTGGGCGGAGAGATCTTTTTGCTTATTCAGCGTATCCAGCTGGTTTTGTACATCCGCTTTTGACGGCAGGTCGCCATTCGTTTGCCCCCGGGCAAATGCCAGAGACTGACAGGACAGCAGGATAATAAGGACGCTAATTGTAATAAAAACAAAATGCTGTGAACGTTTATAAAGCTGCAACATAGTCATGAGAATGAAGTGTCTGAACCGGCAAGCAGACCGGAAATAATTGAGTCGCAAGAATATCACGCCTGTAACAAACAGAATAGCGACACAGAAAATGTCCAGGAGTTTTCCTGGAATATTATCAGGGGGAGCCGTTGACCGTCGACGCGCGCAGCGTCGGACACAATTGATACATCTCCAGCAGGATCGTGACGTAGGCGCGAGCTTCTTTTTTTAAATCAAACGATTGCGGAGCAAATAACCAGTTTTCCATGAGCCCTGAAATAAAGCTGCGCATCAGTATCGCCGCACGACG [...]
+NODE 2384 2832 141450 139801 0 0
+TGTACGGCGATACCGCGACGCTGCTGGATAAAAAACTGCCGAAAAGCAACTGGCTGGCGATGTGGATCTTCCTGGCGGCGATTGCCGTGGTCGCTCTCCTGGGCGCGGACTCCGACTTACGCCCAACCTTCGGCGGCAAACCGTTGTCGATGGTGCTGGTCATTCAGATGTTCATGCTGCTGACCGGGGCGCTCATTATCATTCTGACCAAAACCAATCCTGCGTCTATCTCAAAAAACGAAGTTTTTCGTTCCGGTATGATTGCGATTGTCGCGGTATACGGGATCGCCTGGATGGCGGAAACCATGTTCGGCGCGCATATGTCGGAAATTCAGGGCGTGCTGGGCGAAATGGTCAAAGAGTATCCGTGGGCCTATGCCATCGTTCTGCTGCTGGTCTCCAAGTTTGTTAACTCCCAGGCAGCGGCGCTGGCGGCGATTGTTCCCGTCGCGCTGGCTATCGGTGTCGATCCGGCGTATATCGTGGCCTCTG [...]
+TGGTGCTGGGGCTGATTGGCTACACGCCGAACGTGGCGCAGTCTGCGCAAACCCTGCAGGGGATGCAGTTTATTATGATTGTCCTGCCGGTACTGTTTTTCATGATGACGTTGGTTCTCTACTTCCGCTACTACCGTTTGAACGGCGATATGCTGCGCAAGATTCAGATCCACCTGCTGGATAAATACCGGAAAACGCCGCCATTCGTCGAACAGCCGGATAGCCCGGCGATTTCTGTGGTAGCGACCAGCGATGTAAAAGCGTGAGCATGGTCTCTCGTGCAGGCCGGATAAGCGTAGCGCCATCCGGCAATTAACCGATAACGCGGCCCGGGAGAACGCCGGGCCTGCCAGGTTATTTCGCGCAGTTAGCGCACTGTTTGCTGACAATCTGCTGGAAGAAATCGTTGCCTTTGTCATCCACCAGGATAAAGGCCGGGAAATCTTCTACTTCAATTTTCCAGATAGCTTCCATGCCGAGTTCCGGATACTC [...]
+NODE 2385 316 15320 15248 0 0
+TGCCGGTGATGTGGCTGGGTGGCGACCCGGTCAACGGCGTCGGGCTGGCGCTGCTGCTGGCGGACATCGTCGCGCTGATCTGGCTGTTAACCAATCAACGTTTGCGTGCCTGTTTTTCCTTTGAGAAAGAATAACGGCACTTTTTGGCGAACCCGCACTCCAACCAACGTTAATTAATAAAAGAAAGGAAGTGAGATGAAATCGCTGCGTTTGACTTTACTCGCACTGCCGCTGGCGCTGACCGGCTGCTCGACGCTCTCCTCGGTCAACTGGTCTGCCGCAAATCCATGGAACTGGTTTGGTTCCTCGACAGAAG
+ACCGAGGAGAGCGTCGAGCAGCCGGTCAGCGCCAGCGGCAGTGCGAGTAAAGTCAAACGCAGCGATTTCATCTCACTTCCTTTCTTTTATTAATTAACGTTGGTTGGAGTGCGGGTTCGCCAAAAAGTGCCGTTATTCTTTCTCAAAGGAAAAACAGGCACGCAAACGTTGATTGGTTAACAGCCAGATCAGCGCGACGATGTCCGCCAGCAGCAGCGCCAGCCCGACGCCGTTGACCGGGTCGCCACCCAGCCACATCACCGGCAGCCAGCACAACGACACCAGTTGAGCAAGGATCAGGAGTCCGCGCAGCCAG
+NODE 2386 1316 63809 63563 0 0
+ATGCCATCCACATATTGCGGACGACCGCGCGCTTTCCAGTCCTGCACCACCGCATGGACTTCCTGGTCACGCACAAACGCCCCATGGACACGTACCGGCATGGTGGAGTTTGGTCCGGAATAGAGCATGTCCCCCATTCCCAATAACGACTCAGCGCCACCCTGATCAAGAATGGTGCGGGAGTCGATCTTGCTGGATACGGTAAAAGCGATACGGGTTGGAATGTTGGCTTTAATTAAACCAGTAATCACATCGACCGACGGACGCTGCGTCGCCAGTACCAGGTGAATCCCCGCAGCGCGCGCTTTCTGCGCCAGACGCGCGATCAGCTCTTCAACTTTTTTACCGACGGTCATCATCAGGTCGGCAAATTCATCAACCAGTACCACGATATACGGGAGTTTTTCCAGAACCGGATGCTGAACATCCATACTGTCGCCCGGCTTCCAGTACGGGTCCGGAATCGGGCGTCCCATGCGGGCCGCTTCGGCG [...]
+GATGCGTAACGGCGACAGTCGTCCATTACAGCGTCCGACGACGCCGCTGCCTTCGTTAGATCTTCTGACGCCGCCGCCGAGCGAAGTTGAACCGGTAGATACCTTTGCGCTGGAACAAATGGCGCGTCTGGTTGAAGCGCGTCTGGCGGATTTCCGCATTAAAGCTGATGTGGTGAACTATTCGCCAGGCCCGGTCATTACTCGCTTTGAACTGAATCTGGCCCCGGGCGTTAAAGCGGCGCGTATCTCCAACCTTTCCCGGGATCTGGCGCGCTCATTGTCAACGGTAGCCGTACGCGTTGTGGAAGTCATTCCAGGCAAACCTTACGTAGGGTTGGAATTGCCGAACAAGAAACGGCAAACCGTTTATCTGCGCGAAGTGTTGGATAACGCCAAATTCCGCGAGAATCCGTCGCCGCTTACCGTGGTGTTAGGTAAGGATATCGCGGGCGATCCGGTAGTGGCGGATCTGGCGAAAATGCCTCACCTGCT [...]
+NODE 2387 183 10759 10663 0 0
+TGTAAGTATCCCGCATAATCGAGCCATTCACATTTAGAGATCATCCGGCATAATCAATCTGCCAACGCAGGAGATCGCTGTGCGTAAAGCCCGTATTACTGCGCACCAGATCATCGCTGTGATTAGATCAGTTGAATCCGGACGGACTGTTAAAGATGTCTACCGGGAGGCCGGTATTTCTGA
+AACTGATCTAATCACAGCGATGATCTGGTGCGCAGTAATACGGGCTTTACGCACAGCGATCTCCTGCGTTGGCAGATTGATTATGCCGGATGATCTCTAAATGTGAATGGCTCGATTATGCGGGATACTTACAGTGCAACCTGGCGCCATTTTTCAGTACACTGCAACGTTTCTGGTATGGGC
+NODE 2388 9 3471 3397 0 0
+CATCGGCGC
+GCATCAAAT
+NODE 2389 51 167 167 0 0
+GCGCTGGGGCTGCGGCAGGCGCTATCATCTCACTCATAAAAGACTCAATAC
+CCCGAACCGCCAGGTGAGCGAGTGGGCGAGGAGGCGCAAGGGAGTCAGAGG
+NODE 2390 169 7130 7130 0 0
+CGGTAAGCGTTAGTCAGTACATACCCTTCATACTTCAAGTTGCTTATGCGTTGGCTACGGATTACTCGGCCCATTCATGGGCCTCGCCCTGACGGGACGTCGCTCACCCCAGCCACATCGTTATCTATGCTCCTGGGGACTCACTCCCTTGCCGCCTTTAAGCAACTCG
+GATGTGGCTGGGGTGAGCGACGTCCCGTCAGGGCGAGGCCCATGAATGGGCCGAGTAATCCGTAGCCAACGCATAAGCAACTTGAAGTATGAAGGGTATGTACTGACTAACGCTTACCGTATCCCACCATAAAGCGAATAATTAACCCACATGCCGGTGCAAGAAAAAG
+NODE 2391 65 2524 2441 0 0
+CTACTTCGGCCTTATCAGCTTCACCCTGCCGCAGGCGGCGGCCATCGGCATTATCGGCGGCGCGG
+ATAAGGCCGAAGTAGTTCAGCGTCAGCGCCCCCAGCACCGTGGCGAAGATACCGAACTGCGCCGC
+NODE 2392 123 5961 5961 0 0
+GAAAATCCGCATGGTGCAGCTGCGCACCGTCAGCAAGCGGGAAAAAATCCTCTTTCCGGTGGTGCTGTTACTACTGGTGGCGCTGCTGCTGCCGGACGCCGCGCCGCTGCTGGGGATGTTCTG
+TAGTAACAGCACCACCGGAAAGAGGATTTTTTCCCGCTTGCTGACGGTGCGCAGCTGCACCATGCGGATTTTCCGCTCCGTCTCCGTGGTCAGCGCCTTCATAATCGGCGGCTGGATTAACGG
+NODE 2393 83 3623 3427 0 0
+CACCCCGGCGGCAGTCCCGATACCAAAGGCAATCACCCCCAGCAGCAGAATGCCCAGCGTCTGCGGCTGCAGGAACTTGTCCG
+ATTGCCTTTGGTATCGGGACTGCCGCCGGGGTGCTGATGGCGAAGCTGATGAACCTGTGCAGTAAGAACAAAATCAACCCGCT
+NODE 2394 13 145 145 0 0
+CCTTCACCGGACC
+TCCCGAGCCTTCA
+NODE 2395 6 82 82 0 0
+ATTCAA
+CCACAA
+NODE 2396 4 66 66 0 0
+TCGG
+CCAA
+NODE 2397 2 38 38 0 0
+TA
+AA
+NODE 2398 14 336 336 0 0
+GGTGCGACGGGCGG
+CTCCCAATGAAGGA
+NODE 2399 17 772 772 0 0
+ACCTATGCCCGCCGTTT
+CCGTTTTTTGTCAGGAA
+NODE 2400 51 64 64 0 0
+ATTTTGAACGCTGGTACAAACGTTATCAGACGAAAAAAATGCGTTAATGGC
+TAAACGGCGGGCATAGGTTTGGCGAATAAAAAGCCCTGTCGTTCATTGACG
+NODE 2401 12 573 573 0 0
+ACCTTCCTTGCC
+TGTTGACTTTCA
+NODE 2402 49 2657 2657 0 0
+GCACCTGCTCAAAGAGACCCCTTGCGAAGTCATTCTCCTCGGTGGAATC
+CGATATAACTGCTCACGGTGATGATCGTGACATCTTTTTGTTCCGCCAG
+NODE 2403 46 2057 2057 0 0
+AAATCAAAAAACGTTTTGAGGTGCGCCTGCACCTGCACTGTCACGC
+GACCAGCTCATACGCCGCCATCGGCGTGAGAATGCCGGACATATCC
+NODE 2404 5 231 231 0 0
+CGAAG
+GGGCA
+NODE 2405 51 2601 2601 0 0
+AAGAGAGCGCCGCTGCCGGTTCGCTGGGCGATTCATCAATAACGACCGTTT
+TATGAAAATTATGTCACGATTCTGGACGACGTTACGCTGGAAAGCTGGATT
+NODE 2406 6 269 229 0 0
+GTGTGT
+ATTGTG
+NODE 2407 4 374 332 0 0
+GTGA
+AGGG
+NODE 2408 7 636 578 0 0
+AGGCTCG
+AAAGGGC
+NODE 2409 2 113 99 0 0
+GG
+AC
+NODE 2410 19 1531 1516 0 0
+ACCACACCGTCAGCGAGGT
+ACGCTTCGCCGTTCTGCGT
+NODE 2411 553 29043 28961 0 0
+GCGCTCAACCAGCCGGAAACGGTACGTAGCTTCCCTAATATCTGCTATTTCGCGCTCTCTCCAGAAGATGAAGCCCGTGACGCGGCGCATCATATTTATGACCAGGGCAAGCAGTCGCCGCTGCTGTTGATCCCACGCAGCACGCTTGGCGATCGCGTGGCGAACGCCTTCACCCAGGAGTGGCAAAAACTGGGCGGCGGCATCGTGTTACAGCAAAAATTCGGCTCCGTAGCCGAGCTGAAAATGGGCGTGAACGGCGGCGCGGGTATCGCGTTGACGGGCAGTCCGGTCGCCGCCAGCGTGCCTGCGCAACCGGGCGTCACCATTGGCGGTCTGACCATCCCTGCGCCGCCGACCGACGCGCAAATCACCGGCGGCGGACGCGTAGACGCAGTCTATATTCTGGCTACGCCGGAAGAGATTGGCTTTATCAAACCGATGATCGCCATGCGTAACGGCACCCAGAGCGGCGCGACGCTGTATGCCAGCTCC [...]
+TGCGCGCTGCGGGAGCTGGCATACAGCGTCGCGCCGCTCTGGGTGCCGTTACGCATGGCGATCATCGGTTTGATAAAGCCAATCTCTTCCGGCGTAGCCAGAATATAGACTGCGTCTACGCGTCCGCCGCCGGTGATTTGCGCGTCGGTCGGCGGCGCAGGGATGGTCAGACCGCCAATGGTGACGCCCGGTTGCGCAGGCACGCTGGCGGCGACCGGACTGCCCGTCAACGCGATACCCGCGCCGCCGTTCACGCCCATTTTCAGCTCGGCTACGGAGCCGAATTTTTGCTGTAACACGATGCCGCCGCCCAGTTTTTGCCACTCCTGGGTGAAGGCGTTCGCCACGCGATCGCCAAGCGTGCTGCGTGGGATCAACAGCAGCGGCGACTGCTTGCCCTGGTCATAAATATGATGCGCCGCGTCACGGGCTTCATCTTCTGGAGAGAGCGCGAAATAGCAGATATTAGGGAAGCTACGTACCGTTTCCGGC [...]
+NODE 2412 147 8013 6491 0 0
+TGCTGGTGATTGCACGCCGCCGTTCAACACTGCAGTTAGCCGATCGGATCGTCGTGCTGGATAAAGGCCGCGTCGTGGATATCGGTACCCAGGCGGAGCTGGATGCAAGGTGTCCGACGTTTCGCTCGCTGATGAGCGGCGAGGGGG
+TCCGCCTGGGTACCGATATCCACGACGCGGCCTTTATCCAGCACGACGATCCGATCGGCTAACTGCAGTGTTGAACGGCGGCGTGCAATCACCAGCAGCATATGCTCATTATCGGCATAACGACCAAGAGCCGTGTTAATTTCCGCT
+NODE 2413 14 591 569 0 0
+ATTTTCTCGCCCTT
+ACCTTGCATCCAGC
+NODE 2414 621 27601 27344 0 0
+CCATCGTCACGATGCTGGTGGCCGCGCTGGCAAGACCGTTTTGCAGAAATCGGGCGAGTGAATCAACGTCGACGGTCATGCGAGTAAGACGCGAGTCGATGTGCTTCTCGTGCCAAGGAAGACTCAGGCGTAGCAGGTGGCTGAAGCTGCGTAAGCGTACCGTATGCTGTACCGACTCTGCCGCGCGGGCGGCGAAGATCGTTTGCAGCGCATAGCAGCACCAACCGATCGCCACCAGGCACAGCGCGAGCAGGGCGCATATGCCAATAGTCGACATATCCCCTGCGGCAACGCCTGAGTCAATACCGCGCTGCAAAAGCACCAGCACGCCAACGCCTGCGGCGGAATCAAGCGCGATAAGCAGGGCGGCGATGACGAACATCCAGGCTACTGGCGTCAGCAGCGATGAGACTTGACGCCCGTGGCCTGCCAGCGCCATCTGTACGGCGCGTTCCGGAACGCGCGTCATTCGGTCGACAAAACCTTTTCCAG [...]
+GCCCCGGCAGAACAACGTACGCTATGGCCAACAACGCAGGCGGTAAAATCCGACGACGCGCATGAGCGCCAGACACCCGCTGGAAAAGGTTTTGTCGACCGAATGACGCGCGTTCCGGAACGCGCCGTACAGATGGCGCTGGCAGGCCACGGGCGTCAAGTCTCATCGCTGCTGACGCCAGTAGCCTGGATGTTCGTCATCGCCGCCCTGCTTATCGCGCTTGATTCCGCCGCAGGCGTTGGCGTGCTGGTGCTTTTGCAGCGCGGTATTGACTCAGGCGTTGCCGCAGGGGATATGTCGACTATTGGCATATGCGCCCTGCTCGCGCTGTGCCTGGTGGCGATCGGTTGGTGCTGCTATGCGCTGCAAACGATCTTCGCCGCCCGCGCGGCAGAGTCGGTACAGCATACGGTACGCTTACGCAGCTTCAGCCACCTGCTACGCCTGAGTCTTCCTTGGCACGAGAAGCACATCGACTCGCGTCTTACTCGC [...]
+NODE 2415 1 400 71 0 0
+T
+A
+NODE 2416 650 33637 33303 0 0
+GATGCGGTGCATTACTGCGTGAAAGCGCGCGGTATTCGTGACGCAACCAGCGCCACGACGACGACGTCGCTGGGCGGATTGTTTAAGTCCAGCCAGAATACGCGCCAGGAGTTTCTGCGTGCCGTTCGCCATCATCCATGATTAAGGCGGAGACGATGGAGCGTAATGTCACGCTGGATTTTGTACGTGGCGTCGCTATCCTCGGTATCCTGCTTCTTAACATTAGCGCCTTTGGATTGCCGAAGGCGGCTTATCTCAATCCCGCCTGGTACGGCGCGATCGTTCCCGAAGACGCCTGGTCCTGGGCGATTCTCGATATTGTGGCGCAGGCTAAGTTTCTTACGCTGTTCGCGTTGTTGTTTGGCGCGGGGCTACAAATGCTGCTTCCGCGTGGTAAACAGTGGATTCAGTCGCGCTTGACGCTATTGGTACTGTTAGGTTTTATCCATGCGTTATTCTTTTGGGACGGCGACATTCTGCTGGCCTACGGTC [...]
+GCAGCAGTAGCACGCCAATCCCGACCAGATAAAGGAGTATGCCGGTATTGAACAGGCTTTTTACCGAAGGCGCATCGCGTATCAGTCGCCAGCAAATTAACCCGACCAGACCGTAGGCCAGCAGAATGTCGCCGTCCCAAAAGAATAACGCATGGATAAAACCTAACAGTACCAATAGCGTCAAGCGCGACTGAATCCACTGTTTACCACGCGGAAGCAGCATTTGTAGCCCCGCGCCAAACAACAACGCGAACAGCGTAAGAAACTTAGCCTGCGCCACAATATCGAGAATCGCCCAGGACCAGGCGTCTTCGGGAACGATCGCGCCGTACCAGGCGGGATTGAGATAAGCCGCCTTCGGCAATCCAAAGGCGCTAATGTTAAGAAGCAGGATACCGAGGATAGCGACGCCACGTACAAAATCCAGCGTGACATTACGCTCCATCGTCTCCGCCTTAATCATGGATGATGGCGAACGGCACGCAGAAACTC [...]
+NODE 2417 51 2249 2193 0 0
+ACTCGCCACCGATTCTCCCCGCGTCTATCACTTCCATAACATGTGCGACGG
+TAAGTTTCAGAATCGTTTAGTCGGCACGATTGTGTTAGTCGCGCTGGGGGT
+NODE 2418 1589 101188 99803 0 0
+ATGTTTGGCCGCGATTGTCCGCAACAGATCAAGCAGAAAACGGCGCTTCTGCGAATTGTCCCATGACGAGATAACAAACTCAGGGTGTAGCGGACGAGCTGGCGACGATGCAAAATGGGTAGTGATTTCGACACCCAGTAAATCCCCCTCCATTGCCCTTATCGGCTCTGCCATAAAAAAATAGCGCATGTGACCACTCCACTTGATCTTAACTCCCTGATAATGCGCTTTTAACGCAAATCAATCAATAAAAACGATCAATATATAAAAAATGATCGAAAAAAACAATATATGTTAACTTCATGATAACTTGCTAATTTTATGTTTTGAGAATGTTCTTCTATTGCTATAAGGAAATTTACATACTAAGCCGAACAACGCTAATATGACGGCATTAGACCATCCGTAAAGCCATGTTTTTCTTGTCAGGCAGAGGGGAAAAATCAAGGCGAGTTAATGGTGTTGCACCATCGCGTGGCATTTCACCCACTA [...]
+ATAATGATAACCAGCCGCCGAGCGAAGCAGGTAGTAATGGAATCTATGAGGCTTTTGAGCAACGTTTGATAGACTTCCTGACCACGCCCGCTACGGCGTCTGGTGATGAGAGCGGCGCTATTGATCAGACGGATACATCACAACCAGCGGCAATAGAGGCGTTTATTAACTCGTCGGAGTTTAAGAAAAATATTCGCATGCGTGATATTGAAAAAAATAAAATAGGTAGCGGAAGTTATGGGACAGTCTATCTGTTAAATGATGAGTTTGTTGTTAAGATTCCAATTAATGAGCGGGGGATAAAAGTGGATGTTAACTCTCCGGAACATCGTAATTGTCATCCTGATCGTGTCAGTAAGTATTTGAACATGGCTAATGGCGACAAGGATTTTTCTCGTTCGGCCATCATGAATATTAATGGTAAAGACGTTACGGTTTTAGTTTCAAAATATATTCAAGGTCGGGAGTTAGATGTTGAAGATGAAGATAACT [...]
+NODE 2419 42 3776 3733 0 0
+CCCATCCATGGGCCTCGCCCTGACGGGCCGTCGCACGCGACG
+TCCGTAGCCAACACATAAGCAACTTGAAGTATGAAGGGTATA
+NODE 2420 32 1525 67 0 0
+TTCCGGCATTCCCGCCAGCTCGGCTTCGTCGG
+AAAGCCCAGGCGGAAGCCAAAGAGCAGGAAGG
+NODE 2421 3942 253400 250719 0 0
+ATCAATGCCAGTATGCATTCTGTTTAAATCGGGTCTTCCCGGAACGCTGTAGCGGTAAAGCCGATCGCTTTCCTCCAGATCTTTTCCAGCCATTCGCATGGCGATATGCCCCTTGTTGCAGGTAATCTGATAATTACTTCCCAGATCGGTCCAGCCGCCAAAGGCACCTGTAACGGAATTATTCTGGAGCATAAAACCACCGAGTCCATTAATCTGGCCCGCTATGCGACGTAACCCATCTTCTTTAATATCCTGTCCTCCGGTTGTACAGGTAAGTGCTTCCAGACGACCGGATAAATTATTTTTTCTGATACCGGTAATATAGCTGTGTCCAAAGGGGGAGCGGGAAAATCCGTTGTTCAGATATCCCTGCTGAATTAATTCATTTACCGTGATGGTTTTACTGGAAAGTGAGCTGGTTTTATCAGCCACATAATTTTTTATTGCATTATTATATTCATCAGCATGTAAAGCCGCACTTTGATAAAGTTG [...]
+AGCCAGCGTCTGGTTCAGCTGATATGTCCGCACTGCCGTCGCCCCTGGCATGAGGTGGCCACCGGACGCACGGATGATGAACGGCGCCTGGTGGAAGGCTTCTGTAACCCGGACCAGGTGTATCTGCGAAATCATGAAGGCTGCTCACACTGCTGGCGTGGCGTGACGGGGCGAACGGTTATCGCAGAAGTCATCTCCCCGGATGCGCGTTTTTTCCAGTTGTACCGGGAAAAGGGTCGTATTGAGGCTAAAACCTACTGGCACAGAGAACTGGGCGGAATGACCCGAAATCAGCATCTCCTGGGAAAAATCAACAGCGGACAGGTTGATCCGCTGGCAGCCCATTACATCTCTCCCATCGACGAGGACAGCTATACGCTGCTGCACTGACATGAGATTTCTGGAAAAACTCAACAACACCGACATTGAGCTGACAGCACTGACCGTCTGGATAGCCAGAAAAACCTTTGCCCTGAACCGGGTGGAGTTCTA [...]
+NODE 2422 2 184 184 0 0
+TC
+CG
+NODE 2423 51 2750 2707 0 0
+GCCCAACGGAAGGACTGCTGCTACTGAGCAACTCAGCACGATACTGTAATG
+CCCAACGAGGCAAAAGCGGCGGTGGTGATGTTCTTTGATTACCAGTGTTCG
+NODE 2424 1722 99759 98103 0 0
+GTACGCTGACCGATAACAATGGCCGTAAGGCGGATTTCCGCAACGTGGTGCTGGTGATGACCACCAACGCCGGCGTGCGAGAAACCGAACGTAAATCTATTGGTCTTATTCATCAGGACAACAGTACCGATGCGATGGGCGAGATCAAGAAAGTGTTTACGCCGGAGTTCCGTAACCGTCTCGACAACATTATTTGGTTCGATCATCTGTCTGGCGAGGTGATTCATCAGGTTGTCGATAAGTTTATCGTCGAGTTGCAGGCTCAGTTGGATCAGAAAGGCGTCTCTCTGGAAGTCAGTCAGGAAGCGCGCGACTGGCTGGCGGAAAAGGGCTATGACCGGGCGATGGGCGCACGACCGATGGCGCGTGTGATTCAGGATAACCTGAAAAAACCGCTGGCCAATGAGTTGCTGTTTGGATCGCTGGTTGATGGCGGACAGGTCACCGTCGCGCTGGATAAAGAGAAAAATGCGTTGACGTATGGCTTCCAGA [...]
+GCGAGTCAATCCCCCCTCACCGCCATATTCAAGAAAGAGCTCGTACGAAAGTACGGGCTTTTGTATCTAAACTTCTTGTTTTTGCTGTGATTTTCCTGACAAAAGGTTCGTTTTGGACCTTTGGTTGCTATAGGGAAGTTGCTGTAGATTCTATAAAAACCGCCCCACTCCCCTACCTAAAACGCTTTAGAAAAGTTTGCATAAGTATCTCTCGGTAGTAAAAAAGCACCGAGTTCCTCTGTCTGATTCTGCCGTTGCTTTATTAGAAGGCTTACCGCGTTTGAAAAATAACAATCATGTATTCCCTGCCCCTCGCGCTGAAACACTTTCTGATATGTCGTTATTGGCTGCATTGAAACGAATGGAATATACCAACTTAACGCAGCATGGCTTCCGTTCTACTTTCCATGAGTGGGCTGGTGAAACAACGGACTATCAACGTGAGGTTATTGAACATGCGTTGGCGCACCAGTTGGCAGATAAGGCTGAAGC [...]
+NODE 2425 176 7245 7245 0 0
+ATATCCCCCAAACTAAGGGGGGATGAGAACCACCGACCGGGGTTCGACACAAAAATGCCGGGAGCGTTTTTGAACAGAGCTTGCTCTGGCCCCGAAGGGGCGAGGCCCAGGGATGGGCTGAGTAGCGGCGCAGCCAGTTGGACAGACCGGGCGCGCAGCGAACGGGCTGCCCGAAG
+GCTACTCAGCCCATCCCTGGGCCTCGCCCCTTCGGGGCCAGAGCAAGCTCTGTTCAAAAACGCTCCCGGCATTTTTGTGTCGAACCCCGGTCGGTGGTTCTCATCCCCCCTTAGTTTGGGGGATATATATAAGCAAAAAGCCCGTACTTCTGTACAGGCTCTCAACTTAAATATGG
+NODE 2426 59 2346 2346 0 0
+TCCTCCGTAAATTAAGGGTTAAGGCGGCGATGGTGGTGGATAGCGGCGGCAATCACCGG
+TACGGAGGAATCCATGACCATTGCCATTACCGACGTCGTCCTGCGTGACGCCCACCAGT
+NODE 2427 28 1754 1716 0 0
+GAGCGATAGCCGCCTCCACTGCGGCTTT
+GCAGCAGGCCGGAAGCGAACCTGCCGAA
+NODE 2428 1950 117040 115874 0 0
+GTGTCCTAAACGGTCGTGTCAGTTGGTTACATACCATTGAGGTGTGTACTAATGAAAATACTGCCCGTTGTCTCCACCAAAGGTGGTGAAGGTAAATCAACACAATCCGCAAATCTTGCTGGTTTTCTGGCCGATGCAGGTATACGTACCCTGCTGATTGACGGAGATCATGCTCAACCCACAGCCAGTAATATCTTTCCGCTGACATATGAAGCGCCAGCCGGCCTTTTTGAACTTCTTATGCGTACGGCTGACCTCACTCATCCCGATAATATCATTTCCCGCACGGCTATCGATGGCCTTGATCTGATTGTCTCCAATGATCCTCATGAACAGTTAAAAACCGCGATGCTTCACGCCCCGGACGGGCGTCTTCGCCTCCGGAATGTTCTGCAACATCCACTTTTCCTGAATAACTACGATGTCATTGTCGTTGATTCTCAGGGGGCGCGCTCCGTCATGCTGGAGATGATAGTACTGTCGGCGACTGAG [...]
+ACCCCGGTCAGAAGGTACGGACAGCATTCGCATACTCATAACAGATTGTTTTAAAGGAGAATTTTTATGAATACAGAAAAACAACTGCCGTCCGGCATTGATAACAACCATGATGAGGATGGCAACATGGCAAAATATTATGAAAACTGGAAAGCCGGAGGCATGAGCACCGACGATGTGGAACGTTGTAAAACCTTCTTTGACCAGGGAACTGAAATCTTTCCCGGGGCTGACCAGAAGCTCGCTTACCGACTTTGCTGGCTCGGACACTGGCTGATTAACAGCCGTCGCTGGTTTTTTCTGGACGATAACAGTATCAGCATTCAACAAGCCGTTAAGTTTGCTCTTATTCATCAGCATCACTGGCTCCCGGCAACGGTTGAGCAGATGACCCCCGCAGAGATGTCCCTTGCTCTGACAGATTACTGGGCTGACTACTGGACACAGCCGACTGAGCCGGAGAAGGCGCTGGTTCACATGACTGACTGGCAG [...]
+NODE 2429 21 2613 2586 0 0
+CCCTGCAACTGTTCGTCCGGC
+TTCAGACCGGTAAGTTTGCCG
+NODE 2430 5 214 214 0 0
+TCCCG
+TCAGA
+NODE 2431 2832 182479 181689 0 0
+CCCTTCGATATGGAAAATAGATGCTTTGGCGTTTTTCGCACCGTCGCCGAGGCTGTACATCAACAGCCCGCAGCCAACGGAACAGTAGGTGCAGGTGTTACGGGTTTCGCGGGTGCGCAGCAGTTTATATTGCCGTGTTTCCGCTAGCGCTACGCCGGGCGCGAAGCCCAGTGCCGCCGCCGTGGTGCCTGCCATACCGCCAGCGCAGATCTTAAAGAACTGCCTTCTGCTGACCTGCATGGTTTGCTCCTTGTTTCGACATTGTCACTTCTCTTTCACATTTCTCTATCCGAAACGCTCAGGGAGTGGTTGTTATTTTTCTTTGCGGACGGGCCCGCAAAGGTTCAGAATTGGATAAATTTTCCTCCATCCGGGAGGAGTTGTAACAGAATACCATAATGTTGGTGTGTGTGTTCTTATATGGTTAAAAGAAAGTGAACAATATACTGTCTGAAGAAGTCCTAAATGTGACTGATTTCACAACCTCACGCC [...]
+TATCGCTGAGGATAATAAATTCCTTTTCATTTAATTGCCTTTTGTATATTTACGTTGGGGTTCTCTTATTTTAACGAACACATTGATATTGATAATGTTAATTATAATGAAATATGGATTAAGTATTTTTTGTGTTGAATAAATCACATACCTGTTTTTTTTCATTAAAATGAATCTGTAAATTTCAATGATATTATTTATAGGTTATTCTAATGAAAAAGGATTTGTTATCATCAATTATTATCGCTATGCTGATGACTGCCGGGCTAAGCGCTTGTGATGAAAAAAAAGCGGACGAACAACCTGTAGCTCAGAGTGCGGATTCATCAGCGAGCAATACACAATCCACATCAGCGGAAAGCGCAGATGCGAACGATGTTCTTAACCAAAAGCTGAATGTTTACATTGATTGTTATAATAATCTCCAGGCAGATATTTACCGTGCTGTAAATCGTTATGCTAACACATTCGACGATTTCCGCACCGGTCCTA [...]
+NODE 2432 3 913 6 0 0
+ACT
+TTG
+NODE 2433 44 5624 5438 0 0
+CATAATATTTACCTGTGAACTGATAACGGAAACGACCATTTTCC
+AAAACAAAAGCGCTGCTGATTGCAGCCCTGCTGTTACCGGCAAT
+NODE 2434 264 18550 18431 0 0
+AGCCGCAATTCAGTCTCTACAGCAGAAGTTAGCGGCAAAACCATCAACCGCACAAGATGTTGGTGAGTTCGTTGGACAAGCAGCACCATTTGTTAGTGGTGGTGGGATTATTTCTCAGGTTCCGAAAGGGGCGGCAAGGCTGGCTGCCGCCGCAGGGCTTGGTGCTGGAGAAGGGGCTATTGTAGCCAATGGAACAAATAGCGATGTTGCTTCCGGCGCTGCTATTGGCGCTGTGGCTGGCCCTGTAGCCGAGATTGTTGGTCC
+GGAAGCAACATCGCTATTTGTTCCATTGGCTACAATAGCCCCTTCTCCAGCACCAAGCCCTGCGGCGGCAGCCAGCCTTGCCGCCCCTTTCGGAACCTGAGAAATAATCCCACCACCACTAACAAATGGTGCTGCTTGTCCAACGAACTCACCAACATCTTGTGCGGTTGATGGTTTTGCCGCTAACTTCTGCTGTAGAGACTGAATTGCGGCTTGCTCTTCTGGTGTCATATCCTGAAACAGGCCAACACCTTTACCAACATC
+NODE 2435 5 305 305 0 0
+TTTGG
+ATACC
+NODE 2436 51 3678 3678 0 0
+TCAAAGACCATAAACTCCAGGATACCAGGCTCATCGTTTGGAATTTCAACA
+ATAATGGTAACTATCGTTCACGCGAAGATGCGAAAAGTCTGTTGCCGCTCG
+NODE 2437 1266 59560 57494 0 0
+GTTCATCACCAGCCACAACGTCGCGGACAGCGCCGTCAGGCTACGCCAGAACGTTTCATTCGCCGTAACCACGCCCGCACGGGTAATCCCGATCCAGTACGGCCCGACAGAGATGCCAGCCAGCAGCATTTGCGGCTCGCGGCTGATGCTGAAGATAATCGTTATCACGCCGACCAACAAAAATCCAAAAGGTATCGCCATCCATCGACACCAGCGCCAGAGGGATATGCGCAATAGCCAACAGCTCAATCCGGCAATGATCAGCAGCTCAATGCCCTGCCCTACAGGCGGCAGAACAAACGCCAGTATCATCATCGCCAGCCACAGCAAAAACTTGCGCTGCGGCGCAACGTGTGCCCAGCGGCTTTGATAGCTGAGTCGATCAAGCCCGGTCATCACGGCGTTGTTTACCTTTGCAATACCCCAGGATATAAAAAATCACCGCCGCGCCAAGAGAGCCCTGAAGGGTAAACAGCAGGCTTTCAATTTCAC [...]
+GTATTGTGCAGGAGGATAATCATCAGAAGGTACTGCTGGCGCTGTGCGGCGCGTTTATTTTTGTCCTGTCCGCGCTCAAAATTCCGTCGGTAACGGGGAGTTGTTCACATCCGACCGGCGTTGGTCTGGCGGTTATCTTGTTCGGGCCCGGGGTGGTGGCGATTCTCGGCGCGGTTGTGCTGTTGTTTCAGGCGCTATTGCTGGCGCACGGCGGCCTGACGACGCTTGGCGCAAATGGAATGTCGATGGCGGTGATTGGCCCGGTTGTCGGTTATCTGGTGTGGAAAATGGCCTGCCGTGCCGGACTGCGCCGTGATGTCGCCGTTTTTCTGTGCGCGATGCTGGCGGATTTGGCGACCTATTTTGTGACTTCAGTCCAGCTTGGCGTTGCGTTTCCCGATCCCCATGCCGGAGCGACAGGGTCTGTTGTGAAGTTTATGGGGATTTTCTGCCTCACACAGATTCCTGTCGCCATTGCCGAAGGTTTATTAA [...]
+NODE 2438 723 51848 51342 0 0
+AGGTGCTGTCAGCTATATGTTTGACAATACTGGAGTGATTGTATTTAAAGGAACAGACCCTGACCATATTTTTGAAATTTTGCTTGATGCTGAAGTTGATGTTCGTGATGTAACCGAAGAAGAAGGAAACATCGTTATTTATACTGAAGCTACAGACCTGCACAAAGGAATTGCAGCGCTAAAAGCAGCTGGAATTACTGAATTTTCAACAACAGAATTAGAAATGATTGCTCAATCAGAAGTTGAACTTTCACCAGAAGATTTAGAAATCTTTGAAGGACTTGTTGATGCCCTTGAAGATGATGATGATGTGCAAAAAGTATATCATAACGTTGCAAACCTCTAATTATAAATTAAACAAATCTGTCTCTATGGCAGATTTGTTTAATTTATAAAGCTGTTATAAAAAAGCCTATCTGGCCAGATATATAGATTTTTAAATTTATGTGTCTTATCATGACCTGATCTGACACATAGCCTTAAAAGGTTGAG [...]
+TGAGTCATCATGAGCGCAAGCGGAATTTATGAGGCGCGGCATCTTAAAGAGCACGGGGAGATTGTAAGTAGCCTGATATTGCTGGCTTTTGCTTAGCTTGCTGACGGGATTCGTCGTATGAAGCATGAAAATTACCTCATGTTTTATATAAGGATTCGACACTATATCAAAACCGGTAACTCTCAACCTTTTAAGGCTATGTGTCAGATCAGGTCATGATAAGACACATAAATTTAAAAATCTATATATCTGGCCAGATAGGCTTTTTTATAACAGCTTTATAAATTAAACAAATCTGCCATAGAGACAGATTTGTTTAATTTATAATTAGAGGTTTGCAACGTTATGATATACTTTTTGCACATCATCATCATCTTCAAGGGCATCAACAAGTCCTTCAAAGATTTCTAAATCTTCTGGTGAAAGTTCAACTTCTGATTGAGCAATCATTTCTAATTCTGTTGTTGAAAATTCAGTAATTCCAGCTGCTTT [...]
+NODE 2439 270 12971 12772 0 0
+TGGATTCAGCCTCGCCCCATTCAGCTACGCTTCATTGAACTTATGGAGACGGGCGAGGGGAGCGATCTCTTCCGCAAACATCATATTTCGGGTCAGGTATTGCGCGACGAGCTGATTAAGCGCGGCTGGATCCACCAGCTCCGCCAGCGTAGCGATGGCCCGGCGCAGGTTTTTTGTCATCCCGATTACGCCGGTGAGATCGGTCTCATTATGCCGTACGAAAAAGATTTCTGCGCCACCTGTAACCGCCTGCGTGTTTCGTCCGTCGGG
+CGTACGGCATAATGAGACCGATCTCACCGGCGTAATCGGGATGACAAAAAACCTGCGCCGGGCCATCGCTACGCTGGCGGAGCTGGTGGATCCAGCCGCGCTTAATCAGCTCGTCGCGCAATACCTGACCCGAAATATGATGTTTGCGGAAGAGATCGCTCCCCTCGCCCGTCTCCATAAGTTCAATGAAGCGTAGCTGAATGGGGCGAGGCTGAATCCAGGCAAGGAAGGTATCCAACTGATGGTGATTCACGTCGCGCATCAGCACGG
+NODE 2440 1135 64607 63969 0 0
+TCGGTGGGTGACGTGACGACGCTTTCCAGTGATTTATCTGTCGCCGCCGCCACCTCACGCGTCGGGTTTAACATCGGGCGCATTAACGGACGCTTGCTGGATCTGGAGCTGTCAGCGCTGGAGCAAAAGCAGCAGTTGGATATTATCGCCAGCCCCCGGCTGCTGGCTTCCCATCTGCAGCCAGCCAGTATCAAGCAAGGCAGCGAAATTCCTTATCAGGTTTCCAGCGGCGAAAGCGGCGCGACCTCCGTGGAATTTAAAGAAGCGGTGCTGGGAATGGAGGTGACGCCCACCGTTTTGCAAAAAGGGCGCATCCGCCTGAAGTTACATATCAGCCAGAATGTCCCCGGTCAGGTACTACAACAGGCTGACGGCGAAGTGCTGGCGATAGATAAACAGGAAATTGAAACGCAGGTAGAGGTAAAAAGCGGCGAGACGCTGGCGCTGGGCGGTATTTTTTCGCGAAAAAATAAATCGGGTAGCGATAGCGTG [...]
+GCGTTTCTCTGCCATTTTTTCGGTACTACTAAGACTATTCGTTAATGGTAAACCCGCTTCACAGACACCCAGCGCAGCAGGACATGAACTGAAACCTCATAAGATATTGCGAGAGTCAGACTGAAAATTATCTCAATACTCAAGCGGGTTTGGCAACTGAATAAATCACCAAGCCTGATTGTTGCAAAACCCGAGTTAGCGTTGCCGGATGGCGGCCAGAACAACATATCCGGCCTACAAATTGTTCTACTTTCAAACAATTGTGCGCAATCCGCAGAACCAATACGTCTGCATCAGCGGACATTCAGCCGTTTATCATCGGTCTTATGCACACCTTAGGCAAGGCAAAGCGCATTAATCAATGCGTAAGCAACGAAAAGCACGACTCTCAAATCGGTACTCCTTGTATGCTAAATACATCCGCACGTCAAATCCCGCAGATGCGTTCAGTGCAAAAACAGCGCTTTTTTATGCATAAATTATTCTGTCGCC [...]
+NODE 2441 12 1010 1010 0 0
+GCCAAAAGGCGT
+ACCCGTCGCACG
+NODE 2442 1552 73774 73008 0 0
+CGTGGGTGAAGTGAAATCCTGCCACGTTATCCCGCGTCCGCACAGCGATGTTGAGGCCATTTTACCGAAATCAGCCTAATCGATGGCGAATAAGGAGCACCGCGTGAAGCAATCACTGGGATTACTTGAAGTTTGTGGTCTGGCACTGGCTATCAGCTGCGCCGATATCATGGCGAAATCCGCTTCTATCACGCTGCTCGCCCTCGAAAAGACCAATGGTTCAGGCTGGATGGTGATTAAAATTACCGGTGATGTGGCCTCCGTTCAGGCGGCTATCACCACCGGTGCGCATTTCGCCGAACAGCGGAATGGCCTGGTGGCCCACAAGGTTATCGCCAGGCCCGGAGAAGGGATCCTGCTCGCAGAGACGCCTCCCCCCTCCGTCATAGAACCTGAGCCTGAAGCGTCAGAGATGGCCGATGTCGTTTCTGAAGCGCCAGCCGAAGAGGCCCCGCAGGAATCAGAACTGGTCAGCTGCAACCTGTGTCTGGA [...]
+CAGACGAGCCAGTTTTTTTACCGGGATAACCGGCAGCAACTGGCTGTGCAGGCTGAGCTGTACGCGGATGCCAAACGCCAGCGCGTCGTGAATTTTCCGGGCGGCGGCATCGTCGGTTTCTGCATCCGCAAGCTGACCCAGCAGCGGCAGGTCGACGAGCAGGATGCGCAGCGACGCGTGCTGACAGAACAGTGCTGGACAGTCGGCATCACGAAGTTGCGTAACGCTCAGCGTCGCCGTGCTCTGGGCACGGCGCTGCAGCCGGGAGACAATCTCCTCGACAATGCGCTGCAGAGTTTCGCCGTTCATCGCGGGCCTACCAGCCGGGCAAAGGCCTGCGGGTTATCGGCACCAGCGGCGTTGGCTTCATCGGTATCAATGTGCATTTCGAGGCGCATGTCCGGTGAAACGCGAATCGCCACGTTGTTGAAAATCAGCCCGCGATCGTCGCCTTCAATCGCCACGGAGACCATATCGCCGTGGGAAACCCGC [...]
+NODE 2443 51 2892 2892 0 0
+ACCTGCCGGGCTTCAATATTCCTATGCTGCCGCGTGAGCTGTCTGACGATC
+TAGTTGGTGAAGGCGCGAATTTTCGCGGCGTTATCCAGCTTACTGCCTTCG
+NODE 2444 184 8263 8263 0 0
+CGTTCGGTGGAAACGAGAATAAAGCGTGAAGGATAACGTTGCGTCAGCAACGGCCCGTAGGGCGAGGCGAAGCCGAGTCATCCTGCACGACCCACCGCTAACTTCGGTTAGTCAGTAATATCCAGCGTAGTATCGGGTGATTAGCTCAGCTGGGAGAGCACCTCCCTTACAAGGAGGGGGTCGG
+GATACTACGCTGGATATTACTGACTAACCGAAGTTAGCGGTGGGTCGTGCAGGATGACTCGGCTTCGCCTCGCCCTACGGGCCGTTGCTGACGCAACGTTATCCTTCACGCTTTATTCTCGTTTCCACCGAACGATTGGTGGGTCGTGCAGGATTCGAACCTGCGACCAATTGATTAAAAGTCA
+NODE 2445 10 768 768 0 0
+GCAACGTTGA
+GTAAGAATTG
+NODE 2446 6 300 288 0 0
+GTTTGA
+GAAATA
+NODE 2447 51 3138 3051 0 0
+ACCGGCTATGACCTGCCGATGTCCGAACTGCAGAATTTCCGTCAGCTACAT
+TGAGGTGCAGCAGGCTGTAAATCAGCATTGAGCCGTGGCCATTGGACAGCA
+NODE 2448 51 1806 1793 0 0
+CGCTTCTGTTGTGGCATGGTCAGGAGGATGACGTGGTGCCTGCTATCGAAA
+GGCCTGTCGGCCAGTCGCTCTAACTGGTGTGTGACTTCCCATTCACGTAGC
+NODE 2449 6 709 649 0 0
+CTACAC
+TGACGA
+NODE 2450 682 38339 38150 0 0
+GCAGCGGCCATTTTTTTGCTCGTCATAAACATAATACTCTCTCCTGAATTAACGATTCACGGAATTAAGCTCACTATAACTATAGTTAAAATAAAACCTGTTAAGAGATTTTCCGTAAAACCTGATTGCGCAGGGGTATATCACGCAGGTGATAGTCACTTCCTGTTATTTCGCTAATATTAATTTTACGACGTTACGCTCGTTACAACAGGTAAATAGTCTTAATTGGGATGTCAGAAAAGTCTTAGAGAGAGGATGATTTGCCATAGGGCAAACCATCGGGAAATATTTTAAACGGATGAGCCAATAACATTGACTAGCAGCCCCGCATGTTCTAACTGCATTTGATCGCTGGCGGAAATTCTGGAATCCGTAATGACACGATGGAAGCGAGAGAGCGGGCCCAGGGGATAGGGATGCACACAGCCAAATTTGGAGCTGTCGGTGAGGACAATCGCTTCTGAACCTTTTTCCAGAACAGCGTTAACCACA [...]
+TATCAGAAAAAAAGTGAAAGCATGGTAGGGCCGTTGACGCGACAGTTTATCCATCAAGTGCATTTCAGCAAAGCATTTATCGGTATTGATGGCTGGCAGGCTGATACCGGTTTTACCGGACGCGATATGATGCGATCGGATGTGGTTAACGCTGTTCTGGAAAAAGGTTCAGAAGCGATTGTCCTCACCGACAGCTCCAAATTTGGCTGTGTGCATCCCTATCCCCTGGGCCCGCTCTCTCGCTTCCATCGTGTCATTACGGATTCCAGAATTTCCGCCAGCGATCAAATGCAGTTAGAACATGCGGGGCTGCTAGTCAATGTTATTGGCTCATCCGTTTAAAATATTTCCCGATGGTTTGCCCTATGGCAAATCATCCTCTCTCTAAGACTTTTCTGACATCCCAATTAAGACTATTTACCTGTTGTAACGAGCGTAACGTCGTAAAATTAATATTAGCGAAATAACAGGAAGTGACTATCACCTGCGTGA [...]
+NODE 2451 687 40711 40538 0 0
+AAATATCTATAACGGAATGTTTATTCCGTTGCTCTGTCATAAAGCCGATGCTTACGCTGAGATGGGGGATACCCGGGGCATTGAGCGTATGCATTTAATCTCCGGCATTGGGCTGTCGCTGACGCTGGGGATTATCGTCACGGTCTCTTATTTAGCGGGCGTGAATATGGTTAAAGGTTTTCTGGATGCCATTCCAGAATTTATTAAACATGGATTAAGCGTTGCCACCGGTATTATTCCCGCGCTGGGTTTTGCCATGCTGGCGCGCTTATTAATTAATAAAAAGGTCGCCCCCTATTTTTTCCTCGGTTTTGTTTTAATGGCGTATTTAAAAATTCCGGTGACGGGTATTGCGATTCTCGGCGCGATCGTCGCCGTCGTGATGGTCAATATGCCGAAATTTGCGGCCTCGCAACCGGCACCTGCGCAAGGAGCGTCTCATGACGATGAAGATGATTTCTGATAAAGACCACCAGCAGGCGGAAACCACTG [...]
+TCTTCTTTTCGGCTATACAGTTTCTTTAATACCGGAATGAGCGTATAGACGAACGCCAGGTTCATTTGTCGTTCATAGTTCCAGGAAAACTCCATCTGGAATGACCGCCAGAAGACGCGGCGTAAATCACGCGCGGTGACCAGACCAGTGGTTTCCGCCTGCTGGTGGTCTTTATCAGAAATCATCTTCATCGTCATGAGACGCTCCTTGCGCAGGTGCCGGTTGCGAGGCCGCAAATTTCGGCATATTGACCATCACGACGGCGACGATCGCGCCGAGAATCGCAATACCCGTCACCGGAATTTTTAAATACGCCATTAAAACAAAACCGAGGAAAAAATAGGGGGCGACCTTTTTATTAATTAATAAGCGCGCCAGCATGGCAAAACCCAGCGCGGGAATAATACCGGTGGCAACGCTTAATCCATGTTTAATAAATTCTGGAATGGCATCCAGAAAACCTTTAACCATATTCACGCCCGCTAAATAAGA [...]
+NODE 2452 51 2049 2049 0 0
+ACCCTGCGCCAGAACGGCTGCCGGGCCGCCGATACTGCCCAGGTAGAAGCC
+TAGTATCAAGCGCCTGGAGTGCGTGGAATATCCTGAACTGGGTATGGAGGC
+NODE 2453 111 4867 4796 0 0
+ACGTTATCAGTGGCTGGGGATGGCGCTGTCGGCGAGTGAGAAGCGGTATGCGGACGGGAGTCCGGCGCTGCGTGAGCAGTGGCATTACCGGGGCGGTTTTGAGCTGCTGGC
+ACTCCCGTCCGCATACCGCTTCTCACTCGCCGACAGCGCCATCCCCAGCCACTGATAACGTACCTCGCTGACGGTGTGGTGATTTTGTTTCCACGCCGCACGGATAATATT
+NODE 2454 7 7 7 0 0
+TATGGCG
+CCCAGCC
+NODE 2455 51 165 165 0 0
+GTTAAGCGTGTAGGTGTGTGTTCCAGGTAAATCCGGTTCACTTTAACACTG
+CCCGGGACAACCGTCGCCCGGCCAACATAGCCTTCTCCGTCCCCCCTTCGC
+NODE 2456 6 289 289 0 0
+GCATGG
+GCGTTC
+NODE 2457 20 1095 1095 0 0
+TTTAGCCCCGTTACATCTTC
+ATGCGTTGTTGGGTAGGGGA
+NODE 2458 287 16669 16261 0 0
+TCACTTACGTCATCGGGTCGATAACCATATATTTCCGCCGTTTTATCGGCTATGGCCTCCCTCAGCGCCTGCGCGCCCGTCATCGGCGCATATTGATTCGCGCCCTGCGCGACATGATAAGCCAACCGCTCGTGCAAATAAGAAGGACCATCAAAATCAGGGAAGCCTTGCGATAAATTTATTGCCTGATGTTTCTGCGCCAGCGCGCTCATTTGCGTAAAAATCGTGGTGCCAAGATTGGGCAATTTGCTTTTTGGAATCAGTGGGTTATTTCTCATTATCTTCAT
+TCTTGGCACCACGATTTTTACGCAAATGAGCGCGCTGGCGCAGAAACATCAGGCAATAAATTTATCGCAAGGCTTCCCTGATTTTGATGGTCCTTCTTATTTGCACGAGCGGTTGGCTTATCATGTCGCGCAGGGCGCGAATCAATATGCGCCGATGACGGGCGCGCAGGCGCTGAGGGAGGCCATAGCCGATAAAACGGCGGAAATATATGGTTATCGACCCGATGACGTAAGTGATATCACCGTCACAGCGGGCGCGACAGAAGCGCTGTATGCGGCGATTACCG
+NODE 2459 51 55 55 0 0
+CGCACGTACAGGGGCGCCAGTCCATCATCGCCTTTCGCCGCTTCCGCAGAG
+GGCCGCCACAAAGCACTCTGACTATCCATGTCGGGAAGCGCAAAATCAAAC
+NODE 2460 31 1547 1485 0 0
+TCATCAGAATTTGTAACCTGCAAGGGCGTGA
+ACCCGTCACGCTTTTGATGCCTTTTGGCAGA
+NODE 2461 16 1015 1015 0 0
+ACCCTGGCGGCGCAGC
+AAGTCCGCAATGACGT
+NODE 2462 4 449 337 0 0
+TATG
+CGGC
+NODE 2463 12 629 629 0 0
+GCAATATTGCCG
+GTGGATGAATCA
+NODE 2464 442 22861 22801 0 0
+CCGTGCAATGACCGACCGGCGCTGGCGTAGCGCGTCTTCAATTAATATCAACAGCTTGCCCGGATCGACGGGTTTTTGCAGAAAATCCCAGGCGCCCTTTTTCACCGCGTCAACCGCCATCGGTACATCGCCATGTCCGGTAATCAATAAGATTGGCAGTTGATCGTCATCCTGATGAAACAGCGTCATAAGATCGATACCGGAACACCCCGGCATACATACATCGCTCAAAACGATCCCCTCCCAATCCGCTTTTACCCACTCTTTGGCCTCGAAAGGATGGGTAAAGCCACGCACGCGGTAGCCTGCCTGCTCAAGCATTTGGGTATAGGCGTCAAGTACATCAACGTCATCATCAATCAGCAAAATAGAACATTCATCATTCAACATCATCGACATCCGTTACCGAGAATTGCAGCACCACGCAAGCGTTACGCGTCAG
+TGATGTTGAATGATGAATGTTCTATTTTGCTGATTGATGATGACGTTGATGTACTTGACGCCTATACCCAAATGCTTGAGCAGGCAGGCTACCGCGTGCGTGGCTTTACCCATCCTTTCGAGGCCAAAGAGTGGGTAAAAGCGGATTGGGAGGGGATCGTTTTGAGCGATGTATGTATGCCGGGGTGTTCCGGTATCGATCTTATGACGCTGTTTCATCAGGATGACGATCAACTGCCAATCTTATTGATTACCGGACATGGCGATGTACCGATGGCGGTTGACGCGGTGAAAAAGGGCGCCTGGGATTTTCTGCAAAAACCCGTCGATCCGGGCAAGCTGTTGATATTAATTGAAGACGCGCTACGCCAGCGCCGGTCGGTCATTGCACGGCGGCAATATTGCCAGCAGACGTTACAGGTTGAACTGGTTGGGCGCAGCGA
+NODE 2465 39 2809 2809 0 0
+ATAACATCGGGTGGGATGAAATCGTAAAAGAAGATAATG
+CTACATTTTTCGCAGCTGCTTTTTTTTAACGTCATGCTA
+NODE 2466 51 132 132 0 0
+GATCGAAATCGCCCAGCGCGACCGGCAGGCCATCCAGCGGGGTTTTAATGA
+CCCTTCCCGGTGATTATGTCGCTTGTGGGGCTGGCTGTTATTCTCGGTCTG
+NODE 2467 14 1701 1481 0 0
+TCCCGCCAGTCTCA
+TTATGTACTATATA
+NODE 2468 28 77 77 0 0
+AAATGCACAGGAGGGTATGTACTATATA
+CCCCGCCAGTCTCAAGAGAAAACGCATT
+NODE 2469 102 3400 3193 0 0
+GATGCCTATCGCCGCCGCCTGCGGCAGGGTGAAGGCAATCAGGCCGAAGTAATTCAGCGTCAGCGCCCCCAGCACCGTGGCGAAGATACCGAACTGCGCCGC
+TTACTTCGGCCTGATTGCCTTCACCCTGCCGCAGGCGGCGGCGATAGGCATCATCGGCGGCGCGGACGGCCCGACGGCGATTTATCTGTCGGGCAAGCTGGC
+NODE 2470 43 4174 4174 0 0
+TTCACGCACACGCTGCAGGTTGTTGTTGATTTCGTTCAGCGCG
+TTCAGTCTGCTAACAGCACTAACTCCCAGTCTGACCTCGACTC
+NODE 2471 5 212 206 0 0
+TGGCG
+ACCCA
+NODE 2472 51 2295 2295 0 0
+ACGCGACCGCGCCACGGCCAACGCGTCCTCTGAGCTGGTGCAGCTGCGCCA
+TCGCACTGCGTGCTGCTCTATAAATCACCGTTGTCGAAAACGGCGCAGAAG
+NODE 2473 27 1330 1273 0 0
+CCGCCGCCAGTTGTACGCGCTACTGTA
+GGTGCCGAGTGCGGCAAGGATCTCCTG
+NODE 2474 51 3393 1653 0 0
+CGGTAATACTGTGCCGGATGGCGGCTGCGCCTTATCCGGCCTACAAGATTT
+GCTCGTTAACCCAAATCCGCATTTCTCCCTCGCCACGGTTGGCCCAGCTAA
+NODE 2475 1148 64042 63659 0 0
+GCAATATCAGTACATTGCGATGAATTTTTGTAGGCCTGATAAGCGAAGCGCCATCAGACATTACCACCAGGCTAATATCAACGCGGTAGACCCGATAAGCGAAGTGCCATCGGGCATTACCACCAGACTGATATCAATGCGGTAGGCCCGATAAGCGCAGCGCCATCGGGCATTACCTCTTGCGTCAGAACAGCCCCAGCGGCTTATCGGAATAGCTCACCAGCAGGCACTTGGTTTGCTGGTAGTGTTCCAGCATCATCTTATGCGTTTCGCGCCCGATGCCCGACTGCTTATAGCCGCCAAACGCCGCGTGTGCCGGATAGGCGTGATAGCAGTTGGTCCATACGCGCCCGGCCTGAATGCCGCGACCCATCTTATAAGCCAGATTGCCGTTGCGGCTCCAGACGCCTGCGCCGAGGCCATACTGCGTATCGTTAGCGATTTCCAGCGCCTCCTCCATGGTTTTAAAGGTGGTTACCGCCAGCACCGGGC [...]
+TCATTGGCGATCTGTTACCGCCGGGCGTCGTCAACGTCGTGAACGGCGCGGGCGGCGAGATCGGTGAATATCTGGCGACCTCGAAACGTATCGCGAAGGTGGCGTTTACCGGTTCGACGGAAGTGGGTCAACAGATCATGCAGTACGCCACGCAGAATATTATTCCTGTGACGCTGGAGTTAGGCGGCAAGTCGCCCAATATCTTCTTCGCCGACGTGATGGATGAGGAAGATGCGTTCTTTGATAAAGCGCTGGAGGGATTTGCCCTGTTTGCCTTTAACCAGGGCGAGGTGTGTACCTGTCCAAGCCGTGCGCTGGTTCAGGAGTCCATCTATGAGCGCTTTATGGAGCGCGCTATTCGCCGGGTAGAGAGCATTCGCAGCGGGAACCCGCTAGATAGCGGTACACAGATGGGGGCGCAGGTCTCTCACGGCCAGCTTGAGACTATCCTCAATTATATCGATATCGGTAAAAAAGAGGGGGCCGATATTC [...]
+NODE 2476 51 2359 1864 0 0
+TTTTACACGCCAGTTTAGGGACGTTGTTGACCATCATGCCGCAAGAGCCGC
+ACCTTCCTGCGCGATTACACCAACGGTATGAAGGTGGAAGCGCTGGCGAAC
+NODE 2477 4533 256897 255160 0 0
+TCCGCCGACTGATCGTATTTTTATTCGTGTTGTTTATCTTCTCGTTCTTAGACCGTATCAACATCGGTTTTGCCGGGTTGACGATGGGGCAGGATCTGGGGTTAAGCGCCACCATGTTTGGCCTTGCCACGACGCTGTTTTACGCCACCTACGTCATTTTCGGCATTCCCAGCAACGTGATGTTGAGCATCGTCGGCGCCCGCCGCTGGATTGCGACCATTATGGTGCTATGGGGCATTGCATCTACCGCTACGATGTTCGCGGTGGGACCGAAAAGCCTGTATGTGCTGCGAATGCTGGTGGGCATTACCGAAGCGGGCTTTTTGCCAGGAATATTGCTCTATTTAACCTACTGGTTCCCGGCATTTTTCCGCGCCCGCGCCAACGCATTATTTATGATTGCCATGCCGGCCACTACCGCGTTGGGGTCGATTGTCTCCGGCTATATTTTATCGCTGGACGGCATATTCAATCTGCATGGATGGCAGTGGT [...]
+GCCTCTGACATACTTCCCCCAACGGAAGAAATATAGCCTTTCACCGCGCACAACCCGATCAACGAACCGCCAATGTCAGCCATTAATGCGCCATTGCGAAGATCATCGTTTAAATAAAGACCAGCCACACGTTCACATTTTTTAGATACGTCGGTTATTTTTACACGTTAGCGATCATTTATTGCCTGAAGAATATATTCTTTCACTGTTTTGTACTCTCTGGTTGATACGTACCTTCTCCCTGTCAATGCCGGGTAAAATGTACCGCTGCGCTTACAGGTTGCGGTATTTATAAATAAGAAATACAACAGTCACTTACAGTTTAATAATTGAGCGTTATAACATCCACTACCGCCCAATATTTACACCACGCCTAAAATACAAAAATGTAATAGAATGTAAACAAAATAAGAGCATAAAATAAATAACTTATTAAAAAATCAATATAAATAGAGTGGTCAATAAAAAACGATCGTTTTCAACGAGTTATGT [...]
+NODE 2478 4 761 761 0 0
+GGTC
+TCGG
+NODE 2479 68 1789 1621 0 0
+ACCGACAGCATCTGTAGTCCTGCCGGCAACGGCGGCAGGCTGGTCAGTTGGTTATCTTCGACAGTAAG
+ACTACAGATGCTGTCGGTAGCAGGTAATCAACTGACCCGCCTGCCGGCGCTGCCGTCAGGCCTACAAC
+NODE 2480 51 1673 653 0 0
+CCATCACTCAATATTGATATTATTTACGGCATTCCCGGCCAGACTCACGCA
+GAAAATGACCCGCCTTTAGCCACTCCAGCGCCTGGTGCGCGCTGGCGGCAT
+NODE 2481 2284 127094 126357 0 0
+CGTGCATCAGGCGATTGCGATGGTGGAGTCGGAAGAGGTTCCGGCAGGCAATGTGCTGGGTATTATGCAGAAAGGCTATACGCTGAATGGTCGTACCATTCGCGCGGCGATGGTGACGGTAGCGAAGGCGAAGTAAAAGTCTGATGGCCGATGTAAAGTCGGCCATTTTTTTAGCTTAAAAAATCCTGCACTTCCAGCCACGGCGTGTTGAAATCCTCTATTTTTTTATATTCGCTCATTGGCAGAACGACCACATTATAGGTGTCAGATCCTTCATTCAGATCAAAAATCTGGAAGCCCCTCTTATTGAGTTCGGTCTGGATGCGTTCAAAGATCTCGTCAAGGTAACGGTCCCCGGCTTCACAGACATCGGAGATTTCATCCTCTTGGGTTATTTCGACAAGAAGATTTCTTAATTCCTCAGAATCCGTCAGGTTTTTTGTGAGTTCATAAAAGCGATCTGCGGCAAAATTAGCCAGTTCGCCTTCTTCA [...]
+GTAGCCGCATATTACAGCAATTTGTAAGCTAAGCTTTTAAAGGAGTTTCCCCTGGAACACATTTCCACCACCACGCTGATTATCATATTAATCATCATGGTGGTCATCTCGGCCTATTTTTCCGGTTCCGAAACTGGAATGATGACGCTAAACCGTTACCGTTTACGCCATATGGCGAAGCAAGGTAATCGCTCGGCAAAACGGGTAGAAAAATTATTGCGTAAACCCGATCGACTGATAAGCCTGGTGCTGATCGGCAATAACCTGGTCAACATTCTTGCCTCGGCGCTCGGCACGATTGTGGGTATGCGGCTTTACGGCGACGCCGGCGTGGCTATCGCCACCGGGGTATTGACGTTTGTCGTGTTAGTTTTTGCTGAAGTCCTGCCCAAAACTATCGCCGCGCTCTATCCGGAAAAAGTGGCCTATCCCAGCAGCTTCCTGCTGGCGCCGTTACAGATACTGATGATGCCGCTGGTGTGGTTACTTAAC [...]
+NODE 2482 51 1804 827 0 0
+ACCCGCCGACCCCGCCAGCCCTCATGGTAATGCCCCCACAGCAGAACGATA
+TCGTGTGGTTTAACGTCGCAGGCGCGGGTATTCTGACGCTGGCCTATTTTG
+NODE 2483 1 116 116 0 0
+A
+A
+NODE 2484 1 163 163 0 0
+C
+T
+NODE 2485 2 93 93 0 0
+GG
+CA
+NODE 2486 2599 152200 150706 0 0
+ATACAGTGCGGGCGTCTGGAAGAGCTGGAAATCGAGGGCCTGACGCTGGAGCGCGCGCTGGTTTTCCCAAGCGGGCTGGCTATTCTGATCGCGATATTTACCGAGCTGAACATCCAGAGCATGACGCTGGCAGGCGGCGCGTTACGCGAAGGGCTGGTGTATGGGATGTTGCATCTGGCGGTAGATCAGGATATCCGCAGCCGCACGCTGCGAAACATTCAGCGTCGGTTTATCGTCGATACCGATCAGGCAAATCGCGTGGCGAAGCTGGCAGATAACTTCCTCAAACAGGTAGAAAATGCCTGGCATATTGAGCCTATCAGTCGTGAACTGTTGCTTAGCGCTTGCCAATTGCATGAGATCGGTCTGAGCGTTGATTTTAAACAGGCGCCCTATCATGCTGCCTATTTAGTACGCCATTTGGATCTGCCTGGCTATACGCCCGCGCAGAAAAAGTTGCTCGCCACCCTCTTACTGAATCAGACCAATCCG [...]
+TTATTAAGCGCGAGTACGCTGCGCTGGGGATGAAATCGAACTTTTCATTGTTTGACGATACCGACCAGGTCGCCTTGCTCAAAGAGCTGACCGAAGGCCTGATCGAAGACGACAAGGTTCTGTTGCAACAGCTGATCTCCACGATCTCCAACTGGAAAAACGATCTCAAAACGCCTGCACAGGCAGCGGCGGGGGCGAAAGGCGAACGCGATCGTATTTTTGCCCACTGCTACGGGCTTTACGACGCCCATATGAAGGCATGTAACGTTCTCGATTTTGATGATTTGATTTTGCTGCCGACGCTGCTGCTGCAACGCAATGACGAGGTGCGCGAGCGCTGGCAGAATAAAATTCGTTATCTGTTGGTGGATGAATATCAGGATACTAACACCAGCCAGTATGAGTTGGTTAAGCTGCTGGTCGGGCAACGCGCGCGCTTTACGGTCGTGGGCGATGACGACCAGTCTATCTACTCCTGGCGCGGGGCGCGTC [...]
+NODE 2487 38 1142 1084 0 0
+ACCGACACCGCCGGAAGCTCCGCCTGGTTTGAACGCGG
+CAGCCAGCCGCCGGTACAGGACTCTGCTGTCGTTACGG
+NODE 2488 51 2431 2431 0 0
+GCTTTTCTGATTGGCGGATATGGTTGCCGCGCGGCGCTACAAAAATGGCAG
+CGATGGTTTGCGGAACATAGCTCAGGCCAATCACTGCCGGGCTGTAACCCA
+NODE 2489 50 64 64 0 0
+CCCAGGAGCATAGATAACTATGTAACTGGGGTGAGCAACGGCCCGTCAGG
+TACTCACTCCCTTGCCGCCTTTAAGCAACTCGAATTATTTTGGGTATAGA
+NODE 2490 23 784 784 0 0
+GCGAGGCCCATGGATGGGCCGGG
+ACATAGTTATCTATGCTCCTGGG
+NODE 2491 3 296 285 0 0
+GGG
+TAA
+NODE 2492 3 181 181 0 0
+CCG
+ACA
+NODE 2493 17 26 26 0 0
+GCGCACGCGACGTTCAA
+GGTAATCCGTAGCCAAC
+NODE 2494 122 5078 5008 0 0
+TCGCTGATGAGCGTGCCGCCGCTGTAGCTGTTGGCGCCGGAAAGCGTGAGCATCTTGTCGCCGGATTTGACCACCTGACCGCTGCCGCTGATGGCGTTGTCGAACGTGCCGCCGGTGTTCAG
+GGTCAAATCCGGCGACAAGATGCTCACGCTTTCCGGCGCCAACAGCTACAGCGGCGGCACGCTCATCAGCGACGGCACGCTGGTCGCCAGCAACGTTGAGGCGCTGGGCAGCGGCGACGTCA
+NODE 2495 26 1100 1100 0 0
+CTTTTTGCTATACGGCTGGCTGGCGG
+ACCCACGGCAGCACGCTCACCACCGG
+NODE 2496 51 2741 2741 0 0
+TGTTTAATTTTTATATTGCCATCATAGGGTTACTTGCTGCAGGTAGTGGTG
+ACAGTCATTCTCTGTTGAGTATGGATTTCAAAGTATTTCCAGGCATGCTCG
+NODE 2497 722 35858 35496 0 0
+TGCCGACGGCATTGACCCGAATGAACTGCTGAATAGCATGGCTGCCGCTAAATCCGGCACCAAAGCTAAACGCGCAGCTCGTCCGGCTAAATATAGCTACGTTGACGAAAACGGTGAAACTAAAACCTGGACTGGCCAGGGTCGTACACCGGCTGTAATCAAAAAAGCAATGGAAGAACAAGGTAAGCAACTGGAAGATTTCCTGATCAAGGAATAATTTACTTCCTGGATGCTTAAAATCCCGCCGCTGGCGGGATTTTTTTTGCCTGAGTTCTCCGCTGACGACCCCAGGCATAAAAAAAGCGCCGGATTTACCAGCGCTTCTGTTAAAAAATTTATAACGTATCGTTACTTCTTAATACCCATTTCTTCTTCAAGCCAGGCTTTAAATTCAGCACCCAGCGAATTATGACGGATGCCATATTCAACGAATGCCTGCATATATCCTAACTTATTACCACAGTCATGGCTTTTACCCTTCATGTGGTAGGC [...]
+ATGGTTGGCGTGGTTGAAAAACCAAAAGCGGATGTCGCGCCGTCTAACCTTGCGATTGTCGGGCGTTATGTGTTGAGCGCGGATATCTGGGCGTTGCTGGCGAAAACCCCTCCGGGCGCCGGGGATGAAATTCAGTTGACCGATGCTATCGATATGCTGATCGAAAAAGAAACGGTTGAAGCCTACCACATGAAGGGTAAAAGCCATGACTGTGGTAATAAGTTAGGATATATGCAGGCATTCGTTGAATATGGCATCCGTCATAATTCGCTGGGTGCTGAATTTAAAGCCTGGCTTGAAGAAGAAATGGGTATTAAGAAGTAACGATACGTTATAAATTTTTTAACAGAAGCGCTGGTAAATCCGGCGCTTTTTTTATGCCTGGGGTCGTCAGCGGAGAACTCAGGCAAAAAAAATCCCGCCAGCGGCGGGATTTTAAGCATCCAGGAAGTAAATTATTCCTTGATCAGGAAATCTTCCAGTTGCTTACCT [...]
+NODE 2498 51 2467 2467 0 0
+TGCCGCGATCGCCAGCTCATTTATGAGGAAGCGCCGCAGGCGTATAAATCC
+AAATCACCCGGCTACCCATCCCGGTACGGCAGAGCTGTCGCGGGGTAAATT
+NODE 2499 79 2028 1973 0 0
+CGTAGCCGCGGGAAACGACCCCCACGCGCACGCCACGCTGTTGCAGCTTTTCCACCAGCCAAATGACTACCGGGGTTTT
+GCGCGTGGGGGTCGTTTCCCGCGGCTACGGCGGCAAAGCTGCCGCTTATCCGCTGCTCCTGACGCCAGAGACGACAACC
+NODE 2500 51 3107 3107 0 0
+GCGCTACCTGTCATAAAGCCGCGCCTGAACGTAAGACAACGTAAAGATCCT
+CCGCGCTTACCAGACCTACAAGGGCATAGGTCTGATAAACGCAGCGCCAGC
+NODE 2501 2 78 74 0 0
+AC
+TA
+NODE 2502 2969 164012 159674 0 0
+GCCACGATTAAAGCGGCATTATGGACATCCGCCAACGCCATCGCGAAGAGCCCTGCGCAACTCAGAACGGGCATCACGGAGGCGCCCGCCCACAATATCCGCCGCGATAACATTTTCACCAGCCGGGGGAAGACAATCAGCGTCAACAGATTCGCCGCGCCGGCGTAAGAAAGGTAATAGGGAAAAAGATCGGCATCGCCAATCACATAGGTGAAGTAGTAGATCGCAAAGCCATTGATCATATTGGAGGCAATGTTATACGCCAGCGCCATTCCCAACAGGCAAGAGAGCTGCTCGTTTTTGTATATCAATCCAACGATCGTTTTTAACGTCAGATGTGGGCGGCTCGCCGTTACACCGTTGTCGGAGGAGTACACCTCATGTACGTTGCGTAATGTCACGATAGTCGAGGCGATAAAAAACGCAATCAGTACCAGCGTAAACATCTGAAAGCCGAACCCACGATCCGCTCCGCCAACGTAGTTCACAAAC [...]
+TCTGCACGACTTCATTGTTGATTAAATACTCCACATCGCCGTCAAACGGAACATTCACTTCTACTTGCCCATGCCAGTGACTGCTGGCCATTCTGTGTGGCGGCCTCAGTTCAACGTCCAGTCGTTGATATTCGGAATAGAGCGACAGCGGGCTACGGGTTTGCTTTTCATCGCCGTTGCACATGTGCGGGTCGGGCGGGAGGAGGGATATTGCTTGCGTACTCATCGTCACTCCATTTCCTGAATTATCAGAATTATGCCCCTTTAGCCGGGAGGAAACCGGGAATCCGGACACAGAATCCGTCGATATTGTAGAGCGTAGCCTGACTATCAGGCCGAATACTCTGCTTTTTACGCCATTTTGTCCCAAAAACTCAGATCTTCCGCGCGCCAGCATACGATCTGAGTTTTCGGGAATGCTCATCGGGGAAGACGGAGGTTTTCACCGGGAACGCGTGCCACCATGAAGGTGTTCACTACTGTTCTGGAGAG [...]
+NODE 2503 785 45926 43355 0 0
+ATCCTTTTGAAAATAGATTTTCAGGATATCGTTATTGGCTTCTTGCCGCAGGCTGTAACGATCGATTTCCTCAGGATTGGTAATGCCCAGACTTTTTAGATTGTCATACATAGCGGTATCCTTCATCACACTATAACTTTTGAATAATTAACGAAAAATTGGTTTTTCGCCACCAGTGTATACAAAAAAAGCGCGGTTGATCGCAGAAGACGTCTCGGCAACGTAATGAGCAAAAGGGCGGCGGTTATTGATAGCTTAAGTAATTCAACGTGATATTCCGTTTATAGAGAAAGCGTTTGAAGTCAGTGTGGGAAATTGACCGGAGGCAGTGGTCGATAACCTTGAGAGGCGGAGTCTATGTCCGGAACGTATAATGCTACTATTCGCCGGGTGGTGGTTTCCGCCTGGATAGGAAACTCCATTGAATATTATGATTTTCTATTATACGGCCTGGCAAGCGCGCTGGTATTTGGCCCGCTTTTTTTCCCTGGC [...]
+AAATCCCTGTAGAAAACGCAGAATAACCAGTAAAGCAGGCGCCAGCGCGCCAATACTGGCGTAAGAAGGCAGGCAACCGATGAGAAACGTGACCGCGCCCATCCCCCCTAATGTGATTAATAACGTGTTTTTACGCCCAAGCGTATCTCCCCTGTTGCCAAAAAATAGCGCGCCCAGCGGTCGGGAGATAAATCCCACGCCGAAACTGGCAAAAGAAGATAACGTTGCAGTCAATGGGCTGGCGCCAGGGAAAAAAAGCGGGCCAAATACCAGCGCGCTTGCCAGGCCGTATAATAGAAAATCATAATATTCAATGGAGTTTCCTATCCAGGCGGAAACCACCACCCGGCGAATAGTAGCATTATACGTTCCGGACATAGACTCCGCCTCTCAAGGTTATCGACCACTGCCTCCGGTCAATTTCCCACACTGACTTCAAACGCTTTCTCTATAAACGGAATATCACGTTGAATTACTTAAGCTATCAATAAC [...]
+NODE 2504 182 11729 11653 0 0
+CGGTTCAGGAAGACAAGCGGAAAAATGCATTTTTGTTTTAACCGCTCATCTTTTATCCATAACGCTTATTTTTGCTGCTTTTTTATCGCCGATGGCAGATCGGCAAGGCTGTTTAACACCCAGTCCGCCGCGTTTTCTGCTTCTGCCGTGACCGGTTTGCCCGTACGCACCAGCACTTTTGT
+CGCGGCGGACTGGGTGTTAAACAGCCTTGCCGATCTGCCATCGGCGATAAAAAAGCAGCAAAAATAAGCGTTATGGATAAAAGATGAGCGGTTAAAACAAAAATGCATTTTTCCGCTTGTCTTCCTGAACCGACTCCCTATAATGCGCCTCCATCGACACGGCGGATGTGAATCACTTCACA
+NODE 2505 29 1096 1055 0 0
+CCGTACTGGGTGAGCGACGTAATGAAGCC
+CGGCTTGCCTTCTTTAAAACGGGTAATGG
+NODE 2506 1421 73509 72955 0 0
+TACATCTATGTTAGTTATCATGGGACTGATAGGCGGCAGCTTTTTCTATGGCGAAGTGGTCATTACGCCGGCGATTTCGGTGATGTCGGCGATTGAAGGCCTGGAGATTGTCGCGCCGCAGCTGGATACCTGGATTGTCCCGCTCTCCATTATTGTGCTGACTCTGTTGTTTATGATTCAGAAGCACGGTACGGGAATGGTAGGGAAACTCTTTGCGCCGATTATGCTGACCTGGTTTTTAATCCTGGCGGTACTTGGCCTGCGCAGTATTATCGCCAATCCCGAAGTGTTACATGCGCTGAATCCTGTCTGGGCGGTACGTTTTTTCCTTGAATATAAAACCGTATCATTTATTGCGTTGGGCGCGGTGGTGCTGTCGATTACCGGCGTAGAGGCGTTGTACGCCGATATGGGACACTTCGGTAAGTTCCCGATTCGCCTGGCGTGGTTTACCGTGGTACTGCCGTCGTTAGTACTGAACTACTTTGGTCA [...]
+CAGCGGTGGAACACCTCTTCAACGTTTGGCGTTTCGCGCCAGCCGTAGCTGGCCACCACGCGCCAGAATGTCGGAGACAACTGCTCAATCTGCACCCGGCGAACGTTATGCACATAAGGCGCATCTTCCGTACGCAACGTCAATAAGATTACGCGCTCATGCAACACTTTGTTGTGCTTCAGGTTATGCAATAAAGCAAAAGGGATCACACTGAGCGCGCGCGACATGTATACGGCAGTACCCGGCACCCGAACCGGCGGTGACTTCTCCAGTGAAGCAATCATCGCTTCCAGCGAATTACCGTGTTCATGCATACGACGCAACAGACGGAAACGCTCGCTCTTCCAGGTGGTCATGATCGTGAACATGATCAGACCCAGGCTCAGCGGCAGCCAACCGCCGGACAACAATTTGTCGAGGTTAGCCGAGAACAGCGGGATATCCACGCACAGGAACGCGATGAGGATCAGCGCGACAAAATATTTGTTCCAG [...]
+NODE 2507 51 2594 2594 0 0
+GGCAAGGATAATTTCCCCGATCAAAGGAATGGAACGTCCAACAAACGGCGC
+CGCAGATGTGTCACAAATAACATATCGCACTATACGCGACTACAATACCAT
+NODE 2508 47 2677 2677 0 0
+AGGCTGCGTCGATCTCAGCGTTATCCCCGGCGCCAGCCAGCGGTTTG
+TCACTCTCCAGGGGTGGAAAAAGGTCGGTTTTGACGCCGTTATCTTT
+NODE 2509 51 133 133 0 0
+CCCTGACCCCATGCCGAACTCAGAAGTGAAACGCCGTAGCGCCGATGGTAG
+GGGGACCACCGCGCTAGTGCCGCCAGGCAAATTCTTTTATGCTCAGTACGC
+NODE 2510 3 329 97 0 0
+GGC
+ATT
+NODE 2511 12 1977 1485 0 0
+CGGTGAGGGGGG
+TTTTGCTTATAT
+NODE 2512 1 119 78 0 0
+G
+T
+NODE 2513 57 1738 1738 0 0
+GACTCGTTGCGCTCGCCCTTCGGGCAGCCCGTTCGCTGCGCGCCCGGTCTGTCCAAC
+ACGAGTCAATCCCCCCCTCACCGCCATATTTAAGTTGAGAGCCTGTACAGAAGTACG
+NODE 2514 44 46 46 0 0
+AGCGCTTTGGCTGTGCGACGCGGCCAATCCCGAATCTGCCTGAA
+ACAACGACACCAGTTGAGCAAGGATCAGGAGTCCGCGCAGCCAG
+NODE 2515 40 1407 1407 0 0
+AGACGGACGGGCTTCTTCACTTGTCTGATGCCTGGCAGTT
+CTTTGCGTGTGTGGTAACTGTAAAAATGTAGGCCTGATAA
+NODE 2516 11 730 730 0 0
+TATGGCGGGCG
+TGGACGGGCTT
+NODE 2517 131 7178 7178 0 0
+CCATCAGGAATCCACCATGCACGCCGGTAGCGGCCTCGGCTCCGGTAAGGTCTCCGTCACCAACCTGGATTTTGATCACTATATCGACCGCGCCAGCCCGAACCTGTTCAAATACTGCGCCTCCGGCAAGC
+TAGTGATCAAAATCCAGGTTGGTGACGGAGACCTTACCGGAGCCGAGGCCGCTACCGGCGTGCATGGTGGATTCCTGATGGATATTCCAGCGCCAGCTCAGTACTTCAATTTCATTTTTGTGTTTGTCATC
+NODE 2518 41 2400 2400 0 0
+ACATTCCGCAGGCCATTCTGGTTATGCGTAAGGCTGGCGGC
+AGGCGCAGTATTTGAACAGGTTCGGGCTGGCGCGGTCGATA
+NODE 2519 104 4759 4613 0 0
+CTCCACCGTTTCACGGGAGGCGATTTCACCATCGTGGCTGCCGCTCGGGGAAACCACGGCGACAATCAGGTCGGTGAAGGTATACTTGAGGTACTCCAGCGGAT
+GTTTCCCCGAGCGGCAGCCACGATGGTGAAATCGCCTCCCGTGAAACGGTGGAGCTCTCCTTCAGCACCGTGAAGCAGGAATACGTGGTGCAGAACCAGCAGGG
+NODE 2520 28 1330 1330 0 0
+TGCCGCCAGCCTTACGCATAACCAGAAT
+TACCTTCACCGACCTGATTGTCGCCGTG
+NODE 2521 85 1149 1149 0 0
+GTGGTGGTGTGCACCTGTAATCGCAGCTACTCTGGAGGCTGAGGCAGGAGAATTGCTTGAACCCAGCAGGTGCACACCAGCAGAC
+CCAGAGTAGCTGCGATTACAGGTGCACACCACCACACCCGGCTAATTTTTTAATTTTTACTAGAGATGGGGTTTTGCCATGTTGG
+NODE 2522 118 1604 1604 0 0
+CCAAGCTGGTCTTGAACTCCTGACCTCAGGTGATCTGCCCGCCTTGGCTTTGAGAACAAGAACACCATGTCTGCTGGTGTGCACCTGCTGGGTTCAAGCAATTCTCCTGCCTCAGCCT
+ATGGTGTTCTTGTTCTCAAAGCCAAGGCGGGCAGATCACCTGAGGTCAGGAGTTCAAGACCAGCTTGGCCAACATGGCAAAACCCCATCTCTAGTAAAAATTAAAAAATTAGCCGGGT
+NODE 2523 33 2276 2276 0 0
+ACAGCGCGCGAATTTCATAGTGTTCACGGATCG
+GCTAAAGCTTCTCGTCCTGGCACCGATATCTCG
+NODE 2524 30 1770 1770 0 0
+GACTCGCTTCGCTCGCCCTTCGGGCCGTCG
+TTAACATCAAACTCAGATGTTGAGCGTGAA
+NODE 2525 37 1748 1748 0 0
+CGGATTCCTGAACCAGCGAGGCGTTCTGTTGCGTTAC
+CGCGCTGGAAGAGCAGGCCAGCCGTCTGACCCAGGCG
+NODE 2526 51 70 70 0 0
+CGTGTTGGTTGCTGCTGACCGGTTGCCAGTGTTGGTTGCTGCTGACCAGTC
+GGGCGACTGGTCAGCAGCAACCAACACTGGCAACCGGTCAGCAGCAACCAA
+NODE 2527 430 21667 21405 0 0
+GGCTTCGTTAACGAAGTGCAGGTTATCGCGACCGTCGTTTCCGTTAACCCGCAGGTTAACCCGGACATCGTTGCCATGATCGGCGCATCCGCTGCGCTGTCCCTGTCCGGCATTCCGTTCAACGGCCCAATCGGCGCGGCGCGCGTAGGTTACATCAATGACCAGTACGTGCTGAACCCGACCCAGGACGAGCTGAAAGAAAGCAAGCTGGACCTGGTGGTTGCCGGTACCGAAGCGGCTGTGCTGATGGTGGAATCCGAAGCTGAACTGCTGAGTGAAGACACTATGCTGGGCGCGGTGGTGTTCGGTCACGAGCAGCAGCAGGTTGTTATCCAGGCGATCAACGATCTGGTGAAAGAAGCCGGTAAACCGCGTTGGGACTGGCAGCCGGAAGCCGTCAACGACGCGTTGAACGCGCGTGTTGCTGCGC
+TCCCAACGCGGTTTACCGGCTTCTTTCACCAGATCGTTGATCGCCTGGATAACAACCTGCTGCTGCTCGTGACCGAACACCACCGCGCCCAGCATAGTGTCTTCACTCAGCAGTTCAGCTTCGGATTCCACCATCAGCACAGCCGCTTCGGTACCGGCAACCACCAGGTCCAGCTTGCTTTCTTTCAGCTCGTCCTGGGTCGGGTTCAGCACGTACTGGTCATTGATGTAACCTACGCGCGCCGCGCCGATTGGGCCGTTGAACGGAATGCCGGACAGGGACAGCGCAGCGGATGCGCCGATCATGGCAACGATGTCCGGGTTAACCTGCGGGTTAACGGAAACGACGGTCGCGATAACCTGCACTTCGTTAACGAAGCCTTCCGGGAACAGCGGACGAACCGGGCGGTCAATCAGACGCGCAATCAGGG
+NODE 2528 51 3046 884 0 0
+AGCACGTACAGGTGCGCCAGTCCATCATCGCCTTTCGCCGCTTCCGCAGAG
+TGCCGCCACAAAGCACTCTGACTATCCATGTCGGGAAGCGCAAAATCAAAC
+NODE 2529 401 21534 21388 0 0
+GGGATATTAATGATCTTATTCCCTTTGCCTTTCGACAGCTGCGGCAGAGAGTCAACCGGGAACATCAACATCCGTCCGGCCTGGGTAATCGCCAGCAGCATATCGTGCTCGTCTTCAATCACCAGCGGCGGCATGACGTGCGCATTTTCCGGCAGTGTAATCAACGCTTTACCGGCACGGTTACGGGCAACCAGATCGTTAAACGTACAAACGAAGCCGTAGCCCGCATCCGACGCCATCAACAGTTTCTGGTCATCGCCTTCCATCAGCATATGCTCTACGGTCGCCCCCGGCGGCAGCGTGAGTTTGCCGGTCAGCGGTTCGCCCTGCCCGCGCGCCGACGGAAGCGTAATGGGATCAATAGCATAGCTGCGACCGGTGGTATCAATAAACACCACCGG
+TACGCTTCCGTCGGCGCGCGGGCAGGGCGAACCGCTGACCGGCAAACTCACGCTGCCGCCGGGGGCGACCGTAGAGCATATGCTGATGGAAGGCGATGACCAGAAACTGTTGATGGCGTCGGATGCGGGCTACGGCTTCGTTTGTACGTTTAACGATCTGGTTGCCCGTAACCGTGCCGGTAAAGCGTTGATTACACTGCCGGAAAATGCGCACGTCATGCCGCCGCTGGTGATTGAAGACGAGCACGATATGCTGCTGGCGATTACCCAGGCCGGACGGATGTTGATGTTCCCGGTTGACTCTCTGCCGCAGCTGTCGAAAGGCAAAGGGAATAAGATCATTAATATCCCCTCTGCGGAAGCGGCGAAAGGCGATGATGGACTGGCGCACCTGTACGTGC
+NODE 2530 179 818 818 0 0
+TCAGCTTAATCTCTGATACGGGAGCCACCGGCTCCCATCAAGATTAAACTTATTTTTGTGCCGTGTGGAGGATCACGAGATTTATCTCGCCCTCCCGCAAGTGACCCGGTGGCTCCCGTATCAGAGATTAAGCTGATAAGAACAGATACCTTCTCGGCCTTTTGGCTAAGATCAAGTGT
+AATCTCTGATACGGGAGCCACCGGGTCACTTGCGGGAGGGCGAGATAAATCTCGTGATCCTCCACACGGCACAAAAATAAGTTTAATCTTGATGGGAGCCGGTGGCTCCCGTATCAGAGATTAAGCTGATAAGAACAGATACTACACTTGATCTTAGCCAAAAGGCCGAGAAGGTATCT
+NODE 2531 179 9151 9103 0 0
+CTTGGATAAGGGTTACAGCTTCAATCATTCAGGATGGTGGGTCGTGCAGGATGACTCGGCTTCGCCTCGCCCTACAGGTTGCTGACGCAACGTTATCCTTCACGTTCTCTACCAGTTACCACCTTGTATATTGGTGGGTCGTGCAGGATTCGAACCTGCGACCAATTGATTAAAAGTCA
+ATACAAGGTGGTAACTGGTAGAGAACGTGAAGGATAACGTTGCGTCAGCAACCTGTAGGGCGAGGCGAAGCCGAGTCATCCTGCACGACCCACCATCCTGAATGATTGAAGCTGTAACCCTTATCCAAGGGGTCGTTAGCTCAGTTGGTAGAGCAGTTGACTTTTAATCAATTGGTCGC
+NODE 2532 16 620 620 0 0
+ACCTGCCTGTCACGCA
+TCTTTGTCACAACCCG
+NODE 2533 8 684 684 0 0
+GGGGGTCG
+ACCGAATT
+NODE 2534 36 102 102 0 0
+TGGTTATTAACCACAACACCTTCCTCCCCGCTGAAA
+CCCCGCAGAAGAAGCACCGGCTAACTCCGTGCCAGC
+NODE 2535 1 176 175 0 0
+T
+G
+NODE 2536 24 1490 1490 0 0
+GGAAATGCAGAGAAAAAACGCCGC
+TACTTGCCATTTTGGACCTGGGCA
+NODE 2537 2 253 207 0 0
+GC
+TG
+NODE 2538 14 1233 1233 0 0
+AGCGGCACGCTGGT
+GGAAAGCGTGAGCG
+NODE 2539 239 9975 9894 0 0
+TGCTGTTCGCCTCCTGCGTTAACGTATTTCCCCGCAATGCGCTGTCTGCGCCAATTGCGGTGGTGGCGTTATCGTGAGTGGTGAGATTTGCCGTAACGAACTGGCCGCTGGCGTTCAGTTGCAGGCTGGCGTAATTGTCGATATCGCCGCTGCCCAGCGCCTCAACGTTGCTGGCGACCAGCGTACCGTCGCTGATAAGGGTGCCGCCGGTATAAGTATTGCTGCCGGAAAGCGTGAGC
+ACGGTACGCTGGTCGCCAGCAACGTTGAGGCGCTGGGCAGCGGCGATATCGACAATTACGCCAGCCTGCAACTGAACGCCAGCGGCCAGTTCGTTACGGCAAATCTCACCACTCACGATAACGCCACCACCGCAATTGGCGCAGACAGCGCATTGCGGGGAAATACGTTAACGCAGGAGGCGAACAGCACCCTGGCCGTACACCTGACCGACAGCAACAGCGGCGCCATCGTCACCGCC
+NODE 2540 1 79 79 0 0
+G
+G
+NODE 2541 1951 101680 100744 0 0
+CGTCGCGCCGCGCGGCCCCTCTAACGGAGCACAATACCAGTCGTCAACCACGCTTTTCAACCAGGCTAACGTGCCGGCGATATCTTTATCATGCAGCATACCAATCACCGCAAGCACGCGCCCGCGTTTCGGCAACATTTTCAGACGACCCGTCAGGTATTCCGCCGCGTGGGGATTATGGGCGACATCAAAGATAACGCGCGGCGACTCACTCACGATTTGAAAACGTCCCGGCAAGGTAGCCTGCGCAATACCGTCGCGAATCGCCTGCTCGTCAATGTTCAACCTGCTGGCGCGCAGCGCGGCCAGAGCGGTGGCGGCATTCGGCTGAGGAACCTGCGGCAACGGCAGTCCGGCAAGCGTGCCGTCGCCATCGGTAAACGCCCACTGGGTCGCTGTCACCTCATAACGCCAGTCAACGCCGCGACGCAGCAACAGCGCGCCGGTCTCCTGCGCGACATCCGCGATAGTTGCCGGCATTTCCGGTTCGCC [...]
+CAATCGCCTGCATAGCCTATTAGATGAAGGTTCCCTTGTGGAGTTGGGTAGCGAGCTGGAGCCGAAAGACGTGCTCAAGTTCCGCGACTCCAAAAAATATAAAGACAGACTGGCGTCCGCGCAGAAAGAAACCGGCGAGAAAGACGCGCTGGTGGTCATGAAAGGGACGCTTCACGGTATGCCGGTTGTCGCCGCCGCGTTTGAATTCGCGTTCATGGGCGGCTCAATGGGGTCTGTCGTTGGCGCACGCTTCGTTCGCGCCGTTGAACAGGCGCTGGAAGACAACTGTCCGTTAGTGTGTTTCTCTGCTTCCGGCGGCGCGCGTATGCAAGAAGCGCTGATGTCTCTGATGCAGATGGCGAAAACCTCGGCGGCGCTGGCGAAAATGCAGGAACGTGGTCTGCCCTACATCTCGGTATTGACCGATCCGACAATGGGCGGCGTTTCCGCCAGTTTTGCGATGCTGGGCGATCTCAACATCGCCGAGCCAAA [...]
+NODE 2542 11 1369 853 0 0
+TCACAGGCCAC
+CAATGCTCCAT
+NODE 2543 32 1578 1578 0 0
+ACCTTCTGGCTGCTCATCCACCACGTTGATAG
+TTTACGTTATTCACAACCAGTCAATGTCTTAA
+NODE 2544 67 2673 2673 0 0
+GCGCTGGGTGATTTCCGCCTGGATGGAGTCGAGGTCAGACTGGGAGTTAGTGCTGTTAGCAGACTGA
+CGGAAATCACCCAGCGCCTGAACGAAATCGACCGTGTATCCGGCCAGACTCAGTTCAACGGCGTGAA
+NODE 2545 17 1103 1103 0 0
+GAAACGGCGGGCATAGG
+AAAAATGCGTTAATGGC
+NODE 2546 55 3232 3171 0 0
+GCGGGCCTGGGGCTGACCACCGCCCTGGTCCTGTACGCGCTGCGCGCGAATATCG
+CCCGCCAGCACCGCGCAGACCACCCATAGCCGGTTTTTACGTCGCAGGTTCACGC
+NODE 2547 4803 250045 244605 0 0
+GCAGCGACTTCCACGGCTGGTGGGGGTCAGTACCGCGCTGGATATGATCCTGACAGGTAAACAGCTTCGCGCCAGACAGGCGCTTAAAGCCGGGCTGGTTGATGATGTGGTGCCGCAAACTATTTTACTGGAAGCGGCTGTCGAGCTGGCTAAAAAAGAACGCCTGGCGCAGCGGACATTACCGGTCCGTGAACGTATCCTGGCTGGGCCGCTGGGGCGCGCGCTGTTATTTCGCCTGGTGCGTAAAAAGACGGCGCAAAAAACGCAGGGTAATTATCCGGCGACGGAGCGGATCATTGATGTGATTGAAACCGGACTGGCGCAGGGCAGCAGTAGCGGCTATGACGCGGAAGCGCGCGCTTTCGGCGAGCTGGCGATGACGCCTCAATCGCAGGCGCTGCGCGCTATTTTCTTTGCCAGTACCGAGGTGAAAAAAGATCCCGGTAGCGATGCGCCGCCCGGCCCGCTGAACAGCGTGGGCATCTTAGGCGG [...]
+GCGCATCAGTTCGTCCAGCGCGTCAAGTTTGTCCGCATCGGGACAAAAGAACGGATTAAGCTCAACCTGACGCCAGTCTTTAATCTCCAGCGGAATATCGCCCATCTGGGTCAGGCAGCCGCGGATTTCGATGCCGAACTTTTCCGCCAGGTATTTCTTGGCAATCGCCCCTGCCGCTACGCGCATCGCGGTTTCACGCGCGGAAGAACGTCCACCGCCACGGTAATCGCGCAGGCCGTATTTCTGCTCATAGGTGTAATCCGCGTGTCCCGGACGAAAAACATCTTTAATCGCGCTGTAGTCCTGCGAGCGCTGATCGGTGTTTTCAATCAGCAGGCCAATGCTGGTGCCGGTCGTCACGCCATCAAACACGCCGGAGAGAATTTTTACCTGATCCGGTTCGCGGCGCTGGGTAGTATAGCGCGAGGTGCCGGGGCGGCGTCTGTCGAGATCGTGCTGCAGATCGGCCTCCGTCAACGGGATGCCGGGCGG [...]
+NODE 2548 2 77 77 0 0
+CG
+CC
+NODE 2549 67 2582 2101 0 0
+GCGATCCCAGCCAAACTGTACCTTTACCCGCCCGTACTGATCCGTCCAGATTTCCTGGCCCGCCGGG
+AGTTTGGCTGGGATCGCTACGGCAAAATGGATGAAAACAGCTCCTGCTGGATACGCGTCAGCTACCC
+NODE 2550 51 1861 1643 0 0
+CCGGTGACGATGGCGCTCTGCGGCCCTTTGGTGTGGGGTTTGCTCACCGTC
+GCCCGGCGGGCCAGGAAATCTGGACGGATCAGTACGGGCGGGTAAAGGTAC
+NODE 2551 51 1523 1430 0 0
+CGCGTAAACGTTGCGATGCCAGTGGAACTCATCGCCACCCTCCGCTGCCGC
+GCCATTGAAATATTCGGTGGCGGAGATTTTCGACAGTATCGATCTCACCCA
+NODE 2552 5 1954 798 0 0
+ACTTA
+CGGGA
+NODE 2553 1 388 155 0 0
+A
+T
+NODE 2554 45 16135 15132 0 0
+ATTTCACAACACGAGCTGACGACAGCCATGCAGCACCTGTCTCAC
+GTTAAGTCCCGCAACGAGCGCAACCCTTATCCTTTGTTGCCAGCG
+NODE 2555 51 2886 2886 0 0
+TGCGGTGGCGAACGTGCCGGGCAAGGAGGATCGAATCCTCACGGCGAATGG
+AACGGCGTGCATACGGTACTGGCCGGGTTTGTTGAAGTCGGCGAAACCTTA
+NODE 2556 51 3333 3333 0 0
+ATGCAGCATTAGCGTATGCGCCCGCTCGCGCTGGATCTGGCGGGCAAAATT
+TGGCGATCCGCAGGGAGAGCCGGAACTGCGCCAGCAAATTGCTCATTATCT
+NODE 2557 51 2284 2225 0 0
+CGCAAGCGGGCGGTACGCTGGTGTGCAATAAAACCCAAAACCCGCCGCTGT
+GGATCTTTACTGGAGCCAACGAAGACCGGGATATCGCTACGCACGGCCGGG
+NODE 2558 1504 84920 84581 0 0
+ACGCACCAGCCAGGCGATCGCGCAGAGATCGTGCATCCGGACGCCAGTGCGCATACTACCACTGCGATAATGGTTGAACAGGCTGTGCAACATCTTACCGGTGCGATTCAGCGCAGGCAGTTTATTCAGAAAATCTGGCGAGAGCATTGCCTGATTCGTGACGTCCAGCCCACACATCACAATCTCAATGCCGCTACGAAATACGTGGGCGGCGGCTTCCGGATCGACAGCAATGTTAAATTCAGCATTAGGCGTAAAATTGCCGCGCCCTGCGGAACCGCCCATCAACACCAGACGGCGAATGTTACACGCACACTCCGGATAGTGCATCAGTAGCAACGCAATATTGGTCAATGGCCCAATCGCCACTAATGTCATGGGCTCCGGGGCGTTCATCAGCACATCCCGGATAGCGATAAACGCAGGCTTCGCCAACGGTTGGCGCTGATGGTCGACAAAATCATAGCCTTCCATACCGGATTCGCCGTGGAC [...]
+GTAAACTCATACAGACCTTAGATACCGCCTCGGTGGGCACTTGTAGCCCGTTTATGCCTCAATGGGGGGATGTCAATTTTGATGGCTACCCGGATCTGTCGATTGTCACAGAGCTACTTGCAGGGCCGGATGCTCCAGTACAAACATGGCTCTATGACCCCGCCAAACAGCGTTATGTTGATGCGCCAGCGTCTTATCAGGAAATCACTTCACCAGAGATCGATGCTGAACATAAACAGATTGTCAGCTATTGGCGCGGCGGTTGCTGCAGTCATGGCGTCAATGTGTATCGCTGGAAAGGAAAAACGATTGAACTGATCGATCGCGGTGAAAGCTACTTTCAGCCTGTGATCAGTAAAGGCAAAATGTATAACTGCTACATGATACCTTCCTACGCTGATGGGCGTATTATTTATCCGCTAGTACGTAAAAATGGTCATTTGACGCCGCCTCTTAGCCTTGATGGGACGTGTCAACCTTTTTGGCTAATCG [...]
+NODE 2559 51 2799 2799 0 0
+CCAAAGTTAATGGCTTTCGCACTTCGGCGCTGTTCCCCGGTCACGCTATCC
+GCCTGATTTACGGGATGAGCGCCTTCGGTCTTTCTCGCCAGCTTAATATTC
+NODE 2560 208 10457 10457 0 0
+CTCAATAAACTGGCACAAAGAAGTATTGCGCACCGCCAGCCAACAGCAGGTTCCGGCGAGTCCTTCCACGCTCTTTTTCACAGGGTATTGCGCGCCATAAAGCGGGATGCGCAGCGTAAACTGGCTTCCCATGCCCGGCTCCGAATCGACGGAAATATCGCCGTCCATCATGCTGATCAATTTTTCGCAAATCGCCAGCCCCAGACCG
+ATATTTCCGTCGATTCGGAGCCGGGCATGGGAAGCCAGTTTACGCTGCGCATCCCGCTTTATGGCGCGCAATACCCTGTGAAAAAGAGCGTGGAAGGACTCGCCGGAACCTGCTGTTGGCTGGCGGTGCGCAATACTTCTTTGTGCCAGTTTATTGAGACCAGTCTGGCGCGTAGCGGCGTTCATACGCAGCGTTATGAAGGGCAAGA
+NODE 2561 51 70 70 0 0
+GAAAGCAACGAATACGCTACCGCCTTGTTCCTCGCAGGCTTTCCCGGCGGA
+CCCCTGCAATGCAAAGGCGGCAAAGCCGATGACGCCGATGTTGCGTACATC
+NODE 2562 10 685 685 0 0
+CAATAACGGG
+TCGTTGCTTT
+NODE 2563 34 4021 3372 0 0
+CGGACGTAACCCTGGCACCTCAAGGGTCAGGGAT
+GCTGCCGGCTGGTAAGCAGAACCGATTTCATGAT
+NODE 2564 1458 85224 84227 0 0
+GTTGCGGTGGGGTTGACGCCGGAAATGTTGCCCATGATTGTCAGTTCCAACCTGGCAAAAGGCGCGATTGCGATGTCGCGGCGCAAAGTGATCGTCAAGCGCCTGAACGCTATTCAAAACTTCGGCGCGATGGATGTGTTGTGTACAGATAAAACCGGCACCTTAACCCAGGACAATATTTTTCTGGAGCATCATCTGGATGTGAGCGGTGTAAAAAGCAGCCGGGTATTGATGCTGGCCTGGCTGAATAGTAGCAGCCAGAGCGGCGCACGGAATGTGATGGATCGCGCCATACTGCGTTTTGGCGAGGGCCGCATCGCGCCATCGACAAAAGCGCGCTTCATTAAACGCGATGAACTGCCATTCGACTTTGTACGTCGCCGGGTATCGGTCCTGGTGGAGGATACGCAGCATGGAGACAGATGCCTGATCTGCAAAGGCGCTGTTGAAGAGATGATGATGGTAGCCACCCATCTTCGCGAAGGCGATCGT [...]
+CGTACCACATCAGCGCAAAGGTTGTGATATCGAAAATAGAAGACGTTGGGCCAATCCATAGCATAAAACGACCAATATTTTTCGCGTCCCATTTCCGCGGCTTACGCAGGAACTCTTTATCCATTTTGTCCCACGGCAACGACAACTGCGAAATATCGTACATCAAATTCTGGATCAACAGATGAATCGCCAGCATCGGCAGAAACGGAATAAACGCGCTGGCTACCAGTACCGAAAAAACATTGCCGAAATTAGAGCTGGCGGTCATATTCAGGTATTTAATGATATTACCAAAGGTTTCCCGCCCTTTGATAACGCCTTCCTCAAGCACCATGAGATCTTTTTCCAGCAGAATAATATCTGATGACTCTTTAGCAATATCGGCGGCGCTATCGACGGAAATTCCCACATCCGCATCACGAAGCGCGGGCGCGTCGTTGATCCCATCTCCAAGAAAACCAACGGTATGACCATTTCTCTGTAGCGCTTGCA [...]
+NODE 2565 11 639 639 0 0
+ACCCTCAATAA
+CAGAAAATACC
+NODE 2566 20 2279 2279 0 0
+AGCCACCAGGGACAACTGGA
+TTAACAGTCCGTCCGGATTC
+NODE 2567 51 2659 2659 0 0
+ACGCGCCAGGCGCTGATCGTGACGCCGCTGTGGTTTATCGCGTTGGGTCTG
+TATCGTCTTCCAGCGTCAGTAATACCAGCACGAACGCAAAGAACGCCATAC
+NODE 2568 14 768 768 0 0
+GCCACGGTGAACGA
+GCCGTCACCGTACC
+NODE 2569 51 65 65 0 0
+ATGTATTGACGATGGCAATAGCGCCAGCGTTTGCGCTGACGGCTGGAATAA
+TTCGTTCACCGTGGCGTAAAACGTCCCATCGCCGTCGTTGTCACTATTGCT
+NODE 2570 71 5781 5370 0 0
+TCCCCCCTTGGTTTGGGGGATACATATAAGCAAAAAGCCCGTACTTCTGTACAGGCTCTCAACTTAAATAT
+ATCCCCCAAACCAAGGGGGGATGAGAACCACCGACCGGGGTTCGACAACTGGCGCAGCCAGTTGGACAGAC
+NODE 2571 2 258 176 0 0
+GG
+GT
+NODE 2572 3 608 402 0 0
+TGG
+GGT
+NODE 2573 47 1934 1753 0 0
+CCGTATTATGGGGGTCACTTATCCCTGTTGGCATTGCATTTCTGTGT
+TCCAGCCATAAAGATTCAGCAACGCACCGGATGAAAACGACCCGACA
+NODE 2574 13 663 663 0 0
+ACCACCTAACAGG
+CCAATATCGCGGG
+NODE 2575 1 118 117 0 0
+G
+C
+NODE 2576 25 806 806 0 0
+TTCAATTGAGACGCTTCCCGTTCCC
+AGGTGACGGCTATCGAGCGTAATCC
+NODE 2577 47 3047 3047 0 0
+TGCCGGCGGAGGATCTAAAGGCAAATTATGGAGCCAAATACTTGCCG
+ACCAGAGAGTCGGCCTGTACGCCGGAAAACGCGGCAATTTGCTGTAA
+NODE 2578 37 2253 2253 0 0
+CTGTATTGACGATGGCAATAGCGCCAGCGTTTGCGCT
+CGTAAAACGTCCCATCGCCGTCGTTGTCACTATTGCT
+NODE 2579 9 502 502 0 0
+GACGGCTGG
+TCACCGTGG
+NODE 2580 5 265 265 0 0
+AATAA
+GTCGT
+NODE 2581 46 2115 2115 0 0
+TGCGAAAACAGAATTTTACGCTAATGTGCCTAAGCAATTGACGCAG
+TCCAGCCGTCAGCGCAAACGCTGGCGCTATTGCCATCGTCAATACA
+NODE 2582 143 5307 5254 0 0
+GCTCGACGCGGATGCAGCAGAGTATCGACCCGGCGATGCGCTCGCCGCTGCGCTGGGCCATCGCCGGCTACCTGCTGCTCTTTATGACGCTGGCGCTGATGCGGATGCGCAACCTGATTTTACTGATGGAAAAACGCCGCCCG
+CCAGCGTCATAAAGAGCAGCAGGTAGCCGGCGATGGCCCAGCGCAGCGGCGAGCGCATCGCCGGGTCGATACTCTGCTGCATCCGCGTCGAGCCCTGGTGCAGGGTGCTCCACCACTCGACGGAATAGTGGATAACCGGCAGG
+NODE 2583 17 3079 3013 0 0
+ACCCCTAACCAGGGAGT
+ACCATTTTTCGCGCCTT
+NODE 2584 12 30 30 0 0
+AGGCCTCAAACA
+CCCCGCCCTGCC
+NODE 2585 51 2492 2054 0 0
+CGCAGTTGTTTCTACCTCTAAAGGTGTTATGACTGATCGTGCAGCGCGCCA
+GATACCCAGACCGGCCATAACTTTCGGCAGCTCATCTTTACGTTTGTAGAT
+NODE 2586 26 1097 1024 0 0
+ACCCCACAGCCCGCCAGCTCCAGCCC
+TTCGACCGACACCGATATGCAGCGCA
+NODE 2587 51 2871 2841 0 0
+ACCAAATGCGCCGTAATGAGATAACACCTGCGCCGCCGATTTCCCGCCCTG
+TTTTGGTAAACCGTTTGCACAATAGGTTACGTCCCTCAATGTAAAGCGACA
+NODE 2588 14 592 592 0 0
+GCTGCTGCTGCCGG
+TTTTCCCGCTTACT
+NODE 2589 28 1490 1490 0 0
+ACGCCGCGCCGCTGCTGGGGATGTTCTG
+CAGTAACAGCACCACCGGAAAGAGGATT
+NODE 2590 23 2274 2274 0 0
+CTTTGGCAATCTGATGCGTGAAA
+TCCGGCAGCAGCAGCGCCACCAG
+NODE 2591 60 2969 2905 0 0
+GATACCAAAGGCAACCACCCCCAGCAGCAGAATGCCCAGCGTCTGCGGCTGCAGGAACTT
+CTTTGGTATCGGGACGGCGGCCGGGGTACTGATGGCGAAGCTGATGAACCTGTGCAGTAA
+NODE 2592 5 245 245 0 0
+GTCCG
+GTTGC
+NODE 2593 1 91 68 0 0
+C
+G
+NODE 2594 1326 81230 80862 0 0
+ATATTCGCGCTACCGTCTTCGTTTTTATATTTTATTCCTGCATCCAGCTGTTTTAACGCCTTGCGAGTGGCGGCGGTCAGGCATTGATCGCCGAGCTCATCACCAAGAAGACTGTCAAGGCTGTCAGGCACGCCGGTGGATTTACTGGGCGTGTATGAGTGGTGAATAACGATCTCCTTGCCCGCCGGAAAACGTTGTTGCCAGATAAAATATTGTTGAACGGCAATATTCAGATAGCCGTCATCAAACCACTCTGACGGTAATTGCTGTTTTCCCTCTTTATATCCTTCTTCAATAGAGGCTTTGCCCTCGCGATTGAGGACATGGCGTAGCTGTGGGATCGTCCAGCCGGTTTGCAGTAGTTTCGCCGTAATGTCTTCTTCACCTTTACCGCCTAAGTCATGGATGACTCGCCAGCGGGACTCGCTTTTAACCGGTTTACCGTCCACGCTGATCTTAAAGTTGGCAATACCTTCTGTACTATCTCCCATA [...]
+AGAATATCGCTTCGCAGCGGGTCGTTGGCTTTTACCGGCTGGCAAATATTTTTGCGCCCTTGCGCGGCGACCTGCTCACGTAAGAGCGCAGACGTTAACGGTACGTTTTTACCATAATGGCAGTGAACATCCTGCGGCGAAGCAATGGTTTTATCAAAGCGCACAACGCTGCCCCAACTCCAGCGATAACCTATCGCCATCACGCGGTCATAAAGATGATATTGATTTTGCCCATCCGTCAGAAAATTATCGTTTTTGTCTTTTATTAAGCCACAAACGTAAGCAATGCTACTGCTTGCTTCAATCCGCCGCAGGTTAAACAGCCCATCCTCAAGCCCTTCTTCATCGCGCAGCGACAGGGCAATATATTTGTGCCAGGTATCACCTTGTGGCAATGGCTTTATTTCTTCGGCAAATGTATTTTGGCAAATTATTAATAATAAAAATAAATAATACCGCATTTTTCTTCCCTCGAAAAACGGCACTCGCCGG [...]
+NODE 2595 12 650 162 0 0
+GTTCTTACTGCA
+GGTGCCGATGGC
+NODE 2596 38 2915 2854 0 0
+AATTTATCAGACAATCTGTGTGGGCACTCGAAGATACG
+GTGCGACGCGGCTTTCAGCTCACCGTCGCGAGGTGGCG
+NODE 2597 12 528 500 0 0
+ACCGTCCTGCCG
+TATAGCGTTCCC
+NODE 2598 27 1366 1303 0 0
+GCCCTGCGACGCGCTGTAGACGGCGGT
+AAAATATGTCGCTCCCTACGTCAACCG
+NODE 2599 117 10268 8300 0 0
+CGGGGAAGGATGAGAAGCTTCGACTAAGGTTCGATTCGAGCGCAGCGAGAAAGCGTTGCCGCAGGCAACGACCCGAAGGGCGAAGCGCGCAGCGCTGAGTCATCCTTCCCCCACCAC
+TGCCTGCGGCAACGCTTTCTCGCTGCGCTCGAATCGAACCTTAGTCGAAGCTTCTCATCCTTCCCCGTACGGAGAGATATGAGACACTATGCTTAACGGGGATAAGATACGCGACGG
+NODE 2600 831 44318 43774 0 0
+CCGGCAACCAGCACCAGACAGCGTTCACGCTCATCGGACGGCAGGGTTATCGACTCTCCAGCCTTCAACTGCCAGACATCAAAACCGACATACTCCCAGCCTGCATTTTGAGGGGAAATGTGTTGGATATTTCCCGACTCAGAGGTACAGGTACTCAGCAAGTTGGCCATAATCTTCTCCTTCCTGAAAGCGTATTAACCGAGAGTCGGCATACTGAACTCCGATACGATCTGCTGTCCGTTCGGCCAACGCGAGGTAACGGTTTTCATCCGGGTATAGAAGCGCACGCCATCCGGCCCATGGACGTTCAGGGCGCCAAACACCGAGCGCTTCCAGCCGCCAAAAGAGTGAAATGCCATCGGAACCGGAACTGGAATATTAATACCGACCATCCCGGCTTCAACCGACTGGGCGAATTCGCGCGCATAATGACCGTTGGTGGTGAAAATCACGCTGCCGTTGCCGAATTCATGGGAGTTTACCGTGCTAATG [...]
+CGGCGCTACGTATCGGCCCGGGAGAGCTGCGCGGCAAAGATGAAAATGAAATGGGCCCGGTTGTTTCACGTGCTCATCAACAGAAAGTGTTGGGTTACATCGACAAAGGAGTTAGCGAGGGAGCAACTCTGGTCATGGATGGCCGCAACTATAGCGTGGCGGGATATCCTGAAGGCTTTTATGTCGGCGGCACTCTGTTTGATAACGTCACGCCTGAGATGACCATCTGGCGTGAAGAAATTTTTGGCCCGGTTCTCGGAATTGTGCGCGTCCCGGATTATGCCACCGCCATTAGCACGGTAAACTCCCATGAATTCGGCAACGGCAGCGTGATTTTCACCACCAACGGTCATTATGCGCGCGAATTCGCCCAGTCGGTTGAAGCCGGGATGGTCGGTATTAATATTCCAGTTCCGGTTCCGATGGCATTTCACTCTTTTGGCGGCTGGAAGCGCTCGGTGTTTGGCGCCCTGAACGTCCATGGGCCGGATG [...]
+NODE 2601 202 10678 10463 0 0
+ATATAGGCCGTTGCGACCAACACGCTCATATTGGTCTGCCGTTGGCGGATACCGTCGATTAAGTCCCAGAACTGAGCGCGGGAGAGCGGGTCCACGCCGGTGGTAGGCTCATCAAGAATCAGCAATTCCGGGTCATGAATCAGCGCACAGCACAACCCCAGCTTTTGTTTCATCCCACCGGACAGCTTCCCGGCAGGACGGT
+TGCTGTGCGCTGATTCATGACCCGGAATTGCTGATTCTTGATGAGCCTACCACCGGCGTGGACCCGCTCTCCCGCGCTCAGTTCTGGGACTTAATCGACGGTATCCGCCAACGGCAGACCAATATGAGCGTGTTGGTCGCAACGGCCTATATGGAAGAGGCGGAGCGTTTTGACTGGCTGGTGGCGATGAATGCGGGCGAGG
+NODE 2602 247 10796 10401 0 0
+GATGAGCATCAATGCGGTGAAAGGCGTGGAGATCGGCGAAGGATTTAACGTGGTGGCGCTGCGCGGCAGCCAGAATCGCGATGAAATCACGGCGCAGGGTTTTCAGAGCAACCACGCTGGCGGCATCCTCGGTGGCATCAGTAGCGGGCAACACATTGTGGCGCATATGGCGCTGAAACCTACCTCCAGCATTACCGTGCCGGGACGTACGATCAACCGGATGGGTGAAGAAGTCGAAATGATCACC
+CGGTAATGCTGGAGGTAGGTTTCAGCGCCATATGCGCCACAATGTGTTGCCCGCTACTGATGCCACCGAGGATGCCGCCAGCGTGGTTGCTCTGAAAACCCTGCGCCGTGATTTCATCGCGATTCTGGCTGCCGCGCAGCGCCACCACGTTAAATCCTTCGCCGATCTCCACGCCTTTCACCGCATTGATGCTCATCAGCGCATGGGCGATGTCCGCATCCAGTCGGTCAAAAACCGGTTCGCCAAG
+NODE 2603 31 131 131 0 0
+TCTTATTTCTCCTGCGCCAGCCGGATACTGC
+TGGCGCCACCGGGCCTGGCTTGTTACTGCAT
+NODE 2604 8 326 298 0 0
+GCTCTATC
+CGGTGGCG
+NODE 2605 32 1604 1563 0 0
+ACCGCCCGCCGGGCGTCACCCGCCGGCAGCAG
+GCTGGCGCAGGAGAAATAAGACCCTGACGGCC
+NODE 2606 111 3100 3100 0 0
+CAGCGGCAGCACCAGAATGCCCAGCAGGACGCCGCCGCGCCGCAGCCCGGCCGTCAGCGCGACGCCCGGCGCGGCGAGAAACCCCAGCGCCGGCGTGCCGAGCAGCAGCGT
+CGCGCTGACGGCCGGGCTGCGGCGCGGCGGCGTCCTGCTGGGCATTCTGGTGCTGCCGCTGAGTGTCCCGGTGCTGATTTTCGCCGCCGCGGCGATGGACGCGGCATCGAT
+NODE 2607 57 87 87 0 0
+GGGCCGGCCTTGAACAAAGCGAAGCTATCGGCGATCGCTTTAATGTGCGTCGGTTTC
+CCGGCCCCCGCCCCCTGCCAGTCAAACTGCGGGAACTCACGCAGGAGTTCGGCAATC
+NODE 2608 57 1840 393 0 0
+TCGGCCACCGCCACCTGCCAGTCAAACTGCGGGAACTCACGCAGGAGTTCGGCAATC
+TGGCCGACCTTGAACAAAGCGAAGCTATCGGCGATCGCTTTAATGTGCGTCGGTTTC
+NODE 2609 51 69 69 0 0
+TCTTTGTCCATCCCATACTTATCACTTTTACGTTCCGTGCTCTTTTTGCCT
+AAAGATGGCATCAGGATGTACAGGCGGTTAAAGCGTCCCTTTAACCGCCAT
+NODE 2610 51 80 80 0 0
+GTCCAGCTTATAAATCAGGATAGCGTGATCATCTTCACGGCTGGAAAAAAT
+CCCGACCACCGGTATGCTGCGCACGCGTGCCTACATTGGCCAGCATATGCC
+NODE 2611 18 561 494 0 0
+ACCCCGCCCGACGATGGC
+TATAAGAATGATTAGAAT
+NODE 2612 791 43865 43731 0 0
+TTGATGTGGGGCCGCTGAACAGCTGGCTGCGTGCGCTGCCAATGTGCTTTGATCCGGATATGGACAGGAAGCAGTGGCACACACGTCTGATGTGGGTACAGCATCTCGCAGGGCTTCTGCCGGTGACCGGCCGGGAAACCGGTACAGGGCATCCCGGCTTCAGTTTTTTTAACCGCGGGGGAGATGTCCTGACGTTTGATCCCCTGAACAAACTGGATCGTACCCAGAATGCCCATCTGTTGCTGTTCGGGCCCACGGGGGCAGGGAAGTCTGCCACGCTGTGTGCCTCTCTGTCACAGGTGATGGCCGTGCATCGTCCCCGGTTGTTTATTGCCGAGGCGGGTAACTCGTTTGGTCTGCTGGCCGATTACTTTGAAAGTCTCGGGCTTTCAGTGAACAAAATCAGTGTCAAACCGGGGAGCGGTGTGACACTGCCGCCCTTTGCGGATGCGCATAAGCTGGTTGAAGAAGGGCAGACCCTGCAGAGTGTGG [...]
+CATCACAGGAGATTTCCCGGAGTGCCACCTGCAAATCTTCCGGCAGCATCTGCCGCCCTTCCCGGTACGTCGCGTGTGTGGCCATCAGCAGCGCTTCACGGATCATCGCCCGGTCCGCACGTTTGAGTGAGGCCTCTTCCTTCGGATCACCGCCGGTGATCATCATCCTGGCAGAGATTTCCATTTCTCCCAGAATGTCGCGTTTCTCCTCCTCTTCATCGCCATCCAGATCGGGCAGCGAGTGCTCATCCACACTCTGCAGGGTCTGCCCTTCTTCAACCAGCTTATGCGCATCCGCAAAGGGCGGCAGTGTCACACCGCTCCCCGGTTTGACACTGATTTTGTTCACTGAAAGCCCGAGACTTTCAAAGTAATCGGCCAGCAGACCAAACGAGTTACCCGCCTCGGCAATAAACAACCGGGGACGATGCACGGCCATCACCTGTGACAGAGAGGCACACAGCGTGGCAGACTTCCCTGCCCCCGTGGGCC [...]
+NODE 2613 179 9555 9465 0 0
+GCTCGCCGTTGATCACCATCGCGACGTTGTCGCCCTTCATCGCTTCGAAAAAGCGCACCACGTTGCCGTTATCGGTTTTCATACCGCTACGCAGGCGATAATCGCCATCTAATGCCTCTGCAATAGCCGGCTCTTCCAGCGGCGTGGCGGCGGTCAGCGCTCCCACGCCTTGCTCAGTG
+CGGCTATTGCAGAGGCATTAGATGGCGATTATCGCCTGCGTAGCGGTATGAAAACCGATAACGGCAACGTGGTGCGCTTTTTCGAAGCGATGAAGGGCGACAACGTCGCGATGGTGATCAACGGCGAGCAGGGCACCGTGAGCCGTATTGATGTGCTGGACAGCGACATCCCAACCGCC
+NODE 2614 3 136 136 0 0
+TGA
+CCG
+NODE 2615 29 1322 1277 0 0
+TGAAAAGCAACACGCCGCTCAACGTGCTG
+TCAACAGCGGCCCGACCACGATACTGGCG
+NODE 2616 314 14278 14079 0 0
+ACCTGGAAAGCGATGTATAACGGCATTAATGAGATGATTGATGATCTGATGGAGCACATCAGCCTGGAGAATAACGTGCTGTTCCCACGCGCGCTGGCCGGGGAATAATCGCCAGCCGGGCATTTTGCCGGATGGCGGCTGTAAACGGCGCCTTATCCGGCCTCCAAATCAACGCTACGCTGTAAGCCCGGTAAGCGCCAGCGCCACCGGGCAAAACAATTAACGCATTCCCGCCATCCGTTTCTTACCTATCAACAGCCAGCCCAGACCCAACGCGATAAACCACAGCGGCGTCACGATCAGCGCCTGGCGCG
+GGCTGGCTGTTGATAGGTAAGAAACGGATGGCGGGAATGCGTTAATTGTTTTGCCCGGTGGCGCTGGCGCTTACCGGGCTTACAGCGTAGCGTTGATTTGGAGGCCGGATAAGGCGCCGTTTACAGCCGCCATCCGGCAAAATGCCCGGCTGGCGATTATTCCCCGGCCAGCGCGCGTGGGAACAGCACGTTATTCTCCAGGCTGATGTGCTCCATCAGATCATCAATCATCTCATTAATGCCGTTATACATCGCTTTCCAGGTGGTACAGGCTTCTGGCGGCGGCGTTACATTTTGGGTGACGTGTTTGATGA
+NODE 2617 4 186 186 0 0
+ATCA
+ACGT
+NODE 2618 47 3494 3494 0 0
+TTTCATCGACGATCTCGCCCAGACGTTGCAACTTAGGCGCGGAAACA
+TGGCGAAACGTCGTTAATACGAGGATGAAAGAATGAAATGGTTTAAC
+NODE 2619 51 3552 3530 0 0
+TGGCTTCGCCAGACATGATCCGTTCATGGTCTTTCGGTGAAGTTAAAAAGC
+AGAGCAATTTTGATCGCATCAAACTCTTCGGTTTTAGTCTGCGCTTTCAGA
+NODE 2620 51 1678 521 0 0
+GTACTTTCTCCATAAACTTCGCCACGCGCGCCTGGTCAACAAAGTTGGCGA
+CGCCATATCCGACAATAAAATGGGGATAAGCAAAACGCTTATCCCCTGCAG
+NODE 2621 51 2727 2727 0 0
+GCCTATCGCCATAATCAAGCCGGTCGTCAATAATACCGGCAACGTCGCCCG
+CATTTATATTCCATTCTCACCTCTGGGCGCGATGGTTGGACTGGAGCCGCT
+NODE 2622 62 3860 3860 0 0
+CCTTTGCATTAATTACTTTATTACTTTCTCATTTTTATAATGCTATACCGACTGACTTAGTC
+TTAATGCAAAGGCATAAAGCGGTAGCGGCATACCAAAGATTTTGAATCTGAGTAAATCGCTA
+NODE 2623 5 166 166 0 0
+GCGGG
+GACTT
+NODE 2624 396 19029 18886 0 0
+GGTATCCGTATGCTCGCTTTTATACGTGGGATCGTTGCTGTTGACCATCACGGCAGCAGGATCGTCTTTATCCGCCAGATTGATACCAATCAGTACCAGAATGGCCAGCGACAGTAGAATGATAACCCAACGTCTGGTTTTACTCATATCGATTGCCCTTTGGCCTCATCCAGCTTGCCCTGCGCCAGCAGCAGCAAATCGCACACCTCACGTACCGCGCCGCGCCCGCCGGCAATGTGCGTCACATAGTCAGCGCGGGGGATCAGCAGCGGATGCGCATCCGCAACGGCAACGCTTAACCCCACTTTTTCCATCACTGGCCAGTCAATCAGATCATCGCCGACATAGGCAACATTTTCCGGCGCAATGGCCAGTTTTTCCAGCAGATCGCTAAAG
+ATGTCGGCGATGATCTGATTGACTGGCCAGTGATGGAAAAAGTGGGGTTAAGCGTTGCCGTTGCGGATGCGCATCCGCTGCTGATCCCCCGCGCTGACTATGTGACGCACATTGCCGGCGGGCGCGGCGCGGTACGTGAGGTGTGCGATTTGCTGCTGCTGGCGCAGGGCAAGCTGGATGAGGCCAAAGGGCAATCGATATGAGTAAAACCAGACGTTGGGTTATCATTCTACTGTCGCTGGCCATTCTGGTACTGATTGGTATCAATCTGGCGGATAAAGACGATCCTGCTGCCGTGATGGTCAACAGCAACGATCCCACGTATAAAAGCGAGCATACGGATACCGTCGTGTACAGTCCGGAAGGCGCGTTGAGCTATCGTCTGATCGCGCAGCA
+NODE 2625 35 1022 1022 0 0
+TGAAGTATGGCCCCGCTGTTGTCGCGGCCTACAAG
+GTGGGCAGGTTTTGAATCCTACCCTGTCGGAAGCC
+NODE 2626 2 96 96 0 0
+CC
+AT
+NODE 2627 2 335 331 0 0
+CA
+GT
+NODE 2628 44 2223 2223 0 0
+CAGGCGCATGATCATCGCCAGTATCAGGCCGGTAATGCGCGCGC
+CTGGCGTCAATCTCGTGGCTGGTCACCTTGACTAAGCCGCTCTT
+NODE 2629 29 1138 1138 0 0
+TGTCTCCCGCTTCTGGCGCGATGTTCGCT
+AGCCCACCCATAATCTGAATCGCATCGTC
+NODE 2630 22 866 866 0 0
+ACGGGCTTCGTCAGTATAACCA
+GCGAACGTATCGGTGGCGGCAC
+NODE 2631 51 3184 3184 0 0
+ACCCCCGTACTGAGTAATCAACTTTGTCACATGTAATGACCTGTTTAGGGA
+TGAGTCCCGCTTTTGCCGTGGTTTCAGCTAATTGGTAACGCACTGTACAGG
+NODE 2632 1 119 118 0 0
+A
+A
+NODE 2633 58 2536 512 0 0
+AGCCCGGTAACCCTAAGCACGGTATCGCGATCGAAACCATCGTTTAGCATGGAGCGGG
+ACCGGGCTGGCGCCTGCCGATCTGGCGTCTGAAAGCCATTAACCTTGCAGAATGGTCC
+NODE 2634 151 6267 6090 0 0
+TTCAGCAACGGCCCGCAGGGCGAGCCACGCAGTGGCGAGTCATCCTCTATCACCGACCAAATTCAGAAACCCTGCTCAGCGAGCAGGGTTTTTTTGTATCTGAAGCCTGACGAGGATGAGAACCTCCGGGGGCAAGAGGTTCGACCCGAGC
+AGATACAAAAAAACCCTGCTCGCTGAGCAGGGTTTCTGAATTTGGTCGGTGATAGAGGATGACTCGCCACTGCGTGGCTCGCCCTGCGGGCCGTTGCTGAAGCAACGTTCTCTCGCTTCGCTCGGGTCGAACCTCTTGCCCCCGGAGGTTC
+NODE 2635 51 1889 1888 0 0
+ACCTTTGTGTACGCGGGACGGTACCAGGTAATCGCGCGCGCCTTCCGGGGT
+TAAATTCTATGCGTTGCCGCAGTCTCCGCAGTTGTTCAAACAGCTCCTGAT
+NODE 2636 34 1282 1282 0 0
+TACTGATGGCGAAGCTGATGAACCTGTGCAGTAA
+AATCCCGAACGCAATCACACCCAGCAGCAGAATG
+NODE 2637 18 1505 1470 0 0
+GAACAAAATCAACCCGCT
+TACCCCGGCCGCCGTCCC
+NODE 2638 51 2584 2344 0 0
+GTTTCTCATCATAGAAACGCACGACCTGCAATGACTTAAATATCAATGAGG
+CGCAACACGCTGGCGTATCTGGCCTACTCCGACAAAGTAGTCGACGGGTCG
+NODE 2639 39 2516 2396 0 0
+TTAACGATAATCGCCAGATGGCGAATTTCACAGGGGCTG
+ACCCGACGGCGGCGTTTCGCAATAAGGTGGTTCATTTTG
+NODE 2640 38 2931 2931 0 0
+AAGCGATGAGGAGTAAGCCGCCTTTAGACGTAATTGGC
+GGATGATCAAAACCGTAACTGATGTTCTTAGGTTAACG
+NODE 2641 13 931 931 0 0
+AAATTAATCCATT
+TTAGCAGCGACCC
+NODE 2642 51 2493 2471 0 0
+TACAGCCGCTGGGGTGGTATCACGATCCGCTGACGGTGGTGATGGCGGGTG
+ACCACTAACTGTGTATAGTGACCTTTCGGGCTGGCCTCAATGACCTGTACT
+NODE 2643 57 6292 6116 0 0
+CCCTCACGGGACACCTTCGCAGGCTTACAGAACGCTCCCCTACCCAACAACACACAG
+GTGAGGGATGCTGGAGGTATCAGAAGTGCGAATGCTGACATAAGTAACGATAAAGCG
+NODE 2644 1120 61493 59809 0 0
+GACATATCGGCAAATGTTATCATCAAAGATAGGATACATGACACGATGCGTGAAAAATCCCGCAGACATCCATATGGTTTAAATGCAATAATCAGCCACGTTTCTAGTCAATAACAATACCAGTACCTGGTTTGCGCAAGGCGAAGGATTATTTTTATGAAGCTTAAGAACACTCTCCTGGCGTCGGCTCTGCTTTCTGCGGCTGCTTTTTCTGTCCATGCAGCAACAGAACTGACGCCGGAGCAAGCGGCTGCACTAAAACCTTATGACCGCATCGTTATTACCGGTCGTTTTAATGCTATTGGCGATGCGGTCTCCGCCGTGTCCCGCCGCGCAGATAAAGAAGGCGCAGCCTCCTTCTATGTTGTCGACACCTCGGAGTTCGGCAACAGTGGTAACTGGCGTGTTGTGGCGGACGTGTATAAAGCCGACGCGCCGAAAGCCGACGCGCCCAAAAATCGTGTCATTAATGGCATCGTGGAATTACCGAAA [...]
+TTATTACCGCGCTCCTGCCACTGACGCGTAATATGATAATACTTAGCGCCTTTCTTCGCCGCGCGTTTGGCGACCTGGTAGGAGATTTCTGTCATATTGCCGTAGTTGCCGGTGAACTTAACGCTGTCGAAAGGCACCATCATCGCAGCCGTCGCTTTATTCAGCTCCTCAACTTTTGTGCCATCCGGTAGTGTGACAGTGTAACGCCCGCCTTTGGAGGATTGCGTTTCGAAGAAACGGCCTACTTCGGCGCTCGGCGAGGCTGACGTGGCGACGCCTGGAATTTCGACTTTCTTCGCAGCTTCGCCGCCCTGAGCCAGCGCGGCGCGGCCAGCTTCAGAGTCTGCCGGAATAGCGTCCGGGCTCTGGACGATGCGTTTTTTCGCATCTTGTTTATAGATAAATGCAGTGATGCGCTGGTTTCCGCCCTGATTCGCATCTATCTGACGAACAATATAGAAAGCGTATGCGCCTTTTTGTTTCGCCGCTTTC [...]
+NODE 2645 51 79 79 0 0
+GTTTATTGGGCGCAAGCACCATCGTTGGCCGCTGCAAGTCCGCAATGACGT
+CCCCTGGCGGCGCAGCTCTACGGCGAAATGAAAGAGTTTTTCCCGGAAAAC
+NODE 2646 51 2931 2931 0 0
+TGAAGGAGCTGAAGGCGGAGATGCCTGACCGCAACTTTGATTACTTGTTAC
+ACCAGCGTCTGGCGCATCGATATAATGCGGTTACGCATCGCGTCGACTTCC
+NODE 2647 24 58 58 0 0
+CGGTCAGCAGCAACCAACACTGGC
+GGTTGCCAGTGTTGGTTGCTGCTG
+NODE 2648 14 14 14 0 0
+GTTTTCTCGCCCTT
+CCCTTGCATCCAGC
+NODE 2649 39 97 97 0 0
+TTAACGATAATCGCCAGATGGCGAATTTCACAGGGGCTG
+CCCCGACGGCGGCGTTTCGCAATAAGGTGGTTCATTTTG
+NODE 2650 3 150 147 0 0
+TCT
+CCA
+NODE 2651 12 469 469 0 0
+AGGCCTCAAACA
+ACCCGCCCTGCC
+NODE 2652 1375 81049 80748 0 0
+CTTGAGTCTGTCGAATCCGATATTCGTCTTGAGCAGAATACCATGGATATGACCCGAATTGATGCGCGCAAGATGCAGATGACGGGCGATCTGATTATGAAAAACTCAGTTACGGTCGGTGGTATTGCAGGGGCGTCCGGGCAGTACGCCGCTACTCAGGAACGTTCCGAGCAGCAAATTAGCCAGGTGAATAACCGTGTTGCCAGCACCGCATCGGACGAAGCCCGTGAAAGTTCACGTAAATCGACCAGCCTGATTCAGGAAATGCTGAAAACAATGGAGAGCATTAACCAGTCGAAAGCATCCGCACTTGCTGCTATCGCAGGCAATATTCGCGCTTAATCTGAAAGGTCATCTATACGCCATCATGGGTGTGATTTAATCGCGCTCCTGATGGCGAACTGGGGATATTATGCTTAATATTCAAAATTATTCCGCTTCTCCTCATCCGGGGATCGTTGCCGAACGGCCGCAGACTCCCTCGGCGAGCGA [...]
+ATGTGGTTTTCAGATTTTCTTCCTGCGCTTTAAAACCCGACTGCCAGGCTTGATATTTGGCGTTATCCATTTCGAGTTTTGAATCTTTTCCCGGCGCGCCTAAACCATCAATATCCTGAACCATTTTTTGTAATGGCGTCAGATCAACGGTGACGACATAACCGGATCCATAAGATTTCAGGCAGCTATTCGGCAAATTCAATTCACTGAGCCACTGTCTCGCTTCCGCTTCAGTAGCTACTTTAACGCCGCTGCCTGACTGCGCTGGGAATAAAACGGTATTACTGTTTATTTGATTATATTTATTGACTAAACTGTTTAAATCATTTTTGAGTGAGGTAACATCTAGCTTAACGGTATTACCGTCCTTACCTGGTAATAACCAGCCTCCCATTTTGGACAGAATGTCACTGAAGGCCTGATAAAAATCGGTATAGACTGCGACAACGTTTTCATAAACGCCCAGATAGCTGTCACCTATCGCCGATATAT [...]
+NODE 2653 51 3294 3241 0 0
+GCCTTCTCGTCTTAATAATTACCCATTATTTTCAATGAGTTGTTAACATCA
+CTATCGCGCTGATTTTAAAGTAATGGTAAGAATTTACACACAAAGTTATCC
+NODE 2654 49 2907 2871 0 0
+GTTAAGCACAGACGCACCCAAGCGGGAATAGCTCAGTTGGTAGAGCACG
+AGCACTTTCAAATTTGGAGCGGGAAACGAGACTCGAACTCGCGACCCCG
+NODE 2655 23 2585 1015 0 0
+GATACACGGTCGATTTCGTTCAG
+AGTCCTGGCGCAGGACAACACCC
+NODE 2656 92 3528 3528 0 0
+GCCGGGGATGCCGCCTGAACCGGCGCAGGCGAAGCCGCCGTCAGCTGGCTGATATCGCCGCCGTCGCTGACCTTCACCACAAAGGCTTTGCC
+GACGGCGGCTTCGCCTGCGCCGGTTCAGGCGGCATCCCCGGCTGCTCCGGCAGGCGCCGGCACCCCGGTCACCGCGCCGCTGGCGGGCAACA
+NODE 2657 10 610 610 0 0
+CGGAAACCAT
+TGGCGAAGCC
+NODE 2658 51 53 53 0 0
+CAAAGCGGCTGGTGGAAAGCTACCCGGTACGTACCTGGCAGGTGCAGTACG
+GCCACCGGGTAGGGGTATTCCGCCAGCACTTCATCCAGAATATCCACCACG
+NODE 2659 8 248 248 0 0
+ACCAGCGG
+TTCGGTGC
+NODE 2660 68 162 162 0 0
+AGGGGAAAGGAAAAAAAAGCGAGGCCAGCGTCACCATTGATAAGGCTATTGATGACGTTCGTCCCGAC
+TTTTTTTTCCTTTCCCCTTTTTCCCCGCCTCTTTTTCGATGGTGATGACCTCATGGCCGGCCTGACGG
+NODE 2661 897 37565 37162 0 0
+CCAACATTGCGCGCGAAATTGTGCTGGGTACGGGGATGAATGTTCATACCGATGCCTATAGCGTAAGCCGCGCCTGCGCCACCAGTTTTCAGGCGGTAGCGAATGTGGCGGAAAGCCTGATGGCCGGCACGATACGCGCGGGTATCGCTGGCGGCGCAGATTCGTCGTCGGTACTGCCAATAGGCGTGAGTAAAGCCCTGGCGCGGGTACTGGTTGATGTCAATAAAGCCCGGACGACCCGCCAACGGCTGACGCTTTTTTCTCGTCTGCGCTTACGCGACCTGCTGCCCGTTCCTCCCGCCGTTGCTGAGTATTCCACCGGTCTGCGCATGGGCGATACCGCCGAACAGATGGCGAAAACGTATGGTATTACGCGTGAACAGCAGGACGCGCTGGCGCATCGTTCACATCAGCGCGCCGCGCAGGCATGGGCGGAGGGCAAACTGGCGGAAGAAGTGATGACGACCTATGTGCCGCCGTATAAAAACCCCT [...]
+AGTTGTAAGTTCGCCAGAGTCTGAGCGGCAAACGCTTCATGCATGTCGAAAAGCGTCAGATCGGCCATCGTCAACCCGGCCCGCTCCAGCGCCAGCGGCGTTGACCAGGCCGGCCCCAATAGCATGTCCTGCCAGACATCAATAGCGGTAAAGGCGTAGCTGCGCAGATAACCAAGCGGGTGCAGCCCCAGCTCTTTAGCGCGGGATTCGGTCATCAGAATAACGGCGGCAGCGCCGTCGGTCAGCGGTGTACTGTTGGCGGCGGTCACGGAGCCATGTTTTCTGTCAAAAGCGGAACGCAGTTTAGCGTAGTCCGCCAGCGTGGAGGCGCCGCGAATGTTGTTGTCTTCTGCAAAGGGGTTTTTATACGGCGGCACATAGGTCGTCATCACTTCTTCCGCCAGTTTGCCCTCCGCCCATGCCTGCGCGGCGCGCTGATGTGAACGATGCGCCAGCGCGTCCTGCTGTTCACGCGTAATACCATACGTTTTC [...]
+NODE 2662 51 2324 2224 0 0
+ACCCGGCAGGGTAGCTATAACACGCTACAGTTTGAAATTCGCGGACAAATT
+TTTTATCGAGCAATGGCGTGACCCTGAGTGTGGCGGCGTTCAGCCGGGGTT
+NODE 2663 4 225 225 0 0
+ACCG
+GGCG
+NODE 2664 6 444 437 0 0
+CGATGT
+ATCGTC
+NODE 2665 104 11913 8157 0 0
+CTGGATGATTTCGATTTTACGAAGCCACGTTCATTGCTGGCAAACACGGTGGCAAACCCGCGTGAAACCGGTCATGCCACCTACGAGCATTATGAGTGGCCGGG
+TGCCACCGTGTTTGCCAGCAATGAACGTGGCTTCGTAAAATCGAAATCATCCAGCACCCACTGTCCAGTCCGCAGACTCTCGTTTGCCGTGATAGTGTGGATAA
+NODE 2666 4067 244725 243690 0 0
+AAGACGTTATCATCCTGCTCGACTCCATCACCCGTCTGGCGCGTGCCTACAACACCGTGGTGCCGGCTTCCGGTAAAGTATTGACCGGTGGTGTGGACGCTAACGCCCTGCATCGTCCGAAGCGTTTCTTCGGCGCGGCGCGTAACGTGGAAGAGGGCGGTAGCCTGACTATCATCGCGACGGCGCTGATCGATACCGGTTCCAAGATGGACGAAGTTATCTACGAAGAGTTTAAAGGCACCGGTAACATGGAGCTGCATCTCTCGCGTAAGATTGCTGAAAAACGTGTCTTCCCGGCTATCGACTACAACCGTTCCGGTACCCGTAAAGAAGAGCTGCTCACCACTCAGGAAGAGCTGCAGAAAATGTGGATCCTGCGTAAAATCATCCATCCGATGGGTGAAATTGACGCGATGGAATTCCTCATTAACAAACTGGCGATGACCAAAACTAATGACGACTTTTTCGAGATGATGAAGCGCTCATAACCTG [...]
+TGATTGCCCGTCACCATAAGGATTATGGGCGCGGCTCATGGTTTGATATTCATTTTCGTCGTGCAGCAGACGCATAACTTCCGCCACAATGCGCCGGGAATCCGTGCCGATCAGTCTTACCGTACCAGCGGTAATGGCTTCCGGACGCTCTGTGGTTTCACGCATGACCAATACCGGCTTACCTAATGACGGCGCTTCTTCCTGAATACCGCCGGAATCGGTCAGAATGAGCCAGGCGTGATTCATCAGCCAGACAAAAGGTAAGTAGTTCTGCGGCTCAATCAGTACCACGTTTTCAACATGGCCGAGGATACGGTTGACAGGTTCGCTGACGTTGGGATTGAGATGCACCGGATAGACAATTTGCACATTCTGGTTCGCGGCGGCGATTTCCGCCAGCGCCTGGCAGATATGCTCAAAGCCCTGACCAAAGCTTTCACGCCGATGACCGGTCACCAAAATCATCTTCTTATTCGCGTTGAGGAAAGGATA [...]
+NODE 2667 30 2343 2343 0 0
+GTAAAAAAGCGCCCTAAAGGCGCTTTTTTG
+TCGAACCTGCGACCAATTGATTAAAAGTCA
+NODE 2668 51 2609 2578 0 0
+ACCCTAACGATTATTCCGCCAGTAATCTTCTGCTTCCGCGTGGGGCTATCA
+TTATCCGGAAACTCGCCATAAGCCAGCAGGTTCATGCTCGATAACCCGCCG
+NODE 2669 11 1455 528 0 0
+ACCGACGGCAG
+CACGCCGGGGG
+NODE 2670 34 2430 2430 0 0
+TGCGCTGTCCGTGTCCAAACTGGCTGCGCCAATA
+CACGTAGTACGTGAGGATTTTGAGCACTGCCCAG
+NODE 2671 10 646 633 0 0
+TTAGATGCCT
+ACCTCTTTTT
+NODE 2672 1 77 40 0 0
+G
+G
+NODE 2673 3 124 124 0 0
+CGG
+GGT
+NODE 2674 7 311 311 0 0
+CGACGTC
+CGCTGAT
+NODE 2675 1 45 45 0 0
+A
+C
+NODE 2676 1 90 90 0 0
+C
+G
+NODE 2677 690 49537 45293 0 0
+GCATTTACCCGCTGACGGCTATCTGGCGGTGCTGGGGGCGCTGCTGGCGGGCAGCGCGACGTTAAGCCCCTTCGCCACCGCGGCGGCGCTGCGCCTCAGCGTGCAGTAGCGCCCCGGCGCGACGGACATTTTACTGGTTTCAGGAGGTCAGGTGACAACGATGTGGAAAACCCTTCATCAGCTGGCGGCGCCGCCCCGGCTGTATCAGATTTGCGGCAGGCTCGTGCCGTGGCTGGCGGCGGCCGGCATCATCGCGCTGGCCACCGGCTGGGTCCGGGGCTTTGGTTTCGCCCCGGCGGACTACCAGCAGGGGGAGGGCTACCGCATTATGTACCTGCATGTCCCGGCGGCCATCTGGTCAATGGGTATCTATGCGGCGATGGCGGTGGCGGCGTTTACCGGGCTGGTCTGGCAGATGAAAATGGCCAGCCTTGCCGTCGCGGCGATGGCGCCGGTGGGGGCGGTGTACACCTTCATCGCGCTGGTCACCGG [...]
+GCCCGCCGCGCGCCCGGCCATTTTACGGTCGTCAAAGGCGTGCCACAGGGCGATGACCCCGGCGTAGAGAAACAGCAGCACCAGCTCCGAGGTCAGGCGCGCGTCCCACACCCACCAGGTGCCCCACATCGGTTTGCCCCACGCCGCGCCGGTGACCAGCGCGATGAAGGTGTACACCGCCCCCACCGGCGCCATCGCCGCGACGGCAAGGCTGGCCATTTTCATCTGCCAGACCAGCCCGGTAAACGCCGCCACCGCCATCGCCGCATAGATACCCATTGACCAGATGGCCGCCGGGACATGCAGGTACATAATGCGGTAGCCCTCCCCCTGCTGGTAGTCCGCCGGGGCGAAACCAAAGCCCCGGACCCAGCCGGTGGCCAGCGCGATGATGCCGGCCGCCGCCAGCCACGGCACGAGCCTGCCGCAAATCTGATACAGCCGGGGCGGCGCCGCCAGCTGATGAAGGGTTTTCCACATCGTTGTCACCTG [...]
+NODE 2678 51 2037 466 0 0
+TTTCGCTCATTTCCGTCATTTCTACCATCGGTATCGCGCTGGGCGTGGCGG
+ACCATACCGCCGCGCCGCCGTCCACGGCTGAAACGCAAGCCAATTAACAAT
+NODE 2679 77 2731 2731 0 0
+TTTTGCGTGTGCGGTAACTGTAAAACCGTAGGCCTGATAAGCGCAGCGCCATCAGGCAACCGGCACCGCCGGATGGC
+GGTTTTACAGTTACCGCACACGCAAAAAAGCCCGTCCAGACGGACGGGCTTCTTCACTTGTCTGATGCCTGGCAGTT
+NODE 2680 2289 123624 123142 0 0
+AACCTCATGTAAGCGGACAGCGCGGTGGGGAAAGCGGGAACACGGGCGAATGGTCTAACGTATTTCGACGTTTTCCGGCGTCCCTGCCTGTTCAGGCATCCGTTTATTCGCATGGGAATAAATGGATGCGCATAAAGAGAGAATATTATTGCGCGGCTAACCAGAAAAAATTGAATTAATTATCCAGCTCGCTCATATTTTTCAGCTGATCGCGATTAATCTGTTCGGTTTTCCCGGTGGCGGCGTTTTTGTAAGACACCATACCGGTATCGTTATCGACCTCGGGTTTCCCGTCGGTGACAATAGTTTTGCCATCCGTGGTTTCAACCGCCTGGTTAGAAGAGCATCCTGCGACGGTGAATAGTGTTGCTGCGGTAAACAGTGCGGTCATAAGACGTTTTTGCATGGTGTTCTCCCTGCTTTTCAGTTGTTTTAGCATGTGACTGTTAACTGTAGCGTTATTGGCGAAAAGCAGGGAGAAATGCAGAACAC [...]
+TGGGCGTCAATAAGTTCAATGTGGATGAAGATAGCCCGCACATCATTCTCAAAACCGATCCTGATAAACAGGCGCTGGAGGTGCTGATTAAGGCCTGTCCGGCGGGACTGTATAAAAAGCAGGACGACGGTAGCGTTCGTTTTGATTACGCCGGGTGCCTGGAGTGCGGAACGTGCCGGATCCTCGGCCTTGATACGGCGCTGGAGAAATGGGAATACCCACGCGGGACGTTTGGCGTGGAGTTCCGCGACGGCTAATAAGTACGAAGTTGTGCCCCCGTTGGCCGGATAAGATGCGGTAGCGTCGCCATCCGGCAATCATGTGGCGCCAATGCCGGATGGCGGCGGAAACGCCTTATCCGGCCTACAGATGACGCTTTGCCCGTGTTGAAACAGGACATCACCATGCCGCAGCCCAGGAACTTTGACGACCTTAAATTCTCCTCCATCCATCGCAGAATTATGCTGTGGGGAAGCGGCGGCCCGTTCCTTG [...]
+NODE 2681 51 2193 2193 0 0
+CAATAATCCGCTAACGATGTCATCGCCATCCTGCAGCCATACATTGAGTAA
+GCTTTTTCTTGCACCGGCATGTGGGTTAATTATTCGCTTTATGGTGGGATA
+NODE 2682 73 4143 4143 0 0
+ATAAATCAGCGCGGCAAGGATAACCATTCCCGTAAATGAAGAAACCGCGGAAAAAGCCCCCATCACCTGACCG
+TTATCCTTGCCGCGCTGATTTATTTACTCAATGTATGGCTGCAGGATGGCGATGACATCGTTAGCGGATTATT
+NODE 2683 7 305 288 0 0
+TTTTCAA
+ACCAGCC
+NODE 2684 277 14423 14382 0 0
+TGAGCGCTGGCACGCGTCCGGTGAGCGAGCCTGGCACGCTCTCCCGGCTGACCACCGTTTGGATGCGCAGCTTGCCTTCATAACGCTGTTGCAGTTCCAGCATTAGCGGCAGATAGCTTAAATCGGCGGCGAAGCGTGCGGCGTGGACTAAGACCAGATTTTTAAAGCGCGCGACATCCTGGCCATATTGCAGAATAGACAAATACGGGCCAATAGCGGTTCCGGTTGCCAGCATCCATAGCGTCTCGCAGTCAGGCACTTCATCCAGTACAAAGAA
+AACCGGAACCGCTATTGGCCCGTATTTGTCTATTCTGCAATATGGCCAGGATGTCGCGCGCTTTAAAAATCTGGTCTTAGTCCACGCCGCACGCTTCGCCGCCGATTTAAGCTATCTGCCGCTAATGCTGGAACTGCAACAGCGTTATGAAGGCAAGCTGCGCATCCAAACGGTGGTCAGCCGGGAGAGCGTGCCAGGCTCGCTCACCGGACGCGTGCCAGCGCTCATTGAAAACGGCGAGCTGGAAAAAGCCGTTGGATTACCGATGGATAAAGAG
+NODE 2685 154 8694 8500 0 0
+AGAACTCCCCTGGCCGACCATTCGGCATCCAGTTCAGCTTCGCGATCGGTATAAAAACTGTCATGGCTGCGTACCAGCCCGCAAACGGCAGAGATGTTCATCTGTTTCGCCTGCTGTATCAGCGTGGCGGTAAGATACGGGTCCGCACAGGCCG
+CAGATGAACATCTCTGCCGTTTGCGGGCTGGTACGCAGCCATGACAGTTTTTATACCGATCGCGAAGCTGAACTGGATGCCGAATGGTCGGCCAGGGGAGTTCTCGGCGCGGATATGGAAACCGCCGCGCTGATGGTGGTGGGGGCGTTACGTG
+NODE 2686 51 2185 2131 0 0
+TGGGCGTTCAGCTCCAGCCGCAAGAAGACCTCGCGGGCTGGTTGACCGCCG
+AGCGTAGCGCACAGCGTTTGCCATTCCTCAGTAAGCGCTTGCTCCTCCTGC
+NODE 2687 1276 71808 70594 0 0
+ATCACCACCTCAGATGACTTAATCGACTTCCTCACCCTGCCGGGCTATCGCTTACTGGCTTAATTCACCACATAACAATATGGAGCATCTGCACATGAAAACCCGTACTCAACAAATCGAAGAATTACAGAAAGAGTGGACACAACCGCGCTGGGAAGGCATCACCCGCCCGTACAGCGCGGAGGAGGTGGTGAAATTACGCGGCTCGGTTAACCCGGAGTGCACGCTGGCGCAGCTCGGCGCCGCGAAAATGTGGCGGCTGTTGCACGGTGAAGCGAAAAAAGGCTATATCAACAGCCTTGGCGCGCTGACTGGCGGTCAGGCGTTGCAGCAGGCGAAAGCCGGTATTGAGGCGATTTATCTTTCAGGCTGGCAGGTGGCGGCAGATGCCAACCTGGCATCCAGCATGTATCCGGATCAATCGTTGTACCCGGCAAACTCTGTTCCGGCGGTAGTGGATCGGATCAACAACACTTTCCGTCGTGCAGATCA [...]
+AGTGTTTCATGCCCTCGCCCTGAGCGTATGCATGCGCCAGGTCAAACATGTTGAACCACATGCTGTGAATACCCGCCAGGGTAATAAACTGGTATTTGTAACCCATGTCCGACAACTGCTGCTGGAAGCTGGCAATGGTCTTGTCGTCCAGATTCTTCTGCCAGTTGAAGGATGGTGAACAGTTATAGGCCAGCAGTTTGCCCGGATACTTCGCGTGGATAGCATCGGCAAAACGACGCGCCAGTTCGAGATCCGGCGTAGAGGTTTCGCACCATACCAGATCGGCATACGGGGCATACGCCAGACCGCGGCTGATCGCCTGCTCAATGCCCGCATGGGTGCGGTAGAAACCTTCGCTGGTGCGTTCGCCGGTAATAAAACTGCTGTCATAGGGATCGCAGTCGGAGGTGATCAGATCTGCCGCATCCGCATCGGTACGCGCAATCACCAGCGTCGGGACGCCCATCACATCAGCGGCCAGACGCGCAGCAA [...]
+NODE 2688 5 297 297 0 0
+CCAGA
+CCGGT
+NODE 2689 107 439 439 0 0
+TTCTTCTTGCTATCAGGGTTTGTACAGTTTCGGGTGGCGGCGACATCAGTCAAAACCCTGATAGCAAGAAGAAATTTAGGATTGTACCTACAGGAACAATCCTAAAT
+GGTTTTGACTGATGTCGCCGCCACCCGAAACTGTACAAACCCTGATAGCAAGAAGAAATTTAGGATTGTTCCTGTAGGTACAATCCTAAATTTCTTCTTGCTATCAG
+NODE 2690 3 108 108 0 0
+GCG
+GGT
+NODE 2691 1246 71464 70670 0 0
+TTACCGCAGGCGTTACCGCGCGCGACAACTGGAATTATATTCCCATCCCTGTGCTGTTGCCTTTAGCGTCGATAGGCTATGGTCCCGCTACCTTTCAGATGACCTACATTCCGGGTTCGTATAACAACGGAAACGTCTATTTCGCCTGGATGCGTTTCCAGTTTTGACGGGGAAGGGCATTCTTCAGTTGTGAATTAAAAAGCCTTAAAAAACAATAAGTAGATAGAGTTAGCTAAAAATTAACGCGATATTTATCACTTTTTCGCAAAGTTCGACTGGACAAAATGCATCACAATTGTTGTACTGGTATCCGACACAGCATTTGTGTCTATTTTTCATGTAAAGGTAATTTTGATGTCTAAGATTAAAGGTAACGTTAAGTGGTTTAATGAATCCAAAGGATTCGGTTTCATTACTCCGGAAGATGGCAGCAAAGACGTGTTCGTACACTTCTCTGCAATCCAGACCAATGGTTTTAAAACTCTGGCTGAA [...]
+GATACGCCGCGGTCCGCCGCCTGAGCCATTAACGAAACGCAAACTTGCGCATTCTTTTCCCATACAGAACTCACCACAAACTGCCCGGCTGCAACGAACATATCCCCTCCCACACCTCTGTCAGGACTCGCCAATTATGCGTGTTCGGCGTTACACTCCTCTTGTATAGCAATTAAATAAAGGATTCGGCAGTGTTACAGCTTCTTTTAGCAGTTTTTATCGGCGGTGGAACGGGGAGCGTAGCCCGGTGGATGCTAAGTATGCGTTTTAATCCGCTTCATCAGGCGATTCCCATCGGTACGCTAACAGCAAATTTGCTTGGCGCGTTTATTATCGGCATGGGGTTCGCCTGGTTTAACCGCATGACACATATCGATCCGATGTGGAAAGTGCTCATTACGACCGGCTTTTGCGGCGGCCTGACGACCTTTTCTACTTTTTCTGCTGAAGTGGTATTCTTGCTGCAAGAGGGGCGCTTTGGCTGGGCGCTGC [...]
+NODE 2692 51 71 71 0 0
+GATGCGCCGCCGCCCTGCCGCAAATAAACCCGGCATCAAACGTCAAATATG
+CCCCGTTATTGTCCGCCGGGAAAGCCTGCGAGGAACAAGGCGGTAGCGTAT
+NODE 2693 27 1078 935 0 0
+TTCCCCGCTTTATCTTCGACTGACACA
+AGGTCACTGTCGATACCCAAATCGGCA
+NODE 2694 220 11715 11590 0 0
+GTGCGCAAAGTGGGGCAAAACCTCAAGTACGATCGCGGCGTCTTGCAAAATTACGGTATTGAGCTGCGCGGTATCGCCTTCGATACCATGCTTGAGTCTTACATTCTGAACAGCGTCGCCGGACGCCATGATATGGACAGCTTGTCCGATCGTTGGCTGAAGCACAAAACTATCACCTTTGAAGACATTGCCGGTAAAGGTAAAAACCAGCTCACCTTTA
+GTTTTGTGCTTCAGCCAACGATCGGACAAGCTGTCCATATCATGGCGTCCGGCGACGCTGTTCAGAATGTAAGACTCAAGCATGGTATCGAAGGCGATACCGCGCAGCTCAATACCGTAATTTTGCAAGACGCCGCGATCGTACTTGAGGTTTTGCCCCACTTTGCGCACTTTTTCATCTTCCAGCAGCGGCTTCAGCAGTTCCAGAGCACGCTGGCGGG
+NODE 2695 4 217 217 0 0
+TAAC
+GAAA
+NODE 2696 16 846 820 0 0
+ACCCGCTACACAGGCA
+TTTTACTCATCTCACG
+NODE 2697 51 2614 2002 0 0
+ACCTGTTCTATACCCCCGGCGAAATCCTCTACGGCAAGCGCGAGACGCAGC
+TCGATATTCGCGCGCAGCGCGTACAGGACCAGGGCGGTGGTCAGCCCCAGG
+NODE 2698 47 2130 1954 0 0
+TCCCCTGCCACAAGCAGTCTGAACAATCTTTGCGATTGGTCACTGAT
+AAAGGATGGCCCGTACCGAAATTTGGTTACGTTTAATGTACGTCGGC
+NODE 2699 139 6466 6466 0 0
+TAACGACGCCGTGCTGGAACTGAACACCGGCGGCACGTTCGATAACGTCATCAGCGGCAGCGGCAAAGTGGAAAAATCCGGCGACGACGCGCTCACGCTTTCCGGCAGCAATACTTATACCGGCGGCACCCTTATCAGC
+CGTCGTCGCCGGATTTTTCCACTTTGCCGCTGCCGCTGATGACGTTATCGAACGTGCCGCCGGTGTTCAGTTCCAGCACGGCGTCGTTAGTGACGTCGCCGCTGCCCAGCGCCTCAACGTTGCTGGCGACCAGCGTGCC
+NODE 2700 18 934 888 0 0
+ACCGCCCAGCACCGCCGC
+TCTGATTTTGGGCGTCGC
+NODE 2701 9 396 386 0 0
+GACCCCGCC
+ATCGCCGCT
+NODE 2702 21 682 659 0 0
+CGATGATAGCGGCGATGACGA
+GTCGGGCGGGGTTACATCGTC
+NODE 2703 113 5933 5933 0 0
+AGGCTATACCTTCACGCTGATGAATCACCCTACGGCAGAACTCAACCAGGAATATCTGTTGGCGCAGACCTTGCTGTTTGTGCAGGACAACGCGCAGCACAGCGGGCAGGACC
+GCCAACAGATATTCCTGGTTGAGTTCTGCCGTAGGGTGATTCATCAGCGTGAAGGTATAGCCTGTCATGAGTGTGCGGATATTCCCTCCCCCCAGCACCCGACTGCCGGGGCT
+NODE 2704 46 71 71 0 0
+GGCGCTTTGGCATGTTCATCGGATGCAGTCAGTATCCGCAATGTGA
+CCGCAGCCCCAGCGACCGAACCGCCAGGTGAGCGAGTGGGCGAGGA
+NODE 2705 8 704 704 0 0
+TCCGGCGA
+ACCGCCGG
+NODE 2706 79 3511 3511 0 0
+TAAGACGCTCACACTCTCCGGCAGCAATACTTACACCGGCGGCACCACCATCAGCGGCGGCACGCTGGTCGCCACCAAC
+TATTGCTGCCGGAGAGTGTGAGCGTCTTATCGCCGGATTTCACCACGCTGCCCGTACCGCCAATGTTGTTGGCGAAGTC
+NODE 2707 91 3746 3671 0 0
+TGCTCAGCTCCAGCGTGGCGTTGTCGGTGACGTTGCCGGTCCCCAGCGCCTCAACGTTGGTGGCGACCAGCGTGCCGCCGCTGATGGTGGT
+GACCGGCAACGTCACCGACAACGCCACGCTGGAGCTGAGCACCGGCGGTGACTTCGCCAACAACATTGGCGGTACGGGCAGCGTGGTGAAA
+NODE 2708 5 225 225 0 0
+GTAAG
+GTTGA
+NODE 2709 51 2847 423 0 0
+TTAAGGGTTAAGCTATTGCTGTCGCCAATATAACTGGCGCGCAGGCCGTTC
+ACGGCCCGCTGCCGACGGTAAAATTTATCGTCGAAGACCTTTGCGCCACGG
+NODE 2710 51 2513 2513 0 0
+TCACTGAGCAAGGCGTGGGAGCGCTGACCGCCGCCACGCCGCTGGAAGAGC
+ACTTCTGTCGAGGAACCAAACCAGTTCCATGGATTTGCGGCAGACCAGTTG
+NODE 2711 48 2609 2534 0 0
+ATTACAATCTCTATTCCAGTAATACGGTGCGCACCATCCAGTCGGCAA
+TGTATATCGGCACTAAAGGCTTTACCCAGCGCTCTGGCATCTTGCGCA
+NODE 2712 1718 93222 90989 0 0
+GATTTTCAGCTACCTCTTTTTCACCCGGCATCAACTTGCCTAACGCTCGTAACTCACGACCGCCCAGTTTTTTGAGCTGCGCTTCCGTCATCGGTAATCCCGCCGGTACCTGCGGACCGCGGCTTTGCTCACGCATAAAGCGTTTCACAATACGGTCTTCCAGCGAGTGGAAACTGATGATTGAAAGCCGCCCGCCTGGGGCCAGTACGCTGAGCGAGCTTTTTAGCGCCTGCTCTATCTCCTCCAGTTCACTGTTTACCCAGATGCGCACCGCCTGGAAGGTACGGGTCGCGGGATGTTTGAATTTGTCTTTTACCGGGGTCGCCGCCGCAACCACCTCCGCCAGCTCTTTGGTGCGGGTCATCGGCTGTTCGCGATTGCGCTCAACAATGGCGCGAGCAATACGTTTGGCAAAACGCTCCTCGCCGAATGTTTTCAGCACCCAGGCGATATCCGCCTCCTCCGCCGTTTGTAACCACTCGGCGGCAGACT [...]
+AACAGGCACTGTTAACACGGTGCAATATGTCCTAAAATGCCGCTCGCGTCGCAAACTGACACTTTATATTTTTCTCGGATTATATTGAGTCCGTTTTAAACGGCGGTGGGTCTTTGGTTTTTTTCTTACAAATATTCATAACGTTAATTTGACTTGCACGCTGGGTGGAAATTAATCAACGCAGATATTCGCCGTAAACATTGGCTTTTTTACTTAGGTAAGCGTTGTGACTTGCTTGACAAGCTTTTCCTCCGCTCCGTAAACTCCTTCGAGTGGGAATTTGTGGGATAAAGTGGTAAGAAGGGGTGAGACTGGCATGTTCCGGGGGGCAACGTTAGTCAATCTCGACAGTAAAGGGCGCCTGACCGTGCCGACCCGTTATCGGGAGCAACTGATCGAGAGCGCTACCGGTCAAATGGTATGTACCATTGACATCCATCACCCATGCCTGCTGCTTTACCCCCTGCCTGAATGGGAAATTATTGAGCAAAA [...]
+NODE 2713 20 1061 828 0 0
+TGATGCAGAGTAAACAGATA
+ACCAGCCGGTGACTTTCCAT
+NODE 2714 51 1925 1803 0 0
+ACCACCGCCGGAACCGGTTCTGAAACCACCAACGTGACGGTGATTATCGAC
+TCGGCACCGCAATCAGCGGCAGACGCGGGCGTAATGTGCTGCGATCGGTCA
+NODE 2715 51 66 66 0 0
+GATCCAGGCGGCGACGCGCCACCCGCTCACCCAAGAGATCGCTTTCACAAA
+CCCCGCCGCACGATCAACCCGGATACGTTGATTCGTAACCTGGCGGAGCTC
+NODE 2716 51 2760 2712 0 0
+TGATGTACAGCTTGAAGATCTGCTGAAAGATTACGATGCGGTATTCCTTGG
+ACGACCCACTTCGGTATTAAGTTTGAACTCAATACCCATGCCGGTGAAGAT
+NODE 2717 51 2244 2244 0 0
+ACCGCCAGCGCGCTGGCGACAAACTGATGATGTAAGACCTGATACATGGTT
+TAAAAGCGGCACGTCGTATTAATCCACAGATGAAAGTGGGCTGCATGCTGG
+NODE 2718 84 4669 3882 0 0
+ACGATAAAGACCATTGACCGCCTTTATCACCAGTCATGTATTGGCGCAGTCCGCTGGGGGAATCTGCCGGATAATGCCCGGGAG
+ACTGGTGATAAAGGCGGTCAATGGTCTTTATCGTCTCTTCATCCAGTACGGCATCTTTTACCAGCAGCCCCAGCCACTGTTCAA
+NODE 2719 9 1046 1046 0 0
+GGTTCCCGA
+AAATGTTGG
+NODE 2720 18 1083 1059 0 0
+CCCACTAAACTAGTTTGC
+AGGTGTGACACGCCTCGC
+NODE 2721 51 85 85 0 0
+TGCTGCGAGTGGTTGATATCCCGGGACCTTATAATCCCGTGGCTGAATATG
+AAATTACCCTGCCGTAGCCTGGGAGCATAGCTGGCATAGCCGATAAAGATA
+NODE 2722 9 421 404 0 0
+ACCCGCGCC
+TGCTGATGT
+NODE 2723 44 1932 1932 0 0
+GCACTCGGCCAAAGGGCTGGAGTTTCCGCAGGTGTTTATCGTCG
+ATCAGCTGTACCGCATCCTGCCAGGTATCCGCCTGCCCCTCGCC
+NODE 2724 18 819 819 0 0
+TATGTTACTTTACCATGC
+TGCCCCAAGTCTGGATAG
+NODE 2725 51 4023 4023 0 0
+ACCATTGCCGCGCCAATAAAAAAATAGGCGCAGAAAGCCAGTAATGCGTCC
+TCATTGTATTTCTTTTTATTTACTCAAAGATAACGCCGCATAATGAATGGC
+NODE 2726 24 1914 1882 0 0
+TCCGTTATAACGCAAAGTTTCAAC
+GATAATTGGTATAACCAATGTAAA
+NODE 2727 46 2003 2003 0 0
+TGAAACCTGCCTGCGCCACGATGATTACCTGTCTAAAAAATTCACG
+AACCCGGCACTGGCGGGATACGCCGCAAGGGACGGAGGTCTCTTTC
+NODE 2728 20 1191 1191 0 0
+GCCGCCTTTGCATTGCAGGG
+GCCCTGCGCGGAGTGGGCCG
+NODE 2729 15 1003 944 0 0
+ACCCTGCTCCCCGCC
+TATCCCACGGCTGAA
+NODE 2730 1485 83201 82632 0 0
+ATAGTTATTTTTAACCGGCTAACATATTTAAAATTTTCTACCCCACGCTTACGCTCACAGAAACGGCTGATATAGCATCCAGTATTAATATTATTTTCATAATTACTCCAACCAGCATTTTTGATGCAAACAGGCTGGACATGGACTGTGTGCAGAAATCAAAACATACTCACTACGCTCTCCCCTTGAGTCGCCCCAACGGGTGCTCAAAACGCCGCGAGTGTTGTTCAGGCACATCCAGGATAAGTTATAAGTGAATGACTCTCATTCCTGACCACATTTTCATTTATGATAAGAATATCGTCAGAATCTCTTTATCGCATAAAAATACCTCTGCTATTGACTTAATATTTAATTTAACAATGTCGCGGTTTATTCGTTCTGCTCAGATGTATTTCATTGACATTAATAAAACCATAAATAAATTCAATTAAAATAATTTGTTAATAATGAAAAGCTTTAGACGCTATGACTTTTAATAAGGAATTTCCT [...]
+TCCGCGTGTTTGTAAAAATAGAATGGTCGCCGCGACGCGCGAGCGCACGTTTAGTTTGCGAAGTAGATTACGAATGTGCACCTTAACCGTCTGCTCAGAAATATTCAGTACTGACGCAATCTGTTTGTTAGAAAGCCCCTGCGCCAGCTCATGCAAGACATCTAACTCTCGTTCGGTCAGGATACTAAAGGGATCTTCCTGCGCGCCAAACCGTTCGCGCTCACGCAGATATTCATTGACCCGATCGCTAAAGACTTTACCGCCGTTAGCGCCTTTGCGAATGGCCTCCAGCAGCACTTCCGGATCGCTATCTTTGAGCAGATAACCGTCGGCGCCGGCGTCGATCAGCGCGTAGATGTCGCTGGCGGAATCCGAGACGGTAAGAATAATAATTTGCGCCGTCACACCATCCCGGCGTAGCGCGTTCAGGGTATCTAACCCGCTCAGACCTTTCATATTCAGATCCAGCAGGATCAGATCGGGCTCAATGCG [...]
+NODE 2731 51 108 108 0 0
+GCTTTCTTCTGGCCGCGGCCTGCGCGCTGCTGGGCGCGGCGGGTGTCCATC
+CCCTGCTGATAGCCGATAAACGGCGTCAGCAGGCCCGCTATTGGTCCGGTA
+NODE 2732 51 3217 3217 0 0
+TATCACAATCCTGTCGCGTTAAAACTGGGTCTTAACTATACGCCAGTACCT
+ACCCCGTTCCGGAGTCAAACAGATCCACGCTATCGCCAAAGTACTGCTCCA
+NODE 2733 1 205 205 0 0
+A
+C
+NODE 2734 1 6940 6940 0 0
+A
+T
+NODE 2735 1 250 115 0 0
+C
+T
+NODE 2736 1 203 117 0 0
+A
+T
+NODE 2737 1 173 107 0 0
+A
+T
+NODE 2738 1 157 94 0 0
+A
+T
+NODE 2739 2 266 161 0 0
+AA
+TT
+NODE 2740 51 2735 2735 0 0
+ACCCTTTTCTGCCATGTCGATAAGCGTCTCTTTTATATTTTTTAGGTCGAC
+TAATTTATGTGACTGGAAGGAACAGGAAAGAAAAGCCGCAATCTCCTCCAG
+NODE 2741 52 1932 1932 0 0
+CGGACCCGCAGAACTTCCTGCTGATGCACGCGATGGGGCCGAACGTGGCGGG
+CGATTCCAGCCCCACTTTGTTCGATACGCGTGCCGCCATCGGCACTGCCGAC
+NODE 2742 2 251 251 0 0
+AA
+TT
+NODE 2743 2 181 181 0 0
+AA
+TT
+NODE 2744 11 363 363 0 0
+AAAAAAAAAAA
+TTTTTTTTTTT
+NODE 2745 1 3 3 0 0
+C
+C
+NODE 2746 1 103 62 0 0
+A
+T
+NODE 2747 1 88 51 0 0
+A
+T
+NODE 2748 1 85 85 0 0
+A
+T
+NODE 2749 0 125 125 0 0
+
+
+NODE 2750 0 98 98 0 0
+
+
+NODE 2751 51 2670 2670 0 0
+GTGCTGCGCGATCAGACGATAGCTCAACGCGCCTTCCGGACTGTACACGAC
+CGTTGAATATTTTTCCGATCAGGCGGTCTCATGGTTTACGCAACCGGTATT
+NODE 2752 2 68 32 0 0
+AA
+TT
+NODE 2753 2 43 43 0 0
+AA
+AA
+NODE 2754 1 49 49 0 0
+A
+A
+NODE 2755 1 125 125 0 0
+A
+A
+NODE 2756 1 172 172 0 0
+T
+T
+NODE 2757 1 167 167 0 0
+A
+T
+NODE 2758 52 2355 2355 0 0
+CGCCAGCCAGCGGGAAAAACGGGACGCTATCGCACGTCAGATGGGCATTGAG
+CGTTGAGCGTTAACCCAGGGTTTAGCCCCAGACCGATATTTTGCTGCACATT
+NODE 2759 2648 143655 142670 0 0
+TTCGAAGAAAGTATGGTGACGTGCAGTGTATCCGACGTTTTCCAGATCGTTGTGTTTCCCCCCCGCGCGTACGCAACGCTGGGAAGTGGTTGCACGGGAATAATTACGTTTATCGAGCCCAAGGAAAACATCCTTGAACTGGTTCATCCCGGCATTGGTAAACAACAGAGTGGGGTCATTGTTAGGCACCAGGGAACTGCTGGCAACTACCTGATGCCCTTTACTATGGAAAAAGTCGAGAAACGCCTGACGGATCTCAGCGGTGCTCTTGCTCATAATTATCCTGAAATCAAGCTACACTTCATCCTTCAGGCCGCCTCTGCGTTGGCTGCGAGTTTCCCGGTCACGCGTTCCCGAGGCTCACTTGCCGCTTTGATGCGGCTTGAATGATTTTGTGTATTTAAGGAATATTCGTCGCAGACGCTGTTCGCCGTTAAGCAACCCGCGTCCAGACGGAAAAAGTGGGAATAAGATAAGTTTTCTTTACCGGGA [...]
+GAAGCCAAAGCGCAGATGATTGGCGTGCGTGAAGAGACTCTGGCGCAGCATGGCGCGGTCAGCGAACCCGTAGTGGTCGAAATGGCGATCGGGGCGCTGAAGGCCGCTCGCGCCGATTTTGCTGTCGCTATTAGCGGAATTGCCGGGCCGGATGGCGGCAGTGAAGAAAAGCCGGTTGGTACGGTGTGGTTTGCTTTCGCCAGCGTCAGCGGAGAAGGGATTACGCGTCGGGAATGCTTCAGCGGCGACCGTGAATCGGTGCGTCGACAGGCGACGACGTACGCGCTACAAACCCTGTGGCAACAATTTCTACAAAACACTTGATACTGTATGAGCATACAGTATAATTGCTTCAACAGTACGAATTCACTATCCGGTTCAATACCAAGTTGCATGACAGGAGTAATAATGGCTATCGACGAAAACAAACAGAAAGCGTTGGCGGCAGCACTGGGCCAAATTGAAAAGCAATTTGGTAAAGGCTCCATCATG [...]
+NODE 2760 48 264 246 0 0
+AAGTTGATGACTTGCGTTTACTAGGAATTCCTCGTTGAAGATCATTGT
+CTTGTTACGACTTTTACTTCCTCTAAATGATCAAGTTTGATCTACTTC
+NODE 2761 81 756 756 0 0
+CACAAGCCGCAAGTTGCCTCGCGACCCGCAGTCCGTAGAGCTCACTAAGCCATTCAATCGGTAGTAGCGACGGGCGGTGTG
+CTGCGGGTCGCGAGGCAACTTGCGGCTTGTGGGAAGTAGATCAAACTTGATCATTTAGAGGAAGTAAAAGTCGTAACAAGG
+NODE 2762 5 264 264 0 0
+ACCCT
+AAAAC
+NODE 2763 1 62 62 0 0
+A
+G
+NODE 2764 9 603 603 0 0
+GACTAATTT
+TCCCGCCAG
+NODE 2765 51 174 174 0 0
+GATGAACAATCGCCAGTGACATAATCCCTCCTGTTACGTGGATTATGCGGA
+CCCCGCGCCGCACTTGGCGTCAATGCGCCGCCTATCACTATAGAGGTGCAT
+NODE 2766 51 2405 828 0 0
+GTTTATAAATACCTGCCGTTTTCATCTCTTCATAATCCGGCATATCGGGAT
+CTTAAATGTCCGGATGAGCATGTTGTCGCATATAAGGATTTTCGCAAAGAC
+NODE 2767 1 57 57 0 0
+A
+T
+NODE 2768 1 1 1 0 0
+C
+A
+NODE 2769 223 14576 14257 0 0
+AAAAATTTTAGCGCTAAAGCGATCAGCGCCAAAGAGAGGCCAAAATACACCGGCGCGAGCAGCCAGCGAGACGCATACATTACATTTTCAAGAAAGCGTTCCATAGGGACCTGTCAGGTAACTAAAATCAGCAACAGTATATCTCAACCATGCAACATCAGATCAACATGCAGTTAAGAGCCTATCCCACCAGGCGTTATTGGCGCAGCCAGTTTGGACACGG
+CTGCATGTTGATCTGATGTTGCATGGTTGAGATATACTGTTGCTGATTTTAGTTACCTGACAGGTCCCTATGGAACGCTTTCTTGAAAATGTAATGTATGCGTCTCGCTGGCTGCTCGCGCCGGTGTATTTTGGCCTCTCTTTGGCGCTGATCGCTTTAGCGCTAAAATTTTTCCAAGAAATTCTACACGTTCTGCCGAACGTTTTTGCCCTGGCGGAAGCCG
+NODE 2770 3 114 114 0 0
+TGT
+ACC
+NODE 2771 51 1803 520 0 0
+TTGACGTCAGCGCCAATCTGACCGGCAATCCAGCCCGCCAGCGCCTGAATA
+ACCACGCCACTCGTGCGGGCCTGCTCTCCAAGTGCGACCTGATGACCAACA
+NODE 2772 2 84 84 0 0
+AC
+AC
+NODE 2773 44 44 44 0 0
+GCGCGCCGTAATCCGGTTCGCTGATTTGCGAGCTGGCCTGCATC
+CGGATAAAACTGATACTAAAACGCGGCCTGTTATCGCGTTTTTC
+NODE 2774 6 174 174 0 0
+TGTGTA
+GATCAA
+NODE 2775 1 30 30 0 0
+C
+C
+NODE 2776 4 11 11 0 0
+TAAA
+AAAA
+NODE 2777 51 72 72 0 0
+GATCTGGTTAAACAGCTCAGCAAATTGCAATTCCCGGTATTGTTGGATAAT
+CCTCATGGCCATGGTCAAATTCATGGTTACCGACAGAGACGGCGTCGTAAG
+NODE 2778 123 4321 4317 0 0
+ATCATCAAAACGCAGCATGTTGCCGTTCGTTGGCCCGCCATATAGTGAGTGACTGAATATCCCGCTCTGTGTTGCCATTCCCGGCAGTCCCCACGGCGGCATGGTGTCCTGGTTGTAGGTACG
+AACACAGAGCGGGATATTCAGTCACTCACTATATGGCGGGCCAACGAACGGCAACATGCTGCGTTTTGATGATAAAACGGGCGCGGAGGAAGTGAAGTTCCACGCGGAAAAAGATCTCAACAC
+NODE 2779 1347 74592 73831 0 0
+CTGCGCGCACCGCCAGCCATGACAACGGTCGAACTTCAGCGCCGACACCCACGTACTGTGAATTGTCTTCGCTCTTAAAGCCTTTCGTTTCCGTCAGATCGCCATCGGCGCTTACGGTCAGCAAATCGTTATGCCATGCGATGCCCGCGGTAACCAGGGGGCGGATTTGGTATGTATCTTTGTAGTTGGTGGTTTCTCCCGTCATACCATTAGTGATGTAAATATCTTTCGTATCGATATCGCGAGATACCAGATTTTGCCCGCTCAGCCCCAGCGTCCAGTTTTCACCGATATCGGCAGCAAGCCCCGCATCAATGTTAAAACCCGTATCGTCATTGCGATAACGGCTGCTATTCCAGTCGCTACTGTCGTAGTTATAAATTGAGGTGGTGTAGTTATAGAGCCAGGTTTTTTGCAGTTTTGGCGTAACGCCAATGGAAACAGGCACCTCGCCCACCACAAACTGCTTCGCCAGCGCAATACCGTAGTCAG [...]
+AGTATTCTCATCTATACCTAATGAGGGTCGATATTATAACAACAGGATTTAACATCACTATTTCACAGCAATAGTTCGCCTCTGTCCGGTAAAGCGTGGCGGAGGGATTACTTCACCTGATAATAAGATGGGCTAACTGTGAACAAAAACGTCAAACTTTCACTGATTGCTATCGCGGTCTCGCTTTTTATGGCAAAGCAGGCGAGCGCCGCCAATACCTGGACGGAAGCGCGTAATGACGCAATGGGCGGGACGGGCGTCGCGTCCGCGAATTATGGCAGCGGAGTACTGTTAAATCCGGCGTTACTGGCAAAAGCCAAACCGGAAGACAATATCACTGTTGTCCTTCCTGCGGTCGGCGTCCAGATTACGGATAAAGACAATCTCCAGGATGAAATTGACGATATCAGCGATAAAGTGGATTACTACGATGAGGTCGTCGATAACCTTACGCTGGGGCAAATTCTGCTCAATCCGCGAGGCGTGCTGAAT [...]
+NODE 2780 170 405 405 0 0
+ACTTAATCAGCATGGGTTGATGACCCATGCTGATTAAGTCCCTGCCTTATCCTTCCTCTAAGTGCTATGGCTTACACAACTTCTTGAGACTCTAATGAGTCCCAATCCGAAGAATTCGCCGAAACACTCGAATCGGTAGGAGCGACAGGCGGTGAGTACAAAAGGCAGGG
+GGCGAATTCTTCGGATTGGGACTCATTAGAGTCTCAAGAAGTTGTGTAAGCCATAGCACTTAGAGGAAGGATAAGGCAGGGACTTAATCAGCATGGGTCATCAACCCATGCTGATTAAGTCCCTGCCTTTTGTACTCACCGCCTGTCGCTCCTACCGATTCGAGTGTTTC
+NODE 2781 162 10873 10858 0 0
+AGCCATTCACATTTAGAGATCATCCGACATAATCAATCTGCCAACGCAGGAGATCGCTGTGCGTAAAGCCCGTTTTACTGCGCACCAGATCATCGCTGTGATTAGAACAGTCGAATCCGGACGGACTGTTAAAGATGTCTACCGGGAGGCCGGTATTTCTGA
+GACTGTTCTAATCACAGCGATGATCTGGTGCGCAGTAAAACGGGCTTTACGCACAGCGATCTCCTGCGTTGGCAGATTGATTATGTCGGATGATCTCTAAATGTGAATGGCTCGATTATGCGGGATACTTACATACTCACGCGTTGAGAGACTTTCAGTTCG
+NODE 2782 51 1913 1913 0 0
+TATGGACCGTTCCGACCTGTTTAACGTTAACGCTGGCATCGTGAAAAACCT
+ACCCGGCTTACGCGCCACACCCGCAGAAATCAGTACTACGTCAGCGCCTTC
+NODE 2783 24 1994 1994 0 0
+CGCGCCGAGCAGCAGGGTGCGCGG
+GGTGCTGGGGGCGCTGACGCTGAA
+NODE 2784 21 687 687 0 0
+ACGCCAGCCGCCGAAGTGGTT
+GATGATCGAAATCTTTGGTTG
+NODE 2785 51 2682 1842 0 0
+ACCCGACATTTTTTACTTAAAAGCGCGATCTTACGCTCAATGAATGACGCA
+TGCTGACATCCACGTTATCCAGTACTTCGTCCACCAGATAATCAGAAAGGT
+NODE 2786 750 47775 45646 0 0
+ATTTAGGCTGGCCACCATTGGCCGCAATTACCTGGGGCTCACCAATCGCACCCTTTGTCATTCCGCTGACGATGCTGATTAATGTCGCCATGCTGGCCCTGAATAAGACACGTACTGTTGATGTCGACATGTGGAACTACTGGCACTTTGCCCTGGCTGGAACGCTGGTTTACTACAGCACAGGGAGTTTTGTTTTGGGTCTGTCCGCAGCCGCTATTGCCGCGATCGTGGTTCTCAAACTGGCGGACTGGTCTGCGCCATTAGTGGCAAAGTACTTCGGTCTGGAAGGTATTTCACTTCCGACCCTGTCATCTGTCGTCTTCTTTCCGATTGGATTGCTGTTCGATAAAATTATCGACAAGATCCCAGGCGTTAACCGTATTCATATTGATCCGGAAAACGTTCAGAAAAAAATGGGAATCTTCGGCGAGCCTATGATGGTGGGTACTATTCTGGGGGTCTTGTTGGGCATCATTGCCGGATATGACTTTA [...]
+ATCAGTGCTGTAGATATAATGGCTGGGTTACCTACTGCTACCGCGATATCCAGTCCGATAAAGAGATCATCACGGCCAGGATATTTGGCATTCAAATATTTCTTAATGGCTTCAGACAGAGGTAATAAACCTTCCATCAAAATTCGTACCATACGCGGAAGAATGAACATGACACCGCCAATGCTGATCCCCAGCAACAGGATATGTTTAAAGTCATATCCGGCAATGATGCCCAACAAGACCCCCAGAATAGTACCCACCATCATAGGCTCGCCGAAGATTCCCATTTTTTTCTGAACGTTTTCCGGATCAATATGAATACGGTTAACGCCTGGGATCTTGTCGATAATTTTATCGAACAGCAATCCAATCGGAAAGAAGACGACAGATGACAGGGTCGGAAGTGAAATACCTTCCAGACCGAAGTACTTTGCCACTAATGGCGCAGACCAGTCCGCCAGTTTGAGAACCACGATCGCGGCAATAGCGGCT [...]
+NODE 2787 21 978 978 0 0
+CATGATGTCGGCGGCGTAAAG
+CAGTCGAAGATAAAGCGGGGA
+NODE 2788 20 1358 1358 0 0
+ACCCTGCAATGCAAAGGCGG
+TCGCAGGCTTTCCCGGCGGA
+NODE 2789 31 1739 1739 0 0
+CAAAGCCGATGACGCCGATGTTGCGTACATC
+TAAAGCAACGAATACGCTACCGCCTTGTTCC
+NODE 2790 1655 98776 98320 0 0
+ATCAGCGTCGCTAACGCCCTGCCCTTAACGCCGCGCGCCTGAAGCGTCAGATAAGGATCGACGGCCCGCTGAGGCAGCTTCTGAGAACCGTCCATCGCAATCTGTCCGGTCTTATGTTTAATGTTCGGGTTGCTGAATCGCTCAATGAGCAACTGCGCATATTGATGTACATCTACCGCCAAATTCGGGCGCAGCGATTTTGCCTGCTCTTCCGTCATTAAATGATGTACGGCGGTTTTAAAAGCGTCGTCTTCCATGCACTGATAGATAAACTCATATCCAGCCAGGCTGCCGTTATAGGCGAGAAACGAATGGCTGCCATTCAGCATACGAAGTTTCATTTCTTCATAGGGAAGCACGTCCGAGACGAACATCGCCCCTGCTTTATCCCAGTCAGGACGACCGGCAACGAAATTATCTTCGATAACCCACTGACGGAAATCCTCGCATACGATGCCGCAGGGATCGGCAAAACCGATCTGGTCTTTAATC [...]
+TAAATTGAGCTCATTAATTCACTAGACAAATTATCAGGTTTGGTTTGCTGTATTTCGGGAGGTTGTTGAACCAATCATGCGTGACATATACGCTTGCAGCGGGGTGTTATTCAATAAGATATTGTTTTTCATGGGGTTTAATGATTGCGGGTTGTATGGGTGGTATGCCAATTCGTGGCCGATTTTTCTAATCAAAATCACGCTTTTGTGAATCATAAAATTTATCCTGAGAAGTGCTTTTTGTAACTAATTGATAAATAAATTATTTTTATTCATTGGCTATTAGTCAGCATACCGGGGGAAAGAATCTGGTGCCATGAGTGTGATCATATTCACGGATTTTGGTATGGTGTTTAAGCAGAATTGGTAAACAAAACAGGAGTGGGAAAAATTCATGGACACCATAGCTCGCCAGTTAGACGCCGCAAGGCACCAATTCAAAACGACTTATTCACGTCAGGGAATGGAAGCCAACATCGTACATATTGGATT [...]
+NODE 2791 13 1023 1023 0 0
+CGGGTCGCTGCTA
+TTGATGCTGATAA
+NODE 2792 2 87 87 0 0
+TG
+TT
+NODE 2793 47 351 320 0 0
+GAATGTCTGGGAAACTGCCTGATGGAGGGGGATAACTACTGGAAACG
+ACCCGTCCGCCACTCGTCAGCAAAGCAGCAAGCTGCTTCCTGTTACC
+NODE 2794 46 1350 1350 0 0
+ACCCTGCCGCAGGCGGCGGCCATCGGCATTATCGGCGGCGCGGACG
+GCAATCAGGCCGAAGTAGTTCAGCGTCAGCGCCCCCAGCACGGTGG
+NODE 2795 81 7240 4993 0 0
+CACCGTGCGCAGCTGCACCATGCGGATTTTGCGCTCCGTCTCCGTGGTCAGCGCCTTCATAATCGGCGGCTGGATTAACGG
+CAAAATCCGCATGGTGCAGCTGCGCACGGTGAGTAAGCGGGAAAAAATCCTCTTTCCGGTGGTGCTGTTACTGCTGGTGGC
+NODE 2796 167 12043 12043 0 0
+ATTCGCAAAGTCAGTCACATACTTCTGTATGCGCCTTCCTTTCCTTCGCTTGCCGCCTTGCCGCTGCGCAAATTATTGCGTACTCAACTCTGAATCAGTACTGAAAATCATCTCTCAATCCGCCAAAACATCTTCGGCGTTGTAAGGTTAAGCCTCACGGTTCATTA
+TGAGAGATGATTTTCAGTACTGATTCAGAGTTGAGTACGCAATAATTTGCGCAGCGGCAAGGCGGCAAGCGAAGGAAAGGAAGGCGCATACAGAAGTATGTGACTGACTTTGCGAATGCAGGCAACGCCGCTGATGCGATAAAGAATTGCGTACTGAGCATAAAAGA
+NODE 2797 38 1736 1736 0 0
+TGGACCAACAATCTCGGCTACAGGGCCAGCCACAGCGC
+ATTGCAGGAAAAATTAAAAATAGTGCCGGGGATATTTA
+NODE 2798 13 749 749 0 0
+CAATAGCAGCGCC
+AGCGATTGGGAAG
+NODE 2799 285 11545 11463 0 0
+TAATCTGGCCAGCCGCAGTGCCCAGGCGGCGAAAGAAATAAAAGCGTTGATTGAAGATTCCGTCTCGCGTGTCGATACCGGTTCAGTGCTGGTGGAAAGCGCCGGGGAAACCATGACTGACATCGTCAATGCCGTTACGCGCGTCACGGATATCATGGGCGAAATCGCCTCCGCCTCGGATGAGCAAAGCCGGGGTATCGATCAGGTCGCTTTGGCCGTTTCCGAAATGGATCGCGTAACGCAACAGAACGCCTCGCTGGTTCAGGAATCCGCCGCCGCCGCCGC
+GCGATCCATTTCGGAAACGGCCAAAGCGACCTGATCGATACCCCGGCTTTGCTCATCCGAGGCGGAGGCGATTTCGCCCATGATATCCGTGACGCGCGTAACGGCATTGACGATGTCAGTCATGGTTTCCCCGGCGCTTTCCACCAGCACTGAACCGGTATCGACACGCGAGACGGAATCTTCAATCAACGCTTTTATTTCTTTCGCCGCCTGGGCACTGCGGCTGGCCAGATTACGCACCTCGCCTGCCACGACCGCAAAACCGCGCCCCTGCTCTCCCGCGCG
+NODE 2800 331 15658 15605 0 0
+GTACCGGCGCTATTCTGGCGGCGACGCAGTTGGACGATGGTCAGTTACTGGTTCAGGCCGTCATGAATAACGATTTAGAAGCCGAAAGCGTCTTCCGTGTTCGCGACGATGCCAACACCCTGCATATCGTCCCGCTGCCTTACTCGCTGGAAGAGTGATATCACGTTAAAAGCCGGATAGCCTGATAGCGCAACGCCATCAGGCTCGCACGTGCTGCTCTCGTAGGCCGGATAAGGTACGACAGCGCCGCCATCCGGCACGGGCATCCGGGAATTACGCCTGTCCCACATACAAATAGATGGCCAGGAAGTGGCACACGCTGCCGCCCAGC
+AGGCGTAATTCCCGGATGCCCGTGCCGGATGGCGGCGCTGTCGTACCTTATCCGGCCTACGAGAGCAGCACGTGCGAGCCTGATGGCGTTGCGCTATCAGGCTATCCGGCTTTTAACGTGATATCACTCTTCCAGCGAGTAAGGCAGCGGGACGATATGCAGGGTGTTGGCATCGTCGCGAACACGGAAGACGCTTTCGGCTTCTAAATCGTTATTCATGACGGCCTGAACCAGTAACTGACCATCGTCCAACTGCGTCGCCGCCAGAATAGCGCCGGTACGACGCCAGTTCTCGCCCATCTGTAGCTCCAGATCTTCTCCTGCTTCCGGT
+NODE 2801 51 85 85 0 0
+GTGACGTCAGAGCCAATCTGACCGGCAATCCAGCCCGCCAGCGCCTGAATA
+CCCACGCCACTCGTGCGGGCCTGCTCTCCAAGTGCGACCTGATGACCAACA
+NODE 2802 10 563 563 0 0
+CGAACGCGCA
+TTGGCCAATG
+NODE 2803 41 2223 2223 0 0
+TCCTCCTGAGTTGCTGCGTTACGATCCCCAGGGACAGCGTC
+GCCAGACGCCCCAGTTCCAGTGATTCCGCCGTTCCCAGTTG
+NODE 2804 32 68 68 0 0
+GATAGACCCGAAACCCGGTGATCTAGCCATGG
+GGTTAAGACTCGGTTTCCCTACGGCTCCCCTA
+NODE 2805 5 1816 33 0 0
+GCAGG
+CGCCC
+NODE 2806 144 12554 9209 0 0
+ACCAGCTTCGCGCCCACCGACAGTCCGAGGAAGATGGTGACGATATTAATCAGCCCGTTCTGTACCGTGTCGCTCAGACGCTCCACCACGCCGCTTTCACGCATCAGATTGCCAAAGCAGAACATCCCCAGCAGCGGCGCGGCG
+GCGGCGTGGTGGAGCGTCTGAGCGACACGGTACAGAACGGGCTGATTAATATCGTCACCATCTTCCTCGGACTGTCGGTGGGCGCGAAGCTGGTGGCGGACAAGTTCCTGCAGCCGCAGACGCTGGGCATTCTGCTGCTGGGGG
+NODE 2807 24 124 124 0 0
+GAGTTTGACTGGGGCGGTCTCCTC
+GTAACGGGTCCACGTTAGAACATC
+NODE 2808 42 42 42 0 0
+CTGGCGGCAAGTAAAGCGGGCGGGCTGGCGGTAGATGATGCG
+TACACTGATCGGGAGAAGGGGTAAACGTGGTGTCTTTCATTC
+NODE 2809 72 3350 3171 0 0
+GCCGCCAACGGCGTCGGCCTGGTCATTAAAAACCCGCTGGATGGCCTGCCGGTCGCGCTGGGCGATTTCGAT
+CCAGGCCGACGCCGTTGGCGGCAATCAGCAACAAAAACAGGCCAATACCGATACCGGTTCCGTGGGCCACGC
+NODE 2810 51 2379 2235 0 0
+ACCTTCCCGGTGATTATGTCGCTTGTGGGGCTGGCTGTTATTCTCGGTCTG
+TATCGAAATCGCCCAGCGCGACCGGCAGGCCATCCAGCGGGTTTTTAATGA
+NODE 2811 36 880 880 0 0
+AGCAATCCTCCATGAGAAAAGCGACTAAAATTCTTC
+CCAAAAGGAAAATTTTATGGCACAAGTAATCAACAC
+NODE 2812 1 48 26 0 0
+G
+A
+NODE 2813 51 93 93 0 0
+CCATTACTCACCCGTCCGCCACTCGTCAGCAAAGCAGCAAGCTGCTTCCTG
+GCTGGGAAACTGCCTGATGGAGGGGGATAACTACTGGAAACGGTGGCTAAT
+NODE 2814 45 141 141 0 0
+GGTGAAATCATATCATTACCACGGTCAACTGCCAGGGTGTACTGC
+CCCAGCCAATGTCACCGTCCGTACTGAACTTGATCAAGCAAGTTA
+NODE 2815 8 436 406 0 0
+TTTATGTT
+CCCGTTCA
+NODE 2816 9 19 19 0 0
+GGTGGTTGC
+ATCCGCCAC
+NODE 2817 2 86 71 0 0
+AC
+TG
+NODE 2818 34 1248 1248 0 0
+TTTGGCGAATAAAAAGCCCTGTCGTTCATTGACG
+CTTTTGAACGCTGGTACAAACGTTATCAGACGAA
+NODE 2819 69 761 761 0 0
+CCCCGGTCTCAACCTGGGAATTGCATCTGTGACTGCATAGCTAGAGTACGGTAGAGGGGGATGGAATTC
+TCCCAGGTTGAGACCGGGGATTGCATCTGTGACTGCATAGCTAGAGTACGGTAGAGGGGGATGGAATTC
+NODE 2820 121 2774 2694 0 0
+CTTTGTTTTATCTGTAGTCTGCCGGTGAGCACTCTCCTGAGGAGGGCAAATCCGCCGGGAGCTGATTTGAACGTTGCGCAGCAACGGCCCGTAGGGTGGCGGGCAGGACGCCCGCCATAAA
+TTCAAATCAGCTCCCGGCGGATTTGCCCTCCTCAGGAGAGTGCTCACCGGCAGACTACAGATAAAACAAAGGGCCCTGTCTTCCGACAGGGCCCTTCGTTTTATTTGATGCCTGGCAGTTC
+NODE 2821 51 2596 2441 0 0
+GAAATCCAGAACCGCAAGCCTCTACTTTTCCCTCGTGATGGAAGGTCTTGC
+CACGCCTGTGAATGTCCTTTCGATGTTTTCAGTTATTACCCTCCTGCAGAA
+NODE 2822 85 3897 3897 0 0
+GCGCCGCGTCAGATTATCGAAAGCGCCGCTATTGAGTTATTGCTAAAAGAGGGCCATGTGGTGATTTGCAGCGGCGGTGGCGGGG
+TCAATAGCGGCGCTTTCGATAATCTGACGCGGCGCCGGGGAAGCGACGACACGGCGCAGATATTTTCCATCACGTTTCATATGCC
+NODE 2823 7 312 312 0 0
+GCATGGA
+CAGCGTC
+NODE 2824 341 14973 14918 0 0
+CTGGTGGACTTTATCCACTCTGAAAGCCGCCTGAAATTCCCGCAATACCGCGCGCCGGGTTCAGATAAGTGGCAACAGATCAGTTGGGAAGAAGCGTTTGACCGCATCGCTAAACTGATGAAGGAAGATCGCGACGCCAACTATCAGGCGCAGAACGCCGAAGGCGTTACCGTTAACCGCTGGCTCACCACCGGGATGCTGTGCGCTTCCGCATCCAGTAACGAGACGGGTTATTTAACGCAAAAATTCTCCCGCGCGCTGGGTATGCTCGCGGTCGACAACCAGGCGCGTGTCTGACACGGACCAACGGTAGCAAGTCTTGCTCCAACATTTGGTCGCGG
+ACGCGCCTGGTTGTCGACCGCGAGCATACCCAGCGCGCGGGAGAATTTTTGCGTTAAATAACCCGTCTCGTTACTGGATGCGGAAGCGCACAGCATCCCGGTGGTGAGCCAGCGGTTAACGGTAACGCCTTCGGCGTTCTGCGCCTGATAGTTGGCGTCGCGATCTTCCTTCATCAGTTTAGCGATGCGGTCAAACGCTTCTTCCCAACTGATCTGTTGCCACTTATCTGAACCCGGCGCGCGGTATTGCGGGAATTTCAGGCGGCTTTCAGAGTGGATAAAGTCCACCAGACCGGCCCCTTTCGGGCACAGCGCGCCACGGCTTACCGGATGATCCGGGT
+NODE 2825 78 4168 4168 0 0
+GGGCAGCAAATTCTTCTACGCGGCCTTTCAGTTTGTCGTTCTGGTAGGTGAACGCCAGTTCAGCTCCTTCGCGGTGCA
+AAAGGCCGCGTAGAAGAATTTGCTGCCCAGCTGGGTTCCAGCATCGTTTTACCGTGTGATGTCGCTGAAGATGCCAGC
+NODE 2826 20 1045 114 0 0
+CGCCTGAACCGTGTCACCGA
+ACGCCACAGGAAGGTGACTT
+NODE 2827 73 5661 3817 0 0
+TCGCGGGCTGTCGTTCACCATGGAGGCCGGGGAGTGGGTGCAGGTCACCGGCGGCAACGGCGCCGGAAAAACC
+CCATGGTGAACGACAGCCCGCGAAACAGCGTCCTCTCGTCCCGCTCGCAGTACAGATCTCTGGCTTCAAGCAT
+NODE 2828 51 2847 2827 0 0
+ACATCCACGTTATTTTTGCCCAGCACGTTGTCGTATGAAGTATGGATGCGG
+TGATTAAAGGCTTTGCCCGCTTTGTCGATGCCAAAACCATTGAAGTGAACG
+NODE 2829 51 1582 1582 0 0
+ACCAGCCAGCCGGAAGGGCCGAGCGCAGAAGTGGTCCTGCAACTTTATCCG
+TTTATTGCTGATAAATCTGGAGCCGGTGAGCGTGGGTCTCGCGGTATCATT
+NODE 2830 95 513 513 0 0
+ACCCCAGAGGAAATCCTCCTTGGAAAGGCCTTTCATTCTGCCCTCACGGGTAGTGTGTTGACAACGGGGATTTCCTCTGGGGTAAGTCGGTCCTA
+GAGGGCAGAATGAAAGGCCTTTCCAAGGAGGATTTCCTCTGGGGTTAGGACCGACTTACCCCAGAGGAAATCCCCGTTGTCAACACACTACCCGT
+NODE 2831 3397 220587 220000 0 0
+TAAATCAAAAGTGCACTGCGCCCATTATTGATCTCTTCAATAACGAAGCGATCTCCTGCAGTATTTCAGAATGTCCAACCATGCCGATGATCGATGACATACTCATGAAGGCATTTGCCAGACTTGATGCGGGTACCAATCCGGTTCTTCATTCAGATCAGGGCTGGCAATACCGTCATAGATGGTACCAGTATCAGTTACGAGAGTTTGGCATCATCCAAAGTATGTCCCGCAAAGGCAACTGCCTTGATAATGCCTGTGCAGAATGTTTTTTCGGGACTTTAAAATCAGAAAGTTTTTACACCAGTAAATTTAAGGATATTGATGAACTTAAGATAGCTATTGAGGATTACATACGATACTACAATACCCGACGAATTAGCCTTAGATTTAACGGACTCAGCCCGGTTGAATACCGCCTAAAGAGCTATCCAGGCAGAAATTAACAAGGTCTGTACAGGGATGCTATCAGGAAACCTGAACGTCGGTAGA [...]
+TACCAGGTCTGGCGCGAACCAGAGTTTAAGCGTGTGTGGATCGATGGCGCATAGTCCCGCGTCAAAGAGCTTGTGGATATCAGCGCGCAGCAGCAGACCGTTTTTAAAGCTCGCGCCACCTTTGCGAGCGTGGGCTTTAAGGTGCGCGGCTTCACAGCGTACCGCAATGGCATTCGTGTAGACGCAACGGCCACCGCAGTTAAGCATCACATCTTCACGGAATTTCCCCTGATCACGACGGCGACGGCCATAGAACGGTACATCTTCTTTGTGTTCGCGTTCTTCAGCCAGCGACCGTTCGGCTTGCGGTTCTTCAGCCTGGGGTTCTTCGACCACCACGGGTTCAGGTTCGACCGCTTTCGGTTCTTCCCAAGTTCCCAAGAACATGGCAACGCGCTGGGGCATTTTGACACGATTCAAAATCCCAAGGTGCGCTTTTTCCCAGGCCAGGAATTCTTCCAAGCGACTCGCTGGGCAACCATGTTTAAGCGC [...]
+NODE 2832 4 231 231 0 0
+TAAG
+TGTC
+NODE 2833 51 107 107 0 0
+GATCGTCTTCCAGCGTCAGTAATACCAGCACGAACGCAAAGAACGCCATAC
+CCGCGCCAGGCGCTGATCGTGACGCCGCTGTGGTTTATCGCGTTGGGTCTG
+NODE 2834 228 4897 4897 0 0
+CCCCGGCGTCTGCGCCGTCGCCTGCTGCCAGGCCCTGACCTGCTGATAGCTGCCGGTCTGTGAGTAACTGATGGCGGCCACGACCAGCGCCATAACCACGCCCGGAAGATACCCCCCCACCCCTGCGCGCGGTCCCGCCGCCGGAATGGCGTCAGCCAGGACGTCCTGTCTGATACGCACCCGCCGGCGCGTGCGGGCGACGATTATCCACCCGCCCGCCACGATGGC
+GCGTATCAGACAGGACGTCCTGGCTGACGCCATTCCGGCGGCGGGACCGCGCGCAGGGGTGGGGGGGTATCTTCCGGGCGTGGTTATGGCGCTGGTCGTGGCCGCCATCAGTTACTCACAGACCGGCAGCTATCAGCAGGTCAGGGCCTGGCAGCAGGCGACGGCGCAGACGCCGGGGCTGCTGGCGCGGGCGCTGGACCCGCAGGCGCAGCCGCTGAATGAGGAGGA
+NODE 2835 12 709 709 0 0
+ACCTTGGCAAGG
+TTGAAAGTGCTT
+NODE 2836 14 51 51 0 0
+TTTCCCTACGGCTC
+CCCCGAAACCCGGT
+NODE 2837 28 1419 1419 0 0
+TTTTATGTTCCCGGCGCCATTTCGCTGC
+AAGGCGATAGCAAAGCTGGTCAGCAGCG
+NODE 2838 40 99 99 0 0
+GGGATGGAAGATGCGCAGCGTTTACCGTTATCAAAGCTGG
+ACCCACCCGCTAACAAACACGGTGCACAGTACCGTCAGCA
+NODE 2839 3 210 210 0 0
+GTC
+GGT
+NODE 2840 22 4758 1026 0 0
+ACCCAACGAACGTATCCTTAAA
+TGGCCTGTGAGGGTTGCTGGAG
+NODE 2841 188 11593 11460 0 0
+GGTATACCTCTTGTAGGCTATACCTCCTGCTTCACGTTATCGCGCGATTAACGCAAATACGCCCCAGCCAAAGTATTCTCGCGTCCAGGTGACGTGACGTTTGGGGGCTGCCGTCAGTTCTGTTCGAACCTCTTGCGCAAACTCATCGTCAGGGTTTTCCTCCAGCCAGCGGCGCATGGTCATCCACT
+GCGCAAGAGGTTCGAACAGAACTGACGGCAGCCCCCAAACGTCACGTCACCTGGACGCGAGAATACTTTGGCTGGGGCGTATTTGCGTTAATCGCGCGATAACGTGAAGCAGGAGGTATAGCCTACAAGAGGTATACCTCCGTTTAAAAGTATGCAACAAATTAACACGGCTCAAGGCGGGAATATAT
+NODE 2842 2 251 152 0 0
+GG
+AC
+NODE 2843 11 1324 783 0 0
+CCGTAGGTGGC
+TACTGAGCACG
+NODE 2844 30 1504 1480 0 0
+TCCGGGATATCAACCACTCGCAGCGAATTA
+AATATGGCTTTGCCTGCCTGAGCGAGCAGG
+NODE 2845 27 31 31 0 0
+GACCTTATAATCCCGTGGCTGAATATG
+GAATTAACCTGCCGTAGCCTGGGAGCA
+NODE 2846 13 199 199 0 0
+GTTTTGCTTTTAC
+AAACTGACCGATA
+NODE 2847 248 11251 11187 0 0
+TCGCGACAGGTCGACATCGCCAGGGTGTAAGAGCAGGCGTTAATCAGCGTGACGGTGGCAATAAAGCAGAGGATGAAGAAGCCCCACATGGTGGCGGTGCTGAGCGGCAAGGCGGCCCAGGTTTCGATAATGGCGCGCGCCACGCCGTGTTGCTCAATGAGTTGCGGGATGTTGAGGATGTTTTTATCCATCAGCAGCAGCGTGTTACTGCCCAGCACTGTCCACAGGATCCAGGTAGACGCGGTCAG
+GCTGCTGATGGATAAAAACATCCTCAACATCCCGCAACTCATTGAGCAACACGGCGTGGCGCGCGCCATTATCGAAACCTGGGCCGCCTTGCCGCTCAGCACCGCCACCATGTGGGGCTTCTTCATCCTCTGCTTTATTGCCACCGTCACGCTGATTAACGCCTGCTCTTACACCCTGGCGATGTCGACCTGTCGCGAAGTTCGCGATGGTGAAGAGCCGCCTCTGTTAGTGCGTATCGGCTGGTCGG
+NODE 2848 62 2478 1031 0 0
+ATACCCTCCTGAACCCCACATATCTACAATAATTGTATTCTTTTCGTTCAATCCCTGGAGCG
+TCAGGAGGGTATAAAAAAACCCGCCGAAGCGGGTTTTTTTACGTTACTACAGATTACTCTGC
+NODE 2849 26 996 983 0 0
+TTCACCACGCCGACCAGCACCAGAAT
+CGAGTGGTGGAGCACCCTGCACCAGG
+NODE 2850 27 1948 1948 0 0
+TTATTGGCGCAGCCAGTTTGGACACGG
+TCGATTCTCTTTTTTGCGAGGCGAATT
+NODE 2851 9 545 540 0 0
+CGGCGGTTA
+GAAGGTTTC
+NODE 2852 11 697 697 0 0
+TTTATTGAGGG
+AGCCGCAAAAA
+NODE 2853 51 58 58 0 0
+GACGCATCCGCCACGGATTCAACAACAATAAAAAGTTTATATTTATCGGTA
+CCCGGCTGGCGCGCGAATTACCCGACATTAAAAGCATTAATTTAGGCGGCA
+NODE 2854 51 2122 1417 0 0
+CAATAAACCGAACGGACAATATGTTATTACGCCAGCCGATGTACCCGGCTT
+GAGATCGGAGGCGATCTTCGCCAGAAATTTCACTGGCGCAACGCCGGCGGA
+NODE 2855 66 3999 3999 0 0
+CTGCTGAAAATCGTCTTCTCATCCGCCAAAACATCTTCGGCGTTGTAAGGTTAAGCCTCACGGTTC
+AGACGATTTTCAGCAGTGATTCAGAGTTGAGTACGCAATAATTTGCGCAGCAGCAAGGCGGCAAGC
+NODE 2856 46 2055 1988 0 0
+ACCCGCCGTCAGTAAAATCATTAGCGATGTTGAGGCCTATTTTGGC
+TTAACCCTAACGATTTTGCGGCAGAACCGATAGAACCACTTCTAAT
+NODE 2857 16 1078 1043 0 0
+ACCGCGCTATCCGCTA
+TTTGCATAACGTCCGG
+NODE 2858 51 185 185 0 0
+GATGGACCGTTCCGACCTGTTTAACGTTAACGCTGGCATCGTGAAAAACCT
+CCCCGGCTTACGCGCCACACCCGCAGAAATCAGTACTACGTCAGCGCCTTC
+NODE 2859 51 2457 2194 0 0
+GACGCTATCATAGACATTCCCTTTCCCCAGATGTTCCAGAAGTTGTTCCGC
+CGCGCAGGCATGGCAGGCCGCTATCGACGCGGCGCAGCCAGAAGATACCGT
+NODE 2860 605 34859 34685 0 0
+CTATACCGTGGCCATCAGCCACCCCTCCACAAGGCTACCTGGTGATGAACGGGCAGTCATTTTCATGTTCCCGGTATCCTCAGCTTGCCCGTGCTTATCCCGGGTGTAAGCTGCCGGATTTGCGCGGTGTTTTTATCCGTGGCTGGGACAACGGACGTGGGCTGGATGGAGATCGGAACAGACATCTCCTGAGTTATCAGGCCGATCAATCCGGTGTCTATCATGAGCGTGGGGGATGGCTGAAAGGGCATCACAGCGGTATGCCTTACTGGGCCCAGGGAAGCACAACGGAAATGCGCCCCAAAAACATTGCCTTTAACTACATCGTCAAAGCAAGCTGATGCATTTAAGGCGTATTAACTTTTAACTTACAGCAACGTATTTTGACCCAGACCATGCTTCCCGAATACCCCGGTTTACCTCTGTACGCTCTGAATCCTGCCGCACCATAGCCTGCTTTGCCGTCACAGACGGCAAAGCCGTTTGAGCCAC [...]
+ATTATTCGGCCTGTTATGACGCAGAAGAAGACTCCAGAAAACCGGTTTATGCGAACTGGGGTAGTGGCTCAAACGGCTTTGCCGTCTGTGACGGCAAAGCAGGCTATGGTGCGGCAGGATTCAGAGCGTACAGAGGTAAACCGGGGTATTCGGGAAGCATGGTCTGGGTCAAAATACGTTGCTGTAAGTTAAAAGTTAATACGCCTTAAATGCATCAGCTTGCTTTGACGATGTAGTTAAAGGCAATGTTTTTGGGGCGCATTTCCGTTGTGCTTCCCTGGGCCCAGTAAGGCATACCGCTGTGATGCCCTTTCAGCCATCCCCCACGCTCATGATAGACACCGGATTGATCGGCCTGATAACTCAGGAGATGTCTGTTCCGATCTCCATCCAGCCCACGTCCGTTGTCCCAGCCACGGATAAAAACACCGCGCAAATCCGGCAGCTTACACCCGGGATAAGCACGGGCAAGCTGAGGATACCGGGAACATG [...]
+NODE 2861 51 2257 248 0 0
+ACCACCCGCACGACTGTCCGGTCTGTGAAGAGGGCGGTAACTGCCATCTTC
+TTAGTCATCAGCCACTCCACCACGCTTTCACGGAACTGTTTCGCTTCTTCA
+NODE 2862 51 120 120 0 0
+GGAACCCTGAACCGCGCTATACCATCTTATCTGGTTGTTTATTATCATTAA
+CCCGCCGCTTCCCTGCCGACGGCGAACCGTTCTTACAGTTTGCCAGAGACT
+NODE 2863 9 9 9 0 0
+GGATTGAGC
+CCCCCGTCC
+NODE 2864 81 4112 4053 0 0
+CTCCGCCGTTGCTTTCGCCGCTTCGGCCTCTGCTTTCTTCTTCGCCTCCGCCGCTGCTTTCGCCGCTTCGGCTTCCGCTTT
+AGAGGCCGAAGCGGCGAAAGCAACGGCGGAGGCGAAGAAGAAAGCGGAAGCCGAAGCGGCGAAAGCAGCGGCGGAGGCGAA
+NODE 2865 1646 91937 89580 0 0
+CTCCGCCACCGTTATTTTCAACGCCAATAGCCACACCTGCGACCAGTGCAGCAACGCCGCCAGCAACCCAGCCCCAGTGATTATCATTTTCAGGTGTAGCAAGGCAGGTCGGTGAGAGTTTTGCGCGTTTTTCTTTAGGCAGGGAGGAGATATTACTGGGACATTCTTTTTCATCATCGTTATTTTCTGCGGCGATGGCCGGAATGTAATAACTTTGTAGCGTTAAAGCGATAGCGATAGAAATAAGTTTTTTCTTTTGCATAGGGTTCATCCTTAATTAATATTTTCCTTGCGTACTAAACATATGCAGCGACCGATACAGGCAATGAAGAAATGGCCAGAAGAAAAATTATGCTTTAGTGTTTATTTTATCACCCGATAACCAGATCAGGTCAAATTGAGTGCTTAACGGTGTTATTTATTGTATGAATGAATAAGAGGTGAATTTGACGAGTAAAAGGGTTTTTAGGCAGAATTATTACTATTTAAATT [...]
+CTCCTCGGGCGGCACTTCCCCGGTGCTGGCGCGTCTGCTGCGCGAGAAGCTGGAATCGCTGCTGCCGCAGCATCTGGGGCAGGTCGCGCGCTATGCCGGACAACTCCGCGCCCGAGTGAAAAAGCAGTTTGCCACGATGGGCGAACGTCGTCGCTTCTGGGAAAAATTTTTCGTCAATGACCGGCTGGCGCAGTCGCTGGCGAATGCCGATGAGAAAGCGGTTAACGCGACAACCGAACGCCTGTTTAGCGAACCGCTGGATCACCGTGGCGAAGTCGTGCTGGTCGGCGCCGGGCCGGGTGATGTCGGACTGCTGACGCTGAAAGGGTTACAACAAATCCAACAGGCGGATATCGTGGTTTACGATCGCCTCGTCTCCGACGACATTATGAACCTGGTACGCCGCGATGCCGATCGGGTCTTTGTGGGGAAACGCGCGGGTTACCACTGCGTCCCACAGGAAGAAATCAACCAGATCCTGCTGCGTGAAGC [...]
+NODE 2866 2950 179912 179401 0 0
+TGGGTCTGCCTTATCTATTGAATAAAGGTAACGGTTAATGCCTTCTGTAATTTCTTGTTTAACGGTCGACGTAGCTTCATTTTGTGCGGCGGTTGGCGTTGCCGCTGATGCCGATGACACCATCAGAGTTAACGTTATCGCGGCGGCCGAAAACAATAGTGACGTTTTTTGCATAATAGTTATACCCATATGGTCTGTTTTTGAGACGCTTTATCTTTCCTGTTACGTTCACCTTTATACTAAAGGAGCATGGCTCACGAACAATAAAAAACATCCTTCTATAAAACTACCCCGAAAAGGGAGTAGTGCAATTAAGAATATCGTATTTGTTTGTAACGACATGACTCAAAATATCAACATTTAGAGTTTCAGTATTGTTGTCCATTGACTTACTTTTATGTTTATTACCGCTGGTAAATAGTTAATCTTATGAATAGTGATACACAAATGACCGTTTGCGCTATGTGATAATTAACCATAGTAAAAATACAC [...]
+TCCCCTGGATGTCTCGCCTCTGGCTATCGAATATCCGCTGCTGTCAGCCTGTTGTCTTAGCGGAAAAACGACTGCGCTACGTCTGCTGGCCCGCTGCATTACGCTCGCCCGAAGTTTGAGCGCCCTTCCTACCCTGCGCTGGAATCGTTTTGATGATGGCGAATGGAAAATAGCGGTAGTGGAAACCGCGCGAGGATGGTTAGTTCATCAGGCCAGACTGACGACGTCAGGCAATATTCTTGATTACCGTATTATCTCGCCTACCACACGTCACGCCCAATCTGACGGCGTCATTGCTCGCGAACTGGCCACTATTCCACTCTCATTGTGGTCGCAACAGTTACAGGTAATTGATCCTTGTGTCGCCGTAAATATTGTTGAATGAAGGAGCTGGCCCATGCATGAATTAGCCCTGGCGCAAAATATTATCGAATTGCTGGAGGAACAGGCAGTAAATCACCAGTTCAGCAAGGTAAAGCAAGTCTGGCTGGA [...]
+NODE 2867 9 772 763 0 0
+CTTCTTCGC
+GAAGAAAGC
+NODE 2868 72 1746 1688 0 0
+TGGCGATGACGATGTGACCCCACCCGACGATAGCGGCGATGACGATGTAACCCCGCCTGACGATAGCGGCGA
+TGGGGTCACATCGTCATCGCCACTATCATCGGGCGGGGTCACATCGTCATCGCCGCTATCATCGGGCGGGAT
+NODE 2869 3 152 104 0 0
+TGA
+GGG
+NODE 2870 22 2308 943 0 0
+GCTCATGGACGAAATCGCCGTG
+CGCTGGTGGCGACGTTGGCAGG
+NODE 2871 48 1048 1048 0 0
+CCGGTCGATCCGCGCAAAGCCGCAGTGGAGGCGGCTATCGCTCGCGCC
+CGGCAGGTTCGCTTCCGGCCTGCTGCTCCTGTTTGCGGGCTTTGGCGC
+NODE 2872 17 500 500 0 0
+AAAGCCCGCAAACAGGA
+GCGCGGATCGACCGGTT
+NODE 2873 115 144 144 0 0
+CAGACCCCGATCTCCCCTGTGTCGCCTCTGAAGCCGATCGCCGATAAACGCCGAGACCACGCTTATAAATGAAGAGAGCGGCGGGAGCCCGAATAAAGCATTGTCTGGCTGCATT
+TAAGCGTGGTCTCGGCGTTTATCGGCGATCGGCTTCAGAGGCGACACAGGGGAGATCGGGGTCTGGCCAGGAAGAGGCTGGAAAATCAATCCCTCCCGCGTATACCCGTCATACT
+NODE 2874 1685 85285 84660 0 0
+TACCGTAACACCGACTTCTTCGGCCTGGTGGATGGTCTGGACTTCGCGTTGCAGTATCAGGGCAAAAACGGCAGCGTGAGCGGTGAAAACACCAACGGTCGCAGCCTGCTGAACCAGAACGGTGACGGTTACGGCGGATCGCTGACTTATGCAATCGGCGAAGGCTTCTCTGTCGGTGGCGCTATCACCACGTCTAAACGTACTGCCGATCAGAACAACACCGCTAACGCTCGCCTGTATGGTAACGGCGATCGCGCCACGGTTTACACCGGTGGCCTGAAATACGATGCGAACAACATCTATCTGGCAGCGCAGTATTCTCAGACCTATAACGCAACCCGTTTTGGTACCTCTAACGGTAGCAACCCGTCCACCTCTTACGGTTTTGCCAACAAAGCGCAGAACTTTGAAGTGGTTGCTCAGTACCAGTTCGACTTTGGTCTGCGTCCGTCTGTGGCTTACCTGCAGTCTAAAGGTAAGGACATCAGCAAC [...]
+GGGGCGCCCCGTTTGCGGATCGATAACGTGCGAGACACGCTTGCCATCCAGCTCATAATAGTTGCGGTAGCTGCCGGAGGTGCTGATGCCATGCCCGTTGATATCCACAATCGCCTGCACCGCGTTTTCCCGGTCGGTCGGCTTCTGAATCGCGACGCGCCACGGCTGCCCCTGCGCATTCATCCCGCGACTGCTTAATGCGCCCCCCACCGAGACCAGATAACGCGCAATGCCCTCCTGCTCCATCAGTCGCGCCAGATGATCCGCCGCATAGCCCTCCCCGACCGTGGAGAGATCAACATAAAGATCCGGCAGATCTTTTTGCAAAAACTGATGTCCAGCCCTGTCGATAACCTGCAAATGTTGCAGGCCTGTTTTCGCTTTTGCCGCATCGATTTGTGCTGGTGTTGGGATATGCAGCGGCTGCCGATCCGGCCCAAACCCCCACAGATTGACCAGCGGGCCCACGGTGATATCCATCGCGCCATCCGT [...]
+NODE 2875 6 261 252 0 0
+TATCCC
+GCTGGC
+NODE 2876 51 78 78 0 0
+GCACTGAGCAAGGCGTGGGAGCGCTGACCGCCGCCACGCCGCTGGAAGAGC
+CCTTCTGTCGAGGAACCAAACCAGTTCCATGGATTTGCGGCAGACCAGTTG
+NODE 2877 51 59 59 0 0
+GGTCGATGGCCCGGCGGGATTTTTCTTTCAGGGCTATCACCCCTTCGCGCG
+CCCCTCCCCCCGCAGCTGCCAGCCGGTATCCGCCTGCATATCCTGCCGGAT
+NODE 2878 51 353 353 0 0
+GTTTATTGAAACGGACATGACGCGTGCGCTGTCTGACGATCAGCGTGCGGG
+CCCCGGAGCCACAACATTGACAGTAATACCACGGGACGCAACTTCACGCGC
+NODE 2879 150 955 955 0 0
+ACCCAGGTGGTATGCTTAATAGGTTTCCTCCGGCACTGAGTCTTGCGACCCAACACCAAGCATACATCGTTTAAGGCGTGGACTACCAGGGTATCTAATCCTGTTTGATCCCCACGCTTTCGTGCCTCAGCGTCAGTTGAGGCACGAAAG
+GATTAGATACCCTGGTAGTCCACGCCTTAAACGATGTATGCTTGGTGTTGGGTCGCAAGACTCAGTGCCGGAGGAAACCTATTAAGCATACCACCTGGGTATCTAATCCTGTTTGATCCCCACGCTTTCGTGCCTCAACTGACGCTGAGG
+NODE 2880 123 401 401 0 0
+CTAAACTTGCACTTGATCATGCTTGTGGTGCATCAAGTCGTGGAACTTGCTTTCCACAATTCAGTCACCCCCGTGTAACAACACCAGACTCGCAAGAGATTAAAGGACAGCCGATGCAATACA
+CGGGGGTGACTGAATTGTGGAAAGCAAGTTCCACGACTTGATGCACCACAAGCATGATCAAGTGCAAGTTTAGACCCATTGGCTGGTGGTATCTTCACCCAGTTATTTACTAATATTCATTCT
+NODE 2881 124 7066 6979 0 0
+TCTCTGGATTACGTCCCGGTGCGGCGTAATGGTGCGCTTAACCAGGACTGAATAACCGGAAGACGCTGTTCCCTTTTTACACCACGCCTGCCTTGTGCAGGCGTTTTTTTTGTCAACCGGAAAT
+AGGGAACAGCGTCTTCCGGTTATTCAGTCCTGGTTAAGCGCACCATTACGCCGCACCGGGACGTAATCCAGAGACTGCAGCAACTGCTCATCTGTCAGATCCAGAAAATCTTTGATTTCCTCCA
+NODE 2882 1553 89408 88389 0 0
+CTGATGAACCAGTCCCGGCTGCAGGATAATGTCGCCGTTATACTGCCGCAGGCAACCAAAGAGCTGTTCGGCTTCGACCCAGTCCGCGCTGACGACTTGTGTGACGGTGGCAAAGTTGTCTTGCGCATTCTGCGCGGCGCGGTAATGAACAGTATGCCCGGAAACGTCATAATGTCCGCCGGTTAATTGTCCGGCATCGGTTTGCAGAGCGCGGACGGCATCTGAAAGTAAAGTGAGATACTCTTGCTCTTCAGGCGCTTTAGTCAGCATAAAAGAGGATGATGCCCACGGCTGTATAAGTTGCTCAAGCGCAAATTGCAGTCGTGGCTGAGTATCACTGAGTAAGGTGTCGTTTTCGTCAGTCGCGTGTGGCTGTGCAAATATCTCCTGATAGCTTTCGCTATCCGGAACCAGATCACGCCATGCAAGTTTCGTAATGGTCAAAGTTGAGGTTTTTTAGTCTGTTGTAAAAGGGGGGATTATAGCCTAACC [...]
+AGCCGGAAGGCCAGCAGGCTCTGGATCAGCTGTACAGCCAGCTGAGCAACCTGGATCCGAAAGACGGTTCCGTTGTCGTTCTGGGCTTCACTGACCGTATCGGTTCTGACGCTTACAACCAGGGTCTGTCCGAGAAACGTGCTCAGTCTGTTGTTGATTACCTGATCTCCAAAGGTATTCCGTCTGACAAAATCTCCGCACGTGGTATGGGCGAATCTAACCCGGTTACCGGCAACACCTGTGACAACGTGAAACCTCGCGCTGCCCTGATCGATTGCCTGGCTCCGGATCGTCGCGTAGAGATCGAAGTTAAAGGCGTTAAAGACGTGGTAACTCAGCCGCAGGCTTAAGTTTCCGTCTGATAAAAAACCCCGCGTCGCGGGGTTTTTTGCTCTGGTCTGGGTGACAACGCCTTTCAGCGTTACTTCTTGCCTAATAACGCCTGTAAATCCTGCTTTAACGTGGTCATTTGCGTGGCATATTTCTCTTTAT [...]
+NODE 2883 40 40 40 0 0
+GGGCGAAGATCCGCGCTATTTTACCCTGCGCCGTCTTGAC
+AAAGGTATGTTGATGGCCATTGAATTTGTCGACAACGAAA
+NODE 2884 83 3572 3572 0 0
+GTCCGCCAGCGCGTCAGCCTGTGTCCGCAATGTGGATTACCCGCCGCGCATCCTTCGCTCCCCTGCGGTCGCTGCCTGCAAAA
+ACATTGCGGACACAGGCTGACGCGCTGGCGGACGGCGCGCGCGCATACGGAACAAATCCCCCAGTGGCTTAACGCCAGCGGCA
+NODE 2885 101 5380 5327 0 0
+ACCATGAGGGAGAGCTGTGGTGCGCCAATGCGTTTTATTTGTTCGATGCGCAAAACGTCGCGCTGTATCTGTTAACGGATGATAAAACCCGCCATGCGCAA
+GCGCATCGAACAAATAAAACGCATTGGCGCACCACAGCTCTCCCTCATGGTGTACGCACCAGGTCACCACGTGTTGTTTCGCCAGCCAACGGCCAATAGCG
+NODE 2886 25 1042 1000 0 0
+AAGAATTAGATGCGCTATTCGATCA
+ACCTTCGCTTTCGCTGTCGGAGGTA
+NODE 2887 62 4119 3852 0 0
+TTTGTACGGTGAATAGATACCGCAGGCGGGGTTTATTAACGGGATGCCCGTCAAGGTGCGGG
+TCACCGTACAAACGAACTGAAAGTCTCTCAACGCGTGAGTATGTAAGTATCCCGCATAATCG
+NODE 2888 35 451 451 0 0
+CTGGACAACGACAAAAATGAACTTCACTACCAGTA
+TGAAGTATGGCCCCGCTGTTGTCGCGGCCTACAAG
+NODE 2889 3 298 289 0 0
+GTC
+CTG
+NODE 2890 51 139 139 0 0
+GCATTGTATTTCTTTTTATTTACTCAAAGATAACGCCGCATAATGAATGGC
+CCCATTGCCGCGCCAATAAAAAAATAGGCGCAGAAAGCCAGTAATGCGTCC
+NODE 2891 1212 63788 63170 0 0
+TTGCCGATAACCGGTCTTTACACTCAGTACGCATCCATTTGCGTCCCGCGCCATGCGCCAGGGAGAAGAGGCTCTCCTCGCTGACGACGGGTTTCACCAGCCAGCTATAATCGCCGCGCGAGCCGGGGATAATCACCAGTCCCTGCCCATCTGGCGTAGCGCCTTTACGATGCAGCCACCCCGCCTCACCCGCGACAGTACAGGGTTCAACGAAGTTATGCGCCACATCCAGCCGCGGTTCGCCCTCAGCCTTGAGCTGTTGCAGTATCCGGCGGGCAATCAGCGCGCGATTACTGCGGGCAAATGCCAGCGCATCGTCATGTTCTGCAAGGTAGCGGCGCGCATCGTCGCTATCTTCCGGCAAACCGTTATGCGAAAACGCCTCCACATGACGACGCAGGATAGCTTGCCCCAGACCGCGTGAACCACTGTGTACCAGCAGTAATAACTGCGCTTTTTGCAACCCTGACAAAGCGAACAAATCAGCATCGA [...]
+TAGGGTTATAAGTCAGGCCATTAATTTTTATCACTATTACGATTGCGCCATCTAAATTTCAGTATTACTATACCCACGTTTTCTCATTCTCAATAACTGCAAAGGAGGTTCATCATGACACTTTATTCTCTGAACGCACTTTGCAGACCTTTCCAGGATTAATTTTCTTTTATTGCCCTGGATTAGTCTGCCATTTCCTGATTTTTTAATTCATATATGGAATGGTATATGGGCAATTATATTCGTCCTTTATCAGATGTGGTATTTTCTATCGCATCAGATAACCTGTGGATCGAAGATTCCGCGATCCAACAATTATATACGACGGCTAAGTTAACCGGTATGAAACGCGTTATCGGGATGCCAGATCTGCATCCGGGGCGCGGCTACCCTATTGGCGCAGCCTTTTTCTCGCGTGGACGCTTTTATCCGGCGCTGGTCGGCAACGATATCGGCTGCGGCATGGCGTTATGGCAAACGGATATTTTAGGG [...]
+NODE 2892 2 92 92 0 0
+GG
+AT
+NODE 2893 1275 71570 70721 0 0
+CAGGTTAGAGGTCAGTACGATGAACGGGTCGGTGGTGACCGCAAAGATCGCCGGAATACTGTCAACGGCGAAGATCACATCGCTGAACTCAACCATAATCAGCACCAGCAGCAGCGGCGTGGCATACAGCAGGCCGTTTTTACGTACGAAAAAGTGCTCGTTCTCGATCGTATCAGTCATGCGCAGATGCCCGCGCAGCCAACGCACCATCGGTTTTTCGCCAATGCCGGATTCGTCTTCCTTCGCCAGCGCCATTTTTACGCCGGTAAACAGCAGGAAGGCGCCGAACACATACAGCAGCCATTCGAACTGAGTGATAAGCCAGGTACCGGCGAAAATCATGATAGTACGCAACACGATCGCGCCAAGAACCCCATACACCAGCACCCGGCGTTGCAGAGCCGGAGGGACGGAGAAATAGCTAAACAGCATCAGCCAGACAAAGACGTTATCTACGGCCAGCGACTTTTCAATCAGATAGCCGGTAAGGAA [...]
+AAGTGTGTTTTGCGCCGCGCGGCGCGCTGATGCAGGATCTGACCCAGCCTCAGCATATTAATACCATGCTGTATGAAGCCGGGGCTTTTGCCCAGCTTATTGAAAACCACGCCGTGGAACATCCGGGGTTGTCGCTAAGTCGCGCCACGGCAAAATGGCTGACAGAAATACGCCGTCAAACCGGGGTCATCTTCCCGGCGGACGATCTAACTCATCCCCTTACTGCGTAAAATTATGTAAATAATATGTTACAGGTCATTGACTCTACGCGTGGCCTGTCATACTTTGTTACGCGCAAAGGGGAGTAACTTCATTGCCGGTCGATCGTCATTACGATGTGTGCAAAACCACATCCGGTCACCGGGCAGCCATAAAGGAATGCGTCAGCGTATTCCTTTATTGTTGTAAGTGAGACCTTGCCGAATGGCAAGGTCTATGCATAAAAGCAGCGGCTAATGCCATTCGGCGTTAGCCGTTTTTTTTTGCATGGGG [...]
+NODE 2894 150 9678 9619 0 0
+CTAATTAATTTCTATTGAGAAAGAATACACTCACATAAATAACAACACTTACCCGACAAAGGCATAACATATTCTTACTGCTTTTGTTTCTGTTTAATCAAATAATTTCCTCTTAAAATCTGTCTGTGTATAATGCTACTTATATAAATG
+TGATTAAACAGAAACAAAAGCAGTAAGAATATGTTATGCCTTTGTCGGGTAAGTGTTGTTATTTATGTGAGTGTATTCTTTCTCAATAGAAATTAATTAGATGTAATTTTAGTATAACATGTGATTTATGCTTGTTGCAGTTGTATTCAT
+NODE 2895 40 2285 2285 0 0
+TCTGCTCTCGCAGACACTGGTCGTGCATATGCTAAGGACG
+ACCAGCCGGACTGAAAGAGCGCCTGCGCCTCTACGTTATT
+NODE 2896 42 2701 2701 0 0
+ATAGCACTTATGATATAAATACCTTACTCTTTAGTTTTTGTC
+GCCTTCTGCCCTGCCGCTAAATATCTCATTGTTGTTAGCCTA
+NODE 2897 9 539 539 0 0
+TTAATTATA
+TCAGTATTG
+NODE 2898 30 1790 802 0 0
+ACCCGCCAGTGATGTGGTTATTGACACACT
+CCCACTGATTCCAAAAAGCAAATTGCCCAA
+NODE 2899 62 2975 2975 0 0
+TTTGAAAGTACTTGTTAAGTACAAGCGCACCCAAGCGGGAATAGCTCAGTTGGTAGAGCACG
+AGTACTTTCAAATTTTGGAGCGGGAAACGAGACTCGAACTCGCGACCCCGACCTTGGCAAGG
+NODE 2900 12 719 719 0 0
+ACCTTGCCAAGG
+TTGTACTTAACA
+NODE 2901 1 65 65 0 0
+T
+C
+NODE 2902 51 58 58 0 0
+GGTTTAATTTTTATATTGCCATCATAGGGTTACTTGCTGCAGGTAGTGGTG
+CCAGTCATTCTCTGTTGAGTATGGATTTCAAAGTATTTCCAGGCATGCTCG
+NODE 2903 51 169 169 0 0
+GAATGGCTTTCGCCAGCCAGCCGCCGGTACAGGACTCTGCTGTCGTTACGG
+CCCGACACCGCCGGAAGCTCCGCCTGGTTTGAACGCGGCTTTGTCACCTAT
+NODE 2904 33 139 139 0 0
+GTAGTGTGTGGATACTGCTTCAGAAAGTTCAGC
+TATTATGACGATAGCAGAGCAACTGGAAGAGAG
+NODE 2905 6 427 427 0 0
+TATTAT
+TTCAGC
+NODE 2906 51 2721 2709 0 0
+ACCTTCGCGATAAATCATGACGCGTTCCGCCGTCTGCGGAACGGTAAAGGG
+TGGCGTTTTTCCGCGAGTTTCCGGTCAGCATCAGGAATATTTACGGTTGAC
+NODE 2907 35 953 766 0 0
+ACCCCGCCGGTCACAAAAATATAGTTCGTTGTCAT
+TAAAGGCATTGCCGCAGCCTCCCTCGCAGCCATTC
+NODE 2908 32 3988 3725 0 0
+GCGCTGTTCTATAAAGTGGCGATTGGCTCCGG
+GCCCATGTCCACCGCCAGGTTCTCCATCTGGC
+NODE 2909 51 128 128 0 0
+GAGTTGGTGAAGGCGCGAATTTTCGCGGCGTTATCCAGCTTACTGCCTTCG
+CCCTGCCGGGCTTCAATATTCCTATGCTGCCGCGTGAGCTGTCTGACGATC
+NODE 2910 494 30070 29945 0 0
+CCGGTTTTTGCGCGCTGTCCGTGTCCAGGCTGGCTGCGCCAATAACGCCTGGTGGGATAGGCTCTAAGATATTTTTACTTTACTCTTGCTCACTCACTACAAGTGCGCTGTTATGGTAACGATAATAAATAATGTTGATGATATTTTCGGCCTGCTCGATCGCTTCAAGCAATAAGGTGTTTTGCTGATATTGCTGCGGATCCTGTAACCTACCGTTGTTCTCTTCTAACTGTTTCCGGGCAGCCCTTAATTGTAAAATTATGCCTTTGGCCTCTTCACGCGAATGAAGCAGCAAATCTTCTAACCGGGTCAGAGTTGTCATTTTCCACTCACTTAAAATCTAATGGATAGTTAATCAAAGTATCATAATGTTTAATCGTTACCACATCGGCACTCAGATGGACAATTTCTCCCCCATTGGGTAACAATGCCCCTACACGTAAACGCTCTTTATTCGTCAGTAATAAGTAATTACCATGGCGACTCTGTACAAA
+TTTACGTGTAGGGGCATTGTTACCCAATGGGGGAGAAATTGTCCATCTGAGTGCCGATGTGGTAACGATTAAACATTATGATACTTTGATTAACTATCCATTAGATTTTAAGTGAGTGGAAAATGACAACTCTGACCCGGTTAGAAGATTTGCTGCTTCATTCGCGTGAAGAGGCCAAAGGCATAATTTTACAATTAAGGGCTGCCCGGAAACAGTTAGAAGAGAACAACGGTAGGTTACAGGATCCGCAGCAATATCAGCAAAACACCTTATTGCTTGAAGCGATCGAGCAGGCCGAAAATATCATCAACATTATTTATTATCGTTACCATAACAGCGCACTTGTAGTGAGTGAGCAAGAGTAAAGTAAAAATATCTTAGAGCCTATCCCACCAGGCGTTATTGGCGCAGCCAGCCTGGACACGGACAGCGCGCAAAAACCGGAGCGTACACGTAGCACGTGAGGTTTGACTCGCTACGCTCGCCCTTCGGGC
+NODE 2911 51 1429 1394 0 0
+CGGGCGGGCGGCGGCGCGCTGCCCGCCAGCCACTGTGGAAATTCGCTAATG
+GGCATAACGGACAGATTATGTCCGCGATGCCGCATCTATAGACTTGATTCC
+NODE 2912 44 80 80 0 0
+ACCGGATGACTGCCTGATCCTGACCCTGGCGTGCGGTAAATACC
+CTGGCGTTGCTGACCAGTGATGATGCGCTGACGGATGACGTACT
+NODE 2913 1654 89150 88830 0 0
+AATGTATGAAGGTGGCGCAACCGAATGCGCTGACTAAACAGACCATTTTTTTCCATAAGCGATGTTAAAAACAGAGCCGTGCGGGTGACAAGTAAAGTTGTTTGTTTTTGATAACCTGATAGCAAAATATTATTAACATTTTACCATTTCAAGTTACAACTGTTTTATTTTACTGATGATTCAACTGCCGTTAAGCGTGTTAAGCCGCGATCTGGTCGGGGATATGCCAGCTCATGTCAATCCGTTCTGCATAATGAATTCAGGTCGGATCACACTTTATAAATTCTTCTCCCCGGAATGGATGAGGTTTTCTACACTCCAGGTAACATTCACTGGAGGCATGACATTATGGCGAACACCATCACGGCAGATGAGATTCGGGAACACTTTTCGCAGGCAATGTCGGCAATGTACCAGCAGGAAGTTCCGCAGTACGGTACGTTACTGGAACTTGTGGCTGACGTGAATCTGGCGGTGCTGGAAAATAATCCC [...]
+TCAAAGGCGTCGCGGCTGGCATTGCCGTGGCTTCTTGCCAGCGTTTCATCTCCCAAATTCGACTGGAAAATGCCGGCTGCGCTGACCGGAAGAAAATCTTCATAGGTAATCGGCTGCGCGATCACCCAACCGCGCTCAATAAGCGGCTGCGGATCGTCGCCAGGATGGATCGCCTGACGATGCGCCTCGCCGGAAGGCGTTAAGCGATAGCGGAACCAGGCAAGCCCCTGCTGGCGAAGCAGAAATTCGCTATCCGGAAAGGCGTTAAATACCTCCCGCAAATGGAGTTGATGCGTGAAGTTATCCTTACCCGTTCCCGCCTTGTGCAACAGTTCGTCATATAATCGACGACCTTTTGGCGTCAGCGCGACGCCACGTTGCTCAATTTCGCCGAAGCGCGCCGTGTGCGTACCCTGCTTTTCATCAACGAAGAGCACCTGCTCTTCCAGGGCTTTGAAACTGGTTTGCCGCAACAGAATAGGCACTTCGCGG [...]
+NODE 2914 51 114 114 0 0
+GTTGTAAATCCGCCTGTATGGCGGCAAACGCGGGCAGGTACATGTCCGTAG
+CCGCCTGCCGCCGCGGTCAGCGCCAGCCTCAGCCTGTTTTTAGCTGGCTTT
+NODE 2915 33 762 711 0 0
+TGACGATAGCGGCGATGACGATGTAACCCCGCC
+ATCGCCGCTATCGTCGGGCGGGGTTACATCGTC
+NODE 2916 18 571 457 0 0
+TGACGATAGCGGCGATGA
+AGGCGGGGTCACATCGTC
+NODE 2917 3 151 144 0 0
+GAA
+CGT
+NODE 2918 273 14781 14717 0 0
+ACGATCTGTGCGGCAATCAGCTACAACCGCTGTTGATCAAAACGCTCCTCAACCGTGCACAAGGCGCGCTGTTGATCAGCGCCGAAGGGATCGATGATGTCGCACAGGCAGAAGAGATGGTCAAACTGGCGACGGCGGTGGCGCATCTTATTGGTCGCTCCAACTACGATGCGATGAGCGGCCAGTATTACGCGCGTTTCGTGGTCAAAAACGTCGACAACTCTGACAGTTATCTGCGCCAGCCCCACCGCGTAATGGAACTGCACAATGACG
+GAGTTGTCGACGTTTTTGACCACGAAACGCGCGTAATACTGGCCGCTCATCGCATCGTAGTTGGAGCGACCAATAAGATGCGCCACCGCCGTCGCCAGTTTGACCATCTCTTCTGCCTGTGCGACATCATCGATCCCTTCGGCGCTGATCAACAGCGCGCCTTGTGCACGGTTGAGGAGCGTTTTGATCAACAGCGGTTGTAGCTGATTGCCGCACAGATCGTCGAGGATCTTGCCGATTTTGAAACGTAAGAAAGATTTGTATTCCAGCGCC
+NODE 2919 5 1422 712 0 0
+CGTAG
+TTTTG
+NODE 2920 21 120 120 0 0
+GCAAACCTCACGTACTACGTG
+AAGCGGCGTTCAAAACGCTAA
+NODE 2921 95 9561 5496 0 0
+ACTGTTGACCCATACCAGCGACTACAAAGCATTCCAGAATAAAACCGTGGTGGATATTCTGGATGAGGTTCTGGCGGAATACCCCTACCCGGTGG
+GTTTTATTCTGGAATGCTTTGTAGTCGCTGGTATGGGTCAACAGTTTTACCCACGGCTCCATACGCAGCTCATAGGTAACCGAACGCCCTTCATG
+NODE 2922 209 13441 13369 0 0
+GCGCCAGCTCGTCAAAGTAACGTTTATCTATCCCTTTTTCACGTAACGTATTGAGATAGCTAAAGATAGCTGCGACGACTTCATCACGATTGGCCAAACCTTTATCAGTCAGCGTTGCCGAAATGGCAAATACGCCGCTGTTACCATTAACAATCGGATCGGAATCCGCGCTAATACCTTCGACCAGTCCTTGTTTTTGCAGCCAGTCA
+ATCCGATTGTTAATGGTAACAGCGGCGTATTTGCCATTTCGGCAACGCTGACTGATAAAGGTTTGGCCAATCGTGATGAAGTCGTCGCAGCTATCTTTAGCTATCTCAATACGTTACGTGAAAAAGGGATAGATAAACGTTACTTTGACGAGCTGGCGCATGTGCTGGATCTCGACTTCCGCTATCCGTCGATTACCCGCGATATGGAC
+NODE 2923 41 2008 2008 0 0
+TTATTAGGTTTGCCTATCGCGACACTGGCGTTAATTGTGAA
+TTCCGCCCCAGCGCCGGAATTAATCGCAAAGGCCACACCTA
+NODE 2924 16 919 919 0 0
+ACCTGCCTGTCACGCA
+CTTTTACAACCACTGA
+NODE 2925 42 2084 2084 0 0
+TCATCCGGTAAGCCGTGGCGCGCTGTGCCCGAAAGGGGCCGG
+GCCTTCAATATGGTAAATCGCTTCTTTCGCGTTTTTTGCCCC
+NODE 2926 71 3206 2442 0 0
+CACCGGCCCGCAGAAGGAAAGTGATCCCCGCACGATAGAGTTTATGCCGGTTACCCAGCAACTCCTTCACC
+CTTTCCTTCTGCGGGCCGGTGATATGGACAGCCTGAAACGTAAACGGGTGGAGCTGACCACGGTTCTGCTG
+NODE 2927 125 1084 1084 0 0
+AGGACACTCACTGCTTCTCGGAATTGAAAAAAGGCGAAGAGGACAGTACTGAACATCAAGCCAGAGTATCATCCCCTCATGCTGCGATCCGAGCTCTACTTCAAAGATAGCGGCTGCTAGCTCAA
+GGGATGATACTCTGGCTTGATGTTCAGTACTGTCCTCTTCGCCTTTTTTCAATTCCGAGAAGCAGTGAGTGTCCTCTCATGCTGCGATCCGAGCTCTACTTCAAAGATAACGGCTGCTAGCTCAA
+NODE 2928 2 101 99 0 0
+TA
+TC
+NODE 2929 13 684 684 0 0
+TGCTTTCTTTACC
+AAAAGCGGGACTC
+NODE 2930 28 553 535 0 0
+CCGGACCATTCAATCGGTAGGTGCGACG
+GTTTCCTTCATTGGGAGTTGATCGCGAG
+NODE 2931 4 148 134 0 0
+GGCG
+GTTG
+NODE 2932 34 1838 1838 0 0
+GCTTTTTCCGCGGTTTCTTCATTTACGGGAATGG
+ATATAGCCACTCACGGCAAGTATACTTATTGCAA
+NODE 2933 848 61000 60828 0 0
+CAAAAGAAAGCGGCTTATCGGTCAGTGTCACTTCTTCATAAAACCCGCTTCGGCGGTTTTTTGCTTATCAGGCCGGTGAAGGGTATAGAGGTTGCAGAAGACGCCAGCGTCACTATCCGGCAATTAATTGACAGCCGTGGTGACATAATATTATTCGTTTTTGTGATGAGAAACACAAAACGCTATGGATTGCGCTCTTTTTAGTTGAAGTGAAAAACAATCGATTTCTTTCACAAAATTACATCCTGAAAAACAGCAAGAAAGCGGTGTAAATTATTTGTTGTAAATGAAAATTAAATGTATGAAATATTTTGGTTAAAATTTTATTAAATGTTTCTTTACAAACAAATAAGGTAAAAAAATGTGACGCGTAACGGTTTTTAAGCGCATTTACCTTCGGTTTATACTTAAATTTGAGAAATTACGCTTTAAATTTAACGCTGGAATTGCCGATAAAATGTCCCGTAATTGATTGAAATATCGTCTTCATGG [...]
+GACTTCCTGAAAGACCACCAAATGCTGTGTTTTAGGGAGAACAAGAGTATTCATATCTACCGCTCTGAAATAACATTGTGAACGGCAGGAAGTGTAGCAAATTAAATCTTAAAGGTTATGTGCGACCACTCACAAATTAACTTACCATAATTTTTACATGGTCTTTATTAAATAAAGAAAACCCATTACTTCAATGAGTTACAAAAACAAAACAGCAACTTAGCCTGATTTCAATCAAAAAATAGGGTCAGGATAACGATATATTATGGCGATAACCAGCCTATTTTATCTCCTATTTTCGACATCCCATGAAGACGATATTTCAATCAATTACGGGACATTTTATCGGCAATTCCAGCGTTAAATTTAAAGCGTAATTTCTCAAATTTAAGTATAAACCGAAGGTAAATGCGCTTAAAAACCGTTACGCGTCACATTTTTTTACCTTATTTGTTTGTAAAGAAACATTTAATAAAATTTTAACCAAAATAT [...]
+NODE 2934 51 170 170 0 0
+GTTGGCGAATAAAAAGCCCTGTCGTTCATTGACGCCGTTTTTTGTCAGGAA
+CCCTATGCCCGCCGTTTCTTTTGAACGCTGGTACAAACGTTATCAGACGAA
+NODE 2935 51 2444 2293 0 0
+ACCAGCCGCCGGGGTATTGAACCCCATTTAGTTGGCGCTACTATCCTGCAC
+TTTCAACTTCGGGTAATTCAGGCATAACGTCTCCGGCTGTGTGGCAGGTCT
+NODE 2936 51 61 61 0 0
+GTTCAATTTTCAGCTTGATCCAGATTTTTAAAGAGCAAAACTTCGCAGTGA
+CCACAGAACAACGAAAGTTGTTCGTGAGTCTCTCAAATTTTCGCAACACGA
+NODE 2937 35 1852 1852 0 0
+TTTTATTGGGCGCAAGCACCATCGTTGGCCGCTGC
+TCTACGGCGAAATGAAAGAGTTTTTCCCGGAAAAC
+NODE 2938 51 1546 1260 0 0
+GCCACGCCCTTACGGTCAGTGCGCGTCAGTGTCCGGGTAATGCCAGCGCCG
+CTTGTCTGCCGACACCCTGCCACAAAACAAGTTTTGCATCAGGGTGTCCGG
+NODE 2939 86 589 589 0 0
+ACCCGTAGGTCGTATGCGGTATTAATCCGGCTTTCGCCGGATTAATGCCGCTCCAAAAGCGCGAGGTCTTGCGATCCCCCGCTTTC
+CGAAAGCCGGATTAATACCGCATACGACCTACGGGTGAAAGCGGGGGATCGCAAGACCTCGCGCTTTTGGAGCGGCATTAATCCGG
+NODE 2940 32 1302 1236 0 0
+ACCAGCCGCTCTGGCCAACTGAGATCTTTCGC
+TTTTGATTTTGTCGAGATGTCGGTGGACGAAA
+NODE 2941 1564 97294 96580 0 0
+TGCTGTTACCGGCAATGGCGGTGGCCGGCAACGAAAATGACGCGCCACAGAACAAACAACTGCAATAAAGCTGGCCGCCGGAACAGGCGGCTGTCCGTACAAAAGGATGAACGACAATGAACATCAGTGAACTGATATCCGTCCTCAGCCAGGTCAGCCGTGAACTGGAAACAGCCGCTGTACAGCACGGAAGCCTCACGGATATTTCCCGTGAGGCGGCCCAATTACAGGAACAGCTTTGTCGTGGAAAACAGGTCACCCCGGCACAACTCCGAGCCCTGAATGCCCGGTTGTGGGGGATAAGAATGAGACTCGTGGTGCAGTATGGCCGGAGGGCCGGCCTCATTCATACCCTGGAGACGCAGAGCAGCATACTGGAAAATGCAGTGAATATTTTAAACAACCGCTGGCGTTACCGGGAATGGGTAAGCTCTTCCACATCCTTCATTCCGCCGACTGTCTTCATTATCCCGTTACTGAGCGTGCTCTGTT [...]
+GGTTGTGTTGTGACAGAGATAAAATGGACAGTATAAATTCTCCTTACGGGCAGCGGTGCCCGAAAAATAAGCCTTCTGTTATTAAATGCGGGTAAATAATCTGCCGCTCTGCGGATAATGTGTTCATTTTCAGCACAGACTTAACAGTGTAAAAATGATTACACCACCAAAGGAAAAGACCATTGGGATATTGTTCTCCTGTTGTGTCGATGTCAGTGTTAATAGTGGTGTTGCGAGGGCGTAAAAAACAATACCTGACGTATAGATGAAATAAGGTGTGAGACCGGACAGATGACATACGCTGGCGCATGTCAGAAGCGTGATGGCAACTAACGATAACATAATCACACTTGTCTTCCATTCGACGAACGGATTAAGGGAAATAATATCACCATCCTGTTTATAATTCGTGTTCAGTTTCAGGAATTTATGGATATCTTTCAGTGTGTTCAGTTTTTGCTGAATCTCTTCCACACGTTCCGGGCAGTTGCT [...]
+NODE 2942 23 1912 1840 0 0
+GCGCTGCGCTTCCATACGAATGC
+GGGAATATCCGCACACTCATGAC
+NODE 2943 20 26 26 0 0
+GAAATTGAGAGATTTCTTCT
+CCCGGCCTGGAGGCAACGTA
+NODE 2944 492 25946 25889 0 0
+TCACTGACGGAAGTCGAACTTATCGGGATGAATCAGGGATGTCCATGTCCCTGGCCGGAGATGACCTACGGTTGTTCAAATTCGTTCCCGATGAATTTGTCGTTCACTTGCCGCGTTACTCGGCCTGCGGCCTCGCCTCTACGGGCCAGCGCAAGCACTGGTCAAGGCACAAGCGCCTTGTCATGCAACTCGAATTATTTAGGGTTAAGAGGATTGCGTAATGATTAATAAAATTTTTGCCCTCCCGGTTATCGAACAGCTTACCCCTGTCCTTTCCCGTCGTCAGCTTGATGACCTGGATCTGATCGTCGTTGACCATCCGCAGGTTAAAGCCTCTTTTGCATTACAGGGCGCGCACCTTCTCTCCTGGAAACCCGTTGGCGAGGAAGAGGTATTGTGGCTCAGTAATAATACGCCTTTCAAAACCGGCGTGGCGCTACGCGGCGGTGTACCGATCTGCTGGCCCTGGTTTGGACCTGCGGCTCAACAGGG
+GCGTAGCGCCACGCCGGTTTTGAAAGGCGTATTATTACTGAGCCACAATACCTCTTCCTCGCCAACGGGTTTCCAGGAGAGAAGGTGCGCGCCCTGTAATGCAAAAGAGGCTTTAACCTGCGGATGGTCAACGACGATCAGATCCAGGTCATCAAGCTGACGACGGGAAAGGACAGGGGTAAGCTGTTCGATAACCGGGAGGGCAAAAATTTTATTAATCATTACGCAATCCTCTTAACCCTAAATAATTCGAGTTGCATGACAAGGCGCTTGTGCCTTGACCAGTGCTTGCGCTGGCCCGTAGAGGCGAGGCCGCAGGCCGAGTAACGCGGCAAGTGAACGACAAATTCATCGGGAACGAATTTGAACAACCGTAGGTCATCTCCGGCCAGGGACATGGACATCCCTGATTCATCCCGATAAGTTCGACTTCCGTCAGTGATTCGGGTGAGAAAGCATAGCCAACACACCTGCAACTTGAAGTATGACGGG
+NODE 2945 48 2070 2070 0 0
+GCCCACAGCAGGAGCGAGCCTTCATGACCGCCCCATACCGCCGCCAGT
+TGCTTCTTTCGGGGTGGACGGCGCTATTCGCCTGGCGCTCCCGGCATG
+NODE 2946 46 108 108 0 0
+GGAGTAATGTCTGGGAAACTGCCTGATGGAGGGGGATAACTACTGG
+CCCGCCACTCGTCAGCAAAGCAGCAAGCTGCTTCCTGTTACCGTTC
+NODE 2947 29 1402 1402 0 0
+GCCGATGGCGGCGTATGAGCTGGTCAGCG
+TTGATGGCAATCGAGTCGACGCCGGTTTC
+NODE 2948 32 1221 1128 0 0
+TAACCGGCATAAACTCTATCGTGCGGGGATCA
+ACCTTCACATCCTGACGTGCCCGGATGGACTC
+NODE 2949 98 3899 3899 0 0
+ATTGACTCGCTGCGCTCGCCCTTCGGGCAGTCTCCTCGCAAGCTCGTCGTCTGTCCAACTGGCTGCGCCAGTTGTCGAACCCCGGTCGGTGGTTCTCA
+GACGAGCTTGCGAGGAGACTGCCCGAAGGGCGAGCGCAGCGAGTCAATCCCCCCTCACCGCCATATTTAAGTTGAGAGCCTGTACAGAAGTACGGGCT
+NODE 2950 37 796 796 0 0
+TGAAGTATGGCCCCGCTGTTGTCGCGGCCTACAAGCC
+GTCTGGAAGAATAATATCAGCGATGCACTGGTTTTTG
+NODE 2951 51 2038 1361 0 0
+TGTAATGATATTCTGTACTGCCGCCAGCCAGCGGGCGGTTTCAGAACGCTC
+ACCTACACTACCGATGGCATCGTCCCCGGACCATACGTTAATAACCCATGG
+NODE 2952 60 1917 1617 0 0
+GGCCAGCGGCAGCACCCACAGCAGCACCGTCAGCGGGGTCAGCGGCGGGTCGTAGGTGAC
+GCCGCTGGCCGCCATCGTGGCGGGCGGGTGGATAATCGTCGCCCGCACGCGCCGGCGGGT
+NODE 2953 51 2675 2675 0 0
+ACCGCGGTAAGGCGGTATCTGAAGTCGCAAAACGCGATCCGGGCTATTTAC
+TATTTACCGAACGGGAAAGTGGTTAACAGCGCAGGGCGGCCCGTGATATTG
+NODE 2954 120 554 503 0 0
+CCAGCGCCCACGGCAGATAGGGACCAAAATGTCTCACGACGTTTTAAACCCAGCTCACGTACCACTTTAAATGGCGAACAGCCATTTAAAGTGGTACGTGAGCTGGGTTTAAAACGTCGT
+TTAAAGTGGTACGTGAGCTGGGTTTAAAACGTCGTGAGACATTTTGGTCCCTATCTGCCGTGGGCGCTGGAATTTTAGATCGGAAGAGCGTCGTGTAGGGAAAGAGTGTAGATCTCGGTG
+NODE 2955 84 2621 2517 0 0
+TGATTCCAGCCCCACTTTGTTCGATACGCGGGCTGCCATCGGCACCGCCGACACCCCCGCCGAACCGATAAGCGGGTTGATTTT
+AGCCCGCGTATCGAACAAAGTGGGGCTGGAATCAGACCCGCAGAACTTCCTGCTGATGCACGCGATGGGGCCGAACGTGGCGGG
+NODE 2956 15 150 150 0 0
+AGGGCGGCAGGATGA
+GTTTATGAAGAGGTG
+NODE 2957 15 142 142 0 0
+ATGACTGTCCACGAC
+GCTTACACTGACGGG
+NODE 2958 8 40 40 0 0
+GCTATACC
+CCCCGCCA
+NODE 2959 58 2968 1987 0 0
+TTTTGTTTTATCTGTAGTCTGCCGGTGAGCACTCGTTGCGCAGCAACGGCCCGTAGGG
+AAACAAAAGGCCCTGTCTTCCGACAGGGCCCTTCGTTTTATTTGATGCCTGGCAGTTC
+NODE 2960 231 11136 11057 0 0
+TCGACAACCCCTTCCTGCATACCACCACTTTTGGCGGTAATCCGCTGGCTTGTGCTGCCGCGCTGGCGACCATTAACGTCCTGCTGGAGCAAAATCTCCCGGCCCAGGCGGAACAAAAAGGCGATACGCTCCTGGATGGTTTTCGACAACTTGCGCGTGAGTATCCCAATCTGGTACACGATGCGCGCGGCAAAGGTATGTTGATGGCCATTGAATTTGTCGACAACGAAA
+TCGTGTACCAGATTGGGATACTCACGCGCAAGTTGTCGAAAACCATCCAGGAGCGTATCGCCTTTTTGTTCCGCCTGGGCCGGGAGATTTTGCTCCAGCAGGACGTTAATGGTCGCCAGCGCGGCAGCACAAGCCAGCGGATTACCGCCAAAAGTGGTGGTATGCAGGAAGGGGTTGTCGAACAGAACCGAAAACACCTCTTCAGTCGCGATGGTGGCGCCAATCGGCATC
+NODE 2961 2092 140063 139216 0 0
+ATCGGCTGACTCTGGGGCGCTACCCTGATATGAGTCTCAGAGAGGCCCGTTCTTCGCGTGATAAATGTCGTCAGTGGTTGGCCTCTGGTAAAGACCCAAAGCACCAGTTGGCGCTCACTACTCAGGAAACGCTTAAACCAGTCACGGTGCAGGAAGCTATCGAATACTGGATACGCGAATATGCGGAAGAAAACCGCGCGAACGTTGAGCGGCATAAAGCGGAGCTACGCAAACATATTTACCCTTACATTGGGAAAATGGCGCTCGCTGACTGCGAAACCCGATACTGGCTTGACTGCTTTGACAGAATGAAAAAGAAGACGCCAGTTGCTGCGGGTTATGTATTCCAGATGTGTAAGCAGGCTCTGAAATTCTGCCGCGTTCGCCGTTACGCCGTCAGTACCGCCCTTGAAGATTTGAGTATTCCCGATGTTGGTAAAAAGCAGGCGAAAAAAGATCGGGTATTGAAAGATAAAGAGGTTGGGAGATTGT [...]
+ATTCAGAAGGACACTTTCCTAACTGTTCTTGTGTTGTGGAGGAATATTGATATCTACATCATCTTACTGATACAGAGGAAAAAAATTCATTTCCTACGCCTATTTTTTTGCTCAATCAACCTCTCCCGAATTTCTCTCTCAAACTTTTCCAACGAAAAATTTGCAAGATTTTTTTCGAAAAAAGGCCGAATAGTTTCACAGAGTTTCTTTTCTCCGACTGATAGATCAGGGAAAATCGAACCGGCAATAACACTACTGCTTATCCTGTTTCCTGTAATTTTTTGCCAGCAGAACAGGTCAGCATAGGGGAAGATTCCATAACTTATTATCTTCCTTCTGGCTACTTCCCAAGAATTTATTGATAGTTCATTATTTGGGTCTGGAATATTTAAGGAATTTCGCCATAATGAAAGCAAAGATGATAAATCTTCAATTAAAAATTCATCAGGATAACGTAAGTCCAATTTAACAAAAAAATCATCCCCGAAATTA [...]
+NODE 2962 19 548 548 0 0
+TTTCAGCATCATCTCCCAG
+TGATAGAGCGCAGTATCCG
+NODE 2963 190 7956 7902 0 0
+AGACAATAATACCAGCGATAACGGCGCCGAGGATGCCGGTATCGATAGAGGGGATGCCCAGAATATTTTGTACGTTATTGGCTTTCAGCACCGCCGCATCGGTGGTCGGCAGAATGCCTTTTGCCGTGAGCCAGAAGTTGACTGCAAGGTTCATGACCGCATAACCGACGAACCCGGCAAACGCGGCGAC
+CAACTTCTGGCTCACGGCAAAAGGCATTCTGCCGACCACCGATGCGGCGGTGCTGAAAGCCAATAACGTACAAAATATTCTGGGCATCCCCTCTATCGATACCGGCATCCTCGGCGCCGTTATCGCTGGTATTATTGTCTGGATGCTGCATGAACGGTTTCATACCATTCGTTTGCCGGATGCGCTGGCC
+NODE 2964 51 207 207 0 0
+GAATACGGAGGGTGCAAGCGTTAATCGGAATTACTGGGCGTAAAGCGCACG
+CCCGCGGCTGCTGGCACGGAGTTAGCCGGTGCTTCTTCTGCGGGTAACGTC
+NODE 2965 16 587 484 0 0
+TGATCAACCTGCTGTT
+ACCCGCCAGCGCAAAA
+NODE 2966 3 117 6 0 0
+AGC
+CCT
+NODE 2967 51 87 87 0 0
+TCATCACTCAATATTGATATTATTTACGGCATTCCCGGCCAGACTCACGCA
+AAAAATGCCCCGCCTTTAGCCACTCCAGCGCCTGGTGCGCGCTGGCGGCAT
+NODE 2968 49 3626 3626 0 0
+ACCCGATGCTGATATCCTTGCAAAATCCAGCCAGTCGTCCTCTTTTCGA
+TTGCTCTTGCCATACTATTGCTTATACCGCTATTCAGGTTGCCTATTCC
+NODE 2969 47 1440 1358 0 0
+GTATTTCCCGCCACAATTCCTGTGCCGAAGGTGGTGTTCAGGGTATA
+TATTCTGCTGAATAATCAAATGGATGATTTTTCTGCTAAACCCGGTG
+NODE 2970 106 218 218 0 0
+GTTAGTGGGTTTAGACCGTCGTGAGACAGGTTAGGATTACTGTCGCGACAACCAATTCATCAGTAGGGTAAAACTAACCTGTCTCACGACGGTCTAAACCCAGCTC
+ATTGGTTGTCGCGACAGTAATCCTAACCTGTCTCACGACGGTCTAAACCCACTAACAGGGAACGTGAGCTGGGTTTAGACCGTCGTGAGACAGGTTAGTTTTACCC
+NODE 2971 31 1679 229 0 0
+CATACTGAGCGCCCAGCAGCATGTTCCACGG
+CGTTACCACCGAGTTTGGCTTTGCCGAGCGC
+NODE 2972 2 179 179 0 0
+TC
+CG
+NODE 2973 100 4552 4212 0 0
+ACGGTAAACGGCATATCAGCGGGCTGGTCACGGCGGCGCGGGTAGTCGGTCATGAAGGGCGTTCGGTTACCTATGAGCTGCGTATGGAGCCGTGGGTAAA
+ACCGACTACCCGCGCCGCCGTGACCAGCCCGCTGATATGCCGTTTACCGTCACCATCCAGTTCGATGTTGACGCACAGATCTTTGCCCACCATCGGTTTG
+NODE 2974 112 363 363 0 0
+CGGAACCCAAAGACTTTGATTTCTCCTAAGGTGCGGATGAAGTCGTTAAAAATCAACAATCACCCATCCCTAGTTGGCATAGTTTATGGTTGAGACTACGACGGTATCTGAT
+TGATTGTTGATTTTTAACGACTTCATCCGCACCTTAGGAGAAATCAAAGTCTTTGGGTTCCGGGTTGAGACTACGACGGTATCTGATCGTCTTCGATCCCCCAACTTTCGTT
+NODE 2975 40 134 134 0 0
+GGGGGATCGAAGACGATCAGATACCGTCGTAGTCTCAACC
+CTTGATTAATGAAAGCATTTACCAAGGATGTTTTCATTAA
+NODE 2976 25 180 180 0 0
+ATAAACTATGCCAACTAGGGATGGG
+CGTCTTCGATCCCCCAACTTTCGTT
+NODE 2977 1 40 38 0 0
+T
+A
+NODE 2978 51 69 69 0 0
+TTTGGTTTCCTTCATTGGGAGTTGATCGCGAGCCTTCACCGGACCATTCAA
+ACACAATCCCGAGCCTTCACCGGACCATTCAATCGGTAGGTGCGACGGGCG
+NODE 2979 106 130 130 0 0
+GGATTAACGCCGTAGTCGCCGTCTGGGCTGCGCCAGCGGGGAGCGCGTCCGATTTCACGCAAAATGCGCATTCATTTCGCGCTCAGGCATTGGGACAAACGCTGGG
+GAAATCGGACGCGCTCCCCGCTGGCGCAGCCCAGACGGCGACTACGGCGTTAATCCCCACCAGGAACAGAAAGCCGCTGTGCTCTGCTTTTTGCACGCCTGAAGGC
+NODE 2980 51 2370 2370 0 0
+ACCCGGCGCAACGCTGGACGCACGCCTGCATTTTCCGCTACGCGGCAACGT
+TTTATCCAAATCGATCTCGTGATACCAGATGTTTTCATCGCGAAGGGTATT
+NODE 2981 8 262 262 0 0
+ACCAGCCA
+GCCCGCCC
+NODE 2982 14 1182 1085 0 0
+TTCTGCATCGCTGA
+CTCAGGGTATAATC
+NODE 2983 64 2332 2317 0 0
+TAAGCGGGTGAAGTCGTCCACGACGGGAACGGCGCGCGGTGCGGGCGCGGCGACGGGTTCCGGG
+ACTTCACCCGCTTAAAGCCGGTGATTGCCGCCGCTATCCACCACCATCGCCGCCTTAACCCTTA
+NODE 2984 51 63 63 0 0
+GAGAAGCGAGTAATCACGGCAGACATGCCGCGAATAGCAAAGATGAGCAGG
+CCCCGGAACCCGTCGCCGCGCCCGCACCGCGCGCCGTTCCCGTCGTGGACG
+NODE 2985 117 326 326 0 0
+TAAAAATAAGGGTTGCGCTCGTTGCGGGACTTAACCCAACATCTCACGACACGAGCTGACGACAGCCATGCACCACCTGTGTATACGTTCCAAACGGCACTTTCTTCTTTCAAAGAA
+GGCTGTCGTCAGCTCGTGTCGTGAGATGTTGGGTTAAGTCCCGCAACGAGCGCAACCCTTATTTTTAGTTGCCTTTTGGAACTCTAAAAAGACTGCCGGTTATAAACCGGAGGAAGG
+NODE 2986 15 1418 702 0 0
+TCCACCGGGTAGGGG
+GGCAGGTGCAGTACG
+NODE 2987 20 837 816 0 0
+ACTCATACGGGCGGATCGGC
+TGAAAGGGATCGACAACAAC
+NODE 2988 6 352 352 0 0
+TAAGTC
+ACCGTT
+NODE 2989 126 448 448 0 0
+GTCAATTCCTTTGAGTTTTAGTCTTGCGACCGTAGTCCTCAGGCGGCACACTTATCGTGTTAACTGGGGCTCTGAAGGGGTCGATTCCTCCAAAACCTAGTGTGCACCGTTTAGGGCGCGGACTAC
+TTCAGAGCCCCAGTTAACACGATAAGTGTGCCGCCTGAGGACTACGGTCGCAAGACTAAAACTCAAAGGAATTGACGGGGTCGATTCCTCCAAAACCTAGTGTGCACCGTTTAGGGCGCGGACTAC
+NODE 2990 65 2365 1340 0 0
+GGCGATGACAATGTGATCCCGCCCGATGATAGCGGCGATGACGATGTGACCCCGCCCGATGATAG
+CACATTGTCATCGCCGCCATCGTCGGGCGGGGTAACGTCGCCGCCATTATCGGGCGTAGGGGGGG
+NODE 2991 404 23972 23882 0 0
+AGCCGAGTGAAGTCGATTACAACGTAGGCTATACCTCCATCGCCTCTGGCGATGCGACGTTTACCGCCGTGAACTGGCAGCCGCTGCATGATGATATGTATGCCGCAGCAGGCGGAGACAACAAGTTTTATCGCGAGGGCGTCTTTGTTTCCGGCGCTGCGCAGGGCTATCTGATCGATAAAAAAACCGCCGAGCAGTACAACATCACCAATATCGCTCAGCTAAAAGATCCGAAAATCGCCAAAATCTTCGATACCAATGGCGACGGAAAAGCGGACATGATGGGCTGCTCGCCGGGCTGGGGCTGCGAAGCCGTGATCAATCACCAGAATAAAGCGTTTGATCTGCAAAAAACCGTTGAGGTCAGCCACGGTAACTATGCGGCGATGATGGCTGATACCATT
+TTTTTTGCAGATCAAACGCTTTATTCTGGTGATTGATCACGGCTTCGCAGCCCCAGCCCGGCGAGCAGCCCATCATGTCCGCTTTTCCGTCGCCATTGGTATCGAAGATTTTGGCGATTTTCGGATCTTTTAGCTGAGCGATATTGGTGATGTTGTACTGCTCGGCGGTTTTTTTATCGATCAGATAGCCCTGCGCAGCGCCGGAAACAAAGACGCCCTCGCGATAAAACTTGTTGTCTCCGCCTGCTGCGGCATACATATCATCATGCAGCGGCTGCCAGTTCACGGCGGTAAACGTCGCATCGCCAGAGGCGATGGAGGTATAGCCTACGTTGTAATCGACTTCACTCGGCTTATTTACGGTATAACCCAACTTTTCCAGCGCCCGGCTGACCAGTAACGTC
+NODE 2992 51 88 88 0 0
+TGTGCTGTATTACACCTGGACCCCGTACTGGGTGAGCGACGTAATGAAGCC
+AGGCTTGCCTTCTTTAAAACGGGTAATGGTATCAGCCATCATCGCCGCATA
+NODE 2993 8 286 286 0 0
+TTGCTGGA
+ATCCGGGT
+NODE 2994 39 59 59 0 0
+ATGTCACCCCCTATTGCGAAGAGGGCGATTTTGGCGTGT
+CGGATATCGTTTTGCCGGCTACCACCCAATTTGAGCGTA
+NODE 2995 16 371 371 0 0
+TTCCGGGAAGAAGCGA
+CCGTGGACGACTTCAC
+NODE 2996 29 148 148 0 0
+AGCGGGAAAAGCTCAAACTGAAAATCCGT
+ATCCTTGTTAGTTTCTTTTCCTCCCCTTA
+NODE 2997 51 68 68 0 0
+CACTAGGGGAATCCTTGTTAGTTTCTTTTCCTCCCCTTATTAATATGCTTA
+GACGGATTTTCAGTTTGAGCTTTTCCCGCTTCACTCGCCGTTACTAGGGGA
+NODE 2998 61 140 140 0 0
+GGGTTTTCACACCTGAATTTAAGCATATTAATAAGGGGAGGAAAAGAAACTAACAAGGATT
+TGTGAAAACCCCCTGAATTTAAGCATATTAATAAGGGGAGGAAAAGAAACTAACAAGGATT
+NODE 2999 8 85 85 0 0
+CCCCTAGT
+AATTCAGG
+NODE 3000 51 70 70 0 0
+GATCAAATGACACCAGCGGCCCGACAAACCAGACCAGCAGCGCCAGAACCA
+CCCCTGCGCCCGCTGGCCTCCGTGGGTAGCCGGGTAGTGACCATTGCCCTG
+NODE 3001 863 40975 40684 0 0
+AATCCCCTGGAGCATAGATAACGATGTGACCGGAGTTTCTGAGCGCAGCCAACAAAGAGGCAGCTTAAAGGATGAAGTGTATAAAAACGGCCTCCGAAGAGGCCGCCGCACGTTTAAAAGATTAAAGCGCTTTCAGAATTGCATCCACGCTGGCTTTGGCATCGCCAAACAGCATTTGCGTATTCTCTTTAAAGAACAGCGGGTTCTGCACACCAGCATAACCGGTATTCATTGAACGCTTAAAGACCACGACATTCTGTGCTTTCCACACTTCGAGAACCGGCATACCGGCGATCGGGCTGCGGGGATCGTCTTGCGCCGCCGGGTTCACCGTATCGTTCGCGCCAATCACCAGCACGGTATCGGTATCGGCGAAATCATCATTGATTTCGTCCATTTCCAGCACGATGTCATAAGGCACTTTCGCCTCCGCCAACAGCACGTTCATATGCCCCGGCAGGCGACCCGCCACCGGATGAATGCCGAAACGCA [...]
+GCTTCATGTTGAGCAACGATTTGCTGATTGTGACCGGCGCGCTGGTCGGTTCGTCAGGCGCGATCCTGTCTTACATTATGTGTAAAGCGATGAACCGCTCTTTCATCAGCGTTATTGCTGGTGGGTTCGGTACTGACGGCTCCTCAACAGGCGACGATCAGGAAGCTGGCGAACATCGCGAAATCACAGCGGAAGAGACCGCTGAGATGCTGAAAAACTCCCACTCCGTCATTATTACGCCGGGGTACGGGATGGCGGTGGCGCAGGCGCAGTATCCGGTGGCGGAAATCACCGAAAAACTGCGTGCACGCGGTATCAACGTGCGTTTCGGCATTCATCCGGTGGCGGGTCGCCTGCCGGGGCATATGAACGTGCTGTTGGCGGAGGCGAAAGTGCCTTATGACATCGTGCTGGAAATGGACGAAATCAATGATGATTTCGCCGATACCGATACCGTGCTGGTGATTGGCGCGAACGATACGGTGAACCCGG [...]
+NODE 3002 51 1764 412 0 0
+ACCGGCATGTCCGCCCCGCCGATAGAGGCGACCAGATGCCAACCAAACGCC
+TGGTTGTTTCAATGCTGAACTCCTATTCCGGTTGGGCTGCCGCTGCGGCTG
+NODE 3003 39 1873 1388 0 0
+ACCGCCACTAACACGATAACGTTGCGTGAAAACCATGTT
+TGTAGAGTGTGAAGTATGTGAATCAGGGGGGCTAATCCA
+NODE 3004 51 124 124 0 0
+GATTCGTTGGGCGCGGGGCATGGTGCAAATTTTCCGCCTCGATAACCCTCT
+CCGCTGCCCGATATGCGCCGACAGGCTTTCCGTCGCCAGCCCCGCCGCCTG
+NODE 3005 51 112 112 0 0
+GAACCTGCAAGTGACTGATTTTTTTCTTGTTTTACATTAAGAGATGGCATG
+CCTCACTGCCGCCCGCCAACAGTCATGAAATCGATTTGTTTAGCCTTATAG
+NODE 3006 43 2154 2154 0 0
+TCATAAATCTGTCATAAATCTGACGCATAATGGCGCGGCATTG
+AGGCGGCATTGACAGCATGTTGATGATTTATGACACCGGTGAA
+NODE 3007 26 1427 1317 0 0
+TGGCGGGAAAGTGGTTTTCCATAAAT
+ATGACGCACAGATCGACCGGTGATAA
+NODE 3008 5 366 349 0 0
+TTCAA
+AGTAA
+NODE 3009 10 997 954 0 0
+ATCTGCTCCC
+GGATGGGCCG
+NODE 3010 37 1332 1123 0 0
+TGTTCACGTGGAACCTTTCTCCACTTCAGTCTTCAAA
+GGTTAGTCGATCCTAAGAGATAGGAGAAATCCGTTGC
+NODE 3011 46 264 240 0 0
+TGAGAACTTTGAAGACTGAAGTGGAGAAAGGTTCCACGTGAACAGC
+AAGACTGAAGTGGAGAAAGGTTCCACGTGAACAGCATTTGGACGTG
+NODE 3012 51 2053 1165 0 0
+GAATATTCGCCCAGGCTGTGACCTGCCATTAACGCAGGCATTTTACCGCCC
+CCGCGCTGGTTTGCGCTGGCGTCATCAACTTTGCTGATGCCGTTCGTCTGG
+NODE 3013 51 2151 2109 0 0
+ACCAGGCCCGCCAGGCGCGTATTACCCGCCTGCCCGGCGACCATAATGAGA
+TCTTCATCAAATCGTTTAATCGTGGTGTGGACAAAACTGAGGTGCGCCATC
+NODE 3014 151 6152 5850 0 0
+TCTTGTCGCCGGATTTGACTACCTGGCCGCTGCCGCTGATAGCGTTGGTAAAGTCACCGCCGGTGTTCAGTTCCAGCACGGCGTTGTCGGTGACGTCACCACTGCCCAGCGCCTCAACGTTGGTGGCGACCAGCGTGCCGCCGCTGATGGT
+TGGTGACGTCACCGACAACGCCGTGCTGGAACTGAACACCGGCGGTGACTTTACCAACGCTATCAGCGGCAGCGGCCAGGTAGTCAAATCCGGCGACAAGACGCTCACGCTCTCCGGCGCCAATTCTTACACCGGCGGCACCACCATCAGC
+NODE 3015 34 1795 1660 0 0
+TAAAAGCAAAAACCCGCCAGCTTACACTGACGGG
+ATGACTGTCCACGACGCTATGTCCAAAAGAAAGC
+NODE 3016 17 897 186 0 0
+ACCGGGCGGCAGGATGA
+TTTTATGAAGAGGTGAA
+NODE 3017 33 117 117 0 0
+ATCTGCTAAAATATCGTATTTATCAGCTTGCAT
+TGCTTTAAATCTTAATTTTAATGAAGTTTATAA
+NODE 3018 100 294 294 0 0
+ATAAGGAGTATAGAATTCTACTCTTTCAGCTCCCCAATTTCCTAATTTAAATGCAAGCTGATAAATACGATATTTTAGCAGATGGAGAAGATTCATGTGC
+TTAAATTAGGAAATTGGGGAGCTGAAAGAGTAGAATTCTATACTCCTTATATGCAAGCTGATAAATACGATATTTTAGCAGATGGAGAAGATTCATGTGC
+NODE 3019 51 55 55 0 0
+GGAAGCGCCAGTTGCCGCTTTGATCTACCGTGGCGGAACCGATTTCTACGC
+CCCCCGAACGCGCCGCTGGAGAGCAACGCGCACATCTTTACCGCCGTAGCG
+NODE 3020 51 2517 986 0 0
+ACCTTCCGTTAACGCCGCATGTCAAACGTTACCGGGGCGTGGATTAGGGGA
+TGGTGCTGTCTGTGGGTATTTTTCATCGGGCGTAATATAAACCTGACTCGT
+NODE 3021 51 72 72 0 0
+GTATCCGGAAACTCGCCATAAGCCAGCAGGTTCATGCTCGATAACCCGCCG
+CCCCTAACGATTATTCCGCCAGTAATCTTCTGCTTCCGCGTGGGGCTATCA
+NODE 3022 47 1131 1131 0 0
+GCCTCGATAGCCTTCAGCAGGGCCATCTCCGCCATCCCGGTGGTGGC
+TGTTGACGGCGTGGACACGGCAATTTCCTCCATGAGCGCCACCTACG
+NODE 3023 48 1289 1273 0 0
+CATTGCCGAAAAAACTTACCCTGGCGTATCACCTTCCTGTAGAGCTGC
+GTTTCATCAACGTCCTGCCATTGCGGGATTGTCCAGCCGGGTAGCAGC
+NODE 3024 48 48 48 0 0
+AATGAAAGCGTAATAAACGCCACAATCGGTTAATTTGTTTTATATGCT
+CTTTCATTCGGTTGTTTCGTTAAGTCAGTAAAACGAGAAGCCACGATG
+NODE 3025 101 676 676 0 0
+CCATCGCTCAAAGGATAAAAGGTACGCCGGGGATAACAGGCTGATCGCCGCCCCTTCCATACAGAACCACCGGATCACTATGCTCTACTTTCGTACCTGAT
+GCGGCGATCAGCCTGTTATCCCCGGCGTACCTTTTATCCTTTGAGCGATGGCCCTTCCATACAGAACCACCGGATCACTATGCTCTACTTTCGTACCTGAT
+NODE 3026 51 2479 1742 0 0
+TTACGCTGACGTGACGGGCTGGAATCACGCGGCAGAGTCTGCAGCTTAAGA
+ACCGCTGCCGTCAAACTGGTCGTCCGCACGCTTTCCTGCGGAAGTTCGGGT
+NODE 3027 1 84 84 0 0
+C
+T
+NODE 3028 73 3172 3058 0 0
+GTGCGAGCAATATCAACGTGGTTTTGGTGCGAGGGGGGGGACTTGAACCCCCACGTCCGTAAGGACACTAACA
+AACCACGTTGATATTGCTCGCACTGGGCGAAGGTGGCGGAATTGGTAGACGCGCTAGCTTCAGGTGTTAGTGT
+NODE 3029 1 7 7 0 0
+G
+G
+NODE 3030 962 53671 53185 0 0
+CCGGCTTGGTATCGGAATCCCAGGTTAATATTTTCACGCCTCTTTGCATTGCCCGCTTCAACGCCGGGCACAGGCCATCAGGCGAAACGGCAGAAACGATAATGGCGTCATACCCCTGATTGACAAAGTTATTCACCAGTTGAACCTGGCCTGAGACGCTGGGCTCTGTAGGGCCATCGTAAGTTACGTCAATGCCCAGCGCTTTTCCCGCTTCCTGCGCGCCATTGCCGCCGCTGGTAAAAAAGCCCACGCCAACCAGTTTGGGAATAAAAGCAATCCGCTCTGCCGCCTGCACGGTCATTACCGCAGATGCCAGACCAAACGCAGTGAGTAAGGCGATCATTTTAATGCTGTGTCTTGCCATTTTTTTCTCCATAAATTTCAAAAGGAAATCATGCCTGATGCGCATTGCGACGGCGTGAGTACCATTCAAGGATTTGGTGACGATGCAAACTGACGGAACGACCAACGACAACAACAATGAGAAGCGCA [...]
+TTCATTTCTTGGTATTCCCATGCCGCTTATTTTTTTTCTTGTGTGCTGTCTGTTTTTCTGGCTGCTCATGCATCGCACGCATATGGGACGCAACGTTTTCCTGATTGGCCAGAGCGCCCGTGTCGCGCAGTACAGCGCGATCCCGGTGAATCGCACGTTGTATACCGTGTATGCCATGACCGGATGCGCCTCCGCGATCGCCGCCGTATTACTGGTTTCTTACTTTGGCTCCGCACGTTCGGATCTGGGCGCCTCTTTCCTGATGCCGGCTATTACGGCGGTTGTGCTGGGAGGCGCCAATATTTATGGCGGCTCCGGGTCGATTATGGGGTCCGCGTTGGCGGCGCTGCTGGTGGGATTTTTACAGCAGGGGCTACAGATGGCCGGAGTGCCGAATCAAATTTCCAGCGCATTGTCCGGTGCGCTTCTCATTGTTGTTGTCGTTGGTCGTTCCGTCAGTTTGCATCGTCACCAAATCCTTGAATGGTACTC [...]
+NODE 3031 22 871 742 0 0
+GGTGCTGTATTACACCTGGACC
+TATCAGCCATCATCGCCGCATA
+NODE 3032 51 2312 2310 0 0
+ACGGTGGCGACGGGCGGCTGCTATTTGACCCCCGATATTGCCGTGAAACTG
+TATGCACCGCGGCGATCAGCTCATCCGGACTACAGCGTTTAGAGAGAAAAC
+NODE 3033 170 241 241 0 0
+TCGCCAAGATAGGAAAAGCAGCAGGTGACCCAGAAGAGAACACCGAACCACCAGACCACAAAAGGCGCACCTAAGACCACGCGAAGCAGGACTGGTCGCCCACGCTTTCCTCTTAACAACTTCAAGTACTTTTTAACTCTCTTTTCAAAGTTCTTGAAGTTGTTAAGAGG
+GTTGTTAAGAGGAAAGCGTGGGCGACCAGTCCTGCTTCGCGTGGTCTTAGGTGCGCCTTTTGTGGTCTGGTGGTTCGGTGTTCTCTTCTGGGTCACCTGCTGCTTTTCCTATCTTGGCGAGCCGAACTACCTCACGGTACTTGTACGCTATCGGTCTCCCCGCAGTATTT
+NODE 3034 1 103 103 0 0
+A
+C
+NODE 3035 7 192 192 0 0
+ACCCAGG
+TCAAGCT
+NODE 3036 7 231 231 0 0
+TCCCGGA
+GAGCAGG
+NODE 3037 51 2995 2389 0 0
+GCCGCCGCTATTCGCGCTACCTTTGGCAATATGGGGATGAACGACGAAGAA
+CGGCAGAAAGTGGTTCGCCGCTGTGATCCGGCCCTTCCGGGTTAACGTAGA
+NODE 3038 51 1832 433 0 0
+ACTCCAGACCCGCCTTTACAGCAACGATCAGACCAAGTCGGTTGATGTAAA
+TGATTTATGGACCAGGCCCTTACCCGGCATGAAATCCAGCTTCATAGTCGA
+NODE 3039 166 10109 10052 0 0
+ACTGTTGAATGCTCCACAACTTATCAACGTCCTGGATCCCACCAAAACCATTGATATGGAAGTGACTCTGGGAGGACGGTCACTGACCACCACCAATTCTGTACTGGAAGCTAAAACCCTGTTCCCGGACGGAAAAACTGGCGATGCTTCAGCTCTGCTGAACCTG
+TTTTAGCTTCCAGTACAGAATTGGTGGTGGTCAGTGACCGTCCTCCCAGAGTCACTTCCATATCAATGGTTTTGGTGGGATCCAGGACGTTGATAAGTTGTGGAGCATTCAACAGTTTTACATCAACCGACTTGGTCTGATCGTTGCTGTAAAGGCGGGTCTGGAG
+NODE 3040 51 1269 1269 0 0
+ACGCCTGCCGCCGCGGTCAGCGCCAGCCTCAGCCTGTTTTTAGCTGGCTTT
+TTTGTAAATCCGCCTGTATGGCGGCAAACGCGGGCAGGTACATGTCCGTAG
+NODE 3041 247 507 507 0 0
+CTTCAGTGTATCTTTACCACACATAAATACCATAACTAACCAAATCATGAAGTGAGTGAGCTGTAAGCTCTCGTTCACAAAGTATGCAAGTAGCTGTATTTACATTACTCATTAACCCGATCACCTCGTGTGAACTTGGATAATAGAGGGTAAATATCAGGCGTTTACGCGACTACTTAGCCCCCTCAAACTATTTATGTTATCTGAAGTCAAGCAAGAGCTTACAGCTCACTCACTTCATGATTTG
+TAAATAGTTTGAGGGGGCTAAGTAGTCGCGTAAACGCCTGATATTTACCCTCTATTATCCAAGTTCACACGAGGTGATCGGGTTAATGAGTAATGTAAATACAGCTACTTGCATACTTTGTGAACGAGAGCTTACAGCTCACTCACTTCATGATTTGGTTAGTTATGGTATTTATGTGTGGTAAAGATACACTGAAGCAATCTGCGCCTCCGCCTGGCGAGAGGCTTGTTTGCTTCAGTGTATCTTT
+NODE 3042 9 683 683 0 0
+ATAATACTT
+CCAATACTG
+NODE 3043 2 2 2 0 0
+TC
+CC
+NODE 3044 10 6210 18 0 0
+ATTTTTCGTC
+AGTTTAATTG
+NODE 3045 30 1478 1416 0 0
+ACCCCGGAAGGCGCGCGCGATTACCTGGTA
+TTTCAATATCAAGGAAACCGTGATCGTCCA
+NODE 3046 41 3028 3028 0 0
+TCGGGATCCGCGATCTGGATCCCGATTCAGCCTGCTCTTCG
+GGTTTTCATCTTGATCAAATGTCTTTAAATGTCATATAAAA
+NODE 3047 1 87 87 0 0
+T
+T
+NODE 3048 212 10490 10308 0 0
+AGGCGCCATCGGGCCTGGTTATCCCAATGATACGCTAAAGCCTGAAAGTGAAGCCCGTGTGAAGTATGATGACGAGCATCGTCTCTTATCAGGACATCCTATGAAACAAATCACCTTTACGCCGCGCCATCACCAGCTTACCAACACCAATACCTGGACACCTGACAGCCAGTGGCTGGTCTTTGATGTGCGGCCTTCAGGCGCGTCATTTA
+GGTGTCCAGGTATTGGTGTTGGTAAGCTGGTGATGGCGCGGCGTAAAGGTGATTTGTTTCATAGGATGTCCTGATAAGAGACGATGCTCGTCATCATACTTCACACGGGCTTCACTTTCAGGCTTTAGCGTATCATTGGGATAACCAGGCCCGATGGCGCCTCGCCACCGGGCCGTCAGGGTCTTATTTCTCCTGCGCCAGCCGGATACTGC
+NODE 3049 51 109 109 0 0
+GGGTGCTGTCTGTGGGGATTTTTCATCGGGCGTAATATAAACCTGACTCGT
+CCCTTCCGTTAACGCCGCATGTCAAACGTTACCGGGGCGTGGATTAGGGGA
+NODE 3050 46 46 46 0 0
+CCGCGTCTACCTGGATCCTGTGGACAGTGCTGGGCAGTAACACGCT
+CAGGTTCAGCCGCGCCGCAAGCAGCGTCAGCTTAATCAGAAAGTCC
+NODE 3051 42 1438 1438 0 0
+TGGGCGAGCTGGCTATTGATGTGTTGATTCATCGGATGGCGC
+TTCGGCTGATGGATAGTCGTCAGCGGCGGCGTCATATAGCGC
+NODE 3052 43 52 52 0 0
+TAATTGCTGAAATGTTCTATAGTTAGAGTGATTTTGACTACTA
+CTCAGCGGAACAGATATCTTCCACTACTGGCTCTCTTTGATAT
+NODE 3053 51 2276 2121 0 0
+TAAGAGCGTTATCCAGACAGCAAAACGGCTACCGCCATGGGTAGCCGTTTA
+ACCGCTAAAATACCTGACCCCGCCATCAGACAGGCCTGGTTAACAATATTG
+NODE 3054 8 427 427 0 0
+GCTATACC
+ACCCGCCA
+NODE 3055 18 18 18 0 0
+ACCACTAAACTAGTTTGC
+AGGTGTGACACGCCTCGC
+NODE 3056 39 1932 1846 0 0
+TATGAGACACCAGTTGCTGTGTGAAAGCGTGTTGCGGGT
+ACCCTGCCGGAACGTTTACGGGAACACCTGCCCGGGCAG
+NODE 3057 51 2269 2176 0 0
+GAAAAAAACCATTACCGCCGGCGTAAACAGGCGAGCCAGACGGTGTCCTAA
+CATGCTGCTTTTGGGCGCGCAGCTGACCTCAATATTTTTTAAAGGCATGCT
+NODE 3058 177 566 566 0 0
+GGTTATAATTAATTCCCTGAATACGATCTAATTTCTTAAGAGTAGAAACTCCGGAACCAAGGGTTCCCGTGTTCCCATCGGTTCCGGAGTTTCTACTCTTAAGAAATTAGATCGTATTCAGGGAATCAATACGAGACAGGATGCCTAACTCATTAATGTCTTGTCGATTAATGGTTA
+GATTCCCTGAATACGATCTAATTTCTTAAGAGTAGAAACTCCGGAACCGATGGGAACACGGGAACCCTTGGTTCCGGAGTTTCTACTCTTAAGAAATTAGATCGTATTCAGGGAATTAATTATAACCTAACCATTAATCGACAAGACATTAATGAGTTAGGCATCCTGTCTCGTATT
+NODE 3059 14 1013 1013 0 0
+AACGTTCCTACAGG
+AAATGCATAAAAGC
+NODE 3060 12 981 981 0 0
+TATATTGTCACC
+ATTAATTTACTT
+NODE 3061 39 3824 3824 0 0
+ACCTGTAGGAACGTTGCTCTCTGGTTGCAGTCGATCCGG
+ACCCTACTATCCTCTCAAAACAACATCATTTTGATAACA
+NODE 3062 12 1013 1013 0 0
+ATTACGCAAATT
+TGGTGACAATAT
+NODE 3063 51 97 97 0 0
+TCCGGGCGGCAGGATGAATGACTGTCCACGACGCTATGTCCAAAAGAAAGC
+AAAAAGCAAAACCCCGCCAGCTTACACTGACGGGTTTTATGAAGAGGTGAA
+NODE 3064 47 109 109 0 0
+GAAGGATGGCCCGTACCGAAATTTGGTTACGTTTAATGTACGTCGGC
+TCCCCTGCCACAAGCAGTCTGAACAATCTTTGCGATTGGTCACTGAT
+NODE 3065 20 1371 1335 0 0
+TTGTTGAACCTTCTCAACAT
+ACCTTTGTTTCCCACCAGCA
+NODE 3066 2662 149923 148909 0 0
+AGTATTTCGGTCGGATTTATGTGGATGGCAAACTTTTTAGTTTCGCAATTCTTCCCGATGATTAATGAAAACCCGTATTTACTTTCGCATTTCCACGGCGCATTTCCAATGTGGATATTTGCCATCTGCTGCATCTTCAGTTACTTCTTTATCTGCCGTTACCTGCCGGAAACAAAAGGCATTTCGCTGGAGAAAATGGAGAGCGTAGTGTTAGCAAAACGCAGAAAAAAACTGCAGCCAATTCAAACCGAACGTTATTCTGATTAAGTTTCACCACAATGCCGATGATCGCTAAATACGATCATCGGCTTGTTTTTTTACTCCGTCGCCAGCGCCAGTGAAACCGCTAACGTTTGCGCCAGACACATGGACGCGACCTGAGAACGGAAACCATCGACCTGCGCTTCACGTACCACAAAACAGACTTCACTGAACGCTGCCAGCGGGCTGACCTGGCTATCGGTTATCGCAATATGGTGCGCACCGCGTTTC [...]
+GCGGCGTACCGGGCAACTTTGAGGTTTCCGCGCGCCTGGGCGAGAGCCCGTTCTTTGTTATCGAAGCGGATGAGTACGACTGCGCGTTCTTTGATAAACGTTCTAAATTTGTGCATTACTGCCCGCGGACGCTGATCCTCAACAACCTTGAGTTTGATCATGCCGACATCTTCGACGATCTGAAAGCGATCCAGAAGCAGTTCCACCATCTGGTGCGCATCGTGCCGGGGCAGGGGCGCATCATCTGGCCGGAAAACGACATCAACCTGAAACAGACCATGGCGCTGGGCTGCTGGAGCGAGCAGGAGCTGGTGGGCGAGCAGGGACACTGGCAGGCGAAGAAGCTGACTACGGATGCTTCCGAGTGGGAAGTGTGGCTGGACGGCGAAAAAGTCGGCGATGTGAAATGGGGCCTGGTCGGCGAGCACAATATGCATAATGGGCTGATGGCGATTGCCGCCGCGCGCCACGTGGGCGTCGCGCCCGCAGAAG [...]
+NODE 3067 29 911 911 0 0
+CGGGCGCGCAGCGAACGGGCTGCCCGAAG
+AGTTGTCGAACCCCGGTCGGTGGTTCTCA
+NODE 3068 10 606 606 0 0
+GGCGAGCGCA
+TGGCTGCGCC
+NODE 3069 21 1016 1016 0 0
+GACCTTCGGGTTATGAGCCCG
+CTTAATGAACACCCTTACGGG
+NODE 3070 1 84 84 0 0
+A
+A
+NODE 3071 11 482 482 0 0
+TTACAATGAGA
+TTATGAGCCCG
+NODE 3072 51 78 78 0 0
+GTAAGCATGAGATTAGCGAGAGCATAGAACCACCGCGTAAGCGGCCTCCGC
+CCCCCCCCGGCCTGCCGATCTTTAAGCCGCGCGGTTTCCCAGAACTGGCGC
+NODE 3073 4 11 11 0 0
+GCCT
+ATCA
+NODE 3074 1213 53784 53352 0 0
+TCATTAACGGGCTTTCGGCATCCTGCTGCTGGAGTTCGCGCTGCGGTTTACAGCGGCGCAAAATGGTTTTCACGCGGGCCACGACTTCGCGCGGGCTGTAAGGCTTACAGATATAATCATCGGCGCCGATTTCCAGCCCAAGCAGCCGGTCGATCTCTTCGATTTTGGCCGTGACCATCACAATGGGGATGTCGGAAAAACGGCGAATCTCCCGGCATAGCGTCAGACCATCGGTACCCGGCAGCATCAGATCCAGCAGGATCAGATCCGGTGGCGTTTGACGCACATACGGCAGTACCTTGTCGCCATGATTGATGAGCGTGGGGGCGTAACTCGCCGCGCGTAAGTAGTCAATAAGCAGCTGTCCTAGCTTGGGTTCATCTTCAACAATCAAAATGCGCGGCGTGTTTTCATCAATGGGTAATTCAGTCATACTTCTCTCTGTAAATCGCGATCCAGCGGTAACTCTACTGTAATGCTAACCCCGCCAAA [...]
+CGCAGGACTTTAACCAGCTTGCCAGCACGCTGGAAAAAAACCAGCAGATGCGCCGCGACTTTATGGCGGATATTTCCCACGAACTGCGCACGCCGCTGGCGGTATTGCGCGGCGAACTGGAAGCCATTCAGGATGGCGTTCGCCAGTTCACGCCAGAATCGGTTACCTCGCTACAGGCGGAAGTCGGTACGCTTACCAAACTGGTTGACGACCTGCATCAGCTGTCGTTGTCTGACGAGGGCGCGCTGGCTTACCAAAAAACGACCGTCGATCTTGTTCCCCTGTTGGAAGTCGCTGGCGGCGCGTTCAGAGAGCGCTTTACCAGCCGGGGGCTAACGCTACATTACGCGTTGCCGGATAGTATGACCGTCTTCGGCGACCCGGATCGCCTGATGCAACTGTTTAATAATCTACTGGAAAACAGTCTGCGCTACACCGACAGCGGCGGCGGCCTGCATATTTCCGCCGAACAACGCGACAAATCATTATTCC [...]
+NODE 3075 1 115 115 0 0
+A
+G
+NODE 3076 36 844 844 0 0
+TTCATCTTTCGGCTGATGGATAGTCGTCAGCGGCGG
+AGTTAGCGATGAGGCAGCCTTTTGTCTTATTCAAAG
+NODE 3077 13 235 235 0 0
+CGTCATATAGCGC
+GGCACTGTTGCAA
+NODE 3078 13 790 21 0 0
+TGGTGACGTTTGC
+TTTGGTTTTAAAG
+NODE 3079 51 2187 2129 0 0
+ACCCGACTCATCACGCTCGACGCTCAGTACCTCGCTACGCAGGCGCATCGT
+TTTCATACTGGCGCTGAACGGCGAGACGGTGACTACGCAAAAGCTGGTGAT
+NODE 3080 44 324 324 0 0
+AGTGCCGATGGCGGCACGCGTATCGAACAAAGTGGGGCTGGAAT
+CCCCCCGCCGAACCGATAAGCGGGTTGATTTTGTTCTTACTGCA
+NODE 3081 51 52 52 0 0
+GTAAGGGGTAAGCTATTGCTGTCGCCAATATAACTGGCGCGCAGGCCGTTC
+CCGGCCCGCTGCCGACGGTAAAATTTATCGTCGAAGACCTTTGCGCCACGG
+NODE 3082 69 2781 2781 0 0
+CAGCAGTTGCTCCGTTAAATCCAGCCAGGTCTGCAGCGTGTGCGCCGGGCTGGTGGTGTAACTCAGGGT
+TTTAACGGAGCAACTGCTGGAAACCGGCGTCGACTCGATTGCCATCAAGGATATGTCCGGCATTCTCAC
+NODE 3083 46 60 60 0 0
+ATTTCGGCAACCTGAACGTGGCGGGATGCCGGTTCGTCAAAGGTAG
+GCCGAAATGGTTATCGAGAAGGCGAAACGTCTGGTTGAACACAAGA
+NODE 3084 51 111 111 0 0
+GTACGCTGACGTGACGGGCTGGAATCACGCGGCAGAGGCTGCAGCTTAAGA
+CCCGCTGCCGTCAAACTGGTCGTCCGCACGCTTTCCTGCGGAAGTTCGGGT
+NODE 3085 83 548 548 0 0
+CAAAACACCATGAGTTGCCCCACAATGCCTCAATCCGTAGAGCTCACTAAGCCATTCAATCGGTAGTAGCGACGGGCGGTGTG
+TTGAGGCATTGTGGGGCAACTCATGGTGTTTTGAGAAGTAGATCAAACTTGATCATTTAGAGGAAGTAAAAGTCGTAACAAGG
+NODE 3086 51 202 202 0 0
+GTTCTTTGTACTGGATGAAGTGCCTGACTGCGAGACGCTATGGATGCTGGC
+CCCCGACGCGTCGCTGACCACTTGCACCTCATCGCCAGGTTTTAGCGCCGC
+NODE 3087 1 56 56 0 0
+A
+A
+NODE 3088 51 71 71 0 0
+GAATGAGGGAAATGATTAGGCGTAACCGTAGCTCATCAAACGCTGGTAACG
+CCTCCCAGGAGGCCGGATAATCCGGCCTCTTTTTTTTGGACGAGGAAAAAT
+NODE 3089 1 71 71 0 0
+G
+G
+NODE 3090 21 451 440 0 0
+TCCGCCTGACGATAGCGGCGA
+CGGGGTTACATCGTCATCGCC
+NODE 3091 51 293 293 0 0
+GTTTTGCAGGCAGCGACCGCAGGGGAGCGAAGGATGCGCGGCGGGTAATCC
+CCCGCCGCTCTGGCAGCGTCTGGTGAGCGTCAGTGACTATACGCCGCCCTT
+NODE 3092 51 71 71 0 0
+TGTCTCGTCGTACGTGTTAGTCAGATGATAGTAGATGGTAAAAGTTATCCT
+AACCGTTATTTCCAAAATAAAATCGTCCCTTTTCCCCCGCAGAGGCTTGCA
+NODE 3093 5 284 284 0 0
+AATCC
+GCCGG
+NODE 3094 46 120 120 0 0
+GGGCGGGCAGGACGCCCGCCATAAACTGCCAGGCATCAGACAAGTG
+CCGGGCCGTTGCTGCGCAACGAGTGCTCACCGACAGACCACAGATA
+NODE 3095 51 132 132 0 0
+GCTGACTCAGGCTTCCCGTAACGCTAACGACGGTATCTCCATTGCGCAGAC
+CCCTTTGATGTTCGCGGTGAAACGGTTAGCAATCGCCTGACCTGCCGCATC
+NODE 3096 1 56 56 0 0
+T
+T
+NODE 3097 1 121 121 0 0
+C
+A
+NODE 3098 37 1290 1290 0 0
+AGCGTTCAGCGCCAGCGTGGCGTTGTCGGTGACGTCG
+CCAACAACATCGGCGGTACGGGCCGCGTGGAAAAATC
+NODE 3099 37 1666 1666 0 0
+CCGGTACCCAGCGCCTCAACGTTGCTGGCGACCAGCG
+AACGCCACGCTGGCGCTGAACGCTGGCGGTGACTTTA
+NODE 3100 51 98 98 0 0
+GGAGTCCCGCTTTTGCCGTGGTTTCAGCTAATTGGTAACGCACTGTACAGG
+CCCCCCGTACTGAGTAATCAACTTTGTCACATGTAATGACCTGTTTAGGGA
+NODE 3101 14 1311 352 0 0
+TCCGCGCCGCCGAT
+GCCGGAGCTGCTGG
+NODE 3102 28 627 627 0 0
+TTTTTGCATGAAGAGGTGAAACTGACCG
+TTTTTGCTTTTACAGGGCGGCAGGATGA
+NODE 3103 9 376 357 0 0
+TCGTGGACG
+AAGAAGCGA
+NODE 3104 3 177 177 0 0
+GTT
+TCG
+NODE 3105 51 2729 2149 0 0
+ACCCGACCATTAAAGTTATCGGCGTACAGGCCGAAAATGTTCACGGTATGG
+TTAATCGATTTAATCGCAATGGCAATACCTGCAATTAAACCGCCGCCGCCA
+NODE 3106 73 3063 2867 0 0
+TGTGGAACGATCCGCACACCAGCACGGTATCTTCTGGCTGCGCCGCGTCGATAGCGGCCTGCCATGCCTGCGC
+GCTGGTGTGCGGATCGTTCCACACCGTCGCACATGTTATGGAAGTGATAGACGCGGGGAGAATCGGTGGCGAG
+NODE 3107 9 9 9 0 0
+GGCTGATGT
+CCCCGCGCC
+NODE 3108 51 61 61 0 0
+GAAGTTCGGCGTGGAAGTGATTGCTGAGACCAACGTGCCGCTGGACCCGAA
+CCGCACCACATCCAGCATAGACTTCAGCGTCAGCTCAATCCCTTCGACCAT
+NODE 3109 6 180 157 0 0
+TGGCGC
+GCGGTC
+NODE 3110 91 874 874 0 0
+GGCGTTCCTCCACATATCTACGCATTTCAATGCTACACGCGGAATTCCATCCCCCTCTACCGTACTCTAGCTATGCAGTCACAGATGCAAT
+CGCGTGTAGCATTGAAATGCGTAGATATGTGGAGGAACGCCGAATTCCATCCCCCTCTACCGTACTCTAGCTATGCAGTCACAGATGCAAT
+NODE 3111 51 3129 1245 0 0
+GCGGCTTACCTGGTACGGTACTGCGCTTGGCATAGCAAACGAAGCGGAGGC
+CAACGCATCAGGCTCACCCCACAGGCTGCTCGCAATATTGGCGGTAGTGGT
+NODE 3112 9 53 53 0 0
+GATCAGAAG
+ACGCTCCCC
+NODE 3113 12 451 451 0 0
+TATCTTCGCCAC
+ATTCGCCAGCAG
+NODE 3114 46 2696 2505 0 0
+TAGCTTTATTGAAGAGGATTTACGCCCCCATTATTCCGATATTCTT
+ACTCCAGCCGTAACGTATTCAGATTACAGATTTGACGTAATGTCGT
+NODE 3115 27 1240 1240 0 0
+AACTGGGGTGAGCAACGGCCCGTCAGG
+GACTCACTCCCTTGCCGCCTTTAAGCA
+NODE 3116 3 109 109 0 0
+CAC
+GAC
+NODE 3117 46 57 57 0 0
+TACCCGCTTTATCGTTACTTATGTCAGCATTCGCACTTCTGATACC
+CCCCGCTCGCCGGAAGACCAAGGGTTCCTGTCCAACGTTAATCGGG
+NODE 3118 13 2752 62 0 0
+TGCGAATGCTGAC
+GCAGGCTTACAGA
+NODE 3119 145 3261 2896 0 0
+ACACTGACAAGGTCAACGAGCTTACAACCTTGGGCGGCAGGGACGTAATCAACGCGGTTTGATGAACCGCTTTTACTAGGAATTCCTCGTTCACGACTGTAGATTAAAACAGTCGATCCCCAGCACGACAAGAGTTAAAAAGATT
+CGTGAACGAGGAATTCCTAGTAAAAGCGGTTCATCAAACCGCGTTGATTACGTCCCTGCCGCCCAAGGTTGTAAGCTCGTTGACCTTGTCAGTGTAGCGAGATCGGAAGAGCGTCGTGTAGGGAAAGAGTGTAGATCTCGGTGGT
+NODE 3120 55 3446 3368 0 0
+CACTTCCGTCGCGTATCTTATCCCCGTTAAGCATAGTGTCTCATATCTCTCCGTA
+AAGTGATGGTGGTGGGGGAAGGATTCGAACCTTCGAAGTCGATGACGGCAGATTT
+NODE 3121 51 60 60 0 0
+CAATCAAAAAACGTTTTGAGGTGCGCCTGCACCTGCACTGTCACGCCACCA
+GCGCTGACCAGCTCATACGCCGCCATCGGCGTGAGAATGCCGGACATATCC
+NODE 3122 51 64 64 0 0
+GTGACCTGGTTAATGCTGTGCATTCAGAAACAAGCAATTCCATTTGTAATG
+CCCCGATATGCCCCGCCAGTAAGTGAAAAATTATGATAAATGCAAATCGTC
+NODE 3123 33 1622 1622 0 0
+CTGCGCTGTTAACCACTTTCCCGTTCGGTAAAT
+ACCATTTCTTCCGCGGTCCAGCCGGTGGTTCGC
+NODE 3124 6 302 298 0 0
+TCTGCC
+ACCGCC
+NODE 3125 45 46 46 0 0
+CACACCGCCCGCCCAATGCGCTCAATACGACGCTGACTCGTCAGG
+TCCTCCGGCTTAGAGTCAATCTGCATACGAATGCTGGATGCCGCT
+NODE 3126 51 60 60 0 0
+ACTTCGCCTTTCAGCTCAACGGTGTCGATACCGAAGTGAACGAACAGCTCA
+TCTTCAAGCGTATTGCTGAAGAAGGTCAGCGCGTGAAAGTTGGCGATCCGG
+NODE 3127 51 73 73 0 0
+GATAATGCGAAAACAGAATTTTACGCTAATGTGCCTAAGCAATTGACGCAG
+CCCAGCCGTCAGCGCAAACGCTGGCGCTATTGCCATCGTCAATACAGTCGT
+NODE 3128 15 76 76 0 0
+GTTTATGAAGAGGTG
+CGGGCGGCAGGATGA
+NODE 3129 11 337 337 0 0
+CGCACGCGACG
+TCCGTAGCCAA
+NODE 3130 3 78 78 0 0
+TTC
+TAA
+NODE 3131 2 58 58 0 0
+AA
+GG
+NODE 3132 51 52 52 0 0
+AGCCGGTGTGACAATCGCCTGGCTGGTCCATTTTTGCGGCAGCAGAAAGGA
+TGAGTCGGTACAGTGGCAGGGGCTGGAGAGAACGTTGACCGCGCTGCGCGT
+NODE 3133 46 53 53 0 0
+CAGCCGGAAGCCGTCAACGACGCGTTGAACGCGCGTGTTGCTGCGC
+CCCCACCGCGGCCTCAGGCGTATCTTCAATCACGCATTCCGGGTGT
+NODE 3134 45 4216 4216 0 0
+ACAATAAACATGTCAAAATGAATAAAAAAAGATCAGAATTACAGT
+TGGCTCTCCCGTCTTGCTTGTTTTGTTTGTTTTTTGAACGGTAAA
+NODE 3135 7 339 339 0 0
+ACCCGAA
+GGATGCG
+NODE 3136 2 10 10 0 0
+CA
+CT
+NODE 3137 361 22550 22144 0 0
+AGGCATCGAAACAGTTCTGTCTGAACTGCGTGCCCGTGGCGAAAAGTACTAAGTACTAAGAGGAAATAAGTCATGGCTAAAGGTATTCGTGAGAAAATCAAGCTGGTTTCTTCTGCTGGTACTGGTCACTTCTATACCACGACGAAGAACAAACGTACTAAACCGGAAAAACTGGAACTGAAAAAATTCGATCCAGTTGTCCGTCAGCACGTGATCTACAAAGAAGCGAAAATCAAATAATTCTCGCTTTGATGTAACAAAAACCTCGCTTCGGCGGGGTTTTTTGTTTTCTGGCCGTCCCCATATTAATGAGACCTGCCACACAGCCGGAGACGTTATGCCTGAATTACCCGAAGTTGAA
+CATTAATATGGGGACGGCCAGAAAACAAAAAACCCCGCCGAAGCGAGGTTTTTGTTACATCAAAGCGAGAATTATTTGATTTTCGCTTCTTTGTAGATCACGTGCTGACGGACAACTGGATCGAATTTTTTCAGTTCCAGTTTTTCCGGTTTAGTACGTTTGTTCTTCGTCGTGGTATAGAAGTGACCAGTACCAGCAGAAGAAACCAGCTTGATTTTCTCACGAATACCTTTAGCCATGACTTATTTCCTCTTAGTACTTAGTACTTTTCGCCACGGGCACGCAGTTCAGACAGAACTGTTTCGATGCCTTTTTTATCGATGATACGCATACCTTTAGCAGATACACGCAGGGTGACAAA
+NODE 3138 24 901 56 0 0
+TGAGCGATCCGGCACTGAAAAAAG
+GCAATGAGCGTGCCCTCCGTATAG
+NODE 3139 51 2389 269 0 0
+TATTTTTTCTGTCGGATTCGCGTCAGGAAATGCAGGCCATCCTCATCGGGC
+ACACCCTGCCGGTACTCATTCTGACCGCCCGCGATACGCTCAACGATCGCA
+NODE 3140 12 559 103 0 0
+CGCTGCGAGTGG
+CCGATAAAGATA
+NODE 3141 12 486 31 0 0
+TTGATATCCCGG
+TAGCTGGCATAG
+NODE 3142 51 214 214 0 0
+GTTCATACTGGCGCTGAACGGCGAGACGGTGACTACGCAAAAGCTGGTGAT
+CCCCGACTCATCACGCTCGACGCTCAGTACCTCGCTACGCAGGCGCATCGT
+NODE 3143 6 71 71 0 0
+GTAGAC
+CTCACA
+NODE 3144 33 476 476 0 0
+GACTCTGACTTTGGAACGGGGTATTGTAAGCGT
+CTAACCTGATATTTGAACTTGATTCAGCATCGC
+NODE 3145 56 752 752 0 0
+GAGAGTGGCCCTGTGCCACGATCCGCTGAGATTCAGCCCACGCTTCCTAGATTTGT
+ACTCTCACGCTTACAATACCCCGTTCCAAAGTCAGAGTCGTCTACAAGGGATTTGT
+NODE 3146 43 43 43 0 0
+GGGATGGTAAAAGGGGCGTCGATTTATAACCCGTGGCGCAACC
+TGCATCAACAGCCCGTTGGTGGCCTGTGACAAGTTGTTACTCA
+NODE 3147 51 2275 2261 0 0
+TCAACTTCGTTCAGTTCCAGTAAGGTCCAGGGAATAAAATAGCGATCGGTA
+ATCGCCGTCGGCTGATTCTGGCTGCGGAAATTTATACCGAAACCCAGCCTG
+NODE 3148 49 1010 1010 0 0
+AAATTAGTTATACGACACACGAACAATTCAAAAAATTGACTGCAGACAG
+GGCACTGTTGCAAAGTTAGCGATGAGGCAGCCTTTTGTCTTATTCAAAG
+NODE 3149 60 224 224 0 0
+GCAGGGAATAACGGATTTTCAGTTTGAGCTTTTCCCGCTTCACTCGCCGTTACTAGGGGA
+TATTCCCTGCGGATGACGGAGTTGTGGTTTCGAGGCTGGTTGTCAGGAAGGCCCACGTCA
+NODE 3150 47 128 128 0 0
+CTCGCCGTTACTAGGGGAATCCTTGTTAGTTTCTTTTCCTCCCCTTA
+CGTGGGCCTTCCTGACAACCAGCCTCGAAACCACAACTCCGTCATCC
+NODE 3151 1 1 1 0 0
+T
+C
+NODE 3152 4 1760 33 0 0
+TATC
+CTCG
+NODE 3153 23 23 23 0 0
+ACCTAGCTGGTCTGAGAGGATGA
+CCCAACAAGCTAATCCCATCTGG
+NODE 3154 51 191 191 0 0
+GTTATCCAAATCGATCTCGTGATACCAGATGTTTTCATCGCGAAGGGTATT
+CCCCGGCGCAACGCTGGACGCACGCCTGCATTTTCCGCTACGCGGCAACGT
+NODE 3155 9 438 404 0 0
+ACCCCGCCG
+TGCTGCACG
+NODE 3156 311 14851 14652 0 0
+TCGATTGCCGCTCCCGCCAGAATGCCCGGCAGGAAATAAAACGGCGGCCACAGCAAACAGCCAATCAAGTTCGGCCCAATAAATTTCGCTACGGGAAGATCCAGCATCCCTGCCACCATCGGCACCAGCGGCCTCGTCGGACCGACAAAACGTCCGACCAGGATCGTGAACATACTGTGCTGATGCAGCGCGTGTTCGGTTTTATCCAGCAGCGACTTGTTCTTTTTCATAAAAGACCAGCGGTGTAGCGGCTTTTTAAAGCGCCACCCCAGCCAGAACGAAATCCAGTCGCCCATCAGACAGCCGATAAT
+CTTTAAAAAGCCGCTACACCGCTGGTCTTTTATGAAAAAGAACAAGTCGCTGCTGGATAAAACCGAACACGCGCTGCATCAGCACAGTATGTTCACGATCCTGGTCGGACGTTTTGTCGGTCCGACGAGGCCGCTGGTGCCGATGGTGGCAGGGATGCTGGATCTTCCCGTAGCGAAATTTATTGGGCCGAACTTGATTGGCTGTTTGCTGTGGCCGCCGTTTTATTTCCTGCCGGGCATTCTGGCGGGAGCGGCAATCGATATTCCTTCCGATATGCAGAGCGGAGATTTCAAATGGCTGCTGCTGGCGA
+NODE 3157 51 190 190 0 0
+GCTTCATCAAATCGTTTAATCGTGGTGTGGACAAAACTGAGGTGCGCCATC
+CCCAGGCCCGCCAGGCGCGTATTACCCGCCTGCCCGGCGACCATAATGAGA
+NODE 3158 51 2324 397 0 0
+AAAAGTAATCATGGCTCTGTCAGCTTAATTTTTTTGATTCTTCGTGTTGAG
+TCCTGCCGTAAATGCTGATCATGCAGCGGAGAAAAAGAGAACACTTGGTCG
+NODE 3159 40 1390 1318 0 0
+ACCAGCCGTAGGGCGCGATTAGGGCAAGGAAATCAGCCAC
+AATTCCGTGGTGTCATGAAGGATTCTGGATCGAGCGCGAT
+NODE 3160 2 153 153 0 0
+TA
+AA
+NODE 3161 19 566 410 0 0
+GCCTCCGTGCCAATCCGGT
+ATAAAGTGAACTATTCTGC
+NODE 3162 37 1991 1898 0 0
+GTCTGGAAGAATAATATCAGCGATGCACTGGTTTTTG
+GGAGGCCAGTGCCAATCCGGTTTGTGGCTTGGAGGCA
+NODE 3163 155 380 380 0 0
+CGTGAAAATCCCGTTTGTCAGGAACCAAGGCTGGCCGTACTTAAACCGCAGCGCTTTTCTTTTTAACGCAAAACACAGATTGGAATCATGTTAAATGGAGAAGATGTGTGTATTTGCGGAAAAGCGCTGCTATTTTGGCGGCGTCTGGAGCGCTT
+ATCTTCTCCATTTAACATGATTCCAATCTGTGTTTTGCGTTAAAAAGAAAAGCGCTGCGGTTTAAGTACGGCCAGCCTTGGTTCCTGACAAACGGGATTTTCACGGGTCGTGCCAAGCGCTCCAGACGCCGCCAAAATAGCAGCGCTTTTCCGCA
+NODE 3164 669 33775 33502 0 0
+CGGCGGTATCGCGCGTCTGGAAGGGCGGCCGGTGATGATCATTGGTCATCAGAAAGGTCGTGAAACCAAAGAAAAAATTCGTCGTAACTTTGGCATGCCAGCGCCGGAAGGCTACCGCAAAGCGCTGCGCCTGATGGAAATGGCTGAACGCTTCAACATGCCGATTATCACCTTCATCGACACCCCGGGCGCTTACCCTGGCGTGGGCGCGGAAGAGCGTGGTCAGTCTGAAGCCATCGCCCGCAACCTGCGTGAGATGTCTCGTCTGAACGTACCGGTCATCTGCACCGTGATTGGCGAAGGCGGCTCCGGCGGCGCATTGGCGATTGGCGTGGGTGATAAAGTGAATATGCTGCAATACAGCACCTATTCCGTTATCTCCCCGGAAGGTTGCGCCTCTATTTTGTGGAAGAGCGCCGACAAAGCGCCATTGGCTGCTGAAGCAATGGGCATCATCGCGCCGCGTCTGAAAGAGCTGAAGCTAATCGATTC [...]
+ACGGTTTTTTAAATCATCGGTGCTTAACACATCGAGATCGGCTAAATCTTCCAGCAGCTGCGCTTTTAGCGACGCCGCCATCGCTTCCGGATTACGGTGCGCGCCGCCCAGCGGCTCCGGAATGATGGAATCGATTAGCTTCAGCTCTTTCAGACGCGGCGCGATGATGCCCATTGCTTCAGCAGCCAATGGCGCTTTGTCGGCGCTCTTCCACAAAATAGAGGCGCAACCTTCCGGGGAGATAACGGAATAGGTGCTGTATTGCAGCATATTCACTTTATCACCCACGCCAATCGCCAATGCGCCGCCGGAGCCGCCTTCGCCAATCACGGTGCAGATGACCGGTACGTTCAGACGAGACATCTCACGCAGGTTGCGGGCGATGGCTTCAGACTGACCACGCTCTTCCGCGCCCACGCCAGGGTAAGCGCCCGGGGTGTCGATGAAGGTGATAATCGGCATGTTGAAGCGTTCAGCCATTTCCATCAGGCG [...]
+NODE 3165 51 2570 403 0 0
+TCTCCCAGGAGGCCGGATAATCCGGCCTCTTTTTTTTGGACGAGGAAAAAT
+AAATGAGGTAAATGATTAGGCGTAACCGTAGCTCATCAAACGCTGGTAACG
+NODE 3166 40 1718 1626 0 0
+ATTTTTTTTGCTAAAGATACTCAACATATTTTGCTGGCTC
+ACCGCTCCCCAGCCGATAATAATGGAACTAATCCATTTTC
+NODE 3167 12 747 739 0 0
+TGCTTGGTCTGT
+AATCTACCCTGA
+NODE 3168 1 61 61 0 0
+A
+A
+NODE 3169 51 70 70 0 0
+GCCAACGAGGCAAAAGCGGCGGTGGTGATGTTCTTTGATTACCAGTGTTCG
+CCCCAACGGAAGGACTGCTGCTACTGAGCAACTCAGCACGATACTGTAATG
+NODE 3170 37 87 87 0 0
+GAGAGCACTGTTTCGGCTAGGGGGCCATCCCGGCTTA
+GTTCACGAGGCGCTACCTAAATAGCTTTCGGGGAGAA
+NODE 3171 51 154 154 0 0
+GGGCCATAATCTGCTATTGATCGGCCCGCCGGGGACGGGGAAAACCATGCT
+CCCTGCCGCTGTAATCTCCAGGCCGCGTTTACCCTGCTCCTGACCGATCAC
+NODE 3172 121 194 194 0 0
+ACCGATACTCAGCCATCAAAGCAAATGTGAGGCTTTGATGAGTAAGAGGGCGTGAGCATAGTGCAGAAGCCTATGACGTGAGTCTGGGTGGAACTATGTTTAGTGCAGATCTTGGTGGTAG
+GGCTTCTGCACTATGCTCACGCCCTCTTACTCATCAAAGCCTCACATTTGCTTTGATGGCTGAGTATCGGTGGAACTATGTTTAGTGCAGATCTTGGTGGTCTTCAAAGTTCTCATTTGAA
+NODE 3173 19 956 956 0 0
+AGCATTAATTTAGGCGGCA
+TACGCATCCGCCACGGATT
+NODE 3174 140 255 255 0 0
+TCGAGCCGTCCTCGGTTGTCAATGGCGTCAGGTCGAGCAAGAGCAACGATGCGATCAGCAGCACCACCGTAGGCATCATGGAAGCCAGCATCACGGTTAGCCATAGCTTCCAGTGCCACCCCCGCGACGCGCTCCGGGCG
+TGCTGGCTTCCATGATGCCTACGGTGGTGCTGCTGATCGCATCGTTGCTCTTGCTCGACCTGACGCCATTGACAACCGAGGACGGCTCGATCTGGCTGCGCTTGGTGGCCCGATGAAGAACGACAGGACTTTGCAGGCCA
+NODE 3175 1 31 31 0 0
+G
+C
+NODE 3176 67 832 634 0 0
+GTGATGTGGTGATTCATAATAAGCTTGCGGATCGCATGCCTTGTGCGGCGATGGATCATTCAAGTTT
+ATGAATCACCACATCACCCCTTCGGGGTGATGTGGTGATTCATAATAAGCTTGCGGATCGCATGCCT
+NODE 3177 8 157 115 0 0
+CTGCCCTA
+AGCTTATT
+NODE 3178 18 417 417 0 0
+TCCAAAGCTGATAGGGCA
+GGTAACGGGAAATTAGGG
+NODE 3179 15 302 302 0 0
+GAAACTTGAATGATC
+ACCATGGCTTTAACG
+NODE 3180 28 540 281 0 0
+CATCGCCGCACAAGGCATGCGATCCGCA
+TCAGCTTTGGATGGTAGGGTATTGGCCT
+NODE 3181 51 109 109 0 0
+GATTTTTTCTGTCGGATTCGCGTCAGGAAATGCAGGCCATCCTCATCGGGC
+CCCCCCTGCCGGTACTCATTCTGACCGCCCGCGATACGCTCAACGATCGCA
+NODE 3182 438 21123 21118 0 0
+GATGAGAACGTGGTCTGGCACTCTCATCCCGTTACTGTCGCCGCTCGTGAACAGCTCCACGGCCACCGTGGCGTGGTGCTGTGGTTTACCGGACTCTCCGGTTCGGGAAAATCAACGGTGGCCGGCGCGCTGGAAGAGGCGTTACATCAGCGTGGCGTCAGTACCTACCTGTTGGATGGCGATAATGTGCGCCACGGTTTGTGCCGTGATTTAGGCTTTAGCGATGCCGATCGCCAGGAAAATATTCGGCGGGTAGGCGAAGTGGCCAGTCTGATGGCGGACGCTGGCCTGATTGTTTTGACGGCATTTATTTCTCCGCACCGCGCCGAGCGGCAACTGGTAAAAGAGCGCGTCGGCCACGATCGTTTTATCGAGATTTATGTCAATACGCCGCTGGCTATCTGTGAACAGCGCGATCCTAAAGGATTGTATAAAAAA
+TATTGACATAAATCTCGATAAAACGATCGTGGCCGACGCGCTCTTTTACCAGTTGCCGCTCGGCGCGGTGCGGAGAAATAAATGCCGTCAAAACAATCAGGCCAGCGTCCGCCATCAGACTGGCCACTTCGCCTACCCGCCGAATATTTTCCTGGCGATCGGCATCGCTAAAGCCTAAATCACGGCACAAACCGTGGCGCACATTATCGCCATCCAACAGGTAGGTACTGACGCCACGCTGATGTAACGCCTCTTCCAGCGCGCCGGCCACCGTTGATTTTCCCGAACCGGAGAGTCCGGTAAACCACAGCACCACGCCACGGTGGCCGTGGAGCTGTTCACGAGCGGCGACAGTAACGGGATGAGAGTGCCAGACCACGTTCTCATCATGCAGCGCCATGTTTATCTCCCAGCAAATCGCGGGCGTCCCAGTGCGGA
+NODE 3183 14 450 450 0 0
+GGCGGCACGCTGGT
+GGAGAGCGTGAGCG
+NODE 3184 51 1581 1403 0 0
+ACCAACACCCGCCGACAATAATGACAGGGATAGTGTAGGCCATTACGCCAA
+TTTGCGTGGCGTCATCAGTCTACGGATGATTACATCGACTATTTTGCTGTG
+NODE 3185 51 65 65 0 0
+TGCGTAAACCAGCGCATTTATGAGCTGCTGGATAAGACAGATATTGATGAT
+AGCTTTGATCCAAAAACTGGTTAAACGCATCGGCAGTGGTTGCAAAACCAT
+NODE 3186 54 720 720 0 0
+TGTACACACCGCCCGTCGCTACTACCGATTGAATGGCTTAGTGAGCTCTACGGA
+TACAAAGGGCAGGGACGTAATCAATGCAAGTTGATGACTTGCGTTTACTAGGAA
+NODE 3187 1 10 10 0 0
+T
+T
+NODE 3188 8 86 86 0 0
+CTATTAAA
+GGGGGGAG
+NODE 3189 14 627 609 0 0
+ACCCTGCCGACCCG
+TTTCCACTACCGAC
+NODE 3190 8 339 339 0 0
+CATCCAGG
+ACCGCCAG
+NODE 3191 31 1415 485 0 0
+AAAGCTGGCATCACGACACCTTTACCTACTA
+TCCGCCGCCATATTCATAGACGCGGCGCAGT
+NODE 3192 4 209 209 0 0
+CTAC
+GGCT
+NODE 3193 56 301 173 0 0
+AATTATTGATCTTCAACGAGGAATTCCTAGTAAACGCAAGTCATCAACTTGCATTG
+ATAATTACAATGATCTTCAACGAGGAATTCCTAGTAAACGCAAGTCATCAACTTGC
+NODE 3194 17 185 181 0 0
+ATTACGTCCCTGCCCTT
+TTCCTCGTTGAAGATCA
+NODE 3195 19 1136 1136 0 0
+TACCATCGATTCTTGAAAA
+GCTTCAGGTGTTAGTGTCC
+NODE 3196 23 999 935 0 0
+ACCTGAGCCAGCCAGCGCTTTCT
+TTCCCTGTTGCGCAACGGCGACA
+NODE 3197 108 430 430 0 0
+CAGACTCCTACGGGAGGCAGCAGTGGGGAATTTTGGACAATGGGCCTTTACCCCACCAACTACCTAATCTGACATCGGAACGTGCCCAATCGTGGGGGATAACGCAGC
+TGGTGGGGTAAAGGCCCATTGTCCAAAATTCCCCACTGCTGCCTCCCGTAGGAGTCTGGGACGTGTCTCAGTCCCAGTGTGGCTGGTCGTCCTCTCAGACCAGCTACA
+NODE 3198 43 45 45 0 0
+TGTAAGAGCGGGAACAGCAACGGCAGATTTTAAATTAGTGATT
+ACACGTCACCCAAAATGTAACGCCGCCGCCAGAAGCCTGTACC
+NODE 3199 16 578 578 0 0
+TGATGATGATGAGCGA
+ACCCGCCGTCACCGAA
+NODE 3200 111 4543 4501 0 0
+GCGCTACCAGTGGCTGGGGATGGCGCTGTCGGCGAGTGAGAAGCGCTACGCGGACGGCAGCCCGGCGCTGCGTGAGCAGTGGCATTACCGGGGCGGTTTTGAGCTGCTGGC
+GCTGCCGTCCGCGTAGCGCTTCTCACTCGCCGACAGCGCCATCCCCAGCCACTGGTAGCGCACCTCGCTGACGGTGTGGTGATTTTGTTTCCACGCCGCACGGATAATATT
+NODE 3201 60 443 415 0 0
+TTGCAATTATTAATCTTGAACGAGGAATTCCTAGTAAACGCAGATCATCAATCTGCATTG
+ATAATTGCAATAATCTTGAACGAGGAATTCCTAGTAAACGCAGATCATCAATCTGCATTG
+NODE 3202 142 369 369 0 0
+TTGTTACCGAATTCAGAATCGGCTCATCGAACGACGGGCTTCAGCCCAAAAGGTAACTGAAATGACGAGTGAACAGATGCTGGCGGAAATCAAGGAAGCCAACCTCACTTATCTCATGCTCGCGCAGAACCTGATCCGCCAG
+TGATTTCCGCCAGCATCTGTTCACTCGTCATTTCAGTTACCTTTTGGGCTGAAGCCCGTCGTTCGATGAGCCGATTCTGAATTCGGTAACAAGAACTTTAATAGGTAAAGAGATGTTAACGATGTAGCTTTGCCCGACAGCG
+NODE 3203 107 496 496 0 0
+CGCATGTTGTCGTCCAACGATCGGAGCTAGAGCTTCATCCGCAGCAGGGGAATTCGAGACGGAGTTGGAGTTGCTGTTTGAAATGTGTTTCAAACAGCAACTCCAAC
+TCGAATTCCCCTGCTGCGGATGAAGCTCTAGCTCCGATCGTTGGACGACAACATGCGATGCCTACTGACAACAACAACAACAACAACACGATTAATCTTTTAGAAGG
+NODE 3204 139 228 228 0 0
+AACTGCAACAACTTTAATATACGCTTTTGGAGCTGGAATTACCGCGGCTGCTGGCACCAGACTTGCCCTCCAATAGATCCTCGTTAAGGGATTTAAATTGTACTCATTCCAATTGCCGGACATTTATATGTCTGGCAAT
+CCTTAACGAGGATCTATTGGAGGGCAAGTCTGGTGCCAGCAGCCGCGGTAATTCCAGCTCCAAAAGCGTATATTAAAGTTGTTGCAGTTAAAAAGCTCGTAGTTGGATTTCTGGTAGTACGCCCCTGACCCGCCCCTCT
+NODE 3205 51 103 103 0 0
+GCTGCTCTCGCAGACACTGGTCGTGCATATGCTAAGGACGCAGAAAATACC
+CCCCTCAATAAACCAGCCGGACTGAAAGAGCGCCTGCGCCTCTACGTTATT
+NODE 3206 30 108 108 0 0
+ACCACTGATTCCAAAAAGCAAATTGCCCAA
+CCCCGCCAGTGATGTGGTTATTGACACACT
+NODE 3207 51 54 54 0 0
+GTAACGATTGCGTGAAAATTAGCCATTGCAATGCCAGCGCAAAACAGTATC
+CCCTGCCTGGCTTACTGACGAAGATGGGCGTAAAATATCGCCGTTTTTCTA
+NODE 3208 46 109 109 0 0
+TTAACCCTAACGATTTTGCGGCAGAACCGATAGAACCACTTCTAAT
+CCCCGCCGTCAGTAAAATCATTAGCGATGTTGAGGCCTATTTTGGC
+NODE 3209 37 37 37 0 0
+TCGCGACGGGTGTTGTGGTGCTGGTGGTGACGTTTGC
+AACAAATAGAGCAGTCAGTTTACGCATATTTCCATCC
+NODE 3210 51 71 71 0 0
+GTATGAGCCCGACGAGCTACCAGGCTGCTCCACCCCGCGTCCGTGGATGCG
+CCCCGAAGGTCGTCGGTTCAAATCCGGCCCCCGCAACCAATTACAATGAGA
+NODE 3211 5 473 310 0 0
+TATTC
+CACCT
+NODE 3212 13 528 481 0 0
+TAATGGCTTTCGC
+CTTTGTCACCTAT
+NODE 3213 40 186 186 0 0
+GAGTGTGGGGTCTCCCCATGCGAGAGTAGGGAACTGCCAG
+TACGGCGTTTCACTTCTGAGTTCGGCATGGGGTCAGGTGG
+NODE 3214 51 136 136 0 0
+TATACTGAGCGCCCAGCAGCATGTTCCACGGGGATTGTAGATGCTGTTTGA
+AAAATACCCCGCCATTTCAACGTTACCACCGAGTTTGGCTTTGCCGAGCGC
+NODE 3215 44 1141 1141 0 0
+ACCCCCGCCGAACCGATAAGCGGGTTGATTTTGTTCTTACTGCA
+AGTGCCGATGGCGGCACGCGTATCGAACAAAGTGGGGCTGGAAT
+NODE 3216 48 1000 1000 0 0
+ATGAATTGGGCGAGCTGGCTATTGATGTGTTGATTCATCGGATGGCGC
+GGCACTGTTGCAAAGTTAGCGATGAGGCAGCCTTTTGTCTTATTCAAA
+NODE 3217 51 105 105 0 0
+GGGCATTGTGACTGATGATTCTGGATTCACTCTTGCCGTCTTCCAGCAGCA
+CCCTCACTGACGACGCAGCAAATCGACGCCAGCCGCGAGCGCCTGCAGGCG
+NODE 3218 32 1125 66 0 0
+TTGATTGCTCTTACCTTTCACCGCGGCTTTAA
+ACCACCGGTCGCAGCTATGCTATTGATCCCAT
+NODE 3219 51 54 54 0 0
+AATCCAGCCACGCCTGCGGCAGTTCCAGCACCAGCGCTGGCTCATCAATTT
+TCCTTTACCGTTCAGGCGACCCGCACCGGTATCCCCGTTGTTTGGGTCAAG
+NODE 3220 5 368 368 0 0
+GCGCC
+CGCCA
+NODE 3221 117 945 945 0 0
+TCGAACCCTAATTCCCCGTTACCCGTGAGAGCCATGGTAGTCCAATACACTACCATCGAAAGCATGATAGGGCAGAAACTTGAATGATTGATCGCAGTAAGACTGCGATTTGCGAAG
+TCATGCTTTCGATGGTAGTGTATTGGACTACCATGGCTCTCACGGGTAACGGGGAATTAGGGTTCGATTCCGGAGAAGGAGCCTGAGAAACGGCTACTACATCTAAGGAAGGCAGCA
+NODE 3222 51 1915 1617 0 0
+CTCTTTTACCTCCTTGCCGCTGGCTTTCACCACCACCAGCGTATTCGGATA
+GTGGCTGGAATGTTCTGCCGGACAATTTAATCAGATTGATATTCACAGCAA
+NODE 3223 46 46 46 0 0
+TTACTGGTCAGCCGGGCGCTGGAAAAGTTGGGTTATACCGTAAATA
+ATGAACCAGGGCCGCTTCTTTACTGAGTGATGGCATTAATCGTGTT
+NODE 3224 1 55 55 0 0
+T
+T
+NODE 3225 51 3075 3017 0 0
+GGCTTTTGCTTTTTAATTTTCCCTTGCTTCATCAGCTTGGCCTTTTCCGCC
+CGCTGCCGGAGATTAGCGAGGAAGAGAAGCCGTTTGAGCTGCCGGCGGGGT
+NODE 3226 18 35 35 0 0
+GTTAATCACAATATTCGG
+CACCGGTTATCTGGCCAA
+NODE 3227 3 3 3 0 0
+GTG
+CCT
+NODE 3228 99 316 316 0 0
+AATGAGTAATCATAGGAACCCTCTCGGGGGCTCCCAAGATCATAACATGGTAACGTCACTTTCACATGGAGTAAAATTCGTGTGAGGCGATGCTGAATC
+CATGTTATGATCTTGGGAGCCCCCGAGAGGGTTCCTATGATTACTCATTGTAACGTCACTTTCACATGGAGTAAAATTCGTGTGAGGCGATGCTGAATC
+NODE 3229 7 63 63 0 0
+AAGTTCA
+ACGTTAC
+NODE 3230 5 124 124 0 0
+AATAT
+AAGTG
+NODE 3231 15 427 427 0 0
+CAGGTTAGACAAATC
+TTTTACTCCATGTGA
+NODE 3232 51 3038 802 0 0
+ACCGGAAAAATCACGGGCCTGATAAGGCAACGCCGCCATCGGACATGTTAT
+TTCTTAACCTTTGGCGTTCATGCTCCGCAACGACGCGCCAGATGAGGCGGA
+NODE 3233 14 367 367 0 0
+ACCCGCCAGCCAGA
+CCGGCTTTACGGGT
+NODE 3234 51 96 96 0 0
+GTAGCCGGTGCTTCTTCTGCGGGTAACGTCAATTGCTGTGGTTATTAACCA
+CCTCCGTGCCAGCAGCCGCGGTAATACGGAGGGTGCAAGCGTTAATCGGAA
+NODE 3235 45 1824 1824 0 0
+TGACTTTACCAACAACATCGGCGGTACGGGCCGCGTGGAAAAATC
+GGTGTTCAGCTCCAGCGTGGCGTTATCGGTGACGTCGCCGGTACC
+NODE 3236 47 662 662 0 0
+GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
+GCCACACGGTTATTCGCCGTGGCCTGCAAGAAATGCTGTCCTGGCGC
+NODE 3237 1 56 56 0 0
+G
+C
+NODE 3238 29 138 138 0 0
+GGTTCCCCGCTTTATCTTCGACTGACACA
+CGGTGACGGTGGACACGCAAATCGCCATT
+NODE 3239 125 367 367 0 0
+GCGTGCGGCCCAACATCTAAGGGCATCACAGACCTGTTATTGCCCCTATCTTCCTGCGTCTAATAGACGCACGTCCCTCTAAGAAGTTACAACCCAGTGAAAATTCACTCAACAACTATTTAGCA
+GACGTGCGTCTATTAGACGCAGGAAGATAGGGGCAATAACAGGTCTGTGATGCCCTTAGATGTTGGGCCGCACGCCCCTCTAAGAAGTTACAACCCAGTGAAAATTCACTCAACAACTATTTAGC
+NODE 3240 3 38 38 0 0
+CTA
+GCC
+NODE 3241 36 458 458 0 0
+ACCTGATATTTGAACTTGATTCAGCATCGCCTCACA
+AAGCGTGGGCTGAATCTCAGCGGATCGTGGCACAGG
+NODE 3242 51 125 125 0 0
+GGCTGGTCGGCATCATCGGTATCGTTCTGCTGGCGCTGGGTGGGTTGAAGC
+CCCGCCCAGCCGATACGCACTAACAGAGGCGGCTCTTCACCATCGCGAACT
+NODE 3243 41 41 41 0 0
+TATGGAAACCGCCGCGCTGATGGTGGTGGGGGCGTTACGTG
+CGATACAGCTCGGTGTGGCCTTTTTGACGGCCAAAGCCTTT
+NODE 3244 43 58 58 0 0
+ACACGCTAAAGAGATTTTTGTATCGGCATCACTGATGCCAGAA
+TGCTCCGTCAAGGAATTTATTCTATTTGATGTTGAAATATTTT
+NODE 3245 68 86 86 0 0
+GCTACAGATGCTGTCGGGAGCAGGTAATCAACTGACCCGCCTGCCGGCGCTGCCGTCAGGCCTACAAC
+CCCGACAGCATCTGTAGCCCTGCCGGCAACGGCGGCAGGCTGGTCAGTTGGTTATCTTCGACAGTAAG
+NODE 3246 30 827 700 0 0
+TACTGGCAACCGGCAGCGCGCAGCAACTGC
+ACCAGCCAGTCAAAACGCTCCGCCTCTTCC
+NODE 3247 73 3149 2942 0 0
+GGGCAAAAACCCATAGCGCGACGCTGGAACAGGCGTTTATCGCCCTGTTGCCAGAAGCGCAGCGCCAGGCGCA
+CGTCGCGCTATGGGTTTTTGCCCGCAGTTGCTGCGCGCTGCCGGTTGCCAGTACCTCGCCCGCATTCATCGCC
+NODE 3248 38 75 75 0 0
+GGTTAACCTCAATGATATTATTACTCACTCCCTGAATC
+TTCAGGAGAGCGTGCTTCTGGCTGGGGATGTGCTGGAG
+NODE 3249 51 86 86 0 0
+AGCTTCTGTTGTGGCATGGTCAGGAGGATGACGTGGTGCCTGCTATCGAAA
+TGCCTGTCGGCCAGTCGCTCTAACTGGTGTGTGACTTCCCATTCACGTAGC
+NODE 3250 46 221 221 0 0
+GTACACGTAACGCTGCTCGACCCTCAGTTGGAACGACAGTTGGTGT
+CCCAGCCGTACGCCGCGCTCGCCGCGACGCTCGTCCCAGGTTTTAA
+NODE 3251 156 8086 7990 0 0
+ACCCGGCTCCCATTTGCGGGTGGTGTGCGTATCGCCCACCGACAGATAGCCCTGATCCCACAGCGGATGGTATTTCAGGCCGTGCTTTTGCAGGTACTGGTAAACGGTACGGTTATCCCAGTCGATAATCGGTAGCACTTTAAACACGCCGCGCTG
+CGTTTACCAGTACCTGCAAAAGCACGGCCTGAAATACCATCCGCTGTGGGATCAGGGCTATCTGTCGGTGGGCGATACGCACACCACCCGCAAATGGGAGCCGGGTATGGCGGAAGAAGAGACGCGGTTCTTCGGGCTGAAGCGCGAGTGCGGGCT
+NODE 3252 4 36 36 0 0
+TAGG
+CGAA
+NODE 3253 48 74 74 0 0
+TGGTCAGCAGCAACCAACACTGGCGACTGGTCAGCAGCAACCAACACT
+TGCCAGTGTTGGTTGCTGCTGACCAGTCGCCAGTGTTGGTTGCTGCTG
+NODE 3254 44 54 54 0 0
+ACTTTCGCCCGGCGCCAGCTCAACGCCTTTGCAATCGACCACGC
+TCAATGTTGACCTGGTTGAGCATGATACGCATGGCGTTGACCGC
+NODE 3255 41 44 44 0 0
+TCGACGTAACGGAAAAATGCACGACGCGTAAAGGCCGTAAG
+CCAGAAGGTGCGCGGCGATTACGGCGGTTATCAGGATGACT
+NODE 3256 21 202 202 0 0
+TAATGTCTGGGAAACTGCCTG
+AGCAAGCTGCTTCCTGTTACC
+NODE 3257 5 49 49 0 0
+ATGGA
+GAAGC
+NODE 3258 1 58 58 0 0
+T
+C
+NODE 3259 1 5 5 0 0
+C
+C
+NODE 3260 42 42 42 0 0
+GGTTTTCATCTTGATCAAATGTCTTTAAATGTCATATAAAAA
+TCGGGATCCGCGATCTGGATCCCGATTCAGCCTGCTCTTCGT
+NODE 3261 14 1751 108 0 0
+TAATGCACAGGAGG
+AGAGAAAACGCATT
+NODE 3262 41 164 164 0 0
+GTCTGTAAGCCTGTGAAGGTGGCCTGTGAGGGTTGCTGGAG
+ACCCAACGAACGTATCCTTAAACCGACTCGACTTTGTATAC
+NODE 3263 1 61 61 0 0
+T
+A
+NODE 3264 51 1544 326 0 0
+ACCAGCCCCCCTGCCTCTTTTGAAATCGCCATCCGGGTGAAGCGATTACGC
+TGGCGGTCGGTTTTGGCCCCGTCCTCGCAGGGATCTTTTGTAACATGACCG
+NODE 3265 51 304 304 0 0
+GTTATTGAGGGTCTGCTCTCGCAGACACTGGTCGTGCATATGCTAAGGACG
+CCCAGCCGGACTGAAAGAGCGCCTGCGCCTCTACGTTATTAGCCGCAAAAA
+NODE 3266 41 41 41 0 0
+CGCCGATAGAAGAGTAGACGAAACGTCCAAAGAAGAAGAGA
+GCTTGAGTGCGGCATTAAATGGCAGTTTTAAAGCTAACCGT
+NODE 3267 609 29414 29027 0 0
+CACGATGTCAGCGAATAGATAGCGCCGACAATGTCGGCGCTTCTGTTCCCCGGGAAGGCTAATCGTTTATTGCGCGTCCGCAAGCTGCAGTGAGTCCTGATTATGTAACGCATTCTGGCGCTGGCGTTCCAGTTCCAGCGCGCCGCGATGGGAGAGGTAACAGAATAGAATGCAGCACACGATGCCGCCCATCAGCAGATAAAATCCGCCGTACCAGCCCAGTTTATCCACCATGACGCCAAACAGGCTGGTGCCCAACGAGGCGCCGAAAATATAGCTCATGAACCCACGTAAACCGACGGCGGAACCTACGGCAAAGCTGGGGACTATCTCCATTGTCTGTACGGACGCGAGGAATTGCGGGACGTAAATCAGACAACCTACAATGGCGGCGAAAATCGTTACCATCAGCAAAGATTCACTTTTCCAGTATCCGATCAGACAGACAAAAATCAGCGCCATGCAAATCATGGCTAACGGCATTCTGCGGCC [...]
+CTTTTTCGAGTGGGCGGCGATTCCCTCTACGCTACTGGCAGGCTGGCTGTCAGATAAACTGTTTAAGGGCCGCAGAATGCCGTTAGCCATGATTTGCATGGCGCTGATTTTTGTCTGTCTGATCGGATACTGGAAAAGTGAATCTTTGCTGATGGTAACGATTTTCGCCGCCATTGTAGGTTGTCTGATTTACGTCCCGCAATTCCTCGCGTCCGTACAGACAATGGAGATAGTCCCCAGCTTTGCCGTAGGTTCCGCCGTCGGTTTACGTGGGTTCATGAGCTATATTTTCGGCGCCTCGTTGGGCACCAGCCTGTTTGGCGTCATGGTGGATAAACTGGGCTGGTACGGCGGATTTTATCTGCTGATGGGCGGCATCGTGTGCTGCATTCTATTCTGTTACCTCTCCCATCGCGGCGCGCTGGAACTGGAACGCCAGCGCCAGAATGCGTTACATAATCAGGACTCACTGCAGCTTGCGGACGCGCAATA [...]
+NODE 3268 51 128 128 0 0
+GGATTTGATCCGGAGCGTCCAGATAATCATGCGCGACAGGTACATACGCGG
+CCCCGCCAGCGTGCTCTGGAACTGCTGAAGCCGCTGCTGGAAGATGAAAAA
+NODE 3269 51 65 65 0 0
+TGAATAAACCATTGTCTGAATATGTATGAATTTGACATTATGGGACGGGTT
+ACTGTGACGTCGCCAGGAAATGGCCGTTATCCATTCTGACAAAATTATAAG
+NODE 3270 42 113 113 0 0
+GATTGGTGGATTTCCCACAGCGTTCACTGACTTTGCCAATAT
+CCCCGTGGCGCCAGCCATACCAGATAACAATAATGCGCTACC
+NODE 3271 51 78 78 0 0
+GGGTTATAGAAGTAAGAGGTGCTATTCATGTGACGCGCCGGACGCTGCCAG
+CCTCCAGCCAGTGGCGCTACGAGACGGTGACCGCCGAGGAGTTACTGTCGC
+NODE 3272 34 1986 1715 0 0
+ACTGGCTGATAAGCCGCTTTCTTTTGGGTATAGT
+ACCCGTCAGTGTAAGCTGGCGGGTTTTTGCTTTT
+NODE 3273 109 193 193 0 0
+TTGAGCGATGCCCTTCCATACAGAACCACCGGATCACTATGCTATACTTTCGTACATGATCGACTTGTCTGTCTCACAGTCAAGTCGATCATGTACGAAAGTATAGCAT
+TCATGTACGAAAGTATAGCATAGTGATCCGGTGGTTCTGTATGGAAGGGCATCGCTCAAAGGATAAAAGGTACGCCGGGGATAACAGGCTGATCACGCCTGAGAGTTCA
+NODE 3274 51 1354 1032 0 0
+GGTTTTACCGCTGAAGCCGATCAGCTGGAGCTGCTCTCCCGCAGTAAAACC
+CGCGAAGCATTTCTCGTTCATCGCACTTCACGAAAAAATCATGGCCTGCAT
+NODE 3275 51 60 60 0 0
+GGGCCGTAGGTGGCGCTCATGGAGGAAATTGCCGTGTCCACGCCGTCAACG
+CCCCGGCCACCGAGGCGCTGGTGGCGACGTTGGCAGGTACTGAGCACGACA
+NODE 3276 51 52 52 0 0
+GTTGGACACGGACAGCGCGCAAAAACCGGAGCGTACACGTAGTACGTGAGG
+CCTGGCTGCGCCAATAACGCCTGGTGGGATAGGCTCTAAGACAATAATACC
+NODE 3277 51 154 154 0 0
+GAAACAGTTCGGAACCGGCGATGATGACCAGCGTTAAGGCGATACCGAAGG
+CCCGGCCACACCATGTTCCTGACGCTGGGCGTCAAAGCAGGCACCATCAGC
+NODE 3278 20 29 29 0 0
+GGATGCAGAGTAAACAGATA
+CCCAGCCGGTGACTTTCCAT
+NODE 3279 51 59 59 0 0
+AGGACCAACAATCTCGGCTACAGGGCCAGCCACAGCGCCAATAGCAGCGCC
+TGCGATTGGGAAGATTGCAGGAAAAATTAAAAATAGTGCCGGGGATATTTA
+NODE 3280 51 99 99 0 0
+TCTGGAAAACATCGACATCGTGCCGCTGTATTTGGCTGCTGAACGCCCGGT
+ACAGATGTATTGCCAGATATCCTGCTCAGTCCAGTTGGAGAGCGGGAAGAC
+NODE 3281 14 328 328 0 0
+TGCTCACCCCAGTT
+TAATCCGTAGCCAA
+NODE 3282 51 97 97 0 0
+GGGTGAAAGCGCTGACCCATAGCCCGTGGGGAACGTACACTGTCGCGTTCA
+CCGATCATCGCCAGGACGGCCAGAATGATCACCATGATCATAAAGCAGGCT
+NODE 3283 96 390 390 0 0
+TTTGATTCCGGAGAGGGAGCCTGAGAGACGGCTCCACATCCAAGGAAGGCCAATACCCTACCATCCAAAGCTGATAGGGCAGAAACTTGAATGATC
+TCCTTGGATGTGGAGCCGTCTCTCAGGCTCCCTCTCCGGAATCAAACCCTAATTTCCCGTTACCCGTTAAAGCCATGGTAGGCCAATACCCTACCA
+NODE 3284 1 61 61 0 0
+C
+T
+NODE 3285 1 38 38 0 0
+A
+T
+NODE 3286 19 647 647 0 0
+ACCCGGCCCATCCATGGGC
+AATGAAGGGTATAAACAGC
+NODE 3287 9 109 109 0 0
+AAAAAAAAA
+TTTTTTTTT
+NODE 3288 1 16 16 0 0
+A
+T
+NODE 3289 2 41 41 0 0
+AA
+TT
+NODE 3290 1 26 26 0 0
+A
+T
+NODE 3291 1 32 32 0 0
+A
+T
+NODE 3292 1 40 40 0 0
+A
+T
+NODE 3293 24 147 147 0 0
+CGGTCAGCAGCAACCAACACTGGC
+AGTCGCCAGTGTTGGTTGCTGCTG
+NODE 3294 18 23 23 0 0
+AATGATCTTAATGCGCCC
+AAAAAACAAGCCAGTACA
+NODE 3295 5 5 5 0 0
+CCCCC
+CCCCC
+NODE 3296 51 123 123 0 0
+GATCATTAGCGCGACAGCGAAAAAACTCGGCATGTCGATGGACAATGTCGT
+CCGCAGGTTAGCCTGATGCGGCACCAGCCAATCGAGTTCTGAGCGATCCAG
+NODE 3297 22 59 59 0 0
+GTTATGACGATCAAGGGCGACT
+CCCTGCCAATAAGGTGGTAAGC
+NODE 3298 112 604 543 0 0
+GTTACTGAAAATCAAAATCAAGTGAGCTTTTCCCCTTTTGGTCAACAAGAGATTTCTGTTCTCTTTGAGCTCACCGTAGGACACCTGCGGTGAGCTCAAAGAGAACAGAAAT
+AGAACAGAAATCTCTTGTTGACCAAAAGGGGAAAAGCTCACTTGATTTTGATTTTCAGTAACAATACAAACCGCGAAAGCGTGGCCTATCGATCCTTTACCTTTACAAGTTT
+NODE 3299 51 117 117 0 0
+GTTTTACCACGCGCGTGACCCCAACCAGCGCCGATGAGCTGGGAAAACTGG
+CCCCCCGCCGCCAGCCTGTGCGTACCCTCGACCAACCGTTTGACCGGGGCG
+NODE 3300 90 198 198 0 0
+TCGTGAAAGGCCGAACCGGTCACCTCCGCTGGGGCTAGACCCGAAGCGGAGGTGACCTACTCATTGCCAGGACGAATCGATGGTAACACA
+GTCTAGCCCCAGCGGAGGTGACCGGTTCGGCCTTTCACGATGTGTTACCATCGATTCGTCCTGGCAATGAGTAGGTCACCTCCGCTTCGG
+NODE 3301 51 127 127 0 0
+GTTATCCACACTATCACGGCAAACGAGAGTCTGCGGACTGGCCAGTGGGTG
+CCTCCTTGTCCAGCTTCAGCCCTTCCTGGTGCCACTCGACCAGCGGCGAGT
+NODE 3302 28 1278 1278 0 0
+TCATCCGCTGTCTGCCGCCGTAGATCCG
+TATTCATATCGTCTTTTTCATACCAGGT
+NODE 3303 12 12 12 0 0
+TCGCCCCAAGCA
+CCCATGCCGCCG
+NODE 3304 30 398 398 0 0
+TCAAACAGGATAAACCGAAATAATTTATTT
+CATCGTAAGTATTTCGATAGATTTGATTTT
+NODE 3305 90 635 635 0 0
+TGTTTTGGTTTTCATTACAAAGGTATTGCAAACCAAAAGGAAATAAATTATTTCGGTTTATCCTGTTTGATAAATTACTAATAAATACAT
+CCTTTTGGTTTGCAATACCTTTGTAATGAAAACCAAAACAAAATAAATTATTTCGGTTTATCCTGTTTGATAAATTACTAATAAATACAT
+NODE 3306 51 1129 1047 0 0
+ACCTTTGTCACGATCCCCGCCACAGCCAAAGACGCACCACAATTTTCCGGC
+TAAGCGCCCACTCATGGGGGCCATTGCCGAAGAATTCGCGGATATCGTCGT
+NODE 3307 3 89 89 0 0
+AAC
+GCT
+NODE 3308 41 60 60 0 0
+GCGCATGATCATCGCCAGTATCAGGCCGGTAATGCGCGCGC
+GCGTCAATCTCGTGGCTGGTCACCTTGACTAAGCCGCTCTT
+NODE 3309 49 58 58 0 0
+AGATAACGTTTGCCGTCGAAGGTTTTCAGCGTGTAACTGGTATAGAACT
+TGGAGCGCGACTATGGTTGTAAGGTTATCTCCATCATTACGCTGAAAGA
+NODE 3310 45 51 51 0 0
+GGTTGCTGGCAGGCTACTTGTCTGACTTTATGTTCAAAAGTAACC
+CATGCGAGATCCCCTCCATCAGACAGCCGTCGCCCATAAAGACAT
+NODE 3311 111 633 633 0 0
+GAAACAATCCAAACCTTGGCGAAGCAGAATTCGCCAAGGTTTGGATTGTTCACCCACCAATAGGGAACGTGAGCTGGGTTTAGACCGTCGTGAGACAGGTTAGTTTTACCC
+ATTGGTGGGTGAACAATCCAAACCTTGGCGAATTCTGCTTCGCCAAGGTTTGGATTGTTTCTCATCAGTAGGGTAAAACTAACCTGTCTCACGACGGTCTAAACCCAGCTC
+NODE 3312 140 204 204 0 0
+TGAAATCCTCTGATAAAAAACTTGAAAATAGTCGCAACCTCGGGAAACAAGTTGCGTACAAGGAGTAATGGTTGATTTCAGGGGGAGGGTTTTTGGAAAGTGTTGCCTCCCCCGTTTCTTTGACATGATGAACACTTTTC
+ACCCTCCCCCTGAAATCAACCATTACTCCTTGTACGCAACTTGTTTCCCGAGGTTGCGACTATTTTCAAGTTTTTTATCAGAGGATTTCAACGGCTACGGCTATCAGCATCAATGATAGCCGTAGCCGTTGAAATCCTCT
+NODE 3313 51 95 95 0 0
+GATTATCAAGAATCTCAATCCCGACGCCGGCTGCGGTAGTGCTATTGTCCG
+CCCTCTTCACCGTTGAAACCGGACGGCGCGACCTTCTCGGCGAAGCAGTCG
+NODE 3314 51 2584 1358 0 0
+ACCTCTTCACCGTTGAAACCGGACGGCGCGACCTTCTCGGCGAAGCAGTCG
+TATTATCAAGAATCTCAATCCCGACGCCGGTTGCGGTAGTGCTATTGTCCG
+NODE 3315 1 55 55 0 0
+C
+A
+NODE 3316 51 64 64 0 0
+GCCACCTTCCTCCAGTTTATCACTGGCAGTCTCCTTTGAGTTCCCGGCCTA
+CGATGACGTCAAGTCATCATGGCCCTTACGACCAGGGCTACACACGTGCTA
+NODE 3317 21 28 28 0 0
+GGCCGACCGTAATCCGCAGGC
+TCCTTACGTGCGGAGCCAGTA
+NODE 3318 5 1561 56 0 0
+ATGGA
+AAAGC
+NODE 3319 2 71 71 0 0
+AC
+CC
+NODE 3320 24 522 522 0 0
+GGCGTTTTGTTGATGCGAAAAAAG
+CCAAAACGCTGGGTAAAGCGTGCA
+NODE 3321 141 476 413 0 0
+CATAGTAGGCCACTATCCTACCATCGAAAGTTGATAGGGCAGAAATTTGAATGATGCGTCGCCGGCACGAGGGCCGTGCGATCCGTCGAGTTATCATGAATCATCGCAGCAACGGGCAGAGCCCGCGTCGACCTTTTATCT
+ACTCGACGGATCGCACGGCCCTCGTGCCGGCGACGCATCATTCAAATTTCTGCCCTATCAACTTTCGATGGTAGGATAGTGGCCTACTATGGTGGTGACGGGTGACGGAGAATTAGGGTTCGATTCCGGAGAGGGAGCCTG
+NODE 3322 19 589 589 0 0
+TCTGTTCGCCACCCGCCTG
+TAATGGCAATGGTCATGGA
+NODE 3323 40 40 40 0 0
+GTGCATAAAGATTGGCATCTGTAATTCGGCGGCAATTTGT
+TACGATCAACCGGATGGGTGAAGAAGTCGAAATGATCACC
+NODE 3324 47 77 77 0 0
+ATGCGCTGGAAGGTAAACACCCGGCGGTTCCTGTTGATGTGGTGCAT
+TAAAGCCAGCAACAGCAGCGTTAGTTTACCCATCCTGCCCCCTGAAA
+NODE 3325 58 136 136 0 0
+GTGGAGCCTGCGACCATACTCCCCCCGGAACCCAAAGACTTGTGATTTCTCATAAGGT
+GGCTCCACTCCTGGTGGTGCCCTTCCGTCAATTTCTTTAAGTTTCAGCCTTGCGACCA
+NODE 3326 6 89 89 0 0
+TATGGT
+ACGGAG
+NODE 3327 4 64 64 0 0
+CGCA
+GCTG
+NODE 3328 51 77 77 0 0
+AGCAACACGCTGGCGTATCTGGCCTACTCCGACAAAGTAGTCGACGGGGCG
+TTTTCTCATCATAGAAACGCACGACCTGCAATGACTTAAATATCAATGAGG
+NODE 3329 51 97 97 0 0
+GTCTGTCATTCGCTTCGATGGTAATGCATGCGTTATTTTAAACAATAACAG
+CCCGTCCGGGCGACGAACACCCTTCTTGGTGCGCACCACTACCGCCTTCAG
+NODE 3330 33 110 110 0 0
+TAGTGAACACGTAATTCATTACGAAGTTTAATT
+TTTTTCGTCCGAGGACGTTAAGAATCCGTATCT
+NODE 3331 18 43 43 0 0
+ATTGAGACTTGGTATTCA
+GATTGAGCATCAAACTTT
+NODE 3332 51 120 120 0 0
+ATTAAATGTCCGGATGAGCATGTTGTCGCATATAAGGATTTTCGCAAAGAC
+TTTTATAAATCCCTGCCGTTTTCATCTCTTCATAATCCGGCATATCGGGAT
+NODE 3333 1 3 3 0 0
+G
+C
+NODE 3334 45 154 154 0 0
+CAGGGACGTAATCAATGCAAGTTGATGACTTGCGTTTACTAGGAA
+GTTACGACTTTTACTTCCTCTAAATGATCAAGTTTGATCTACTTC
+NODE 3335 109 441 441 0 0
+TTTGAAATAGCGTGTTGACCAAAGGCTATCGGTACTAAAACACTAGTCAAGGTGAAAATCGTCGCTTGCCAGCATGGATTCTGACTTAGAGGCGTTCAGTCATAATCCT
+ATTTTCACCTTGACTAGTGTTTTAGTACCGATAGCCTTTGGTCAACACGCTATTTCAAATGTCTAACCGAATGTTGGTCGAGTTAAATCCTCTGTAGACGACTTAACTA
+NODE 3336 141 353 353 0 0
+TCACTGCTTAGACAGACATTTCCATTCGTCTGCTTTTCCTAGCCTCCTGCGTCCCTCCATTGCTCAAACGAAAACAACGAGTACAGGAATATCAACCTGTTGTCCGAGGCCGACAGGCGTAGGCGATGGACAACAGGTTGA
+TATTCCTGTACTCGTTGTTTTCGTTTGAGCAATGGAGGGACGCAGGAGGCTAGGAAAAGCAGACGAATGGAAATGTCTGTCTAAGCAGTGAGTTTTGTGATGAGTCAAATGCTTGTCACTTTAAGAATGAGCTGTGATGGG
+NODE 3337 38 38 38 0 0
+TTAACAGTAACGCGGGCACAATCGGATGAAAGCCCAGG
+AATGGTGGGCGGCGTACTGGCCGATCGCTACGAACGCA
+NODE 3338 51 73 73 0 0
+CAAGCCCATCCCAATGCAATGAGTATCGCCTGCGGCTTTTGCGCCAGGGAG
+GAAAAGGCGACGGCTCGTTGATAAAAGAATATACCGTCGTTGCCTTGCAGG
+NODE 3339 51 92 92 0 0
+GCGTGTGGTTTAACGTCGCAGGCGCGGGGATTCTGACGCTGGCCTATTTTG
+CCCCGCCGACCCCGCCAGCCCTCATGGTAATGCCCCCACAGCAGAACGATA
+NODE 3340 156 8209 7998 0 0
+GCCCGTAGCGCCACCAGCATATTAACCGCCCGTCCAGGCGTTGACGGGACAAGGATAGTGAATATCGTCGTCATATTATTATGAGCGCTTTCTTCCAGAAGCCGCGTCATAAACGCGCCATCCAGCGGCTGCGCGGCGCGAATCGGCAGGTCAAGG
+CGCGGCTTCTGGAAGAAAGCGCTCATAATAATATGACGACGATATTCACTATCCTTGTCCCGTCAACGCCTGGACGGGCGGTTAATATGCTGGTGGCGCTACGGGCGGGTCACATTGTCGCGCGTTACGCGAAGCTGCATCTCTATGATGCGTTTT
+NODE 3341 51 62 62 0 0
+ACTTTAGCGATCTGCTGGAAAAACTGGCCATTGCGCCGGAAAATGTTGCCT
+TCGATCAGCTTATTCGACTGTCCCTGATAAAGATGGACAATCCCCAGCGTG
+NODE 3342 144 358 358 0 0
+TTAATGAGGGTGGTTGGCACACAGTAACCCTAAATAGAACTCTTCAATAGAGGTCACCTTAACATGACCTGGTTTTATGATCAAAGGTACCATATACTATGAAGATATTTTTAAAATGTTACATTGATTGATTAAACAGTTTAA
+TATGGTACCTTTGATCATAAAACCAGGTCATGTTAAGGTGACCTCTATTGAAGAGTTCTATTTAGGGTTACTGTGTGCCAACCACCCTCATTAAAATAGTCACAGATGTAAGTAGAGGAAACCAGATAAAAGGAAAGATCTCTA
+NODE 3343 42 58 58 0 0
+ATCGGGATCCGCGATCTGGATCCCGATTCAGCCTGCTCTTCG
+TGGTTTTCATCTTGATCAAATGTCTTTAAATGTCATATAAAA
+NODE 3344 51 149 149 0 0
+GATGTAATGTCCAAGCAACAGATCGGCGTCGTCGGTATGGCAGTGATGGGG
+CCTCCTGTCAGGTGTGGAACCCCTGCCACAAACGGTCATGGCAGGTTAAAG
+NODE 3345 126 476 476 0 0
+AGCTGGGAAAGCACCTCATGTTTGAGGTGTTCGGTGCCTTCCCGACGGCCCTTGAAAATCGGAGGGAGAGATTTATTCGCACGCCTGGCCGTACTCATAACCGCATCAGGTCTCCAAGGTGAACAG
+ATAAATCTCTCCCTCCGATTTTCAAGGGCCGTCGGGAAGGCACCGAACACCTCAAACATGAGGTGCTTTCCCAGCTCGTCTAACCCTATCTCGGCTTAACGCCATTCCAGGGTTAGACTAGAGGCT
+NODE 3346 51 1863 1704 0 0
+TGGAGAGGATCAGCGAAAACGCATGGAGAGATCGAGCGCGCGTACGTGCTT
+ACCCGATGGCGCTGCGCCGTCGGGTCTATAAATCACCTGTCCGTAGATCCG
+NODE 3347 51 115 115 0 0
+GTGCCGTACAAAGGCAACGCACGAGTTATTAGTGGCTATAAGGGCGTTTCA
+CCGCCCTCATCCTGTTGAGGATATTGCTATGAGCATCACTTTACTTGACGG
+NODE 3348 4 95 95 0 0
+ACCC
+GCCA
+NODE 3349 125 212 212 0 0
+CTAGCGAAACCACACCCAAGGGAACGGGCTTGGAATAATCAGCGGGGAAAGAAGACCCTGTTGAGCTTGACTCTAGTCGGCTTGCACCTCCCACTTATTCTACACCTCCCGGGTCAATTCACAAA
+TAGAGTCAAGCTCAACAGGGTCTTCTTTCCCCGCTGATTATTCCAAGCCCGTTCCCTTGGGTGTGGTTTCGCTAGATAGTAGATAGGGACAGTGGGAATCTCGAAAATCCATTCATGCTCGTCAT
+NODE 3350 1 50 50 0 0
+A
+T
+NODE 3351 1 27 11 0 0
+A
+T
+NODE 3352 1 32 16 0 0
+A
+T
+NODE 3353 261 1645 1645 0 0
+CCCCACCATCTGCAAACTTCCTCGGAAAAGCCGGCGAGCACGCGGTCATGGCAGAGCTTCTATACCGAGGAAGTCTTCAACTCAGCAAAGAAGACTTTCAGAAGAAACTGTCTGGCGCGCTGGCTGCAAACCTCAAGACTAGCTTACCGAGCTTTGCAAAAGTCCCAAGCAAGACGGGCGGATTGAAGAAAGGCGTGTATCGGCTCAAGGTTCGCCAAACAGCTTCGCCCACGAAGCTCCAGCAACCTAAGGAGACGATAA
+ACCTTGAGCCGATACACGCCTTTCTTCAATCCGCCCGTCTTGCTTGGGACTTTTGCAAAGCTCGGTAAGCTAGTCTTGAGGTTTGCAGCCAGCGCGCCAGACAGTTTCTTCTGAAAGTCTTCTTTGCTGAGTTGAAGACTTCCTCGGTATAGAAGCTCTGCCATGACCGCGTGCTCGCCGGCTTTTCCGAGGAAGTTTGCAGATGGTGGGGTTATCGTCTCCTTAGGTTGCTGGAGCTTCGTGGGCGAAGCTGTTTGGCGA
+NODE 3354 172 951 951 0 0
+TCGCAACTCTCTTGAGGTTTTTGAACGAAATTCTGCCTGTCTCATCTTCGTCAAACAACCTGAATGCTTTGAGCATTTCCTCTCTTGGGTCTTTCTCAGCCATCTTGGTGGTCATTAGTTCGAGGAATTGGGTGAGAACATGAGTGATGAGGAGATCCAAGAGATGATCGAC
+CGAACTAATGACCACCAAGATGGCTGAGAAAGACCCAAGAGAGGAAATGCTCAAAGCATTCAGGTTGTTTGACGAAGATGAGACAGGCAGAATTTCGTTCAAAAACCTCAAGAGAGTTGCGAAGGAATTGGGTGAGAACATGAGTGATGAGGAGATCCAAGAGATGATCGAC
+NODE 3355 110 398 398 0 0
+GAGGCTGACAGAGATGGAGATGGTGAAATCAACGAGGATGAATTCGTTAGAATTATGTAGAAGAGGTTGGTCTTCTTCATAATTCTAACGAATTCATCCTCGTTGATTTC
+CTACATAATTCTAACGAATTCATCCTCGTTGATTTCACCATCTCCATCTCTGTCAGCCTCGTCGATCATCTCTTGGATCTCCTCATCACTCATGTTCTCACCCAATTCCT
+NODE 3356 41 2036 205 0 0
+CCACATTTCCAGTGCTGGTAAGCGCATAAGTATTTGCGCTA
+ACCTGCCGTTAGCTTTTATGCTTAGCCTGATGCTCTTTTTC
+NODE 3357 46 46 46 0 0
+GCGCACCCGGATGTCTTTAACCTGCTGCTGCAGGTGATGGATAACG
+CGATCTCATCCAGCAACAGCACCGCATGAGGATGCTTAATCACCGC
+NODE 3358 46 46 46 0 0
+CCGGTAACCACATTGCTATCGTTATTTTTCACATCCGCACGATACC
+AATGATGCCTGGGCCACCGGCAATCCGGTATTTAAAGGCTCCTCGC
+NODE 3359 44 44 44 0 0
+AGCGCCCTTGTCCGGCTAACAATTCTGCATGAGTGCCTCGCTCA
+GGGATGTTTGCGCTCAGACTTCTCTATGAAGGCGTGACGCACCG
+NODE 3360 107 284 284 0 0
+GCTAGTATCGTACCGGTAAACCGGTATTTTCGTACCCAGCACACACATGATACCGTAGGGACCAGCAGATAGGAGCAAGGACCAATGAATTTGGGGACAGGACATGT
+TACGGTATCATGTGTGTGCTGGGTACGAAAATACCGGTTTACCGGTACGATACTAGCGGGACCAGCAGATAGGAGCAAGGACCAATGAATTTGGGGACAGGACATGT
+NODE 3361 36 36 36 0 0
+CTGCTGAAGGCTGGAAGGCCAACCGGATGCAGACAA
+GCTTAAAGAGGTCATTACTCATCATCCACAAAAAGA
+NODE 3362 47 1727 1695 0 0
+TGCCGGTCTTTTCACAATCCTTTTTGCCGCCGCTACTACCGCCTTTT
+AGGCGATAGAGAGTTCGCCCTGACGGAACTCGCGCAGACTTTCCGCC
+NODE 3363 51 107 107 0 0
+AGTAGGGGAACCTGCGGTTGGATCACCTCCTTACCTTAAAGAACTGTTCTT
+TGTTACCTTGTTACGACTTCACCCCAGTCATGAATCACAAAGTGGTAAGCG
+NODE 3364 44 64 64 0 0
+ACGTTACAGGTTGAACTGGTTGGGCGCAGCGAGTGGATGAATCA
+CCGGATACGCCGCCGTTTGAGACCGATGGGCGACTGGTGGCGAA
+NODE 3365 51 65 65 0 0
+GGGCGAAACGTCGTTAATACGAGGATGAAAGAATGAAATGGTTTAACACGT
+CTCATTTCATCGACGATCTCGCCCAGACGTTGCAACTTAGGCGCGGAAACA
+NODE 3366 42 71 71 0 0
+CGGGACGCTAATATGCTGCCCCAGGACCAGGCTAAACGCGGT
+GCCGCCGCTCAACATGAACCTGGCGCGCTATCTGGTGATTCA
+NODE 3367 76 439 439 0 0
+ATAGGAACCCTCTCGGGGGCTCCCAAGATCATAACATGGTAACGGCACTTTCACATGGAGTAAAATTCGTGTGAGG
+TTGGGAGCCCCCGAGAGGGTTCCTATGATCATAACATGGTAACGGCACTTTCACATGGAGTAAAATTCGTGTGAGG
+NODE 3368 16 358 358 0 0
+CGATGCTGAATCAAGT
+TTACCATGTTATGATC
+NODE 3369 3 49 49 0 0
+TCA
+CCG
+NODE 3370 4 50 50 0 0
+CGAA
+CCTT
+NODE 3371 41 57 57 0 0
+GGAAAAAGACAAAGTGAGCAATCAACAGACTGACGATATGA
+TTTTCGCGTCAGATTGTTTTGCCCTGGCTTCGGTAAGAGAG
+NODE 3372 39 225 225 0 0
+GGTAGCGGTGAAATGCGTAGAGATCTGGAGGAATACCGG
+CCCCCCCTCTACAAGACTCAAGCCTGCCAGTTTCGAATG
+NODE 3373 72 219 219 0 0
+GCAGAGCCCACTGGGTTTTGCAATTGGAATGAGAAGCTACCATCTGTAGGATTATGACTGAACGCCTCTAAG
+TGCAAAACCCAGTGGGCTCTGCATTGGAATGAGAAGCTACCATCTGTAGGATTATGACTGAACGCCTCTAAG
+NODE 3374 126 530 530 0 0
+CCCGGGCTAGGCTCCTTACGGAGCTATTCTTCCGCTTATAGTCACACGCTTCGTCGTTGTCACTTTCTAGCATGGATTCTGACTTAGAGGCGTTCAGTCATAATCCTACAGATGGTAGCTTCTCAT
+TCCATGCTAGAAAGTGACAACGACGAAGCGTGTGACTATAAGCGGAAGAATAGCTCCGTAAGGAGCCTAGCCCGGGTTCTGACTTAGAGGCGTTCAGTCATAATCCTACAGATGGTAGCTTCTCAT
+NODE 3375 51 129 129 0 0
+ATAGCGATTTACTCAGATTCAAAATCTTTGGTATGCCGCTACCGCTTTATG
+TCCCCCTTTTTCTCCGTCGCCGAAGCCTGGGTCATGTTGGTCATAAACATT
+NODE 3376 102 178 178 0 0
+TTAAACCATTAGCGTAAGCTGGGCGGTGGAGGAAACCTTAAAAGTTCCTTGCCGAATAGCGAAAGCGAATGGGGTTTCGCAGGTGAAAGACAAAATGGTATC
+GCAAGGAACTTTTAAGGTTTCCTCCACCGCCCAGCTTACGCTAATGGTTTAATTCGCAGGTGAAAGACAAAATGGTATCCTGGCACAATAATAAGGCTGAAT
+NODE 3377 38 1860 1821 0 0
+GCCGCCGCTGACGACTATCCATCAGCCGAAAGATGAAT
+GCCAGCTCAATATCATCATAGCCAATGACTGCCATATC
+NODE 3378 35 35 35 0 0
+GGTGATGTTCTTCGCCTTTAGCTGTCTGTTTACGC
+GGCGAGCGGTCAATAATGGAGGGCATGATAAAGCT
+NODE 3379 120 264 264 0 0
+CCCGTCTTACATCTCCGACCTATCAACCTGGTCGTCTTCCAGGGGACTTCAGGACTTTCGTCCAACGAAACCTCATCTTGGGATGAGCTTAGCGCTTATATGCTTTCAGCGCTAAGCTCA
+TTTCGTTGGACGAAAGTCCTGAAGTCCCCTGGAAGACGACCAGGTTGATAGGTCGGAGATGTAAGACGGGTAACCGTTTCAGTTGACCGATACTAATGGACGAAAACTTGACCACTGAAA
+NODE 3380 42 43 43 0 0
+CATCGTTATCCCATCAATGGCCGCGAGATCTGCGTCTTTTTT
+CTGCATAAAATCGGCGTAGTGTCTGCCGATGGCGCCACCACG
+NODE 3381 44 68 68 0 0
+TTGAGCTGCAATCAGAGCGAGTGGTGGCAGTGCCGAAAAAATGG
+AGTTGTTTGCGCGATGTGTACAGTTCGCGTCGAAACGCCAACGC
+NODE 3382 44 54 54 0 0
+CGTCCACATTAACGGGAGATGTCATAATACGGTCACTCCTTTCA
+GGTGCTGCGCGGGTTAAGCGTAGCGGCGCGCCGGATTGCCTGGC
+NODE 3383 46 67 67 0 0
+GCCGGCGGAGGATCTAAAGGCAAATTATGGAGCCAAATACTTGCCG
+CCAGAGAGTCGGCCTGTACGCCGGAAAACGCGGCAATTTGCTGTAA
+NODE 3384 51 78 78 0 0
+GAAGTTTCAGAATCGTTTAGTCGGCACGATTGTGTTAGTCGCGCTGGGGGG
+CCTCGCCACCGATTCTCCCCGCGTCTATCACTTCCATAACATGTGCGACGG
+NODE 3385 30 55 55 0 0
+TACTGGCAACCGGCAGCGCGCAGCAACTGC
+CCCAGCCAGTCAAAACGCTCCGCCTCTTCC
+NODE 3386 51 54 54 0 0
+GGTAATGATATTCTGTACTGCCGCCAGCCAGCGGGCGGGTTCAGAACGCTC
+CCCTACACTACCGATGGCATCGTCCCCGGACCATACGTTAATAACCCATGG
+NODE 3387 46 46 46 0 0
+ATACGTTTTACCGAGCATGATGTCTTTTCCGGTGTGTCCGTGACAT
+CGCTGTTATTAGGTTTGCCTATCGCGACACTGGCGTTAATTGTGAA
+NODE 3388 10 10 10 0 0
+GGGGAAACGA
+TTTTCCCTCT
+NODE 3389 159 253 253 0 0
+CACCTGGCGAAGACAGCATCATCGGCTGGCTATTGCAGACCAAGGAGCTGATCATGATCATTTTTGCCAATATTCTGCTCGACAAGCAGATACTGACAAAAATGATCATGATAGATCGGAAGAGCGTCGTGTAGGGAAAGAGTGTAGATCTCGGTGGTC
+ATGATCATTTTTGTCAGTATCTGCTTGTCGAGCAGAATATTGGCAAAAATGATCATGATCAGCTCCTTGGTCTGCAATAGCCAGCCGATGATGCTGTCTTCGCCAGGTGCCCAGTTGAGTATCCGGCCGGCTATTGCAGACCAAGGAGCTGATCATGAT
+NODE 3390 135 429 429 0 0
+TCCATGAATAGCTTGAGCAAAAATGGAGCAGTCTAAAAAGTAAAATGGTCTCCGACTAACACGATTCCGATGCCGTGCTGGTTGTAGTCGGAGACCATTTTACTTTTTAGACTGCTCCATTTTTGCTCAAAATAT
+ACAACCAGCACGGCATCGGAATCGTGTTAGTCGGAGACCATTTTACTTTTTAGACTGCTCCATTTTTGCTCAAGCTATTCATGGAATATTTTGAGCAAAAATGGAGCAGTCTAAAAAGTAAAATGGTCTCCGACT
+NODE 3391 215 544 544 0 0
+ATGTTTTTATTAAACAGTGAGATTCCCCTTGTCCGCTTCAGTTCTGAATTGATTGTTAATCGTACAGTCTCTCACATCCTCGGTTCCAAGAGCTCGATGACAGTGGCGCGAACCTCCATCATTTCACAACAAAGAGACGTTAGATAGAGCTCCTGGAACCGATGATGTGAGAGACTGTACGATTAACAATCAATTCAGAACTGAAGCCTCGTATG
+TCATCGGTTCCAGGAGCTCTATCTAACGTCTCTTTGTTGTGAAATGATGGAGGTTCGCGCCACTGTCATCGAGCTCTTGGAACCGAGGATGTGAGAGACTGTACGATTAACAATCAATTCAGAACTGAAGCGGACAAGGGGAATCTCACTGTTTAATAAAAACATAGCATTGTGATGGCGTGTAAACGTTTTGACACAATGTGATTTCTGCCCCT
+NODE 3392 51 76 76 0 0
+AGCCGCTAGCGGCGTTCAAAACGCTAACGCGTTTTGGCGAGCACTGCCCAG
+TGCCCGAAGGGCGAGCGTAGCGAGTCAAACCTCACGTGCTACGTGTACGCT
+NODE 3393 51 74 74 0 0
+GCGGCACCGCAATCAGCGGCAGACGCGGGCGTAATGTGCTGCGATCGGTCA
+CCCACCGCCGGAACCGGTTCTGAAACCACCAACGTGACGGTGATTATCGAC
+NODE 3394 105 194 194 0 0
+AACCCGGTCGCAAGGCTCTGGGTTTCGTTGAGGGGAAGGTAGAGAAAGTCGATGCGGACACGGCTTACCGTCATCACCCGGTAGCGTCCGTCGATCAGCTCGCCC
+GCATCGACTTTCTCTACCTTCCCCTCAACGAAACCCAGAGCCTTGCGACCGGGTTTCGCTATGCGGGCGGGCTGGATGAGCGGGGTGAAATGACCGCCTTTCTCG
+NODE 3395 2 20 20 0 0
+GG
+CC
+NODE 3396 33 345 345 0 0
+CGATATTGCATTTCCGTTTCAGTATTTCTACCT
+GTGGGCAGGTTTTGAATCCTACCCTGTCGGAAG
+NODE 3397 51 63 63 0 0
+CTAGCACTTATGATATAAATACCTTACTCTTTAGTTTTTGTCTTAATTATA
+GCAGTATTGGCCTTCTGCCCTGCCGCTAAATATCTCATTGTTGTTAGCCTA
+NODE 3398 51 81 81 0 0
+GCAATACTGATAGCACTTATGATATAAATACCTTACTCTTTAGTTTTTGTC
+CCCTTCTGCCCTGCCGCTAAATATCTCATTGTTGTTAGCCTAATAATACTT
+NODE 3399 2 6 6 0 0
+GC
+TT
+NODE 3400 1 5 5 0 0
+G
+A
+NODE 3401 51 83 83 0 0
+GTGGTAGAGCAGTTGACTTTTAATCAATTGGTCGCAGGTTCGAATCCTGCA
+CCTGAGCTAACGACCCGAGTGGTGGGTGATGACGGGATCGAACCGCCGACC
+NODE 3402 51 144 144 0 0
+GAAGCGCCCACTCATGGGGGCCATTGCCGAAGAATTCGCGGATATCGTCGT
+CCCTTTGTCACGATCCCCGCCACAGCCAAAGACGCACCACAATTTTCCGGC
+NODE 3403 120 415 415 0 0
+TTCAGTCATAATCCTACGGATATTTTTAATGCGGTTGCTGAGTAGCCAATGCCGCGAAGCTATCATCCGTAGGATTATGACTGAACGCCTCTAAGTCAGAATCCATGCTGGCAAGCGACG
+ACGGATGATAGCTTCGCGGCATTGGCTACTCAGCAACCGCATTAAAAATATCCGTAGGATTATGACTGAACGTCGCTTGCCAGCATGGATTCTGACTTAGAGGCGTTCAGTCATAATCCT
+NODE 3404 51 58 58 0 0
+CGACAAAAGCACTGTTCAAATATGTGCGCGAAGGGAAATATACTTTCTGTA
+GGCGGCGGCAGAATATTGTCGATGTATTCATCGGTATTCTGGCGAATTTTC
+NODE 3405 2 2 2 0 0
+TG
+CC
+NODE 3406 46 2129 219 0 0
+TTACACGTAACGCTGCTCGACCCTCAGTTGGAACGACAGTTGGTGT
+ACCAGCCGTACGCCGCGCTCGCCGCGACGCTCGTCCCAGGTTTTAA
+NODE 3407 12 866 847 0 0
+GAAGACAGGGCC
+CCTACTCTCGCA
+NODE 3408 51 187 187 0 0
+GACTTAAACAGACGGAAGTGCCTGGGTTTGATTCTGGCTGTTATCAGAGCG
+CCCCGTCGCTCTCCGGTATCCATATCCAGTTCAAACAAGGTATCTGGCGTC
+NODE 3409 36 37 37 0 0
+TGGTACAGTATGACCGCCAGTTGTGGAAAAGCGTGT
+GCGAAGCAACTCAAGCTCCAGCTCACAAATCGGTTC
+NODE 3410 162 6706 6621 0 0
+AAAGCGTCATAAAGAGCAGCAGGAAGCCGGCGATGGCCCAGCGCAGCGGCGAGCGCATCGCCGGGTCGATGCTCTGCTGCATCCGCGTCGAGCCCTGGTGCAGGGTGTTCCACCACTCAACGGAATAGTGGATAACCGGCAGGTTCACCACGCCGACCAGCA
+TGGAACACCCTGCACCAGGGCTCGACGCGGATGCAGCAGAGCATCGACCCGGCGATGCGCTCGCCGCTGCGCTGGGCCATCGCCGGCTTCCTGCTGCTCTTTATGACGCTTTCGCTGATGCGGATGCGCAACCTGATTTTACTGATGGAAAAACGCCGCCCG
+NODE 3411 7 301 265 0 0
+CCAGAAT
+TGAGTGG
+NODE 3412 17 47 47 0 0
+GTATTTTGTGCTGCCGC
+TCCAGCCGATAGTTAAA
+NODE 3413 36 36 36 0 0
+ATTTAGAGTGATCCACCACCAGCATCACGTGGCGCG
+GTGACGTGGATTGAGCACTGGCTGGATCTGCGCGGC
+NODE 3414 42 42 42 0 0
+TTTCAGCGTCGCCACGCGGCTGCGCAGGCTGGCGGTAAAATC
+GTATTAGTTACGCTTGACAGAGTGTAAAACAAAACATTTAAA
+NODE 3415 41 41 41 0 0
+CATAGCCGGGAAATCGCCCTGCAAACCAGGTTGTCTTCTTC
+CACAGCGGGCGCGACAGAAGCGCTGTATGCGGCGATTACCG
+NODE 3416 108 122 122 0 0
+TTCCAAACCTAAATATGACACAAAGACCGATAGCGGAGAAGTACTTCGAAGGAAAGTTGAAAAGAATCACGAAAGTGAAGTTAAAAAGTACCTGAACACGTAAAAGGA
+AACTTTCCTTCGAAGTACTTCTCCGCTATCGGTCTTTGTGTCATATTTAGGTTTGGAAGAAAAGAATCACGAAAGTGAAGTTAAAAAGTACCTGAACACGTAAAAGGA
+NODE 3417 51 56 56 0 0
+CGCTGCGATGGTTTAACGCAACGGCGAAAACAGTCCCCTTCATACATAAAC
+GAGCTTGATGCCTGGCGAGAGGCTTTCTCTCAGCCTCCCTATAATGCGCCG
+NODE 3418 43 43 43 0 0
+GAAAACAGTGTTGAAGTTCATCGTCTCAGGAAGTCCGTCGGTC
+GTGGATACTTAAACTTCACGCTTTTAGCAAAGAATTCACCTCT
+NODE 3419 72 186 186 0 0
+CTGGAACTGAAGACGGTTCCAAGGGTTTGACTGTTCGTCAATGAAGGCGGTACATGATCTGAGTTCAGAACG
+TTGGAACCGTCTTCAGTTCCAGGGGTTTGACTGTTCGTCAATGAAGGCGGTACATGATCTGAGTTCAGAACG
+NODE 3420 51 139 139 0 0
+GGTTAAACCATTTCATTCTTTCATCCTCGTATTAACGACGTTTCGCCATCA
+CCGTTGAGCCACAACCGCTGGCTGGAGCAGGAAACCGACCGCATCTTTAAT
+NODE 3421 34 630 567 0 0
+TGAAACTTAAAGAAATTGACGGAAGGGCACCACC
+CCCCCCGGAACCCAAAGACTTGTGATTTCTCATA
+NODE 3422 13 30 30 0 0
+GGGAAAGCTACCC
+AACCTCATCCAGA
+NODE 3423 51 88 88 0 0
+GGGGGCTGGAGAAATGTAAGTGGACGGTCAACGCGCTGATTAACCACCATT
+CCCGCGGCCTCAGGCGTATCTTCAATCACGCATTCCGGGTGTTCGTTGGTG
+NODE 3424 47 51 51 0 0
+ATGTGTGAAAGGCGTTGCCATCAGTATCTCAAAACTGACTTACGAGT
+TGATGGCAACGCCTTTCACACATTACCGCGCAAGTGGCGTCCCCTAG
+NODE 3425 51 76 76 0 0
+GTATATATTGCCATCATTACGCTTACCGGCGTGTCATTAGCTTACCTTTTC
+CCAACGTTGTGACAACAGTGCCAAAGCGGGAAAGACAGGTAATGGCCCCAT
+NODE 3426 51 56 56 0 0
+AGCCTGATGCGTCAGCCACAGTCGCGTATCAAACTCCAGTTGATGGTACTG
+TCTGTCGGCACAATAAATTCTGAAAATGCCCCTTCCCCCGTATCTTTTTAA
+NODE 3427 27 765 682 0 0
+GCTCAATGCGGAATTACGCGCCGGCGT
+TCCACCTGCCGCGCCCGCGCCGGGAGC
+NODE 3428 51 73 73 0 0
+GAATGGCAATGGTCATGGATCCCTCCGGGAAATTAAACGTGGTGGCGGTGA
+CCCGACGTCGTCCTGCGTGACGCCCACCAGTCTCTGTTCGCCACCCGCCTG
+NODE 3429 50 58 58 0 0
+ATTGATTGCGCTGGCCGTGGCGGTTACTACCCGTTGCGATGGTTGTCTGG
+CTGCTTTTGCACATAACCCTGCTGTACCTGACGATAATTGCGCGTTACCG
+NODE 3430 5 5 5 0 0
+AAAAC
+CCCCT
+NODE 3431 51 77 77 0 0
+CGACCATCCAGGTTGGTGCTAACGACGGTGAAACTATCGATATCGATCTGA
+GGGGTGTTGTCCTGCGCCAGAACTTTCACGCCGTTGAACTGAGTCTGGCCG
+NODE 3432 51 141 141 0 0
+GTCAGGTCCGGTGAAAGCGCAGGCGGAAGCGGAGGGGCTGGACAAGATCTT
+CCCCGGCACCACCAGCGCCTGCACGCCCGGCGCAACTTTGCGCCCTTTGGC
+NODE 3433 14 113 113 0 0
+TGGTAAATGCTTTC
+ATCGAAGATGATTA
+NODE 3434 12 74 74 0 0
+GAAAGTTAGGGG
+GCAGTAGTTCGT
+NODE 3435 46 46 46 0 0
+CCGGGAACAATCACCATCTTGAGCCCCAGTTCACGCGCGCGCTGAA
+TAACGCGTAAACAGGCTGGCGACGCGTGGGAAGCTGCCGCGCGTCG
+NODE 3436 16 820 48 0 0
+AGCCGCTTAAAGAAGG
+CCAGCGCGTCATTGAC
+NODE 3437 51 84 84 0 0
+GATTGCTCTTGCCATACTATTGCTTATACCGCTATTCAGGTTGCCTATTCC
+CCCCGATGCTGATATCCTTGCAAAATCCAGCCAGTCGTCCTCTTTTCGAAA
+NODE 3438 5 5 5 0 0
+TCAGA
+CCCCT
+NODE 3439 185 408 408 0 0
+AAGAATTCATGAAGAGGACGTTCTCTGTCAGAACTCTTGTCGCTGATGTCCCTCTTATCACTGAATCTGCAAGCATTAAAATGTGCAGGCCCCAGAAGGACATTGACTAAATCATCTATGTCCTCAAGAATTGGTGTGCGGGCGTCAATATTAAGCTTATGGACATCAGCGACAAGAATTCATGA
+ACCAATTCTTGAGGACATAGATGATTTAGTCAATGTCCTTCTGGGGCCTGCACATTTTAATGCTTGCAGATTCAGTGATAAGAGGGACATCAGCGACAAGAGTTCTGACAGAGAACGTCCTCTTCATGAATTCTTGGCGCTGCTTCTCAATGAGTGCTGCTGCTTTTTCAGCAGCACTCATTGAG
+NODE 3440 32 39 39 0 0
+GTGATTGCTCTTACCTTTCACCGCGGCTTTAA
+CCCACCGGTCGCAGCTATGCTATTGATCCCAT
+NODE 3441 105 153 153 0 0
+CTTGAACTAGGAATTCCTAGTAAGCGCTAGTCATCAACTAGTGCTGATTACGTCCCTGCAAAATGTACACACCGCTCAGGACATCTAAGGGCATCACAGACCTGT
+GGACGTAATCAGCACTAGTTGATGACTAGCGCTTACTAGGAATTCCTAGTTCAAGATCCACAATTACAAAGATCTATCCCAATCACGGCACTCACTAAAAAGATT
+NODE 3442 45 45 45 0 0
+GTACGGGCGTCTCCATGCCAAACAAACAGCTCGCGTGTGAGTATG
+GTTGTTTTAGCTGCTGCAGTTTGGCGAGCGTAATGCGCTCGTCCA
+NODE 3443 41 81 81 0 0
+CCAGAGTCTGGGCGGTCTGATTGAAGCCTATGAAGCCGTCG
+CCATTTTTTGTGATTATGCCGGATTCTCCACGCTGGACTCC
+NODE 3444 51 91 91 0 0
+GGCTGATTTCCGCAAAAGACTGGAAGCGACGAATGCGGCTGTCAAGGAAAC
+CCCGAGCCGGGGCCGCATTTCGGTCTTGGCCTTGAGGCTTACGCCACCTGG
+NODE 3445 51 52 52 0 0
+GGGGAGTCTCGGCGGCATGAGCCAGATTCGCAGCACCCATCGCCAGGGTAG
+CCCGCCGCGCCAGCGGATGCGAAGCCAATGATGCAGCATAAAGGTAAATTT
+NODE 3446 18 18 18 0 0
+CATTGAGCATCAAACTTT
+ATTGAGACTTGGTATTCA
+NODE 3447 60 281 281 0 0
+GAATGGATCAATGAGATTCCCACTGTCCCTATCTACTATCTAGCGAAACCACAGCCAAGG
+TGATCCATTCATGAGATTCCCACTGTCCCTATCTACTATCTAGCGAAACCACAGCCAAGG
+NODE 3448 7 46 46 0 0
+GTACGGG
+ATCTCAT
+NODE 3449 77 240 240 0 0
+CTTGGAAGAATCAGCGGGGAAAGAAGACCCGTACCCTTGGCTGTGGTTTCGCTAGATAGTAGATAGGGACAGTGGGA
+TCTTCTTTCCCCGCTGATTCTTCCAAGCCCGTACCCTTGGCTGTGGTTTCGCTAGATAGTAGATAGGGACAGTGGGA
+NODE 3450 18 58 58 0 0
+GCTGATTTTGGGCGTCGC
+ACCGCCCAGCACCGCCGC
+NODE 3451 51 57 57 0 0
+AGCTGATGGTGGTGCCGCCGGTGTAAGAATTGGCGCCGGAGAGCGTGAGCG
+TGCGGCACGCTGGTCGCCAGCAACGTTGAGGCGCTGGGCAGCGGCGACGTC
+NODE 3452 49 50 50 0 0
+AAACCCCGGCCCCACCTGTATGCCGATGGTATAAACAAAAAGGATCAGG
+CCGCTATTCGCCAGTAGCTTTATCGTGCAGCACGCCTCGGTGATGATGT
+NODE 3453 10 1426 124 0 0
+TATACTTTTT
+TCTGCATCAG
+NODE 3454 3 66 58 0 0
+TGC
+AAG
+NODE 3455 11 124 124 0 0
+ATTTGGACGTG
+GTTCTCATTTG
+NODE 3456 9 162 162 0 0
+ACGTTCCCT
+TACTGATGA
+NODE 3457 43 56 56 0 0
+TTTCGAAGTTCCGCAGCTGGTCACCGATGCGCTGGCGCACTAC
+CCGGGGCATTCGCATCGTTCCCGACCAGGAGATTAGCGGTCTG
+NODE 3458 27 51 51 0 0
+GAAATTAGAGAGCTTCGTAACCGAGTT
+ACCCGCCATCAAACGCTGGTAGTAACG
+NODE 3459 51 60 60 0 0
+GTAGACCAAACCATGAAACCAACATAAACATTATTGCCCGGCGTACGGGGA
+CCTTTACCGCTACTAAATGCCGCGGATTGGTTTCGCTGAATCAGGTTATTA
+NODE 3460 10 1431 38 0 0
+CCGGCGCGCA
+GTCGGTGCAG
+NODE 3461 45 73 73 0 0
+ATCTGCTTGCCCGGCATCTGTCGCCTGATATCCAGCACTGGTTTG
+GATTGGCGGAACTGGCCCAACGGATGGGAAGAACCGCGTTTCTTA
+NODE 3462 51 100 100 0 0
+GTCATTAGTACCGGTTAGCTCAACGCATCGCTGCGCTTACACACCCGGCCT
+CCCGTGAGGCTTAACCTTACAACGCCGAAGATGTTTTGGCGGATGAGAGAA
+NODE 3463 51 77 77 0 0
+CGGCAGACTTTGGTACAGGCCGGGTCTTCGCAGTGGTTGCACGAAATGGAG
+GGAGCGGCGCGATGCACAAGCGCGATGACGGTTTTGTGGTGGTGAACGAAG
+NODE 3464 40 5896 111 0 0
+TCGATAAGAACAAGAAATGATGAGAATATAGAAAAATTAT
+TCCGCATGCCACTTTTCATAAGTTTCTTTCTTCATAGCCC
+NODE 3465 40 118 118 0 0
+CATTCCGTGGTGTCATGAAGGATTCTGGATCGAGCGCGAT
+ACCAGCCGTAGGGCGCGATTAGGGCAAGGAAATCAGCCAC
+NODE 3466 7 7 7 0 0
+GGTCAGA
+CCCTGCC
+NODE 3467 51 77 77 0 0
+ACAAAGTTAATGGCTTTCGCACTTCGGCGCTGTTCCCCGGTCACGCTATCC
+TCCTGATTTACGGGATGAGCGCCTTCGGTCTTTCTCGCCAGCTTAATATTC
+NODE 3468 51 155 155 0 0
+GAGTATCAAGCGCCTGGAGTGCGTGGAATATCCTGAACTGGGTATGGAGGC
+CCCCTGCGCCAGAACGGCTGCCGGGCCGCCGATACTGCCCAGGTAGAAGCC
+NODE 3469 13 1749 87 0 0
+GGGACCGTTCGTT
+ATTTTTGTAATAG
+NODE 3470 51 74 74 0 0
+GGGTCCGCCAGGATAGGGGCCAGCGCTGATTGCAAATTATCCGCAAGCTGG
+CCCATTTTCCCGCCATGCTGACCGCAGAGCAGGTCTCGACGCTTAAAAATA
+NODE 3471 43 43 43 0 0
+GCTGGACCTGGGCGTGTACGGCGCGCCGGAAACCTTCCTCATC
+GCAGGCAGCAGATCGTGGAAATACCGGCAATTTGTAACGATTG
+NODE 3472 18 30 30 0 0
+GGCCTGCGGAATGTGCTT
+GCTGGAGTACCTCAAGTA
+NODE 3473 5 5 5 0 0
+GCCGG
+CATCC
+NODE 3474 101 405 405 0 0
+GATGATGTTGACCTGTCTGAAAAAGGCGTAAGCGAAGCAAAAGCAGCGGGGAAACTGCTAAAAGAAGAAGGTTTCAGCTTTGATTTTGCCTACACTTCCGT
+CCCCGCTGCTTTTGCTTCGCTTACGCCTTTTTCAGACAGGTCAACATCATCCCAGCCGGTGAAACGGTTCTCTTTGTTCCATTGACTTTCACCGTGACGTA
+NODE 3475 51 272 272 0 0
+GGAAGGCAATCAGGCCGAAGTAGTTCAGCGTCAGCGCCCCCAGCACGGTGG
+CCCCTGCCGCAGGCGGCGGCCATCGGCATTATCGGCGGCGCGGACGGCCCG
+NODE 3476 135 306 306 0 0
+ACTCCCTCCCCAACTAAAGGATTGGAGCGACAAGGGTTCCCCTAGGAACAAGGTACAAGATACCTACACTGACAGAGGTACGTTGCCAAACGAGATAGTGAAGTCTGGGTATTGTCCCGAGTCCATACCAGCCAG
+CAACGTACCTCTGTCAGTGTAGGTATCTTGTACCTTGTTCCTAGGGGAACCCTTGTCGCTCCAATCCTTTAGTTGGGGAGGGAGTCCAAACGAGATAGTGAAGTCTGGGTATTGTCCCGAGTCCATACCAGCCAG
+NODE 3477 42 48 48 0 0
+CCGTTGATGATTTCGTTAAAGCCGTCGTTAATATCCGCCAGG
+GTTCAAAGGTGTCGCCGCGATCTTCCGCCCGCTGCTGTTGCC
+NODE 3478 2 63 63 0 0
+TC
+AC
+NODE 3479 12 12 12 0 0
+GATTGACCGGCG
+ACCGCCACGCTG
+NODE 3480 41 64 64 0 0
+TTCGATGACGCCGAAACTTAACCCGCTCCCGCCGTGTACGG
+TACGTTGCTCATCGCCCTCGTCCCCGGCTACCAAACGATCG
+NODE 3481 51 53 53 0 0
+GGGTAAAGAAAGCACCTGTACAGTGCGTTACCAATTAGCTGAAACCACGGC
+CCTGCCCCACACCACGCGAAGTTCGCCTTGCTGTTCTACGCCGCGCACGTA
+NODE 3482 51 72 72 0 0
+GCACGCTAAACAGATATTTCTGCGGATCGGTGACGCGGTATTGCACGTTCA
+CCCAGCCCGGACGATAGCCTGCGTCAGGCCACCGACAGCGCGCTGCGTGGC
+NODE 3483 51 115 115 0 0
+GAAATTCTATGCGTTGCCGCAGTCTCCGCAGTTGTTCAAACAGCTCCTGAT
+CCCTTTGTGTACGCGGGACGGTACCAGGTAATCGCGCGCGCCTTCCGGGGT
+NODE 3484 75 121 121 0 0
+CAATGCAGATTGATGATCTGCGTTTATTATGTCCCTGCCCTTTGTACACACCGCCCGTCGCACTTACCGATTGAA
+AAACGCAGATCATCAATCTGCATTGATTATGTCCCTGCCCTTTGTACACACCGCCCGTCGCACTTACCGATTGAA
+NODE 3485 39 99 99 0 0
+TGGTCCGGTGAAGGCTCGCGATCAACTCCCAATGAAGGA
+AGTGCGACGGGCGGTGTGTACAAAGGGCAGGGACATAAT
+NODE 3486 5 9 9 0 0
+GATTC
+TACCT
+NODE 3487 8 11 11 0 0
+GAAAAAAA
+ATTTTTTT
+NODE 3488 28 34 34 0 0
+TCATCCGCTGTCTGCCGCCGTAGATCCG
+GATTCATATCGTCTTTTTCATACCAGGT
+NODE 3489 28 1428 36 0 0
+ATTAAGGACTCCTTTATGCTTACTGTAA
+ACTGGCGATCGCCCCACCGGCTCGCTGC
+NODE 3490 45 76 76 0 0
+AGCCAGCGCTAATGCCTCTTTAATGGCGTGCACGTCCGGCGCGCA
+CTCCGTCCAGAGCCAGATGGAGAACCTGGCGGTGGACATGGGCTA
+NODE 3491 6 2201 24 0 0
+GGATGA
+ACCAAC
+NODE 3492 47 100 100 0 0
+CCGTATTATGGGGGTCACTTATCCCTGTTGGCATTGCATTTCTGTGT
+CCCAGCCATAAAGATTCAGCAACGCACCGGATGAAAACGACCCGACA
+NODE 3493 144 1080 1080 0 0
+TTGCAAACGTGCGCACCATTGTAGCACGTTTGCAACCCTGGGCGTAAGGGCCATGAGGGCTTGACGTCATCCCCACCTTCCTCCGGTTTGACACCGGCAGTCTCGCTAGAGTACTAGATTGCTCTGAGCAACTAAAGATAGGGG
+GTGTCAAACCGGAGGAAGGTGGGGATGACGTCAAGCCCTCATGGCCCTTACGCCCAGGGTTGCAAACGTGCTACAATGGTGCGCACGTTTGCAACCCCTATCTTTAGTTGCTCAGAGCAATCTAGTACTCTAGCGAGACTGCCG
+NODE 3494 5 48 48 0 0
+GAGGG
+AAAAA
+NODE 3495 46 141 141 0 0
+GAATATAACCAAATTATTACCATCTGAATTATTAGGGCAGTTATTA
+CCCAGCCGTTAGATACTCTCATCATTAAAGACAACACTATCACGGT
+NODE 3496 9 14 14 0 0
+ATTGTTTAC
+CCTGATGCC
+NODE 3497 19 62 62 0 0
+TTACTATCCTTCTCACTGG
+CCCCCGCCAGGAACTGGAA
+NODE 3498 26 53 53 0 0
+GAATAAATAATGATGAAGCGCAAAAT
+ACCTGCCACTGCCGTCAATAAATTCC
+NODE 3499 42 42 42 0 0
+AGTCGCTCGTAGGCGCTGGTATAGCAGGCACCGCACACGTTA
+CATCGCGAATTTTGGCCTGGCAACGAGGACAATAAGCGCTTT
+NODE 3500 51 98 98 0 0
+GTTGTGGTTGGTTTCCTTCATTGGGAGTTGATCGCGAGCCTTCACCGGACC
+CCCCGAGCCTTCACCGGACCATTCAATCGGTAGGTGCGACGGGCGGTGTGT
+NODE 3501 51 101 101 0 0
+AGACTGGTATGCGAATCCAGTTCCCCAATCCTGGCGCTTTGCCTTCGCGAC
+TCCCGTGGATTATTAATGATAACTTCGTAAATAACCTTTCAGACAATGAGG
+NODE 3502 51 53 53 0 0
+GGCTGACATCCACGTTATCCAGTACTTCGTCCACCAGATAATCAGAAAGGT
+CCCCGACATTTTTTACTTAAAAGCGCGATCTTACCCTCAATGAATGACGCA
+NODE 3503 28 123 123 0 0
+GTTTTGCTTTTACAGGGCGGCAGGATGA
+TTTTTGCATGAAGAGGTGAAACTGACCG
+NODE 3504 66 91 91 0 0
+GAGCGTTACAGGATAACGCCTGGCAACAGGCGACCTGGCATTGGTTACGGGAGGAGGGCGCCCGGG
+TTATCCTGTAACGCTCCCTCACCGGCCAGCGCCGCCAGCGCGTTAACCGACCACGGCATTTGTTGG
+NODE 3505 51 194 194 0 0
+GAAAGGAATCATGGCTCTGTCAGCTTAATTTTTTTGATTCTTCGTGTTGAG
+CCCTGCCGTAAATGCTGATCATGCAGCGGAGAAAAAGAGAACACTTGGTCG
+NODE 3506 51 59 59 0 0
+AATATAAGCATATAAGCATATAAGCATATAAGCATATAAGCATATAAGCAT
+TCTTATATGCTTATATGCTTATATGCTTATATGCTTATATGCTTATATGCT
+NODE 3507 51 100 100 0 0
+GAAGCAAAATTCATCCGTAAGTGTGAATCTTGTCTGGGGGGGGTTGCTGCG
+CCCGCCTGCCTGTGGATCATCTTCCAGTTCAGGAACAGCCTCGAAGTATAC
+NODE 3508 14 14 14 0 0
+TTATGTACTATATA
+CCCCGCCAGTCTCA
+NODE 3509 51 172 172 0 0
+AAAAGCCGATGACGCCGATGTTGCGTACATCGCCCTGCGCGGAGTGGGCCG
+TCCGCCTTTGCATTGCAGGGTAAAGCAACGAATACGCTACCGCCTTGTTCC
+NODE 3510 14 17 17 0 0
+TGTCAACCGGAAAT
+GGGAACAGAGTCTT
+NODE 3511 108 383 383 0 0
+CCAACCCGTGTGAAGCCCTACCCATAAGGGCCATGAGGACTTGACGTCATCCCCACCTTCCTCCGGTGACAAACCGGAGGAAGGTGGGGATGACGTCAAGTCCTCATG
+AGGTGGGGATGACGTCAAGTCCTCATGGCCCTTATGGGTAGGGCTTCACACGGGTTGGCGGCCCTCTGTATGAACCATTGTATGACGTGTGAAGCCCTACCCATAAGG
+NODE 3512 51 59 59 0 0
+ATCTTTTACCTCCTTGCCGCTGGCTTTCACCACCACCAGCGTATTCGGATA
+TTGGCTGGAATGTTCTGCCGGACAATTTAATCAGATTGATATTCACAGCAA
+NODE 3513 87 392 392 0 0
+CTGCTTCACCAACGCCAAACGCCCAAGTTCCAATCGTAAAATCAAATCTATCGAAATACTTACGATGATGTATTTATTAGTAATTTA
+ACGATTGGAACTTGGGCGTTTGGCGTTGGTGAAGCAGAAAATCAAATCTATCGAAATACTTACGATGATGTATTTATTAGTAATTTA
+NODE 3514 51 77 77 0 0
+GGACCTGGGCGTAGGGAACGCAACCGCTGCGCCATTAGTTTGCGGGGGTTT
+CCCCAGCCATAATGGATTAGGTTGCTTATGAAGCGCGTGTATTAAAGGATC
+NODE 3515 47 2165 144 0 0
+TGAATATTTACAAGCCTCGCAATCCGAATGGGATATATTTATTGAGG
+ACCCCCTCCACTACCTGACGGTCATAGGCTTTATTCGCGTTAAATAA
+NODE 3516 18 1654 72 0 0
+TTTAATCACAATATTCGG
+TACCGGTTATCTGGCCAA
+NODE 3517 47 61 61 0 0
+GCAACCTGAGCTGCAAACGGAGTGGATTTGCGAGAACCACGGAAACC
+TTCGCTTGCGCTGACCCCATCAATTAACCTTCCGGCACCGGGCAGGC
+NODE 3518 46 68 68 0 0
+TAATATAACCAAATTATTACCATCTGAATTATTAGGGCAGTTATTA
+CCCAGCCGTTAGATACTCTCATCATTAAAGACAACACTATCACGGT
+NODE 3519 143 323 323 0 0
+GACATCGAGGTGCCAAACGATGCCGTCGATATGGACTCTTGGGCATCATCAGCCTGTTATCCCCAGCGTACCTTTTATCCGTTGAGCGATGGCCCTCCCACTTGGGACCACCGGATCACTATGACCGACTTTCGTCTCTGCTC
+GCCATCGCTCAACGGATAAAAGGTACGCTGGGGATAACAGGCTGATGATGCCCAAGAGTCCATATCGACGGCATCGTTTGGCACCTCGATGTCGGCTCATCTCATCCTGGGGCTGGAGCAGGTCCCAAGGGTATGGCTCTCCC
+NODE 3520 51 92 92 0 0
+GCACGGCAATTTCCTCCATGAGCGCCACCTACGGCCACCCGGCCACCGAAG
+CCCACGCCGTCAACGCCCGCCTCGATAGCCTTCAGCAGGGCCATCTCCGCC
+NODE 3521 8 54 54 0 0
+ACCGAATT
+GGGGGTCG
+NODE 3522 16 59 59 0 0
+CTTTTACAACCACTGA
+CCCTGCCTGTCACGCA
+NODE 3523 100 823 734 0 0
+CTATCTACCGTGAGAGTAAAAAACTGCGAGGAGTAAAGTATAGTACGAGAGGACCAAACTGTCTTACGACGTTCTGAACTCAGATCATGTACCGCCTTCA
+TCTCGTACTATACTTTACTCCTCGCAGTTTTTTACTCTCACGGTAGATAGGGACCAAACTGTCTTACGACGTTCTGAACTCAGATCATGTACCGCCTTCA
+NODE 3524 45 45 45 0 0
+ATACGATCAAATTCTGGCAGGCGGAAAATTCGGCGTTAACCAGGA
+ACCGTTATAGCGTTCCAGACGCGGCGAACCATATTCCCAGCGGGA
+NODE 3525 51 109 109 0 0
+GGATGGTTTACACCCACGACTCCATCGGTCTGGGCGAAGATGGCCCGACGC
+CCCTGACGTTGTTTCATCAACGCTGCCATACGCACTGCGTTACGGGCATAT
+NODE 3526 6 22 22 0 0
+TCAGAA
+TCCAAT
+NODE 3527 51 87 87 0 0
+CCCTTCCTCTTTTGCGTCATACGGTACCTGGGCGCGGACGGCGGATAAACT
+GTCTTCGCGCACGCCCTGATAGCGCTCGTTCATCACCCATGTGCCATCTTT
+NODE 3528 3 13 13 0 0
+GAT
+CGA
+NODE 3529 16 6032 60 0 0
+TGGTATTTCAAGGTCG
+AATCCGGGTTGCGGAC
+NODE 3530 5 1846 7 0 0
+ATCTG
+ACTTT
+NODE 3531 40 40 40 0 0
+TCACGAAGACTTTCCTTATCAGGAAATTCTTTTGACTCGT
+TGGGTTTCAGCGTGGAACATGCGGATGGTCGGGTAACGCC
+NODE 3532 13 1803 47 0 0
+CCGGGCTGGATAT
+TTCGGTGGCCGGG
+NODE 3533 51 105 105 0 0
+AGTTGCTTCTTTCGGGGTGGACGGCGCTATTCGCCTGGCGCTCCCGGCATG
+TCCCACAGCAGGAGCGAGCCTTCATGACCGCCCCATACCGCCGCCAGTTTC
+NODE 3534 51 63 63 0 0
+GATCCTGATGACTGAAGGTTGCCGCGGCGAAGGCGGGATTCTGGTCAATAA
+CCCGGAACCTGGCAGGCCGGTCGGGTGATACTGAACGAATTCCATATCACG
+NODE 3535 51 97 97 0 0
+GTTTGGTGTTGAAATGCCAATAACCGAGGAAATTTATCAAGTATTGTATTG
+CCGGTGCGCCAATTCACGAACTTCTTTCGTATTGCGATAGCCTTCGACCCC
+NODE 3536 51 155 155 0 0
+GGAGGTGCAGCAGGCTGTAAATCAGCATTGAGCCGTGGCCATTGGACAGCA
+CCCGGCTATGACCTGCCGATGTCCGAACTGCAGAATTTCCGTCAGCTACAT
+NODE 3537 1 139 2 0 0
+C
+T
+NODE 3538 51 61 61 0 0
+TCGCTGCATCTGGGGATCACCGAAGCGGGCGGCGCGCGTAGCGGGGCGGTC
+ACTGATCGATCTGTTGAGCCAACAAACGATAAGACTCAACGGCAAGGAATA
+NODE 3539 51 76 76 0 0
+GGATTAAAGGCTTTGCCCGCTTTGTCGATGCCAAAACCATTGAAGTGAACG
+CCATCCACGTTATTTTTGCCCAGCACGTTGTCGTATGAAGTATGGATGCGG
+NODE 3540 51 70 70 0 0
+GCGCCAGTGTTGGTTGCTGCTGACCGGTCGCCAGTGTTGGTTGCTGCTGAC
+CCTGGTCAGCAGCAACCAACACTGGCGACTGGTCAGCAGCAACCAACACTG
+NODE 3541 40 40 40 0 0
+GTCAGCTACACCTACCGTATCGCCTTTGAAGGCGGCGGCG
+ATAAGACTGTCGATGACTTTATTAATGACGTTATTGAGCC
+NODE 3542 51 63 63 0 0
+GACATGCGCTTTTGTGTACGGGGCTGTCACCCTGTATCGCGCGCCTTTCCA
+CCTGTGAGCTCGATGAGTAGGGCGGGACACGTGGTATCCTGTCTGAATATG
+NODE 3543 51 53 53 0 0
+TACCTTCGGGTTATGAGCCCGACGAGCTACCAGGCTGCTCCACCCCGCGTC
+AGTCGGTTCAAATCCGGCCCCCGCAACCAACTTAATGAACACCCTTACGGG
+NODE 3544 51 99 99 0 0
+GAAGAGCGTTATCCAGACAGCAAAACGGCTACCGCCATGGGTAGCCGTTTA
+CCCGCTAAAATACCTGACCCCGCCATCAGACAGGCCTGGTTAACAATATTG
+NODE 3545 28 51 51 0 0
+GGCCGCCAGCCTTACGCATAACCAGAAT
+CACTTTCACAGATCTGATTATTGCAATG
+NODE 3546 5 5 5 0 0
+ACCGG
+CATCC
+NODE 3547 51 70 70 0 0
+GATCGAAACTCTGCGCAACTACATCGACTGGACGCCGTTCTTTATGACCTG
+CCTGGCTTCCACCTCCTGCACGCCCAGACGGTGGGCTACCGGCGGGGTGTA
+NODE 3548 51 52 52 0 0
+TACACACTCAGGGTATAATCGCCCGCCCCCCATGATGTCGGCGGCGTAAAG
+AAGTCGAAGATAAAGCGGGGAACACCAGCCATTCTGCATCGCTGACGGTGA
+NODE 3549 158 274 274 0 0
+ACGCGGGCGGTGTGTACAAAGGGCAGGGACGTATTCAGCACAGGCTGATGACCTGTGCTTACAAGGAATTCCTCGTTCAAGATCTATAATTGCAAAGATCTATCCCCAGCACGACACGTCCTAACAAGATTTCCCGAACCCCATCGGGCCAGGTAAAT
+TGGGGATAGATCTTTGCAATTATAGATCTTGAACGAGGAATTCCTTGTAAGCACAGGTCATCAGCCTGTGCTGAATACGTCCCTGCCCTTTGTACACACCGCCCGCGTGATGCCCCTAGATGTCCTGGGCCGCACGCGCGCTGAACGTGTCAGTGTAG
+NODE 3550 18 31 31 0 0
+GCAAGCCAGCAACACGTC
+CCCCGCCTGTTCATTATA
+NODE 3551 51 65 65 0 0
+GGGATGCCCTGGCAGTCAGAGGCGATGAAGGGCGTGCTAATCTGCGATAAG
+CCCGTGTACGCTTAGTCGCTTAACCTCACAACCCGAAGATGTTTCTTTCGA
+NODE 3552 4 67 67 0 0
+AGGT
+AGGC
+NODE 3553 41 171 171 0 0
+TTCGTTTTGTCTCCGTCAGCACCTTATGAGAAATCACAAGT
+ATCCCTTGTCGGCATAGTTTATGGTTAAGACTACGATGGTA
+NODE 3554 13 106 106 0 0
+CTTTGGGTTCCGG
+CGAAACTCCGCCA
+NODE 3555 6 23 23 0 0
+ACAAAA
+GGGGAG
+NODE 3556 119 267 267 0 0
+ACAGCTTCGGCGGATAACTTAAGCCCCGCTACATTATCGGCGCGGAATCACTTGACCAGTGAGCTATTACGCACTCTTTCAAGGTTGGCTTGGAAGCAGCCATCCTTGAAAGAGTGCGT
+TAATAGCTCACTGGTCAAGTGATTCCGCGCCGATAATGTAGCGGGGCTTAAGTTATCCGCCGAAGCTGTGGCAACCTGTGTGGTTGGGTAGGGGAGCGTCGTGTCAGTGGTGAAGCCTG
+NODE 3557 45 45 45 0 0
+ATACCCTGCTGTTCCGCCCGCAGGAAAGCGCCGTCGTTGAATTTG
+TTTGTGCTGTGGAAAGATCACACCGCCGTGGAAGAGGCCGACGAA
+NODE 3558 51 57 57 0 0
+TGTGGTGGGGGAAGGATGACTCAGCGCTGCGCGCTTCGCCCTTCGGGTCGT
+AATCACTCCCGTCGCGTATCTTATCCCCGTTAAGCATAGTGTCTCATATCT
+NODE 3559 163 281 281 0 0
+AATAAAAATTAGCTGGGCATGGTGGCAGGTGCCTGTAATCCCAGTGACTTGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCAAGAGGTGGAGGTTGCAGTGAGCTGAGATCACGCCATTACACTCCAGCCTGGGCAAAAAGAGCGAAACTCCGCCTCAAAAA
+TGATCTCAGCTCACTGCAACCTCCACCTCTTGGGTTCAAGCGATTCTCCTGCCTCAGCCTCCCAAGTCACTGGGATTACAGGCACCTGCCACCATGCCCAGCTAATTTTTATTTTTAGTAGAGACGGGGTTTCGCCATGTTCACCAGGTGCCTGTAATCCCAG
+NODE 3560 51 79 79 0 0
+ATCAGCAAAATCCATCTGGTAAAGTTCCATCAGATAAGTCAGCACGATATT
+TCTTTCTGAAGCAGTATCCACACACTATCCCAGCCACAAGGGGGTTATTAT
+NODE 3561 5 1776 10 0 0
+CTAAT
+ACATT
+NODE 3562 4 4 4 0 0
+CGAT
+CCCC
+NODE 3563 51 69 69 0 0
+GGGCGATCCGCAGGGAGAGCCGGAACTGCGCCAGCAAATTGCTCATTATCT
+CTGCAGCATTAGCGTATGCGCCCGCTCGCGCTGGATCTGGCGGGCAAAATT
+NODE 3564 109 120 120 0 0
+GCCACGGCTGGCTTCCTGCAGCTGATAGACCTTCATCCAGTACAGACGGCCCCGGCTGTAGAAGCAGAGGATGGTGTCATGGGTGTTGGCCACCAGCAGGCGGTCGATA
+ACAGCCGGGGCCGTCTGTACTGGATGAAGGTCTATCAGCTGCAGGAAGCCAGCCGTGGCTCGCGCGGTCGTCCGATCGTCAACCTGCTGCCGCTGGAAGCCAAAGAACG
+NODE 3565 47 312 207 0 0
+TGGTGGTGCCCTTCCGTCAATTTCTTTAAGTTTCAGCCTTGCGACCA
+ACCCAAAGACTTGTGATTTCTCATAAGGTGCTGACGGAGCTATTAAA
+NODE 3566 51 166 166 0 0
+GATGGGATAGCCTGGCATGAGAAAACGCTGGGACAGCTTTTTTGCGATGAT
+CCCTGCCGACCAGATCGATAAAGTCCCACTGGGTATAGCGGGCTAATGCTG
+NODE 3567 47 52 52 0 0
+CGCTTCTCGCTCTCAACCCAGAAACGGTGAGAGTGCAGGTTAGGCAG
+GTCACCCTGCGTGTATCTGCTAAAGGTATGCGTATCATCGATAAAAA
+NODE 3568 51 57 57 0 0
+AGGTTAGCTCAACGCATCGCTGCGCTTACACACCCGGCCTATCAACGTCGT
+TGTACTAATGAACCGTGAGGCTTAACCTTACAACGCCGAAGATGTTTTGGC
+NODE 3569 32 32 32 0 0
+CCGGGCGTTAAGTTGCAGGGTATAGACCCGAA
+CCGGCTCCCCTATTCGGTTAACCTTGCTACAG
+NODE 3570 51 206 206 0 0
+GTATTTTCAATCAGCTTCAGCAGGTCTTCTCGGTCGTTTGGATAGACGATA
+CCTCCCGCCTTTGCGGCGTCATTTTCGACTGGGATAAATATAACCTTGAGC
+NODE 3571 1 2 2 0 0
+C
+A
+NODE 3572 1 5 5 0 0
+A
+A
+NODE 3573 1 26 26 0 0
+A
+T
+NODE 3574 46 52 52 0 0
+CGCCGGACAGCAGGAAGTACATCGCGCGCAGTCCTAAGATGGCAAA
+CTACGGTACCGACAGTTTCATTTTTCTCGTTAAGGACATCTGCGCC
+NODE 3575 6 88 88 0 0
+AAAAAA
+TTTTTT
+NODE 3576 1 48 14 0 0
+A
+T
+NODE 3577 1 17 17 0 0
+A
+T
+NODE 3578 4 4 4 0 0
+TAAA
+GTTT
+NODE 3579 1 15 15 0 0
+A
+T
+NODE 3580 1 16 16 0 0
+A
+T
+NODE 3581 34 80 80 0 0
+GAAATCTCGTTAGAGGTCAGTCCTTCCGGCTCAA
+CCCAGCCTGCCGTTTGACGTGCAGATGCAGATTG
+NODE 3582 27 45 45 0 0
+CCGCGCCGATACCCCTAACCAGGGAGT
+GCCATTTTTCGCGCCTTCCATGCCGCT
+NODE 3583 51 79 79 0 0
+TGTGGTTTTGCCCTTATGTTTGTGATGGGGGCCATTTTTGGTGAAATCGGC
+AGACTAAGTCAGTCGGTATAGCATTATAAAAATGAGAAAGTAATAAAGTAA
+NODE 3584 51 92 92 0 0
+TTAAAGATAATCATGTTAGCCTTGAAAATGGGATTATTGCTGTTAACCGCA
+AGACTTACATGGATAGCGATACCATCAGGTAAATACAAAGTACCGAGTTTA
+NODE 3585 43 43 43 0 0
+TCGTTCATACCCACTCCACCCACGCCACGGCATGGGCGCAGGC
+GTATGACGGCACAACCAGAATGTACGGTTCGTCTACCTGAATT
+NODE 3586 10 10 10 0 0
+GTTTTGGGTT
+CCCAGCCTGG
+NODE 3587 45 45 45 0 0
+CGCTACACCTTCCCTGCCCGCGCGGGCCAGTATTCCAACTTTATT
+TGAGCCGGGCATTGTATAAAATGCATGTCTTTGCTCACACCTTTT
+NODE 3588 9 16 16 0 0
+CGGCGATGA
+GGGCGGGAT
+NODE 3589 3 3 3 0 0
+CGA
+ATC
+NODE 3590 39 63 63 0 0
+GATGAGACACCAGTTGCTGTGTGAAAGCGTGTTGCGGGT
+ACCCTGCCGGAACGTTTACGGGAACACCTGCCCGGGCAG
+NODE 3591 51 62 62 0 0
+AATATTGGTCAGAAGGCTGGAGCAGCCTTACAAACCCTGCCTGCCGGTGAA
+TCAGGTTCAGCAGAGCTGAAGCATCGCCAGTTTTTCCGTCCGGGAACAGGG
+NODE 3592 51 58 58 0 0
+TATGCGCCGCGCGCCGCCTATGAAGTCAGTAACCTGGAACTGGCGATCATT
+AGATAACCTGAATAAAACAGACCGCATCGATAGTGACGTTGGCGTTATCTT
+NODE 3593 51 79 79 0 0
+GTTTGTACAGAGTCGCCATGGGAATTACTTATTACTGACGAATAAAGAGCG
+CCCAGCCACTGGCGCAGGCAGATACTTGCTTTCATCATGAGAAGGCGCAAT
+NODE 3594 40 40 40 0 0
+TGCTGGTATTTATGGCGATGTTTATTGATGTCCATCTGCT
+ATGGCGTTCGACCAGCTCACGCCCGTCGCCCGGCTTTGGG
+NODE 3595 51 89 89 0 0
+GATATTACGCTTTCCTCTTTCAGAGTCAACCCTGAATTTCAGGATTTTTCT
+CCGCCACCTCGCGACGGTGAGCTGAAAGCCGCGTCGCACCTGCTCTTTAAC
+NODE 3596 6 1534 13 0 0
+TACGCT
+CGCTGC
+NODE 3597 27 27 27 0 0
+CAAATATGTCGCTCCCTACGTCAACCG
+TCCCTGCGACGCGCTGTAGACGGCGGT
+NODE 3598 51 73 73 0 0
+GCCGGCAGCAGCAGCGCCACCAGCAGTAACAGCACCACCGGAAAGAGGATT
+CCGCCGCGCCGCTGCTGGGGATGTTCTGCTTTGGCAATCTGATGCGTGAAA
+NODE 3599 1 3 3 0 0
+G
+C
+NODE 3600 9 30 30 0 0
+CGGGGTCGC
+TTGGGTGCG
+NODE 3601 43 43 43 0 0
+GCCTCATTAACCTATGGATTCAGTTAATGATAGTGTGACGAAT
+TCAAAAATCTCGATACATGAAGGAATGACGGAGATAAAACGGT
+NODE 3602 40 40 40 0 0
+ATTATCTATGCTCCTGGGGACTCACTCCCTTGCCGCCTTT
+GGGTGAGCGAGCGTAGCCAACACATAAGCAACTTGAAGTA
+NODE 3603 51 134 134 0 0
+GAACAATTTTTTATACGGCAGACAAACCAGCTGGCAACCATACCCAGGAGG
+CCCCCTTCTACTTTGTTGCGCTCCTGTTAATCATTAGCGTGGTCTGTTCCT
+NODE 3604 51 94 94 0 0
+GGCTTAAACCGGCACGCCTGACGCCGCTTTCCGTTCTGCTGTTAATGGAAG
+CCCACGCAGTTACCCGCCGCCAGCGCTGGCGCCATTTTCCAGCTTGCCATC
+NODE 3605 51 56 56 0 0
+TCACCAATGTGGTGCTTAATGTTCACATTAAAGCACTATTTTGGTGCAACA
+AAATAGAACGCAAGCCACCCTTTTAACGCTCCGTGAAAGCGATCACAAAGA
+NODE 3606 5 624 13 0 0
+TGCTG
+TCTGC
+NODE 3607 51 79 79 0 0
+GTTTACACGCCAGTTTAGGGACGTTGTTGACCATCATGCCGCAAGAGCCGC
+CCCTTCCTGCGCGATTACACCAACGGTATGAAGGTGGAAGCTCTGGCGAAC
+NODE 3608 27 73 73 0 0
+AATTAAGACTCGGTTTCCCTCCGGCTC
+CCCCGAAACCCGGTGATCTAGCCATGG
+NODE 3609 51 62 62 0 0
+AGGGCAAGACTATTGAGCGTGTCAATGTGCATACCGGCGACGTGGAGGGGA
+TTAAATGACGCGCCTGAAGGCCGCACATCAAAGACCAGCCACTGGCTGTCA
+NODE 3610 39 39 39 0 0
+CAGCATATTTAGCGCCATCATCGCGCAGACCTCCTGACG
+ATCTGTGAACAGCGCGATCCTAAAGGATTGTATAAAAAA
+NODE 3611 31 804 793 0 0
+ACCGACGTCGTCCTGCGTGACGCCCACCAGT
+CCCTCCGGGAAATTAAACGTGGTGGCGGTGA
+NODE 3612 6 18 18 0 0
+GACCGG
+AAGGGT
+NODE 3613 1 90 2 0 0
+T
+C
+NODE 3614 51 80 80 0 0
+GGCGCAGGCATGGCAGGCCGCTATCGACGCGGCGCAGCCAGAAGATACCGT
+CACGCTATCATAGACATTCCCTTTCCCCAGATGTTCCAGAAGTTGTTCCGC
+NODE 3615 3 3 3 0 0
+ATG
+CCT
+NODE 3616 38 38 38 0 0
+TCTTCTTTTGTAAACCAGCGGACGCTGTCGTCCCGGTA
+ATCGACAACGTATAGTCGGTCATCTTACCGCTCAGTTT
+NODE 3617 41 52 52 0 0
+CGATATCAGGTAAGAGGATAATAGCATTTTTTGTTCTTTTA
+GATTACACAAAAAATTAAGGAAAACTGAGGAACGCCATGAA
+NODE 3618 51 99 99 0 0
+AGCGGATTTGCAAACGCAGATCGACAGGCTTGCCCCGTTGCTGGAGACGCT
+TAACTCGGTCTGACGCTGTTGCCATATTTTCGCTTCGTCGGCGCGCTCATT
+NODE 3619 51 71 71 0 0
+GGATTTATGGACCAGGCCCTTACCCGGCATGAAATCCAGCTTCATAGTCGA
+CCTCCAGCCCCGCCTTTACAGCAACGATCAGACCAAGTCGGTTGATGTAAA
+NODE 3620 48 56 56 0 0
+GCAGCAGCAACCAACACTGGCGACTGGTCAGCAGCAACCAACACTGGC
+GGTTGCCAGTGTTGGTTGCTGCTGACCGGTTGCCAGTGTTGGTTGCTG
+NODE 3621 51 79 79 0 0
+GAACGCACCGCTATATCTTTACGGTTCACGCGCTGGACGTCGAGCGTCTTG
+CCCCCTTTAGGCGGCGCCGCGCCGCCGTAGCCCGCTTTACCGAAATCGGTA
+NODE 3622 51 128 128 0 0
+GATATCTTTAAGCAAAAAAAAGAGCGACCTGAGTCGCTCTTACCAATGACT
+CCCCGTCATACTTCAAGTTGCAGGTGTGTTGGCTATGCTTTCTCACCCGAA
+NODE 3623 51 75 75 0 0
+AGGAAAGACCCCGTGAACCTTTACTATAGCTTGACACTGAACATTGAGCCT
+TTCTTGCCGCGGGTACACTGCATCTTCACAGCGAGTTCAATTTCACTGAGT
+NODE 3624 58 82 82 0 0
+CGCCCGGTAACCCTAAGCACGGGATCGCGATCGAAACCATCGTTTAGCATGGAGCGGG
+ACCGGGCGGGCGCCTGCCGATCTGGCGTCTGAAAGCCATTAACCTTGCAGAATGGTCC
+NODE 3625 34 119 119 0 0
+GACTGATGGCGAAGCTGATGAACCTGTGCAGTAA
+AATCCCGAACGCAATCACACCCAGCAGCAGAATG
+NODE 3626 45 54 54 0 0
+CGAACAAAAACGCAAAGCGGCGTTGGCGGCAGAGCGTAAGCGTGA
+ATCCCGTGTTTCATAGTCGCCTTTCAGCTCAGCGCTCAGTTTCGC
+NODE 3627 51 147 147 0 0
+GATCGTAATTTGTAATCGTCAGGGGCAGGGGATGTGGGCCCGGCGATTTGG
+CCCTACATTTGGGCGGTAGCCATCGTCATCAATCACCGGACTACCTCAACA
+NODE 3628 12 12 12 0 0
+GATCAAAAACCG
+CGAAGAAATCAT
+NODE 3629 43 43 43 0 0
+TGTCCGCAGTCGGGACATCAGTCTTGGCGACGATCCGGGGATT
+GCGCATACGGAACAAATCCCCCAGTGGCTTAACGCCAGCGGCA
+NODE 3630 41 99 99 0 0
+GTCATACCAGTATTGATTTTAATGCAGTTTGTTTTTTATTG
+CCCTGCCAGTGCTTCAGATGGTATTGTTATAGACCGTATAA
+NODE 3631 3 3 3 0 0
+GTA
+CCT
+NODE 3632 111 170 170 0 0
+GTTTAAAACGTCTGCCGGAAGGCAGCACTTTACCATGGCATCGGGGGGTGAACCGCCACGGCGCAATATACCTTCCCGGGCCCCCTCTACAGCGGCAACGGCAGGCATTAC
+CCGTGGCGGTTCACCCCCCGATGCCATGGTAAAGTGCTGCCTTCCGGCAGACGTTTTAAACCTCCGCCGACCTGACGCGCCGCCCGAGGCGAACCGGCAAGCCGGGCGATA
+NODE 3633 1 1 1 0 0
+G
+C
+NODE 3634 39 46 46 0 0
+TGAGAAGGGAAGTAAAACCTAACCATAAGAGAACTTCCT
+TCGTTTTTGGAAATTATGTTGTACGTCGTGTGGCAACTG
+NODE 3635 40 1267 45 0 0
+GAAGTTGCCGTAGCGCGCCACCATGTAATCGATGATTTCC
+ACCCGCCGCTGACCCCGCTGACGGTGCTGCTGTGGGTGCT
+NODE 3636 51 71 71 0 0
+GGATGTACAGCTTGAAGATCTGCTGAAAGATTACGATGCGGTATTCCTTGG
+CCGACCCACTTCGGTATTAAGTTTGAACTCAATACCCATGCCGGTGAAGAT
+NODE 3637 51 53 53 0 0
+GTTGTTCATTGATGCCCAACACCACCGCCCCTTTATTAGGGCGCACTTTTA
+CCGATCCGTGAACACTATGAAATTCGCGCGCTGTTAGAAAGTGAGGCGGTG
+NODE 3638 47 77 77 0 0
+TATTCCCGCCTTGAGCCGTGTTAATTTGTTGCATACTTTTAAACGGA
+TGTCTTAGAGCCTATCCCACCAGGCGTTATTGGCGCAGCCAGTTTGG
+NODE 3639 51 53 53 0 0
+TGGGGAATCTCGGTTGATTTCTTTTCCTCGGGGGACTTAGATGTTTCAGTT
+AAGTAGCGGCGAGCGAACGGGGAGGAGCCCAGAGCCTGAATCAGCATGTGT
+NODE 3640 51 77 77 0 0
+CACAGAATCGTCAGCGTTCCGCTCTGGTCGCGCCGACACTGGCGGCGGGGG
+GGGGAAGCTGCAAGCCAGTGCTGCGGCGCGCCATGAGGACTTCCTGCAACA
+NODE 3641 35 126 126 0 0
+TGCTCTACCAACTGAGCTATTCCCGCTTGGGTGCG
+CGGGGTCGCGAGTTCGAGTCTCGTTTCCCGCTCCA
+NODE 3642 46 46 46 0 0
+TGCGGTAAAAAATTTGGCGATCAGGAAAATGATCCCGCCGTAAGTC
+ACGGTATCTCCCAGCGTCTGATTCCGGGCGCAGTACTGGCGATTGA
+NODE 3643 38 38 38 0 0
+ACCATCAACATGGCGCCTCCCCATTCGCCTCCAACCAT
+GCGCGCTTAAGCAAGCTAATTAACTGCGGAAACGGTAG
+NODE 3644 61 90 90 0 0
+GACATTTTTTTTGAAAAACCGCTCAGCATGAATGAAGATGAGCAGGCCTCAATGGCGGGGC
+AAAAAAATGTCCTCCCCCGCCTGCGCTGCCGCCGTGACGATCTCTTCGTGCATATCCGTTG
+NODE 3645 51 93 93 0 0
+GGACATCGCCGCCATCGTCCGGCGGAGTGACATCGCCGCCATCGTCCGGCG
+CCTCCGCCGGACGACGGTGGCGATGTCTCTCCGCCGGACGATGGCGGCGAT
+NODE 3646 27 46 46 0 0
+ACGCCGCCAGTTGTACGCGCTACTGTA
+GGTGCCGAGTGCGGCAAGGATCTCCTG
+NODE 3647 51 60 60 0 0
+GATCGCCAAGCGGTAAGGCACCGGTTTTTGATACCGGCATTCCCTGGTTCG
+CCCCCATCCGTACAACGCTTATCGGTGAATGGTGCGGGAGGCGAGACTTGA
+NODE 3648 37 60 60 0 0
+GGGCGCCGCCCCAGCATTCGAGGGAGCCGTAGCCCAC
+CATCCGTTTCCTCGGCGAGGACCCGTGGCTGCGCCTG
+NODE 3649 51 58 58 0 0
+AGCCATATCCGACAATAAAATGGGGATAAGCAAAACGCTTATCCCCTGCAG
+TTACTTTCTCCATAACCTTCGCCACGCGCGCCTGGTCAACAAAGTTGGCGA
+NODE 3650 47 50 50 0 0
+CCGGGCCGCCAAGACCTGCGCCGCGCAGCAATCCGTGGCCCAGGATG
+TCGAAGTGAACTGCGCCACCCTGCGCGGCGACACGGCGATGTCGGCG
+NODE 3651 27 81 81 0 0
+GACTGAGCACGACACCGGGCTGGATAT
+CTCGGTGGCCGGGTGGCCGTAGGTGGC
+NODE 3652 33 72 72 0 0
+CCTGGCGACTGGTCAGCAGCAACCAACACTGGC
+AGTCGCCAGTGTTGGTTGCTGCTGACCGGTTGC
+NODE 3653 1 5 5 0 0
+C
+G
+NODE 3654 42 62 62 0 0
+GCAACACCTTCCTCCCCGCTGAAAGTACTTTACAACCCGAAG
+CCCGCAGCAATTGACGTTACCCGCAGAAGAAGCACCGGCTAA
+NODE 3655 51 76 76 0 0
+AAAGTTATTCACTTTCCGAATCAGGCGTGATGACTTTGACGGAACCATTCC
+TCTCAAAAAAGACGGCAATTTTATTGAACATGGTGGGATCGGACTGGTTTC
+NODE 3656 155 238 238 0 0
+TTGTAGCACGTGTGTAGCCCAGGGTGTAAGGGGCATGCTGACTTGACGTCATCCCCGCCTTCCTCCGGTTTATAACCGGCAGTCTTTCTAGAGTTCCATAAAGCAACTAAAAATGAGGGTTGCGCTCATTGCGGGACTTAACCCAACATCTCACG
+TGCTTTATGGAACTCTAGAAAGACTGCCGGTTATAAACCGGAGGAAGGCGGGGATGACGTCAAGTCAGCATGCCCCTTACACCCTGGGCTACACACGTGCTACAATGGACGAGCTGACGACAGCCATGCACCACCTGTGTATACGTTCCAAAAGG
+NODE 3657 104 192 192 0 0
+GGGCGGAAGATTACGCTAATCGCCTGCGTAAAAATCTAAAAAAGCTGGAGAAAGGGGCGCGCCAGGAAGGGATTGAATGCTATCGCTTGTATGATGCCGACCTG
+CTTTCTCCAGCTTTTTTAGATTTTTACGCAGGCGATTAGCGTAATCTTCCGCCCCCGTCGCCGGCTTACTGTCCGCCGTGGTTTCCGCAATATGATAGTTTTTC
+NODE 3658 30 90 90 0 0
+CCCTCGATTCCTTTTATTATCTTCGGCGTT
+CCCCGCCGGAAGCGATTAACCCAACGGAGC
+NODE 3659 45 202 202 0 0
+ATTTCCCGTTACCCGTTAAAGCCATGGTAGGCCAATACCCTACCA
+CAGAAACTTGAATGATCCATCGCCGCACAAGGCATGCGATCCGCA
+NODE 3660 16 33 33 0 0
+TCTTTGTCACAACCCG
+CCCTGCCTGTCACGCA
+NODE 3661 40 40 40 0 0
+TGACCGATATAGCCACTCACGGCAAGTATACTTATTGCAA
+ATTTGCGGCGGCTACCAGATGCTGGGCGACACCATTGTGG
+NODE 3662 51 65 65 0 0
+GAACGGGGCTAAACCATGCACCGAAGCTGCGGCAGCGAACGTATCACTTAA
+CCATCTTCCGCGCAGGCCGACTCGACCAGTGAGCTATTACGCTTTCTTTAA
+NODE 3663 44 53 53 0 0
+TCAGTGAATACCATTCCCTGCGACTGTAAAAAAGCTCGATAATC
+CCGCGAGCCGGAAGATCAGTTTGGCCTGATGCTATTAGCCTGTA
+NODE 3664 51 82 82 0 0
+AACCGAAGCTGCGGCAGCGACGCTGATGCGTTGTTGGGTAGGGGAGCGTTC
+TCATGGTTTAGCCCCGTTACATCTTCCGCGCAGGCCGACTCGACCAGTGAG
+NODE 3665 40 41 41 0 0
+CATTGCCGGTGTTGCTACCGTGATAATGCATCGAATCAGT
+ATTAAAGAAAGCCAGATGGCGTTTTAGCGCTTCGGCAAGA
+NODE 3666 13 14 14 0 0
+CCCACCTAACAGG
+CCAATATCGCGGG
+NODE 3667 40 2128 55 0 0
+TTTTAAGCAGCTCGTGGTAAAGTAACGGATTAGACTTTCA
+ACCCCGCGACAATATATCGCCTGCTAAGCTTTTCCGCGCC
+NODE 3668 8 8 8 0 0
+GTTATACC
+ACGTTTTA
+NODE 3669 12 12 12 0 0
+TGTTGACTTTCA
+CCCTTCCTTGCC
+NODE 3670 11 14 14 0 0
+GGCTGGGGGGA
+ACGTCAGCATC
+NODE 3671 51 102 102 0 0
+ATATCGCGCTGATTTTAAAGTAATGGTAAGAATTTACACACAAAGTTATCC
+TCCTTCTCGTCTTAATAATTACCCATTATTTTCAATGAGTTGTTAACATCA
+NODE 3672 77 91 91 0 0
+GGCTTGGTCTGTACTTCCGGAGCCGGGGCCGGTGCCGGAGCGACTACCGGAGCAGCTTCTTGCTGGCCGAAACGGTA
+CCCGGCTCCGGAAGTACAGACCAAGCCCTTCACTCTGAAGTCTGACGTACTGTTCAACTTCAACAAATCTACCCTGA
+NODE 3673 39 39 39 0 0
+ACACTAAATCGTTATACAGTTGGCCTAACAACTCCTCGG
+AAAGCAGATGTAGCCATACCGGCCAGACTACCGAGTGAA
+NODE 3674 19 19 19 0 0
+GATGGGATAGATTTAAGGA
+CCTCATCAAACGGACTAGC
+NODE 3675 39 39 39 0 0
+GGTAGAGTGTGAAGTATGTGAATCAGGGGGGCTAATCCA
+CCCGCCACTAACACGATAACGTTGCGTGAAAACCATGTT
+NODE 3676 46 46 46 0 0
+GCACCAGGCGCGGGGAAACGGTTTTGGCTATGGCATGGTTTATCCT
+CGCGTAGCGATATAAATATTTCCACAGCACCGGCGTCAGGATATAT
+NODE 3677 41 45 45 0 0
+ACAAATAAAGTTATTCCACAAAGAAGCATCTTCCGATTTGA
+CCGTATTTAACCTATTATCTTTTACCGAAAGCATGTTTCCT
+NODE 3678 24 858 66 0 0
+ATTAATCACCTCACGCCCCGTAGC
+AATGGGCGCCGCGCTTTTAGGGTT
+NODE 3679 51 54 54 0 0
+GGACAGAACAGGATGTTTTTTATAAAGTGATTATAAATCAATAGATTATTC
+CCCGCCGGGCGACACGCTAAAACCTCGCCAGCGGCGGGGGGATGACAATCG
+NODE 3680 51 53 53 0 0
+GCTTCGCCATCCTTAACTACCGGCGCTTCCGCCAGCATGGCGCGGATGCGG
+CGCCGGTCCCGGCGGGGCGCGGCGAACTGACGGCGGCCATTCGTGAGTTTT
+NODE 3681 51 75 75 0 0
+GTCAAGCTGACAATGGTTGAAACGATAATCAGGGGGATACCGGCCTTAGCG
+CCCTGCTGCCAATCCTTTTCCCTTTTCATCCGTAATTAACGGAAGCTGTTC
+NODE 3682 25 40 40 0 0
+AATGTAGTGGGGCAAAGAAAAAATT
+CCCAGCCATACAGAGAAAAACAGTA
+NODE 3683 7 12 12 0 0
+GAATCAT
+ACCCGCC
+NODE 3684 42 50 50 0 0
+GGCGGCATTGACAGCATGTTGATGATTTATGACACCGGTGAA
+CATAAATCTGTCATAAATCTGACGCATAATGGCGCGGCATTG
+NODE 3685 127 243 243 0 0
+CTTTAACTGGGGGATAGCCCGGAGAAATCCGGATTAATACCCCATAATACACGATGTGGCATCACATTATGTTAAAAGCTCCGGCGGTTAGAGATGAGTATGCGTCTGATTAGCTAGTAGGTGAGGT
+TTTTAACATAATGTGATGCCACATCGTGTATTATGGGGTATTAATCCGGATTTCTCCGGGCTATCCCCCAGTTAAAGGCTCCGGCGGTTAGAGATGAGTATGCGTCTGATTAGCTAGTAGGTGAGGT
+NODE 3686 122 516 432 0 0
+ATAGTTCATTCAAATTTCTGCCCTATCAGCTTTCGACGGTAGTGTAGTGGACTACCGTGGCGTTAACGGGTGACGGAGAATTAGGGTTCGATTCCGGAGAGGGAGCCTGAGAAACGGCTACC
+CACCCGTTAACGCCACGGTAGTCCACTACACTACCGTCGAAAGCTGATAGGGCAGAAATTTGAATGAACTATCGCCGGCACAAGGCCATGCGATTCGAACAGTTACTATGACTCACCAATGA
+NODE 3687 51 54 54 0 0
+GTAAATCCAGCGCTTTACCACACCAGGAGGCCTGAAAGCGGCTTTCATCAA
+CCCCCCGCTGAATTCCGCCTGCTAAAAACCTTATCGCTTGAACCGGGTAAA
+NODE 3688 142 391 391 0 0
+AAGCCACAACCGATATACGTCCACAAACCTCAGAGCAAGGTCCGCCGCAAGCCCTTGCGAGCTCACAGTAGTCCCCACCTAGAGATAAGCTTCAATACACCGGCTCAACCCACCCAACCCTTAGAGCCAATCCTTTTCCCGA
+AAGCTTATCTCTAGGTGGGGACTACTGTGAGCTCGCAAGGGCTTGCGGCGGACCTTGCTCTGAGGTTTGTGGACGTATATCGGTTGTGGCTTCTTCGGAGGTCCTCTCCCACAATGAACAACCGACTTAGAACTGGAGCGGA
+NODE 3689 51 69 69 0 0
+GAAAACAATGTGGAAGCGCTGATGAAAAGCAACACGCCGCTCAACGTGCTG
+CCAACAGCGGCCCGACCACGATACTGGCGCCGTCTTGCTGAACCTGAGCAA
+NODE 3690 51 72 72 0 0
+GGCTTGCCGGAGGCGCAGTATTTGAACAGGTTCGGGCTGGCGCGGTCGATA
+CCATTCCGCAGGCCATTCTGGTTATGCGTAAGGCTGGCGGCAATCCGCTGG
+NODE 3691 102 111 111 0 0
+GTATGGGTGAGACGCTTGAGCGCCATCCATACTTCGCCCTCAGGGTAGAAACGATAGATCGGAAGAGCGTCGTGTAGGGAAAGAGTGTAGATCTCGGTGGTC
+GTTTCTACCCTGAGGGCGAAGTATGGATGGCGCTCAAGCGTCTCACCCATACAGATCGGAAGAGCACACGTCTGAACTCCAGTCACATCACGATCTCGCATG
+NODE 3692 36 36 36 0 0
+GCTCTGGCCCTCGGTGGCAATCACCTTCCAGATGTT
+CGTGCTGCTGATTCTGGAAGCCATGAAGATGGAAAC
+NODE 3693 40 68 68 0 0
+TGGTGCCGTGGGTGATATTTTTAATAGCGTCGATAACCTG
+GTCGGCAAACTGCTCCCGGCCCCAGAAACCATCGGTCTGG
+NODE 3694 51 133 133 0 0
+GCGCACTGCGTGCTGCTCTATAAATCACCGTTGTCGAAAACGGCGCAGAAG
+CCGCGACCGCGCCACGGCCAACGCGTCCTCTGAGCTGGTGCAGCTGCGCCA
+NODE 3695 116 214 214 0 0
+AGGTACCCCTCCGCGGCCAGCTTCTTAGAGGGACTACGGCCTTTTAGGCCGCGGAAGTTTGAGGCAATAACAGGTCTGTGATGCCCAGAACATCTAAGGGCATCACAGACCTGTTA
+TGCCTCAAACTTCCGCGGCCTAAAAGGCCGTAGTCCCTCTAAGAAGCTGGCCGCGGAGGGGTACCTCCGCATAGCTAGTTAGCAGGCTGAGGTCTCGTTCGTTAACGGAATTAACC
+NODE 3696 39 128 128 0 0
+TCTTATCCACCTGCGCCACGTAGGTCTGGTACTCTTCCG
+CCCTACCGTTACCTGAACTTCGACCAGCTCTCTCAGTAC
+NODE 3697 44 44 44 0 0
+ATCAATGCCAGTGCTTCATCATCTTCCAGCCGTAGATCTGAATC
+CTTCTTTTAAGTGAGGCGTTATGCAGGATAACTCAGCCATTAAC
+NODE 3698 21 29 29 0 0
+ACCAGACCGCCAGCTAAGGTC
+CCCCGCCGTGTGTCTCCCGTG
+NODE 3699 23 1296 78 0 0
+GTTACCGTGGCTGACCTCAACGG
+ACCCGTTTTAAAGAAGGCAAGCC
+NODE 3700 43 43 43 0 0
+CCAAAACATCGCGCGTCCGTTCTTGTAAGGTAACGATATGATT
+ACAAATTCCCGTAACTTCTCTCTATTTCTTCGTCCAGAAACAA
+NODE 3701 51 106 106 0 0
+GTTGCATGTGGACGGTACGCTGCATCTGCTGCTGGGCGGCGACGGTAAGTC
+CCCGTTTAGCGCCGCTTCGGTACTGCCGACATTGGTCGCTTTCGAGTCGTT
+NODE 3702 51 87 87 0 0
+GGCGTCACGCCTTCATAGAGAAGTCTGAGCGCAAACATCCCGATAATGGCG
+CCCGCTAGTTTGCCCGGTAGCCTTTGCTACCGGACGATAAGCGTTATCAAA
+NODE 3703 45 83 83 0 0
+GCAACCGCAACAACCTCAGCAGCCGCAGGGCGGCAACCAGTTCAG
+CCCCCCCTGCTGCTGACCGCCTGCCGGTGCGCCGCCGCCCTGGCG
+NODE 3704 20 36 36 0 0
+TCAAGAACGAAAGTTAGGGG
+ATTAATCAAGAACGAAAGTT
+NODE 3705 173 310 310 0 0
+TCCTAAGAGATAGGGAAACTCCGTTTTAAAAGTGCTATTGATACGCACTCTCTATCGAAAGGGAATCGGGTTAATATTCCCGAACTTGGTCGTGGATGTTATGCGGCAACGCAAGCGAAGTCGAAGACGTCGGCAGGGGGTCCAGGAAGAGTTATCTTTTCTTTTTAACTAGC
+CGACTTCGCTTGCGTTGCCGCATAACATCCACGACCAAGTTCGGGAATATTAACCCGATTCCCTTTCGATAGAGAGTGCGTATCAATAGCACTTTTAAAACGGAGTTTCCCTATCTCTTAGGATCGACCCCATGTCCAATTGCTGTTCACATGGAACCTTTCTCCACTTCAGT
+NODE 3706 3 3 3 0 0
+TTA
+CCC
+NODE 3707 14 37 37 0 0
+TATAATACCAGAAT
+CCCCTCGGTTTATT
+NODE 3708 21 149 149 0 0
+ACGGTTATAACGGTTCATATC
+TTCGTCACACTATCATTAACT
+NODE 3709 23 128 128 0 0
+CGCCAGTGTTGGTTGCTGCTGAC
+ACTGGTCAGCAGCAACCAACACT
+NODE 3710 18 54 54 0 0
+GGATATGCCCCTGCTTTA
+CCCCGCCCCGGCAACTGC
+NODE 3711 43 47 47 0 0
+GCTGCAAACCTTGCTCGGCACCAATAATGTAGCGGTATCGATT
+TGTTGCCATAATTATGGATGGCAATGGTCGCTGGGCGAAAAAG
+NODE 3712 11 80 80 0 0
+AAAAAAAAAAA
+TTTTTTTTTTT
+NODE 3713 45 45 45 0 0
+TTCCTGGGCGATGAGTTTGGCTTTTCCGGCAAACTCCGTCTGTAG
+GAATCGTACGCACCGCATTCATCACATAACCCAGTTCATCTTCCG
+NODE 3714 18 68 68 0 0
+GGTTGGTTGCTGCTGACC
+AACCGGTCAGCAGCAACC
+NODE 3715 51 59 59 0 0
+ACATCAAGAATGCGGAGTCGCGCAATTTTGGCTTTTATGCATTTAATTTGC
+TGTGAGGATTGTAATCATTGAATTTGTGAATTAAGGTCGCCGCCGCGGAGC
+NODE 3716 51 78 78 0 0
+CACATGAACGAGCGGAAAAAGAGGCGGCTTTGCAGGCGGCGGGCGCCCAAC
+GGGCTCCGCCACTCAAGATGCGGCCCGCATGACGGACAGGCAACGGGCTGG
+NODE 3717 51 75 75 0 0
+GTCTTTCTCACCCCAATACGCGCGCCGCCGTTCTTAAAGCGCTGGAGTATG
+CGGGTACCGGTGACGGCTAATGCGCGTGAAGAAGCGATGTAATCTTCGCGG
+NODE 3718 51 64 64 0 0
+CTCCCCCTAATAATTAAAAAGGGGTGTGAGTATGAGTAAATTTAAATTTAA
+GTGTAGGCCCATAAAATTACATAGAGAAGCGACGCGCTGATAATTAAGAAT
+NODE 3719 42 47 47 0 0
+AGAGCATCAGAACGACCGCCAGAGGCGTTAACCCTCTGTTTT
+AGCGCCAGTGAAGCCAGTGTGGTTTTTATCATCGCTATCTTC
+NODE 3720 7 23 23 0 0
+GGGAGAC
+CCCCGCG
+NODE 3721 32 49 49 0 0
+TTTTGATTTTGTCGAGATGTCGGTGGACGAAA
+CCCAGCCGCTCTGGCCAACTGAGATCTTTCGC
+NODE 3722 9 20 20 0 0
+GAATGTTGG
+GGTTCCCGA
+NODE 3723 42 42 42 0 0
+CTTGATGGCTTCATTACCATTACCGGCGGGAAGCTAATGACT
+CACACGCGGGAAGATTTACCGCCGCTGGTAGCGCTTACGGCT
+NODE 3724 151 315 315 0 0
+GCTTGGGCTTCTGCAGGTGAGAGAATACTCTTAACCTTCTGCCATGATTTTTCAAAGATATTTGGCATATCTTGTTATATTTGTTCAGGAGTCCATGGAGGCGTAATTCCTTTAGCCTTGGCATCTGCTACCTGTGCTTCAAAGTACGATA
+CCTCCATGGACTCCTGAACAAATATAACAAGATATGCCAAATATCTTTGAAAAATCATGGCAGAAGGTTAAGAGTATTCTCTCACCTGCAGAAGCCCAAGCCGTAATTCCTTTAGCCTTGGCATCTGCTACCTGTGCTTCAAAGTACGATA
+NODE 3725 51 88 88 0 0
+GGAAGATATAGCCCTGCTGCGTATGCTCATCGAAGATGACGGCCCGCCTGC
+CCACCCGTTTCCCCCGGCGCACGCCGCCTGCGTCTGTCCGCTATCAAAGAC
+NODE 3726 127 264 264 0 0
+CTGCAAGGCAAATCCCTATAACCAAAGTCCTCATCCAAAAATTATGAGGACTTTGGTTGTAGGGATTTGCCTTGCAACGCTGTCGGGCAAAGCTACATCGTTAACATCTCTTTACCTATTAAAGTTC
+TTGCAAGGCAAATCCCTACAACCAAAGTCCTCATAATTTTTGGATGAGGACTTTGGTTATAGGGATTTGCCTTGCAGCGCTGTCGGGCAAAGCTACATCGTTAACATCTCTTTACCTATTAAAGTTC
+NODE 3727 51 102 102 0 0
+GAATGTGGTTGGCTTTCCTTGCAGAAAAGAGGAACAAATGGCCGGAGACGC
+CCCGTTTGAAAAAACGGACTGCGGCATGTACTCCCTGCCGTATGCGACGTC
+NODE 3728 51 117 117 0 0
+GGGTGATATAGATCCCTCATTTACGTTATTCACAACCAGTCAATGTCTTAA
+CCCTTCTGGCTGCTCATCCACCACGTTGATAGCGCTTCGCTGCCTGGCAAT
+NODE 3729 47 115 115 0 0
+GATTCTGCTGAATAATCAAATGGATGATTTTTCTGCTAAACCCGGTG
+GTATTTCCCGCCACAATTCCTGTGCCGAAGGTGGTGTTCAGGGTATA
+NODE 3730 1 2 2 0 0
+A
+T
+NODE 3731 20 69 69 0 0
+GGAAAGGGATCGACAACAAC
+ACTCATACGGGCGGATCGGC
+NODE 3732 130 354 354 0 0
+GACAAGCATCAAAGTCCCGCCGGATGACGGAACGGTCGCGCGGCGGGACTTTGATGCGCGTCGAGGCGCGTGCGTCTACAACCGCTGCCTCTTGCGTTGCTCCCTCTCCCTCCGGGAGAGGGCTGGGGTG
+TGTAGACGCACGCGCCTCGACGCGCATCAAAGTCCCGCCGCGCGACCGTTCCGTCATCCGGCGGGACTTTGATGCTTGTCGAAGGCTGCTGGCCCTCACCCCAGCCCTCTCCCGGAGGGAGAGGGAGCAA
+NODE 3733 106 136 136 0 0
+CATTGCTAAATTGGAGCACAACCTTCGACACAGACGAAAATCGCTATTTTCGTCCTGCATGACGATGGTAACACTAAAAAAAGGGAGATTGCATCACTCTGTAGCA
+AGGACGAAAATAGCGATTTTCGTCTGTGTCGAAGGTTGTGCTCCAATTTAGCAATGGTTGGCTAGATGGATACACAACTTACTGTCAATAAATTCATTTTCTCTTT
+NODE 3734 45 45 45 0 0
+ATCCAGCCACTACACATTGCAGCTCAGTAGTTCTTCAAATTACGA
+TGGAATACAAATCTTTCTTACGTTTCAAAATCGGCAAGATCCTCG
+NODE 3735 14 25 25 0 0
+CCCCTGCCGACCCG
+GTTCCACTACCGAC
+NODE 3736 51 69 69 0 0
+GAAAAGCGGCACGTCGTATTAATCCACAGATGAAAGTGGGCTGCATGCTGG
+CCCGCCAGCGCGCTGGCGACAAACTGATGATGTAAGACCTGATACATGGTT
+NODE 3737 45 45 45 0 0
+CGTTAACCCAGGGTTTAGCCCCAGACCGATATTTTGCTGCACATT
+TGCCCATCTGACGTGCGATAGCGTCCCGTTTTTCCCGCTGGCTGG
+NODE 3738 116 365 365 0 0
+TGGCGACCTGCTGGACTGCGCTTCTTCCACCAAGCGAATGAGCCTAGCAACAGCAGAATCGTCCACCGAAGACGTAGTGCGAACTACGAGTGGCGAAGTTACACTGGGAGTGTAAC
+GTGGACGATTCTGCTGTTGCTAGGCTCATTCGCTTGGTGGAAGAAGCGCAGTCCAGCAGGTCGCCAACAGAAATGCTCATTGACTCCTTTGCCAGAAGTTACACTCCCAGTGTAAC
+NODE 3739 120 556 556 0 0
+GAGCGCAGTTTTGGAGTGGTTGTGCGGATCTTGTTTTCTCGAAGAAGTTGAGCTGTTCGAGTTTGCGCTTCCTTCTAAAAGATTAATCGTGTTGTTGTTGTTGTTGTTGTCAGTAGGCAT
+AAGCGCAAACTCGAACAGCTCAACTTCTTCGAGAAAACAAGATCCGCACAACCACTCCAAAACTGCGCTCCCTTCTAAAAGATTAATCGTGTTGTTGTTGTTGTTGTTGTCAGTAGGCAT
+NODE 3740 46 46 46 0 0
+AAAAACGTCGGGGAATATCCAGATAAATTACGATTTTTTTTGCGGC
+CGATGTTAGAAGAGCCATCCAGAGGGTCCATCAGCACCACATATTT
+NODE 3741 128 173 173 0 0
+TTCTTGAAAGCATGCTTGGAGGCATATTGATCGACCCCGAGGGGCTTCTCATACTATCGTGTTTCAGCTCAAAAGGCGGATTTGCCTACCTCTCTCACAGCCTACGCACTTTAACGGGCGCATCGTCA
+CGCCTTTTGAGCTGAAACACGATAGTATGAGAAGCCCCTCGGGGTCGATCAATATGCCTCCAAGCATGCTTTCAAGAAAATCTTCTAGGGTTCTGGACTGAAGCTTAGAAGATTTTCTTGAAAGCATG
+NODE 3742 51 113 113 0 0
+GGACTACTTCGACAAGAGTGAAGGCGAGATGCTGACGTGCATTCGTATGGA
+CCCCGGCCACTCATAATGCTCGTAGGTGGCATGACCGGTTTCACGCGGGTT
+NODE 3743 51 73 73 0 0
+GGCGGCGCTGAAGATTTGTCTGGTGATGGGGATGATCGAAATCTTTGGTTG
+CCGCCAGCCGCCGAAGTGGTTAGCGAACACGCCGATAGTGGCGTTAGAGAA
+NODE 3744 51 66 66 0 0
+GCCATTTTTGCGGCAGCAGAAAGGACAGAAGCAACCCCACGCACGCAAAGG
+CCCAGCCAGGCGATTGTCACACCGGCGGAGTCGGTACAGTGGCAGGGGCTG
+NODE 3745 34 34 34 0 0
+GAAGCGGGAGACACGGGCTTCGTCAGTATAACCA
+ATTATCAGTTATTCCAGCCTGGCGGCGGTGTTGC
+NODE 3746 45 62 62 0 0
+GATCAGCCATCATCGCCGCATAGTTACCGTGGCTGACCTCAACGG
+CCCCGTTTTAAAGAAGGCAAGCCGGTGCTGTATTACACCTGGACC
+NODE 3747 44 66 66 0 0
+TGAACAAAACACAACCGATAGCGATGAAAACGCGCCGAAAGATC
+ATCCAGCCCAACTTCATGGCAAACTTTCGCCGCTACCAGCTCGC
+NODE 3748 17 469 30 0 0
+CGTCGATGGCCCGGCGG
+TGCATATCCTGCCGGAT
+NODE 3749 41 57 57 0 0
+GGGATCAGGGTAACAACCATTTTGATGTTGTCGCCCGGCAT
+GATGGACGACGGTCTGCGTTTCGCAATCCGTGAAGGCGGCC
+NODE 3750 51 91 91 0 0
+GTTCGCCTTCGCTTGGACGGCCTTCACGACGGAAGAAGCTGCCCGGGATAC
+CCCCTGATTGCGCGTCTGATTGACCGCCCGGTTCGTCCGCTGTTCCCGGAA
+NODE 3751 51 82 82 0 0
+TAAGGTTTCCTGAAGCAGCCAGCGGGCAAAGAGTATGCGTTTGCCGGTCCT
+AGCTGGCGGCGACTTCATCCTGCAATGCGGCATCCAGACGACCGGCGGTTA
+NODE 3752 2 764 5 0 0
+TG
+CA
+NODE 3753 6 6 6 0 0
+AAGGGT
+CAGCGG
+NODE 3754 51 63 63 0 0
+TAATGAGTATACAACGTTAACCATATAATGCCGGCGGTACACCATAGTCCC
+ATTTGATAACCCACGTTCAACCTGTTGTTGTTTTGTGGATATCAGCACTTT
+NODE 3755 26 57 57 0 0
+GTCACCACGCCGACCAGCACCAGAAT
+CGAGTGGTGGAGCACCCTGCACCAGG
+NODE 3756 51 70 70 0 0
+AGTGCCTGTTTAACAGATTATGGTTAAAGGATGCCACATACAGGAGGAAAA
+TGACATTATGGTTCAGATCCCAGAAAACCCACTTATTCTCGTAGATGGCTC
+NODE 3757 51 96 96 0 0
+GACAGACCAAGCACTTCACTCTGAAGTCTGACGTACTGTTCAACTTCAACA
+CCTTCCGGAGCCGGTGCCGGTGCCGGAGCGACTACCGGAGCAGCTTCTTGC
+NODE 3758 51 123 123 0 0
+GGCTTACCATGCAGGAAATGCGTGAGCGCATGAAGCATGGAAAATTTGGGG
+CCCTCATCATCCCCGCCGCAGCCGCTCACCTCCCGACTTTCCCCTGCGCGT
+NODE 3759 51 87 87 0 0
+AGCGTGGGCATAAAATCGGCGCGTTCACATTTCGCTCATTGCCTGCCGCCA
+TGTTAAAAAGATACGGGGGAAGGGGCATTTTCAGAATTTATTGTGCCGACA
+NODE 3760 43 43 43 0 0
+GCTAAAAAATTAATGGGAACCGGTTTGATTATTCACTGTCTGC
+CGCGCCGCGCTGGAAGCCGCCCTGCCCATGTTGCGCACTCAGT
+NODE 3761 51 61 61 0 0
+TCGCGCTGGGTTGCGCTGGCGTCATCAACTTTGCTGATGCCGTTCGTCTGG
+AAATATTCGCCCAGGCTGTGCCCTGCCATTAACGCAGGCATTTTACCGCCC
+NODE 3762 32 32 32 0 0
+GATCTGAGTTCCAGTATATTGAAACAGAAACT
+CCCCTGACGCTGAAGCCATATCCGTTTCATTA
+NODE 3763 4 62 47 0 0
+AGGA
+TACT
+NODE 3764 45 45 45 0 0
+TATGGTACCGCCGTTAGCGCTGGGTCTGGCAACGATGGTGGCGCG
+AGTGTATTACGCCCTTGCGGTGCCACAATCGGCCCAACAGTTTTA
+NODE 3765 51 65 65 0 0
+GTGCTGATAACTTCGCCAGTATGAATCCGGTTGCGAAATGGATACTCATCG
+CCCCCCCCCAGCCCCGGTCCCAGGTTATTAAGCGTAGCCACTACCGAGGCG
+NODE 3766 51 58 58 0 0
+GTAATCGATTTAATCGCAATGGCAATACCTGCAATTAAACCGCCGCCGCCA
+CCCCGACCATTAAAGTTATCGGCGTACAGGCCGAAAATGTTCACGGTATGG
+NODE 3767 42 42 42 0 0
+TCGCTTTCATCCCATTCGCCATCCATCCGGCTTTGCGGCGCC
+AGGCCGTACGTAAAGTCACTTCCAGAACGCGAACGCCCCCGG
+NODE 3768 51 62 62 0 0
+GCCAGATCGCACTGGAGGAAGCGGGGCGCTATGCGGCAGAAGATGCGGATG
+CTAAAGGTGAGCTGGTTTTTACCTTTACCGGCAATGTCTTCAAAGGTGATA
+NODE 3769 151 255 255 0 0
+TTGATAAAGAAAGCTCAAGTCTGAAACTTACCCTCGTACTTCTTCCTTCATTAGCTCTTAAATTATTTGTTCTTCTTAGCAACAGACCATGATGATGACGTGGTCTGTTGCTAAGAAGAACAAATAATTTAAGAGCTAATGAAGGAAGATG
+ACGTCATCATCATGGTCTGTTGCTAAGAAGAACAAATAATTTAAGAGCTAATGAAGGAAGAAGTACGAGGGTAAGTTTCAGACTTGAGCTTTCTTTATCAAAGGAAAGAATAGCTGAGTTTAAAGACATGATCCGCCAGAAAGAAGAGGAC
+NODE 3770 43 43 43 0 0
+AGCTGGCGGGCGATCGCGCCTATGCTGATGACAAAGCCATCGT
+GTAAGTGGTATTGCCGAGGAAATCCATATTGATCGGCAAGCCA
+NODE 3771 6 6 6 0 0
+GATCCC
+TCTGGC
+NODE 3772 110 153 153 0 0
+TGTAGTACATCTTGCGAGCAAGTGCTTTGCCCTCGATGTCAGACCAGGTCTTCACGTAGCGCTCGTAGTCTAGCTTTTCAGCTTGCAGCTTAGCAATAGGGACGCTATTG
+GCTACGTGAAGACCTGGTCTGACATCGAGGGCAAAGCACTTGCTCGCAAGATGTACTACACCACTAACGCGCCCGTAGTCTAGCTTTTCAGCTTGCAGCTTAGCAATAGC
+NODE 3773 109 130 130 0 0
+GCGACGCCGGGTATGCCTCAGCTGTGGATTTTGGCATTTTTTGTCGCTGGCGTGCGGTTAATGCGCGCGGCGGGCTGCGTGGTGAATGATTATGCCGACCGTAAATTTG
+AACCGCACGCCAGCGACAAAAAATGCCAAAATCCACAGCTGAGGCATACCCGGCGTCGCCCCCCATAGCGCCCAAAGCGTCGGCCAGAGCAGCAGCAACGCGCCAATAG
+NODE 3774 51 67 67 0 0
+AAGGGAAGTTACTATGTCATGCTCGTTTTCCGTGACGCGCGCGTTTGCCGT
+TATAATGATAGTAATTATCGTTATCTATCTTATTTGGTTATGTTAGCATGT
+NODE 3775 36 36 36 0 0
+CAGATAATAGTTTTTCATTACACTTCTCCCCCGGTT
+GCCACTGAGGGGAATCCGGGCTCTTGCCCGGGCCTT
+NODE 3776 2 2 2 0 0
+TA
+CC
+NODE 3777 51 56 56 0 0
+CATTTTATTCCCGGCCACAGGCGTCGCGACAACTTCATGGTACAGATCCAC
+GCAGCAATATGGCGCTCTATAAATCGCGCAAACTAAGCGTACAAACGCCGC
+NODE 3778 51 78 78 0 0
+GGGAGGACGAAAACCGGGCCGGAATGGATACGGGAAAAAGACGGAAATTAT
+CCCAGGCCTCACTTCCCGTTGCCAGCGCCTCTTTCATTATAACCCTGTGTT
+NODE 3779 48 48 48 0 0
+GGCGCTGCAATTTCCTTCGTTGCAGGTGACGGCTATCGAGCGTAATCC
+AACGAAGGAAATTGCAGCGCCGCTTCAATTGAGACGCTTCCCGTTCCC
+NODE 3780 11 12 12 0 0
+GACCGGCGACG
+TTGATAAGGGT
+NODE 3781 4 4 4 0 0
+GGGT
+TCCA
+NODE 3782 5 5 5 0 0
+GTGGA
+AAAGC
+NODE 3783 25 42 42 0 0
+GGGGGATAACTACTGGAAACGGTGG
+ACTCCCCCGTCCGCCACTCGTCAGC
+NODE 3784 2 2 2 0 0
+TA
+TT
+NODE 3785 31 70 70 0 0
+GAAGCTGGCATCACGACACCTTTACCTACTA
+TCCGCCGCCATATTCATAGACGCGGCGCAGT
+NODE 3786 143 203 203 0 0
+ACCACCCTTGCCGCCATTAATCGTTTTTTCCATTTCACGCGAAATGGTGCGTTTTTCAGCTTCATGACTCGGTGCAGTTGTACTTGCTGTTGTTTGTGCGTTGAGAGAAAAAGCGATTGCCAAGGCGGCAAGGGTGGTATGAA
+ACAACAGCAAGTACAACTGCACCGAGTCATGAAGCTGAAAAACGCACCATTTCGCGTGAAATGGAAAAAACGATTAATGGCGGCAAGGGTGGTATGAAACCTTTTTTTGCATAGCGGTTTTATTTCTAAAACTTTAAAAATAA
+NODE 3787 41 60 60 0 0
+GGCGATGCTGAATCAAGTTCAAATATCAGGTTAGACAAATC
+GTAAAATTCGTGTGAGGCGATGCTGAATCAAGTTCAAATAT
+NODE 3788 4 12 12 0 0
+TAGG
+TGGA
+NODE 3789 51 88 88 0 0
+AGCAGATGTGTCACAAATAACATATCGCACTATACGCGACTACAATACCAT
+TGCAAGGATAATTTCCCCGATCAAAGGAATGGAACGTCCAACAAACGGCGC
+NODE 3790 6 600 43 0 0
+GGTACG
+CGCCAG
+NODE 3791 47 99 99 0 0
+GTTCGATAGCAGGCACCACGTCATCCTCCTGACCATGCCACAACAGA
+TCCGGCTCCAGCAGGCACTCGCCGCGGCGAAGCTGGATAAGCATGTG
+NODE 3792 51 69 69 0 0
+GGGTGACAATATACCCTACTATCCTCTCAAAACAACATCATTTTGATAACA
+CCCTGTAGGAACGTTGCTCTCTGGTTGCAGTCGATCCGGATTACGCAAATT
+NODE 3793 7 7 7 0 0
+TTTTCAA
+CCCAGCC
+NODE 3794 37 37 37 0 0
+GGCATTCGTAGCTGGATTTTGCGTAACTTGCCGCAGG
+GCCGAACGCCATGCCGGTCCGGTGGTACTCATAGCGC
+NODE 3795 150 275 275 0 0
+TCGCAAGACCTCGCCTATTGGAGCGGCCGATATCAGATTAGGTAGTTGGTGGGGTAAAAGCCTACCAAGCCGACGATCTGTAGCTGGTCTGAGAGGACGACCAGCCACACTGGGATCCCCCGCATGAGACCTGAGGGTGAAAGCGGGGGA
+TCGTCCTCTCAGACCAGCTACAGATCGTCGGCTTGGTAGGCTTTTACCCCACCAACTACCTAATCTGATATCGGCCGCTCCAATAGGCGAGGTCTTGCGATCCCCCGCTTTCACCCTCAGGTCTCATGCGGGGGATCCCAGTGTGGCTGG
+NODE 3796 46 56 56 0 0
+CTGATATAACGAAAATTCATCCCGTACTGCACATCCCAGCGCCTGT
+TGGAAGAACGCACTCGTAAACTGCAACAGTATCGTGAAATGTTAAT
+NODE 3797 51 79 79 0 0
+AGATGGTTTGCGGAACATAGCTCAGGCCAATCACTGCCGGGCTGTAACCCA
+TCTTTTCTGATTGGCGGATATGGTTGCCGCGCGGCGCTACAAAAATGGCAG
+NODE 3798 1 1 1 0 0
+G
+C
+NODE 3799 4 8 8 0 0
+GCTG
+TCTG
+NODE 3800 13 13 13 0 0
+ATTATTGCGGTTC
+CGCAGCCGGTGGC
+NODE 3801 66 111 111 0 0
+ACTTGCATGTGTAAGGCATACGAGGCTTCAGTTCTGAATTGATTGTTAATCGTACAGTCTCTCACA
+CCTTACACATGCAAGTCATACGAGGCTTCAGTTCTGAATTGATTGTTAATCGTACAGTCTCTCACA
+NODE 3802 113 122 122 0 0
+ATCGGATTTCCAAAAACAGCATAGGGTTCCATCATATTACCCCTGTCGAAACAGTTCGCCCGGCAGAGCATCGCGAATTTCTGAAGGATTTAAACGCCCACCCGTTGCGCCTT
+CCGGGCGAACTGTTTCGACAGGGGTAATATGATGGAACCCTATGCTGTTTTTGGAAATCCGATTGCGAACAGCAAATCGCCATTTATGCATCAGCAATTTGCTCAGCAGCTAG
+NODE 3803 43 69 69 0 0
+TCGACGTCAGCGATTTTTTGGCCACGGGGAACTTCGGCTGGTC
+TCTGACCAACGCAACCACAGAACACCAACATATTAATCAGCCC
+NODE 3804 1 216 2 0 0
+G
+T
+NODE 3805 51 66 66 0 0
+GCAGGGTGATAGAGTGGTGATCCCAGAGGTATTGATAGGTGGAATCAACGT
+CCTCGCTGGCCTGCCAGCAGACAATCGCAACAGCGCTTCGCAAACTGTAAC
+NODE 3806 26 67 67 0 0
+CCCGGTCAGCAGCAACCAACACTGGC
+AGTCGCCAGTGTTGGTTGCTGCTGAC
+NODE 3807 51 61 61 0 0
+GATCAACGCGCCTGTCGCTGAACGGCACAATTATTGTGGGCCGCGACATCG
+CCCGGATACTGCGACAGTTGTTGCAGTATCTCGCTCATGGGACGGTTAAGA
+NODE 3808 51 154 154 0 0
+TTACACACCGCCCGTCGCACCTACCGATTGAATGGTCCGGTGAAGGCTCGC
+AAAAGGGCAGGGACGTAATCAATGCAGATTGATGATCTGCGTTTACTAGGA
+NODE 3809 51 62 62 0 0
+ACTGCCAGGTTCCAGTTAATCGCCGCAATGAATCCCAGCCCGACCGGACAT
+TGTACGTTATTTTCGCTCTGGTACGGGATAAATGAATTTGACCGGATTCTA
+NODE 3810 25 25 25 0 0
+TTCCGGATTCCGTTCCGGTACTTTT
+GGTGACATCTGCTCTCAAAGGTGTG
+NODE 3811 29 1510 63 0 0
+GCCGGTGACCTGCACCCACTCCCCGGCCT
+ACCCTGCTGCGCCTGCTGACCGGGCTGGC
+NODE 3812 34 82 82 0 0
+GATTTTTCTTTCAGGGCTATCACCCCTTCGCGCG
+GCCCTCACCCCGCAGCTGCCAGCCGGTATCCGCC
+NODE 3813 51 65 65 0 0
+TTAGGGGGAGCGAATAACGCCGATTTGTTCAAACTGAAAGCTGCTCATTTC
+AAAAGAAAAATTCGCCGTTCCGCGCCAGCCTGGTCTGGTCAAAAGCGCCTG
+NODE 3814 14 16 16 0 0
+GCGCTGCTATCTTT
+CCCTCCAGCGGCAC
+NODE 3815 22 36 36 0 0
+GATCAGAAGTGCGAATGCTGAC
+GCAGGCTTACAGAACGCTCCCC
+NODE 3816 6 6 6 0 0
+CTCCAG
+TCAGGT
+NODE 3817 14 25 25 0 0
+CCCTTGGCAAGGTC
+TTCTTATCTACAGT
+NODE 3818 48 72 72 0 0
+AAGGCAATCAAAACGTTGAAGCGCGAAAAATAGGTATTTATCAGGGGC
+CCCAATAGTGCTTTTTCCGGCACCCATAGGCCCAACCAGAAAGATATT
+NODE 3819 46 156 156 0 0
+TGAGTAATGTCTGGGAAACTGCCTGATGGAGGGGGATAACTACTGG
+CCCGCCACTCGTCAGCAAAGCAGCAAGCTGCTTCCTGTTACCGTTC
+NODE 3820 48 85 85 0 0
+GGAACCCAAAGACTTGTGATTTCTCATAAGGTGCTGACGGAGACAAAA
+TGGTGCCCTTCCGTCAATTTCTTTAAGTTTCAGCCTTGCGACCATACT
+NODE 3821 23 1265 38 0 0
+TCGTCTGCGCCGTTAATGGCTGT
+TGCCGCCTCTCCTCTGCGGGGGG
+NODE 3822 24 29 29 0 0
+GCTTTGCCTGCCTGAGCGAGCAGG
+CCCGGGATATCAACCACTCGCAGC
+NODE 3823 51 58 58 0 0
+GTCAACAGGGGATCTGCTTAGCATGGAACAACCGCCCAGCATGAGTGCCAA
+CCCCGTTCAAAGCACCGCAACCCCGCCAAAAGCGGAGCCGGAGAAACCTAA
+NODE 3824 42 43 43 0 0
+TGGGAAGGGTGTTCATTAAGGACTCCTTTATGCTTACTGTAA
+CGTAATGTGCGTTTGCAAGGGGTGGACTCGGTGATGACCCCA
+NODE 3825 5 10 10 0 0
+CCAAC
+AATTG
+NODE 3826 20 54 54 0 0
+GCGTCGCACGCGACGTTCAA
+GGTAATCCGTAGCCAACACA
+NODE 3827 42 42 42 0 0
+GCGGCCATCCCTCGCCCGGAGGCGATGGCCTCTACGCAGCCA
+TGGCGCTGCGTCAATATGGGGTGAAAACGCAGAAATGGTTAA
+NODE 3828 24 27 27 0 0
+CTCAGGGTATAATCGCCCGCCCCC
+CCACCAGCCATTCTGCATCGCTGA
+NODE 3829 27 79 79 0 0
+GTGCTCTACCAACTGAGCTATTCCCGC
+GAGTTCGAGTCTCGTTTCCCGCTCCAA
+NODE 3830 47 47 47 0 0
+CGACCTTTCAAATGGGCTACCGCATCGCCAATGGTACGGTGAGTTTT
+GAATGCAGATTCTGGCAACCCATCTTTCTGATAAGGCCGTAGACTTT
+NODE 3831 102 290 290 0 0
+ATTCTTTGACTTGCAACCGCAATACGCAGCTAAACTGAAGGTTTATCGAGCACTCGCGCAGATAAATATTACCGGCTGCAAGTCAAAGGTTAAGGCTTACGC
+TGCTCGATAAACCTTCAGTTTAGCTGCGTATTGCGGTTGCAAGTCAAAGAATGCGTAAGCCTTAACCTTTGACTTGCAGCCGGTAATATTTATCTGCGCGAG
+NODE 3832 12 12 12 0 0
+GCCAAAAGGCGT
+CCCCGTCGCACG
+NODE 3833 51 55 55 0 0
+AGGGTCGCTGCTAAAGCGATGAGGAGTAAGCCGCCTTTAGACGTAATTGGC
+TGATGATCAAAACCGTAACTGATGTTCTTAGGTTAACGTTGATGCTGATAA
+NODE 3834 38 38 38 0 0
+CGAAAGACGCAGGGGGACCTCTGGAGAGCTCTGTGATG
+TGATGCAAAATGGCGATCTTAGCCAGAACCGCTTGCTC
+NODE 3835 51 79 79 0 0
+TCCTGGCGCTATTCGGTATCCTCTTCAAGTTGACGATTGCGCACCGATTTA
+ATCCAGATCACAATCATTAGTCCGCGCGCCAGCGGCGAATCCAGACCTACC
+NODE 3836 17 52 52 0 0
+GTGGCTAATCCTGGTCG
+CCCGCCCCAGTCAAACT
+NODE 3837 51 74 74 0 0
+ACGCAAGGGGCTGATTCTATCAGAAAACGATGCTAATGATGGCGCTGAGTG
+TCCTTTTCGCGCACCGTTTATGGCTAACTTTTGAATAATTTATTATGACGA
+NODE 3838 9 9 9 0 0
+TGCTGCACG
+CCCCCGCCG
+NODE 3839 51 52 52 0 0
+AGTCCAGCTTTTTGGTGAACGGTTTTTAGCATAACAGCTTCGCGAAATAGT
+TCCATACGCGCCCTGTTCGGTCCTGGCTCAAGCTATTATGGCAGCGTATCG
+NODE 3840 35 81 81 0 0
+AGCCAGCGCTAATGCCTCTTTAATGGCGTGCACGT
+GGCCAGATGGAGAACCTGGCGGTGGACATGGGCTA
+NODE 3841 7 88 88 0 0
+CGACTTG
+GGAAGGG
+NODE 3842 63 278 278 0 0
+ACTGTGAGACAGACAAGTCGATCAGGTACGAAAGTAGAGCATAGTGATCCGGTGGTTCTGTAT
+TCTGTCTCACAGTCAAGTCGATCAGGTACGAAAGTAGAGCATAGTGATCCGGTGGTTCTGTAT
+NODE 3843 40 40 40 0 0
+AGCCGGTAACAGCAATTTTCTGTGCGCCAGTGTTGTAACG
+CCCGGAATGTATCGGTAATCAGTTCCGGCCGCGTGTTTTG
+NODE 3844 51 62 62 0 0
+TAGATCGGAGGCGATCTTCGCCAGAAATTTCACTGGCGCAACGCCGGCGGA
+AAATAAACCGAACGGACAATATGTTATTCCGCCAGCCGATGTACCCGGCTT
+NODE 3845 51 70 70 0 0
+AGGCAGATAGCAGCCATAAAAAAACCCGCTTTACGCGGGGTTTTCTACAAA
+TTTTTGCTCGTCAACCGCTGGCGCTGACCTCACTCGTTCACGCTCTTCCTG
+NODE 3846 19 419 32 0 0
+TGCTGGTCGGCATCATCGG
+CTCTTCACCATCGCGAACT
+NODE 3847 51 87 87 0 0
+GTGAAGGTTGGGTAACACTAACTGGAGGACCGAACCGACTAATGTTGAAAA
+CCCTGCCCATGGCTAGATCACCGGGTTTCGGGTCTATACCCTGCAACTTAA
+NODE 3848 4 4 4 0 0
+TATG
+CCCC
+NODE 3849 139 261 261 0 0
+TAAGGTAGCCAAATGCCTCGTCATCTAATTAGTGACGCGCATGAATGGATGAACGAGATTCCCACTGTCCCTACCTACTATCCAGCGAAACCACAGCCAAGGGAACGGGCTTGGCGGAATCAGCGGGAATCTCGTTCAT
+TTCGCTGGATAGTAGGTAGGGACAGTGGGAATCTCGTTCATCCATTCATGCGCGTCACTAATTAGATGACGAGGCATTTGGCTACCTTAAGAGAGTCATAGTTACTCCCGCCGTTTACCCGCGCTTCATTGAATTTCTT
+NODE 3850 28 119 119 0 0
+GGGGTAGTTTGACTGGGGCGGTCTCCTC
+GTAACGGGTCCACGTTAGAACATCAAAC
+NODE 3851 234 544 544 0 0
+ATTCCCTTCTCCTTTCCAGATAAAGACTTTATTGGAAAAGATATTACAAAGTTTTGAGTATGAAAAAGCTGTAGGAAATCCAAGATATTTACATCTTGCTGTTTTAGCACAGGAAGCATCTTTAAAAGGAATACTACATCATAAGTACCTTTGTAGACATCACTCTCTTTATTCAAAAACCTATACTTTATCGTCGTCTTTAACTTCCCAATAATGCTACTCAAAAAAGCTATC
+ATAGGTTTTTGAATAAAGAGAGTGATGTCTACAAAGGTACTTATGATGTAGTATTCCTTTTAAAGATGCTTCCTGTGCTAAAACAGCAAGATGTAAATATCTTGGATTTCCTACAGCTTTTTCATACTCAAAACTTTGTAATATCTTTTCCAATAAAGTCTTTATCTGGAAAGGAGAAGGGAATGGAAGAGAATTACCAGCTATGGTTTGAATCTTTTACAAAAGGTTGGATAA
+NODE 3852 3 3 3 0 0
+AGA
+AGC
+NODE 3853 5 5 5 0 0
+TGGCG
+CCCCA
+NODE 3854 45 45 45 0 0
+AACGAGCAGCTACAACATGCCAGCCCGTTGCTTAGCAAATAACCC
+AGAGGGCGAAACAATGAAAAAATGGCTAGTCGTGATAATGGCGTT
+NODE 3855 51 123 123 0 0
+GAATTTATGTGACTGGAAGGAACAGGAAAGAAAAGCCGCAATCTCCTCCAG
+CCCCTTTTCTGCCATGTCGATAAGCGTCTCTTTTATATTTTTTAGGTCGAC
+NODE 3856 40 53 53 0 0
+AAGATATGGCCAAGCGTTTTTACATTCTGCTCTATCTGTT
+ACCATCCAGAACAGTATCATCAGTAATGGCCAGCGTTGCA
+NODE 3857 45 1440 81 0 0
+TCAACCGCAACAACCTCAGCAGCCGCAGGGCGGCAACCAGTTCAG
+ACCCCCCTGCTGCTGACCGCCTGCCGGTGCGCCGCCGCCCTGGCG
+NODE 3858 173 408 408 0 0
+TTCCAGGCTCTTGCCGTATTTGCCCTGCAATTTAATCAGCATCTCAGGCATGGACAGCATTTTGCCGGTGGCATCCGTAAAGGACAGACCCAGTTTTTTTGCCCCTTCAACTGCCCCCGTCATAAAGCCTTCGTAAGCGCTGCTGGCTTCCGTTCCCAGCGTGCGGTTAAGCT
+ATGACGGGGGCAGTTGAAGGGGCAAAAAAACTGGGTCTGTCCTTTACGGATGCCACCGGCAAAATGCTGTCCATGCCTGAGATGCTGATTAAATTGCAGGGCAAATACGGCAAGAGCCTGGAAGGGAATCTGAAAGCCCAGGCGGAACTGGATGCGGCATTCGGTGACAGTTC
+NODE 3859 41 41 41 0 0
+CGGTGTCAATGCTAGTGGAACAGGCGCGCCTGTCGCCGCCT
+TATGGCCGGGATGAAAGCGTTCACCGCGGCGGTGCTGGGCG
+NODE 3860 51 63 63 0 0
+CCCGCGCCGCCGATAATGCCGATGGCCGCCGCCTGCGGCAGGGTGAAGCTG
+GCGGCCCGACGGCGATTTATCTGTCGGGCAAACTGGCGCCGGAGCTGCTGG
+NODE 3861 2 2 2 0 0
+GA
+CC
+NODE 3862 102 163 163 0 0
+TTAGCATCATTTAGGGCGTGGACTACCAGGGTATCTAATCCTGTTCGCTACCCACGCTTTCGAGCCTCAGCGTCAGTGCTGAAATAGTAAGCTGCCTTCGCA
+GGTAGCGAACAGGATTAGATACCCTGGTAGTCCACGCCCTAAATGATGCTAACTCGTTATTTGGCCTTCGGGTTGAGTGACTAAGGGAAACCGATAAGTTAG
+NODE 3863 43 65 65 0 0
+GGTATCGAGTAGCGAAACCAGCCGCGCCTGGACGCCGGATGCG
+CAGCAGGAGCGAGCCTTCATGACCGCCCCATACCGCCGCCAGT
+NODE 3864 65 132 132 0 0
+ACGTACAAATACGTCTTATAAACTTCATTAAAATTAAGATTTAAAGCAGCACATGAATCTTCTCC
+GACGTATTTGTACGTTTATAAACTTCATTAAAATTAAGATTTAAAGCAGCACATGAATCTTCTCC
+NODE 3865 24 1327 67 0 0
+GCGCTATCAGGGCGTGCGCGAAGA
+TTCCAGAAACAGTGACGTTTCAAT
+NODE 3866 15 16 16 0 0
+TGGCGATTGTTGCGC
+TCCGCTGCACCCGGA
+NODE 3867 39 62 62 0 0
+TCACTGACTATCCACAGCGAATTCCGGCCATCAGAAGCT
+GGTAAATTGGCACGTTTTTCCAACCTGGGTGGAGGTATA
+NODE 3868 17 57 57 0 0
+ACCATTTTTCGCGCCTT
+CCCCCTAACCAGGGAGT
+NODE 3869 51 58 58 0 0
+ACATCCGTTTGCTGAACGTGGCAGGGTTGCTGCGCCATTCCGTTCAGGAAG
+TCCCGCGGCGATATTTGCAACGCCTGTGGCAGGGCATCCACGTCACTTAAT
+NODE 3870 44 53 53 0 0
+CTTTCAGAGTTTTACGCGCAATCGGGATAAAACGCGGGTAAATA
+ATAACACCGATAGCAACGATGACTAATGGCATGATTTACCTGGC
+NODE 3871 103 141 141 0 0
+CTTTAATCGGCGAACAGCCGAACCCTTGGGACCTTCTCCAGCCCCAGGATGTGATGAGCCGACATCGAGGTGCCAAACCAATCCGTCGATATGGACTCTTAGG
+CACATCCTGGGGCTGGAGAAGGTCCCAAGGGTTCGGCTGTTCGCCGATTAAAGTGGTACGTGAGCTGGGTTCAGAACGTCGTGAGACAGTTCGGTCCCTATCT
+NODE 3872 51 109 109 0 0
+GGATAGAGCGCAGTATCCGGCTGGCGCAGGAGAAATAAGACCCTGACGGCC
+CCCGCCCGCCGGGCGTCACCCGCCGGCAGCAGTTTCAGCATCATCTCCCAG
+NODE 3873 120 466 466 0 0
+ATGCCGTGAGCATTGTTTGTGTCACATGAGTGACTAATGTTTAACCGCTTTAGTTTCATTCATCGTTGGTGCCTAATGTTTTGCGGCTGTCAATGAAATCGGCAAGTCTACAGGAGTTTT
+ACCAACGATGAATGAAACTAAAGCGGTTAAACATTAGTCACTCATGTGACACAAACAATGCTCACGGCATGCCGTACGAAGTACTGCATGCCGTGAGCATTGTTTGTGTCACATGAGTGA
+NODE 3874 51 52 52 0 0
+GACGCACAACAGGGGGAGGACGAATGCGAAAAGTAAAGAGTGGGTAAATCC
+CCTCGCGGGACGACGATGGTTTCGAGCGGGGCAGGTGCGCTGCTGGCTGTT
+NODE 3875 103 128 128 0 0
+TCATCATCATGGAACCGCCCAAATTCGTCGAAAATAAAAGCCAGTTAATGAGAGCCTGCCGGGGCTATAAAGACATTAACATGTTAGCGATTCAACTGCTCAA
+TCTCATTAACTGGCTTTTATTTTCGACGAATTTGGGCGGTTCCATGATGATGACGTCGAATTTTTCGCCGTGTTCTCGGTAAGCGCGCAGCACCTTAAACCCG
+NODE 3876 40 40 40 0 0
+ATGAACAACTGTGGGTCGGCGATCATCCTGGTCTGAACGC
+TGCGACCGTTTTGGCATCGGTGTGGAGGAGAAGAAATATT
+NODE 3877 5 5 5 0 0
+GTAAT
+CCTCA
+NODE 3878 34 40 40 0 0
+GCTGGAAGAGCAGGCCAGCCGTCTGACCCAGGCG
+ATTCCTGAACCAGCGAGGCGTTCTGTTGCGTTAC
+NODE 3879 8 8 8 0 0
+TTCGGTGC
+CCCAGCGG
+NODE 3880 51 54 54 0 0
+AACCGGAACACTGATCTTTGCTGTCGTCACTTTATATAAAAAGAAAGCAAC
+TACCACTAAACATGCTGAAATCACAAAACTGATCTCCTTCGACCCCGTTAC
+NODE 3881 37 37 37 0 0
+CAAACGGCGCGGGAGTTCGCACTACGGCGTTGTTAAC
+ATGCGTCAGATGGCGCAGTTGATTTTGTAGCGGAAGG
+NODE 3882 35 88 88 0 0
+GAAAGGCATTGCCGCAGCCTCCCTCGCAGCCATTC
+CCCCCGCCGGTCACAAAAATATAGTTCGTTGTCAT
+NODE 3883 47 47 47 0 0
+CCGCCCATTGCGGAGTAACCGACCAGGGTGATTAGTGTAATGGTTGC
+AATGGGCGGCGCCGTCGGCGCAGGCGGCCTCGGTCAAATCGGCTATC
+NODE 3884 27 29 29 0 0
+AAACGTCAATTGCTGCGGTTATTAACC
+CTCCGTGCCAGCAGCCGCGGTAATACG
+NODE 3885 24 30 30 0 0
+ACAACACCTTCCTCCCCGCTGAAA
+TCCCGCAGAAGAAGCACCGGCTAA
+NODE 3886 51 96 96 0 0
+AACATTTTTATGCGACTTTTTGGTTACGCTCGGGTCTCAACCAGTCAGCAG
+TCCTTAAATCGAATATCGGACAACTCATGTCTATTATTACAAATTTACGAT
+NODE 3887 13 26 26 0 0
+CTTGTACTTAACA
+CCCTTGCCAAGGT
+NODE 3888 20 989 24 0 0
+CGCTTTGGTCAGCATCGGGG
+CCGTCCCGCGTACACAAAGG
+NODE 3889 30 30 30 0 0
+GTTCAATATCAAGGAAACCGTGATCGTCCA
+CCCCCGGAAGGCGCGCGCGATTACCTGGTA
+NODE 3890 51 70 70 0 0
+ACGTTAACGCAAGAATGGGGTCAAGCCAGAACATTGCCGCGGCGATAGCGA
+TCATTAAGCGCCGTACCTGTAGTGATACTGGCGACGTGGATTTCCCGCCGT
+NODE 3891 51 91 91 0 0
+CCGCCTGGTGGGATAGGCTCTAAGTCGATTCTCTTTTTTGCGAGGCGAATT
+GTATTGGCGCAGCCAGTTTGGACACGGACAGCGCGCAAAAACCGGAGCGTA
+NODE 3892 35 35 35 0 0
+GCCATGCGAGCGTTGCGCCGACGCTATACCCTACG
+AAACTTTTAATAGAGACTTCATAGCATTTCCTTTT
+NODE 3893 42 42 42 0 0
+AGTAAAACACTTTTCAAAAGAACAGATGAGCGTCGCGTTTCT
+CGACAGGCTGTTTGTATTAATGACTTGTGCCATGATCTTTTC
+NODE 3894 37 38 38 0 0
+AAAGAGGGTTGGACAAAATTTTTTATCAGGTTGTCCT
+CAGGCCGCCGCACATGAGCACCGTCGGAAACGGACCA
+NODE 3895 9 10 10 0 0
+GACTACGTG
+TAGCGGCGT
+NODE 3896 1 6 6 0 0
+G
+C
+NODE 3897 47 80 80 0 0
+AATTTTACGATCCGCCTCGCATCGTGAGGACTATCCTTCAATCGGAT
+TTAAAGATCCATCACACTTTTTATGAAAATTCTGTAACCGCTTCCAC
+NODE 3898 25 25 25 0 0
+GAGAATTAGATGCGCTATTCGATCA
+CCCTTCGCTTTCGCTGTCGGAGGTA
+NODE 3899 44 44 44 0 0
+CCATCATGCTGATCAATTTTTCGCAAATCGCCAGCCCCAGACCG
+TTAATCAGCACATAGGCCAGCGTAATGGCGGTGAAGGATTCCCA
+NODE 3900 45 73 73 0 0
+GCGATGTCATCTCGCGCTAATATCCCCTCAGGCAACACCAGAAGC
+ACCTGCCGATTCGCGCCGCGCAGCCGCTGGATGGCGCGTTTATGA
+NODE 3901 42 1493 47 0 0
+TATTGGTGGATTTCCCACAGCGTTCACTGACTTTGCCAATAT
+ACCCGTGGCGCCAGCCATACCAGATAACAATAATGCGCTACC
+NODE 3902 46 66 66 0 0
+GTCGGTTACTCCGCAATGGGCGGCGCCGTCGGCGCAGGCGGCCTCG
+CTGATAATGTACCGTAAACTCATTATGCGTTATCCCCCTGGCAATC
+NODE 3903 51 53 53 0 0
+ATGATCTGATCAATTATTTTTGAAGCACTAAGTACGGAGAAGATATGAAAC
+TTATACAACTATTCAGTAATTCGACGATAGACCGAAGGTGTGCTTGCTGGC
+NODE 3904 51 53 53 0 0
+CGATGTAACGGGGCTAAACCATGCACCGAAGCTGCGGCAGCGAACGTATCA
+GTCCGCGCAGGCCGACTCGACCAGTGAGCTATTACGCTTTCTTTAAATGAT
+NODE 3905 17 23 23 0 0
+CGCCGGTTGCCGTCATC
+CCCGCCGGGCCATCGAC
+NODE 3906 43 43 43 0 0
+TCACCGCGCTGCCGGGGGCAGTCGATTTACTCAATCACCTGAA
+TCATACAGCCGCTGCATAAGGATATGAATTGCGCCCTCGTCGT
+NODE 3907 47 57 57 0 0
+ATCAGAAGAGAATTATAGCGCCGAATTATTTCGTTATATATTTATTT
+CAACGCATCCCGAACCGCACCACCGACCAGATAAATCTTCACGCCAC
+NODE 3908 51 66 66 0 0
+ACCTGCCACAATCATGGCGAGTAACTGAAAAAAAGCCCATCCGATAACGAA
+TATATTTTTGTTAGGCGTATTATTATTTCACCCCATAATATTTGTACAGAC
+NODE 3909 142 354 354 0 0
+TGTTACGACTTCACCTTCCTCTAAATGATAAGGTTTGGACAAGTTCTCACGGTCAGGCCCCAATGAAGGAGCCAAACCACAATCCCGAGTCCTCACCGGACCATTCAATCGGTAGGTGCGACGGGCGGTGTGTACAAAGGGC
+GGACTCGGGATTGTGGTTTGGCTCCTTCATTGGGGCCTGACCGTGAGAACTTGTCCAAACCTTATCATTTAGAGGAAGGTGAAGTCGTAACAAGGCAGGGACGTAATCATTGCAGTTTGATGAACTGCGATTACTAGGAATT
+NODE 3910 15 35 35 0 0
+TATCCCACGGCTGAA
+CCCCTGCTCCCCGCC
+NODE 3911 42 42 42 0 0
+TAAAGGCGTGCTGGATCAGACGCGTCGCCATAGCTTTATCTC
+TGGAACGTTATCTGCAACTTTGCGCCGAGCAGAATATGCAGG
+NODE 3912 44 44 44 0 0
+AAGAAAAAGGGAAAGCGTTAAAATTCGGAAAACATAAAGACGCT
+ACGCTTTCCCTTTTTCTTATTTTATATGCATGGTAAATCATATT
+NODE 3913 44 61 61 0 0
+CATATCGCTGGGCCAACGTTAAGGAACCCTTTGTGAGTCAGGCC
+CGTCATGCTGGCGGTGGCGGGCTGCATTATTCAGCGTCTGACCG
+NODE 3914 8 8 8 0 0
+CCGCCCGC
+TTAGTCAC
+NODE 3915 23 910 75 0 0
+GTCTGCCGCTGATTGCGGTGCCG
+TGGCGCTCAGCGTCTGGTCAGGG
+NODE 3916 1 1 1 0 0
+G
+T
+NODE 3917 120 165 165 0 0
+GGCACTACCTAAATAGTTTTCGGAGAGAACCAGCTATTTCCAAGTTTGTTTAGCCTTTCACCCCTACCCACAGCTCATCCCCTAATTTTTCAACATTAGTGGATGAGCTGTGGGTAGGGG
+TGGGTAGGGGTGAAAGGCTAAACAAACTTGGAAATAGCTGGTTCTCTCCGAAAACTATTTAGGTAGTGCCTCAAGTATCACCATCGGGGGTAGAGCACTACCTAAATAGCTGGTTCTCTC
+NODE 3918 43 45 45 0 0
+TGTCTTGTTTTCTAAACGTCTCCGGACTCACCAAGATGCCCCG
+TACCCGGTTGACCTGAGAAGGTTTACCGGGTTTTTTGACATCC
+NODE 3919 27 35 35 0 0
+GTCCCCGCTTTATCTTCGACTGACACA
+CGGTGACGGTGGACACGCAAATCGCCA
+NODE 3920 66 68 68 0 0
+CCTGCTGATTCAGGAAGGCGGACATCAATCTCGCCGACCAAATTTCGCCGTGTCCGACGATCTCAG
+TTCCTGAATCAGCAGGGGCTGGATGACCGCCCTCGGTATAGCCATGGGCATAAGCACACTAACGTT
+NODE 3921 51 91 91 0 0
+TACATTATTGTCATCACATCCTGTTGCGCCCAGGGTCATTAGCGCAATGAT
+AAAAACCGAGGCGACGCCGGCCGCCAGCAGTCAGCCTGCGACGCCAGCGCC
+NODE 3922 51 58 58 0 0
+ACGCGCTTACCAGACCTACAAGGGCATAGGTCTGATAAACGCAGCGCCAGC
+TCGCTACCTGTCATAAAGCCGCGCCTGAACGTAAGACAACGTAAAGATCCT
+NODE 3923 40 110 110 0 0
+AAAGTTGCCGTAGCGCGCCACCATGTAATCGATGATTTCC
+CCCCGCCGCTGACCCCGCTGACGGTGCTGCTGTGGGTGCT
+NODE 3924 51 62 62 0 0
+AGGCAGAAAGTGGTTCGCCGCTGTGATCCGGCCCTTCCGGGGTAACGTAGA
+TCCGCCGCTATTCGCGCTACCTTTGGCAATATGGGGATGAACGACGAAGAA
+NODE 3925 51 65 65 0 0
+CGGATGAGTTGTATCGTCGCCCGGAAGAATGGACGACGAAAGCGATGCTCA
+GCCTTATCCTGGCAGTCCACGTAGCTGCGGTAGTCCGCCAGCACCTGATAG
+NODE 3926 12 109 109 0 0
+TTAATATGCTTA
+AACGGCGAGTGA
+NODE 3927 35 35 35 0 0
+ACGCAGGCGGTTACAGGTGGCGCAGAAATCTTTTT
+GATTACAGGAAGCCGGTTTTACCATGCAAAAACGC
+NODE 3928 38 38 38 0 0
+GCTAACTCTTCAATCAGGAACTGGAAGTCGAAATCGCC
+TAATGTTGCCCAGCCGCGACCGGATATCGAAAAGCCAC
+NODE 3929 111 204 204 0 0
+CGAGAGGAACCGTTGATTCAGATAATTGGTTTTTGCGGCTGTCTGACCAGGCAGTGCCGCGACGCTACCATCTGCCGGATTATGGCTGAACGCCTCTAAGTCAGAATCCGT
+CGCGGCACTGCCTGGTCAGACAGCCGCAAAAACCAATTATCTGAATCAACGGTTCCTCTCGTACTAAATTGAATTACCGTTGCGGCGACCTTCATCCGGCAGATGGTAGCG
+NODE 3930 32 32 32 0 0
+AACCTTTGATGTGACCGTTCTGGAATACGCTA
+CCCAGCGAACGGCTATTTTGCTGCGTATGCAG
+NODE 3931 203 255 255 0 0
+ATTGAGCTCACTTGATTTTGCTTCTCAGTACCAGGCCATGCTTTCACAGTTTGGCTTGGTACTGAGAAGCAAAATCAAGTGAGCTTTTACCCTTTTGTTCAACATGAGGTTGCCCGCCTCATTGAGCTCACCTGATTTTGCTTCTCAGTACCAAGGCCATGCTTTCACAGTTTGTCTTGGTACTGAGAAGCAAAATCAAGTGA
+TGGTACTGAGAAGCAAAATCAGGTGAGCTCAATGAGGCGGGCAACCTCATGTTGAACAAAAGGGTAAAAGCTCACTTGATTTTGCTTCTCAGTACCAAGCCAAACTGTGAAAGCATGGCCTGGTACTGAGAAGCAAAATCAAGTGAGCTCAATGAGGCGGGAAACCTCATGTTGAACAAAAGGGTAAAAGCTCACTTGATTTT
+NODE 3932 46 47 47 0 0
+CCACTTCATCGACGATGCCAATGACGCACAGATCGACCGGTGATAA
+ATCGTCGATGAAGTGGTGGCTGGCGGGAAAGTGGTTTTCCATAAAT
+NODE 3933 40 40 40 0 0
+CGGGCTGGTCACGCTAAACAGATATTTCTGCGGATCGGTG
+CAGCAGGCTGCCGAATCCCTGACAGCAGAGGGTGATAAGC
+NODE 3934 51 85 85 0 0
+GTTCGCTCATTTCCGTCATTTCTACCATCGGTATCGCGCTGGGCGTGGCGG
+CCCATCCCGCCGCGCCGCCGTCCACGGCTGAAACGCAAGCCAATTAACAAT
+NODE 3935 39 131 131 0 0
+GCTTTGTTATAAATCAGGGAGAGGGCTTCAACGGCGATG
+CCCCGCCGAAAACCTGGGAAGAGATCCCGGCGCTGGATA
+NODE 3936 48 61 61 0 0
+AATGAAACCTGCCTGCGCCACGATGATTACCTGTCTAAAAAATTCACG
+TTAACCCGGCACTGGCGGGATACGCCGCAAGGGACGGAGGTCTCTTTC
+NODE 3937 28 1307 94 0 0
+TAATAAATAATGATGAAGCGCAAAATCC
+ACACCTGCCACTGCCGTCAATAAATTCC
+NODE 3938 51 60 60 0 0
+GGTCATATAGCGCGCCAGCTCAATATCATCATAGCCAATGACTGCCATATC
+CCCGCCGCTGACGACTATCCATCAGCCGAAAGATGAATGGCACTGTTGCAA
+NODE 3939 105 137 137 0 0
+CTGGCGAAGCGAGGTCAAATCCCGCCATTGATCGTGCAGGTAAAGGTTAAAGGCCTCGACGACCAGCCCGACATTACTGCGATCGACCGCATCTACGATCTCCAT
+GGCCTTTAACCTTTACCTGCACGATCAATGGCGGGATTTGACCTCGCTTCGCCAGATCCCTGTGGAAAAGATCTTCGTTTACCATATTGATGACCCCGATAATCT
+NODE 3940 45 48 48 0 0
+CACCAGCTCAGGTACTTATGCACCATCGTTTTGGGAAGCACTTTT
+CTGGTGGAGTCACACCTGTGGTCAAGCGACGCGTAGAGCGCCAGA
+NODE 3941 40 41 41 0 0
+GTGCGGAGGAATTATGCTGCCAGGATGCTGCAAAAATGGA
+GATCACCGTCGGGAACTGGAACAGGCCTTCCTGATTCAGT
+NODE 3942 41 43 43 0 0
+ATGCGCATATGATGGTCACACTTAGGACAGACCTCAAGATT
+GTTAAAGCAGCCGTAGATGCCGGCAGCGCAGCGGCAAGCGT
+NODE 3943 102 339 339 0 0
+ATCTTTAGGCAAATTCGGATATTCAATCCTGAGGTGTGATGACGAGTTTGCTTGCAAACGAAGTGATTGATGCCCCGAATTTGCCTAAAGATTCTCCTACAT
+AGCAAACTCGTCATCACACCTCAGGATTGAATATCCGAATTTGCCTAAAGATTCTCCTACATGCTTAAACCAGCTATTCCAACAGCTGGTTTAAGCATGTAG
+NODE 3944 51 168 168 0 0
+GATTTTCAGCGCGCGGCGGAGATTTTGCACCGGCAGTTAGCGCTGCGCGAG
+CCCCTAACGCGATGGCAGGATCGTAAGGTAGTAGGCCGTTGTTCTCTTTAT
+NODE 3945 45 45 45 0 0
+ACTTCCCGCTCATTAGGGTGTAGCGAGCCATCGGCAAACGCCGCC
+TGCTCCCTTTTATCCTGCTGATACTGGTCTTTGTCCTCCGCGCCT
+NODE 3946 1 3 3 0 0
+T
+C
+NODE 3947 27 61 61 0 0
+CAAGAATCCGTATCTTCGAGTGCCCAC
+CCCAAGTCTCAAGAGTGAACACGTAAT
+NODE 3948 1 1 1 0 0
+G
+G
+NODE 3949 51 87 87 0 0
+GTCAGCAAAATCCATCTGGTAAAGTTCCATCAGATAAGTCAGCACGATATT
+CCTTTCTGAAGCAGTATCCACACACTATCCCAGCCACAAGGGGGTTATTAT
+NODE 3950 38 38 38 0 0
+CAGCGAAGCCTCTACCCAGTCTCCCTTACTGAACCCAT
+CTTTTGCCGTTGGAAGTCACAGTAATCTCAGAAGTGAA
+NODE 3951 51 81 81 0 0
+GGAAGCGCTCTGAGCATGAACCATGGTTTTTCTCTTTGCTAAAGTAAGGCA
+CCCTCGCCATCCCATTTTTACGGCGCTTTTCGGTATGGTGGTATTGACGCT
+NODE 3952 41 41 41 0 0
+GTAAGCGTACCACTGCGCTTTATTTTGAACCGGCATTTTTC
+CTTCCCGGTATGCTCGCACAGCCGCCAGATGCTCAGCCATA
+NODE 3953 32 104 104 0 0
+GAACCGGCATAAACTCTATCGTGCGGGGATCA
+ACCTTCACATCCTGACGTGCCCGGATGGACTC
+NODE 3954 46 60 60 0 0
+GCTGGATCTCGACTTCCGCTATCCGTCGATTACCCGCGATATGGAC
+TCGCCAGCTCGAGGAAGCATTGAACAACATGCTGATCCACAAAGGT
+NODE 3955 5 5 5 0 0
+TATTG
+CCCGC
+NODE 3956 279 467 467 0 0
+TTGGGCCCGAGTGCGAAGGAAATTCCCAAATTTCCGGTTTCGTCGGGCCCAGAAGACTTTGCCGAATTCAACGAAGCGGCGGCCATACGGATCGCTAACACACTCTCCGCTAAAATTTCGAAGCACCGATCAAGCTATGCGAAGCTGCCGCACGCGAAGGATCAGCCGTTTGTGATTGCAATCGCAGCGTTTGATAGCCCATTTGCCCACTTTGCGGCGAGCAGCCCGATCATGGCCGCTTTATATGGAATGCGATACGACGAGGAAGCGGCGAAGGCG
+TCGGGCTGCTCGCCGCAAAGTGGGCAAATGGGCTATCAAACGCTGCGATTGCAATCACAAACGGCTGATCCTTCGCGTGCGGCAGCTTCGCATAGCTTGATCGGTGCTTCGAAATTTTAGCGGAGAGTGTGTTAGCGATCCGTATGGCCGCCGCTTCGTTGAATTCGGCAAAGTCTTCTGGGCCCGACGAAACCGGAAATTTGGGAATTTCCTTCGCACTCGGGCCCAACGCCTTCGCCGCTTCCTCGTCGTATCGCATTCCATATAAAGCGGCCATGA
+NODE 3957 9 9 9 0 0
+TCCATGCCG
+CCCCCGCCG
+NODE 3958 51 78 78 0 0
+GCGTTAGCTCAGTTGGTAGAGCAGTTGACTTTTAATCAATTGGTCGCAGGT
+CCCCGAGTGGTGGGTGATGACGGGATCGAACCGCCGACCCCCTCCTTGTAA
+NODE 3959 35 62 62 0 0
+CGGAGCTGAAGTCAGTCGAAGATACCAGCTGGCTG
+CCCTACGTGTCAGCGTGCCTTCTCCCGAAGTTACG
+NODE 3960 4 4 4 0 0
+GGTC
+TAAG
+NODE 3961 51 69 69 0 0
+TCTTTGCCAGCCAAACAGCGCCTGGCCGAAACCCACCGCAATATGCAAGGC
+AGAACAGCTCTTATTTGGGGAGCTGGGTACTCTAGGTTTACTATGGTTTAT
+NODE 3962 126 198 198 0 0
+GACTGGAGTGCAGTGGTGTGATCTCGGCTCACTGCAACCTCCACCTCCCAGGTTCAAGCAATTCTTCTGTCTCAGCCTCCCGAGTAGCTGGGACTACAGGCGCACGCCACTACGCCCGCTAATTTT
+GCTGAGACAGAAGAATTGCTTGAACCTGGGAGGTGGAGGTTGCAGTGAGCCGAGATCACACCACTGCACTCCAGTCTGGGCTCGAACTCCTGACCTCTGGTGATCCACCCACCTCGGCCTCCCAAA
+NODE 3963 11 11 11 0 0
+GAATTCTGTAT
+CCTCCTATACC
+NODE 3964 95 266 266 0 0
+GGTCTCAGTTCCAGTGTGAATGATCATCCTCTCAGACCAGTTACAGATCACAGACTTGGTAAGCCATTACCTTACCAAGTCTGTGATCTGTAACT
+TGTAACTGGTCTGAGAGGATGATCATTCACACTGGAACTGAGACCAGTTACAGATCACAGACTTGGTAAGGTAATGGCTTACCAAGTCTGTGATC
+NODE 3965 36 36 36 0 0
+AGAGCCAACGTCACCGCTGTATGGTGATAGGCGAAG
+CAGAACAACGCCGCTAGCGGAATACCGCACCAGGAT
+NODE 3966 33 74 74 0 0
+GCTTGAACCCCCACGTCCGTAAGGACACTAACA
+TTATCTTATCCTTCCTTTGTCTCTTCATTTTCA
+NODE 3967 12 21 21 0 0
+GTTTTCAATCCC
+TTATTCAGAAAA
+NODE 3968 39 39 39 0 0
+GGTCTGGCCGTGTCCGCCAGGCGAGCCGTGCATCACCGA
+TTTCAGCAGACGCGTGGTGTTAATCGCCCCGCGCTGCGG
+NODE 3969 47 69 69 0 0
+ACCTGCTCAAAGAGACCCCTTGCGAAGTCATTCTCCTCGGTGGAATC
+ATATAACTGCTCACGGTGATGATCGTGACATCTTTTTGTTCCGCCAG
+NODE 3970 51 82 82 0 0
+ACGTAGGTGGCGCTCATGGAGGAAATTGCCGTGTCCACGCCGTCAACACCC
+TCCACCCGGCCACCGAAGCGCTGGTGGCGACGTTGGCAGGTACTGAGCACG
+NODE 3971 51 68 68 0 0
+ACGTTACCGCCGGATTATTAAGGTGTGTTAATTGCGTTTGTTCTTCCGCCA
+TTTCCCGCCGCCACGCTTAGCGATTTGGTGGCGCAGCAGGCGCAAAAAACG
+NODE 3972 128 208 208 0 0
+CTAGGAGCAGCTACTCACTAGCTGTATCCTTCTTAGAGGGACTATGTGGATTAAACGCATGGAAGTTTGAGGCAATAACAGGTCCGTGATGCCCTTAGAAGTCCCGCACGCGTGCTACACTGATGAAC
+TTATTGCCTCAAACTTCCATGCGTTTAATCCACATAGTCCCTCTAAGAAGGATACAGCTAGTGAGTAGCTGCTCCTAGTTTAGCAGGTTAAGGTCTCGTTTGTTAAGGGAATTAACAGGTCCGTGATG
+NODE 3973 7 11 11 0 0
+GGTGTAC
+CGATCAA
+NODE 3974 37 37 37 0 0
+AATGCCGATATCGTCAATAAAGTAGTCAACCTGGCCT
+GCTTCCGCTTCGATATCGCCGCAGGCATTCTGTACGA
+NODE 3975 116 242 242 0 0
+TCTAACGCTGAACGTAAGTTCGGCGGACCTTTGCGGAAGACACAGTCAGGTGGGGAGTTTGGCTAGGGCTAGAACCGGTTAGACCGGGCCCTTCCTAACGGAATAAGTAAAATGAC
+CTAGCCAAACTCCCCACCTGACTGTGTCTTCCGCAAAGGTCCGCCGAACTTACGTTCAGCGTTAGAGGCTAGAACCGGTTAGACCGGGCCCTTCCTAACGGAATAAGTAAAATGAC
+NODE 3976 43 43 43 0 0
+TTATTATTGCCCATCTGACTGCGGCCAAACTCATCGCCCGCTA
+AGTTTACGGTAAAAGCAAAGTCCATACTTTAACTATTAATGGG
+NODE 3977 51 63 63 0 0
+GACTTCCGGTAGTGACGACATCATCCACAATAACCATATGGAGACCCTGTA
+CCCGTCGCGGAAATCGCGCAACTGCTTTTGCGCAACGGCGCAGCGACTGTC
+NODE 3978 43 63 63 0 0
+CCGGTTACCTGACTCGTCGTCTGGTTGACGTCGCGCAGGATCT
+CCTTATCCGCCAGACCAGTGAGATAAACCTGGCTATCAGTATC
+NODE 3979 29 60 60 0 0
+GTTCAGCAATGTGCGTCACCGATTCCGCC
+CCCTGCCGCTGCTCGATCATTTCAGCGCG
+NODE 3980 50 73 73 0 0
+AGTGGATGACCATGCGCCGCTGGCTGGAGGAAAACCCTGACGATGAGTTT
+GACGATGGTTGTGAAGGGCGGCTCGGCGTTTGCGGCGTTCTTTATCGCTC
+NODE 3981 41 57 57 0 0
+GCCCATTCAGCAATATTCGTAGGACTGAATGTGTAATTGAC
+AGATATTCCCGCAGCCACTCAGCTGTTTACCCCGAACTGGA
+NODE 3982 51 130 115 0 0
+GACGCAAAGCAACATGAATATGAATGAGGTGTTAGCGAACCGCGCCAGTGA
+CCCGGACCCGGTCTGCCAAATCGCCAGCGGAAACTCATCAGCATGTTTTCC
+NODE 3983 51 53 53 0 0
+GAATCACCCGGCTACCCATCCCGGTACGGCAGAGCTGTCGCGGGGTAAATT
+CGCCGCGATCGCCAGCTCATTTATGAGGAAGCGCCGCAGGCGTATAAATCC
+NODE 3984 72 236 236 0 0
+ATCGGTCAGTGTACGGAACTTACGGTTTTCGATGGTACTAACAATTCTCTGGATGGATCCATTCCAAGTGAA
+TAAGTTCCGTACACTGACCGATTTCACTTGGAATGGATCCATCCAGAGAATTGTTAGTACCATCGAAAACCG
+NODE 3985 45 72 72 0 0
+GGGCCTGTGAGGGTTGCTGGAGGTATCAGAAGTGCGAATGCTGAC
+ACAGGCTTACAGAACGCTCCCCTACCCAACGAACGTATCCTTAAA
+NODE 3986 3 6 6 0 0
+TCC
+TTC
+NODE 3987 23 140 140 0 0
+GTCGAATCCCCTAGGGGACGCCA
+GTCCTGGGCCTCTAGACGAAGGG
+NODE 3988 28 52 52 0 0
+CTTATTAAGAGCCCTGAGCATTAGCTCA
+CCCCGCGACCCCCTGCGTGACAGGCAGG
+NODE 3989 38 41 41 0 0
+GATTACAAGTTTTTCTACTTTCCCTTTGCGTATCTGGA
+TGGTGTACGCGCTGTTCGTCTTCAGGTTGATGATGAAG
+NODE 3990 51 56 56 0 0
+GTCTTAACCTTTTGCGTTCATGCTCCGCAACGACGCGCCAGATGAGGCGGA
+CCCGGAAAAATCACGGGCCTGATAAGGCAACGCCGCCATCGGACATGTTAT
+NODE 3991 39 39 39 0 0
+GCACCACGCCGTTGAGGAGTAGCCATGCATTACCAACCG
+GGGAAGCTGTCCGGTGGGATGAAACAAAAGCTGGGGTTG
+NODE 3992 51 62 62 0 0
+AAGCGATCTGACCTTCGCCATCGGTTTAATGAACTGCTTTAACCGTCTGGC
+TATTTCACGCGCGCTGAAATGATCGAGCAGCGGCAGGTAAACATTATCTTC
+NODE 3993 31 91 91 0 0
+GCTTATTTCTCCTGCGCCAGCCGGATACTGC
+TGGCGCCACCGGGCCTGGCTTGTTACTGCAT
+NODE 3994 51 73 73 0 0
+GGCAACGTGACTACAGCCATGTTCCACAGTGGAAACAACGGCTCTCACTCG
+CCCCCGACGCTCCCCACCTCACCGCCGGTCGCATTATTCGGCAGAAAGCGA
+NODE 3995 45 63 63 0 0
+AATCGGCCCATACGTACAGGGCGTTGACCTGGGTAGCATGGTAAT
+CGTTACTGCATTTTCAATGTCGCAATCGGCTTTGACGTAATACCG
+NODE 3996 12 24 24 0 0
+TCCTTCATCGCC
+CCCGTTATAACC
+NODE 3997 51 53 53 0 0
+GCGGGAACTCAAAGGAGACTGCCAGTGATAAACTGGAGGAAGGTGGGGATG
+CCCTAATCGCTGGCAACAAAGGATAAGGGTTGCGCTCGTTGCGGGACTTAA
+NODE 3998 20 37 37 0 0
+GTGTTGAACCTTCTCAACAT
+CCCTTTGTTTCCCACCAGCA
+NODE 3999 42 67 67 0 0
+TATTGAAGTTGATCGACAGCGCCATAGCTGGCGCGACGGCGA
+CGGGAATATAGATGTCGAATCCGCGCGTCATCCATTCATGGC
+NODE 4000 39 42 42 0 0
+GTCATCGCCAAAGCGAAAGCAAATCGTCGACAGAGATTC
+GCCAGTTTTCACTCAGTTTCCAACCATCGCTGATGTTAT
+NODE 4001 41 62 62 0 0
+GAGATTTTAAAGAAAAAGGTTGTCCACGCTAAACAATTTCA
+CCCTTTTTCTCACGCCGCCGCTAACGCAACACACCGTAAAC
+NODE 4002 25 30 30 0 0
+GTGCCAGTGTTGGTTGCTGCTGACC
+AACCGGTCAGCAGCAACCAACACTG
+NODE 4003 39 39 39 0 0
+TGTCTGTTATGGCTTCCAGTGCGGTATTACGGTGTTTAT
+CTGGAGCAGGCGCGTGAGATCCTGCGCGATATCGAATCT
+NODE 4004 2 8 8 0 0
+CC
+AC
+NODE 4005 45 45 45 0 0
+TGCTTTGGCCGCATCCTGGCGACCGATATCGTATCTCCCCTTGAT
+GACCTTCAGCCAGAAGTTCACGTAACGCCTGAAGTAGTGACTCGG
+NODE 4006 16 16 16 0 0
+GTTTACTCATCTCACG
+CCCCGCTACACAGGCA
+NODE 4007 16 16 16 0 0
+TTTGCATAACGTCCGG
+CCCGCGCTATCCGCTA
+NODE 4008 44 44 44 0 0
+AATTAACACGGCTCTTGGTCGTTATGCCGATAATGAGCATATGC
+CGATTTTATCCAGCGTAGCTAACGTATCAATAAGGTCCTGCTGG
+NODE 4009 45 59 59 0 0
+TTTAGGGTCGGCATCAAAAGCAATATCAGCACCAACAGAAACAAC
+GCCTGTTTGGTTCGCTTTGAGTCTTCTTCGGTTCCGACTACCCTC
+NODE 4010 51 58 58 0 0
+CGTCTCCCGCTTCTGGCGCGATGTTCGCTGCGAACGTATCGGTGGCGGCAC
+GCGGGCTTCGTCAGTATAACCAAGCCCACCCATAATCTGAATCGCATCGTC
+NODE 4011 30 108 108 0 0
+GCTGATAAGCCGCTTTCTTTTGGGTATAGT
+CCCCGTCAGTGTAAGCTGGCGGGTTTTTGC
+NODE 4012 51 52 52 0 0
+ACGGTGACGATGGCGCTCTGCGGCCCTTTGGTGTGGGGTTTGCTCACCGTC
+TCCCGGCGGGCCAGGAAATCTGGACGGATCAGTACGGGCGGGTAAAGGTAC
+NODE 4013 121 147 147 0 0
+GTCGGGAAAATATTGACGAACATCTGACGCATAGCGCCTGCGCCCGCCACGCGGGAGGCAGTCACATAATAGCGGTTCACCTCTACCAGAACCGCCGCGCGGGATAAGCGGACATAGTGCG
+TATTATGTGACTGCCTCCCGCGTGGCGGGCGCAGGCGCTATGCGTCAGATGTTCGTCAATATTTTCCCGACCTGCCTTGCGCCGCTGATTGTTCAGGCATCGCTCGGTTTCTCTAACGCCA
+NODE 4014 51 151 151 0 0
+GTTTATGTTCCCGGCGCCATTTCGCTGCTGATGGGGATAGTGGCGCTATTT
+CCCCCATTTTCCAGCTACCGCTAAAGGCGATAGCAAAGCTGGTCAGCAGCG
+NODE 4015 5 10 10 0 0
+GAAAA
+ATTTT
+NODE 4016 44 44 44 0 0
+ATCTGGCGCAGCAGCAGGCGGCTTCTATTGTCGCGTCCTGGTTT
+CAGCGAGAAGGCGCAGATGGACAGCAGCAGCGTCCACGCCTTGA
+NODE 4017 51 54 54 0 0
+AAGCGTCATCAGCTGTACCGCATCCTGCCAGGTATCCGCCTGCCCCTCGCC
+TCACTCGGCCAAAGGGCTGGAGTTTCCGCAGGTGTTTATCGTCGGCATGGA
+NODE 4018 43 43 43 0 0
+ATGCGCTGGAGCGCCTGCGGTGCATTCGTCGCTGGGTTGAGAG
+TCGCTATGACAAAAGACGGCGGTAGGCGGCAACGGTTGCTCAA
+NODE 4019 51 56 56 0 0
+AATCAGCCTCCTGCTAAGCCTGACCGCACGGAACCTACAGCTATTCAGGTG
+TCGGTTCCTGGCGACATGAAACTCCCTGGTTAGGGGTATCGGCGCGACCTG
+NODE 4020 51 69 69 0 0
+TATGCTGCTTTTGGGCGCGCAGCTGACCTCAATATTTTTTAAAGGCATGCT
+AAAAAAAACCATTACCGCCGGCGTAAACAGGCGAGCCAGACGGTGTCCTAA
+NODE 4021 6 271 10 0 0
+AGTAAT
+TGTCGG
+NODE 4022 16 37 37 0 0
+TGATCAACCTGCTGTT
+CCCCGCCAGCGCAAAA
+NODE 4023 3 6 6 0 0
+GAC
+CCC
+NODE 4024 24 57 57 0 0
+CCCGCCCGACGATAGCGGCGATGA
+GGGCGGGGTTACATCGTCATCGCC
+NODE 4025 71 391 391 0 0
+GCAAGGCTGACGCGCAGTTGGCGTTCCAGAAGTCGATCATCGACAAGCTCACGCACGAGAACGCGAACTGC
+CCAACTGCGCGTCAGCCTTGCGCAGTTCGCGTTCTCGTGCGTGAGCTTGTCGATGATCGACTTCTGGAACG
+NODE 4026 48 66 66 0 0
+GTTAACGATCAGAAAGACGGGATGCTGCGCCAACTGGAGCAACTGTCG
+CCCAGCCGGAACCAAACTGCACTTTTCCGGCAATTCCCGGCCCCTGGA
+NODE 4027 45 45 45 0 0
+ATCGATTGGTTACATGAGCGCTCATCAGCCTTCGCAAGCCGCTAA
+CAGGGTTGGTGATTTTCATAACAGCTCACTATGCTCATCCAAAAA
+NODE 4028 28 28 28 0 0
+GCGTTCAAACTGATGAGGTCAAACCTCC
+CCCCCTGTTACCGCCGTGAAAGGGCGGT
+NODE 4029 18 47 47 0 0
+GGTTGGTTGCTGCTGACC
+GACTGGTCAGCAGCAACC
+NODE 4030 38 38 38 0 0
+TTTGATGATCTCCACCTTTCATACGCTAGGGCTGGATA
+AGCATCAAACGTTTCATTTCAGCCACCGCCTCTTTCAG
+NODE 4031 41 41 41 0 0
+TCGCCTGAACGATACGTTTAAGTGTCCTTTGTTTGATCATC
+CCGACATCGTTTTGCCACTCGCCTTTGCTGATGGTTTGCGC
+NODE 4032 42 42 42 0 0
+TTCGCCAGGAAAGCCTCGCGGTATTGCTGGGCGTCATCATCG
+GACCAATTTTCTGAAAGCCTCTTCCATTGTTGGCGCGCTCTC
+NODE 4033 16 40 40 0 0
+AGGTATTTCAAGGTCG
+TACCCGGGTTGCGGAC
+NODE 4034 5 5 5 0 0
+TCAGA
+CCCCG
+NODE 4035 43 55 55 0 0
+AGTTCTTCCGCTTCTTCTGCTGGCAGTACAACGTTGCTACCCG
+CCCCTGGCGATACCGTTGAGACCCATGCCGCCGCGCTACGCTA
+NODE 4036 105 239 239 0 0
+CATCGATATGGCTGAATCGCTGGCCAAACATGGTCAGCAACAGCCGGTGCAAGTCCGCTTGAGGCGACCACGCAAGTCTTCCTTACCAGATCATTGTCAAGGAAG
+GACTTGCACCGGCTGTTGCTGACCATGTTTGGCCAGCGATTCAGCCATATCGATGATTTGCTCTTGCGTAGGCGGCTTGAGGCGACCACGCAAGTCTTCCTTGAC
+NODE 4037 37 37 37 0 0
+CGTGATGTCTCAGCGCCAGACTTTCGCACAAAAAGCG
+CAATATCGCGGAAGGCCTGCCCGTGTTCATTGCCTTC
+NODE 4038 13 13 13 0 0
+TAAAAAGCTCCGG
+CCAATATACCGCC
+NODE 4039 46 46 46 0 0
+TTGCCTGGGTATTGATTAACGAAAATCTCGTTGACCAGCCTTTTCT
+GTCTGTTTAAGTACCCGTCGCTCTCCGGTATCCATATCCAGTTCAA
+NODE 4040 51 59 59 0 0
+CACAGCCGCTGGGGTGGTATCACGATCCGCTGACGGTGGTGATGGCGGGTG
+GCCACTAACTGTGTATAGTGACCTTTCGGGCTGGCCTCAATGACCTGTACT
+NODE 4041 45 48 48 0 0
+CCTCCGGCCCCGACTTCCGTCTGGAAATGGAGGGTTTACAATACA
+GTGCGCGCCTGGCGGCGGCTGGCATCCAGGTTTCGCTCTTTATCG
+NODE 4042 36 37 37 0 0
+TCTAGGTGATATCTGGCTGCAAATGCCACTCCTTTG
+TAACTACCTACATCTTTTTGTGATTTGACATATCAA
+NODE 4043 19 19 19 0 0
+GTTTGTCACCTATAGTAAT
+GGTCGGTAATGGCTTTCGC
+NODE 4044 43 43 43 0 0
+GCTCTCGCCACTCTGTCGTCCGGCTCTCAGTAGGCCAAACCAC
+TCTATGCGCTGATGGGGTACGTGTGGCTGCGCGGAGAGCGCGA
+NODE 4045 27 27 27 0 0
+GGTTACGCGAGAATGCCGGACTGGGCA
+ACCATTCCCGCCGCATTTTTCATCGCA
+NODE 4046 1 1 1 0 0
+T
+G
+NODE 4047 37 41 41 0 0
+TTCTGAATGGCTGGCGCGGATTAGCCGTGAACGGACG
+CCTGCATGACCACCAGTTACTCACATATCCCCAGCCA
+NODE 4048 3 3 3 0 0
+TGT
+CCC
+NODE 4049 101 143 143 0 0
+TCGCATCGAACAAATAAAACGCATTGGCGCACCACAGCTCTCCCTCATGGGGTACGCACCAGGTCACCACGTGTTGTTTCGCCAGCCAACGGCCAATAGCG
+CCCATGAGGGAGAGCTGTGGTGCGCCAATGCGTTTTATTTGTTCGATGCGAAAAACGTCGCGCTGTATCTGTTAACGGATGATAAACCCCGCCATGCGCAA
+NODE 4050 42 42 42 0 0
+AAAATAGCGCCAGCATCCCGGCAAACCAGAGGCCGATCCAAA
+CGTCTCTTCTTTCGCAAAGCTCTCCAGTTTGAGCATTACGCG
+NODE 4051 39 39 39 0 0
+GCCGAATTTTTGCCAGCCCGACGGAGCCGTTAATAAACG
+TCCTACGGATTTTAACGCCATCCATTTGGACATCAGCAA
+NODE 4052 37 37 37 0 0
+GATCAGGATATTTCGCCACCTCGCCGAACAACTGATT
+GGTGAACCTGCCGGTTATCCACTATTCCGTTGAGTGG
+NODE 4053 44 44 44 0 0
+GTAACGAGGTACGCCGGGCAAAGGCGGCAGAGATGGCGGAATCA
+ACATTTGCCGCCGCTGCCGCCTGCATATCTTCCAGCTTGTCTCC
+NODE 4054 6 6 6 0 0
+AGGTGC
+CCCACC
+NODE 4055 51 55 55 0 0
+AGCGAACCACCGGCTGGACCGCGGAAGAAATGGTCAATATCACGGGCCGCC
+TTAATATCAATCAGCAAGGCGGCGGTGATATAGCAATCATAAAGCGCCCGG
+NODE 4056 48 57 57 0 0
+AATACATACACAAAATCATTCAAGATGCATCGCGGCGGCAAGGGAAGA
+GATTTTGACAATGATGGTTAACGGAACGGAGAGCAACATGCCCACCGG
+NODE 4057 51 53 53 0 0
+GCACACTATCATTAACTGAATCCATAGGTTAATGAGGCGAACCGGGGAAAC
+CCGAATCACACTGGGTTTCCCCATTCGGGTATCGCCGGTTATAACGGTTCA
+NODE 4058 147 395 395 0 0
+ACAGGTGACTGGGAAGAATATTCTAAGGCGCTCGAGTGAATCACGGCTAAGGAACTCGGCAAATTAACCCTGTAACTTCGGGATAAAGGGAGCCTCCTCGCAAGAGAGGCCGCAGAGAATTGGTCCAGGCTTAATTTGCCTAGTTCC
+GGAGGCTCCCTTTATCCCGAAGTTACAGGGTTAATTTGCCGAGTTCCTTAGCCGTGATTCACTCGAGCGCCTTAGAATATTCTTCCCAGTCACCTGTGTCGGTTTACGGTACGGGTTACTATTAAGTATAGATTTACAACTTTTCTT
+NODE 4059 112 164 164 0 0
+GACGGACGGATCAAAGCGCCGGTCGGTTGATCCCTCAGTGAGAGCGAATCTCCCCTAACTATCAGCTTGCTGTGGATAAAGCTCTCACTGAGCTGATCGCTGAGGAAACTGT
+ATAGTTAGGGGAGATTCGCTCTCACTGAGGGATCAACCGACCGGCGCTTTGATCCGTCCGTCACAGTTTCCTCAGCGATCAGCTCAGTGAGAGCTTTATCCACAGCAAGCTG
+NODE 4060 51 59 59 0 0
+CCTCTCAAATTTTCGCAACACGACGATGAATCGCGAGAAACATCTTCGGGT
+GCTCACGAACAACTTTCGTTGTTCTGTGTTTCAATTTTCAGCTTGATCCAG
+NODE 4061 12 13 13 0 0
+GCTTAACCCAAC
+GTCCGGCCGGGA
+NODE 4062 1 2 2 0 0
+G
+A
+NODE 4063 51 74 74 0 0
+AGGTGACGTTTGCCAACGTCTTTACCATCATCCAGCCGGTGATTGAAGCTG
+TCCAGCACCACAACCCCCGTCGCGACCAGGGTAGAGGCTTTGGTTTTAAAG
+NODE 4064 102 117 117 0 0
+AGTTCCCTTGCGGGCCAGTTCGGCACGGATTTGACCGGTATGTATCGCCAGGCTGAAGGGGCATGTTGGCTTTGACGATCAGGCAAAAAACAACGGCGAATA
+CCTGGCGATACATACCGGTCAAATCCGTGCCGAACTGGCCCGCAAGGGAACTCCTGTCAGGCCTTATGACCAGATGATTGCTGGCCATGCCCGTAGCCGCGG
+NODE 4065 46 56 56 0 0
+GCGCCGCCGCCATTCGGGCGCGCTGGAAGTTTTCTTTATTGATAAC
+CTGGAAACCTTAACCTGGCAGTATCGTATTCAGGGTTGGAACGTGG
+NODE 4066 51 96 96 0 0
+GCAACTTCGTTCAGTTCCAGTAAGGTCCAGGGAATAAAATAGCGATCGGTA
+CTCGCCGTCGGCTGATTCTGGCTGCGGAAATTTATACCGAAACCCAGCCTG
+NODE 4067 44 44 44 0 0
+TTGGCATAGGCTTTTGCCGGATCGAGCAGCGTAGTGGTTTGCTG
+GGTCAAAATCGACAGTGACGGCGCAGGCTACCACATTCTGTGGG
+NODE 4068 47 53 53 0 0
+AGAAAATAAAAAGGTATTAGTTTCAGTTTCATTACAGACTCCTGTTC
+TATTTTCTGCCGCCTCCGGGGCTACGGAGATAAACGCCTGCAAAGAC
+NODE 4069 102 277 277 0 0
+GGTGCTGACGGGGACATATAATAATCGCCCGCCAATCCCTAGTCGGCATAGTTTATGAGAAATCAATTTTTTGGGTTCCGGAGGGCTGAGTCTCAGCGGATC
+ACTATGCCGACTAGGGATTGGCGGGCGATTATTATATGTCCCCGTCAGCACCTTATGAGAAATCAATTTTTTGGGTTCCGGAGGGCTGAGTCTCAGCGGATC
+NODE 4070 51 62 62 0 0
+TCTTCAGGTGTTAGTGTCCTTACGGACGTGGGGGTTCAAGTCCCCCCCCTC
+ATAGCGCGTCTACCAATTCCGCCACCTTCGCATACCATCGATTCTTGAAAA
+NODE 4071 51 103 103 0 0
+AGCAAGCGGGCGGTACGCTGGTGTGCAATAAAACCCAAAACCCGCCGCTGT
+TGATCTTTACTGGAGCCAACGAAGACCGGGATATCGCTACGCACGGCCGGG
+NODE 4072 51 76 76 0 0
+GTTAATGGTTCCCTCGTTGAATCAGTTCTATTTTGCTATATAGCGCATCCA
+CCAAACCCCCGCCGTTTATACGCCGGGGATTTGTTATTTGTTTTAACTTTT
+NODE 4073 13 13 13 0 0
+CCCTTGCCAAGGT
+TCTGTGCTTAACA
+NODE 4074 3 3 3 0 0
+GCG
+GTT
+NODE 4075 51 76 76 0 0
+AACAAAAGTGCTGGTGCGTACGGGCAAACCGGTCACGGCAGAAGCAGAAAA
+TCCGACATTTGCCGCCGCTGCCGCCTGCATATCTTCCAGCTTGTCTCCCAC
+NODE 4076 51 90 90 0 0
+GGAGTTAGCGCTTACAGGCGCATTACGCGGCGTTCCTGGCGCAATATCAAG
+CCCCACCAGCTCATATGCCTCAAGATTCGACGCTGTAAGCTGCTCAGACGC
+NODE 4077 46 63 63 0 0
+TTCGTCATTTAAGTTGAAATCCATCTTTCAGCCTCTTGATCAATTG
+CGCAGGGACGTCCGGTATTCGCTCTGACCGCCGATCCGCAAAGCCC
+NODE 4078 43 79 79 0 0
+AGTGCGGGCTTCCAGTAACTGGTTCAGGGCGTCCACCTTGCGG
+GAACGGCGGAATCACTGGAACTGGGGCGTCTGGCGAACGCGCA
+NODE 4079 137 230 230 0 0
+ATGTTCTGGGCTACACGCGCACTGCTGAAGTTTTTCAACGACAGCAATCCGCGTTTCGCTTCGGCGATGCGTAGGAAACCTCTTCGGTTGGTTTCTTCTGCAGGATTCCTTGCTCCCTCGCAAGGTGAGATTTTGGG
+CCGAAGAGGTTTCCTACGCATCGCCGAAGCGAAACGCGGATTGCTGTCGTTGAAAAACTTCAGCAGTGCGCGTGTAGCCCAGAACATTGAGGAGCATCACAGACCTGCTGTTGCCCAAAATCTCACCTTGCGAGGGA
+NODE 4080 45 76 76 0 0
+AAGCGACGACACGGCGCAGATATTTTCCATCACGTTTCATATGCC
+CCACCGCCGCTGCAAATCACCACATGGCCCTCTTTTAGCAATAAC
+NODE 4081 3 3 3 0 0
+AAT
+CCC
+NODE 4082 34 34 34 0 0
+TGCGCTGTCCGTGTCCAAACTGGCTGCGCCAATA
+TACGTAGTACGTGAAGTTTGACTCGCTACGCTCG
+NODE 4083 40 49 49 0 0
+CTACAGACTTTGTAAGAGATCTCTCACACCCGTTAGGGCA
+AGAATATACAGCGCGTCGGCCTGACGGGCTTCTACGGCTA
+NODE 4084 39 39 39 0 0
+CCACGGGGAAATATCATGTTAACCAGTATACCGGCGATG
+GTCAGGGCTTCTTTAGCGATACGTAGCATGGGCAATATC
+NODE 4085 51 63 63 0 0
+GCGATATTCGCGCGCAGCGCGTACAGGACCAGGGCGGTGGTCAGCCCCAGG
+CCCTGTTCTATACCCCCGGCGAAATTCTCTACGGCAAGCGCGAGACGCAGC
+NODE 4086 11 11 11 0 0
+CAGTGTTAACA
+CCCCTGATACC
+NODE 4087 51 79 79 0 0
+GTGTTTGTTCTGATCGCGTAAGATAATGCCCTGATCCCATAAGGATTTAAA
+CCCTTCTTTAAGCGGCTGCCTGCGGATTACGGTCGGCACCCGCCAGGAAAA
+NODE 4088 116 153 153 0 0
+TTCAGCCATAATCTAGCAGACGTAGCTTCACGGCACTGGCTTCTCAACCAACCGTATTTACCAACTGTATGAGATAACTGTTCCTCTCGTACAGTTGGTAAATACGGTTGGTTGAG
+AGTTGGTAAATACGGTTGGTTGAGAAGCCAGTGCCGTGAAGCTACGTCTGCTAGATTATGGCTGAAAGCATCTAAGTCAGAACTTGGGCGAACCCTATGAGTTTTCGTTTATTATT
+NODE 4089 51 53 53 0 0
+CCCAGCGCAGCTGGATATCTGTACCGCAGGAAGAAAAAGTATTTTTATGAA
+GCACTGCTGTGTTTCAATCACATACAGCGGATCGAGTTCGCTGAAGGCGAT
+NODE 4090 10 10 10 0 0
+GCGGGGTCGC
+AAATTTGTTG
+NODE 4091 139 244 244 0 0
+ACCAGGGCTGCACACGTACTACAATGTCTGGTACAATGAGAACCGAGACCGCGAGGTGGAGGAAATCTATAAAACCAGGCTCAGTTCAGATTGGAGGCTGCAACTCGCCTCCATGAAGCTGGAATCGCTAGTAACGGCG
+CTGAACTGAGCCTGGTTTTATAGATTTCCTCCACCTCGCGGTCTCGGTTCTCATTGTACCAGACATTGTAGTACGTGTGCAGCCCTGGTCGTAAGGGCCATACGGACTTGACGTCATCCCCACCTGCCTCCAATCTGAA
+NODE 4092 27 44 44 0 0
+GTCTCCCCGAAAGCTATTTAGGTAGCG
+GCCTTTCACCCCCAGCCACAGGTCATC
+NODE 4093 14 54 54 0 0
+GAATCCGTAGCCAA
+CGCACGCGACGTTC
+NODE 4094 51 63 63 0 0
+CAAATAGCCCTAATGGGATAGGCTCTTGGAAATGCAGAGAAAAAACGCCGC
+GACTTGCCATTTTGGACCTGGGCAGTGCTCGCCAAAACGCGTTAGCGTTTT
+NODE 4095 25 26 26 0 0
+ATGCTGTGAGCTCGATGAGTAGGGC
+CCCCTGTATCGCGCGCCTTTCCAGA
+NODE 4096 25 41 41 0 0
+GCGTTTTTACCACTGGCTTCATTGA
+TATTGGTGATGCTGTTATTATTCAT
+NODE 4097 47 52 52 0 0
+GAAAATAATCGTCTGCTGTTTTTTGCCGTCTGGAAAAATAGACACCG
+CTGCTGGTCTGGTTTGTCGGGCCGCTGGTGTCATTTGATACCCTGCG
+NODE 4098 51 57 57 0 0
+AGCCCTTTCACGGCGGTAACAGGGGTTCGAATCCCCTAGGGGACGCCAGCG
+TGTGTCCTGGGCCTCTAGACGAAGGGGACACGAAAATTGCTTATCACGCGC
+NODE 4099 51 92 92 0 0
+TGATCAAAAGAGTGCCAGGTAAAGACCCGTAAACGTGCTTTTTCTCACATT
+AGGCAACAGCATTTACCTCTATCGGGGTATGCATCTCTTACACATCCTGAA
+NODE 4100 44 44 44 0 0
+ACCGTCACTTTCGCGCCGATGGAGTCACCCTCTTTTTTCAGCGC
+AAAGCGCGTCAGCAAATTGAAAAATGCCAACCGGTTCTTTGTCG
+NODE 4101 51 57 57 0 0
+CCGTACTACGTGTACGCTGCGGTTTTTGCGCGCTGTCCGTGTCCAAACTGG
+GGAGGTTTGACTCGCTACGCTCGCCCTTCGGGCCGCCGCAAGCGGCGTTCA
+NODE 4102 12 24 24 0 0
+GAGATGCATAAT
+GGGTGCTTCCGC
+NODE 4103 43 70 70 0 0
+TGTCCATTTATCATTTTGACCTACAACGTCCTGCACATTAACC
+CCGATCCCGGTAAAAGCCCTAACTGTACCTCCGGCAGTCCAAG
+NODE 4104 47 47 47 0 0
+ATTCTGGTTATTAAACGCCACTGCCGTACCCGCAGGTGCAACCGGCG
+TTGAGAACTTTATTCAAACCGATGCCTCTATTAACCGCGGCAACTCC
+NODE 4105 11 11 11 0 0
+GCATCAAATTA
+CCCATCGGCGC
+NODE 4106 51 58 58 0 0
+TAGTGCAGGAATCAGGAAAAATAGCCCGACCGGGAATATTCACCCGGATGG
+AATCATGAAATCAGTTCTGCTTACCAGCCGGCAGCGATCGATAACCGTTCC
+NODE 4107 3 3 3 0 0
+ACA
+TCT
+NODE 4108 51 62 62 0 0
+ACCACGCCCTTACGGTCAGTGCGCGTCAGTGTCCGGGTAATGCCAGCGCCG
+TTTGTCTGCCGACACCCTGCCACAAAACAAGTTTTGCATCAGGGTGTCCGG
+NODE 4109 47 55 55 0 0
+CGTGGGCGCGGGGTGCGTCAGCCAGAACTGGCGCATCCCGGCGATGT
+AGGCTGCTGGAATGACGTGGGAACCTTAGAAATTCAATGCCATAATA
+NODE 4110 39 1251 42 0 0
+TCTTTGTTATAAATCAGGGAGAGGGCTTCAACGGCGATG
+ACCCGCCGAAAACCTGGGAAGAGATCCCGGCGCTGGATA
+NODE 4111 1 1 1 0 0
+G
+C
+NODE 4112 51 68 68 0 0
+GTCAGCGCGTCGGAAATAATAGCGTCTTCCGCGCCCAGCAACGTCTCAAAC
+CCCACGCGTCTATCATTGACGGCGTGCGTTTGTGTAAAGCGAAGCGCTATC
+NODE 4113 51 72 72 0 0
+AACTTCGTCACGCAACTGGAAATGGGAAATGAGTTCTTCGGTGCTAAAGGC
+TCCGTGGTGGAACGTCGTCGGCGATCGTAAATACCAGAAACAGAAGCTGGC
+NODE 4114 51 52 52 0 0
+ATATCACACTAAAATAATTCTATATTTCATAAATTATGATGATGAAGTTAA
+TGTTTGAGTGGCAACCATTCACCAGGCTGAGAATATGAAAACATTTTTCCT
+NODE 4115 4 6 6 0 0
+ATTG
+TTGT
+NODE 4116 17 21 21 0 0
+CCCCAGGCCGCTAATCC
+TATCAGCATGGCGGATG
+NODE 4117 51 92 92 0 0
+GTATAGCCACTCACGGCAAGTATACTTATTGCAAGAAATGTCCATAAATAG
+CCGGTCAGGTGATGGGGGCTTTTTCCGCGGTTTCTTCATTTACGGGAATGG
+NODE 4118 51 57 57 0 0
+CTGCCCCCTGGCGTCATCACCTCGGCGATCCCCAACTGGCGCATATCGCCG
+GTCGCGTGCGTCCCGGTATTCTCGCTGTCGATGCGCTGAATTTAATGCAGT
+NODE 4119 43 43 43 0 0
+ACTGTAATGCTCCAGCTTACTGGTCATTTCCGGGATGTATTCT
+GCTACAGGTTTGGCCCAGAAGGGAAAGAAAACTGTCGTCATTG
+NODE 4120 40 40 40 0 0
+CCAGGCGGCGTTGTCTGAAACAGGCAGAAATGAAAGGGCT
+CTGTGAAGCCTGGGGCGGTAGCGTGCTTTTTTCTGCTTAT
+NODE 4121 40 40 40 0 0
+CAGCGCCAGTAGAATCAGGCCAAGCCCGATACCGACGCGA
+CGCAGCGCCTGAAGATACGCATCCAATTGCTGACTCTGTT
+NODE 4122 51 66 66 0 0
+ATAAAGGCCAGCGATGCCGCAGTATTGTTATTTTTTATCAACTGCCATTCA
+TCGGTACGTTGCTGGGCTATGTCATCCCCTTATCCAGCGCGGCGATAAACT
+NODE 4123 51 60 60 0 0
+AGCAGTTGTTTCTACCTCTAAAGGTGTTATGACTGATCGTGCAGCGCGCCA
+TATACCCAGACCGGCCATAACTTTCGGCAGCTCATCTTTACGTTTGTAGAT
+NODE 4124 45 52 52 0 0
+ACCGTGAGCCGTATTGATGTGCTGGACAGCGACATCCCAACCGCC
+TGTCGCCGTTGATCCAGATAACCAGTTTACCTTCTTCAATTTTGG
+NODE 4125 51 62 62 0 0
+TTGCCCTATCAGCTTTGGATGGTAGGGTATTGGCCTACCATGGCTTTAACG
+AAAACTTGAATGATCCATCGCCGCACAAGGCATGCGATCCGCAAGCTTATT
+NODE 4126 51 52 52 0 0
+GGGCGTTTTTCCGCGAGTTTCCGGTCAGCATCAGGAATATTTACGGTTGAC
+CCCTTCGCGATAAATCATGACGCGTTCCGCCGTCTGCGGAACGGTAAAGGG
+NODE 4127 82 102 102 0 0
+TATTTAGCCGGTGTACAGTTTGAGGAGTAATTCCCTGCGGCTTTTTTACGTCCAAAATTTTGGACGTAAAAAAGCCGCAGGG
+AATTACTCCTCAAACTGTACACCGGCTAAATATCCAACCGTGCAGTCTTAACATTCATCCAGACGAATGCTAAGACTGCACG
+NODE 4128 11 1257 11 0 0
+TAGTGTTAACA
+ACCCTGATACC
+NODE 4129 51 70 70 0 0
+GGTTGATGGCGCTACCGGACGGCCAGACGCTGTGCGCCACGATACCGACTT
+CCTTCACACTGTTCCGCGCCGCGCTCGATATGGCTGATCGTTCCCGACAAC
+NODE 4130 51 92 92 0 0
+CTCTGGAGGAATACCGGTGGCGAAGGCGGCCCCCTGGACAAAGACTGACGC
+GCTCTACGCATTTCACCGCTACACCTGGAATTCTACCCCCCTCTACAAGAC
+NODE 4131 120 150 150 0 0
+TGCATGGCTGTCGTCTGTCCAGAGTTCCCGCCATTACGCGCTGGCAACAGGACACAGGGGTTGCGCATCGAAGCAGACCTCGACACTGATTCGTTCGAGGCAAGGGTCGACGACCTTCCA
+CGATGCGCAACCCCTGTGTCCTGTTGCCAGCGCGTAATGGCGGGAACTCTGGACAGACGACAGCCATGCAGCACCTGTGTAAAGCCCAACAGCAATGTTGGGCTTTACACAGGTGCTGCA
+NODE 4132 38 38 38 0 0
+ATAAATACGCGCTTCCGGCTTACGCATTCCCAAATCCT
+GAAAGAAGGCTTGGTTGTTTCCATTTTTACACCCCTGA
+NODE 4133 44 44 44 0 0
+AAGCGGACGAGACGACGCCTTTGTGTGGCCTTCCATTGTGCGTG
+TCCGTTACCGAGAATTGCAGCACCACGCAAGCGTTACGCGTCAG
+NODE 4134 51 58 58 0 0
+AAATAATCCGCTAACGATGTCATCGCCATCCTGCAGCCATACATTGAGTAA
+TCTTTTTCTTGCACCGGCATGTGGGTTAATTATTCGCTTTATGGTGGGATA
+NODE 4135 9 19 19 0 0
+CGACGATAG
+CACATCGTC
+NODE 4136 51 76 76 0 0
+AGCGTAAACGTTGCGATGCCAGTGGAACTCATCGCCACCCTCCGCTGCCGC
+TCCATTGAAATATTCGGTGGCGGAGATTTTCGACAGTATCGATCTCACCCA
+NODE 4137 37 37 37 0 0
+TCCGGGCGGCTAAGCTAATGAAGCGCATAAATTTAAT
+TGGTTGATGGTCCAGGTCTGCAGCTCGCCGTAATCGT
+NODE 4138 53 58 58 0 0
+GGGTATCGCAATAGTAATAGCGATAGCAGCGCGCCAACGACGTTTGGCGGGAA
+CCCCTCGTAGCCGCCATAAACCGACCATGACAGGTCGCTGTTTTCACCGCTAC
+NODE 4139 35 46 46 0 0
+TTGCCTGACGCGATTTAGAGGCATTGGCGCTAAAA
+GAACGTAGGGGTAATTATTGAGCGTGGCAATAATC
+NODE 4140 41 58 58 0 0
+ACGATGCCGACAGCCAGTTCATCCGCAGTAATTTACAGGAT
+ATTTTACAGGCGTTAAAAAGTTATCGGGTATCGTTATGAGT
+NODE 4141 43 77 77 0 0
+CGTTAAATCGGTCGTGCGGCAAAGTTTACTCGGCGATGCGCCG
+CGCCCAGCAGCAGATGCAGCGTACCGTCCACATGCAAACCGTT
+NODE 4142 6 6 6 0 0
+AGAGCC
+CACAGG
+NODE 4143 51 89 89 0 0
+TTGCTGCGCGATCAGACGATAGCTCAACGCGCCTTCCGGACTGTACACGAC
+AGTTGAATATTTTTCCGATCAGGCGGTCTCATGGTTTACGCAACCGGTATT
+NODE 4144 51 111 111 0 0
+GCATATAGTACAGACCCAATACCACGTCCTGAGACGGAACGATGATAGGTT
+CCCCGTGACTGTGTTAACGCCAAAGGCGAAGGCATGGTGCTGACTGGCCCG
+NODE 4145 7 7 7 0 0
+TCAAGCT
+CCCCAGG
+NODE 4146 42 42 42 0 0
+GGGAGCGGGCGGCGCAATGACTAAGGTATTCGCGTCCGTCGG
+GTCGACCAGCATCGACTTTAAATCGCCGAAATCGCCAATACC
+NODE 4147 43 54 54 0 0
+GTTCGCGGAGGCATTATCATCAATAGAAGGAATACCCTTAATA
+TGATTGTCGAGGTCGAAAATGCGCGTCTGGTACTGGGCGTGAC
+NODE 4148 51 68 68 0 0
+ATATGGTTTTTATTTCCTTAATTAACCAGAGTTAATAAAAATAATTAAATT
+TAGCTTATAAAAGCAAGGGGGAAAGTGTGATGTCTATTCCAGACGAGTAAT
+NODE 4149 48 55 55 0 0
+GCGGAGTTTCGTTTTGTCTCCGTCAGCACCTTATGAGAAATCACAAGT
+GCACCTTATGAGAAATCACAAGTCTTTGGGTTCCGGGGGGAGTATGGT
+NODE 4150 51 78 78 0 0
+AGTAAAACGTCCCATCGCCGTCGTTGTCACTATTGCTGCCGTCACCGTACC
+TCCACGGTGAACGACTGTATTGACGATGGCAATAGCGCCAGCGTTTGCGCT
+NODE 4151 51 60 60 0 0
+AGAGTCAAACCTCACGTACTACGTGTACGCTCCGGTTTTTGCGCGCTGTCC
+TCTACGCTCGCCCTTCGGGCCGCCGCTAGCGGCGTTCAAAACGCTAACGCG
+NODE 4152 46 46 46 0 0
+ATTACAGCCATCTCAATACGGGACGCCCGTATGATCCTGAAAAGCC
+GAAGCGTTTCAGAAATTTATTTCCGTACCGGAAAACCGTCAGTACG
+NODE 4153 43 46 46 0 0
+GATAGAGAGTTCGCCCTGACGGAACTCGCGCAGACTTTCCGCC
+GGTCTTTTCACAATCCTTTTTGCCGCCGCTACTACCGCCTTTT
+NODE 4154 51 80 80 0 0
+CTCTTGACATCCACGGAAGTTTTCAGAGATGAGAATGTGCCTTCGGGAACC
+GCAGGTAAGGTTCTTCGCGTTGCATCGAATTAAACCACATGCTCCACCGCT
+NODE 4155 51 73 73 0 0
+ATGATCGCCAAACATATGCCCATAGGCGTCATTAATTTTCTTGAAGTTATC
+TCTCTTACAGGCCGTTTCGCTGGCGCTGTTGAGTTGTCTGGAGGAAGATCA
+NODE 4156 42 63 63 0 0
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
+AATTGGGTACCAGGTTCATAAGAACCCATATTAAGGCAGCAT
+NODE 4157 45 51 51 0 0
+AAAACTAGTTTCCGGTGAAACATAAAAGAGCTGCTTGCCTAACGT
+CCACGCGGTCAATCATCGCGGAAGAGACCAGCGTTTTACCGACAG
+NODE 4158 51 110 110 0 0
+GCGCGCCGATACCCCTAACCAGGGAGTTTCATGTCGCCAGGAACCGCATCA
+CCCTGGCATCTGTGACTCTATGAAGCCATTTTTCGCGCCTTCCATGCCGCT
+NODE 4159 51 116 116 0 0
+GTTGCGTGGCGTCATCAGTCTACGGATGATTACATCGACTATTTTGCTGTG
+CCCAACACCCGCCGACAATAATGACAGGGATAGTGTAGGCCATTACGCCAA
+NODE 4160 39 39 39 0 0
+GGTAACGTCCGGACTTGGTGGACGTTTCCCGGAAGGGTA
+TGGGTCTGCTCGTTCATCTGTTCACGCCCTGCGGAAAGA
+NODE 4161 51 52 52 0 0
+GTAGTCATCAGCCACTCCACCACGCTTTCACGGAACTGTTTCGCTTCTTCA
+CCCCCCCGCACGACTGTCCGGTCTGTGAAGAGGGCGGTAACTGCCATCTTC
+NODE 4162 44 44 44 0 0
+CCGCCAGGGTTTTATTGGGCGCAAGCACCATCGTTGGCCGCTGC
+CTTCGGCGACTTAGGATAGTTTTTTACTACCGAGGCGAAATAAT
+NODE 4163 51 55 55 0 0
+CAGTCGTTAATAAGTACGGCGTGCCGCCTGAGCTGATTATCGACTTTCTGG
+GCATCCGGGCCGAGGATGGTGTTAGTCATGGTGTTGATCAGCGTAATATTC
+NODE 4164 43 126 126 0 0
+CCTTGTAGACGACTCTGACTTTGGAACGGGGTATTGTAAGCGT
+ACTTGATTCAGCATCGCCTCACACGAATTTTACTCCATGTGAA
+NODE 4165 1 1 1 0 0
+G
+T
+NODE 4166 51 67 67 0 0
+GGATTGCCGCGAAGCTTAACTGCGCGCCGGACGTGCACGCCATTAAAGAGG
+CCCGCCAGCTGCCCGGCGTCGTGATGCGCCAGCAGGCTTTCCAGCGCGGTC
+NODE 4167 40 40 40 0 0
+TACCGGATATCAGCTTCATCGCCAGCTATCCGGCCAGCCG
+GTTGTATGTCGCACAGCCATCGCTGATGGTACAGAAGGGC
+NODE 4168 46 46 46 0 0
+TCGTCCAGGCCGTTGTGGCGCACGCGGGTCAAGGAACTGTTTTTCC
+GAGCAGGAACTTTATGCCGCGCTTGACGCCGCATGGGTAAGCGAGT
+NODE 4169 2 2 2 0 0
+GA
+GT
+NODE 4170 1 3 3 0 0
+C
+T
+NODE 4171 39 48 48 0 0
+CATACGCTGGCGGTAAGCAATGGAAAGGGCTGATGACTC
+TGGCGCGATGACCGTAACCGATACCAGGTTGTGTTCAAT
+NODE 4172 41 55 55 0 0
+CAGCTGGCGCACCGTATCCGCGACTATCTGCCGGAGCAGGG
+TCATCCTGTAAATGCTTGCGCAATAACTGATCCACTTGCAG
+NODE 4173 5 15 15 0 0
+GTCAA
+AGTAA
+NODE 4174 46 97 97 0 0
+ATCTGCTCCCGGCAGATTTGTCGCTCACCTCAGTCACATAATTATC
+CCGTCGCGTGCGACGGCCCGTCAGGGCGAGGCCCATGGATGGGCCG
+NODE 4175 45 82 82 0 0
+ACATCCCACTTACAGACCTCATCCGTTATAACGCAAAGTTTCAAC
+TCTGTAAGTGGGATGTTGAGGGATAATTGGTATAACCAATGTAAA
+NODE 4176 50 60 60 0 0
+GCTGGGCAGCGAACGATTTGCCCGTGAGGTGCTTGGTCGTGCGCAGGCGA
+CCATAGAGCTTATTGTCGTGCTCGGTCAGCGTGAACGGGTCGCGCGTCCA
+NODE 4177 43 43 43 0 0
+CTGGTATGAACAAGGTATTCCTCACGGAGGCGTTATTGGGCTT
+GTAGTGGCTGGCCGGATACACAGGTAACTTAATTTCTGGCGGG
+NODE 4178 51 54 54 0 0
+GATCGTTCTGCTGGCGCTGGGTGGGTTGAAGCCGATTCAGACCGCGATTAT
+CCCGATGATGCCGACCAGCACCGACCAGCCGATACGCACTAACAGAGGCGG
+NODE 4179 43 61 61 0 0
+GCGCAGATCGTCCACCAGTTCGGCCGCGTCCATAAAGCCGAGG
+CGCCAGGGCAAAAACGTTCGGCAGAACGTGTAGAATTTCTTGG
+NODE 4180 5 5 5 0 0
+GAAAA
+GTTTT
+NODE 4181 20 36 36 0 0
+GAATGAGGGATTGCATCGTG
+CCCCCGCCTGCGGTATCTAT
+NODE 4182 45 80 80 0 0
+CAAGGGATTTGTCTAACCTGATATTTGAACTTGATTCAGCATCGC
+AAATCTAGGAAGCGTGGGCTGAATCTCAGCGGATCGTGGCACAGG
+NODE 4183 51 72 72 0 0
+GTACCCGCGCCAGGATGTACCACCAGATCGCGTGGGTTGTTGATAACCAGA
+CCCCGGACGGTACGGTACTGAACGCGTTGCTACATTATTATCCGCCGATTG
+NODE 4184 14 43 43 0 0
+GAATCCGTAGCCAA
+TGCTCACCCCAGTT
+NODE 4185 46 46 46 0 0
+GGCTGCGTCGATCTCAGCGTTATCCCCGGCGCCAGCCAGCGGTTTG
+CACTCTCCAGGGGTGGAAAAAGGTCGGTTTTGACGCCGTTATCTTT
+NODE 4186 46 62 62 0 0
+CCGCCGGGAATAGAACAACGCTCATTGAATGGGGCCATTCTCTCCC
+CCGGCATCATTGTAACCGAGCGCTCCACAGGCCATAGCGCTGATAA
+NODE 4187 51 113 113 0 0
+CAAGCCCGCAAACAGGAGCAGCAGGCCGGAAGCGAACCTGCCGAAGCGGTC
+GGGCGCGAGCGATAGCCGCCTCCACTGCGGCTTTGCGCGGATCGACCGGTT
+NODE 4188 37 37 37 0 0
+TTGCGACTTTCGTATTTAGCTACGAGTAATTAACGCA
+GTAACGCGCGCGACCATCTCCATTTCAAGATCGGTGC
+NODE 4189 43 43 43 0 0
+TGAATATGAACTGCTGGGGCTGTCACATCTGCTTGCCGGTATG
+TTCGGCAACGGCTCGCCGGTTTCATAGTGGCCGGAGATAAACG
+NODE 4190 23 39 39 0 0
+GCACACTATCATTAACTGAATCC
+GTATCGCCGGTTATAACGGTTCA
+NODE 4191 31 77 77 0 0
+GCATCAGAATTTGTAACCTGCAAGGGCGTGA
+ACCCGTCACGCTTTTGATGCCTTTTGGCAGA
+NODE 4192 23 23 23 0 0
+GTCCCTGTTGCGCAACGGCGACA
+CCCTGAGCCAGCCAGCGCTTTCT
+NODE 4193 43 46 46 0 0
+ACGGCGCGGTGCGTATCTGGCGTAAAGATACGAACGATGAAGT
+CATAGTAATGGCAACGGTTTTAGTCTCCACAATACATCTCCTC
+NODE 4194 6 7 7 0 0
+GCTGCC
+ACCGCC
+NODE 4195 51 157 157 0 0
+GGGAGAGGATCAGCGAAAACGCATGGAGAGATCGAGCGCGCGTACGTGCTT
+CCCCGATGGCGCTGCGCCGTCGGGTCTATAAATCACCTGTCCGTAGATCCG
+NODE 4196 44 64 64 0 0
+TTGACTATCGGCATGTCTGGTTCCCCCTGGACAATCAGTTTTAC
+GCGTCGCGGATGCATGAATTCAGCGATATGGCGGAAGTTGAATC
+NODE 4197 9 9 9 0 0
+TACTAATTT
+TCCCGCCAG
+NODE 4198 37 37 37 0 0
+AAGTGAAATCCGACCTGATGGGCGAGCAGACCATCCT
+TAAAACGGCAAGAAATAGTGTTAAGGCGCTGCGTTTC
+NODE 4199 51 53 53 0 0
+TAACGCATCAGGCTCACCCAACAGGCTGCTCGCAATATTGGCGGTAGTGGT
+ACGGCTTACCTGGTACGGTACTGCGCTTGGCATAGCAAACGAAGCGGAGGC
+NODE 4200 146 245 245 0 0
+AGGTTACAGCTAAGGGTTCAAATCCCTTCAGTTGCTTAATAATGGTTTCAAGCTAGCACAAAAGTCTTGGATAGATGGCTGAGCGGTTTAAGGCGACAGTTTTGAAAACTGTTGTATTTAATAGATACCGTGGGTTTGAACCAGTA
+TCGCCTTAAACCGCTCAGCCATCTATCCAAGACTTTTGTGCTAGCTTGAAACCATTATTAAGCAACTGAAGGGATTTGAACCCTTAGCTGTAACCTTGCCAAGGTTAAAGCTAAGGGTTCAAATCCCTTCAGTTGCTTAATAATGG
+NODE 4201 40 41 41 0 0
+CAAAACCGGGAAGTCATCTGGCGGAAGGCGACAATCAGGA
+TGTCTGAGCCACGGCGCTATGATGCGGCAACAGGTTGTCC
+NODE 4202 4 4 4 0 0
+TCAT
+GACC
+NODE 4203 38 62 62 0 0
+TTTGTACTACCTGACCAAAAACCAGTTGCTCAATGGCA
+GCGATCATATGGGACGCTATGGGCTGGCGGTGGTACGC
+NODE 4204 39 39 39 0 0
+GTGTTTGAAGTAATCGCCGAAGCTGAAGTTGCCCAGCAT
+TCCACTACCACGCCGTTCTGATCAACTTCGGCAATCACA
+NODE 4205 41 47 47 0 0
+ACACATTTCCAGTGCTGGTAAGCGCATAAGTATTTGCGCTA
+CCCTGCCGTTAGCTTTTATGCTTAGCCTGATGCTCTTTTTC
+NODE 4206 2 6 6 0 0
+GA
+AC
+NODE 4207 39 39 39 0 0
+CCCTTCAGATTCAAACTGATAAGGGCCTTCATTAATTTT
+TAACGCTCTGCTTCACCCCTTAATTCAGCAGGAAACCCA
+NODE 4208 1 1 1 0 0
+T
+C
+NODE 4209 7 13 13 0 0
+CAAAAAA
+CTTTTTT
+NODE 4210 14 23 23 0 0
+GGATTGTAGATGCT
+CCCCGCCATTTCAA
+NODE 4211 8 15 15 0 0
+GCCCGCCC
+CCCAGCCA
+NODE 4212 43 43 43 0 0
+ATGTACTGCCGCCAGCGAGTTGCCTACTGCTATCCCTAAATCG
+GGCAGATCGATCCGACGCAAATCCAGGTCGCTGATTTGGCGAA
+NODE 4213 44 81 81 0 0
+ATACCGTTCGGGAGCCGGATAAAGACGATCTGGTTTTTGAAGCC
+TCAACCAAATCATGCGCACATCCGTCACCAAACAGGATGCCCAT
+NODE 4214 51 63 63 0 0
+ACAACCACAATCCCGAGCCTTCACCGGACCATTCAATCGGTAGGTGCGACG
+TTTTCCTTCATTGGGAGTTGATCGCGAGCCTTCACCGGACCATTCAATCGG
+NODE 4215 46 82 82 0 0
+GCCCATAGCGATCGCCCATCGCGCCCAGTAATAACCCGCCGAACCA
+ATACTGGCGCTGGTCATTGTCGGGATTGTGATCGGCGTTGCGCTGA
+NODE 4216 37 37 37 0 0
+TAACGGAACACCAGGTCGATAAAGCCCTTTAACATGC
+ACGCGAGTTAAAAAACGCCTTCAGCTCATTTTACAGG
+NODE 4217 40 48 48 0 0
+GCGATAAGAACAAGAAATGATGAGAATATAGAAAAATTAT
+CCCGCATGCCACTTTTCATAAGTTTCTTTCTTCATAGCCC
+NODE 4218 42 42 42 0 0
+ATTACGTTCGCTGGTCTAAGTTCCCCTAAGAGCATAGAAGTC
+TAAAGGTGTTGGCCTGTTTCAGGATATGACACCAGAAGAGCA
+NODE 4219 51 66 66 0 0
+CGCATATAAGCATATAAGCATATAAGCATATAAGCATATAAGCATATAAGC
+GTATATGCTTATATGCTTATATGCTTATATGCTTATATGCTTATATGCTTA
+NODE 4220 7 39 39 0 0
+AGTGCCG
+ACAAATC
+NODE 4221 4 8 8 0 0
+GAAA
+GTTT
+NODE 4222 51 55 55 0 0
+CCATCCGGTAAGCCGTGGCGCGCTGTGCCCGAAAGGGGCCGGTTTGCTGGA
+GTCCGGGTCGCCTTCAATATGGTAAATCGCTTCTTTCGCGTTTTTTGCCCC
+NODE 4223 44 44 44 0 0
+CAAAGCCGATCGCGAAGAAGCGCGTGCTGCGGTTCGCGGCGGTA
+CCTCAATTTGATCGAGTAGCGTCCCCTGCTGCCAGGTAAAATCC
+NODE 4224 27 1230 57 0 0
+GGTCTGTTCGTTAACCGGTTCCCACTT
+CCAGAGTTGCCACTGATTTTGCCACCA
+NODE 4225 8 11 11 0 0
+CAAAAAAA
+CTTTTTTT
+NODE 4226 41 41 41 0 0
+TATTACTTTGCGCATTCGCATGTTCTGCTAATGATAATGTT
+AATATTCTCTTCATATACACTCCACCACCATTTCAATGTCA
+NODE 4227 36 46 46 0 0
+ATTGGGTAAAATCTACTTTGGCCCGCTCGCAGCGCT
+CAGTATATTCTCTACCGGTACGTCAAGCTCTTTTGC
+NODE 4228 45 78 78 0 0
+CTGCCCTGTGCGGATTGTGAAGGTATTGAAACGTCACTGTTTCTG
+TGCGCCATGCGCCTGATGCTGGTTTAAAATCGGCCTGCGCGGACT
+NODE 4229 26 62 62 0 0
+TTCGACCGACACCGATATGCAGCGCA
+CCCCCACAGCCCGCCAGCTCCAGCCC
+NODE 4230 14 682 28 0 0
+TGATTGTAGATGCT
+ACCCGCCATTTCAA
+NODE 4231 43 69 69 0 0
+TAGGAAGCGTGGGCTGAATCTCAGCGGATCGTGGCACAGGGCC
+ACTTGATTCAGCATCGCCTCACACGAATTTTACTCCATGTGAA
+NODE 4232 105 416 416 0 0
+GATTTCTCGATCAGATACCGTCGTAGTCTCAACCATAAACTATGCCAACTAGGGATCGGTGAATGTTGTTTATCGACTTCATCGGCACCTTATGAGAAATCAAAG
+TCCCTAGTTGGCATAGTTTATGGTTGAGACTACGACGGTATCTGATCGAGAAATCAAAGTCTTTGGGTTCCGGGGGCTCGCTAGCGTTCATCCTGAGCCAGGATG
+NODE 4233 40 40 40 0 0
+GCGGCCATCCCTCGCCCGGAGGCGATGGCCTCTACGCAGC
+TACTATTCCACAAGCGAGGATCGCTTCGTCAAACGGCTGA
+NODE 4234 51 77 77 0 0
+GATATCCGATCAGCATGTATCACAAACGTTGGTTTGAGGCGGCGCTTCGGC
+CCCCGCGTCTCCAAAGCCGATGGCTCGCAGTCTCTCGACCTGCAGCACGAC
+NODE 4235 38 39 39 0 0
+TTACATGAGTTAATGTGCTCAACGGTTTGACGTACAGA
+GCCGAGGTATTAAACCCCTGCTCGCTTAATGCCTGCAA
+NODE 4236 1 2 2 0 0
+C
+A
+NODE 4237 41 44 44 0 0
+GCTTAATACCGGCATCAGCACATCGCGCATCCAGCGCAAAC
+TTTGTTTGCCTGAAGGCGGCAAATGTGACCTCTATGCGCAC
+NODE 4238 42 42 42 0 0
+GCACATCAGCCACCAGCCGGGCGAGCTTTTATCGCCGGTTAA
+GTGCTGCTGGATTGTGCCACAGTTAAAAGGGTATCAACCTGC
+NODE 4239 35 43 43 0 0
+ATACAGAGACGCGAACACGCCACCCGCCAGCATAA
+CAGCAGCATCATGGCGATAATTTTGATGGAAGAGA
+NODE 4240 51 54 54 0 0
+GGCCGCCTCTCCTCTGCGGGGGGGTTATGTTCGCCTGAACCGTGTCACCGA
+CCGCCACAGGAAGGTGACTTCCCGTTCATCGTCTGCGCCGTTAATGGCTGT
+NODE 4241 39 63 63 0 0
+GTATTTTCCAGCGAGTCAACATCGTCATAGATCTCTTTC
+GCTGGCTATTTTTGCGAGCAGTGCCGACTGCGGCTGGGG
+NODE 4242 77 81 81 0 0
+AGGGTACAAAAACAACTCATTACAGTAATGAATACAACTGCAACAAGCATAAATCACATGTTATACTAAAATTACAT
+TACTGTAATGAGTTGTTTTTGTACCCTAATAATTTCCTCTTAAAATCTGTCTGTGTATAATGCTACTTATATAAATG
+NODE 4243 10 32 32 0 0
+CTTGCAGTTC
+GAACTGCAAG
+NODE 4244 6 7 7 0 0
+GAAAAA
+CTTTTT
+NODE 4245 45 45 45 0 0
+TGGTTCTGTGTTATCGCGACGAATACAAACTGGCGCTGGGCGAAC
+CACGTCAATCGCCGCCCTCGACGTAACGGAAAAATGCACGACGCG
+NODE 4246 51 77 77 0 0
+TATGTTTTTCTTCCTGTACCTGTCTGTGTTGTGCGGGCTCTACGGCCTTTG
+AGTAGATCAGGTAAAAGTCGCAGCCGACGAACAGGCTCCGGCTGAACAGTC
+NODE 4247 44 44 44 0 0
+GCCAGAAGGGTTCGTAAGGAAATAATCAGCACGCCGCCGTTCGC
+TATAAATCCTTCCCGGGCATCTTCGCGCGACAAAATGCGCAAGG
+NODE 4248 43 44 44 0 0
+CGTTTGCCGGGTTCGTCGGTTATGCGGTCATGAACCTTGCAGT
+ACGGTGATCAGCCAAAGCAATATTAAGGACATCCTTAATATAT
+NODE 4249 2 4 4 0 0
+CG
+CC
+NODE 4250 43 43 43 0 0
+GCCCACAACGTCTGTCATTTATTGAAGTGATGTTGCCAAAAGC
+CCGTCCGGGCCACTTCCGCGGCGTCTCGACTATCGTCAGCAAG
+NODE 4251 51 52 52 0 0
+GGGGTGTTTCAATGCTGAACTCCTATTCCGGTTGGGCTGCCGCTGCGGCTG
+CCCGGCATGCCCGCCCCGCCGATAGAGGCGACCAGATGCCAACCAAACGCC
+NODE 4252 46 46 46 0 0
+ATTGCCGATCGTGGCGAACTGACGTTGAATAAAGATGAGTTTAGTT
+CCAATTCGTTGTGGCGGTGTTGTAGTCATATCTTCTCCGGGGTTAC
+NODE 4253 51 57 57 0 0
+GGCTGACTGGCCCGAAAGAAGCTGAGCGTATCTATCGCGCAGGTCTGGCCT
+CCCATGCCTTCGCCTTTGGCGTTAACACAGTCACGGGTCATATAGTACAGA
+NODE 4254 44 50 50 0 0
+TTTTATAGCCTAATAACACAATACTTCAAATGATTTTTATAAAA
+AAACAAAGAATATATTCTTGTTGTGGTGTGGTATTTATTGCTAC
+NODE 4255 26 49 49 0 0
+TATTTTTTTTTTTTTTTTTTTTTTTT
+TTTTTTTTTTTTTTTTTTTATTTTTT
+NODE 4256 46 46 46 0 0
+GCAGCAGCTGATCCACCACGCGCACAAATTCGGTGATGCAGAGATC
+CTGGAAGGGCTTAGCTGTCGGATGATGGAAACGTCGTTCTTTATGT
+NODE 4257 40 40 40 0 0
+CGGATGAAATTATGATCTATGTGGCAGGACGCCAGATTCT
+AGGAAAGTCCCCGTTTCGATACGATCCGGCAGCACACGAT
+NODE 4258 1 2 2 0 0
+C
+G
+NODE 4259 5 12 12 0 0
+TAAAA
+TTTTT
+NODE 4260 5 9 9 0 0
+GTGGA
+GAAGC
+NODE 4261 15 15 15 0 0
+CGGGCGGCAGGATGA
+GTTTATGAAGAGGTG
+NODE 4262 51 63 63 0 0
+AAAATCCTAATGTTTATGGTAAACAATTTCCCTGCCAGAGAGTGGTCGTTT
+TTTTACACTACCCTCAAGTGGAGCAATTGCTGTCTACATAGGTATGTGCAT
+NODE 4263 40 40 40 0 0
+GATTCGCGATCGATGACGGTGACATCATGCCCCGCCTGAC
+GATACCAACGTCACTAAAGTGGTAGAAGATCGCGCCAATG
+NODE 4264 51 74 74 0 0
+GATGGTTTCCGGCTTTTTAACTTCACCGAAAGACCATGAACGGATCATGTC
+CAACTACCGTACGTTCAAACCTGAGCGTGACGGCCTTTTCTGCGCCCGTAT
+NODE 4265 35 124 124 0 0
+ATGTGGGCAGGTTTTGAATCCTACCCTGTCGGAAG
+AGGCCAGTGCCAATCCGGTTTGTGGCTTGGAGGCA
+NODE 4266 51 63 63 0 0
+GAGTACTGAGCTGGCGCTGGAATATTCATCAGGAATCCACCATGCACGCCG
+CCAATTTCATTTTTGTGTTTGTCATCCATTGACTCGCCGTCAATGCCGTCA
+NODE 4267 45 82 82 0 0
+GTAAAAGAAAGGCATAAAAAGCAGCGCAATAAGCAGGAGAACGGG
+GGGGAATAAAAAAAGTCTGTGCAAATCGTGTTATTATTAACGTTT
+NODE 4268 21 21 21 0 0
+TGGTTATTAACCACAACACCT
+GCCGGCTAACTCCGTGCCAGC
+NODE 4269 42 42 42 0 0
+CCCCGACCAGGATGATGTTCATCGCTGGCGTACGCCATTTCG
+TGAGTCATATTTTTCGCGTGATTGCCGCGATGGCCGCCGAAA
+NODE 4270 26 36 36 0 0
+GAATAAATAATGATGAAGCGCAAAAT
+CCCTGCCACTGCCGTCAATAAATTCC
+NODE 4271 51 60 60 0 0
+GATTTATATTCCATTCTCACCTCTGGGCGCGATGGTTGGACTGGAGCCGCT
+CCCTATCGCCATAATCAAGCCGGTCGTCAATAATACCGGCAACGTCGCCCG
+NODE 4272 16 31 31 0 0
+GTCCGGGAAGAAGCGA
+CCGTGGACGACTTCAC
+NODE 4273 3 3 3 0 0
+GAA
+ATT
+NODE 4274 4 4 4 0 0
+TGAT
+CCCC
+NODE 4275 20 3860 20 0 0
+TTTTTATACACTTCCGGCCC
+ACCCGACTGAGTTCAAACAT
+NODE 4276 51 59 59 0 0
+TCCACGTTTTCCAGCGCCGTAAAATCCGGCAGGAGATGATGAAACTGATAG
+AGATGCCATTATTGATTGGCAAAAAGAAACCGGCGGAGATTGACGCTCGGG
+NODE 4277 41 82 82 0 0
+TCTCCCCTTCCGGCGTCAGAAAAACGCCGCGCCAGGGGATC
+GCCTGCACCAATGGAGCGATCAACCTCAATTCGGCCTCGAT
+NODE 4278 46 46 46 0 0
+ACACCAGTAGCGAACCTTTCGAAATTGAAAGCCTGACGCTACAAAC
+TCCCGGCAAGCGTAGGGTGCCATTCATGATGCGGAAACAGCATTTC
+NODE 4279 44 46 46 0 0
+AGGCGGGCAATATTGGCTACAAAATCGCTCAGCGTCTGGGAGGC
+CCAGCTCCTCTTTTTTAATGCCGCAGCCATTGTCGCGAATACGA
+NODE 4280 44 44 44 0 0
+GGGGATTCATAATCATCAGCACATCGAGACCGCGAATCAAAATA
+GGCGGCGGACTCTCGATACCTTATCGTGAGGGAGAAGAGCCCGT
+NODE 4281 19 24 24 0 0
+AATGAAGGGTATAAACAGC
+CCCCGGCCCATCCATGGGC
+NODE 4282 51 53 53 0 0
+GAGCGCTGCCGGGCGCTTTCAGTAAAGGAACCCACACTATGTATATCGGGA
+CCGCTTACCGGTCTAATCACGACTACAGGCCGGGCTAACGCGGAGTCGCCC
+NODE 4283 8 8 8 0 0
+TTTATGTT
+ACCGTTCA
+NODE 4284 17 17 17 0 0
+CGATGAATCGCGAGAAA
+TCTTTCGTTGTTCTGTG
+NODE 4285 45 45 45 0 0
+AGTAATCCAATGCCGATCATTATGGTCACGGCGAAGGGTGAAGAA
+AATCCGGAAAGTGTGGCGCGCACGTTATCTGCTCGCTACTACAAA
+NODE 4286 41 53 53 0 0
+TTTTTCACAATGCCGCTCCACGGTTCGCCCTGTTTTAGGGT
+TAACCAGCCAACCAGCACCAGGGTCAGCAACACCAGCAGCC
+NODE 4287 50 92 92 0 0
+CTCCGCCAATCCCTTGTCGGCATAGTTTATGGTTAAGACTACGATGGTAT
+GCCTTGCGACCATACTCCCCCCGGAACCCAAAGACTTGTGATTTCTCATA
+NODE 4288 107 204 204 0 0
+TGTTCTATCTTCACCGGTTGGCTATGTGAGTAAGCATTTTACCTTGAGAAAAACAGAGTGTTCTATTATTCCATGCTAATGCATTCCGGACAAACCTGCCTGGAACA
+TCTGTTTTTCTCAAGGTAAAATGCTTACTCACATAGCCAACCGGTGAAGATAGAACATATGTTTGCAAGCAGATGACTGTCGGTATCTCTGTCTAAAGACGAGAGAC
+NODE 4289 42 42 42 0 0
+TTTCCGCCCCAGCGCCGGAATTAATCGCAAAGGCCACACCTA
+ATTATTGGCGTAGCGTCAAGCCTGGTTTTAATCGCTGCGATG
+NODE 4290 45 50 50 0 0
+ATAAACACCTGCGGAAACTCCAGCCCTTTGGCCGAGTGCAGCGTC
+TCTGGAAGAGGGGCTGGAGGACGGGCTGGCGCATCAGACGTTATT
+NODE 4291 6 6 6 0 0
+CAAAAA
+GTTTTT
+NODE 4292 51 74 74 0 0
+GCGTACTCGCCGAAAGCGTTCGGCAGGCCGGCGTTCGGGTGCGCGGGGACG
+CCCTCGACGCCGACACCATGGCGAAACAGATTCGCGAATGGGCGGAAGCGG
+NODE 4293 48 51 51 0 0
+AGGGCTGGAGTTGACGTTAAATATTAAAAACGACGTCCCGGATAATGT
+TATCATGCGACGAGTGGGCCAGCAGCGTAACCACTTCATCCAGCGTGT
+NODE 4294 51 71 71 0 0
+AGCCAGCATGGCGTACATTATGGTCAGGGCTGGTTATACAGTAAACCCCTA
+TTAGCCACTGTTCTTGCCTGGTCGTTTCGATGCCTTCTGCGACCATCTTGA
+NODE 4295 43 43 43 0 0
+CTCAGCTAAAAATTGACGCCGAGTTTCCCCGCTTCACACAGCG
+TGGCTCCATTACGTCATTAATACACTCTCTCAGGGGCAGAGTG
+NODE 4296 2 4 4 0 0
+GA
+AA
+NODE 4297 51 107 107 0 0
+GTTTGGTAAACCGTTTGCACAATAGGTTACGTCCCTCAATGTAAAGCGACA
+CCCAAATGCGCCGTAATGAGATAACACCTGCGCCGCCGATTTCCCGCCCTG
+NODE 4298 1 1 1 0 0
+G
+A
+NODE 4299 1 2 2 0 0
+C
+A
+NODE 4300 39 39 39 0 0
+AGCCAACATCTTGTTGCTCCAGCCTTTTTCTTTTATTGT
+CACTGGATAAAAATTGAAAATCAGAAAATCGACAGCTAT
+NODE 4301 44 44 44 0 0
+AACTGGGCGTAAAGTGGACGCTGGCTGACGCGACGCAAGCGGGC
+ACCGCCGCAGATTGTTTTACTTTTTCTGTCATGGTTTTCCCTGC
+NODE 4302 51 61 61 0 0
+GCCACTTATCAGCAAATCATGGCGGGCGGCATTTTGTGTGGCATTGGCTTT
+CCCCCTGCGGCAGATGCGCCAGCTTGAAACGCAGCGCCAGCCAGCAAAACA
+NODE 4303 37 45 45 0 0
+TTTTGCCGTGCGTTCCTCCGCCACGGCGGAAGATATG
+GAAAGTCACTTGTCAAATTTCTATGTGATGGAAATTA
+NODE 4304 42 42 42 0 0
+GAACATGTGGATCAGGAAGCCGACGCCGGTGACCACAGAGAG
+CTGGGCATTCTGGTGCTGCCGCTCAGTGTCCCGGTGCTGATT
+NODE 4305 7 7 7 0 0
+TCGAACC
+GCGTGAA
+NODE 4306 46 55 55 0 0
+GAGCTTTATTGAAGAGGATTTACGCCCCCATTATTCCGATATTCTT
+CCTCCAGCCGTAACGTATTCAGATTACAGATTTGACGTAATGTCGT
+NODE 4307 3 6 6 0 0
+GAA
+GTT
+NODE 4308 14 14 14 0 0
+CCGGCTTTACGGGT
+CCCCGCCAGCCAGA
+NODE 4309 43 43 43 0 0
+TATAATGAATTGGCATTGCTATATTTTTGCGTCAGCGTCTGTA
+AGGAAGGCTAATACCAGTTCGCTCAACCATTGCCTGTGCAGCC
+NODE 4310 31 45 45 0 0
+ATGCAATCAGCAGCGCTTTTGTTTTATCGTG
+GGCAGTGGCCGGCAACGAAAATGACGCGTCA
+NODE 4311 47 68 68 0 0
+CTTCCTGCAGTTTCTTGTTTTTGTCATTCACCACGCGAAACGTGATT
+CTTCTTGCCGAACTGATGTTTATGCTGTACGGAATTAGCGAGCTGCC
+NODE 4312 51 82 82 0 0
+GTACCTGCTGACCCTGGATATCCCGAGCTATCTGCCGGTCATGACCTACTG
+CCCTTCCTGCTCTTTGGCTTCCGCCTGGGCTTTAGCGGCGGCGAGCGCGCT
+NODE 4313 23 33 33 0 0
+AAAAAAAAAAAAAAAAAATAAAA
+ATTTTTTTTTTTTTTTTTTTTTT
+NODE 4314 51 60 60 0 0
+CGAACACGTAATTCATTACGAAGTTTAATTGATTGAGCATCAAACTTTTAA
+GCTCTTGAGACTTGGTATTCATTTTTCGTCTTGCGACGTTAAGAATCCGTA
+NODE 4315 4 7 7 0 0
+CAAA
+CTTT
+NODE 4316 35 37 37 0 0
+GAGTGGCTGATCCGTAAGGATGGCTGTATGCACTG
+GTAGGTGAACGCCAGTTCAGCTCCTTCGCGGTGCA
+NODE 4317 62 66 66 0 0
+TTACCCTCCTGCACCCCACATATCTACAATAATTGTATTCTTTTCGTTCAATCCCTGGAGCG
+GCAGGAGGGTAAAAAAAACCCCGCCGAAGCGGGTTTTTTTACGTTACTACAGATTACTCTGC
+NODE 4318 4 24 24 0 0
+CACA
+CCGT
+NODE 4319 150 204 204 0 0
+CCGTAAAACGGTCCAAAAGGTTCACCGTATCACCCGGTATCGGTAGGAGCGACGGGCGGTGTGTACAAAGGGCAGGGACATAATCAATGCAAGATGATGACTTGCACTGATTATGTCCCTGCCCTTGTTACGACTTCTCCTTCCTCTAGG
+TCATCATCTTGCATTGATTATGTCCCTGCCCTTTGTACACACCGCCCGTCGCTCCTACCGATACCGGGTGATACGGTGAACCTTTTGGACCGTTTTACGGGAAGATAAGTAAACCTTATCACCTAGAGGAAGGAGAAGTCGTAACAAGGG
+NODE 4320 46 46 46 0 0
+CCTGCCCACTTTGCCATGAATAATCTCTGCGACAATCAGGTGCCGA
+GCACATTCATCCCTTCGCGCATAATGACGCCCGCCCCCAGAAAGCC
+NODE 4321 11 11 11 0 0
+GGATGAGCTTC
+CCGCCGCCGCT
+NODE 4322 38 44 44 0 0
+TCGGGAAAGGTCGCGCATTTTGCGAAAAACTGGCGCAG
+CGCGTACATGGCCCGTGGCAGCCAGCGCAGGGGCATCG
+NODE 4323 51 62 62 0 0
+AATCAGCGCGCATCGTTTATCCGCGCTGACCGACGCCAATGAAATTATCGT
+TATGACCGTACGCCCTTCGCCCCACTGGCGCAAATTATGCAAAATCTGATG
+NODE 4324 37 37 37 0 0
+ACATTTTTCGCAGCTGCTTTTTTTTAACGTCATGCTA
+TAACGTCATGCTAATAACGTTGCTTAGAAGGGATAAT
+NODE 4325 39 40 40 0 0
+AGGGGCGCCAGTTATGGGAGATCTGGCCGGCGACCATCT
+CCGCTGGTGGCATTAATTACCGGCCACTGCGTCAGATCC
+NODE 4326 72 106 106 0 0
+CACTATACATCCACTTTCTGGGTTGGGAATATTAACCCAATTCCCTTTCGATAGAAGGGGCGCCGAAACGCC
+CCCAGAAAGTGGATGTATAGTGGCAACGGATTTCTCCTATCTCTTAGGATAGACTAACCCACGTCCAAATGC
+NODE 4327 51 54 54 0 0
+GTTTGAAGAACTACTGAGCTGCAATGTGTAGTGGCTGGATGGCGCGCTCTT
+CTACGACAACCTGAACGGTTGGGCGAAGAAAGAGAACCTGAAAAATTATGT
+NODE 4328 43 47 47 0 0
+CATTTTAATGACGCTGTAGATATTCTTATTCCGGATTATGCGC
+CGAATCTAACAACGCATCCGCCAGGCCAGTGATCAGGTTAGTG
+NODE 4329 51 73 73 0 0
+ACCAGACGCCCCAGTTCCAGTGATTCCGCCGTTCCCAGTTGTTGGCCAATG
+TGAACGCGCATCCTCCTGAGTTGCTGCGTTACGATCCCCAGGGACAGCGTC
+NODE 4330 45 45 45 0 0
+GCCGGCGGCAGCTACTACGATATCTTTCCGCTACGTGGCCTGGTC
+GACGATTAATAAAATAGCGAACAGAAAGGCGGGGATCGCATAACC
+NODE 4331 42 46 46 0 0
+CCAAGTTGCACGGCGAACAAAAACTACCAAACAGAATCGCTT
+GACTAAACGTGGCGAGCGGCGCCTGACTTACCTGTTTAATCG
+NODE 4332 36 36 36 0 0
+GCTGACCCATGAGCAGCTGCGCCAGCGTCTGATTAA
+ACGCCTGATTCGGAAAGTGAATAACTTACTCAAAAA
+NODE 4333 2 2 2 0 0
+GG
+TT
+NODE 4334 51 55 55 0 0
+CCGGTGGCGACGGGCGGCTGCTATTTGACCCCCGATATTGCCGTGAAACTG
+GATGCACCGCGGCGATCAGCTCATCCGGACTACAGCGTTTAGAGAGAAAAC
+NODE 4335 18 29 29 0 0
+GTCATCGCCGCTATCATC
+TGACGACACGCCCCCAGA
+NODE 4336 63 100 100 0 0
+CTGACAATGGAATACGAACTACTGCGAAAGCATTTACCAAGGATGTTTTCATTAATCAAGAAC
+ATTCCATTGTCAGAGGTGAAATTCTTGGATTTTTGGAAGACGAACTACTGCGAAAGCATTTAC
+NODE 4337 51 63 63 0 0
+CCCCCTTCCGGTCCCATAGCGTTTGCCATATAACGCACGTTGGCTTCCAGA
+GTCGCGTCAACGCCATCTCTGCGGGTCCAATCCGCACGCTGGCGGCGTCCG
+NODE 4338 105 140 140 0 0
+TTCCGCGCGCTATTGCTTATTATGCGACATTGCCTACAGAAGTCGCAGCGCGCGCCCTGGCGCAAGATATTGCTGCATTACCGTATGGCATAACGCTGGTCAGTA
+GCGCGCGCTGCGACTTCTGTAGGCAATGTCGCATAATAAGCAATAGCGCGCGGAAGCGTCAGATCATCACCTTGTTCCGGTAATCCCCGGCACACACGGGAATCG
+NODE 4339 35 43 43 0 0
+ACAGCGCCGCAAGACAGCTTGATCCACCCGCTGTT
+TTGATACTGCGGCTGCGGTGCTACCGGCTGCTGAA
+NODE 4340 51 82 82 0 0
+TATTTGTCCGCCATCGGCGACAGTAACTCCTCGGCGGTCACCGTCTCGTAG
+ACCGCTATAGCGGTCATCTGATTGACTTCAATGTGCGCGCCGAGCGTATGG
+NODE 4341 47 47 47 0 0
+CCGGTCAGGGCGCTTTACGTTTAGAACCGCTTTCTAAAGAGTATATT
+GGCGTAAACAAGAATGTATTCCCCCTGGATGGAAACGTTATCAGAAT
+NODE 4342 43 43 43 0 0
+TCTTACCCTGCCACTGCGCTTTATCGACATGCTGTACGGTTTG
+GTCTGATAAACGACCTTAACCCGCAGGCGGTCGAGCGTGCTAT
+NODE 4343 51 95 95 0 0
+GTCCGTTGGCGGTGGATAAAAAATACCCTCTACAGATCGTCATCCTTGACG
+CCCGCGCAACAACCATGCTCTCACAATGTGCCCGTTTTATCCGCCGCCTCT
+NODE 4344 3 3 3 0 0
+GGT
+GAA
+NODE 4345 46 57 57 0 0
+GATTACGCTAACGAAGCCGCGCTGACCACCGCCTTACAGGGCGTTG
+GAGCGTCTCCATCCAGTCGCGCTGTGGAACGAAGTTTTGCGGGGCG
+NODE 4346 45 46 46 0 0
+TTAGTGGAGACTTTTTTCAACGACCTGTTCCAGTTTTTTCAAAGT
+GGTTCCAGCATCGTTTTACCGTGTGATGTCGCTGAAGATGCCAGC
+NODE 4347 46 46 46 0 0
+TTAGACCTGCTGAGACGGCGCGATATTATCAGATCCTGAGACACCA
+AATTGGGAAACCAAATTTGTTACTAATTGTTCACCATTAAGATGAA
+NODE 4348 51 84 84 0 0
+GATCCGGAAATCTGCTGACGACTCTGTGTCCGCACAAGAAAAACAGACTTT
+CCCTGCATCAGCAAACTGCTGTACCAGGCGATCCACGGAAACCTGTCTCTC
+NODE 4349 46 46 46 0 0
+CTCCGATATTCCCGCCTTTTTTATTAAAAATTGTGCGGATATTAGC
+TGGGGCTATCTGGGCTATATTCTGAAAACTGGCGCTAACTGGAAAG
+NODE 4350 4 7 7 0 0
+CAAA
+ATTT
+NODE 4351 44 44 44 0 0
+ACTGCGCCGCCATCACCGCATCAATGTCTTTATACGCCATTGGG
+CAGGCGGGCGATCTGCTGGTCACCGACGGCGCGATGGGTATCAT
+NODE 4352 51 54 54 0 0
+GTGATTGCGGCAATACGCCGGCCATTTCGGCGATAAAATTATACCGTGATG
+CCCTCTTTGGAAGGGTCGTAACCCCCTGCATCATTCGTGTTCGTGACCAGC
+NODE 4353 33 69 69 0 0
+GTGATATCCCGGAACCTTATAATCCCGTGGCTG
+CCCTGCCGTAGCCTGGGAGCATAGCTGGCATAG
+NODE 4354 46 46 46 0 0
+CCGATTGGCGCCACCATCGCGACTGAAGAGGTGTTTTCGGTTCTGT
+CCGATACTCATAATGACCCAACCGGTGTCGGTACTATCAAATTTGA
+NODE 4355 39 77 77 0 0
+AACTGGGTCAACACCGTCTGCACGTTGTTTGGCGCGTGT
+ACACCATCACCCTGTTACAGATGGAAATTGAAGAGCTGA
+NODE 4356 37 37 37 0 0
+GCGCCGCTGTTGCTGTCGGTCAGGTGTACGGCCAGGG
+ATCGATAGGGATGATGTGATCAACAATCTTTGCAGGA
+NODE 4357 40 40 40 0 0
+CGCAGAACCGTGTCGCCGGACAAGTTCAGCAGCCAGTCGG
+TGGTCGTCGTATTGATTGGTCTGCTGTCAAAAACGAAAAA
+NODE 4358 19 19 19 0 0
+CCAGTTCGGTCCCTATCTG
+CCTTTAAATGGCGAACAGC
+NODE 4359 47 52 52 0 0
+AATATTACCTTCCTGCTGGCCGTTGGCGGCGGTTCCGTACTGGACGG
+ATTGAGCACATCGCTGCGGCCATCATCAGTGTAAAAGTCGAAAGGTT
+NODE 4360 27 40 40 0 0
+AGGTCACTGTCGATACCCAAATCGGCA
+GTCCCCGCTTTATCTTCGACTGACACA
+NODE 4361 51 54 54 0 0
+GTAATGGTAACTATCGTTCACGCGAAGATGCGAAAAGTCTGTTGCCGCTCG
+CCAAAGACCATAAACTCCAGGATACCAGGCTCATCGTTTGGAATTTCAACA
+NODE 4362 1 1 1 0 0
+A
+A
+NODE 4363 41 64 64 0 0
+ATTGTCGCCAGTTGGTCATGGTATTCGCATCAACGGCTGGC
+ATGGCTGCATTCCGCCGGGTTTGAAATCGCTATAGATGATT
+NODE 4364 47 47 47 0 0
+AACGTTTTTTGCCACCGCGTTGGGTTTAATGATGGAAAAAGTCCGTT
+AGCCATCAGTATTCTTCTCGTTCATAAAATCCAGCGCTTCTGGCACC
+NODE 4365 51 52 52 0 0
+GGTTACCCTCACGAGTACGTTCACCTACGCCCGCAAACACAGAGTAACCGG
+CACTTCTACCACGAAATGACCGACTCCAACGTTATCGATAAAGTATCCCTG
+NODE 4366 43 66 66 0 0
+TTCAAACCTGGGCTGGGTGGTCTGGAGCGATGTAATTCCCCGT
+CGGCAAAGCGCTAAAAGCAGCGAGCGTAGCGCGGGAAGAGCTG
+NODE 4367 51 55 55 0 0
+AGGTAATACTGTGCCGGATGGCGGGTGCGCCTTATCCGGCCTACAAGATTT
+TCTCGTTAACCCAAATCCGCATTTCTCCCTCGCCACGGTTGGCCCAGCTAA
+NODE 4368 40 40 40 0 0
+GTTTAAGCAGCTCGTGGTAAAGTAACGGATTAGACTTTCA
+CCCCCGCGACAATATATCGCCTGCTAAGCTTTTCCGCGCC
+NODE 4369 3 3 3 0 0
+GTC
+CCC
+NODE 4370 74 106 106 0 0
+GAATTATTGAGCGTGGCAATAATATGAAATAAAAATAAATAATTTTATATTTTTTAAACCAAACGGTTATATAT
+TATTATTGCCACGCTCAATAATTCCCCCTACGTTCGCCGCGCGCGCGACGGCGCCAGGCTTGCTCAGTTTGATG
+NODE 4371 51 60 60 0 0
+TGCTTTTATGCATTTAATTTGCGTAATCCGGATCGACTGCAACCAGAGAGC
+AAAAATTGCGCGACTCCGCATTCTTGATGAGTGAGGATTGTAATCATTGAA
+NODE 4372 43 43 43 0 0
+CCCGGACGTCCATGATTATGCTATACAGCTCACAGCGGATGGG
+GCAATCACCGTAGCAATGTCTCTGAGCGCCTGCTCAAACTGGT
+NODE 4373 37 37 37 0 0
+GTCACTCAGCAGGGATAACTTTGCCCTGTTGAATCGC
+CGTTAGCGCGTCTGGCGGCGCTGTCGCTGGCGATTGT
+NODE 4374 119 437 370 0 0
+ACGTTGCATTATCGACTTTGTCCGCACCTTATGAGAAATCAAAGTCTTTGGGTTCTGGGGGGAGTATGGTCGCCCATCCCTAGTTGGCATAGTTTATGGTTGAGACTACGACGGTATCT
+CCATACTCCCCCCAGAACCCAAAGACTTTGATTTCTCATAAGGTGCGGACAAAGTCGATAATGCAACGTTCGCCCATCCCTAGTTGGCATAGTTTATGGTTGAGACTACGACGGTATCT
+NODE 4375 41 41 41 0 0
+ATCGAACATCTGGGCAGCTATGCCTGCCGTAATATTTATCA
+CGGCGCTATCAGGTTATGCTCCTCGGCGATAGGAATAAAAA
+NODE 4376 25 25 25 0 0
+CGCTGATGCGTTGTTGGGTAGGGGA
+GTTAGCCCCGTTACATCTTCCGCGC
+NODE 4377 20 28 28 0 0
+GTTTTATACACTTCCGGCCC
+CCCCGACTGAGTTCAAACAT
+NODE 4378 14 16 16 0 0
+CTCCAAGTAGACAT
+ATTAAGTAGACCGC
+NODE 4379 51 56 56 0 0
+CACGGCGTGCATACGGTACTGGCCGGGTTTGTTGAAGTCGGCGAAACCTTA
+GGCGGTGGCGAACGTGCCGGGCAAGGAGGATCGAATCCTCACGGCGAATGG
+NODE 4380 51 53 53 0 0
+GGGCGGGCGGTTTTGGCCCCGTCCTCGCAGGGATCTTTTGTAACATGACCG
+CCCAGCCCCCCTGCCTCTTTTGAAATCGCCATCCGGGTGAAGCGATTACGC
+NODE 4381 45 45 45 0 0
+AGTGAGGCGGTGGCTAAAGCTTCTCGTCCTGGCACCGATATCTCG
+CCACGCAGCCCTTTACTTGACACCCTCTGTAAACGGCCAGTTAAA
+NODE 4382 51 91 91 0 0
+GGTCCATCGCCGCAGAAAGCATAGGAATATTCAGACGAATAGTTTTCGTCA
+CCCGTGACGGAAGCGCGCCTGGCAATTGCCCTGGCCCAGGAAGGCGGCATT
+NODE 4383 41 41 41 0 0
+TCACATCCTTCGACATTCAACATTACTGGGCCCACACTGCT
+TCGGCGTGATCATCATCCCGGCCATTCTGCTGCTGATCGGC
+NODE 4384 49 63 63 0 0
+AGTGACTAACAGAGATTGGTTATCCGGGCTGTATGTTACTTTACCATGC
+AGCCCGGATAACCAATCTCTGTTAGTCACTCTGCCCCAAGTCTGGATAG
+NODE 4385 40 40 40 0 0
+AGGGGATCGCTGATCATTGAAAAGCTGTCGGAATGCCAGA
+TGAATCTTCGCGATCTCCAGCAGGCCGGTTTTCAGCGGGC
+NODE 4386 35 35 35 0 0
+GATCGCTGAACCAGCCTGCAAGCAAAGTGATTAAA
+TACTCAATGGTGTGGCTGTTAAAACCATCCGCCAA
+NODE 4387 51 72 72 0 0
+ATCAAAAACATTCTGCCGGCACTGTACCGCGAAGCGCCTGAGTTTTATGAA
+TGCGCAGGTTCAGGTCAAAGGCGCGTTTAAATTCAGTGAGCGCGCGCAGCA
+NODE 4388 51 59 59 0 0
+ACGAGGAACTTGGCGAGGAGTTAAATGATGGGAGTCAGGTTTTTTTACAAT
+TCTCTAAAGTTACCATCCCATTGAGTTTGAGTAATCGCAAAAGTATTTGCG
+NODE 4389 46 46 46 0 0
+AACAGACGGCGGCTTACCGAGTCCTGCAACCCATACAGCCCATACC
+CTGTGCGGACCCGTATCTTACCGCCACGCTGATACAGCAGGCGAAA
+NODE 4390 11 20 20 0 0
+CCGTCGGTTCA
+ACCCCGCGCCT
+NODE 4391 124 253 253 0 0
+GCGAGCCGCTTCTACCGAGAACATGCTGAACAGCGAGTTCAGGAAGCTCGAAGAGTCTGTAGACAAGGCATTGAGCTTAAACAGGCAGAAAATCAGAGACGCTATCAGCGAACATACAACATCC
+TCAATGCCTTGTCTACAGACTCTTCGAGCTTCCTGAACTCGCTGTTCAGCATGTTCTCGGTAGAAGCGGCTCGCTCTTTCAGTTTCTTCTCGAAGTCTGTTCCCATTTGTAAAAGATTGCTCAT
+NODE 4392 42 57 57 0 0
+AGCAACGTGTTGGTTGACGTCAGCTACGAATAAAAGGATTTA
+TCCCCACCGGCACCATGACGCCCGGAATACTATTTTTCGCCG
+NODE 4393 51 54 54 0 0
+TGCTGCCGGAGATTAGCGAGGAAGAGAAGCCGTTTGAGCTGCCGGCGGGGT
+AGCTTTTGCTTTTTAATTTTCCCTTGCTTCATCAGCTTGGCCTTTTCCGCC
+NODE 4394 51 63 63 0 0
+CGCATAACGGACAGATTATGTCCGCGATGCCGCATCTATAGACTTGATTCC
+GGGGCGGGCGGCGGCGCGCTGCCCGCCAGCCACTGTGGAAATTCGCTAATG
+NODE 4395 9 9 9 0 0
+AGCAAAGAT
+CCCCGTCGC
+NODE 4396 44 44 44 0 0
+TCGCCTGCCACGACCGCAAAACCGCGCCCCTGCTCTCCCGCGCG
+CCTGTATGGTGAAATCGAGTTCTGGTTTGCGATGATCAAAGTCA
+NODE 4397 51 71 71 0 0
+ATTTTGTTAAAGCGCTGAAGCTGGAAAAACCGCTGGGGATGGGTTACAGCG
+TCCGCCATATCTTCCGTCATCAGATCATAGCTAAACGTTCCTTGCGGGTTA
+NODE 4398 37 37 37 0 0
+GATTCGCGCGGTTTACCGTATCTTCAAACATGATGTA
+GCATTCTTTGCGCGATATGTTATGCCTGGCTTACCGG
+NODE 4399 40 40 40 0 0
+AATGTCGACAGCCTATTAATTAAATAGTCATTTTCTATAC
+TCAGAAAGCGGCGATATGCAGTTTCATCTGGCCATTGCCG
+NODE 4400 41 41 41 0 0
+TAACTGCCGGTGCAAAATCTCCGCCGCGCGCTGAAAATACC
+TCCGCGCTGTTTGTCGAACAGCAGGCAAAACCTTTAACAGA
+NODE 4401 24 26 26 0 0
+GAAACGTGGGCGATACGCTATGGT
+CCCACCAGTCCCGCCCCTTTCACC
+NODE 4402 40 40 40 0 0
+CCCTTGAAGTCAGGCGCGTGATAAGTTCGTAAGCACTTAC
+CCGGACCCTATCACCCATTTGCAAACCGTCGCGCCGCACC
+NODE 4403 44 69 69 0 0
+GCTTCCCGCCTGGTCGCTTTTCGTTGTCCTGATAATCGCCATTG
+TGGATGCCGCATTGCAGGATGAAGTCGCCGCCAGCGAAGGTTTC
+NODE 4404 1 2 2 0 0
+G
+T
+NODE 4405 51 75 75 0 0
+ATTTGATCGGCCATTGTCGTGATCTCTTCCTGCTGTGCCTTATGGTTCTGC
+TCACGGCTGAACTGAACGCAGATAAAGACAGCGGCCAAAGCGTACCGCTGG
+NODE 4406 67 80 80 0 0
+AATCGGCGCTACGGCGGTTCACTTCTGAGTTCGGCATGGGGTCAGGTGGGACCACCGCGCTAGTGCC
+CCGCCGTAGCGCCGATTGTAGTGTGGGGTCTCCCCATGCGAGAGTAGGGAACTGCCAGACATCAAAT
+NODE 4407 4 4 4 0 0
+GGTT
+CCCT
+NODE 4408 12 12 12 0 0
+GGATAACCGTAC
+AATCGCTAGCAC
+NODE 4409 117 178 178 0 0
+AGAATGACATACTGAAGTCGCTGAACAAGTATGCGACAGATAAAATGCGTGTTGGCCGGGAAGGTTACGAGCGACTTCAGTATGTCATTCTCACTGAGCCCGAACACGGAACGGCCT
+TAACCTTCCCGGCCAACACGCATTTTATCTGTCGCATACTTGTTCAGCGACTTCAGTATGTCATTCTCACTGAGCCCGAACACGGAACGGCCTGAGGCCACATCGTTATGATACTGA
+NODE 4410 52 56 56 0 0
+TGTCGCGTTTTTCATTCATTTTTTGCTGTGCCTTCCATTGCGAAAGATGTAA
+CAATGGCACAAGGGCAGAACAGAAACCGGTGCAGGCGCAAATGCAAGTAACG
+NODE 4411 4 4 4 0 0
+GAAC
+GAAA
+NODE 4412 51 60 60 0 0
+ACTATGACGGTCTGTTGTATAACACTGACTACATCAAGAAAACTCTGGATG
+TTTGAGTTAGTAATAACAGCGTGGACCGGCCAGGTTGCGTTAGGCGTCTCT
+NODE 4413 51 63 63 0 0
+TGCACGGAGTTAGCCGGTGCTTCTTCTGCGGGTAACGTCAATTGCTGTGGT
+AAGCAGCCGCGGTAATACGGAGGGTGCAAGCGTTAATCGGAATTACTGGGC
+NODE 4414 43 69 69 0 0
+CGGTTCAGGCTAAAGCCGGGCGTATTTTAGCTGTCGACACGAA
+TTCGTCGCAGTATTCCGCCACCACCTTTTTCAGGCGCTCGCGT
+NODE 4415 14 14 14 0 0
+CCCTTGGCAAGGTC
+ATTTGAAAGTGCTT
+NODE 4416 46 56 56 0 0
+CGAGAACAATTCCTGTAATAGCGAGCCATCTTCCTGATAGCTGATC
+TTGCTTGGCACTGGCCTGGGCGGCGAGAGGTTATCGCCCGTTGAAT
+NODE 4417 44 88 88 0 0
+CGCTGGAAGGCAGGTAAATCAGGCCGCTGGTAACGTTACGTTCA
+CCTGAAAACCCCAATGATCCGTCGCCAGCGTGGCGGCAAACTGG
+NODE 4418 29 29 29 0 0
+TGCCATTCACATTTAGAGATCATCCGGCA
+TACTCACGCGTTGAGAGACTTTCAGTTCG
+NODE 4419 51 64 64 0 0
+GTGTCTGATGAAAAGTGAATAGCAAGGCGTCTTGCGATTGAGACTTCAGTG
+CTCTGTGTGAGCACTGCAAAGTACGCTTCTTTCAGGTAAGGAGGTGATCCA
+NODE 4420 8 9 9 0 0
+GGAAGTGG
+CCCGGCTG
+NODE 4421 45 57 57 0 0
+AATATATTGTTGCATTATTGGTGTTTTGTGTTGTACTTAGTAGTA
+GGTCATTCTCTCAGAATTGCTGTGGGTGTGGTTGCCGGGAAGTAT
+NODE 4422 42 42 42 0 0
+GTTCATAATGATTGCATCAGGATTTTGCCACCCGCTCCCGGT
+CCCCGCCAATTAAATTGGCCCACTTGCACAGCGCTTGATAAT
+NODE 4423 43 43 43 0 0
+CCGGCGTCACGCTGCACTTACATATTCCCGAAAGCATTACGCT
+AAAGCCCGGTTTGTACCCGCACGCTTCCAGTATCCAGGTCGCC
+NODE 4424 38 38 38 0 0
+CTCATCACCGAGAAAATCCGCCACGCCTGCGGGGCTCA
+CAGTACCAGATTAAGATCGTCGCGGCTGAGGTCGTTTA
+NODE 4425 51 70 70 0 0
+TAATCCGTGGCGGATGCGTACCGGCTGGCGCGCGAATTACCCGACATTAAA
+AAACAACAATAAAAAGTTTATATTTATCGGTAACGCCGCTTTTTATCGCTT
+NODE 4426 18 35 35 0 0
+GATAAGAATGATTAGAAT
+CCCCCGCCCGACGATGGC
+NODE 4427 39 39 39 0 0
+CCACGTGAAAAAGATGTCCTGATGTTGACAGAATATGTC
+ATATTCCCGTCCAGCCAACACCTTCTTTTGCCAGCCCGG
+NODE 4428 51 52 52 0 0
+TGCTCATTGCCTGCCGCCACGTCAAGGATGACGATCTGTAGAGGGTATTTT
+AAAATGTGAACGCGCCGATTTTATGCCCACGCCGTTAAAAAGATACGGGGG
+NODE 4429 35 55 55 0 0
+GTTTTTTTTGCTAAAGATACTCAACATATTTTGCT
+TCCCCAGCCGATAATAATGGAACTAATCCATTTTC
+NODE 4430 51 116 116 0 0
+GATTTACCGAACGGGAAAGTGGTTAACAGCGCAGGGCGGCCCGTGATATTG
+CCCGCGGTAAGGCGGTATCTGAAGTCGCAAAACGCGATCCGGGCTATTTAC
+NODE 4431 51 77 77 0 0
+AGGCTACTACAACTGCGATTTTACGCAGTGAAGAGTTTGGCTGAGCAGTTT
+TCAGCGGTTAGCGGCATGTCTGTCTATGCACAGGCGGCGGTTCAACCGAAA
+NODE 4432 40 40 40 0 0
+GCTGTATAACGCTAAAAGCTACGTATCGGTGCGCAAAGGT
+ATTAATGCCATGTTGCAGGACTATGAACTGCAGCGCCGAC
+NODE 4433 42 55 55 0 0
+GCTCTGTGATGAATGACCAAATTTATCAGCGGATAGAAGACA
+CCGATTCCCCAGATAAACAGCGCCAGTAACAGCAAAATGACG
+NODE 4434 91 102 102 0 0
+AATCCGGCTTTCGCCGGATCTGATATCGGCCGCTCCAATAGCGCGGGGTCTTGCGATCCCCCGCTTTCACCCGTAGGTCTCATGCGGTATT
+CTATTGGAGCGGCCGATATCAGATCCGGCGAAAGCCGGATTAATACCGCATGAGACCTACGGGTGAAAGCGGGGGATCGCAAGACCCCGCG
+NODE 4435 43 43 43 0 0
+GCTGTTGCAGCTTTTCCACCAGCCAAATGACTACCGGGGTTTT
+CTGTTCTGATGTCTAAAACCTTCGATAACGGCGTAATCTGTGC
+NODE 4436 35 35 35 0 0
+GTTTTTTTTGCTAAAGATACTCAACATATTTTGCT
+CCCCCAGCCGATAATAATGGAACTAATCCATTTTC
+NODE 4437 5 10 10 0 0
+GGCTC
+ACCGC
+NODE 4438 51 98 98 0 0
+GGAACAAGGTGTCGCCGTTAATCTGGCGGCTAGTCGCCGCTTTGTTACCTG
+CAAGTGGGAACCGGTTAACGAACAGACCATTTTGCGGTTGTGACCTTGCCC
+NODE 4439 44 49 49 0 0
+CGGATGCAGACCGCCTTTCTGGCGAATGGTGCCGATTTTGTCGC
+GGCGCTGGAAATGGTGCGCTCAGGCGAGATTCGGGACGGTAAGA
+NODE 4440 11 11 11 0 0
+TTTTGGACGTG
+GTTCTCATTTG
+NODE 4441 3 3 3 0 0
+AGC
+AAG
+NODE 4442 11 11 11 0 0
+ACATCAAATAA
+CCCATCGGCGC
+NODE 4443 49 59 59 0 0
+GGTGCTTATTTCTGAAATATTCCCTAACCGGATGAGGTCGCAGGGAATG
+GCGTAGAAAATCATAAAGAACAGCATACCAAATAGCGCGAAATAACCGG
+NODE 4444 51 69 69 0 0
+TACGCCTGTGAATGTCCTTTCGATGTTTTCAGTTATTACCCTCCTGCAGAA
+AAAATCCAGAACCGCAAGCCTCTACTTTTCCCTCGTGATGGAAGGTCTTGC
+NODE 4445 51 58 58 0 0
+GCAGCGCCATACCCGCTTCCGGGATATTGGAGAGCAGGCCGCCGAAGCCAA
+CCCGCGCTGGAGAGCCTGCTGGCGCATCACGACGCCGGGCAGCTGGCGGTG
+NODE 4446 45 45 45 0 0
+AATAAACAAATCTCCCCTGAACATCAGGCTATTCTGTCGAAACGT
+TTGGCGGCATTGTCGGCTGGTGCGATGCCGAAGGAAACGGCGAGT
+NODE 4447 42 64 64 0 0
+AGTCCTTGCACGCTCACGATGCAGGGGACGGGGATTGCCGAA
+CCTACCATAATGATCGTATGCAGCCAGGCCATTTTTTCGATG
+NODE 4448 42 74 74 0 0
+GGCGTGGGCGAAAACCACTGGGGCGGCCTGGCCGAACGCGCA
+CAGCACATCAAGCGCATACTCCCCGACCCCTATAAAACTCCA
+NODE 4449 43 65 65 0 0
+ATTGATAGCCCCGACCGCGCCGCTTTGATCGAGATTGATCGCG
+CCCCTCCTATGGCATTAACCGATACCGCTATCCGCAAGATCAA
+NODE 4450 35 35 35 0 0
+ACTCCGATTATTGAAGCGTCATCAGGCTCAACGGC
+TTCGCCGGGAATAAAGCCCGGTTTACCTACGGCGA
+NODE 4451 51 62 62 0 0
+GATTTTTATGAATGCAGAAGGCGATCTTTTTGCTTGTCATATCAGCAAAAT
+CCTTTTTCTTCCTGCGGTACAGATATCCAGCTGCGCTGGCCACTGCTGTGT
+NODE 4452 45 45 45 0 0
+CGGGGCTGGCGACGGAAAGCCTGTCGGCGCATATCGGGCAGCGTA
+ACCGGCTCCGGAATCGTATATTTCTTCAGTAAGGAGACAGACTGG
+NODE 4453 45 53 53 0 0
+AAATACGATTAATACGGCGGTTCAACAGCGTACCACGGTAGGGCT
+GTTGGCCGCCAGCAGATCATCACGCAGCGCTTCCGCCACACGAAG
+NODE 4454 43 43 43 0 0
+TCATAAATTTGCCAGGTAACATACCGCCAGGTATCCACGCGTT
+ACCGTAAACAAAAACAGCGTGCCGAACGATCCTAAGAGCCCAT
+NODE 4455 38 38 38 0 0
+CATTGTTTTTCAACAGCGGCCCGACCACGATACTGGCG
+CCTTTAAGCCGGAAGACTGGGGGATGAAGCGCGGGACT
+NODE 4456 24 24 24 0 0
+GCAACACCTTCCTCCCCGCTGAAA
+TCCCGCAGAAGAAGCACCGGCTAA
+NODE 4457 51 56 56 0 0
+CTAGCAGCGACCCGGATGATCAAAACCGTAACTGATGTTCTTAGGTTAACG
+GAGCGATGAGGAGTAAGCCGCCTTTAGACGTAATTGGCAAATTAATCCATT
+NODE 4458 51 60 60 0 0
+AGCGAAGCATTTCTCGTTCATCGCACTTCACGAAAAAATCATGGCCTGCAT
+TGTTTTACCGCTGAAGCCGATCAGCTGGAGCTGCTCTCCCGCAGTAAAACC
+NODE 4459 15 15 15 0 0
+GCACAACCGCAAAAT
+CCCCTGCCATGTTTT
+NODE 4460 12 12 12 0 0
+GATAGCGTTCCC
+CCCGTCCTGCCG
+NODE 4461 47 63 63 0 0
+GTATATCGGCACTAAAGGCTTTACCCAGCGCTCTGGCATCTTGCGCA
+TTACAATCTCTATTCCAGTAATACGGTGCGCACCATCCAGTCGGCAA
+NODE 4462 51 76 76 0 0
+ACAAGCTCTTTTTCAAGCTGCCGAATATTAAAACTCACTACCGCTTTTGTT
+TCGTAACGTTACTGCTACGTTCCACCCGACGATTGACGCTCACAGACGCTG
+NODE 4463 51 57 57 0 0
+ACGTGCTCTACCAACTGAGCTATTCCCGCAAATTTGTTGCTGTCGTAATTC
+TCCTTGCCAAGGTCGGGGTCGCGAGTTCGAGTCTCGTTTCCCGCTCCAAAT
+NODE 4464 40 40 40 0 0
+GTAGCCTGTATTCCAGTTGTACTGGCCTTTGGCGCTTAAT
+TGAAAGGCTGGTAAGTTTTAGGCTGATTCCACAATCTGTA
+NODE 4465 28 28 28 0 0
+GTGCGCTCGTTGCGGGACTTAACCCAAC
+GTTAGGCCGGGAACTCAAAGGAGACTGC
+NODE 4466 40 40 40 0 0
+GATACAACTCATCCACCTTATCCTGGCAGTCCACGTAGCT
+TGAACAGTATGGGATTTACCGGCGTGTTGATCGATCTCGA
+NODE 4467 36 69 69 0 0
+GCGGTAGCTGACGTACTGCAGCTCGGAATTACCGCT
+TTTTGACCGACTGGATGCGGACATCGCCCATGCGCT
+NODE 4468 41 41 41 0 0
+CCAGTGACTGAAGTATTTCTTCGCGACGATTCCTTTTCGCA
+CTGCTTCAATCATTGAATCACCCGTGGCTTTGACAAAATAT
+NODE 4469 8 8 8 0 0
+ACTATACC
+CCCCGCCA
+NODE 4470 39 61 61 0 0
+CGAAGAGAGCTGTTCGCGCTGCGTGCGGGTATGGCGTTT
+CTGGACAGCTATCGACAGTTGTTGGATACGTTATTTGCC
+NODE 4471 42 42 42 0 0
+TATTGATGAAAGCAAATGCGGGAAGCTAAGCGAAGCGTTCGT
+GTCGTCATCGACCGTGATCGTAATACCGTCTTTATCCACCGA
+NODE 4472 42 42 42 0 0
+TGCAGTTCCATTACGCGGTGGGGCTGGCGCAGATAACTGTCA
+CACAGATCGACCGGTGATAATTCGCTGCGATGCGCCTGGCGT
+NODE 4473 7 7 7 0 0
+TTTTGAT
+CCCCTCG
+NODE 4474 41 41 41 0 0
+GTAATCGAAATGAATAACTTCTACACCCTCACCGTTTATGA
+AGCGCTCATGGAGTTACGAAACACCGCGTTTCATCTGTTAC
+NODE 4475 45 60 60 0 0
+ACCATATCGTCGTGCTGCCGTTGTACCCGCAATACTCTTGCTCAA
+ATATGGTCGACGTCGCTTGCTAACAGTTCATCGACAGCGCTTTCC
+NODE 4476 43 43 43 0 0
+ACGCTGGTGACCTCCTTTATCGCACTGCTGATCGCTGTTCCGG
+GCGCACCAGCCCATACCACAAGCAGGGTAAAAACAGTAACCAC
+NODE 4477 47 75 75 0 0
+CCTCCAGCGTTACGCGCTGCAAATACTGCTTTTCCGGCAGCGCATAA
+CCGCGACGCAAATCGTCATCGTCCATCGCTGGCAGGTCGTCATGGAT
+NODE 4478 44 44 44 0 0
+ATCCGGCGTCGGCTATGCGACGGCCATCGGCGCGATGATCATTC
+GTGTTTGATGACGCTAATGTACGCGATCGCGCGCTCACCGACTG
+NODE 4479 2 2 2 0 0
+TA
+GT
+NODE 4480 5 5 5 0 0
+TAAGC
+CCGCA
+NODE 4481 1 1 1 0 0
+A
+T
+NODE 4482 40 60 60 0 0
+TAGCGTCGTACAGCGCACGCTGTACTTCCGCAATGCTTGG
+AAGCGTAATTTCCCCGGAATTATAATTAAACATCGTTTCT
+NODE 4483 4 4 4 0 0
+TTAT
+GCGA
+NODE 4484 41 55 55 0 0
+GCAAAAACAAGGACTGGTCGAAGGTATTAGCGCGGATTCCG
+TGGTGAGCGTCTTGATGAGTATGTGGACTCCAGCTTGTTTT
+NODE 4485 40 40 40 0 0
+ACGCGCGCCTTATTTATAGAGGTCGGCGCTGATGGTGATG
+TACCAGGCAATAAATCCGACGATTCCTACCACGCCGAGGA
+NODE 4486 41 51 51 0 0
+GGTATACATATCTTCACGGGAAGAAATATCCCCTTCGGCAG
+TGCCGTCGGCATAATTTTTACCAGCCCACGGTAGCTGTTCT
+NODE 4487 1 1 1 0 0
+G
+C
+NODE 4488 44 68 68 0 0
+ATGAAGTAACGGGTTCGGACGCCAATGTGTATCCGCCGATGAGT
+CCGATGCACGCGCCAGATCGCCACGTTGCTCGATAATCGCGTCC
+NODE 4489 4 4 4 0 0
+CCCT
+CCCC
+NODE 4490 51 96 96 0 0
+GTTTATCGAGCAATGGCGTGACCCTGAGTGTGGCGGCGTTCAGCCGGGGGT
+CCCCGGCAGGGTAGCTATAACACGCTACAGTTTGAAATTCGCGGACAAATT
+NODE 4491 36 36 36 0 0
+GGCGCCCATTCCACCTGCCGCGCCCGCGCCGGGAGC
+ACATCTGTCATGCTGTTCCTTCCTGCTACAGTTTAT
+NODE 4492 43 69 69 0 0
+TCGCTAAACGTCGGCAACGAAGGCGCGATAAAGCCAGCCATCG
+CCGGCGTATTGGGCGGATGCCAGCAAAGCCGATCGCGAGCTGA
+NODE 4493 51 65 65 0 0
+AATATTGTCACCACCTGTAGGAACGTTGCTCTCTGGTTGCAGTCGATCCGG
+TCCCTACTATCCTCTCAAAACAACATCATTTTGATAACAATTAATTTACTT
+NODE 4494 4 8 8 0 0
+TGGC
+CCCC
+NODE 4495 7 375 7 0 0
+TGTCAGA
+TCCTGCC
+NODE 4496 40 40 40 0 0
+ACGCCATGTTGTCGCGCAGGTAGTCAAAACCGTATTCGTT
+GATCATTGCGATTGCCATTGGTTCCGGCGCCATTGGCTGC
+NODE 4497 41 54 54 0 0
+ATACAAACTAACGCCTCTTTTTCGTTAATGTCATTGCTGGA
+AAGGCGCAATTGAAGATAGCGTCCACCGCTGGCAAATCCAG
+NODE 4498 40 40 40 0 0
+GCCTGGCTGGAGAGCTACGAAATCCGCCTCAACCCGGTGT
+AGTTGAACGGTATACAGCGTTGGCGTAACGTCAATAATCT
+NODE 4499 39 39 39 0 0
+GGCCAGTGCAGCATCGGCGTTTCTACGAAGATCAACTGC
+AGGACTCAGGTATTCAGGGGCATATGACTGATAAGCAAT
+NODE 4500 29 31 31 0 0
+ACCGGTGACCTGCACCCACTCCCCGGCCT
+CCCCTGCTGCGCCTGCTGACCGGGCTGGC
+NODE 4501 35 35 35 0 0
+AAGTATGGCCCCGCTGTTGTCGCGGCCTACAAGCC
+TTGTGGCTTGGAGGCAATAAAGTGAACTATTCTGC
+NODE 4502 40 46 46 0 0
+TTCTCCGCCTTCATTCCCCAGGCCAGCCGCGCCCGATTCA
+GTGATGTTGAAAAGCGCTCTTTGGCAGCGGGACGTAAATC
+NODE 4503 51 85 85 0 0
+GCTCTACCGAACTGGGCGGTGAGCGTATCGATATCGTGCTGTGGGATGATA
+CCCGCCTGAACGCGCGCGCCGCGCATCCCCACGCAAGCGCCGACCGGATCG
+NODE 4504 17 32 32 0 0
+GTATAACGGTTCATATC
+CTCGTCACACTATCATT
+NODE 4505 45 45 45 0 0
+ATCCAGCACTCGCCCGTGTTGATCGTAGTTCAGACGGCGCAGCAA
+GATTGTCGCCGAAGAGGCGAAGGGAAAAATCACGCTGATCGCCCA
+NODE 4506 14 14 14 0 0
+CCCGGGCTGGATAT
+CTCGGTGGCCGGGT
+NODE 4507 25 29 29 0 0
+AAATATCGCCGCATACTTCCGCGAG
+GGTCGTGCTCAGTACCTGCCAACGT
+NODE 4508 10 10 10 0 0
+GGATGAACGA
+CCCTTCACAA
+NODE 4509 46 46 46 0 0
+TTACGCGAACACCTCATCCCGCAATTATCTGCATTAACGGATACGC
+GCTGGTGTCACGGCAACCTGATGAACTTTCGTCTGTTCCTGGTGAA
+NODE 4510 43 60 60 0 0
+ATCGATCATGACCTGCGGCATCAGTCCCGCTTTGATGAGGCCT
+CTGCCAACTGGGAAATCAGGCGGGCAGGCTGGGCGCCGTCTGG
+NODE 4511 44 50 50 0 0
+CCAAGCACTTCACTCTGAAGTCTGACGTACTGTTCAACTTCAAC
+TCTCCGGACTGGCGCTGGTGGCGGTCGCGTGCCATACGTTAACC
+NODE 4512 1 1 1 0 0
+T
+A
+NODE 4513 47 62 62 0 0
+AGCACCACGGCACCCAGCATAATAACGCGTTTGGTGCCCAGAATTTT
+GTATCTCATTAATGGTCGGGATTGCCGCCGCGCTGGTGGCGGTCATT
+NODE 4514 4 4 4 0 0
+TAGA
+CCTG
+NODE 4515 44 44 44 0 0
+TTCACGTACTTTCTCTACGTCGCTGCCCGCGCCAGAGGTGCCGG
+TATTCCTGAACTTTCTCGATGCGCTCATGGTCATCAACCGGGAC
+NODE 4516 20 20 20 0 0
+TTCCCGGACGATCCGGCGTG
+CCCGGCTTCGTTGGCACGCG
+NODE 4517 43 62 62 0 0
+ACTTTCAGGTCGCTGCCTGCTGGCACTTTGCTGATCACGCCAA
+CCGGGCGCTGCTGGGGCAAAACGAGACGGTGGTGAACGGTCTT
+NODE 4518 37 37 37 0 0
+GATACATTTCAGCTATGTTATTGAATAAAAAGGCGCT
+CTGTCAGATTAGCTGTTTTCATGCTTTGAGGTGGTTT
+NODE 4519 46 67 67 0 0
+TACGCGCATGATTTTGCATACCCATGCCTTACTGGGCGAAGTGCTG
+AGGCGGCGCGCGGCGCATCGATAACCTGAATAAAACAGACCGCATC
+NODE 4520 43 53 53 0 0
+ATTTTCGTCGTCCTGCGCTTTGGCGAACTGATTTATCGCGACA
+CAGCCCGCTTTTAACGCCTCATCGCCCAGGACCGTAGCGACCA
+NODE 4521 43 50 50 0 0
+ACGGGCGTTGCGGGTTTTGGCGCTTTCGCCGGTGATAATGATA
+GTACAGCTTACTCAGGACGGAATGGTTTACTACGAACGGGCAA
+NODE 4522 46 46 46 0 0
+AGAACCGTGGTCAGCTCCACCCGTTTACGTTTCAGGCTGTCCATAT
+ACCACGGTTCTGCTGGGTGCAGGCCTGCAGCCGGTGCGACCGGAGT
+NODE 4523 41 41 41 0 0
+TACGCCCGATAGCGCCTTCTTCGTCAACCTCATCAACGATC
+CTGGAAAGCGTACCCGATGTCTGGCGCTGGCTGGAGCAAAT
+NODE 4524 48 63 63 0 0
+AGAGGCGTAAACAAGGTGATTCTCGTTGGTAATCTGGGCCAGGACCCG
+CTCTGCTGGCCATAATTGAGTCTCCTGAATACGTTTCATAAATAGTGT
+NODE 4525 20 22 22 0 0
+GGTTGGAAGGGCAGAAAGTG
+CCCCGCCGTCGGAGAAGTCA
+NODE 4526 44 44 44 0 0
+GCTGTTCAGCGAAAAAGCGCGCCCACTCGTCATTCACCAGGATG
+GTTCGGCGGAACGCTTCGCCCAGCTCTACACTCAGGTTTCCGGC
+NODE 4527 44 54 54 0 0
+CGAAGAGGAGCTGGAGCCTGAGTTTCTGGAGCTGCTGGATGAGA
+GCGCGCAGTTGCTCAATAACATCGTTGGTCGGGTTGACGTAAAC
+NODE 4528 45 45 45 0 0
+CCCCAGCGCAAACGACGCTGACTCATCACATCGTAAATCAGCGTG
+GCGTAAAACTGAATATGGACGGGTTAACGCATATTGAAAGTTATA
+NODE 4529 51 56 56 0 0
+GAGAGAGCGCCGCTGCCGGTTCGCTGGGCGATTCATCAATAACGACCGTTT
+CATGAAAATTATGTCACGATTCTGGACGACGTTACGCTGGAAAGCTGGATT
+NODE 4530 38 38 38 0 0
+TGCGCTTCTGGCAACAGGGCGATAAACGCCTGTTCCAG
+GGACATCTGTAGCGGCAAAAGTCTGGCCGCCGGATTTC
+NODE 4531 40 40 40 0 0
+AGCGTGTGCCACTTCCTGGCCATCTATTTGTATGTGGGAC
+GCCGCGCCAGCCGCCGCGCCAATCAGCGCGCCTTTACCGC
+NODE 4532 45 45 45 0 0
+CAATATTTTGCTGAATGTAATATTACGGAAATCTGCGTTTGAAAA
+AGCTTCATGAAGCGAGACGGCGATATTATCAAGGGGTTCAACTTT
+NODE 4533 5 5 5 0 0
+GTCAA
+GGTAA
+NODE 4534 41 41 41 0 0
+TTGGCCCAGACCTCTTCGCTGCCCGCGATCTCTTCCGGCTT
+CGGTGGTTTCATCCCATGCTTATTTATGGATGACGGCGGGA
+NODE 4535 21 21 21 0 0
+GCATCCGCTAATTTTTCAACA
+CCCGGGAGATAGCTGGTTCTC
+NODE 4536 44 51 51 0 0
+TCTGCCCGTCGAGTCGGTAAGTAAACACCCAGCTAATGCCACCA
+TCGGCTGGTTAATATCAATCGGCGCGCCCTCATGCGGGGCTTTC
+NODE 4537 47 47 47 0 0
+TTTCATCAACGTCCTGCCATTGCGGGATTGTCCAGCCGGGTAGCAGC
+ATTGCCGAAAAAACTTACCCTGGCGTATCACCTTCCTGTAGAGCTGC
+NODE 4538 40 74 74 0 0
+CAACCAGTTCAACCTGTAACGTCTGCTGGCAATATTGCCG
+TTTTTGGAAAGCGGCGCGCTTATAGAGAAGAAAGTTGTAG
+NODE 4539 46 46 46 0 0
+ATCCTCACCGAATAACACCTGTCTGACCTGGGCGGCATTGACGACC
+CGAACGTTTCATTTTTCGCTTCAACAGTAACGGTTTTTGCGGATAC
+NODE 4540 38 38 38 0 0
+GCTCAGCACGGGTCAACAAACCGTCATAAATAAACTGT
+GGGGAAAACAGCAAGATGTCGTGGACCCAGTCGGAAAC
+NODE 4541 39 39 39 0 0
+GATCGCCCTGTTTGAAAACAGCATGGCGCGACTGCGTTT
+CAACAATACCAGGCCAGCAATAAAATCGTTCCACCAGGC
+NODE 4542 37 37 37 0 0
+AGCAGGAACATCGTGTCCTGGGTAACATCCTGGGTTT
+GCAAGCAACGACAATGAGTCGTTAGCAGGCGCTGAAC
+NODE 4543 41 41 41 0 0
+CTGCGCCAGTTCATCCAGCAGCAGGCAAGGCATCAGGCTGG
+TTGCAACGTCAGGGGGAAGAAGATTTTCTTGCTTTTAGCCG
+NODE 4544 51 65 65 0 0
+AGCCATTTTTGGTGAAATCGGCAAACGTTTACCGATCTTCAATAAATATAT
+TCCCATCACAAACATAAGGGCAAAACCACCGACTAAGTCAGTCGGTATAGC
+NODE 4545 51 59 59 0 0
+ATGTGAGGTTAAGCGACTAAGCGTACACGGTGGATGCCCTGGCAGTCAGAG
+TCCCGAAGATGTTTCTTACGATTCATCGTCGTGTTGCGAAAATTTGAGAGA
+NODE 4546 39 62 62 0 0
+GCGCGCGTCATCTGTGAAGAGGGTCACGCCGGGAATGTC
+ACAGATGGGGCGTCTGTTTGAAAAAATGCTCATGCTGTC
+NODE 4547 40 58 58 0 0
+CGGCATCACGTAGCTGACGCGCTTTGAACAGGGAAACATC
+TGATTTACTGAAACCGATCAGGCCCGCTTTCGCCGCAGCG
+NODE 4548 41 45 45 0 0
+TATCGTGGTCGGGCCGCTGTTGAAAAACAATGTGGAAGCGC
+GTGCGTATGCTGTTTCATACCGTGTTTGTGGTCAGCGCGTT
+NODE 4549 18 831 18 0 0
+TCAAGCCAGCAACACGTC
+ACCCGCCTGTTCATTATA
+NODE 4550 42 42 42 0 0
+GCGTCATCCTGCCAGGCGTCTGCAATCGTGGGAAATTATATT
+CTGATTGTGCTGTGCGGCGTCACGGGATTGTTTGCGCGTTTG
+NODE 4551 46 58 58 0 0
+GCTGCTGCTTTTTCGAATTCAGCTTTGAAGTTGTCAACGGAACCGA
+ACTTCGGCGGCTGGCGTGCGGCGCTGAAGATTTGTCTGGTGATGGG
+NODE 4552 51 69 69 0 0
+TTAAAGTCACCGCCAGCGTTCAGCGCCAGCGTGGCGTTGTCGGTGACGTCG
+ACAACAACATCGGCGGTACGGGCCGCGTGGAAAAATCCGGCGACCAGACGC
+NODE 4553 48 50 50 0 0
+CTGCTGGTGTGCACCTGCTGGGTTCAAGCAATTCTCCTGCCTCAGCCT
+CCGGCTAATTTTTTAATTTTTACTAGAGATGGGGTTTTGCCATGTTGG
+NODE 4554 45 52 52 0 0
+GGAAACGGCGGTGGTGGAACTTGCTGATATTATTGGCTCTGGGCT
+TCGATGCCGTTTACGTTCAGCTTCGCGTTTTCTGCTTTCACCAGC
+NODE 4555 41 65 65 0 0
+CCCGATCTCCCCTGTGTCGCCTCTGAAGCCGATCGCCAATA
+TCATTACGCCATTCGTGCAGGTCGGAACTTACCCGACAAGG
+NODE 4556 39 61 61 0 0
+CGCAGCTATTTTCCAAAAGTACCTGGCGGTACGGAACTG
+TTTCCCGATCGTTCATCGCGTCGCCAAACGCCATGCAAT
+NODE 4557 3 3 3 0 0
+CCC
+AAC
+NODE 4558 43 43 43 0 0
+TCCCCTGCAACATAACTGCCTGCGTCATGACGCCTCCCTGAAT
+ATCGGTATCGTTCTGCTGGCGCTGGGTGGGTTGAAGCCGATTC
+NODE 4559 44 44 44 0 0
+CTTTACAGAACTCAATATAGCGTCCGGCGGCATCGACGATGCGG
+GCTAAAACAAGACGATGCAACCCGTTCTATCGTATTTGTACGTA
+NODE 4560 51 58 58 0 0
+TGGTTATTTTGATGGTGTTATTCAACATTCCGGGCTGTGAAAACGCCTATC
+AATTTCAAGTCTTCCAGGTCAACCTCTGCGGTATCCAGCGCCAGCACACGC
+NODE 4561 45 45 45 0 0
+GCAGGTTGGCGGGCAAATCGCCCTGTTCAAGCCGGGAAAGCGGCG
+TGTGATTGAAATCGCGGTTAAAGGCATGCTGCCAAAAGGCCCGCT
+NODE 4562 16 16 16 0 0
+TGATGATGATGAGCGA
+CCCCGCCGTCACCGAA
+NODE 4563 39 39 39 0 0
+ATTCGACGTCGCGACGTAAAAGCGTTCAGTTTTAACGCG
+GTCACTATCTCTTACCTGTAATTCAGTTAACAGAGTCAC
+NODE 4564 51 57 57 0 0
+TAGGCGAACCCACGCTTAAGTAAGCAATTGATGGAGTAATTTTTACCCCTT
+ATATCAGGCGCATCAATTTGAGCTCTGCTGGCGTGGGTTTTTCGCGTTTCG
+NODE 4565 45 45 45 0 0
+CTACAAGCCTGAGATGTAAAAAATGATGCATTTTTTTCAAACTCA
+TGCAGAAAAATTTTCTCGATCAAGATTTGAACAAGAATTTAAGAA
+NODE 4566 43 65 65 0 0
+AGACGCTTTTCAGCGTCTCTTTTCTGGAATATTGGTACCGAGG
+TCGTCTGTTGAAACTGCTCTCAGAGAGGAGGTTGAAGCACGCT
+NODE 4567 47 47 47 0 0
+TGTGTTGTTGGGTAGGGGAGCGTTCTGTAAGCCTGCGAAGGTGTCCC
+CGTCGCTGCCGCAGCTTCGGTGCATGGTTTAGCCCCGTTACATCTTC
+NODE 4568 44 59 59 0 0
+GCACGCCAGGCTATCCGCCACCTGATACAACAGCCAGTATGGAT
+TCGCCGCAGCCTGAAATGTCGATGTCCGCTTTCAGTTATTTAAA
+NODE 4569 39 55 55 0 0
+ATTGTGGGCGCCAAGAGAAAAAGATGTCATTAACCTTGT
+ATCGGCGTCTGTTCGTCGTCTGGCCCCTTTTCTTTTTTC
+NODE 4570 43 70 70 0 0
+ATATTTTGCTGCCTGCGGTCGTACGCTTTGTGGATTTTGCCAA
+ATGCTGCTCTTTAGTGAGGTTCAATTCTCGTATACTCATGCAG
+NODE 4571 45 60 60 0 0
+TGACGGGATCGCTGGCAAATGCCATGCCGGAAATCAACGTCGCAG
+GGGGGCGACTAACCCGGAGCTGACCCAGCGCGGCTATCAGTACAT
+NODE 4572 102 140 140 0 0
+CTTTCCCTGCTAAACAAGTGTCGGTTTATAAGCTTGTTCACAACTGGAAAACATGTGGTTGTTAGTGAAAACTGCACAGGATAAATTGGCTTTGTCTTGATG
+GTTTTCCAGTTGTGAACAAGCTTATAAACCGACACTTGTTTAGCAGGGAAAGAGATAAACTGGAAAACATGTGGTTGTTAGTGAAAACTGCACAGGATAAAT
+NODE 4573 38 38 38 0 0
+ATATCCTTGCAAAATCCAGCCAGTCGTCCTCTTTTCGA
+AGGCACAGAGCGAATGCGGCAGTCGATAGTCAGTTCAT
+NODE 4574 4 4 4 0 0
+CCTT
+TGGA
+NODE 4575 43 44 44 0 0
+AGCGTTAAGGCCGCCGACAGTTTTTTCTATCGGATTGGTCAGC
+GCATCCGGCAAACGAATGGTATGAAACCGTTCATGCAGCATCC
+NODE 4576 43 43 43 0 0
+AGCCTGATTCTGGCCTTTTTCTACCTGGTGGTGATCGGTACGT
+TTTTTCAGCGAACCGTTACCGCCATTATTTAGCTATTTCCCCG
+NODE 4577 7 7 7 0 0
+GTCCGGC
+TCCCAAC
+NODE 4578 14 14 14 0 0
+TATAATTGTGAGAG
+CCCTGCCGCTGCTG
+NODE 4579 42 65 65 0 0
+CACCAAAGGCGGCACGATCCTGTAACCCATTAAAACTGGCGC
+CGGCGTCATTAATACCTGTTCATCGGTGATACGTACGTTATT
+NODE 4580 42 42 42 0 0
+CGCCTCTGCGCTCGCCAGCGCCCTGCTGGGTCTGAAATGCCG
+TGCGCCGCCGGTTAGCACGTCGCAGATGCTGGGGCCTTTACC
+NODE 4581 47 76 76 0 0
+GGCACCTCGATGTCGGCTCATCACATCCTGGGGCTGAAGTAGGTCCC
+ACCGCCGTCGATATGAACTCTTGGGCGGTATCAGCCTGTTATCCCCG
+NODE 4582 15 15 15 0 0
+GATCCTGTCTGAATA
+TATGCGCTTTTGTGT
+NODE 4583 38 38 38 0 0
+GCCCTGTAGCCGAGATTGTTGGTCCAGCGATTGGGAAG
+GGCACGTTTACTGCGCCATAGCAATCCGGCCACAACCA
+NODE 4584 6 6 6 0 0
+TAAAAA
+CTTTTT
+NODE 4585 41 41 41 0 0
+AGCGTAGCGCGCAAAATCATATGTTTGACGGCATAAGTTTA
+ACGGAACCGGTATCGGTATTGGCCTGTTTTTGTTGCTGATT
+NODE 4586 43 86 86 0 0
+CCGTAGTTCAGTTCTGCGTATCGCAGAGAGGACGAACGCATGA
+AATTTTTGCTACATCTCTTTGTGTATAGCCTGATGAGATAAGC
+NODE 4587 40 40 40 0 0
+GGCGACGGCATTGAACGCCTCAAGGCTGACATCGCGCAGG
+CCCGCGCCGCGCTCGCTACACTGGCAAACATTACTGACGG
+NODE 4588 39 39 39 0 0
+AAATGCTTGGCGCAAGACGTCTGCTGGCGCGCCTGATGC
+AGCCATTTGAAATCTCCGCTCTGCATATCGGAAGGAATA
+NODE 4589 26 26 26 0 0
+ATATTTTTACCATTGCTTCTGGTGTT
+AAATATTAAGATTATCCTTGCTGTTA
+NODE 4590 11 11 11 0 0
+GAGACAGGCGA
+TCCTCTTCCGG
+NODE 4591 45 45 45 0 0
+ATCACCGATTATCGCGACGTGGAAAGCCATAACATGTTTGCCGCG
+CGGCGATGGTGTTGCTGAAATATCCGTCGCTTGAGCTGGTAGAGT
+NODE 4592 1 1 1 0 0
+G
+C
+NODE 4593 44 45 45 0 0
+TCCGCTATGACCGTACGTATTTTGACAAAATCGTGGCTTCCCTG
+CGCGCAGACCACCCATAGCCGGTTTTTACGTCGCAGGTTCACGC
+NODE 4594 41 41 41 0 0
+TCAATGAAGGCCATGCTTACGCATGATATCTATGATGCGAC
+GGTCAGCAACGCCGCAACTTCCGCCGCCCGTTTTTCCGACA
+NODE 4595 44 56 56 0 0
+CCGGGAAATGTTGAGCCGCTGTTCAGAGAAATGTCGATGAGTGT
+CATATCGCAGGGCATTTATCCTTATGATTAGGTATAAATGATGA
+NODE 4596 44 44 44 0 0
+AAGCTGCCGCTTATCCGCTGCTCCTGACGCCAGAGACGACAACC
+TGTCTGCCCAGGTACAAAATGATTTACTGTTAAGGGCGACCGGG
+NODE 4597 51 61 61 0 0
+TACAATCTGTGTGAGCACTGCAAAGTACGCTTCTTTAAGGTAAGGAGGTGA
+ATGATGAAAAACGAGCAGTAAAACCTCTACAGGCTTGTAGCTCAGGTGGTT
+NODE 4598 17 17 17 0 0
+TAAAAAAAAAAAAAAAA
+ATTTTTTTTTTTTTTTT
+NODE 4599 38 45 45 0 0
+TATGTGGAGTCTCAGGTTTATCAGGGCGTGGTAGAAAA
+CAGCAGCGCGCCGCCGAGGCGATAGCGCACTTTGATGC
+NODE 4600 6 2362 6 0 0
+ATTAGG
+CCCAAC
+NODE 4601 41 41 41 0 0
+ACGTTCGCGGTCATCACTCGTATATGGTATCGCTGCCAGCA
+CTATGGCGACAGATACGATTATGGCACCCCTGGGTCATTAT
+NODE 4602 46 80 80 0 0
+GTATGCCGCCGCCGATGATTCCGTTTTTACTGTCATGGATGATCCC
+CCACGCCAGCGCCACCATCTGTGCGGTAGTTTTGACTTTACCGATC
+NODE 4603 116 141 141 0 0
+TCTGGGTTTGCTCTTCTTATCCAAATAAAGAACCAATCTTATCACATAGCCTTCCGGCACCCCCCTTTGGACACGGGTTATTCGGTCCTAAGGGGGGTGCCGGAAGGCTATGGGAT
+AGGGGGGTGCCGGAAGGCTATGTGATAAGATTGGTTCTTTATTTGGATAAGAAGAGCAAACCCAGAAAATTGTGGCTGGTTAGGGAATGTTAATCCCTATTCCCTTTCGGAGGTTT
+NODE 4604 43 53 53 0 0
+CCCTTAATCCTGTTGCATTTTCTCCTCTGCGGCGGCTGCGTCG
+TGGTTGGCTGGCGTTACTGGAGCAGCCATCAGACGGAGTCCGC
+NODE 4605 44 52 52 0 0
+CAATAAACATGTCAAAATGAATAAAAAAAGATCAGAATTACAGT
+GGCTCTCCCGTCTTGCTTGTTTTGTTTGTTTTTTGAACGGTAAA
+NODE 4606 13 13 13 0 0
+GGGACCGTTCGTT
+TTTTTTGTAATAG
+NODE 4607 51 74 74 0 0
+ACCACGTTACAGGGACAACTGCTGTTAAGCGGAAACCCGCCGCTCAATCTG
+TTGGCGAGACGTTTGCCAGATGCTGCTCTGGTACATGCCAGCTCTCTCCCG
+NODE 4608 46 46 46 0 0
+CGCGCAGCATATAGACTAAGGCATCGCCAGGAAATCCGGTAAAACG
+GCGGTGCAGGCGGCAATTGTGCCAGTGTGCCTGTTAGAAAATATGG
+NODE 4609 2 2 2 0 0
+TC
+CC
+NODE 4610 62 67 67 0 0
+CGGCGATCTCCTCAGACTTTGTAAGAGATCTCTCACACCCGTTAGGGCAAACGATTACAGAA
+AGGAGATCGCCGGGATATCAGCGGATACTGAGTTCCGTTTTCTTATGTAAGTCTATATAAAA
+NODE 4611 28 28 28 0 0
+TACCTTCACCGACCTGATTGTCGCCGTG
+GGCCGCCAGCCTTACGCATAACCAGAAT
+NODE 4612 43 47 47 0 0
+GCCATGTTTATCTCCCAGCAAATCGCGGGCGTCCCAGTGCGGA
+TAGCCACCCTGTTAACGTTCACGGGTCTGGCATTATGGTCGCC
+NODE 4613 39 43 43 0 0
+CCTTTTTATAATCATACAGTGAATGTCGACTGGTAATTA
+GGCGGCAAACCGTGACGGGTCCCAGAACATACATCCTGC
+NODE 4614 17 17 17 0 0
+ACCTAGCTGGTCTGAGA
+TAGCTAATCCCATCTGG
+NODE 4615 45 45 45 0 0
+ACTGGTAATCAAAGAACATCACCACCGCCGCTTTTGCCTCGTTGG
+AGATGCAGCAAAATGAGCCAGAAGATCACTTTGGTTCTTTATTAC
+NODE 4616 43 45 45 0 0
+TTCTTTTACGATTTCATCCCACCCGATGTTATAAAAAAAGCAG
+GCTAAGCGGCAATAAATAATTTCACAGTGAAACTATCACCAAT
+NODE 4617 49 77 77 0 0
+GTTCGTTACAGGGGAATATCCATCCAATACGCGGTGCGGATACTTTTAT
+CCATAATCGTAGCTGTCATCTGGATAATCGGCATGGGCAATCACGTACT
+NODE 4618 7 7 7 0 0
+GCTGAGA
+TAGCTAA
+ARC 1 2948 34
+ARC 1 3953 4
+ARC -1 -4108 1
+ARC -1 -2938 56
+ARC 2 937 50
+ARC 3 507 35
+ARC -3 -3920 1
+ARC -3 -1175 46
+ARC 4 -3624 2
+ARC 4 -2633 38
+ARC -4 -4306 1
+ARC -4 -3114 63
+ARC 5 -3856 2
+ARC 5 617 57
+ARC -5 938 52
+ARC 6 -825 81
+ARC 6 3856 1
+ARC -6 -3414 1
+ARC -6 400 36
+ARC 7 1015 99
+ARC 7 3778 1
+ARC -7 -4126 1
+ARC -7 2906 52
+ARC 8 3078 56
+ARC 8 4063 1
+ARC -8 -1221 42
+ARC -8 3534 1
+ARC 9 -3655 1
+ARC 9 1845 79
+ARC -9 3032 35
+ARC -9 4334 1
+ARC 10 -555 57
+ARC -10 161 44
+ARC -10 4031 1
+ARC 11 -175 71
+ARC 11 3364 1
+ARC -11 -4453 1
+ARC -11 968 53
+ARC 12 -3866 2
+ARC 12 -13 30
+ARC -12 -3488 1
+ARC -12 -3302 49
+ARC -13 -1390 39
+ARC 14 -1352 52
+ARC -14 2720 55
+ARC -14 3055 1
+ARC 15 595 60
+ARC -15 339 47
+ARC 16 -1174 72
+ARC 16 4470 1
+ARC -16 -4562 1
+ARC -16 -3199 34
+ARC 17 -4368 1
+ARC 17 -3667 56
+ARC -17 -4032 1
+ARC -17 355 84
+ARC 18 -4381 1
+ARC 18 2523 73
+ARC -18 1238 42
+ARC -18 3994 3
+ARC 19 229 44
+ARC -19 3134 88
+ARC -19 4605 2
+ARC 20 -2485 46
+ARC -20 -3636 1
+ARC -20 -2716 61
+ARC 21 -1100 52
+ARC 21 3626 1
+ARC -21 428 48
+ARC 22 498 50
+ARC -22 -4351 1
+ARC -22 927 51
+ARC 23 -3169 1
+ARC 23 2423 51
+ARC -23 -876 64
+ARC 24 -820 62
+ARC -24 1997 62
+ARC 25 -801 49
+ARC 25 3266 1
+ARC -25 -343 27
+ARC 26 266 53
+ARC -26 -3285 37
+ARC -26 3151 1
+ARC 27 -2851 56
+ARC 27 3751 1
+ARC -27 -3384 1
+ARC -27 2417 62
+ARC 28 2292 80
+ARC 28 4148 1
+ARC -28 280 62
+ARC 29 30 72
+ARC -29 1594 54
+ARC 30 31 472
+ARC 30 3213 10
+ARC -30 2030 422
+ARC 31 1837 484
+ARC 32 -2223 43
+ARC -32 286 24
+ARC 33 2167 48
+ARC 33 4473 1
+ARC -33 -1077 52
+ARC 34 35 47
+ARC -34 2944 60
+ARC 35 -1208 35
+ARC 35 3995 1
+ARC -35 -3622 2
+ARC 36 898 44
+ARC 36 3557 1
+ARC -36 -3936 1
+ARC -36 -2727 53
+ARC 37 -2002 81
+ARC 37 4565 1
+ARC -37 -2303 38
+ARC -37 3344 6
+ARC 38 997 56
+ARC -38 -2316 46
+ARC 39 -2433 57
+ARC -39 1480 50
+ARC -39 3758 5
+ARC 40 -3504 1
+ARC 40 2351 49
+ARC -40 -4568 1
+ARC -40 657 44
+ARC 41 3056 49
+ARC 41 3590 1
+ARC -41 -3928 1
+ARC -41 -471 79
+ARC 42 -3677 3
+ARC 42 -826 59
+ARC -42 -3952 1
+ARC -42 1725 63
+ARC 43 3315 54
+ARC 43 4362 1
+ARC -43 -2980 50
+ARC -43 3154 8
+ARC 44 1313 38
+ARC -44 -4578 1
+ARC -44 -576 40
+ARC 45 -3534 1
+ARC 45 1221 39
+ARC -45 -3607 1
+ARC -45 -2476 39
+ARC 46 -736 59
+ARC -46 -344 30
+ARC 47 -173 36
+ARC 47 3019 2
+ARC -47 2272 64
+ARC 48 -2698 58
+ARC 48 3064 8
+ARC -48 -4317 1
+ARC -48 -2848 50
+ARC 49 -4527 1
+ARC 49 1517 65
+ARC -49 1967 79
+ARC -49 4610 1
+ARC 50 -4432 1
+ARC 50 348 35
+ARC -50 -1102 44
+ARC -50 4038 1
+ARC 51 -1284 50
+ARC 51 3899 1
+ARC -51 -3626 1
+ARC -51 -696 69
+ARC 52 3192 27
+ARC -52 2687 38
+ARC 53 -3716 1
+ARC 53 1797 42
+ARC -53 -345 54
+ARC 54 -1012 52
+ARC 54 4543 1
+ARC -54 -4330 1
+ARC -54 1818 53
+ARC 55 -3814 1
+ARC 55 1241 50
+ARC -55 -151 41
+ARC -55 4345 2
+ARC 56 -3771 1
+ARC 56 -2875 50
+ARC -56 -4132 1
+ARC -56 -112 57
+ARC -57 1989 54
+ARC -57 3458 1
+ARC 58 -233 41
+ARC -58 -2607 1
+ARC -58 2608 28
+ARC 59 -2922 53
+ARC -59 -3361 1
+ARC -59 1514 53
+ARC 60 -3479 1
+ARC 60 1491 52
+ARC -60 -4185 1
+ARC -60 -2508 57
+ARC 61 932 56
+ARC -61 -1790 66
+ARC -61 3719 1
+ARC 62 189 30
+ARC -62 -426 61
+ARC -62 2912 2
+ARC 63 -3696 2
+ARC 63 -65 48
+ARC -63 379 79
+ARC 64 -1316 44
+ARC 64 65 44
+ARC 64 3696 2
+ARC -64 -466 26
+ARC -64 1760 46
+ARC 66 -3889 1
+ARC 66 3045 53
+ARC -66 -1343 41
+ARC 67 -716 51
+ARC 67 4448 3
+ARC -67 -2307 45
+ARC -67 4365 1
+ARC 68 1813 26
+ARC -68 1357 43
+ARC 69 -4357 1
+ARC 69 420 46
+ARC -69 -4462 1
+ARC -69 -1861 38
+ARC 70 3346 45
+ARC 70 4195 4
+ARC -70 -615 55
+ARC 71 -236 66
+ARC -71 -1041 57
+ARC -71 3697 1
+ARC 72 -1727 1
+ARC 72 2093 70
+ARC -72 1923 27
+ARC 73 -74 185
+ARC -73 -1877 145
+ARC -73 1907 7
+ARC 74 -3730 1
+ARC -74 1522 169
+ARC 75 -2323 48
+ARC 75 4324 1
+ARC -75 -828 64
+ARC 76 809 38
+ARC -76 1932 51
+ARC -76 2302 6
+ARC 77 1276 59
+ARC -77 -3743 1
+ARC -77 2784 32
+ARC 78 -1823 1
+ARC 78 1028 43
+ARC -78 -4000 1
+ARC -78 679 71
+ARC 79 -1257 231
+ARC -79 -2105 1
+ARC -79 807 228
+ARC 80 -4541 1
+ARC 80 563 50
+ARC -80 -1797 46
+ARC -80 3716 2
+ARC 81 -1703 38
+ARC 81 2715 5
+ARC -81 -3776 1
+ARC -81 -2928 47
+ARC 82 -860 54
+ARC 82 3243 1
+ARC -82 -1516 50
+ARC 83 -2250 63
+ARC -83 727 71
+ARC -83 4248 1
+ARC 84 -3592 1
+ARC 84 -2125 50
+ARC -84 -1955 50
+ARC -84 2609 1
+ARC 85 -3277 2
+ARC 85 2330 64
+ARC -85 -4423 1
+ARC -85 950 57
+ARC 86 -1471 76
+ARC 86 403 5
+ARC -86 -1561 62
+ARC -86 4564 1
+ARC 87 -3665 1
+ARC 87 -1960 51
+ARC -87 1253 57
+ARC 88 -3225 43
+ARC 88 4393 1
+ARC -88 1591 66
+ARC -88 4228 1
+ARC 89 -643 44
+ARC -89 -848 67
+ARC 90 -1479 49
+ARC -90 -559 64
+ARC -90 4204 1
+ARC 91 -2725 81
+ARC 91 2890 2
+ARC -91 -509 55
+ARC -91 3482 3
+ARC 92 -3979 1
+ARC 92 1372 40
+ARC -92 -2491 30
+ARC 93 2419 40
+ARC -93 -4570 1
+ARC -93 928 49
+ARC 94 95 275
+ARC -94 -2554 249
+ARC 95 105 385
+ARC -95 -1586 120
+ARC 96 -1162 52
+ARC -96 2018 62
+ARC -96 4026 2
+ARC 97 -98 57
+ARC -97 -1384 47
+ARC -97 4274 1
+ARC 98 4452 1
+ARC -98 -4516 1
+ARC -98 1323 46
+ARC 99 -3974 1
+ARC 99 252 61
+ARC -99 -4325 2
+ARC -99 848 36
+ARC 100 -4240 1
+ARC 100 -2826 44
+ARC -100 917 65
+ARC 101 -3957 1
+ARC 101 1331 22
+ARC -101 1606 55
+ARC -101 4104 1
+ARC 102 -1899 1
+ARC 102 -732 53
+ARC -102 1583 42
+ARC -102 3908 1
+ARC 103 331 48
+ARC 103 4496 1
+ARC -103 979 37
+ARC 104 2938 25
+ARC 104 4108 2
+ARC -104 -4593 1
+ARC -104 -181 57
+ARC 105 1006 353
+ARC 105 4378 1
+ARC -105 4154 1
+ARC 106 -3859 1
+ARC 106 -677 46
+ARC -106 -405 53
+ARC 107 -2810 46
+ARC 107 2466 1
+ARC -107 -4433 2
+ARC -107 -1285 73
+ARC 108 -1526 50
+ARC -108 -4398 1
+ARC -108 -200 65
+ARC 109 3147 53
+ARC 109 4066 1
+ARC -109 2159 67
+ARC 110 2291 49
+ARC 110 4223 1
+ARC -110 -3267 37
+ARC 111 2893 66
+ARC -111 -317 54
+ARC -112 -3839 1
+ARC -112 -2171 59
+ARC 113 -1778 60
+ARC 113 2943 2
+ARC -113 -311 42
+ARC 114 -4610 1
+ARC 114 -1064 74
+ARC -114 407 47
+ARC 115 -841 44
+ARC -115 -2430 39
+ARC -115 4034 1
+ARC 116 -4311 1
+ARC 116 639 46
+ARC -116 -3762 1
+ARC -116 -1739 61
+ARC 117 -1202 50
+ARC -117 2458 73
+ARC -117 3415 1
+ARC 118 1191 22
+ARC 118 3913 1
+ARC -118 -4605 1
+ARC -118 -3134 85
+ARC 119 -3181 3
+ARC 119 -3139 44
+ARC -119 -4363 1
+ARC -119 -295 66
+ARC 120 -4364 1
+ARC 120 142 69
+ARC -120 -4607 1
+ARC -120 -504 32
+ARC 121 -1371 75
+ARC 121 4370 2
+ARC -121 -364 38
+ARC 122 -2913 46
+ARC -122 2015 58
+ARC -122 3954 1
+ARC 123 -3925 1
+ARC 123 1296 57
+ARC -123 2078 30
+ARC 124 1920 45
+ARC 124 4432 1
+ARC -124 1516 57
+ARC 125 -2244 79
+ARC 125 3681 1
+ARC -125 1485 61
+ARC 126 -4501 1
+ARC 126 -2950 17
+ARC 126 -2626 49
+ARC -126 2421 74
+ARC 127 2178 35
+ARC -127 545 52
+ARC 128 -3713 1
+ARC 128 -1687 44
+ARC -128 1208 40
+ARC -128 4342 1
+ARC 129 -2250 43
+ARC -129 1559 63
+ARC -129 4408 1
+ARC 130 -2329 46
+ARC 130 3727 4
+ARC -130 -3531 1
+ARC -130 1549 65
+ARC 131 -3055 1
+ARC 131 -2720 55
+ARC -131 1951 74
+ARC -131 3185 1
+ARC 132 -4188 1
+ARC 132 -2237 50
+ARC -132 -676 53
+ARC 133 -995 46
+ARC -133 -3899 1
+ARC -133 -2560 42
+ARC 134 -4463 1
+ARC 134 -2345 73
+ARC -134 -728 50
+ARC -134 4121 1
+ARC 135 -4037 1
+ARC 135 -692 48
+ARC -135 3164 47
+ARC 136 -3650 2
+ARC 136 829 54
+ARC -136 -4492 2
+ARC -136 638 43
+ARC 137 1987 58
+ARC 137 4323 1
+ARC -137 -1701 38
+ARC -137 3680 1
+ARC 138 -3003 49
+ARC 138 3675 1
+ARC -138 -4427 1
+ARC -138 -644 73
+ARC 139 -4067 1
+ARC 139 -355 62
+ARC -139 -2261 44
+ARC -139 4124 2
+ARC 140 -2239 54
+ARC -140 -1813 46
+ARC 141 -213 49
+ARC -141 -3021 1
+ARC -141 2668 47
+ARC 142 -4405 1
+ARC 142 -1451 50
+ARC 143 -2762 52
+ARC 143 3430 1
+ARC -143 2184 40
+ARC 144 -930 42
+ARC -144 -1407 1
+ARC -144 2619 68
+ARC 145 -146 35
+ARC -145 -2431 80
+ARC 146 3921 1
+ARC -146 863 59
+ARC -146 3693 1
+ARC 147 -1572 51
+ARC 147 4279 2
+ARC -147 1848 44
+ARC -147 3817 3
+ARC 148 -4592 1
+ARC 148 -2977 33
+ARC -148 1026 17
+ARC -148 4280 1
+ARC 149 -2712 62
+ARC -149 1656 54
+ARC 150 -1331 21
+ARC 150 3957 1
+ARC -150 2595 26
+ARC -151 -3133 1
+ARC -151 -2527 44
+ARC 152 -1323 50
+ARC 152 4516 1
+ARC -152 1883 56
+ARC 153 -2598 44
+ARC 153 3597 1
+ARC -153 1888 48
+ARC 154 1532 31
+ARC -154 -524 54
+ARC 155 -3501 1
+ARC 155 -1556 67
+ARC -155 2412 53
+ARC 156 157 190
+ARC 156 289 55
+ARC -156 -2444 43
+ARC -156 291 105
+ARC -156 795 58
+ARC 157 -290 69
+ARC 157 158 131
+ARC 158 159 99
+ARC 158 3958 4
+ARC 159 160 105
+ARC 159 3401 2
+ARC 160 -1414 102
+ARC 161 -2084 1
+ARC 161 -1954 40
+ARC 162 -530 32
+ARC 162 3024 1
+ARC -162 -4510 1
+ARC -162 -336 59
+ARC 163 -2251 58
+ARC -163 -1461 63
+ARC 164 -4514 1
+ARC 164 -1066 401
+ARC -164 -1177 447
+ARC -164 3363 2
+ARC 165 -1144 55
+ARC -165 261 58
+ARC 166 2486 52
+ARC 166 3442 1
+ARC -166 -3083 2
+ARC -166 -1978 52
+ARC 167 3043 1
+ARC 167 3478 32
+ARC -167 -4064 1
+ARC -167 2286 61
+ARC 168 169 223
+ARC -168 -2449 122
+ARC -168 -2243 96
+ARC 169 -170 361
+ARC -169 -2028 149
+ARC 170 2455 7
+ARC -170 -3877 1
+ARC -170 -1459 347
+ARC 171 -4004 4
+ARC 171 -3937 60
+ARC -171 -265 50
+ARC 172 -3019 1
+ARC 172 173 56
+ARC -172 -4254 1
+ARC -172 357 71
+ARC 174 895 63
+ARC 174 4137 1
+ARC -174 -1833 76
+ARC -174 3663 1
+ARC -175 -4016 1
+ARC -175 -973 50
+ARC 176 2174 73
+ARC -176 -1299 61
+ARC -176 3843 1
+ARC 177 -914 46
+ARC -177 -2327 60
+ARC 178 -4072 1
+ARC 178 1959 55
+ARC -178 -3409 1
+ARC -178 1564 52
+ARC 179 2848 45
+ARC 179 4317 1
+ARC -179 316 64
+ARC 180 1629 54
+ARC -180 -2427 37
+ARC -181 -3510 1
+ARC -181 -2881 48
+ARC 182 494 48
+ARC -182 1439 72
+ARC 183 1654 54
+ARC -183 -1582 64
+ARC -183 4341 1
+ARC 184 -1435 49
+ARC 184 3894 1
+ARC -184 2014 77
+ARC 185 -3844 1
+ARC 185 2854 59
+ARC -185 -1781 61
+ARC 186 -2777 1
+ARC 186 -187 75
+ARC -186 -4361 1
+ARC -186 2436 71
+ARC -187 -974 72
+ARC 188 2385 32
+ARC 188 2514 1
+ARC -188 382 24
+ARC 189 -3310 1
+ARC 189 -2340 32
+ARC -189 -3764 1
+ARC 190 -794 45
+ARC 190 3976 1
+ARC -190 1892 26
+ARC -190 3248 1
+ARC 191 1409 40
+ARC -191 -3965 1
+ARC -191 -1332 48
+ARC 192 611 30
+ARC -192 -4475 1
+ARC -192 -2348 57
+ARC 193 -3725 1
+ARC 193 -1991 34
+ARC -193 543 59
+ARC 194 2642 44
+ARC 194 4040 1
+ARC -194 -4124 1
+ARC -194 2613 37
+ARC 195 196 20
+ARC 195 3052 1
+ARC -195 2573 46
+ARC -195 3492 3
+ARC 196 1398 63
+ARC 196 3244 3
+ARC 197 -2316 47
+ARC -197 -4145 1
+ARC -197 3035 26
+ARC 198 -1325 52
+ARC -198 791 74
+ARC 199 -2563 63
+ARC -199 -3630 1
+ARC -199 2189 70
+ARC -200 2991 82
+ARC 201 202 57
+ARC 201 3533 2
+ARC -201 2112 60
+ARC 202 -2945 50
+ARC 202 3863 1
+ARC 203 -1409 86
+ARC 203 3870 2
+ARC -203 -1119 61
+ARC -203 3977 2
+ARC 204 849 51
+ARC -204 -2278 33
+ARC 205 -207 71
+ARC 205 3095 3
+ARC -205 -1126 67
+ARC -205 -816 51
+ARC 206 -3095 1
+ARC 206 207 111
+ARC -206 -2470 102
+ARC -206 2072 3
+ARC 208 1498 56
+ARC 208 3445 1
+ARC -208 -3052 1
+ARC -208 582 49
+ARC 209 -3678 42
+ARC 209 2241 4
+ARC -209 -4065 1
+ARC -209 2080 35
+ARC 210 -2023 51
+ARC 210 2610 2
+ARC -210 -3515 36
+ARC -210 -2270 1
+ARC 211 -2814 1
+ARC 211 212 54
+ARC -211 1436 66
+ARC 212 1032 52
+ARC 213 -3693 2
+ARC -213 -3020 53
+ARC -213 3049 5
+ARC 214 -1438 49
+ARC 214 4407 1
+ARC -214 -4285 1
+ARC -214 1277 57
+ARC 215 -4175 1
+ARC 215 -2726 73
+ARC -215 -4505 1
+ARC -215 -422 44
+ARC 216 -3432 1
+ARC 216 -2113 45
+ARC -216 -3737 1
+ARC -216 2758 49
+ARC 217 2361 45
+ARC 217 4459 1
+ARC -217 -2049 50
+ARC 218 -2903 4
+ARC 218 2487 23
+ARC -218 345 37
+ARC -218 4241 1
+ARC 219 -2555 37
+ARC 219 4379 1
+ARC -219 -2186 1
+ARC -219 -1512 85
+ARC 220 861 47
+ARC -220 314 54
+ARC 221 -566 57
+ARC -221 2016 49
+ARC 222 -2440 66
+ARC -222 -2271 1
+ARC -222 1668 43
+ARC 223 253 62
+ARC -223 -2031 39
+ARC 224 313 44
+ARC 224 4402 1
+ARC -224 -3195 65
+ARC -224 4070 1
+ARC 225 747 87
+ARC -225 1555 54
+ARC 226 -433 67
+ARC -226 2010 66
+ARC 227 2559 66
+ARC 227 3467 2
+ARC -227 -3605 1
+ARC -227 -947 66
+ARC 228 -4237 1
+ARC 228 436 48
+ARC -228 -4020 1
+ARC -228 3057 40
+ARC 229 -999 27
+ARC -229 -4447 2
+ARC 230 -3440 1
+ARC 230 -3218 42
+ARC -230 -3922 1
+ARC -230 2500 51
+ARC 231 -3747 1
+ARC 231 -824 57
+ARC -231 -2136 38
+ARC 232 2045 47
+ARC 232 3347 2
+ARC -232 1007 57
+ARC 233 -4263 1
+ARC -233 353 41
+ARC 234 -4138 1
+ARC 234 512 61
+ARC -234 -4191 1
+ARC -234 -2460 53
+ARC 235 -2354 1
+ARC 235 -711 199
+ARC -235 1262 185
+ARC 236 3974 1
+ARC -236 -1227 62
+ARC -236 4424 1
+ARC 237 -3942 1
+ARC 237 -2541 66
+ARC -237 786 24
+ARC 238 -1532 38
+ARC -238 -2867 35
+ARC 239 2652 56
+ARC -239 -4569 1
+ARC -239 -247 51
+ARC 240 -4449 1
+ARC 240 1121 29
+ARC -240 -865 55
+ARC 241 -467 57
+ARC -241 -2500 61
+ARC -241 3922 1
+ARC 242 -1679 87
+ARC -242 -1680 44
+ARC -242 2404 45
+ARC 243 -4322 1
+ARC 243 442 50
+ARC -243 -3429 1
+ARC -243 -1356 64
+ARC 244 -2330 50
+ARC 244 3277 6
+ARC -244 -2865 53
+ARC -244 3378 1
+ARC 245 -403 1
+ARC 245 1471 77
+ARC -245 499 48
+ARC 246 -4104 1
+ARC 246 -713 46
+ARC -246 -3423 1
+ARC -246 2068 54
+ARC -247 -3496 2
+ARC -247 970 56
+ARC 248 971 46
+ARC -248 533 56
+ARC -248 4528 1
+ARC 249 -3084 1
+ARC 249 -3026 46
+ARC -249 -3329 2
+ARC -249 2074 48
+ARC 250 -2111 45
+ARC -250 -3891 1
+ARC -250 2850 71
+ARC 251 2982 51
+ARC -251 2462 55
+ARC 252 517 60
+ARC 253 -2482 26
+ARC 253 3339 10
+ARC -253 4579 1
+ARC 254 -3443 3
+ARC 254 -654 40
+ARC -254 653 25
+ARC -254 3236 23
+ARC 255 1052 45
+ARC -255 697 53
+ARC 256 -3458 1
+ARC 256 -1989 41
+ARC -256 -567 47
+ARC 257 1738 74
+ARC -257 -1730 59
+ARC -257 3616 1
+ARC 258 -2967 1
+ARC 258 -2480 40
+ARC -258 983 71
+ARC 259 -2161 62
+ARC 259 3594 1
+ARC -259 -3470 1
+ARC -259 -1345 53
+ARC 260 -3697 1
+ARC 260 -402 68
+ARC -260 -967 57
+ARC -260 4484 1
+ARC 261 -3954 1
+ARC 261 2922 60
+ARC -261 -4216 1
+ARC 262 263 51
+ARC -262 1356 69
+ARC 263 -1477 50
+ARC 263 2548 39
+ARC -263 1862 57
+ARC 264 -3644 1
+ARC 264 -2060 62
+ARC -264 -457 29
+ARC 265 3381 2
+ARC -265 2551 37
+ARC -265 4136 2
+ARC 266 -4048 1
+ARC 266 -2770 37
+ARC -266 -4454 1
+ARC 267 2952 9
+ARC -267 1918 16
+ARC 268 269 56
+ARC -268 -2236 1
+ARC -268 1137 53
+ARC 269 270 47
+ARC 269 1403 55
+ARC -269 1034 51
+ARC 270 2238 54
+ARC 271 -3754 1
+ARC 271 272 72
+ARC -271 -2439 61
+ARC 272 -273 60
+ARC 273 3754 1
+ARC -273 -2350 54
+ARC -273 3425 1
+ARC 274 -4308 1
+ARC 274 3233 27
+ARC -274 -2918 48
+ARC -275 -987 69
+ARC -275 988 5
+ARC 276 1302 47
+ARC -276 1706 54
+ARC 277 278 51
+ARC -277 -3168 59
+ARC 278 -279 52
+ARC -278 3757 2
+ARC 279 -3672 2
+ARC -279 481 34
+ARC 280 -4178 1
+ARC 280 281 48
+ARC -280 -4077 1
+ARC 281 282 45
+ARC 281 4558 1
+ARC 282 -3242 1
+ARC 282 283 36
+ARC 283 -3846 26
+ARC 284 1756 38
+ARC -284 -2878 2
+ARC -284 2233 48
+ARC 285 -538 63
+ARC -285 -4421 1
+ARC -285 677 69
+ARC 286 -3749 1
+ARC 286 -1469 114
+ARC -286 -950 31
+ARC 287 -3207 1
+ARC 287 -1069 57
+ARC -287 -3247 40
+ARC 288 707 53
+ARC -288 -4103 1
+ARC -288 1185 35
+ARC 289 -291 48
+ARC -290 -291 57
+ARC 292 -2645 1
+ARC 292 2461 61
+ARC -292 -948 41
+ARC -292 4290 1
+ARC 293 -4476 1
+ARC 293 -327 62
+ARC -293 1122 72
+ARC -293 4311 2
+ARC 294 -2374 1
+ARC 294 -1229 58
+ARC -294 -4394 1
+ARC -294 2911 36
+ARC -295 -2140 36
+ARC -295 3710 3
+ARC 296 774 424
+ARC -296 -745 422
+ARC 297 298 398
+ARC -297 -774 418
+ARC 298 299 373
+ARC 298 3654 2
+ARC -298 -4413 1
+ARC 299 300 374
+ARC 300 301 369
+ARC -300 -3234 1
+ARC 301 -1702 351
+ARC -301 -4268 1
+ARC 302 303 368
+ARC 302 3153 1
+ARC 302 4614 1
+ARC -302 -3561 354
+ARC -302 2813 3
+ARC 303 304 374
+ARC 303 4618 1
+ARC 304 3491 371
+ARC 305 -1651 62
+ARC -305 1229 66
+ARC -305 2374 1
+ARC 306 506 60
+ARC 306 4167 1
+ARC -306 2434 67
+ARC 307 2797 46
+ARC 307 3279 1
+ARC -307 3158 43
+ARC -307 3505 11
+ARC 308 -4450 1
+ARC 308 1979 58
+ARC -308 -1671 50
+ARC 309 -4496 1
+ARC 309 615 44
+ARC -309 -1997 53
+ARC 310 1895 86
+ARC -310 -622 80
+ARC 311 4250 1
+ARC -311 -557 82
+ARC -311 3574 1
+ARC 312 -3728 1
+ARC 312 2543 47
+ARC -312 -3777 1
+ARC -312 518 39
+ARC 313 -3870 1
+ARC 313 1207 51
+ARC 314 -921 45
+ARC -314 3380 1
+ARC 315 -4606 1
+ARC 315 -3469 164
+ARC -315 4275 192
+ARC -315 4377 1
+ARC 316 -4123 1
+ARC 316 -2585 54
+ARC -316 -3517 1
+ARC 317 4354 1
+ARC -317 -3378 1
+ARC -317 906 65
+ARC 318 -908 64
+ARC -318 -937 36
+ARC 319 -3006 56
+ARC 319 3684 2
+ARC 320 1682 43
+ARC -320 -1000 43
+ARC 321 -2805 348
+ARC -321 589 380
+ARC 322 323 355
+ARC 322 2836 5
+ARC -322 2805 362
+ARC 323 2367 347
+ARC 323 4489 1
+ARC 324 2727 34
+ARC 324 3936 1
+ARC -324 699 50
+ARC 325 -2176 37
+ARC 325 4401 2
+ARC -325 -3157 1
+ARC -325 3013 47
+ARC 326 1202 39
+ARC -326 -3435 1
+ARC -326 -809 47
+ARC -327 716 46
+ARC 328 -4524 1
+ARC 328 -366 48
+ARC -328 3703 3
+ARC -328 3857 29
+ARC 329 -4300 1
+ARC 329 -1340 67
+ARC -329 -2718 62
+ARC -329 1406 1
+ARC 330 -4579 1
+ARC 330 1078 31
+ARC -330 427 65
+ARC 331 1844 80
+ARC 331 3655 1
+ARC 332 632 52
+ARC 332 4559 1
+ARC -332 690 44
+ARC 333 -1156 1
+ARC 333 -334 59
+ARC -333 371 39
+ARC -333 3132 1
+ARC -334 1014 59
+ARC 335 -2095 66
+ARC 335 4443 1
+ARC -335 -4575 1
+ARC -335 2600 58
+ARC -336 -2894 70
+ARC -336 4242 1
+ARC 337 489 49
+ARC 337 4215 1
+ARC -337 -1427 56
+ARC 338 378 1
+ARC 338 1867 54
+ARC -338 -3882 3
+ARC -338 2907 25
+ARC 339 -4486 1
+ARC 339 -992 66
+ARC -339 3541 1
+ARC 340 437 60
+ARC 340 4083 1
+ARC -340 1675 80
+ARC -340 4421 1
+ARC 341 -3594 1
+ARC 341 -342 51
+ARC -341 -4139 2
+ARC -341 -944 59
+ARC -342 -861 44
+ARC 343 3981 1
+ARC -343 -2295 1
+ARC -343 1973 27
+ARC 344 -4027 1
+ARC -344 -3824 2
+ARC -344 -3489 60
+ARC 345 -4499 1
+ARC 346 -1402 56
+ARC -346 457 50
+ARC 347 -3215 23
+ARC 347 -2595 58
+ARC 347 3080 10
+ARC -347 -2637 76
+ARC -347 2393 39
+ARC 348 2839 22
+ARC 349 945 48
+ARC -349 -1279 70
+ARC -349 3414 1
+ARC 350 1374 57
+ARC -350 -1926 38
+ARC -350 3604 1
+ARC 351 2988 59
+ARC 351 4141 2
+ARC -351 -793 51
+ARC 352 1821 40
+ARC 352 3803 1
+ARC -352 -2732 56
+ARC -352 -1484 1
+ARC 353 -2283 40
+ARC 353 4375 1
+ARC -353 4119 1
+ARC 354 -616 30
+ARC 354 4447 1
+ARC -354 -408 55
+ARC 356 -1786 70
+ARC 356 4112 1
+ARC -356 1558 48
+ARC -356 3535 1
+ARC 357 -883 71
+ARC 358 -1975 76
+ARC 358 4617 1
+ARC -358 1017 63
+ARC -358 4422 1
+ARC 359 2025 30
+ARC -359 -2644 37
+ARC 360 1037 61
+ARC -360 -2935 37
+ARC -360 2221 5
+ARC 361 -2443 49
+ARC 361 2909 3
+ARC -361 -2369 46
+ARC -361 2368 2
+ARC 362 -3037 53
+ARC 362 3924 3
+ARC -362 -3597 1
+ARC -362 2598 53
+ARC 363 -1092 48
+ARC -363 -3007 53
+ARC -363 3932 2
+ARC 364 -3803 1
+ARC -364 447 49
+ARC 365 -1264 68
+ARC 365 4198 1
+ARC -365 2324 40
+ARC -365 4454 1
+ARC -366 667 82
+ARC 367 -832 48
+ARC -367 805 52
+ARC 368 2353 45
+ARC 368 3497 3
+ARC -368 -863 38
+ARC 369 -3383 1
+ARC 369 -2577 62
+ARC -369 -4554 1
+ARC -369 -1919 42
+ARC 370 504 38
+ARC 370 4607 1
+ARC -370 -4410 1
+ARC -370 -384 68
+ARC 371 372 33
+ARC 371 3744 2
+ARC 372 -1638 43
+ARC 373 -3005 1
+ARC 373 374 71
+ARC -373 -1312 66
+ARC -373 3971 2
+ARC 374 1637 64
+ARC 375 -3417 1
+ARC 375 -1283 74
+ARC -375 -4417 1
+ARC -375 -916 53
+ARC 376 -377 53
+ARC -376 -4084 1
+ARC -376 642 44
+ARC 377 -4542 1
+ARC -377 -3344 1
+ARC -377 2303 47
+ARC 379 -4195 1
+ARC 379 -3346 41
+ARC -379 -4571 1
+ARC 380 609 48
+ARC -380 1289 34
+ARC 381 -2281 75
+ARC 381 4293 1
+ARC -381 -1031 67
+ARC -381 4005 1
+ARC 382 -2714 39
+ARC 382 3393 1
+ARC -382 -4521 1
+ARC 383 1830 58
+ARC 383 4047 1
+ARC -383 543 68
+ARC -384 -4007 1
+ARC -384 2857 65
+ARC 385 888 62
+ARC -385 -1675 48
+ARC 386 -4140 1
+ARC 386 -1212 68
+ARC -386 411 49
+ARC -386 3723 1
+ARC 387 -2229 52
+ARC -387 2026 79
+ARC -387 3999 3
+ARC 388 -505 289
+ARC 388 3372 13
+ARC -388 -2964 3
+ARC -388 743 368
+ARC 389 -500 64
+ARC -389 -1176 82
+ARC -389 3361 1
+ARC 390 -3567 1
+ARC 390 -391 66
+ARC -390 -4468 1
+ARC -390 -1723 54
+ARC -391 3137 54
+ARC 392 -2503 52
+ARC -392 -1178 30
+ARC 393 433 91
+ARC 393 4518 1
+ARC -393 -4536 2
+ARC -393 2961 39
+ARC 394 -2575 51
+ARC -394 -3723 1
+ARC -394 -811 28
+ARC 395 1789 50
+ARC -395 1337 45
+ARC 396 1321 68
+ARC -396 1305 57
+ARC 397 -3649 1
+ARC 397 2620 32
+ARC -397 655 51
+ARC 398 2211 58
+ARC -398 -3107 1
+ARC -398 2722 54
+ARC 399 -3805 1
+ARC 399 1751 60
+ARC -399 -2051 58
+ARC -399 3627 4
+ARC 400 482 69
+ARC 401 -3146 1
+ARC 401 1777 36
+ARC -401 -4431 1
+ARC -401 -1020 60
+ARC -402 -1154 50
+ARC 404 -3122 1
+ARC 404 2062 47
+ARC -404 -3906 1
+ARC -404 939 35
+ARC 405 -3125 1
+ARC -405 624 34
+ARC -405 3707 3
+ARC 406 -3940 1
+ARC 406 -2188 54
+ARC -406 -620 62
+ARC -406 3717 1
+ARC 407 1086 48
+ARC 407 4212 1
+ARC -407 -4424 1
+ARC 408 -4464 1
+ARC -408 454 44
+ARC -408 4003 1
+ARC 409 2144 74
+ARC -409 1458 67
+ARC 410 -2144 67
+ARC -410 1620 64
+ARC -410 4382 1
+ARC 411 2716 47
+ARC 411 3636 3
+ARC 412 1029 44
+ARC 412 4435 1
+ARC -412 2075 49
+ARC -412 4483 1
+ARC 413 449 46
+ARC 413 4162 1
+ARC -413 2867 42
+ARC 414 -1348 70
+ARC 414 3146 1
+ARC -414 -2429 50
+ARC 415 1726 9
+ARC 415 3138 48
+ARC -415 1348 44
+ARC 416 1484 1
+ARC 416 2732 58
+ARC -416 865 58
+ARC -416 3775 1
+ARC 417 -1241 50
+ARC 417 3814 2
+ARC -417 -4049 1
+ARC -417 2885 57
+ARC 418 -3337 1
+ARC 418 539 60
+ARC -418 -627 44
+ARC -418 3824 1
+ARC 419 -4478 1
+ARC 419 -949 51
+ARC -419 -2620 33
+ARC -419 3649 1
+ARC 420 -4617 1
+ARC 420 1975 61
+ARC 421 1512 79
+ARC 421 2186 1
+ARC -421 -3978 1
+ARC -421 2096 49
+ARC -422 565 60
+ARC 423 -3159 31
+ARC 423 3465 4
+ARC -423 828 59
+ARC 424 -3450 1
+ARC 424 2700 48
+ARC -424 -2969 33
+ARC -424 3729 2
+ARC 425 -4333 1
+ARC 425 -2792 40
+ARC -425 -2495 46
+ARC -425 -844 1
+ARC -426 -477 65
+ARC 427 -2160 45
+ARC 427 3866 1
+ARC -427 3601 1
+ARC 428 -2038 64
+ARC -428 4468 1
+ARC 429 -512 58
+ARC 429 4138 1
+ARC -429 1928 28
+ARC -429 4062 2
+ARC 430 -2257 58
+ARC -430 3222 32
+ARC -430 3512 1
+ARC 431 1103 58
+ARC 431 4612 1
+ARC -431 -3818 1
+ARC -431 -1159 61
+ARC 432 -3154 1
+ARC 432 2980 40
+ARC -432 -4133 1
+ARC -432 -1078 59
+ARC 433 3297 3
+ARC 434 -1039 38
+ARC -434 -3589 1
+ARC -434 -2702 42
+ARC 435 -4236 2
+ARC 435 -1812 77
+ARC -435 -2418 51
+ARC -435 4482 1
+ARC 436 -4080 1
+ARC 436 2822 35
+ARC 437 -2822 44
+ARC 438 2827 44
+ARC -438 -1411 41
+ARC -438 1716 1
+ARC 439 -943 179
+ARC 439 1506 250
+ARC -439 955 412
+ARC -439 3959 1
+ARC 440 -768 91
+ARC -440 1200 55
+ARC 441 -2137 42
+ARC -441 1100 45
+ARC 442 -4480 1
+ARC 442 2240 48
+ARC 443 963 46
+ARC -443 -1265 57
+ARC 444 -1755 61
+ARC -444 1945 57
+ARC 445 446 35
+ARC 445 4466 1
+ARC -445 2473 57
+ARC -445 3646 2
+ARC 446 1005 48
+ARC 447 -4001 1
+ARC 447 448 52
+ARC -447 -4286 1
+ARC 448 -1628 52
+ARC 449 -3034 48
+ARC 450 451 338
+ARC -450 505 319
+ARC 451 -1339 415
+ARC -451 -3372 3
+ARC 452 -578 46
+ARC -452 1894 35
+ARC -452 4485 1
+ARC 453 -4026 1
+ARC 453 -2018 62
+ARC -453 -3822 1
+ARC -453 2844 45
+ARC 454 -2823 45
+ARC 454 4017 1
+ARC 455 -4550 1
+ARC 455 -456 58
+ARC -455 -3721 1
+ARC -455 2940 35
+ARC -456 2474 59
+ARC -456 4367 1
+ARC 457 4517 1
+ARC -457 -4591 1
+ARC 458 -2479 42
+ARC 458 3245 2
+ARC -458 -2563 53
+ARC 459 -3702 2
+ARC 459 2663 54
+ARC -459 -1273 45
+ARC 460 -1759 59
+ARC 460 4397 2
+ARC -460 2790 64
+ARC -460 4295 1
+ARC 461 -1946 51
+ARC -461 2919 36
+ARC 462 -3282 3
+ARC 462 -463 44
+ARC -462 -2597 38
+ARC -462 4460 1
+ARC -463 -2356 25
+ARC 464 1215 127
+ARC 464 3582 2
+ARC 464 4158 3
+ARC -464 -4601 1
+ARC -464 1901 175
+ARC 465 1311 64
+ARC 465 3209 1
+ARC -465 -4167 1
+ARC -465 1687 54
+ARC -466 -493 60
+ARC -466 4193 2
+ARC 467 -4534 1
+ARC -467 -552 53
+ARC 468 -4186 1
+ARC 468 534 49
+ARC -468 1743 45
+ARC 469 2616 32
+ARC -469 -4546 1
+ARC -469 2257 53
+ARC 470 -3941 1
+ARC 470 -2253 73
+ARC -470 1819 29
+ARC -470 3966 2
+ARC -471 -712 69
+ARC -471 3880 1
+ARC 472 -556 50
+ARC -472 1648 46
+ARC -472 3357 1
+ARC 473 1699 48
+ARC -473 -3254 1
+ARC -473 -2497 72
+ARC 474 2384 66
+ARC -474 3191 56
+ARC -474 3785 4
+ARC 475 578 29
+ARC -475 -805 52
+ARC 476 -3827 1
+ARC 476 2485 46
+ARC -476 540 40
+ARC 477 4363 1
+ARC -477 -1818 47
+ARC -477 4330 1
+ARC 478 -480 61
+ARC -478 934 88
+ARC 479 480 57
+ARC -479 -1857 56
+ARC -479 3238 13
+ARC 480 1763 69
+ARC -480 1921 64
+ARC 481 1290 5
+ARC 481 1968 40
+ARC -481 3989 4
+ARC 482 -2638 43
+ARC 482 3328 3
+ARC -482 -3617 2
+ARC 483 -4532 1
+ARC 483 1467 39
+ARC -483 1120 69
+ARC -483 4132 1
+ARC 484 -839 38
+ARC -484 -3988 1
+ARC -484 594 59
+ARC 485 825 44
+ARC -485 1359 55
+ARC -485 3092 1
+ARC 486 2107 1
+ARC -486 -1262 4
+ARC 487 -2758 37
+ARC -487 3156 46
+ARC 488 -489 56
+ARC -488 2971 59
+ARC -488 3214 6
+ARC 489 4235 2
+ARC 490 724 38
+ARC 490 3296 3
+ARC -490 822 36
+ARC 491 -4234 1
+ARC 491 2007 34
+ARC -491 -1943 1
+ARC -491 2829 31
+ARC 492 -2007 45
+ARC 492 4234 1
+ARC -492 -3089 47
+ARC -493 -4549 58
+ARC -493 -3550 2
+ARC 494 -2328 56
+ARC -494 4591 1
+ARC 495 -4387 1
+ARC 495 496 62
+ARC -495 860 38
+ARC 496 1364 52
+ARC 497 -4402 1
+ARC 497 -1930 44
+ARC -497 2779 41
+ARC 498 -2078 56
+ARC -498 3650 1
+ARC 499 2262 38
+ARC -499 4531 1
+ARC 500 3429 1
+ARC -500 -563 62
+ARC -500 4386 1
+ARC 501 -773 39
+ARC 501 4416 1
+ARC -501 2137 39
+ARC -501 4285 1
+ARC 502 2272 63
+ARC -502 -1964 2
+ARC -502 1452 64
+ARC -503 -2909 1
+ARC -503 2443 63
+ARC -505 4130 2
+ARC 506 1059 53
+ARC 507 -3897 1
+ARC 507 -1831 55
+ARC -507 4526 1
+ARC 508 1635 30
+ARC -508 -1693 38
+ARC -509 1571 47
+ARC 510 914 48
+ARC 510 4548 1
+ARC -510 -680 33
+ARC 511 2035 65
+ARC 511 3845 1
+ARC -511 -2218 22
+ARC -511 3770 1
+ARC 513 514 47
+ARC -513 1284 41
+ARC 514 -3217 1
+ARC 514 658 51
+ARC -514 -3930 1
+ARC 515 -3426 1
+ARC 515 -1524 71
+ARC -515 -2139 20
+ARC 516 1511 48
+ARC -516 881 53
+ARC 517 -3584 2
+ARC 517 903 73
+ARC -517 3933 1
+ARC 518 -520 42
+ARC 519 520 33
+ARC -519 3123 37
+ARC 520 3777 1
+ARC -520 4055 1
+ARC 521 -3951 1
+ARC 521 1392 86
+ARC -521 792 55
+ARC 522 -3347 3
+ARC 522 -2045 21
+ARC -522 -4609 1
+ARC -522 -1466 61
+ARC 523 996 45
+ARC -523 -3104 57
+ARC -523 4074 1
+ARC 524 3457 1
+ARC -524 1956 51
+ARC 525 -1248 61
+ARC -525 2759 69
+ARC 526 -3165 35
+ARC 526 3088 1
+ARC -526 740 52
+ARC 527 528 294
+ARC -527 -1729 374
+ARC -527 3295 1
+ARC 528 2264 350
+ARC 528 4095 2
+ARC -528 3639 1
+ARC 529 -3024 1
+ARC 529 530 70
+ARC -529 -925 53
+ARC 531 2875 50
+ARC 531 3771 1
+ARC -531 -2618 91
+ARC -531 3365 1
+ARC 532 -2325 105
+ARC -532 2665 104
+ARC 533 -2249 49
+ARC 534 -4094 1
+ARC 534 -2536 53
+ARC 535 -3535 2
+ARC 535 -1558 59
+ARC -535 -3013 39
+ARC -535 3157 7
+ARC 536 1248 63
+ARC -536 -3727 1
+ARC -536 2329 46
+ARC 537 -4165 1
+ARC 537 -3224 53
+ARC -537 -1321 53
+ARC 538 -4097 1
+ARC -538 918 44
+ARC -538 2231 18
+ARC 539 905 83
+ARC 539 3700 1
+ARC 540 -1173 55
+ARC 540 4505 1
+ARC -540 -4215 1
+ARC 541 -3939 1
+ARC 541 -1804 44
+ARC -541 -2088 51
+ARC -541 3955 1
+ARC 542 -2778 43
+ARC 542 -544 60
+ARC -542 850 47
+ARC -542 2549 43
+ARC 543 544 51
+ARC 543 2778 44
+ARC 545 -2861 49
+ARC 545 4161 1
+ARC -545 -4304 1
+ARC 546 -3412 3
+ARC 546 2370 31
+ARC -546 998 40
+ARC -546 3587 1
+ARC 547 -4099 1
+ARC 547 548 81
+ARC -547 -1330 1
+ARC -547 922 58
+ARC 548 663 54
+ARC 549 -1104 46
+ARC -549 2683 44
+ARC -549 3793 1
+ARC 550 1574 41
+ARC -550 -3323 1
+ARC -550 1479 59
+ARC 551 -1016 50
+ARC -551 -661 36
+ARC 552 -4502 1
+ARC -552 1065 43
+ARC 553 -4498 1
+ARC 553 1966 37
+ARC -553 992 37
+ARC 554 -4346 1
+ARC 554 1453 50
+ARC -554 -4206 3
+ARC -554 2501 30
+ARC 555 4381 1
+ARC -555 -2082 56
+ARC -555 4589 1
+ARC 556 -2912 1
+ARC -556 -1134 61
+ARC -556 4573 1
+ARC -557 -2151 62
+ARC -557 3481 1
+ARC 558 -1329 63
+ARC -558 2450 50
+ARC -558 4372 1
+ARC -559 -3700 1
+ARC -559 -662 67
+ARC 560 2645 1
+ARC 560 2937 48
+ARC -560 -954 68
+ARC 561 -4217 1
+ARC 561 -3464 137
+ARC -561 2468 3
+ARC -561 3261 134
+ARC 562 -3837 1
+ARC 562 -1578 91
+ARC -562 -2653 59
+ARC -562 3671 1
+ARC 564 -2174 34
+ARC 564 4414 1
+ARC -564 -4160 1
+ARC -564 -1515 52
+ARC 565 567 31
+ARC 565 4477 1
+ARC -565 3827 1
+ARC 566 4325 1
+ARC -566 -4386 1
+ARC -566 -1888 56
+ARC 567 -4439 1
+ARC 568 -4390 1
+ARC 568 569 130
+ARC -568 -1172 57
+ARC -568 3070 84
+ARC 569 570 50
+ARC 569 2972 82
+ARC 570 571 53
+ARC 571 2058 72
+ARC 571 4566 2
+ARC -571 4390 2
+ARC 572 -3512 1
+ARC 572 -3222 63
+ARC -572 -4252 1
+ARC -572 -1738 46
+ARC 573 -2294 46
+ARC -573 -598 50
+ARC -573 4571 1
+ARC 574 -2821 58
+ARC 574 4444 2
+ARC -574 2347 68
+ARC -574 4570 1
+ARC 575 -4585 1
+ARC 575 -755 69
+ARC -575 1919 54
+ARC -576 951 40
+ARC 577 -4034 1
+ARC 577 2430 43
+ARC -577 1803 44
+ARC 578 3471 1
+ARC -578 4534 1
+ARC 579 -2885 52
+ARC 579 4049 1
+ARC -579 -2660 1
+ARC -579 1610 58
+ARC 580 -907 69
+ARC -580 -2906 44
+ARC -580 4126 1
+ARC 581 -4118 1
+ARC 581 1553 46
+ARC -581 -1313 62
+ARC 582 -1785 53
+ARC 582 4277 2
+ARC 583 1264 21
+ARC 583 4502 1
+ARC -583 -2857 68
+ARC -583 4007 1
+ARC 584 -4092 1
+ARC 584 585 310
+ARC -584 1655 298
+ARC -584 3170 3
+ARC 585 -1753 1
+ARC 585 586 332
+ARC 586 587 339
+ARC 586 4535 1
+ARC 587 588 337
+ARC 588 1003 367
+ARC -588 4092 2
+ARC 589 -1003 343
+ARC 589 1753 15
+ARC -589 -3847 1
+ARC 590 -4460 1
+ARC 590 2597 38
+ARC -590 -2898 60
+ARC -590 3206 7
+ARC 591 592 47
+ARC 591 3320 21
+ARC -591 -4053 1
+ARC -591 -2612 49
+ARC 592 1204 50
+ARC 593 -3660 1
+ARC 593 2532 37
+ARC -593 2483 49
+ARC 594 945 40
+ARC 595 2422 45
+ARC -595 3452 2
+ARC 596 -597 25
+ARC -596 1098 25
+ARC 597 -3586 1
+ARC -597 -2355 38
+ARC -597 3869 1
+ARC -598 1069 73
+ARC -598 3207 1
+ARC 599 600 72
+ARC -599 1376 63
+ARC 600 2343 47
+ARC -600 3581 1
+ARC 601 602 385
+ARC 601 3904 1
+ARC -601 -3388 1
+ARC -601 688 372
+ARC 602 603 390
+ARC 602 3662 1
+ARC 603 -2378 3
+ARC 603 604 433
+ARC 604 605 442
+ARC 604 3664 3
+ARC 605 606 201
+ARC 605 1107 252
+ARC 606 -1949 136
+ARC 606 607 65
+ARC 607 -2457 61
+ARC 607 4567 1
+ARC 608 -1244 310
+ARC 608 3117 5
+ARC -608 -1846 337
+ARC -608 3633 1
+ARC -608 3877 1
+ARC 609 1004 54
+ARC -609 -3587 1
+ARC 610 -1449 65
+ARC -610 -4117 1
+ARC -610 -2297 45
+ARC 611 -2609 1
+ARC 611 1955 61
+ARC -611 -4389 1
+ARC 612 -4341 1
+ARC 612 1582 56
+ARC -612 -3740 1
+ARC -612 682 62
+ARC 613 1049 40
+ARC 613 3435 1
+ARC -613 -1610 52
+ARC -613 2660 7
+ARC 614 769 64
+ARC 614 3834 1
+ARC -614 1013 29
+ARC -614 4301 1
+ARC 615 4207 1
+ARC -616 -4528 1
+ARC -616 668 59
+ARC 617 -4194 1
+ARC 617 -3124 51
+ARC 618 -1151 60
+ARC 618 3371 1
+ARC -618 -625 70
+ARC 619 -665 91
+ARC 619 4111 1
+ARC -619 3464 175
+ARC -619 4217 1
+ARC -620 -1205 49
+ARC 621 -843 72
+ARC -621 -2071 37
+ARC -621 3254 2
+ARC 622 -4054 1
+ARC -622 -1499 90
+ARC -622 4016 1
+ARC 623 2882 44
+ARC -623 -963 48
+ARC -623 3854 1
+ARC 624 -2477 34
+ARC 625 -4207 1
+ARC -625 -4203 1
+ARC -625 2661 51
+ARC 626 -4384 1
+ARC 626 -2724 48
+ARC -626 -3465 3
+ARC -626 3159 28
+ARC -627 -4448 2
+ARC -627 1515 45
+ARC 628 -4321 1
+ARC 628 1657 56
+ARC -628 -2828 55
+ARC -628 3539 1
+ARC 629 -1297 50
+ARC 629 3925 1
+ARC -629 1960 61
+ARC -629 4322 1
+ARC 630 -4052 1
+ARC 630 -1649 59
+ARC -630 2383 62
+ARC 631 -2547 48
+ARC -631 2602 31
+ARC 632 -2832 56
+ARC 632 3960 1
+ARC 633 -4201 1
+ARC 633 -981 54
+ARC -633 862 50
+ARC -633 3689 1
+ARC 634 -727 34
+ARC -634 2021 57
+ARC -634 3280 2
+ARC 635 1226 56
+ARC 635 4417 1
+ARC -635 -3533 1
+ARC -635 2945 37
+ARC 636 -1044 48
+ARC 636 4569 1
+ARC -636 -1770 58
+ARC -636 2863 1
+ARC 637 -3778 1
+ARC 637 -1015 56
+ARC -637 -3971 1
+ARC -637 1312 41
+ARC 638 -2423 50
+ARC 638 3169 1
+ARC 639 -1130 48
+ARC 640 -3436 52
+ARC -640 -1566 65
+ARC 641 -642 68
+ARC -641 3436 60
+ARC 642 3317 4
+ARC 643 -4256 1
+ARC -643 -4141 1
+ARC -643 729 55
+ARC -644 2034 74
+ARC 645 -4179 2
+ARC 645 -1058 59
+ARC -645 -3525 3
+ARC -645 2248 41
+ARC 646 -1310 36
+ARC -646 1020 40
+ARC -646 4431 1
+ARC 647 -2009 51
+ARC 647 4541 1
+ARC -647 2577 69
+ARC -647 3383 1
+ARC 648 2965 38
+ARC 648 4022 4
+ARC -648 -2883 1
+ARC -648 -1292 51
+ARC 649 -2207 36
+ARC -649 -2908 42
+ARC 650 -1956 47
+ARC -650 2111 40
+ARC 651 1731 41
+ARC -651 -770 34
+ARC 652 1326 47
+ARC 652 3835 1
+ARC -652 -2306 43
+ARC -652 4580 1
+ARC 653 -1051 50
+ARC -654 -3427 31
+ARC -654 -2241 1
+ARC 655 -4517 1
+ARC 655 -1802 46
+ARC -655 -4366 1
+ARC 656 2402 57
+ARC 656 3969 2
+ARC -656 -2400 1
+ARC -656 2545 76
+ARC 657 -658 32
+ARC 657 3217 4
+ARC 659 -747 47
+ARC -659 -3214 1
+ARC -659 -2446 51
+ARC 660 -1864 70
+ARC -660 1449 32
+ARC 661 -3642 1
+ARC -661 -1709 51
+ARC -661 3420 4
+ARC -662 1010 39
+ARC -662 3765 2
+ARC 663 -1716 1
+ARC 663 1411 67
+ARC -663 4099 1
+ARC 664 -2320 56
+ARC 664 3728 1
+ARC -664 -1325 57
+ARC -665 -807 91
+ARC 666 -1226 23
+ARC -666 -896 54
+ARC 667 -2646 57
+ARC 667 -1240 1
+ARC -667 4524 1
+ARC 668 -3219 1
+ARC 668 -1574 40
+ARC 669 -3992 1
+ARC 669 -1373 59
+ARC -669 1526 56
+ARC -669 3585 1
+ARC 670 2547 37
+ARC 670 4103 1
+ARC -670 -4176 1
+ARC -670 -2661 42
+ARC 671 672 399
+ARC 671 4581 1
+ARC -671 -3631 1
+ARC -671 1746 331
+ARC 672 -837 397
+ARC 673 1379 397
+ARC 673 2322 2
+ARC -673 -3568 1
+ARC -673 -1667 440
+ARC 674 -2260 53
+ARC 674 3494 7
+ARC -674 -4602 1
+ARC -674 1772 47
+ARC 675 -1076 43
+ARC 675 3444 3
+ARC -675 -4155 1
+ARC -675 867 36
+ARC 676 -4392 1
+ARC -676 2508 51
+ARC -676 4185 1
+ARC 678 -1046 57
+ARC 678 4213 2
+ARC -678 -4334 1
+ARC -678 -3032 48
+ARC 679 -2666 52
+ARC 679 4140 1
+ARC 680 4196 2
+ARC -680 -822 52
+ARC -680 3050 1
+ARC 681 -1050 59
+ARC 681 3881 1
+ARC -681 -4257 1
+ARC -681 -1560 45
+ARC 682 -1350 54
+ARC 682 3702 2
+ARC 683 -2462 57
+ARC -683 2034 68
+ARC 684 -2389 1
+ARC 684 796 180
+ARC -684 -3294 1
+ARC -684 1465 133
+ARC 685 -3637 1
+ARC 685 -2230 50
+ARC -685 -1898 51
+ARC -685 4269 1
+ARC 686 1533 226
+ARC -686 -2107 226
+ARC 687 -4282 2
+ARC 687 1346 56
+ARC -687 -3843 1
+ARC -687 2205 64
+ARC 688 703 373
+ARC 689 -2381 2
+ARC 689 1646 51
+ARC -689 1345 52
+ARC -689 3470 2
+ARC 690 -2169 41
+ARC -690 3366 1
+ARC 691 -4227 1
+ARC 691 1418 52
+ARC -691 2274 36
+ARC -691 3745 1
+ARC -692 -869 59
+ARC -692 4113 1
+ARC 693 -2262 42
+ARC -693 -4013 1
+ARC -693 1935 49
+ARC 694 2129 71
+ARC 694 3618 1
+ARC -694 -2686 39
+ARC -694 2336 5
+ARC 695 -3618 1
+ARC 695 -2129 62
+ARC -695 -915 56
+ARC -696 1140 55
+ARC 697 -2685 47
+ARC -697 -4198 1
+ARC 698 1497 397
+ARC -698 -2371 314
+ARC 699 2575 60
+ARC -699 -3945 1
+ARC 700 701 42
+ARC 700 3920 1
+ARC -700 -1460 44
+ARC 701 -1534 52
+ARC 701 4488 2
+ARC 702 -704 323
+ARC 702 3698 2
+ARC -702 -3170 1
+ARC -702 -1655 328
+ARC 703 -3698 1
+ARC 703 704 323
+ARC -703 3388 1
+ARC 705 1349 50
+ARC -705 -2576 29
+ARC -705 3779 1
+ARC 706 -2437 42
+ARC 706 4476 1
+ARC -706 -3779 1
+ARC -706 2576 38
+ARC 707 -3483 1
+ARC 707 2635 42
+ARC -707 3767 1
+ARC 708 709 184
+ARC 708 4597 1
+ARC -708 -2936 1
+ARC -708 -1784 225
+ARC 709 -2213 124
+ARC 709 1293 65
+ARC 710 -2587 45
+ARC 710 4297 3
+ARC -710 -3260 1
+ARC -710 3087 53
+ARC -711 -902 200
+ARC -712 1768 62
+ARC -713 -1988 47
+ARC -713 4084 1
+ARC 714 -3111 54
+ARC 714 4199 1
+ARC -714 -1747 48
+ARC -714 4356 1
+ARC 715 1322 54
+ARC 715 3781 1
+ARC -715 -4116 1
+ARC -715 1617 42
+ARC -716 3941 2
+ARC 717 -1665 56
+ARC 717 4439 1
+ARC -717 864 43
+ARC 718 -4042 2
+ARC 718 -737 61
+ARC -718 -1291 45
+ARC 719 -4129 1
+ARC 719 1622 38
+ARC -719 -1887 40
+ARC 720 -1841 81
+ARC 720 4560 1
+ARC -720 -3064 1
+ARC -720 2698 43
+ARC 721 -1337 47
+ARC 721 4604 1
+ARC -721 -2069 58
+ARC -721 3423 4
+ARC 722 -2074 80
+ARC 722 3329 2
+ARC -722 1950 59
+ARC 723 -4223 1
+ARC 723 1030 65
+ARC -723 -3750 1
+ARC -723 -1214 55
+ARC 724 -2155 38
+ARC 725 -4344 1
+ARC 725 2917 51
+ARC -725 1587 52
+ARC 726 -2917 50
+ARC 726 4344 1
+ARC -726 750 80
+ARC 727 -3673 1
+ARC -728 -4063 1
+ARC -728 2164 56
+ARC 729 -3616 1
+ARC 729 2161 35
+ARC 730 -1436 64
+ARC 730 3950 1
+ARC -730 -924 43
+ARC 731 732 73
+ARC -731 2771 41
+ARC -731 2801 3
+ARC 732 733 155
+ARC -732 1811 132
+ARC 733 -736 310
+ARC -733 -1899 132
+ARC -733 3267 43
+ARC 734 -2076 312
+ARC -734 935 257
+ARC -734 2077 57
+ARC 735 736 311
+ARC -735 2076 311
+ARC -736 -2390 43
+ARC -737 -1467 57
+ARC -737 4532 1
+ARC 738 -3865 61
+ARC -738 1603 43
+ARC 739 -740 53
+ARC -739 3865 53
+ARC 740 4508 1
+ARC -740 -4228 2
+ARC 741 -1931 48
+ARC 741 4547 2
+ARC -741 -3761 1
+ARC -741 3012 30
+ARC 742 -3654 1
+ARC 742 1702 357
+ARC -742 -3491 372
+ARC -742 -3153 1
+ARC 743 744 398
+ARC 743 4413 2
+ARC 744 745 409
+ARC 744 3234 3
+ARC 745 3884 1
+ARC 746 1623 35
+ARC 746 4168 1
+ARC -746 -3359 1
+ARC -746 -931 55
+ARC 747 4188 1
+ARC -747 -3634 1
+ARC 748 749 186
+ARC -748 -2098 136
+ARC -748 2165 52
+ARC 749 750 358
+ARC -749 1722 154
+ARC 750 751 361
+ARC 750 1879 60
+ARC 751 752 362
+ARC -751 3891 3
+ARC 752 -1088 158
+ARC 752 1192 261
+ARC -752 -2101 63
+ARC 753 754 99
+ARC -753 -1382 120
+ARC -753 4094 1
+ARC 754 3596 248
+ARC -754 -2041 152
+ARC -755 -764 49
+ARC -755 4471 1
+ARC 756 1899 66
+ARC -756 2892 45
+ARC 758 -2144 65
+ARC -758 833 62
+ARC 759 2133 419
+ARC 759 4419 1
+ARC -759 1177 435
+ARC 760 761 254
+ARC 760 2213 139
+ARC -760 -2133 402
+ARC 761 762 70
+ARC 761 2134 186
+ARC 762 1075 65
+ARC 762 4098 1
+ARC 763 1780 194
+ARC -763 1719 207
+ARC -764 1153 48
+ARC 765 -4292 1
+ARC 765 -1145 52
+ARC -765 3065 57
+ARC -765 3998 2
+ARC 766 1984 59
+ARC 766 2881 51
+ARC -766 -1843 83
+ARC -766 2127 76
+ARC 767 -1984 39
+ARC -767 2265 69
+ARC 768 4042 1
+ARC -768 1945 48
+ARC 769 -3308 1
+ARC 769 -2628 49
+ARC 770 -2081 1
+ARC -770 844 2
+ARC -770 2495 42
+ARC 771 1080 40
+ARC -771 -923 39
+ARC 772 -3536 2
+ARC 772 2447 63
+ARC -772 -4397 1
+ARC -772 1759 35
+ARC -773 -1004 32
+ARC -773 4147 2
+ARC 774 2534 3
+ARC 774 4268 1
+ARC -774 2964 5
+ARC 775 -1199 30
+ARC 775 776 24
+ARC -775 -1198 33
+ARC -775 1917 42
+ARC 776 -2962 27
+ARC 776 3872 3
+ARC 777 2422 45
+ARC -777 1419 49
+ARC -777 3961 1
+ARC 778 3550 1
+ARC 778 4549 45
+ARC -778 -3430 1
+ARC -778 2762 49
+ARC 779 -1966 41
+ARC -779 -2276 78
+ARC -779 3718 1
+ARC 780 -781 69
+ARC -780 -4494 2
+ARC -780 1705 83
+ARC 781 -3471 1
+ARC -781 -3923 3
+ARC -781 -3635 33
+ARC 782 -4407 1
+ARC 782 1438 49
+ARC -782 2440 51
+ARC 783 1319 59
+ARC -783 -804 70
+ARC -783 4056 1
+ARC 784 843 56
+ARC -784 857 50
+ARC 785 1391 60
+ARC -785 -1390 53
+ARC 786 -2602 44
+ARC 786 3323 1
+ARC -786 3927 1
+ARC 787 -2692 1
+ARC 787 788 63
+ARC -787 -4262 1
+ARC -787 -2056 62
+ARC 788 -2562 67
+ARC 789 -3509 1
+ARC 789 2728 69
+ARC -789 -3718 1
+ARC -789 2276 65
+ARC 790 821 28
+ARC -790 -3950 1
+ARC -790 2564 56
+ARC 791 -806 69
+ARC -791 4359 1
+ARC 792 -4393 1
+ARC 792 3225 78
+ARC -792 -4470 2
+ARC 793 3701 4
+ARC -793 -3402 2
+ARC -793 3306 19
+ARC -794 1739 53
+ARC -794 3762 1
+ARC 795 1864 62
+ARC 796 -1907 2
+ARC 796 797 190
+ARC 797 798 170
+ARC 798 1877 164
+ARC -798 2704 10
+ARC 799 -4081 1
+ARC 799 1670 37
+ARC -799 -4458 1
+ARC -799 3274 51
+ARC 800 2894 75
+ARC -800 1485 44
+ARC -801 -2438 70
+ARC 802 -1867 69
+ARC -802 -2987 39
+ARC -802 3731 7
+ARC 803 -2299 48
+ARC -803 -1115 79
+ARC -803 4266 1
+ARC -804 3001 71
+ARC 805 -3524 1
+ARC -805 -4523 1
+ARC 806 -4331 1
+ARC -806 -3245 1
+ARC -806 2479 18
+ARC 807 -4111 1
+ARC 808 2121 54
+ARC -808 -2662 42
+ARC -808 4490 3
+ARC -809 -4320 1
+ARC 810 1178 56
+ARC 810 3711 1
+ARC -810 -4113 1
+ARC -810 869 64
+ARC -811 3166 46
+ARC -811 4429 2
+ARC -811 4436 1
+ARC 812 -2722 54
+ARC 812 3107 1
+ARC -812 -1464 2
+ARC -812 1448 45
+ARC 813 814 23
+ARC -813 3010 15
+ARC 814 3454 22
+ARC 814 4441 1
+ARC -814 -4326 2
+ARC 815 816 42
+ARC -815 -942 49
+ARC -816 2811 29
+ARC 817 -818 32
+ARC 817 1035 29
+ARC -817 1556 49
+ARC -817 3501 5
+ARC -818 -942 38
+ARC 819 4086 1
+ARC 819 4128 100
+ARC -819 -4009 1
+ARC -819 -929 86
+ARC 820 2838 5
+ARC -820 -3701 1
+ARC -820 -2988 57
+ARC 821 -1369 60
+ARC -821 4320 1
+ARC -822 -3480 1
+ARC 823 -3675 1
+ARC 823 3003 47
+ARC -823 -2362 1
+ARC -823 -1105 78
+ARC -824 833 59
+ARC -825 4000 4
+ARC -826 -1143 49
+ARC -826 3677 1
+ARC 827 -951 49
+ARC -827 -4566 1
+ARC -827 -2058 57
+ARC 828 4051 1
+ARC -828 3499 1
+ARC 829 2764 64
+ARC 829 4197 1
+ARC 830 -3913 1
+ARC 830 -831 64
+ARC -830 -3266 1
+ARC -830 -1531 71
+ARC -831 -4205 1
+ARC -831 -3356 55
+ARC 832 -4005 1
+ARC -832 944 42
+ARC 833 -834 92
+ARC 833 1457 8
+ARC -834 -1458 89
+ARC 835 -4076 1
+ARC 835 -836 53
+ARC -835 -2024 32
+ARC -835 3171 15
+ARC -836 -842 60
+ARC 837 -4581 1
+ARC -837 1666 349
+ARC -837 4358 1
+ARC 838 839 56
+ARC -838 -4018 1
+ARC -838 -2121 53
+ARC 839 -2533 76
+ARC 839 3521 7
+ARC -839 -945 89
+ARC -839 3988 3
+ARC 840 1790 39
+ARC 840 3632 3
+ARC -840 -4294 1
+ARC -840 -2158 52
+ARC 841 3413 1
+ARC -841 -4017 1
+ARC -841 2723 48
+ARC 842 4076 5
+ARC -842 -1847 60
+ARC -842 2765 5
+ARC 843 4355 2
+ARC -843 4511 2
+ARC 845 -846 42
+ARC -845 1084 50
+ARC 846 2225 43
+ARC -846 1377 83
+ARC 847 -1935 52
+ARC 847 4013 1
+ARC -847 -1627 35
+ARC 848 -4152 1
+ARC 849 1507 44
+ARC 849 3000 2
+ARC -849 4227 2
+ARC 850 -2090 42
+ARC 851 852 112
+ARC -851 -2665 120
+ARC 852 2003 108
+ARC 852 3670 1
+ARC -852 -3742 1
+ARC 853 -2422 45
+ARC -853 -3758 2
+ARC -853 -1480 37
+ARC 854 -856 358
+ARC 854 3517 1
+ARC -854 -3959 1
+ARC -854 -955 364
+ARC 855 856 364
+ARC -855 -3720 1
+ARC -855 1183 345
+ARC -856 4555 2
+ARC 857 1831 64
+ARC 857 3897 2
+ARC -857 4018 1
+ARC 858 -1550 62
+ARC -858 2113 32
+ARC -858 3432 6
+ARC 859 -4128 105
+ARC 859 -4086 1
+ARC -859 -2217 119
+ARC -859 3459 1
+ARC -860 3968 1
+ARC 861 -4277 2
+ARC -861 3892 1
+ARC 862 2614 43
+ARC 863 4067 1
+ARC 864 1608 30
+ARC 864 3928 1
+ARC -864 3310 4
+ARC 865 -4613 1
+ARC 866 -867 66
+ARC 866 4155 1
+ARC -866 -2934 3
+ARC -866 2399 46
+ARC 868 -2808 1
+ARC 868 1206 47
+ARC -868 -4403 1
+ARC -868 -884 29
+ARC 870 -4561 1
+ARC 870 -1754 47
+ARC -870 -3233 23
+ARC -870 4308 1
+ARC 871 -3072 1
+ARC 871 872 43
+ARC -871 -3047 86
+ARC -871 3260 1
+ARC 872 873 57
+ARC 873 1692 51
+ARC 873 3706 1
+ARC -873 3072 3
+ARC 874 2158 76
+ARC 874 4294 2
+ARC -874 -1038 53
+ARC 875 1058 45
+ARC 875 4100 1
+ARC -875 -3736 1
+ARC -875 2717 44
+ARC 876 4109 2
+ARC -876 -3854 1
+ARC -876 -1315 82
+ARC 877 878 379
+ARC 877 2623 36
+ARC -877 -4314 1
+ARC -877 1258 570
+ARC 878 879 355
+ARC 878 2194 27
+ARC 879 880 327
+ARC 879 2793 12
+ARC 880 -2813 1
+ARC 880 -1953 322
+ARC 881 -882 63
+ARC -881 -4359 1
+ARC 882 4366 1
+ARC -882 -3629 1
+ARC -882 2110 46
+ARC 883 4254 1
+ARC -883 -4477 1
+ARC -883 1441 54
+ARC -884 2866 62
+ARC 885 3139 53
+ARC 885 3181 5
+ARC -885 896 44
+ARC 886 2253 44
+ARC 886 4032 1
+ARC -886 -4342 1
+ARC -886 -1057 38
+ARC 887 -888 49
+ARC 887 4450 1
+ARC -887 -3313 1
+ARC -887 3314 64
+ARC -888 -3874 1
+ARC 889 890 83
+ARC 889 3903 1
+ARC -889 -3881 1
+ARC -889 -1207 77
+ARC 890 -891 78
+ARC 891 -3903 1
+ARC -891 -3092 1
+ARC -891 -1359 63
+ARC 892 -4279 1
+ARC 892 -1608 36
+ARC -892 2222 67
+ARC -892 4472 1
+ARC 893 -2040 43
+ARC -893 -2039 41
+ARC 894 2539 39
+ARC -894 2289 38
+ARC 895 -3775 1
+ARC 895 -1808 40
+ARC 896 2132 1
+ARC -896 -4471 1
+ARC 897 1861 58
+ARC 897 4462 1
+ARC -897 3224 54
+ARC -897 4165 1
+ARC 898 2471 42
+ARC 898 3853 1
+ARC 899 -4509 1
+ARC 899 -1810 54
+ARC -899 -2025 49
+ARC 900 -2062 42
+ARC 900 3122 4
+ARC -900 2314 74
+ARC 901 -2472 37
+ARC 901 3694 7
+ARC -901 1180 62
+ARC -901 3830 1
+ARC 902 2354 2
+ARC -902 -4487 1
+ARC -902 -1902 192
+ARC 903 2182 63
+ARC 904 1864 78
+ARC -904 -1864 46
+ARC 905 1747 82
+ARC 906 -3105 56
+ARC 906 3766 1
+ARC 907 -4418 1
+ARC -907 1458 57
+ARC 908 -3991 1
+ARC -908 1575 53
+ARC 909 -1074 56
+ARC -909 -4028 1
+ARC -909 1717 50
+ARC 910 -1127 65
+ARC 910 911 324
+ARC -910 -965 425
+ARC 911 912 367
+ARC 912 -4060 1
+ARC 912 -2415 421
+ARC -912 3551 1
+ARC 913 -4284 1
+ARC 913 1070 460
+ARC -913 2415 436
+ARC -913 4545 1
+ARC 914 4509 1
+ARC 915 4599 2
+ARC -915 -4375 1
+ARC -915 1733 37
+ARC -916 -1722 42
+ARC 917 -2862 1
+ARC 917 2135 61
+ARC -917 -4373 1
+ARC 918 2571 51
+ARC 919 -2566 59
+ARC -919 -1405 40
+ARC -919 3507 6
+ARC 920 2884 41
+ARC 920 3629 1
+ARC -920 1527 45
+ARC -920 3848 1
+ARC 921 -4519 1
+ARC -921 -1791 42
+ARC -921 3477 1
+ARC 922 -2874 34
+ARC 923 -4590 1
+ARC -923 -3621 1
+ARC -923 2220 26
+ARC 924 925 77
+ARC -924 -2667 69
+ARC -924 926 40
+ARC 925 -2524 50
+ARC 926 2524 55
+ARC 926 4305 1
+ARC 927 -2785 58
+ARC 927 3502 1
+ARC 928 1755 34
+ARC 928 4478 1
+ARC -929 -1306 85
+ARC 930 -4467 1
+ARC -930 -1500 63
+ARC -930 -1272 1
+ARC -931 -2327 52
+ARC 932 -4323 1
+ARC 932 -1987 70
+ARC -932 -3477 1
+ARC 933 -934 54
+ARC -933 -3366 1
+ARC -933 -980 48
+ARC 934 -978 45
+ARC -934 -1763 52
+ARC 935 -3602 1
+ARC 935 1900 257
+ARC 936 -4174 1
+ARC 936 2245 193
+ARC -936 -1900 202
+ARC 937 938 130
+ARC -937 -2245 168
+ARC 938 -3009 89
+ARC 938 1397 38
+ARC 939 -3438 1
+ARC 939 -940 48
+ARC -940 -1087 47
+ARC 941 -2454 1
+ARC 941 990 44
+ARC -941 1885 50
+ARC -941 3514 3
+ARC -942 -2811 24
+ARC -942 -1035 48
+ARC -943 -2455 1
+ARC -943 2028 155
+ARC -944 -4332 1
+ARC 946 947 78
+ARC 946 3605 2
+ARC -946 -4451 1
+ARC -946 985 72
+ARC -948 -962 56
+ARC -949 1460 54
+ARC -949 4186 1
+ARC 951 -4559 1
+ARC -951 4578 1
+ARC 952 -3666 1
+ARC 952 -2574 44
+ARC -952 -2566 57
+ARC 953 -1959 70
+ARC 953 4072 1
+ARC -953 -1418 65
+ARC 954 -4543 1
+ARC -954 -3669 1
+ARC -954 2401 46
+ARC 956 1224 481
+ARC -956 -1223 511
+ARC 957 2296 441
+ARC -957 -3947 1
+ARC -957 -1224 468
+ARC 958 959 182
+ARC -958 -2017 295
+ARC 959 -2296 388
+ARC -959 2191 196
+ARC 960 -4161 1
+ARC 960 2861 48
+ARC -960 -2314 58
+ARC -960 4455 1
+ARC 961 2627 69
+ARC -961 -3248 2
+ARC -961 2328 57
+ARC 962 4160 1
+ARC -962 -3767 1
+ARC -962 -1647 41
+ARC -963 -3657 3
+ARC 964 -3023 21
+ARC 964 4537 1
+ARC -964 966 45
+ARC -964 4542 1
+ARC 965 -4545 1
+ARC -965 -1601 399
+ARC 966 2726 82
+ARC 966 4175 1
+ARC -967 -3049 1
+ARC -967 3020 37
+ARC 968 1308 62
+ARC 968 4521 1
+ARC 969 -3502 1
+ARC 969 2785 45
+ARC -969 -3557 1
+ARC -969 -1166 38
+ARC 970 -1017 55
+ARC 971 972 50
+ARC -971 4245 1
+ARC 972 -2914 1
+ARC 972 3040 37
+ARC -972 -3255 1
+ARC -973 -4525 1
+ARC -973 -3405 1
+ARC -973 2817 39
+ARC 974 2777 1
+ARC -974 -2255 45
+ARC -974 4302 1
+ARC 975 -1782 47
+ARC -975 -2187 53
+ARC -975 3673 1
+ARC 976 -1605 61
+ARC -976 -3251 47
+ARC 977 -1365 54
+ARC 977 4412 1
+ARC -977 -3404 1
+ARC -977 1969 50
+ARC -978 -2462 51
+ARC 979 -3609 1
+ARC 979 -1936 65
+ARC -979 -3452 1
+ARC -980 -1965 58
+ARC -981 -2132 1
+ARC -981 2197 66
+ARC 982 2628 53
+ARC 982 3308 2
+ARC -982 1947 45
+ARC 983 984 75
+ARC 983 4089 1
+ARC -983 -4497 2
+ARC 984 -986 78
+ARC 984 4451 2
+ARC 985 -4089 1
+ARC 985 986 71
+ARC -987 1335 37
+ARC 988 1335 2
+ARC 989 3189 36
+ARC 989 3735 2
+ARC -989 -3751 1
+ARC -989 -1707 71
+ARC 990 2418 43
+ARC 991 1040 54
+ARC -991 -3280 1
+ARC -991 2688 56
+ARC -992 3617 1
+ARC 993 -2961 68
+ARC -993 -4199 1
+ARC -993 3111 56
+ARC 994 2925 54
+ARC 994 4222 2
+ARC -994 -4066 1
+ARC -994 -3147 34
+ARC 995 -3564 1
+ARC -995 -4555 1
+ARC -995 -1624 63
+ARC 996 -4396 1
+ARC 996 2799 30
+ARC -996 4523 1
+ARC 997 2171 55
+ARC 997 3839 1
+ARC -997 -4316 1
+ARC 998 -4136 1
+ARC 998 -2551 37
+ARC 999 -4051 1
+ARC -999 2503 74
+ARC 1000 1189 323
+ARC -1000 -3752 354
+ARC -1000 3542 1
+ARC 1001 1609 216
+ARC 1001 3730 2
+ARC -1001 -1218 240
+ARC 1002 -1569 49
+ARC 1002 4343 3
+ARC -1002 1903 52
+ARC -1003 -4535 1
+ARC -1004 3760 1
+ARC 1005 -3590 1
+ARC 1005 -3056 48
+ARC -1005 -3418 1
+ARC 1006 1339 376
+ARC 1007 1234 58
+ARC 1007 1489 56
+ARC -1007 1271 69
+ARC 1008 -1489 49
+ARC -1008 2575 55
+ARC 1009 -1465 100
+ARC 1009 3294 2
+ARC -1009 -3682 1
+ARC -1009 2305 173
+ARC 1010 1990 59
+ARC 1011 -1587 49
+ARC -1011 -1715 52
+ARC -1012 -4226 1
+ARC -1012 1958 42
+ARC 1013 -1725 49
+ARC 1013 4530 1
+ARC 1014 -3774 1
+ARC 1014 -2092 49
+ARC -1014 1156 5
+ARC 1016 4035 1
+ARC -1016 2480 37
+ARC -1016 2967 4
+ARC 1017 -4481 1
+ARC 1018 -3306 29
+ARC 1018 3402 2
+ARC -1018 -4586 2
+ARC -1018 2712 68
+ARC 1019 1678 42
+ARC 1019 4596 1
+ARC -1019 2448 43
+ARC -1019 3249 3
+ARC 1021 -1824 1
+ARC 1021 1022 36
+ARC -1021 -4312 1
+ARC -1021 -1658 61
+ARC 1022 1023 35
+ARC 1022 4189 1
+ARC 1023 -1661 39
+ARC 1024 -2336 1
+ARC 1024 2686 52
+ARC -1024 -2671 47
+ARC -1024 -2036 2
+ARC 1025 -3264 32
+ARC 1025 4380 1
+ARC -1025 -1302 51
+ARC 1026 -4153 2
+ARC 1026 3362 45
+ARC 1027 1925 52
+ARC -1027 2265 47
+ARC 1028 -2102 51
+ARC 1029 -1575 22
+ARC 1030 -3371 3
+ARC 1030 1570 55
+ARC -1031 -1980 56
+ARC 1032 -3126 1
+ARC 1032 2375 64
+ARC -1032 2814 8
+ARC 1033 -1800 30
+ARC 1033 3299 6
+ARC -1033 -1618 37
+ARC -1033 4497 1
+ARC 1034 -2236 31
+ARC 1036 1201 46
+ARC 1036 4594 1
+ARC -1036 -2299 65
+ARC 1037 3160 75
+ARC 1037 3437 2
+ARC -1037 4120 1
+ARC 1038 2773 1
+ARC -1038 1649 55
+ARC 1039 4335 2
+ARC -1039 1437 35
+ARC 1040 -4612 1
+ARC 1040 3182 51
+ARC -1040 -3911 1
+ARC -1041 -1973 21
+ARC -1041 2295 20
+ARC 1042 -3674 1
+ARC 1042 -1043 76
+ARC -1042 -1053 64
+ARC -1042 4156 1
+ARC -1043 -1187 81
+ARC -1044 -3142 2
+ARC -1044 3079 40
+ARC 1045 -2538 37
+ARC -1045 -1422 32
+ARC -1046 2786 76
+ARC -1046 4309 1
+ARC 1047 -1048 44
+ARC -1047 1872 61
+ARC -1047 3918 1
+ARC 1048 4449 1
+ARC -1048 2239 43
+ARC 1049 -4041 1
+ARC 1049 -2411 59
+ARC -1050 -4303 1
+ARC -1050 1952 61
+ARC 1051 -4168 1
+ARC -1051 2363 37
+ARC 1052 -2765 1
+ARC 1052 1847 76
+ARC -1052 4328 1
+ARC -1053 -1761 49
+ARC 1054 -1055 79
+ARC -1054 1924 69
+ARC 1055 -3810 1
+ARC -1055 -2542 40
+ARC 1056 -3216 18
+ARC 1056 -3051 32
+ARC -1056 -2037 53
+ARC -1057 -4146 1
+ARC -1057 2232 39
+ARC 1059 -4171 1
+ARC 1059 -1878 63
+ARC -1059 4303 2
+ARC 1060 1061 84
+ARC -1060 -3235 49
+ARC -1060 3098 33
+ARC 1061 2537 82
+ARC -1061 4552 1
+ARC 1062 -1794 27
+ARC -1062 -1452 44
+ARC 1063 -4040 1
+ARC 1063 -2642 39
+ARC -1063 -2375 48
+ARC -1063 3126 1
+ARC -1064 -4083 1
+ARC -1064 -1967 92
+ARC 1065 -1375 49
+ARC 1065 3907 1
+ARC -1065 3409 1
+ARC -1066 1914 398
+ARC 1067 -2696 46
+ARC 1067 4006 1
+ARC -1067 2311 80
+ARC -1067 3593 5
+ARC 1068 -3735 2
+ARC 1068 -3189 36
+ARC -1068 1123 56
+ARC 1070 1071 481
+ARC 1070 2936 1
+ARC 1071 1072 472
+ARC -1071 4284 1
+ARC 1072 1073 427
+ARC -1072 4060 2
+ARC 1073 1074 273
+ARC 1073 1784 221
+ARC -1073 1127 81
+ARC 1074 1718 223
+ARC 1075 2695 52
+ARC 1075 4411 1
+ARC -1076 -2368 1
+ARC -1076 2772 41
+ARC 1077 4486 1
+ARC -1077 2317 47
+ARC -1077 4540 1
+ARC 1079 -1410 51
+ARC -1079 -3845 1
+ARC -1079 -2035 67
+ARC 1080 -4047 1
+ARC 1080 1317 45
+ARC -1080 4590 1
+ARC 1081 -3040 28
+ARC 1081 2914 5
+ARC -1081 -3797 2
+ARC -1081 2488 46
+ARC 1082 -3022 31
+ARC 1082 -1281 38
+ARC 1082 1083 42
+ARC -1082 -3121 1
+ARC -1082 -2067 97
+ARC 1083 2366 3
+ARC -1083 -1825 5
+ARC 1084 -4506 1
+ARC 1084 -3651 2
+ARC 1084 -3532 140
+ARC -1084 -2227 89
+ARC -1084 4507 1
+ARC 1085 -2542 15
+ARC -1085 2542 26
+ARC 1086 -3210 1
+ARC 1086 3135 48
+ARC 1087 3438 1
+ARC -1087 -1123 50
+ARC -1087 4515 1
+ARC -1088 1509 161
+ARC 1089 -3316 1
+ARC 1089 1090 363
+ARC -1089 -2321 387
+ARC -1089 4465 1
+ARC 1090 1981 372
+ARC 1091 1092 38
+ARC -1091 3915 40
+ARC 1092 -3968 1
+ARC -1092 3914 1
+ARC 1093 1094 35
+ARC -1093 -2284 59
+ARC 1094 -3813 1
+ARC 1094 -2054 46
+ARC -1094 3823 1
+ARC 1095 -4490 1
+ARC 1095 2662 48
+ARC -1095 -2235 33
+ARC 1096 1991 42
+ARC 1096 3725 1
+ARC -1096 2410 37
+ARC 1097 -1606 41
+ARC 1097 4561 1
+ARC -1097 1173 58
+ARC 1098 -3591 1
+ARC 1098 1099 47
+ARC -1098 3586 1
+ARC 1099 -3039 59
+ARC -1100 3676 1
+ARC 1101 -2248 44
+ARC 1101 3525 4
+ARC -1101 -2447 59
+ARC -1101 3536 5
+ARC -1102 2558 43
+ARC 1103 1184 46
+ARC 1104 -4050 1
+ARC -1104 -3615 1
+ARC -1104 1282 76
+ARC -1105 -2488 48
+ARC -1105 3797 1
+ARC 1106 -2655 57
+ARC -1106 2470 49
+ARC 1107 1108 222
+ARC 1108 1109 211
+ARC -1108 -3904 1
+ARC 1109 -2572 197
+ARC -1109 -3662 1
+ARC 1110 -1112 49
+ARC -1110 2572 49
+ARC 1111 1112 214
+ARC -1111 -2840 216
+ARC -1111 3985 1
+ARC 1112 -1694 140
+ARC -1112 3262 10
+ARC 1113 -2052 1
+ARC 1113 2053 66
+ARC -1113 -2301 80
+ARC -1113 3566 3
+ARC 1114 1115 60
+ARC 1114 2094 49
+ARC -1114 1933 55
+ARC -1114 2517 49
+ARC 1116 1265 43
+ARC -1116 3498 3
+ARC -1116 3937 48
+ARC -1116 4270 1
+ARC 1117 1118 51
+ARC -1117 2173 48
+ARC 1118 -3977 1
+ARC 1118 1119 56
+ARC -1118 2138 3
+ARC 1120 2877 2
+ARC 1120 3748 33
+ARC 1121 -2608 45
+ARC 1121 2607 5
+ARC 1122 -1401 84
+ARC -1123 -4515 1
+ARC 1124 1704 350
+ARC -1124 -2264 355
+ARC 1125 -1704 381
+ARC -1125 3752 383
+ARC -1126 -1289 48
+ARC 1128 -1905 1
+ARC 1128 -1129 60
+ARC -1128 -1681 65
+ARC -1128 3756 1
+ARC -1129 1757 57
+ARC 1130 -4414 1
+ARC -1130 -3196 45
+ARC -1130 4192 1
+ARC 1131 -2452 27
+ARC 1131 3468 5
+ARC -1131 -3807 1
+ARC -1131 1501 47
+ARC 1132 -3468 2
+ARC 1132 2452 52
+ARC -1132 -1941 35
+ARC -1132 3982 5
+ARC 1133 -1968 50
+ARC 1133 -1290 1
+ARC -1133 -4328 1
+ARC -1133 -1200 48
+ARC -1134 2157 72
+ARC 1135 1136 65
+ARC -1135 2256 45
+ARC 1136 -1328 54
+ARC 1136 4499 1
+ARC -1136 -4276 1
+ARC 1137 -4218 1
+ARC 1137 -1906 49
+ARC 1138 -1334 40
+ARC 1138 3382 2
+ARC -1138 2348 33
+ARC -1138 4475 1
+ARC 1139 -1140 57
+ARC -1139 -1743 54
+ARC 1140 1211 58
+ARC -1140 -1211 38
+ARC 1141 -1275 37
+ARC 1141 3531 1
+ARC -1141 1525 66
+ARC -1141 4410 1
+ARC 1142 -4329 1
+ARC 1142 2802 57
+ARC -1142 -3127 1
+ARC -1142 -2581 43
+ARC -1143 -4565 1
+ARC -1143 2002 76
+ARC 1144 -4416 1
+ARC -1144 3069 47
+ARC -1144 3543 1
+ARC -1145 -1996 44
+ARC 1146 -1392 51
+ARC 1146 3951 1
+ARC -1146 2491 24
+ARC 1147 -3537 81
+ARC -1147 -1814 91
+ARC -1147 3800 1
+ARC 1148 -1613 127
+ARC -1148 3537 126
+ARC 1149 1150 93
+ARC -1149 1961 91
+ARC 1150 1724 39
+ARC 1150 2656 30
+ARC -1150 -3692 1
+ARC -1151 -3505 1
+ARC -1151 -3158 50
+ARC 1152 -2556 49
+ARC 1152 3563 1
+ARC -1152 -3924 1
+ARC -1152 3037 56
+ARC 1153 1493 47
+ARC 1153 3963 1
+ARC -1153 -4551 1
+ARC 1154 -3760 1
+ARC -1154 1513 54
+ARC 1155 1899 66
+ARC -1155 -2575 62
+ARC 1157 1247 57
+ARC -1157 2478 62
+ARC 1158 2478 129
+ARC -1158 1247 105
+ARC -1159 -3328 1
+ARC -1159 2638 62
+ARC 1160 1410 56
+ARC -1160 -2558 49
+ARC 1161 1162 51
+ARC -1161 -2422 46
+ARC 1162 -3967 1
+ARC 1162 1163 51
+ARC -1162 2428 52
+ARC 1163 1164 57
+ARC 1164 1581 38
+ARC -1164 3967 2
+ARC 1165 -2156 46
+ARC 1165 3474 19
+ARC -1165 1887 48
+ARC -1166 1332 55
+ARC -1166 4146 1
+ARC 1167 1168 61
+ARC -1167 -2278 39
+ARC 1168 -3200 38
+ARC 1168 -2453 54
+ARC -1168 -1948 41
+ARC 1169 1744 28
+ARC -1169 2318 48
+ARC 1170 1190 57
+ARC -1170 -2351 47
+ARC -1170 3504 3
+ARC 1171 1172 47
+ARC -1171 1268 48
+ARC -1172 4503 1
+ARC -1173 -4338 1
+ARC -1174 -3362 33
+ARC -1174 4153 2
+ARC -1175 2019 72
+ARC -1175 3603 5
+ARC -1176 -2652 82
+ARC -1177 -1294 73
+ARC 1178 4050 1
+ARC 1179 1659 60
+ARC 1179 4608 1
+ARC -1179 1225 58
+ARC 1180 -1381 58
+ARC 1181 1182 37
+ARC 1181 4166 1
+ARC -1181 1380 56
+ARC 1182 -1962 45
+ARC 1183 -1497 346
+ARC 1184 -4197 1
+ARC 1184 -2764 61
+ARC -1184 -4147 2
+ARC 1185 1186 51
+ARC 1185 3408 8
+ARC 1186 -1626 48
+ARC 1186 4039 1
+ARC 1187 3674 1
+ARC -1187 -3544 1
+ARC -1187 -3053 52
+ARC 1188 -3681 1
+ARC 1188 2244 65
+ARC -1188 -3994 1
+ARC -1188 -1238 41
+ARC 1189 1682 318
+ARC 1190 -3562 1
+ARC 1190 -2373 57
+ARC -1190 3358 1
+ARC 1191 -4588 1
+ARC 1191 1310 45
+ARC 1192 -4151 1
+ARC 1192 1193 245
+ARC -1192 -3276 1
+ARC 1193 -3596 223
+ARC 1194 -3392 1
+ARC 1194 1195 223
+ARC -1194 -1882 189
+ARC -1194 2360 52
+ARC 1195 1883 226
+ARC 1196 1197 235
+ARC 1196 2920 10
+ARC -1196 -2919 263
+ARC 1197 -2263 191
+ARC 1197 -1880 53
+ARC -1198 -1918 31
+ARC -1199 -2605 26
+ARC -1200 -3875 1
+ARC 1201 -3000 1
+ARC 1201 -1508 46
+ARC 1202 -4120 1
+ARC -1202 -2514 1
+ARC 1203 -2232 49
+ARC -1203 -2451 66
+ARC 1204 1923 49
+ARC -1204 -3320 17
+ARC 1205 -3717 1
+ARC -1205 -2280 28
+ARC -1205 2731 5
+ARC 1206 -4380 1
+ARC 1206 3264 32
+ARC 1209 1210 42
+ARC -1209 -1714 40
+ARC 1210 1743 54
+ARC -1210 3628 1
+ARC -1212 2751 51
+ARC -1212 4143 1
+ARC 1213 -4112 1
+ARC 1213 1786 46
+ARC -1213 -3437 1
+ARC -1213 2968 68
+ARC -1214 2527 63
+ARC 1215 -1523 131
+ARC 1216 1217 1543
+ARC -1216 -1220 1532
+ARC -1216 3506 3
+ARC 1217 1218 1771
+ARC -1217 -1557 202
+ARC 1218 -3506 1
+ARC 1218 1219 1497
+ARC -1218 4219 1
+ARC 1219 -4219 1
+ARC 1219 1220 1533
+ARC 1222 1223 636
+ARC -1222 -3044 636
+ARC 1223 2115 79
+ARC 1223 3947 3
+ARC -1223 3784 1
+ARC -1224 3330 3
+ARC 1225 -4006 1
+ARC 1225 2696 45
+ARC -1225 -4372 1
+ARC 1226 -3999 1
+ARC -1227 -1518 67
+ARC 1228 1634 62
+ARC 1228 4310 2
+ARC -1228 -3876 1
+ARC -1228 -2421 53
+ARC 1230 2476 47
+ARC 1230 3607 1
+ARC -1230 -3961 1
+ARC -1230 -1419 70
+ARC 1231 -1705 80
+ARC 1231 4494 2
+ARC -1231 -3838 1
+ARC -1231 3155 57
+ARC 1232 -4544 1
+ARC 1232 -2201 46
+ARC -1232 -2984 1
+ARC -1232 3036 32
+ARC 1233 2721 5
+ARC 1233 3140 51
+ARC -1233 -4520 1
+ARC -1233 -1288 50
+ARC 1234 -3610 1
+ARC 1234 1466 68
+ARC 1235 1873 62
+ARC -1235 -2040 52
+ARC 1236 1237 67
+ARC -1236 -1305 65
+ARC 1237 -3182 49
+ARC 1237 3610 1
+ARC -1237 4347 1
+ARC 1239 1240 6
+ARC 1239 2646 53
+ARC -1239 1930 33
+ARC 1242 -3869 1
+ARC 1242 2355 60
+ARC -1242 -1587 61
+ARC 1243 -3117 1
+ARC 1243 1244 277
+ARC -1243 -3852 1
+ARC -1243 1695 274
+ARC 1245 2092 60
+ARC 1245 3774 2
+ARC -1245 -1779 48
+ARC 1246 2825 65
+ARC 1246 4346 1
+ARC -1246 -4337 1
+ARC -1246 -1336 34
+ARC 1247 1248 177
+ARC 1248 -2478 184
+ARC 1249 1578 76
+ARC 1249 3837 1
+ARC -1249 3192 23
+ARC 1250 2497 56
+ARC -1250 1805 43
+ARC 1251 -2837 56
+ARC 1251 1252 1
+ARC -1251 2340 55
+ARC 1252 2687 1
+ARC 1253 -3729 1
+ARC 1253 2969 31
+ARC -1253 3876 1
+ARC 1254 -1403 64
+ARC 1254 1255 55
+ARC -1254 2038 108
+ARC 1255 2239 54
+ARC 1256 1734 63
+ARC 1256 4037 1
+ARC -1256 -2166 34
+ARC 1257 -3981 2
+ARC -1257 -3868 3
+ARC -1257 2583 177
+ARC 1258 -3446 1
+ARC 1258 1259 580
+ARC 1258 3331 1
+ARC 1259 1260 86
+ARC 1259 2114 476
+ARC 1260 3044 90
+ARC 1261 -3595 1
+ARC 1261 1985 144
+ARC -1261 -2627 169
+ARC -1261 -2247 86
+ARC 1262 2106 146
+ARC -1262 -4594 1
+ARC 1263 2416 45
+ARC -1263 -1502 52
+ARC 1265 3657 2
+ARC -1265 -4474 1
+ARC 1266 -2907 30
+ARC 1266 3882 1
+ARC -1266 1980 50
+ARC 1267 2004 62
+ARC -1267 -1570 50
+ARC 1268 -2004 66
+ARC 1268 4491 1
+ARC -1268 -4503 1
+ARC 1269 1805 72
+ARC -1269 -2825 51
+ARC -1269 4316 2
+ARC 1270 2229 32
+ARC -1270 3489 32
+ARC 1271 -2711 59
+ARC 1271 4461 1
+ARC -1272 1468 1
+ARC 1273 2808 1
+ARC -1273 -1733 41
+ARC 1274 1275 50
+ARC -1274 3935 1
+ARC -1274 4110 36
+ARC -1275 -3541 1
+ARC 1276 1445 55
+ARC -1276 -3585 1
+ARC 1277 3114 68
+ARC 1277 4306 1
+ARC 1278 -1656 77
+ARC -1278 1550 72
+ARC -1279 -3809 1
+ARC -1279 -1584 51
+ARC 1280 1281 69
+ARC -1280 -3275 1
+ARC -1280 -2812 58
+ARC 1281 -1825 50
+ARC -1281 3520 2
+ARC 1282 3030 74
+ARC -1283 1389 46
+ARC -1284 3930 1
+ARC -1285 -3834 1
+ARC -1285 -2112 53
+ARC 1286 1287 354
+ARC -1286 -2143 402
+ARC 1287 -2432 306
+ARC 1287 3227 1
+ARC 1287 3836 4
+ARC -1287 -3850 3
+ARC -1287 -2807 4
+ARC -1287 -1929 10
+ARC -1288 2769 64
+ARC 1289 3893 1
+ARC -1289 4554 1
+ARC 1291 -4269 1
+ARC -1291 1292 56
+ARC -1291 4538 2
+ARC 1293 -3363 1
+ARC 1293 1294 75
+ARC 1295 -1860 59
+ARC 1295 2846 21
+ARC -1295 1472 65
+ARC 1296 1297 54
+ARC -1297 -4466 1
+ARC 1298 -2317 50
+ARC -1298 -4399 1
+ARC -1298 2251 53
+ARC -1299 3060 71
+ARC -1299 4493 1
+ARC 1300 1301 39
+ARC 1300 4278 1
+ARC -1300 -1944 51
+ARC -1300 3687 1
+ARC 1301 1355 49
+ARC 1302 -4039 1
+ARC -1302 4027 1
+ARC 1303 -4177 1
+ARC 1303 -1630 57
+ARC -1303 1791 36
+ARC 1304 -2504 45
+ARC -1304 3116 34
+ARC 1305 -4347 1
+ARC -1305 3324 1
+ARC 1306 4009 1
+ARC -1306 -3459 1
+ARC -1306 2217 123
+ARC 1307 -2994 1
+ARC 1307 1754 49
+ARC -1307 -4281 1
+ARC -1307 3286 36
+ARC 1308 -3706 1
+ARC 1308 -1692 51
+ARC 1309 -2921 106
+ARC -1309 1737 103
+ARC -1309 3422 5
+ARC 1310 4373 1
+ARC 1311 -3445 1
+ARC 1311 -1498 50
+ARC 1313 4237 1
+ARC -1313 4257 1
+ARC 1314 -2582 38
+ARC 1314 3410 41
+ARC -1314 -2382 59
+ARC -1314 4249 2
+ARC -1315 -1832 74
+ARC -1315 3269 1
+ARC -1316 2709 50
+ARC -1316 3081 1
+ARC 1317 -1450 51
+ARC 1318 2327 1
+ARC -1318 -2512 5
+ARC 1319 -1320 36
+ARC -1319 4433 1
+ARC 1320 -4102 2
+ARC -1320 1580 32
+ARC 1321 -4539 1
+ARC -1321 4474 1
+ARC 1322 1963 53
+ARC 1324 1325 109
+ARC -1324 2563 113
+ARC -1325 -4106 1
+ARC 1326 -2103 43
+ARC 1327 1328 53
+ARC 1327 3794 1
+ARC -1327 1690 26
+ARC 1329 1330 1
+ARC 1333 -3908 1
+ARC 1333 -1583 61
+ARC -1333 -3397 1
+ARC -1333 -2897 60
+ARC -1334 -2383 71
+ARC 1335 1336 46
+ARC 1335 4337 1
+ARC -1337 -3538 1
+ARC 1338 2144 71
+ARC -1338 1341 60
+ARC 1339 -4130 1
+ARC -1339 -4378 1
+ARC -1340 -3396 14
+ARC -1340 -1650 58
+ARC 1341 -3668 1
+ARC 1341 1530 45
+ARC -1341 3867 1
+ARC 1342 1706 49
+ARC -1342 -3898 1
+ARC -1342 -2886 52
+ARC 1343 4364 1
+ARC -1343 -3878 2
+ARC -1343 2525 52
+ARC 1344 -1963 46
+ARC -1344 -1947 39
+ARC -1344 4201 2
+ARC 1346 1347 64
+ARC 1347 2270 3
+ARC 1347 3515 53
+ARC -1347 4282 1
+ARC -1348 -4035 1
+ARC 1349 2442 39
+ARC -1349 -3457 1
+ARC -1350 -2663 57
+ARC -1350 3359 1
+ARC 1351 -1706 51
+ARC -1351 1679 50
+ARC 1352 -3733 1
+ARC -1352 -3518 1
+ARC -1352 -3495 1
+ARC -1352 2260 49
+ARC 1353 1354 57
+ARC -1353 2047 55
+ARC 1354 -1355 47
+ARC -1354 -4400 1
+ARC 1355 3944 3
+ARC -1355 -4278 1
+ARC -1356 4615 1
+ARC 1357 2437 38
+ARC -1357 -4558 1
+ARC 1358 -3042 78
+ARC 1358 3398 5
+ARC -1358 -2740 55
+ARC -1358 3855 2
+ARC 1360 2159 36
+ARC -1360 -2267 48
+ARC -1360 4340 1
+ARC 1361 -2833 2
+ARC 1361 2567 46
+ARC -1361 1573 49
+ARC -1361 4246 1
+ARC 1362 -2621 66
+ARC 1362 4271 1
+ARC -1362 -3205 2
+ARC -1362 2565 59
+ARC 1363 -4271 1
+ARC 1363 2621 53
+ARC -1363 2101 45
+ARC 1364 -4412 1
+ARC 1364 1365 59
+ARC -1364 4387 1
+ARC 1366 -4082 1
+ARC 1366 -2670 68
+ARC -1366 2841 57
+ARC 1367 -2586 43
+ARC 1367 4229 1
+ARC -1367 1779 42
+ARC -1367 4446 1
+ARC 1368 -4473 1
+ARC 1368 -2167 47
+ARC -1368 -4608 1
+ARC -1368 -1659 53
+ARC 1369 -4576 1
+ARC -1369 3466 1
+ARC -1369 4495 37
+ARC 1370 1371 73
+ARC 1370 4139 1
+ARC -1370 1375 54
+ARC 1372 -2212 39
+ARC -1373 2212 43
+ARC 1374 -4401 1
+ARC 1374 2176 34
+ARC -1374 4510 1
+ARC -1375 -4370 1
+ARC 1376 -2202 64
+ARC 1376 2215 1
+ARC -1376 -3581 1
+ARC 1377 -2091 86
+ARC 1377 1378 37
+ARC -1377 2331 51
+ARC 1378 -2163 43
+ARC 1379 -4358 1
+ARC 1379 -3530 324
+ARC 1380 -1961 111
+ARC -1380 1590 46
+ARC 1381 -3830 1
+ARC -1381 -1448 62
+ARC -1381 1464 4
+ARC -1382 -1511 116
+ARC 1383 -4274 1
+ARC 1383 1384 47
+ARC -1383 -3694 1
+ARC -1383 2472 50
+ARC 1385 -3905 1
+ARC 1385 1677 37
+ARC -1385 -3303 1
+ARC -1385 -1983 49
+ARC 1386 -2017 82
+ARC -1386 -2191 84
+ARC 1387 1388 70
+ARC -1387 2017 72
+ARC 1388 1554 63
+ARC -1388 -4142 1
+ARC 1389 -2773 1
+ARC 1389 1663 54
+ARC -1389 3417 1
+ARC -1390 -2599 86
+ARC 1391 2599 57
+ARC -1391 3558 1
+ARC 1393 3199 37
+ARC 1393 4562 1
+ARC -1393 -2892 43
+ARC 1394 3149 2
+ARC 1395 -4068 1
+ARC 1395 1396 55
+ARC -1395 -2185 80
+ARC -1395 4595 1
+ARC 1396 -1397 73
+ARC 1397 4068 1
+ARC 1398 -1688 74
+ARC 1399 -4012 1
+ARC 1399 -2550 44
+ARC -1399 -2090 45
+ARC 1400 -3910 1
+ARC 1400 2729 68
+ARC -1400 2203 31
+ARC -1400 3004 3
+ARC 1401 1653 21
+ARC -1401 1555 108
+ARC 1402 3906 1
+ARC -1402 1518 57
+ARC -1402 3747 1
+ARC 1404 -3004 1
+ARC 1404 -2204 40
+ARC -1404 -1889 42
+ARC -1404 4525 2
+ARC -1405 -2304 37
+ARC 1406 1645 1
+ARC -1407 2657 1
+ARC 1408 -3381 1
+ARC 1408 -2182 43
+ARC -1408 1576 95
+ARC -1408 4388 1
+ARC -1409 4239 2
+ARC 1410 3461 2
+ARC -1410 4352 1
+ARC 1412 -3401 2
+ARC 1412 1413 233
+ARC -1412 -2531 51
+ARC -1412 1495 48
+ARC -1412 2444 51
+ARC -1412 2667 79
+ARC 1413 -3958 1
+ARC 1413 1414 254
+ARC 1414 2531 56
+ARC 1414 3034 101
+ARC 1415 1416 47
+ARC -1415 -2959 51
+ARC 1416 1417 66
+ARC -1416 -2820 21
+ARC 1417 -2516 24
+ARC 1417 2168 14
+ARC -1417 -3094 1
+ARC 1418 -3989 1
+ARC 1420 -3220 43
+ARC -1420 -2705 40
+ARC 1421 1422 33
+ARC -1421 -3816 1
+ARC -1421 -1621 36
+ARC 1422 1423 36
+ARC -1422 3235 32
+ARC 1423 1424 42
+ARC 1424 -3780 1
+ARC 1424 -1834 43
+ARC 1424 1425 85
+ARC -1424 1835 85
+ARC 1425 -3612 3
+ARC 1425 -1897 39
+ARC 1425 1426 52
+ARC 1426 -2179 49
+ARC 1427 2994 1
+ARC -1427 2827 52
+ARC 1428 1429 167
+ARC 1428 3652 2
+ARC -1428 1537 162
+ARC 1429 1430 169
+ARC 1430 1431 171
+ARC -1430 3709 4
+ARC 1431 1432 114
+ARC 1431 1540 71
+ARC -1431 2146 5
+ARC 1432 1433 131
+ARC 1432 3293 7
+ARC -1432 -2150 26
+ARC 1433 2147 134
+ARC -1433 -4023 2
+ARC 1434 -2831 74
+ARC -1434 -4235 1
+ARC -1434 1443 79
+ARC -1435 2460 43
+ARC -1435 4191 4
+ARC -1436 4527 2
+ARC 1437 1503 56
+ARC 1437 4327 1
+ARC -1437 4351 1
+ARC 1439 -4379 1
+ARC 1439 2555 59
+ARC -1439 3713 1
+ARC 1440 -4137 1
+ARC 1440 2644 69
+ARC -1440 -3002 37
+ARC -1440 4251 1
+ARC 1441 1442 41
+ARC 1441 3108 1
+ARC 1442 2481 50
+ARC 1443 -4564 1
+ARC 1443 1561 69
+ARC 1444 -1942 80
+ARC 1444 4267 1
+ARC -1444 -2057 2
+ARC -1444 -1494 66
+ARC 1445 -4246 1
+ARC 1445 -1573 60
+ARC -1445 -3324 2
+ARC 1446 -1447 19
+ARC 1446 4339 1
+ARC -1446 -4159 1
+ARC -1446 3184 29
+ARC -1447 2130 14
+ARC 1449 4289 1
+ARC -1449 -4250 1
+ARC 1450 1964 1
+ARC -1450 -1622 35
+ARC -1450 4129 1
+ARC -1451 -1789 37
+ARC 1452 3634 1
+ARC 1453 -2026 63
+ARC 1454 1455 39
+ARC -1454 2966 38
+ARC 1455 -1462 58
+ARC -1455 3791 4
+ARC 1456 -3658 3
+ARC 1456 1732 38
+ARC -1456 -2940 37
+ARC -1456 3721 2
+ARC 1457 -1458 1
+ARC -1459 -3633 1
+ARC -1459 1846 336
+ARC 1460 4550 1
+ARC 1461 -3442 1
+ARC -1461 2629 35
+ARC -1461 4010 1
+ARC 1462 3642 1
+ARC -1462 2085 44
+ARC -1462 3743 3
+ARC 1463 2585 54
+ARC 1463 4123 1
+ARC -1463 3026 47
+ARC -1463 3084 4
+ARC 1468 1469 95
+ARC 1468 3749 3
+ARC -1468 -1950 98
+ARC 1470 -1756 37
+ARC -1470 2928 51
+ARC -1470 3776 1
+ARC 1472 -3063 1
+ARC 1472 3015 44
+ARC -1472 -2319 1
+ARC 1473 1474 26
+ARC 1473 3054 53
+ARC -1473 2196 62
+ARC -1473 3102 21
+ARC 1474 1475 29
+ARC 1475 1476 31
+ARC -1475 -4469 1
+ARC 1476 -4011 4
+ARC 1476 -3272 44
+ARC -1476 2319 2
+ARC -1477 -3332 2
+ARC -1477 2766 44
+ARC 1478 1630 51
+ARC 1478 4177 1
+ARC -1478 -3425 2
+ARC -1478 2350 60
+ARC 1479 4568 2
+ARC 1481 -4144 1
+ARC 1481 2357 44
+ARC -1481 1565 43
+ARC -1481 4264 1
+ARC 1482 1794 43
+ARC -1482 2046 59
+ARC 1483 -3879 1
+ARC 1483 2659 29
+ARC -1483 1983 45
+ARC -1483 3303 1
+ARC 1485 1486 55
+ARC 1485 1787 36
+ARC 1486 -1487 34
+ARC 1487 -2087 32
+ARC 1487 4395 1
+ARC -1487 -4272 2
+ARC -1487 -2995 25
+ARC -1487 3103 41
+ARC 1488 -2668 44
+ARC 1488 3021 1
+ARC -1488 -1669 52
+ARC 1489 4609 1
+ARC 1490 -2649 3
+ARC 1490 -2639 63
+ARC -1490 -1972 37
+ARC -1490 3679 1
+ARC 1491 1492 55
+ARC 1492 -2285 1
+ARC 1492 -1519 43
+ARC -1492 3479 1
+ARC 1493 1884 47
+ARC -1494 1563 59
+ARC 1495 -4305 1
+ARC 1495 1496 52
+ARC 1496 -3034 51
+ARC 1497 3720 4
+ARC -1497 3623 1
+ARC -1499 -3155 57
+ARC -1499 3838 1
+ARC -1500 1950 63
+ARC 1501 -1734 24
+ARC 1502 3223 1
+ARC -1502 2837 39
+ARC -1502 4014 5
+ARC 1503 1504 45
+ARC 1503 2271 27
+ARC 1504 -3734 1
+ARC 1504 1505 39
+ARC 1505 -1668 39
+ARC 1506 2243 96
+ARC 1506 2449 123
+ARC 1507 1508 43
+ARC 1507 4097 1
+ARC 1509 -2172 84
+ARC 1509 1510 140
+ARC -1509 2670 69
+ARC 1510 -1511 115
+ARC -1511 2535 171
+ARC 1513 -3035 28
+ARC 1513 4145 1
+ARC -1513 -3976 1
+ARC 1514 -3627 1
+ARC 1514 2051 42
+ARC 1516 4030 1
+ARC -1516 4041 1
+ARC 1517 -4293 1
+ARC 1517 2281 48
+ARC 1518 -3995 1
+ARC -1519 -2184 23
+ARC 1520 -4158 1
+ARC 1520 1521 142
+ARC 1520 3073 2
+ARC -1520 -1609 183
+ARC 1521 1522 148
+ARC 1522 1523 313
+ARC -1522 -3073 2
+ARC 1523 -3582 1
+ARC 1523 -2583 168
+ARC 1523 3868 3
+ARC -1523 4019 1
+ARC -1524 -3175 30
+ARC 1525 2557 49
+ARC 1525 4071 2
+ARC 1526 -3309 1
+ARC 1527 1528 46
+ARC 1528 2633 53
+ARC 1528 3624 3
+ARC -1528 -3848 1
+ARC 1529 -2856 43
+ARC 1529 3208 6
+ARC -1529 -3832 1
+ARC -1529 -2441 85
+ARC 1530 1531 38
+ARC -1531 3668 1
+ARC 1532 4613 1
+ARC -1532 3911 1
+ARC 1533 -2305 177
+ARC 1533 3682 1
+ARC -1533 -3861 1
+ARC -1534 -3855 3
+ARC -1534 2740 59
+ARC 1535 -2624 74
+ARC -1535 1552 49
+ARC 1536 1537 43
+ARC -1536 -1783 73
+ARC -1536 4586 2
+ARC 1537 1538 202
+ARC 1538 -1545 136
+ARC 1538 1539 65
+ARC -1538 2647 3
+ARC 1539 -1547 65
+ARC 1539 4002 1
+ARC 1540 1541 193
+ARC 1540 3806 4
+ARC -1540 -2150 131
+ARC 1541 1542 187
+ARC 1541 3253 3
+ARC 1542 1543 188
+ARC -1542 4557 1
+ARC 1543 1544 191
+ARC -1543 3714 3
+ARC 1544 -2526 1
+ARC 1544 1545 188
+ARC -1544 2526 3
+ARC 1545 1546 57
+ARC 1546 1547 56
+ARC 1546 3620 2
+ARC 1548 -1995 189
+ARC 1548 3895 2
+ARC -1548 2263 196
+ARC 1549 -2992 1
+ARC 1549 -2505 42
+ARC 1550 -4212 1
+ARC -1550 -3912 1
+ARC 1552 -1553 39
+ARC 1552 4118 1
+ARC -1552 3341 1
+ARC 1554 1644 29
+ARC 1554 4183 1
+ARC -1554 3125 2
+ARC 1555 -2013 46
+ARC 1555 3075 112
+ARC -1557 -4377 1
+ARC -1557 -4275 183
+ARC 1559 2250 62
+ARC -1560 -4010 1
+ARC -1560 2630 41
+ARC 1562 2496 58
+ARC 1562 2902 1
+ARC -1562 1906 63
+ARC -1562 4216 1
+ARC 1563 -3570 2
+ARC 1563 1970 70
+ARC -1563 2057 2
+ARC 1564 -4071 1
+ARC 1564 -2557 37
+ARC 1565 -2657 58
+ARC 1566 -4087 1
+ARC -1566 -4022 1
+ARC -1566 -2965 33
+ARC 1567 1568 48
+ARC -1567 -3759 1
+ARC -1567 2043 50
+ARC 1568 -4343 1
+ARC 1568 1569 46
+ARC -1568 -4428 1
+ARC 1570 -4348 1
+ARC 1571 1572 37
+ARC -1571 -3933 1
+ARC -1572 -3482 1
+ARC -1574 -4526 1
+ARC 1575 4513 2
+ARC -1575 -4580 1
+ARC 1576 -1577 71
+ARC 1577 -4388 1
+ARC -1577 -2061 73
+ARC -1577 4114 1
+ARC 1579 -3516 71
+ARC 1579 -3226 1
+ARC -1579 1680 43
+ARC -1579 1957 41
+ARC 1580 3226 3
+ARC 1580 3516 106
+ARC -1580 1735 49
+ARC 1581 -4189 1
+ARC 1581 1808 50
+ARC -1581 -3867 1
+ARC -1584 2352 50
+ARC 1585 -4154 1
+ARC 1585 1586 104
+ARC -1585 -2719 108
+ARC -1585 3722 3
+ARC -1587 2387 60
+ARC 1588 3460 134
+ARC -1588 -2669 133
+ARC 1589 -4166 1
+ARC 1589 1962 122
+ARC -1589 -3490 2
+ARC -1589 -3460 135
+ARC 1590 -4445 1
+ARC 1590 -2258 41
+ARC 1591 -1593 85
+ARC 1591 4425 2
+ARC 1592 1593 75
+ARC -1592 3173 52
+ARC -1593 -2853 2
+ARC 1594 1595 185
+ARC 1594 3462 1
+ARC -1594 2029 151
+ARC 1595 1596 175
+ARC 1596 1597 224
+ARC -1596 -2855 56
+ARC 1597 1598 282
+ARC 1597 3568 1
+ARC -1597 -2796 65
+ARC 1598 1809 289
+ARC 1599 3152 445
+ARC -1599 1868 451
+ARC 1600 1601 383
+ARC -1600 -2338 384
+ARC 1601 -3551 2
+ARC -1601 -3996 2
+ARC 1602 3356 42
+ARC 1602 4205 1
+ARC -1602 -2080 48
+ARC -1602 4065 1
+ARC 1603 2054 66
+ARC 1603 3813 3
+ARC -1603 -3527 2
+ARC 1604 -3269 1
+ARC 1604 1832 57
+ARC -1604 -2436 80
+ARC -1604 4361 1
+ARC 1605 4385 1
+ARC -1605 -3731 1
+ARC -1605 2987 38
+ARC 1607 -3522 4
+ARC 1607 2924 56
+ARC -1607 -4105 1
+ARC -1607 2483 63
+ARC 1609 -4019 1
+ARC 1611 1612 49
+ARC -1611 -1662 39
+ARC 1612 1613 97
+ARC -1612 -1724 55
+ARC 1613 -4420 1
+ARC -1613 -2656 45
+ARC 1614 -3800 1
+ARC 1614 1615 52
+ARC -1614 2162 42
+ARC 1615 -3537 53
+ARC 1616 -1977 57
+ARC -1616 -1976 57
+ARC 1617 1618 43
+ARC -1618 4116 2
+ARC 1619 2284 50
+ARC -1619 1815 40
+ARC -1619 3883 1
+ARC 1620 1988 44
+ARC -1621 -2494 46
+ARC 1623 1639 58
+ARC 1623 3945 1
+ARC -1624 -4437 1
+ARC -1624 -3166 35
+ARC 1625 -3408 4
+ARC 1625 1626 49
+ARC -1625 -2953 53
+ARC -1625 4430 1
+ARC 1627 4536 1
+ARC -1627 -2729 62
+ARC -1627 3910 2
+ARC 1628 4001 2
+ARC -1628 2960 52
+ARC 1629 2963 56
+ARC -1629 4252 1
+ARC 1631 1632 54
+ARC -1631 -2364 50
+ARC 1632 -2506 52
+ARC 1632 4256 1
+ARC -1632 -1653 23
+ARC 1633 -3066 29
+ARC 1633 4423 1
+ARC -1633 -4488 1
+ARC -1633 1801 45
+ARC 1634 2433 54
+ARC 1635 1636 35
+ARC 1635 4238 1
+ARC -1635 -3338 1
+ARC 1636 -1735 58
+ARC 1636 4102 2
+ARC 1637 -3744 1
+ARC 1637 1638 54
+ARC -1637 3005 3
+ARC 1638 -3132 1
+ARC 1639 -3184 34
+ARC 1639 4159 4
+ARC 1640 1641 1
+ARC 1640 4336 2
+ARC -1640 3434 6
+ARC 1641 -1643 1
+ARC 1642 -1992 2
+ARC 1642 1643 8
+ARC -1642 -4287 3
+ARC -1642 3187 10
+ARC 1643 3433 8
+ARC 1644 2031 37
+ARC 1645 -2313 72
+ARC -1645 2718 66
+ARC 1646 -2165 42
+ARC -1647 -2220 30
+ARC -1647 3621 1
+ARC 1648 2424 42
+ARC -1649 3524 1
+ARC -1650 2042 47
+ARC 1651 4616 2
+ARC -1651 -2465 77
+ARC 1652 -3671 2
+ARC 1652 2653 69
+ARC -1652 -3756 1
+ARC -1652 1681 71
+ARC 1654 -4062 2
+ARC 1654 -1928 28
+ARC -1654 3902 1
+ARC 1656 3912 1
+ARC -1656 4498 1
+ARC 1657 -2420 55
+ARC -1658 2420 43
+ARC 1660 2147 42
+ARC -1660 -4444 1
+ARC -1660 2821 46
+ARC 1661 1824 16
+ARC -1661 -2053 83
+ARC -1661 2052 3
+ARC 1662 3692 1
+ARC -1662 1961 45
+ARC 1663 -4355 1
+ARC 1663 -1982 41
+ARC 1664 -1940 112
+ARC -1664 1809 146
+ARC -1665 -4101 1
+ARC -1665 2183 54
+ARC 1666 -2322 1
+ARC 1666 3530 324
+ARC -1667 -3462 3
+ARC -1667 -1809 443
+ARC 1668 -4327 1
+ARC 1669 4300 1
+ARC -1669 -3386 1
+ARC -1669 -2951 61
+ARC 1670 1771 34
+ARC 1671 4556 2
+ARC -1671 -4537 1
+ARC -1671 3023 39
+ARC 1672 1673 339
+ARC -1672 -3318 308
+ARC -1672 -3257 10
+ARC -1672 -2195 1
+ARC 1673 1674 342
+ARC -1673 -3819 1
+ARC -1673 -2946 1
+ARC 1674 3561 345
+ARC -1674 -2793 3
+ARC 1675 3874 1
+ARC 1676 2995 22
+ARC 1676 4272 2
+ARC -1676 -3428 1
+ARC -1676 3611 29
+ARC 1677 -3748 21
+ARC 1678 -2803 60
+ARC 1678 4329 1
+ARC 1679 -3463 1
+ARC -1679 -1862 42
+ARC 1682 1683 336
+ARC 1682 3569 1
+ARC 1683 1684 345
+ARC 1683 2804 3
+ARC 1684 -3608 2
+ARC 1684 -2836 2
+ARC 1684 1685 340
+ARC 1685 -4489 1
+ARC 1685 -2367 343
+ARC 1686 -1969 66
+ARC 1686 3404 1
+ARC -1686 -1970 58
+ARC -1686 3570 6
+ARC 1688 -3244 1
+ARC -1688 -2766 60
+ARC -1688 3332 3
+ARC 1689 -1744 46
+ARC 1689 3255 1
+ARC -1689 2792 43
+ARC -1689 4333 1
+ARC 1690 -2715 1
+ARC 1690 1703 29
+ARC -1690 4576 1
+ARC 1691 -3789 1
+ARC 1691 2507 59
+ARC -1691 -4482 1
+ARC -1691 1736 62
+ARC 1693 3338 1
+ARC -1693 3053 33
+ARC -1693 3544 1
+ARC -1694 2572 153
+ARC 1695 1696 273
+ARC 1696 -1711 113
+ARC 1696 1697 165
+ARC -1696 3852 1
+ARC 1697 -3985 1
+ARC 1697 -3815 1
+ARC 1697 -3118 212
+ARC 1698 -3804 217
+ARC -1698 3118 216
+ARC 1699 -1700 46
+ARC 1699 3120 64
+ARC -1699 1700 41
+ARC -1701 -1979 45
+ARC 1702 -4456 1
+ARC 1702 -3885 1
+ARC 1702 -2534 3
+ARC 1704 4582 1
+ARC -1704 -4095 1
+ARC 1706 -2548 37
+ARC -1707 2851 62
+ARC -1707 4403 2
+ARC 1708 3811 36
+ARC 1708 4500 2
+ARC -1708 -2606 27
+ARC -1708 -2269 28
+ARC -1709 -3365 3
+ARC -1709 2617 45
+ARC 1710 1711 30
+ARC -1710 -3664 1
+ARC -1710 2456 46
+ARC -1711 2643 84
+ARC 1712 1713 51
+ARC -1712 1742 42
+ARC 1713 1714 91
+ARC -1713 -2008 41
+ARC 1714 -3628 1
+ARC 1714 2008 36
+ARC -1714 -3647 2
+ARC 1715 3978 1
+ARC -1715 2574 52
+ARC -1715 3666 2
+ARC 1717 -4098 1
+ARC 1717 -2690 37
+ARC 1718 -3424 2
+ARC 1718 -1720 211
+ARC 1719 1720 203
+ARC 1719 3424 1
+ARC -1719 -2339 2
+ARC 1721 1996 26
+ARC -1721 -2027 41
+ARC 1722 2011 110
+ARC -1723 -2211 70
+ARC 1726 1727 1
+ARC -1727 -4045 1
+ARC 1728 -3295 1
+ARC 1728 1729 370
+ARC -1728 -4057 1
+ARC -1728 -2380 2
+ARC -1728 -1871 448
+ARC 1729 -3639 1
+ARC -1730 -3990 1
+ARC -1730 3232 59
+ARC 1731 -4461 1
+ARC 1731 2711 56
+ARC -1731 2081 1
+ARC 1732 -2279 63
+ARC 1733 4400 1
+ARC 1734 3807 1
+ARC 1736 -3278 1
+ARC 1736 -2713 68
+ARC 1737 3790 94
+ARC -1738 3764 1
+ARC 1740 -1741 29
+ARC -1740 2502 29
+ARC 1741 -3683 2
+ARC -1741 -2384 48
+ARC 1742 -1743 41
+ARC -1742 3647 1
+ARC -1744 -4172 1
+ARC 1745 1766 55
+ARC 1745 1893 1
+ARC -1745 -3057 42
+ARC -1745 4020 1
+ARC 1746 -1866 331
+ARC -1747 -4518 1
+ARC 1748 1749 39
+ARC 1748 3808 3
+ARC -1748 -3201 18
+ARC -1748 3201 11
+ARC 1749 -1750 4
+ARC 1749 2407 91
+ARC -1750 2394 1
+ARC 1751 1752 69
+ARC 1752 2977 33
+ARC 1752 4592 1
+ARC -1752 3805 1
+ARC 1755 -3461 1
+ARC 1756 -4383 1
+ARC -1756 4601 1
+ARC 1757 1758 59
+ARC 1757 4163 1
+ARC -1757 1905 2
+ARC 1758 -2145 46
+ARC 1760 2594 51
+ARC 1760 4349 1
+ARC 1761 4398 1
+ARC -1761 -4435 1
+ARC -1761 -2499 24
+ARC 1762 1834 32
+ARC 1762 3780 1
+ARC -1762 -2538 48
+ARC 1764 -3268 1
+ARC 1764 1765 32
+ARC -1764 2405 53
+ARC -1764 4529 1
+ARC 1765 2694 40
+ARC 1766 1767 41
+ARC 1767 -1768 60
+ARC -1767 -1893 1
+ARC 1768 2979 1
+ARC -1768 -3880 1
+ARC 1769 -2863 1
+ARC 1769 1770 57
+ARC -1769 -2601 50
+ARC 1771 -4239 1
+ARC 1771 -1772 31
+ARC -1771 4081 1
+ARC 1773 1774 44
+ARC -1773 -3679 1
+ARC -1773 1972 45
+ARC 1774 -4070 1
+ARC 1774 1775 122
+ARC -1774 -1820 77
+ARC 1775 1776 4
+ARC 1775 2102 55
+ARC 1775 2117 102
+ARC 1776 3028 3
+ARC 1777 -2943 1
+ARC 1777 1778 60
+ARC 1779 3337 1
+ARC 1780 2066 255
+ARC -1780 2690 34
+ARC 1781 4587 1
+ARC -1781 -2632 62
+ARC 1782 4286 1
+ARC -1782 2918 54
+ARC -1783 -3364 2
+ARC -1783 2463 54
+ARC -1785 -3274 22
+ARC -1785 4458 1
+ARC 1787 1915 31
+ARC 1788 -3284 30
+ARC -1788 -2889 44
+ARC 1789 4405 1
+ARC -1789 3538 1
+ARC -1791 -4196 1
+ARC 1792 -3135 48
+ARC 1792 1793 50
+ARC -1792 -3543 1
+ARC -1792 -2972 87
+ARC 1793 -3071 46
+ARC 1793 3210 1
+ARC 1794 -4556 1
+ARC -1794 4602 1
+ARC 1795 1796 2
+ARC 1795 3351 24
+ARC 1795 4225 1
+ARC -1795 -4225 1
+ARC -1795 -2747 72
+ARC 1796 2746 1
+ARC 1798 1799 30
+ARC 1798 3648 3
+ARC -1798 2006 48
+ARC 1799 2889 45
+ARC -1800 -3074 25
+ARC 1801 1863 70
+ARC 1801 3740 1
+ARC -1802 -2651 35
+ARC -1802 -2584 4
+ARC 1803 2639 56
+ARC 1803 2649 2
+ARC -1803 -4604 1
+ARC -1804 -2731 1
+ARC -1804 2280 59
+ARC 1805 -2077 46
+ARC 1805 1806 77
+ARC 1806 1807 78
+ARC 1806 3602 1
+ARC 1807 -1900 61
+ARC -1810 -3982 1
+ARC -1810 1941 35
+ARC 1811 -3315 52
+ARC 1811 1812 80
+ARC 1813 3965 1
+ARC -1813 3661 1
+ARC -1814 2162 78
+ARC 1815 -3902 1
+ARC 1815 1816 52
+ARC 1816 -1817 47
+ARC 1817 -3883 1
+ARC -1817 -3116 36
+ARC -1817 4075 1
+ARC 1819 1820 32
+ARC -1820 -3966 1
+ARC -1820 -3028 44
+ARC 1821 -3271 1
+ARC 1821 1822 23
+ARC 1822 1823 1
+ARC 1822 1909 21
+ARC -1825 -2006 39
+ARC 1826 -2847 49
+ARC -1826 -3382 1
+ARC -1826 -2680 66
+ARC 1827 1828 79
+ARC -1827 -1934 63
+ARC 1828 1890 113
+ARC 1828 3690 4
+ARC -1828 -2520 54
+ARC 1829 -3546 1
+ARC 1829 -1891 59
+ARC -1829 -4266 1
+ARC -1829 -1933 60
+ARC 1830 -4181 1
+ARC 1830 -2100 49
+ARC -1833 -1971 74
+ARC 1835 -3099 44
+ARC 1835 1836 42
+ARC 1836 2537 43
+ARC 1837 -2388 403
+ARC 1837 1838 71
+ARC -1837 -2509 6
+ARC 1838 1839 67
+ARC 1839 -2010 64
+ARC -1839 4406 1
+ARC 1840 -4560 1
+ARC 1840 1841 79
+ARC -1840 2050 48
+ARC 1842 -2904 1
+ARC 1842 1843 72
+ARC 1842 2905 70
+ARC -1842 -2265 122
+ARC 1844 -1845 69
+ARC 1844 4332 1
+ARC 1848 1849 50
+ARC 1848 3399 3
+ARC 1849 1850 52
+ARC 1850 1851 167
+ARC -1850 -3097 116
+ARC 1851 -2046 139
+ARC 1851 -1854 137
+ARC -1851 3104 54
+ARC 1852 1853 71
+ARC 1852 3916 1
+ARC -1852 -2654 72
+ARC 1853 1854 68
+ARC -1854 -2901 65
+ARC 1855 1856 51
+ARC -1855 -2982 47
+ARC 1856 1857 51
+ARC -1856 3548 1
+ARC -1857 3919 3
+ARC 1858 -2902 1
+ARC 1858 -2496 55
+ARC -1858 -3918 1
+ARC -1858 -2099 64
+ARC 1859 1860 57
+ARC 1859 4011 3
+ARC -1859 -3128 2
+ARC -1859 -2196 58
+ARC 1863 -3232 61
+ARC 1863 3990 1
+ARC 1865 1866 301
+ARC -1865 -3227 1
+ARC -1865 2432 295
+ARC 1866 3631 1
+ARC -1866 -3836 1
+ARC 1867 4453 1
+ARC 1868 1869 466
+ARC -1868 2337 3
+ARC 1869 1870 468
+ARC -1869 4504 1
+ARC 1870 -3601 1
+ARC 1870 1871 470
+ARC -1870 3708 6
+ARC 1872 1873 54
+ARC 1873 2038 111
+ARC 1874 3101 104
+ARC 1874 3860 2
+ARC -1874 -2795 90
+ARC -1874 2392 32
+ARC 1875 -2208 38
+ARC 1875 1876 51
+ARC -1875 -2908 68
+ARC 1876 -2783 46
+ARC -1877 2389 4
+ARC -1878 -2347 54
+ARC 1879 1880 42
+ARC -1880 4082 1
+ARC 1881 1882 185
+ARC 1881 2172 59
+ARC -1881 -2363 104
+ARC -1881 -2034 147
+ARC 1883 2919 261
+ARC 1884 -3497 3
+ARC 1884 -2353 37
+ARC -1884 -3963 1
+ARC 1885 -1886 52
+ARC 1886 -3514 1
+ARC -1886 -2240 48
+ARC -1886 4480 1
+ARC 1887 4492 1
+ARC -1887 -4587 1
+ARC -1888 4176 1
+ARC -1889 -2817 37
+ARC -1889 3405 1
+ARC 1890 -3093 56
+ARC 1890 1891 65
+ARC 1892 -3492 1
+ARC 1892 -2573 44
+ARC 1894 -4280 1
+ARC 1894 -2157 43
+ARC 1895 -2697 63
+ARC 1895 4085 1
+ARC -1895 4054 1
+ARC 1896 -3753 1
+ARC 1896 1897 34
+ARC 1896 3612 3
+ARC -1896 2540 35
+ARC -1898 -2858 3
+ARC -1898 -2782 35
+ARC 1901 1902 192
+ARC 1901 4487 1
+ARC 1903 -2893 39
+ARC -1903 3443 2
+ARC 1904 -2386 24
+ARC -1904 -2130 16
+ARC 1908 -3419 5
+ARC 1908 3419 5
+ARC -1908 -3523 11
+ARC -1908 3523 3
+ARC 1909 2266 27
+ARC 1910 1911 51
+ARC -1910 -2286 50
+ARC -1910 4064 1
+ARC 1911 2491 70
+ARC -1911 -3286 35
+ARC -1911 4281 1
+ARC 1912 1913 40
+ARC 1912 2816 5
+ARC -1912 2795 42
+ARC 1913 2636 31
+ARC 1913 3625 9
+ARC 1914 -1981 423
+ARC 1914 3316 1
+ARC -1914 4514 1
+ARC 1915 -2426 43
+ARC 1915 1916 40
+ARC -1915 2983 62
+ARC 1916 -2889 55
+ARC 1917 -1918 35
+ARC -1918 2834 20
+ARC -1919 4203 1
+ARC 1920 -3960 1
+ARC 1920 2832 58
+ARC 1921 -4360 3
+ARC 1921 2693 57
+ARC 1922 -3548 1
+ARC 1922 -2787 51
+ARC -1922 2462 53
+ARC 1923 -2542 65
+ARC 1924 1925 116
+ARC -1924 2313 41
+ARC 1925 2542 95
+ARC -1926 -2475 48
+ARC -1929 -2143 11
+ARC -1930 4520 1
+ARC -1931 -2233 38
+ARC -1931 2878 8
+ARC 1932 2691 43
+ARC 1934 3545 1
+ARC -1934 2282 50
+ARC -1934 2298 1
+ARC -1936 -3048 39
+ARC 1937 1938 217
+ARC 1937 2509 2
+ARC -1937 -2359 175
+ARC -1937 2796 75
+ARC 1938 -1940 224
+ARC 1939 -2122 70
+ARC 1939 1940 324
+ARC -1939 -4406 1
+ARC -1939 -2030 428
+ARC -1942 -2324 61
+ARC -1943 2048 11
+ARC -1944 3074 51
+ARC 1945 1946 46
+ARC 1945 2082 66
+ARC 1946 -4589 1
+ARC -1947 4172 2
+ARC -1948 2410 46
+ARC -1949 -2643 111
+ARC 1951 -1952 52
+ARC 1952 -3185 1
+ARC -1953 3318 302
+ARC -1953 3782 1
+ARC -1954 -2678 46
+ARC 1956 4263 1
+ARC -1956 4157 1
+ARC 1957 -2404 42
+ARC 1957 3463 1
+ARC 1958 2730 54
+ARC 1961 -2154 51
+ARC 1962 2152 79
+ARC 1963 -4563 1
+ARC -1963 -3781 1
+ARC 1965 -3794 1
+ARC -1965 2809 60
+ARC 1966 4383 1
+ARC 1971 -3663 1
+ARC -1971 -3785 1
+ARC -1971 -3191 55
+ARC 1974 -4349 1
+ARC 1974 2438 64
+ARC -1974 -2632 56
+ARC 1976 4122 1
+ARC -1976 -4150 1
+ARC -1976 2568 53
+ARC 1977 -4122 1
+ARC -1977 -2890 2
+ARC -1977 2725 68
+ARC -1978 2666 59
+ARC 1979 -3680 1
+ARC 1980 -4241 1
+ARC -1980 4563 1
+ARC -1981 -3997 2
+ARC -1982 2477 42
+ARC 1984 3510 2
+ARC 1985 1986 100
+ARC 1985 2219 58
+ARC 1986 -2191 140
+ARC -1988 -4382 1
+ARC 1990 -2037 64
+ARC -1990 -3765 1
+ARC -1992 3704 2
+ARC 1993 -3187 9
+ARC -1993 -3188 10
+ARC -1993 3565 3
+ARC 1994 1995 35
+ARC -1994 2910 34
+ARC -1995 2041 152
+ARC 1996 4292 1
+ARC -1996 3547 1
+ARC 1997 -4031 1
+ARC -1997 -2838 2
+ARC 1998 -3986 2
+ARC 1998 1999 63
+ARC -1998 2067 49
+ARC 1999 -2001 39
+ARC 2000 2001 45
+ARC -2000 -2006 52
+ARC 2001 -3082 42
+ARC -2001 -2228 43
+ARC 2003 -2942 76
+ARC -2004 4348 2
+ARC 2005 2006 42
+ARC -2005 -3322 33
+ARC -2005 3428 1
+ARC -2009 3270 9
+ARC -2009 3901 27
+ARC 2010 -4442 1
+ARC -2010 -3297 2
+ARC 2011 -2769 55
+ARC 2011 2193 54
+ARC 2012 2013 43
+ARC -2012 -2048 32
+ARC -2013 3886 1
+ARC 2014 -2498 33
+ARC 2014 3983 1
+ARC -2014 -2022 1
+ARC 2015 2584 1
+ARC 2015 2651 39
+ARC 2016 2017 273
+ARC -2016 2037 126
+ARC -2017 4142 1
+ARC 2019 2020 53
+ARC 2020 -4438 1
+ARC 2020 2214 58
+ARC -2020 -3603 1
+ARC 2021 -2688 61
+ARC 2021 2022 2
+ARC -2023 2279 34
+ARC -2024 -2352 27
+ARC 2025 4357 1
+ARC -2025 4247 1
+ARC 2026 -3892 1
+ARC 2027 -3547 1
+ARC -2027 -4121 1
+ARC -2027 -2274 59
+ARC 2029 2359 154
+ARC 2031 4546 2
+ARC -2031 -4183 1
+ARC 2032 -2854 32
+ARC 2032 3844 1
+ARC -2032 3250 9
+ARC -2032 3406 44
+ARC 2033 2435 61
+ARC 2033 3276 1
+ARC -2033 -3857 27
+ARC -2033 -3703 1
+ARC -2036 -2254 2
+ARC 2038 2039 140
+ARC 2039 2040 97
+ARC 2042 3161 24
+ARC 2042 4501 1
+ARC -2042 -2888 9
+ARC 2043 2044 42
+ARC 2044 3175 29
+ARC -2044 4428 1
+ARC -2046 2344 80
+ARC 2047 -4114 1
+ARC 2047 2061 86
+ARC -2047 -3944 3
+ARC 2048 -3886 2
+ARC -2048 -2829 25
+ARC 2049 -4109 1
+ARC -2049 -3563 1
+ARC -2049 2556 73
+ARC 2050 -3802 1
+ARC 2050 2247 51
+ARC -2050 -2704 1
+ARC 2055 2056 77
+ARC 2055 4262 1
+ARC -2055 -2641 71
+ARC -2055 4457 1
+ARC 2059 -2841 44
+ARC -2059 -2501 30
+ARC -2059 4206 3
+ARC -2060 2188 46
+ARC 2063 2064 38
+ARC -2063 -2391 36
+ARC 2064 2065 59
+ARC -2064 -2794 23
+ARC 2065 -3101 55
+ARC -2065 3475 11
+ARC 2066 -4411 1
+ARC 2066 -2695 55
+ARC 2066 2192 205
+ARC -2066 3987 8
+ARC -2067 -2403 48
+ARC 2068 2069 58
+ARC -2069 3133 1
+ARC 2070 2071 33
+ARC -2070 -2684 43
+ARC -2071 3086 12
+ARC 2072 -2544 2
+ARC 2073 2546 78
+ARC 2073 4593 1
+ARC -2073 -4249 2
+ARC -2073 2382 59
+ARC 2075 2076 54
+ARC 2076 3115 44
+ARC -2076 -4483 1
+ARC 2078 -3413 1
+ARC -2078 4044 1
+ARC 2079 -3079 46
+ARC 2079 3142 7
+ARC -2079 -3566 3
+ARC -2079 2301 53
+ARC 2083 -2370 31
+ARC 2083 3412 2
+ARC -2083 -4596 1
+ARC -2083 2499 22
+ARC -2084 -3934 1
+ARC -2084 -2678 6
+ARC 2085 -2784 36
+ARC 2086 -4148 1
+ARC 2086 -2292 62
+ARC -2086 -2293 61
+ARC -2086 3375 1
+ARC -2087 -3036 28
+ARC -2088 -2600 51
+ARC 2089 2090 52
+ARC -2089 2942 43
+ARC -2090 -2703 45
+ARC -2091 -2312 59
+ARC -2091 -2175 69
+ARC 2093 -3138 34
+ARC 2094 2235 49
+ARC -2095 3066 57
+ARC 2096 -4253 1
+ARC 2096 2252 83
+ARC 2097 2098 66
+ARC -2097 -2435 61
+ARC -2097 3638 1
+ARC -2098 -2850 71
+ARC -2099 -2507 45
+ARC -2099 3789 1
+ARC -2100 -2887 50
+ARC -2101 -3894 1
+ARC 2102 4396 1
+ARC 2103 -3835 1
+ARC -2103 -2800 59
+ARC 2104 2259 29
+ARC 2104 4392 1
+ARC -2104 2224 47
+ARC 2106 2107 163
+ARC 2107 3861 1
+ARC 2108 -4135 1
+ARC 2108 2109 75
+ARC -2108 2664 70
+ARC 2109 -2916 33
+ARC 2109 -2869 57
+ARC 2110 2459 2
+ARC 2110 2528 65
+ARC 2111 -4238 1
+ARC -2111 3480 1
+ARC -2112 4539 1
+ARC 2114 3044 503
+ARC 2115 2116 84
+ARC 2116 2296 68
+ARC -2116 4314 1
+ARC 2117 2118 52
+ARC 2117 3195 49
+ARC 2118 2119 47
+ARC 2119 -2650 48
+ARC 2119 4107 1
+ARC -2119 -4107 1
+ARC 2120 -3173 38
+ARC 2120 2853 3
+ARC -2120 -4289 1
+ARC -2120 2923 44
+ARC -2121 -4295 1
+ARC -2122 2484 42
+ARC 2123 2124 46
+ARC 2123 3592 1
+ARC -2123 -3646 1
+ARC -2123 -2473 57
+ARC 2124 2125 44
+ARC 2124 4519 1
+ARC 2127 2128 71
+ARC 2127 2904 9
+ARC 2128 -2905 66
+ARC 2128 3560 1
+ARC 2128 3949 1
+ARC 2130 2131 15
+ARC -2130 -2131 11
+ARC 2133 -4597 1
+ARC 2134 -2192 170
+ARC 2135 2187 40
+ARC 2136 -3415 1
+ARC -2136 -3314 42
+ARC -2136 3313 1
+ARC 2137 -3676 1
+ARC 2138 2173 1
+ARC 2139 4233 1
+ARC -2139 -2960 58
+ARC -2139 2883 1
+ARC -2140 -2502 36
+ARC 2141 2142 407
+ARC 2141 3850 5
+ARC -2141 2372 3
+ARC -2141 3529 388
+ARC -2141 4033 3
+ARC 2142 2143 408
+ARC 2142 2807 6
+ARC 2145 -4163 1
+ARC -2145 -4529 1
+ARC -2145 -2405 52
+ARC 2146 -3806 1
+ARC 2147 2148 174
+ARC 2148 2149 169
+ARC -2148 4029 5
+ARC 2149 2150 166
+ARC -2149 -3253 1
+ARC -2150 3540 3
+ARC -2151 -2929 45
+ARC 2152 2153 94
+ARC 2152 4445 1
+ARC 2153 2154 51
+ARC 2153 2258 46
+ARC 2155 -3296 2
+ARC -2155 -3012 28
+ARC -2155 3761 1
+ARC -2156 -2259 53
+ARC -2157 4427 1
+ARC 2159 2160 58
+ARC 2159 3302 47
+ARC 2159 3488 1
+ARC 2162 2163 81
+ARC 2162 2312 44
+ARC 2163 2175 45
+ARC 2164 -3209 1
+ARC 2164 -3078 57
+ARC 2165 2381 1
+ARC 2166 -4044 1
+ARC -2166 -2963 38
+ARC 2168 2169 33
+ARC 2169 2170 37
+ARC -2169 2515 32
+ARC 2170 -3192 26
+ARC 2173 -3640 1
+ARC 2173 2310 45
+ARC -2174 -4119 1
+ARC 2177 2178 31
+ARC -2177 -2676 45
+ARC 2178 2179 86
+ARC 2179 -2707 42
+ARC 2179 -2181 112
+ARC -2179 -2445 76
+ARC -2179 2708 45
+ARC 2180 2181 38
+ARC -2180 2705 51
+ARC -2181 2672 76
+ARC -2182 3584 1
+ARC 2183 -3596 35
+ARC 2184 2285 5
+ARC -2184 4583 1
+ARC -2185 2680 71
+ARC -2187 2862 7
+ARC -2188 3644 5
+ARC 2189 2190 71
+ARC 2190 2724 43
+ARC 2190 4384 1
+ARC -2190 3630 3
+ARC 2192 -4419 2
+ARC 2193 -3539 2
+ARC 2193 2828 56
+ARC 2194 2195 8
+ARC 2194 3256 12
+ARC 2197 -3102 21
+ARC 2197 3503 9
+ARC 2198 2842 128
+ARC -2198 3532 135
+ARC 2199 2200 72
+ARC 2199 4544 1
+ARC -2199 -2622 52
+ARC 2200 2201 68
+ARC -2201 -3583 2
+ARC -2202 2506 61
+ARC 2203 2204 36
+ARC -2204 -4452 1
+ARC 2205 -2801 1
+ARC 2205 -2771 40
+ARC 2206 2207 27
+ARC -2206 -3475 2
+ARC -2206 2794 35
+ARC 2207 2208 23
+ARC -2207 3113 37
+ARC 2209 2210 37
+ARC 2209 3890 1
+ARC -2209 -3821 54
+ARC -2209 4240 1
+ARC 2210 2414 34
+ARC 2211 3952 1
+ARC -2211 3309 1
+ARC 2212 3979 2
+ARC -2212 3992 1
+ARC 2214 -4224 41
+ARC 2215 2506 1
+ARC 2216 -4297 1
+ARC 2216 2587 72
+ARC -2216 2363 55
+ARC -2218 -4302 1
+ARC -2218 2255 60
+ARC 2219 2596 64
+ARC 2221 -3137 1
+ARC 2222 -3932 1
+ARC 2222 3007 61
+ARC 2223 3407 84
+ARC -2223 2388 220
+ARC 2224 2839 24
+ARC -2224 -3907 2
+ARC 2225 -4507 1
+ARC 2225 2226 52
+ARC 2226 2227 55
+ARC -2227 -2331 50
+ARC -2228 2889 52
+ARC 2229 4399 1
+ARC -2229 4369 1
+ARC -2230 -2523 62
+ARC 2231 -2961 1
+ARC 2232 4077 1
+ARC 2234 -2691 30
+ARC -2234 -3340 66
+ARC 2235 -4003 1
+ARC -2235 -4078 2
+ARC -2236 2713 70
+ARC -2236 3278 2
+ARC -2237 -3198 1
+ARC -2237 2376 59
+ARC 2238 -2239 41
+ARC -2238 -4547 1
+ARC 2242 -2429 69
+ARC -2242 2429 48
+ARC 2246 -2844 41
+ARC -2246 -3141 36
+ARC 2249 -4513 1
+ARC -2249 -4187 1
+ARC -2249 3109 40
+ARC -2250 3251 41
+ARC 2251 -4245 1
+ARC 2252 -2358 63
+ARC 2252 4144 3
+ARC 2254 2671 47
+ARC -2254 -3684 3
+ARC -2254 3006 53
+ARC 2256 2678 33
+ARC 2256 3934 2
+ARC -2256 4276 1
+ARC 2257 -4345 1
+ARC 2259 -3474 1
+ARC -2261 -4110 37
+ARC -2261 -3935 3
+ARC 2262 2634 35
+ARC -2262 -2634 53
+ARC -2263 4101 1
+ARC 2264 -3542 1
+ARC 2265 -3949 1
+ARC 2265 -3560 1
+ARC 2266 -4340 1
+ARC 2266 2267 37
+ARC -2266 3271 4
+ARC 2268 2269 38
+ARC 2268 4304 1
+ARC -2268 2677 31
+ARC 2272 -3431 2
+ARC 2272 2273 118
+ARC 2273 2655 110
+ARC 2277 2278 46
+ARC -2277 2921 42
+ARC -2278 2973 53
+ARC 2279 3658 1
+ARC -2279 -2610 1
+ARC 2282 2299 54
+ARC -2283 -2911 23
+ARC -2283 4394 1
+ARC 2284 -3823 1
+ARC -2284 4464 1
+ARC 2287 -3645 1
+ARC 2287 2288 39
+ARC -2287 -2289 37
+ARC 2288 2289 32
+ARC 2289 2290 30
+ARC 2290 -2318 28
+ARC 2291 -2464 69
+ARC 2291 4133 1
+ARC -2293 2622 71
+ARC 2294 3859 1
+ARC -2294 -2700 54
+ARC -2294 3450 4
+ARC 2296 -2596 81
+ARC -2297 -3661 1
+ARC -2297 2932 52
+ARC 2298 2299 58
+ARC -2298 2519 55
+ARC 2300 -2486 50
+ARC -2300 -3243 1
+ARC -2300 2685 37
+ARC 2302 2691 1
+ARC 2304 -3507 1
+ARC -2304 -3619 2
+ARC -2304 3038 46
+ARC -2306 -2717 44
+ARC -2306 3736 3
+ARC -2307 -2343 50
+ARC 2308 2309 35
+ARC -2308 -2884 51
+ARC 2309 -2310 30
+ARC 2309 3640 4
+ARC -2309 3091 11
+ARC 2311 -2910 43
+ARC 2313 3810 1
+ARC -2314 3219 1
+ARC 2315 2316 43
+ARC -2315 -4222 1
+ARC -2315 -2993 29
+ARC -2316 -2824 47
+ARC 2317 -4213 1
+ARC 2318 3645 2
+ARC -2318 4331 1
+ARC -2320 -2543 53
+ARC -2320 2362 1
+ARC -2321 2552 381
+ARC -2321 4061 1
+ARC -2323 -4324 1
+ARC -2323 2465 63
+ARC 2324 -4267 2
+ARC 2325 3301 6
+ARC -2325 -2658 1
+ARC -2325 2986 87
+ARC 2326 2327 80
+ARC -2326 2510 70
+ARC 2328 -4193 1
+ARC 2332 -3715 1
+ARC 2332 2333 55
+ARC -2332 3059 58
+ARC 2333 2334 70
+ARC 2334 -2335 68
+ARC -2334 4371 1
+ARC 2335 3715 1
+ARC -2335 2782 41
+ARC -2335 2858 7
+ARC 2337 2338 2
+ARC 2338 3996 2
+ARC -2338 -4504 2
+ARC -2338 -3708 5
+ARC -2338 -3152 391
+ARC -2339 -3987 3
+ARC -2340 -4014 1
+ARC 2341 2342 65
+ARC -2341 -2694 53
+ARC 2342 -3467 1
+ARC 2342 -2559 39
+ARC -2342 -3768 1
+ARC 2343 -4365 1
+ARC -2343 -4599 1
+ARC 2344 2345 78
+ARC -2345 4090 1
+ARC 2346 2612 37
+ARC -2346 2926 57
+ARC 2347 -3387 1
+ARC 2352 -3171 1
+ARC -2352 3809 1
+ARC 2356 3282 1
+ARC -2356 -4229 1
+ARC -2356 2586 42
+ARC 2357 2358 50
+ARC 2357 4253 1
+ARC -2359 2855 62
+ARC 2360 -3863 1
+ARC 2360 -2416 40
+ARC 2361 4224 43
+ARC 2364 -3148 21
+ARC -2364 -3938 1
+ARC -2364 3377 49
+ARC 2365 2441 81
+ARC 2365 3832 1
+ARC -2365 -3766 1
+ARC -2365 3105 46
+ARC 2366 -2870 117
+ARC -2366 2812 60
+ARC -2366 3348 25
+ARC 2367 -3569 1
+ARC -2369 -3444 1
+ARC -2369 -2772 41
+ARC 2371 -3623 1
+ARC -2371 -4033 2
+ARC -2371 -3529 368
+ARC -2371 -2372 1
+ARC -2373 3340 56
+ARC 2376 -2631 68
+ARC 2376 3100 2
+ARC 2377 2378 3
+ARC -2377 -2572 4
+ARC -2378 4376 1
+ARC 2379 2380 2
+ARC -2379 3152 1
+ARC -2380 -4190 2
+ARC 2383 4008 1
+ARC -2383 -3719 1
+ARC 2384 3980 1
+ARC -2384 4152 1
+ARC 2385 2710 39
+ARC 2385 2876 2
+ARC 2386 -4339 1
+ARC -2386 2886 52
+ARC -2386 3898 1
+ARC 2387 2566 62
+ARC -2388 -2484 161
+ARC -2390 2681 36
+ARC -2390 4134 1
+ARC 2391 -3860 2
+ARC -2391 2783 40
+ARC 2392 2590 55
+ARC 2393 2593 41
+ARC 2394 2395 11
+ARC -2394 2930 8
+ARC 2395 2396 14
+ARC -2395 -3500 1
+ARC 2396 2397 17
+ARC -2396 -2978 1
+ARC 2397 -3485 1
+ARC 2397 2398 19
+ARC -2397 4214 1
+ARC 2398 2774 27
+ARC 2398 3973 1
+ARC 2399 -2818 42
+ARC 2399 2400 1
+ARC 2401 2439 51
+ARC 2402 -2450 53
+ARC -2403 -2947 45
+ARC 2406 -2409 49
+ARC -2406 -2931 37
+ARC -2406 2978 2
+ARC 2407 -3909 4
+ARC 2407 2408 91
+ARC 2408 -3973 2
+ARC 2408 -2775 29
+ARC 2408 2409 55
+ARC 2409 3500 3
+ARC 2410 2453 40
+ARC 2410 3200 38
+ARC -2411 -3689 1
+ARC -2411 -2615 53
+ARC 2412 2413 45
+ARC 2412 2648 1
+ARC -2412 -4008 1
+ARC 2413 -2414 45
+ARC 2414 -2648 1
+ARC -2414 -3890 1
+ARC -2416 -3711 1
+ARC 2417 3106 33
+ARC -2418 2454 1
+ARC 2419 3008 71
+ARC 2419 4173 3
+ARC -2419 2831 52
+ARC 2420 4321 1
+ARC -2420 4312 1
+ARC -2421 4096 1
+ARC -2423 -4615 1
+ARC 2424 -3068 34
+ARC -2424 -3357 1
+ARC 2425 3068 35
+ARC -2425 2511 36
+ARC -2426 3284 33
+ARC 2427 -2872 30
+ARC -2427 -3109 38
+ARC -2427 2871 28
+ARC 2428 2429 76
+ARC 2431 -3921 1
+ARC -2431 -3027 46
+ARC 2433 -2941 73
+ARC -2433 -4310 2
+ARC -2433 2941 62
+ARC 2434 -3279 1
+ARC 2434 -2798 65
+ARC -2434 4218 1
+ARC -2437 3643 1
+ARC 2438 3940 2
+ARC 2439 -3927 1
+ARC -2439 3669 1
+ARC 2440 3818 1
+ARC -2440 -4301 1
+ARC 2442 -2659 30
+ARC 2442 3879 1
+ARC -2442 3942 1
+ARC -2445 3220 75
+ARC -2446 -4230 50
+ARC -2446 -4210 1
+ARC 2448 -2966 33
+ARC 2450 -3969 1
+ARC 2451 3665 2
+ARC -2451 -2923 57
+ARC -2451 3387 1
+ARC 2456 -4376 1
+ARC 2456 2457 50
+ARC 2458 -3206 2
+ARC 2458 2898 55
+ARC 2459 2529 1
+ARC 2461 -4162 1
+ARC 2461 -2937 64
+ARC 2463 2464 51
+ARC -2464 -4538 1
+ARC 2465 -4616 1
+ARC 2466 -2809 1
+ARC 2467 -3261 120
+ARC -2467 3453 119
+ARC 2468 3453 1
+ARC 2469 2783 30
+ARC -2469 -3101 29
+ARC -2470 3190 42
+ARC 2471 -3156 42
+ARC 2474 2475 59
+ARC 2475 -3604 1
+ARC -2475 -4367 1
+ARC 2477 -3707 1
+ARC -2477 -4540 1
+ARC 2481 -3339 1
+ARC 2481 2482 46
+ARC -2481 -3108 1
+ARC 2483 2484 116
+ARC 2485 -4233 1
+ARC 2486 -4030 1
+ARC 2487 -3212 37
+ARC 2487 4043 1
+ARC 2489 2490 1
+ARC -2489 -4362 1
+ARC -2489 4236 2
+ARC 2490 -3281 23
+ARC 2490 4184 4
+ARC -2490 -3115 46
+ARC 2491 -4318 6
+ARC 2491 2492 59
+ARC 2491 3826 4
+ARC 2492 2493 3
+ARC 2492 3258 57
+ARC 2493 3009 1
+ARC 2494 3816 1
+ARC -2494 2676 41
+ARC -2497 3796 1
+ARC -2498 2891 55
+ARC 2502 -3710 3
+ARC -2502 3683 1
+ARC 2503 -3643 1
+ARC -2503 3418 1
+ARC 2504 -4075 2
+ARC -2504 2627 90
+ARC -2505 -3031 38
+ARC -2505 3746 1
+ARC 2510 -2512 116
+ARC -2510 2513 37
+ARC 2511 2512 124
+ARC 2511 2949 37
+ARC -2511 -2571 122
+ARC 2513 -3068 24
+ARC 2515 2516 38
+ARC -2516 2679 41
+ARC 2517 -3690 1
+ARC 2517 2518 50
+ARC 2518 -3473 1
+ARC 2518 3093 54
+ARC 2519 -4611 1
+ARC 2519 2520 44
+ARC 2521 -4553 1
+ARC 2521 -2522 9
+ARC -2521 2522 5
+ARC -2522 4553 1
+ARC 2523 3637 1
+ARC 2525 -2799 40
+ARC -2527 3750 2
+ARC 2528 2529 45
+ARC 2529 3218 32
+ARC 2529 3440 1
+ARC 2532 2533 33
+ARC -2533 -2924 56
+ARC 2535 2536 55
+ARC 2535 2632 118
+ARC 2537 -2540 42
+ARC 2537 2538 81
+ARC -2538 -2699 2
+ARC 2539 2540 42
+ARC -2539 -4356 1
+ARC 2540 -2699 35
+ARC -2541 -2859 50
+ARC -2541 3614 1
+ARC 2544 -3190 41
+ARC -2544 -2655 51
+ARC 2545 2818 36
+ARC 2545 2934 10
+ARC 2546 -4085 1
+ARC 2546 2697 47
+ARC 2547 -4100 1
+ARC 2549 2550 38
+ARC 2549 4012 1
+ARC 2552 -4577 1
+ARC 2552 2553 380
+ARC 2553 -4600 387
+ARC 2554 -3722 2
+ARC 2554 2719 121
+ARC -2554 -4465 1
+ARC -2554 -4061 1
+ARC -2554 4577 1
+ARC -2554 4600 393
+ARC 2558 -4352 1
+ARC -2558 -4038 1
+ARC -2560 -3151 1
+ARC -2560 3285 38
+ARC 2561 2562 1
+ARC -2561 -2728 1
+ARC 2562 2692 2
+ARC -2562 2788 67
+ARC -2563 4106 1
+ARC 2564 2852 66
+ARC 2564 3265 13
+ARC 2565 -3265 4
+ARC 2565 -2895 54
+ARC -2566 -2781 57
+ARC 2567 -2616 48
+ARC 2568 2569 1
+ARC 2568 2578 53
+ARC 2569 2581 1
+ARC 2570 2571 79
+ARC -2570 -2949 44
+ARC -2570 3067 35
+ARC 2578 2579 57
+ARC 2579 2580 51
+ARC 2579 3127 2
+ARC -2579 4150 1
+ARC 2580 2581 52
+ARC -2582 2849 36
+ARC -2582 3755 2
+ARC 2588 -3598 1
+ARC 2588 2589 42
+ARC -2588 2795 42
+ARC 2589 2590 53
+ARC 2590 -2806 94
+ARC 2591 -2816 1
+ARC 2591 2592 46
+ARC -2591 2637 47
+ARC 2592 2593 50
+ARC 2593 -3613 89
+ARC 2593 -3029 7
+ARC 2594 -3081 1
+ARC 2594 -2709 72
+ARC -2595 -2955 19
+ARC -2596 3595 3
+ARC 2599 -3558 1
+ARC -2599 -3120 56
+ARC 2600 -3955 1
+ARC 2601 3991 1
+ARC -2601 3246 23
+ARC -2601 3385 1
+ARC -2602 4467 2
+ARC 2603 2604 7
+ARC -2603 -2730 4
+ARC 2604 -3872 2
+ARC 2604 2605 40
+ARC -2604 -3993 2
+ARC -2604 3048 33
+ARC 2605 2962 28
+ARC -2606 2677 36
+ARC 2611 2990 36
+ARC -2611 2865 36
+ARC -2612 4522 1
+ARC 2613 -2876 2
+ARC 2613 -2710 58
+ARC 2614 -4455 1
+ARC 2614 2615 44
+ARC -2614 -4548 1
+ARC 2616 2833 2
+ARC -2616 3198 1
+ARC 2617 2618 47
+ARC -2618 -3420 1
+ARC 2619 2657 57
+ARC 2622 3583 1
+ARC -2622 -3375 3
+ARC 2623 2946 24
+ARC 2623 3819 5
+ARC 2624 -3341 1
+ARC -2624 -4143 2
+ARC -2624 -2751 52
+ARC 2625 2626 30
+ARC -2625 2860 30
+ARC -2626 2888 16
+ARC 2629 -3745 1
+ARC 2629 -2630 37
+ARC -2631 2929 47
+ARC 2635 3888 36
+ARC 2636 2637 38
+ARC -2637 -3625 1
+ARC 2640 2641 70
+ARC -2640 -2791 81
+ARC -2641 -3833 1
+ARC 2643 -4567 1
+ARC 2644 -4485 1
+ARC 2647 -3653 1
+ARC -2650 3028 47
+ARC 2652 -4309 1
+ARC -2652 -4446 1
+ARC 2654 4073 1
+ARC -2654 2835 52
+ARC -2654 4415 1
+ARC -2655 3431 1
+ARC 2657 -4264 1
+ARC -2658 -2921 1
+ARC 2664 2701 41
+ARC 2664 3307 28
+ARC -2664 -4024 2
+ARC 2665 3742 4
+ARC -2665 -3301 1
+ARC -2666 3083 1
+ARC 2669 3490 1
+ARC 2669 3840 1
+ARC -2669 3606 125
+ARC -2669 3798 1
+ARC -2669 3948 1
+ARC 2672 -3014 39
+ARC 2672 2673 39
+ARC 2673 2674 42
+ARC 2674 2675 43
+ARC -2674 3753 1
+ARC 2675 2676 45
+ARC -2675 3451 1
+ARC 2676 2699 43
+ARC 2677 -3755 1
+ARC 2677 -3411 33
+ARC 2677 -2849 40
+ARC 2679 -3192 27
+ARC -2680 -4595 1
+ARC 2681 2682 51
+ARC 2682 -2932 55
+ARC 2682 4117 1
+ARC -2682 -4134 1
+ARC 2683 2684 39
+ARC 2684 -3086 2
+ARC -2684 -3793 1
+ARC 2685 4389 1
+ARC 2687 -3998 1
+ARC 2687 -3065 57
+ARC 2689 2689 4
+ARC 2691 -3900 1
+ARC 2693 -2982 35
+ARC 2694 3768 1
+ARC -2694 3268 5
+ARC 2701 2702 26
+ARC 2701 2915 20
+ARC -2703 2942 33
+ARC 2705 2706 46
+ARC -2705 2707 34
+ARC 2706 -2708 42
+ARC 2708 -3825 2
+ARC 2712 -3499 1
+ARC -2714 -3915 35
+ARC 2721 3822 1
+ARC 2723 -4290 2
+ARC 2723 2823 44
+ARC 2728 -2789 55
+ARC 2730 3993 2
+ARC -2730 4226 1
+ARC 2733 2734 197
+ARC 2733 2735 4
+ARC 2733 2756 3
+ARC -2733 -2748 82
+ARC 2734 2734 6512
+ARC 2734 2735 240
+ARC 2734 2756 168
+ARC -2734 -2763 59
+ARC -2734 -2755 121
+ARC 2735 2749 233
+ARC -2735 -2763 3
+ARC -2735 -2755 3
+ARC 2736 2737 161
+ARC -2736 -4307 2
+ARC -2736 -4273 1
+ARC -2736 -2750 192
+ARC 2737 2738 148
+ARC -2737 -4221 1
+ARC -2737 -3572 4
+ARC -2737 -3136 5
+ARC 2738 2739 131
+ARC -2738 -4180 1
+ARC -2738 -4015 3
+ARC 2739 2746 96
+ARC -2739 -4350 2
+ARC -2739 -4315 3
+ARC -2739 -4244 2
+ARC 2741 -2839 46
+ARC -2741 -3080 6
+ARC -2741 3215 27
+ARC 2742 2743 94
+ARC -2742 -4479 1
+ARC -2742 -2757 138
+ARC 2743 2744 64
+ARC -2743 -3578 1
+ARC -2743 -2776 3
+ARC 2744 3575 19
+ARC -2744 -4584 1
+ARC 2745 2749 2
+ARC -2745 -2748 1
+ARC 2746 2747 86
+ARC -2746 -4291 1
+ARC -2746 -3487 2
+ARC -2747 -4209 2
+ARC 2748 3896 1
+ARC 2748 4208 1
+ARC -2748 -3350 46
+ARC 2749 2750 205
+ARC -2749 -4258 2
+ARC -2749 -3896 3
+ARC -2749 -2768 1
+ARC -2750 -4296 2
+ARC -2750 -4169 1
+ARC 2752 3576 33
+ARC 2752 4291 1
+ARC 2752 4315 1
+ARC -2752 -3352 28
+ARC 2753 2754 24
+ARC 2753 3571 2
+ARC 2753 4296 1
+ARC -2753 -4156 10
+ARC 2754 2755 48
+ARC 2754 4512 1
+ARC 2755 2756 1
+ARC -2755 -2767 56
+ARC 2756 2757 163
+ARC -2757 -4512 1
+ARC -2757 -4208 1
+ARC 2758 3737 1
+ARC 2759 -4043 1
+ARC 2759 -4021 46
+ARC -2759 -4204 1
+ARC 2760 3193 6
+ARC -2760 3259 5
+ARC -2760 3946 3
+ARC 2761 -3186 9
+ARC -2761 -3259 5
+ARC -2761 3333 3
+ARC -2763 -3573 24
+ARC 2767 2768 1
+ARC -2767 -3292 37
+ARC -2769 4179 1
+ARC -2770 2874 36
+ARC 2774 -3808 1
+ARC 2774 2775 29
+ARC -2776 -4156 1
+ARC 2779 3667 53
+ARC 2779 4368 1
+ARC -2779 -3358 1
+ARC 2780 2780 2
+ARC -2781 2887 78
+ARC 2783 -3113 34
+ARC 2784 4551 1
+ARC 2786 -4495 61
+ARC 2786 -3466 1
+ARC -2787 -3828 1
+ARC -2787 3319 36
+ARC 2788 2789 60
+ARC 2788 3509 5
+ARC 2790 2791 76
+ARC 2790 3833 1
+ARC 2791 -4457 1
+ARC 2797 -4583 1
+ARC 2797 2798 45
+ARC 2799 3878 2
+ARC 2800 -4531 1
+ARC -2800 -3478 30
+ARC -2800 -3043 1
+ARC 2802 2803 55
+ARC -2803 4078 1
+ARC 2804 2805 2
+ARC 2805 3847 4
+ARC -2805 3608 1
+ARC 2806 3598 1
+ARC -2806 3029 7
+ARC -2806 3613 88
+ARC 2809 2810 56
+ARC -2809 4585 1
+ARC 2815 2826 57
+ARC -2815 3821 57
+ARC 2819 -3110 4
+ARC 2819 3110 2
+ARC -2819 3110 11
+ARC -2820 -3407 7
+ARC 2822 4080 1
+ARC -2824 3027 45
+ARC -2826 -4283 1
+ARC 2827 -4500 1
+ARC 2827 -3811 58
+ARC 2830 2830 5
+ARC 2831 -3380 2
+ARC 2834 2952 15
+ARC 2835 3096 56
+ARC 2835 4404 2
+ARC 2835 4463 2
+ARC 2839 2955 35
+ARC -2840 3804 211
+ARC 2841 -3980 1
+ARC -2841 -3638 2
+ARC 2842 2843 126
+ARC 2842 3970 2
+ARC -2842 4506 1
+ARC 2843 2870 117
+ARC 2844 -4353 1
+ARC 2845 3822 1
+ARC -2845 -3141 1
+ARC 2846 2956 11
+ARC 2846 4261 1
+ARC 2847 -3050 1
+ARC -2847 3242 11
+ARC -2847 3846 28
+ARC 2852 2895 59
+ARC 2852 3205 2
+ARC -2856 -2933 38
+ARC -2859 -3106 37
+ARC 2860 -3162 60
+ARC 2860 2950 22
+ARC -2860 3395 10
+ARC 2864 2867 38
+ARC -2864 -2867 45
+ARC -2865 -4426 1
+ARC 2866 2951 29
+ARC 2866 3386 2
+ARC -2866 -4157 1
+ARC 2868 2869 26
+ARC -2868 -2990 28
+ARC -2869 -3090 25
+ARC 2870 -3520 1
+ARC -2870 3651 4
+ARC 2871 2872 25
+ARC 2871 4187 3
+ARC 2874 4171 1
+ARC -2874 4048 1
+ARC 2877 3905 1
+ARC 2882 3167 59
+ARC 2882 3672 1
+ARC -2882 -4247 1
+ARC 2884 -3091 2
+ARC 2887 4181 2
+ARC -2887 4418 1
+ARC -2889 -3648 1
+ARC 2891 -3406 42
+ARC 2891 -3250 1
+ARC -2891 -3983 1
+ARC 2892 4202 1
+ARC -2892 -4202 1
+ARC 2893 -4385 1
+ARC -2893 -3574 2
+ARC -2894 -4242 1
+ARC 2896 2897 59
+ARC -2896 3042 75
+ARC -2897 -3398 1
+ARC 2899 -3887 2
+ARC 2899 2900 58
+ARC -2899 3263 58
+ARC -2899 4298 1
+ARC 2900 2901 63
+ARC 2900 3599 3
+ARC -2903 4021 1
+ARC -2908 -3799 2
+ARC -2908 -3606 110
+ARC 2910 -3593 1
+ARC -2910 3392 2
+ARC 2913 -3796 1
+ARC -2913 -4192 1
+ARC -2913 3196 45
+ARC 2915 2916 26
+ARC 2915 4135 3
+ARC 2918 -4472 1
+ARC -2918 3734 1
+ARC 2919 4151 2
+ARC 2920 3596 2
+ARC -2921 -2973 31
+ARC 2922 -4484 1
+ARC 2925 -3027 37
+ARC 2926 -3953 1
+ARC 2926 -2948 33
+ARC -2926 -4522 1
+ARC 2929 -3481 1
+ARC -2929 -3100 3
+ARC 2930 2931 35
+ARC -2931 -4214 1
+ARC 2933 -3208 1
+ARC -2933 -3054 48
+ARC -2933 -2958 5
+ARC -2935 -3137 46
+ARC 2939 2939 7
+ARC 2942 -3670 1
+ARC 2944 3124 49
+ARC 2944 4194 2
+ARC -2944 3622 3
+ARC 2947 3121 1
+ARC -2947 3082 43
+ARC 2952 3635 29
+ARC 2952 3923 2
+ARC -2953 -3123 52
+ARC 2954 -2954 6
+ARC 2956 2957 8
+ARC 2957 2958 5
+ARC 2957 4469 1
+ARC -2957 -3503 3
+ARC 2959 3094 6
+ARC -2959 -3407 53
+ARC -2960 -4354 1
+ARC 2963 -4248 1
+ARC -2963 4575 1
+ARC 2966 -3249 1
+ARC -2966 -3791 1
+ARC 2968 -3160 71
+ARC 2970 3456 9
+ARC -2970 -3456 8
+ARC 2971 4210 1
+ARC 2971 4230 48
+ARC 2974 -2976 3
+ARC -2974 -2975 1
+ARC 2975 2976 9
+ARC -2975 3704 1
+ARC 2976 -3528 4
+ARC 2981 2982 30
+ARC -2981 -3319 33
+ARC 2982 -3238 2
+ARC -2982 4211 3
+ARC 2983 -3103 37
+ARC 2983 2984 2
+ARC 2986 3211 95
+ARC 2986 3486 2
+ARC 2990 3588 1
+ARC -2990 4426 2
+ARC 2991 -3746 1
+ARC 2991 -3699 56
+ARC -2991 -3223 1
+ARC -2992 3699 1
+ARC -2993 3027 37
+ARC 2996 -3149 3
+ARC 2996 2997 1
+ARC -2996 3926 8
+ARC 2997 -2999 1
+ARC 2998 2999 5
+ARC -2998 2999 6
+ARC 2999 -3926 8
+ARC 3001 -4251 1
+ARC 3001 3002 35
+ARC -3001 -4056 2
+ARC 3008 3009 72
+ARC -3009 -3826 1
+ARC -3009 -3131 29
+ARC 3010 -4440 1
+ARC 3010 -3455 14
+ARC 3010 3011 10
+ARC -3010 -4441 1
+ARC -3010 -3454 21
+ARC -3010 4326 2
+ARC 3011 3455 8
+ARC 3011 4440 1
+ARC -3014 -3451 1
+ARC -3014 3183 35
+ARC 3015 -4261 1
+ARC 3015 -3016 58
+ARC 3015 3128 5
+ARC -3016 3272 50
+ARC 3017 -3018 2
+ARC 3017 3018 3
+ARC -3017 -3864 2
+ARC -3017 3864 1
+ARC -3022 -3970 1
+ARC -3022 -3348 22
+ARC 3025 3841 5
+ARC -3025 3841 6
+ARC 3030 -3901 39
+ARC 3030 -3270 1
+ARC -3030 3615 1
+ARC -3031 3699 38
+ARC 3036 -4395 1
+ARC 3038 3039 38
+ARC 3039 3591 1
+ARC -3039 3619 2
+ARC -3042 3397 1
+ARC 3044 -3784 1
+ARC 3045 -3888 53
+ARC 3046 3047 83
+ARC -3046 -3087 55
+ARC -3047 -3343 3
+ARC 3048 3609 1
+ARC -3051 -3377 25
+ARC 3058 3058 3
+ARC 3059 -3062 71
+ARC 3059 3792 2
+ARC -3059 -4371 1
+ARC 3060 -3792 1
+ARC 3060 3061 92
+ARC 3061 3062 88
+ARC -3062 -4493 1
+ARC -3063 3272 6
+ARC -3066 -4443 1
+ARC 3067 3068 27
+ARC 3069 -3070 45
+ARC 3070 3071 37
+ARC 3074 -3299 1
+ARC -3074 -3687 1
+ARC 3075 3076 23
+ARC 3075 3089 69
+ARC 3075 3148 20
+ARC 3076 3077 20
+ARC 3076 3938 1
+ARC 3077 -3377 21
+ARC -3082 3986 2
+ARC 3085 -3186 6
+ARC -3085 -4046 1
+ARC -3085 -3946 3
+ARC 3087 3343 1
+ARC 3088 -3164 2
+ARC 3089 3216 22
+ARC -3090 -3307 25
+ARC 3096 3097 56
+ARC -3097 -3263 61
+ARC 3098 3099 36
+ARC -3099 -4552 1
+ARC 3106 -3614 1
+ARC -3106 3384 3
+ARC 3112 3118 4
+ARC -3112 -3804 6
+ARC -3116 4053 1
+ARC 3123 -4430 1
+ARC -3123 -4055 1
+ARC 3129 3130 25
+ARC 3129 4533 1
+ARC -3129 -3258 33
+ARC 3130 3131 25
+ARC -3131 4093 4
+ARC -3136 -3350 4
+ARC -3137 3567 2
+ARC 3138 4045 1
+ARC 3140 3141 45
+ARC 3140 4353 3
+ARC 3143 -4182 1
+ARC 3143 3144 11
+ARC -3143 -4574 1
+ARC -3143 3370 11
+ARC 3144 3145 12
+ARC 3145 -4231 2
+ARC 3145 3240 12
+ARC -3145 -4164 2
+ARC -3149 3150 2
+ARC 3150 3926 2
+ARC -3152 4057 1
+ARC -3152 4190 1
+ARC 3156 -3853 1
+ARC -3156 4588 1
+ARC 3160 -4573 1
+ARC 3161 3162 34
+ARC 3161 4265 4
+ARC 3164 3165 64
+ARC -3164 -3770 1
+ARC 3167 -3757 1
+ARC 3167 3168 60
+ARC 3168 -4511 1
+ARC -3173 -4425 1
+ARC 3175 3426 1
+ARC -3175 3759 1
+ARC 3176 3177 25
+ARC 3176 4125 1
+ARC -3176 3176 6
+ARC 3177 -3180 20
+ARC 3177 3659 4
+ARC 3178 -4125 2
+ARC 3178 3179 25
+ARC -3178 -3659 7
+ARC -3178 3283 11
+ARC 3179 3180 20
+ARC -3180 -3283 1
+ARC 3183 -3220 28
+ARC -3186 -3194 12
+ARC 3187 3553 1
+ARC -3188 3326 10
+ARC 3193 3194 7
+ARC -3193 4115 1
+ARC 3194 -3334 2
+ARC -3194 -4115 2
+ARC -3202 -3726 4
+ARC -3202 3726 1
+ARC -3203 -3739 3
+ARC -3203 3739 3
+ARC 3211 -3790 97
+ARC -3212 4021 39
+ARC 3213 4105 1
+ARC 3213 4442 1
+ARC -3220 3825 1
+ARC 3228 3229 5
+ARC -3228 3229 4
+ARC 3229 3230 8
+ARC 3230 3231 25
+ARC -3230 -3369 15
+ARC 3231 -3370 12
+ARC 3231 3252 9
+ARC -3231 3787 1
+ARC 3236 3237 5
+ARC 3237 3237 47
+ARC 3240 3241 10
+ARC 3240 4182 2
+ARC 3241 -3788 4
+ARC 3241 -3252 9
+ARC 3246 3247 30
+ARC 3247 -4530 1
+ARC -3247 -3385 3
+ARC 3251 -4408 1
+ARC 3256 3257 9
+ARC 3256 4260 1
+ARC 3258 3281 23
+ARC 3261 3508 1
+ARC 3262 3804 1
+ARC 3267 -3893 1
+ARC -3275 3532 3
+ARC 3284 3322 28
+ARC -3284 -3611 27
+ARC 3287 3288 15
+ARC 3287 3487 1
+ARC -3287 -3712 5
+ARC 3288 3289 15
+ARC 3288 4255 1
+ARC 3289 3290 21
+ARC 3289 4015 1
+ARC 3290 3291 24
+ARC 3290 4350 1
+ARC 3291 3292 29
+ARC 3291 4273 1
+ARC 3292 4170 3
+ARC 3293 -3653 3
+ARC 3300 3300 2
+ARC 3304 -3305 10
+ARC 3304 3305 5
+ARC -3304 -3513 4
+ARC -3304 3513 6
+ARC 3307 4024 4
+ARC 3311 -3456 12
+ARC -3311 3456 6
+ARC 3317 3436 1
+ARC 3319 -4211 1
+ARC 3325 -3327 1
+ARC -3325 -3763 7
+ARC 3326 3327 14
+ARC -3326 3555 4
+ARC 3327 -3552 16
+ARC -3327 4149 2
+ARC 3330 -3331 3
+ARC 3330 3446 1
+ARC 3333 3334 3
+ARC -3334 4046 1
+ARC 3335 -3403 1
+ARC 3340 3900 1
+ARC -3340 3562 1
+ARC -3350 -3576 33
+ARC 3351 3352 24
+ARC 3351 4209 1
+ARC 3352 4244 1
+ARC 3352 4584 1
+ARC 3353 3353 5
+ARC 3354 3355 5
+ARC -3354 3355 3
+ARC 3367 3368 17
+ARC -3367 3368 5
+ARC 3368 -4220 6
+ARC 3368 3369 17
+ARC 3373 3526 1
+ARC -3373 3526 2
+ARC 3374 -3526 1
+ARC -3374 -3526 3
+ARC 3390 3390 2
+ARC 3391 -3801 1
+ARC 3391 3801 3
+ARC 3393 -3915 1
+ARC 3395 -4265 2
+ARC 3395 3396 7
+ARC 3399 3400 3
+ARC 3400 3641 3
+ARC -3400 -4299 2
+ARC 3403 3403 5
+ARC 3410 3411 43
+ARC 3410 4052 1
+ARC 3421 3763 17
+ARC 3421 3820 2
+ARC -3421 3552 16
+ARC 3422 3790 3
+ARC -3427 3678 32
+ARC 3433 -3704 4
+ARC 3433 -3434 4
+ARC -3434 -4336 1
+ARC 3436 4087 1
+ARC 3447 3448 8
+ARC -3447 3448 2
+ARC 3448 -3449 1
+ARC 3448 3449 5
+ARC 3453 3469 165
+ARC 3453 4606 1
+ARC -3453 -3508 1
+ARC -3460 -3840 3
+ARC 3472 3473 1
+ARC 3472 3546 1
+ARC -3472 -3545 2
+ARC -3472 4611 1
+ARC -3483 3888 5
+ARC 3484 3485 2
+ARC -3484 3485 3
+ARC 3486 -3790 1
+ARC -3489 -4369 1
+ARC -3491 -4618 1
+ARC -3491 -4614 1
+ARC 3493 3493 8
+ARC 3494 3495 10
+ARC 3494 3518 2
+ARC -3496 -4422 1
+ARC -3496 4481 1
+ARC 3498 4004 2
+ARC 3521 3522 3
+ARC 3521 3660 4
+ARC -3527 -3865 1
+ARC -3528 -4374 3
+ARC -3528 4374 2
+ARC -3537 4420 2
+ARC 3540 3653 1
+ARC -3552 4287 1
+ARC 3553 3554 8
+ARC 3554 -3820 2
+ARC 3554 -3555 4
+ARC -3554 -4149 1
+ARC -3561 -3783 1
+ARC 3565 -3763 7
+ARC 3571 3572 2
+ARC -3572 -4170 3
+ARC 3573 4258 1
+ARC -3573 -3580 14
+ARC 3575 3712 8
+ARC 3575 4259 3
+ARC -3575 -4598 1
+ARC 3576 3577 12
+ARC 3576 4180 1
+ARC 3577 3578 1
+ARC 3577 3579 14
+ARC 3577 4221 2
+ARC 3579 3580 13
+ARC 3579 4307 1
+ARC 3580 4169 1
+ARC 3580 4479 1
+ARC 3588 -4335 1
+ARC 3588 3589 1
+ARC -3596 -3895 1
+ARC 3599 3600 3
+ARC 3600 -3829 3
+ARC -3600 -3916 1
+ARC 3620 -4557 1
+ARC 3620 4023 1
+ARC 3641 -4073 1
+ARC 3641 3887 2
+ARC -3641 -4074 1
+ARC 3652 -4029 1
+ARC 3652 -3714 2
+ARC -3653 -3709 4
+ARC -3678 -4491 1
+ARC 3712 4598 1
+ARC 3748 3812 2
+ARC -3752 -4582 1
+ARC 3782 3783 1
+ARC -3783 -4260 2
+ARC 3787 3788 2
+ARC 3787 4574 1
+ARC 3795 3795 2
+ARC 3798 3799 1
+ARC -3799 -3948 1
+ARC 3804 3815 3
+ARC 3806 -4002 1
+ARC 3812 3905 1
+ARC 3817 3829 2
+ARC -3821 4283 1
+ARC -3828 -3919 1
+ARC -3828 4360 1
+ARC 3829 -4090 1
+ARC -3829 -4415 1
+ARC 3831 3831 4
+ARC 3841 -3842 7
+ARC 3841 3842 6
+ARC 3846 4178 1
+ARC -3865 -4508 1
+ARC 3884 3885 1
+ARC 3884 4456 1
+ARC 3888 3889 1
+ARC 3914 3915 1
+ARC 3956 3956 1
+ARC 3964 3964 2
+ARC 3984 3984 3
+ARC 3987 4028 1
+ARC -3997 -4600 1
+ARC -4004 -4270 2
+ARC 4025 4025 5
+ARC 4059 4059 1
+ARC 4093 4318 4
+ARC 4096 -4096 2
+ARC 4127 -4127 2
+ARC -4164 4220 4
+ARC 4173 4174 3
+ARC -4174 -4533 1
+ARC 4184 4318 2
+ARC -4220 4231 2
+ARC 4224 4438 1
+ARC -4224 -4459 1
+ARC 4243 4243 3
+ARC 4255 -4255 2
+ARC 4259 4313 1
+ARC 4298 4299 1
+ARC -4299 -4404 1
+ARC 4313 4313 1
+ARC 4429 4437 1
+ARC 4434 4434 1
+ARC 4436 4437 1
diff --git a/tests/test.LastGraph b/tests/test.LastGraph
new file mode 100755
index 0000000..1ba8b62
--- /dev/null
+++ b/tests/test.LastGraph
@@ -0,0 +1,68 @@
+17 400000 61 1
+NODE 1 2000 477994 477994 0 0
+CGGACGCGGTTTAGGCATAAGCAGGCAATAACCGTACTGATGCGAAGCAGCGTGAGATCCCCATTAGCGGAGGTATTACATCCCCAATATGAGCAGTTAATGTCTGTAAGAACGATAACAATGTGAGTCATCAGGTCGCTCATTTACGGGGTAGCTGGATCATCGATCTTCCGTCCGTCTAGACACCACTCGCCGGGATTGCTGCTTCTCTGGGGAGCACCACCAGGAAAGGATCATCTCCACACGACTATACCAGCATGATGCCAGTGTCACTCCTCTACCGCATCCCCATTGGGGCTTCGCAATGAATCGACACAGAGCTCTGGATAAGCAGAACTTCATTCTCAAGCACAGCGACGCTCCCTCTAGACTACTTCTCCTCTTTTGCGTAACATCTTAGAATTGTAACCTCCCTGAGACTAATATACCACACTTGAGGCATACTAGACTTAGATGAGGGCACTTCTCCTTAGTTCAGCACACAGCCCCAGG [...]
+AAACCGTGGGGCTGCGCATTCCTAGTAGTTTTAACAGTAATAGTCGCGCCGTATTAAGCGCGGAATGTTGGAGGTACTGTGCTTCTATATCGATATGAAAGCTGCGTTCCCGAGGCATCGCGTGTGCCGTGCCTGGCAATGTTCTGTATGTTGCGAAGGCCCCGGCCGTCCGCAACCTGCGCTGCTCCCTTATTGTCAAGGATATCAGTTGCCCGCCCACTATTATTCAATCAGAACCTAATTATTGTTGAAAGGCGATAGCTGAGCCATTATCAGGCGAGCCGCAGCCAACCGTCAGAATTTACTCTAGCGGGAGCATTTCGGTCCCATGCCAGTCAAACTTTCTCAACGAGCCACTAGAAGCGGACGTATTGACAGGGGCTCAACCGGACCACTCCGTTGACCGTTGTTACTAACTGGACTCTATATCGGTTCGGCCGCGTTGAACTCGTCCCACATCCGGCCACAGCTTTAATACGACAGTGCTAGAAG [...]
+NODE 2 2000 1261192 1261192 0 0
+CGTGACAAAAGGATGTCTGCTTCAATGGACACTCGTAGTTAGTATACTAGGCTGGCAATACCCACTTGTATCTTCCTGTGTGGTTAGTCTGATGCATCTTTTAGCTCAACCCGAAGTTGCCTACATGCCCGGCTAGAGGCTCTTTAAGATGCGCGTATCGGGGAAAACACCATGTGTCTTTATACAAGTTACGATACAGCGACCCGAATACCGCGGAGCACATAGACATGGTCACCCGGCCGCGAGCGGGGTCGATAGTCAATTGCCCGTATTGCATTGGCCCCTGCATACTTGGCAGAGCGGCCTCACTATACTCGGTGGCGATTATTGGCGTGACGGGTAACCAAAGGATTTTATTGACGTACGGCTCCAGTCCTAGTACTTGACGTGTACATGAGTCGATCACTACACCTAGAAAGCGCTGGCTGCCCCTGGGGAGAAATTGAAGTCATATGAACCTGTCTAGCTCCGACGCGGACATTTGGCCAAAAA [...]
+CTACTGCCGGCACCCGATTCGTTGCGCTTGTGCGCCGCTCATTACATCAAACTCATATGCGTTAACGAGAGGTTAGACATGTTACCGAAATAATTACAAAATGAGAAAGTTATGGCCATTCGGAGGACATAACACCTCGCTTACCACACTCAAAACACGAATTGATCCTCACTGAATGCAAAGCCTTAGTGAAAGAGAACCGGCGTCCTGGACGCTCCATAGAATCCCCTCTTATTTTAGGCGTCCTAGGTGCCTACGCTCCCAGCCTGCATTTGGCATGTCGGCGGTTGTAGATGCACTTTACGCATCGGCGCACTGAGGCTCTGAACCGTCAGGCGAACGGGGTATCGACCCAGCTGCACGATCTATTCCCAAGACCCATACAGCTCATCCACGGTTACGGATCCGTCGGTGGAGTAGAGACCTTATGCTCTACATGTGATTCCCGACAAACATCTTCTTGAAGGCCGTTCCAACTGGCTCAATTCGCAC [...]
+NODE 3 2000 1271882 1271882 0 0
+TCACATTTGCAAGTCGTCTGTCATCCACCATTCAAGACGTTAGGCGCTGCTGTTGCCACTATAGATGACCCTCAGTCTATGATCCTATTATTGGGGACATTGGTAAGCGAGTGGGGTCCTGCACGGGGATGTTGAGTCCCGGATATCGGGTCTGGTGCTTCCATATGTTTTTGGCCCCACCGACCAGTCCCGGCATGCTTAAAGTATAACGTTCAGTCAGGAATCCATCTCGGGCCCCCCATATCGCCGAAAGTCCTCACTACGCAACCTTCTAGTAACACAGAACTAAATGCACAAACGAAGGTTTGTTGTCGATCTGTAAGACCGGCGACTAGGCTTTTGATCACACTAGGATGATAATGTCCTAATAACGTAGTACGTGCCCAGATCTGTCTTCAACTTATAATTAATGACTTGGTTATGATCAAGGAAAGTGCGACTCCCATTGGTGTCACCAACTCGCTGTGCGTCTCATTGTACCATCTTACAGAG [...]
+GCTCGAGTGGGACATTATCCGTGCATCAGACTACTGGGTGCACGTCCGATTCCGGGCTGATCAAGCGAAGCAAATAGTCCGAATCTAGCCTTATATGTGCGTGATAACCATACGAGCTCAACTGATAGATTATTACGGAACGTCCAGGTATTTTGCCAGGACCCCTACGTACCATGTATGTCCTCGTACTTAAACTAGGAAGGTCGAACTTCTACGATCACGACCCCCGATTACATCGTGAATGTGCCTGAAACCGACCAGAGTGGTCACCCAGGCGTGTTACGAGTAGACGGAACTCAACGCGCATCGATATTGCGGGAAGTATCCAACTGGTAATGCGATAATGCACCAGGGAGTATAGCCTTAGCGGACACGAAAACGGCCTAAATGAGTTTTTGTTCCGAGCACGCGAACACCCGTACTTCCGCGTCGCGTGAAGGTCAGACCTTTGTCTCAGGCCAACGCATTTGGTGGGTCTGATGTATGCTACGG [...]
+NODE 4 1940 3092003 3092003 0 0
+CTCACGCCCTCTCTAACGGCTGTTAATTAGCTACTCAGGTACTTGGCTCAACCCGGGGTCTTCGTCTGGATTTCGTACGTGTCCCAAGGGGTGGTCGACTTTCGCAGAAGTGTCTTAGTAACTAACGTGAGTAACCAGAGGCGTTGAATTCCGCGAGCTTAGCTTGGTAACGGAGTTCATAACTAGGGACTCCACTGAAAGCTGGTTAATCATACGCATAGTGAGCCGCCCGTCTCCTTGATGTCCACGTCACTCACAGTATACAACGGGCACGCCCCGTATCTGAACGTTGTCCACTCAGCACGGGTCCCTGGTGAAAGGCCGGTATGAGTAATAAACCTTCGCAACATTGACACTGGTCAGATTCCGAGCGACCCATGTCGATAGTGGCAGGAAACGACCGAAATTTGGGTTAGACTCCAATACCTTCAGGACGATCCCGGCAAATACGGATATGGCTAGTTACGGAAGGTGATGTGATCCAGTAAAAGC [...]
+TCTTACCAGAAACCCGAACCTAACCTAGATCTTACTGACGACATAAATATTAGCACACTCCCTCCCTAGGTTTAATGATGTATGGACAAAGGGGACCCTACAAGAGCAGAGCTACGTTATCGAGATCTATCAACTTCAACAAAACTGCTTAAGGCCGACTCCAGTACAAAAACACCCTGGGTAGTGTTGAGGAGATCAGCCGGGAATCCTATCCCAGCGGTACGTGATGCACGGAAGTCGGTATTCGACATAGTGATAATGAGCCGATGAAAATCTCCCCTTGCCGGGGGTTTTCATAAGTCTGGTCTGGAGCCACATATCATAGCGGGAGGTTGCTCGGACCCATAATTAGGGGTGAACGGGCTTGGTTACCCCCGTTAGAAGGCAGTGCTCGCTAGACGACGTTCGATGATGTACCGCGGGTTAGAAGTAGGGCCTTTTTCGATGACCGTGACAGTGAGGGCATTGAAAGATAGACCGCAGTCCGCGTTG [...]
+NODE 5 1941 1032693 1032693 0 0
+CGACAAGGCGAGCACGAAGGGAAAAGATTCGGAAGAGTGATCTTCGCGAATAAGTAGCTAATAAACTTCCCATTTTTCTGTAGTTAGAGTTTCTAGAAACCTTTTGCCTCGGTAACACACCAAAAAAGTACGTTGTGTCTAGTGCATGCGATGCCATTATATCCGCGGTTACCTAACCGCGACTCGAGACGCTGGGGACGTTTTAAGAATTATAGCTGGCTGGTGTTCTTTGGTGCTCATTTGAACCGGAACGTCGGCATAAGAAGGGTACCAAGGAACCGTGTCATAATCAGACGCACCAATTCCAGATAGATAACGCATATTGGCAACGGAGGGAAGCCCTTTTACAGACCCACTCTTGGACGCTCCCTGAGGGTAGGCCTATCTCGGAGCGGTACCTTCCCGCGCCACGTGCGGGGCCTCATCCTGAGTACTCAAGGACGGGACGGGGCTAGGGAAAGGATCTCGGTAGGCTGAGCTGGTCGGTTTTGT [...]
+GATAGTTTCGCGTGGGTATGGCCGGTCTATTCATACGCGAATCTCAGGTTTGTAGAGGGGCCAGCTCGGCACTGTCTCAAGATTCCGGTAAGGCCCCGGTACCCAAAATCGCACTTAGGCCACAAAGGGAACGAGAGTTGCACCTCAACAGAGACTCTTTACAGACATAGCAAGTCGAGGGTATGTCGGTTGGAGAACTTACTCTTCCCTATTTCAAGACGCGGTTACTATCCCACGGGATACGTCTAGTACATTACATCTAGATTGTATATATCCACGTAATATCGGCAGCGCCTTATCTATTCGTCATCATCTCGCTCAACCTAGAGAGTCCATAGGCCAGTCGTGATGCCAGAGAGGTACCAATCGATTCAAAGTTTCGATGCAGCTAGAGGAGAAGAAGTCGGTTGTGTTAATGATGCGCTTGCCAGAAAACTTATCAGGCCGCATCTCTCTATAATTGAATAGCATGTTGTTGCTAATGTCTTTCAG [...]
+NODE 6 59 17031 17031 0 0
+GAACACACGAAATGCGGTCAACCACACAAGGGAGTCGACAATAAAGATGATGTAAGACG
+AGGCCTCGATGAGTATCCACGGGTTAATTCAAAGCCTAGCAGACTAAGTCGTTGTGAAA
+NODE 7 1940 1032490 1032490 0 0
+CATTCTAGGATCACTTATCATGGACGAGAGCTCACCACGAGCGAAGGCTGTCTTGTAACCACCCGTAAGGATGTCTGCCCGCAGTCGAAACTTAGTTGCATCAGGCACGCTGCACCTTGGCTCAACTCATGATGGCTCATATGATTTATTCTACAGTAATCGGAGGCTACGAGAACAATCAAGGGAGCCTAGCCGGGATTGCCTAGTTCTCAAATGGAGGAAAAGATCCGGCACGCTGCTGCTCGAATGAATCTTTGATGCATTACATATACACAACGCTACCACGCAGTACGGCTCTCAATCGATTCTTAAGGTCGATCGAGCGTGTGCCGGGTGCTATTTTCCACGCGTCGCTTACCAAGGCAGCAGTACCTAACAATCGCATCGCATGCCGCTCGCAGTAGACCACGACAATCGAAACAGATGCTGGTTACCTCGTATCCTACAAGGATTTGGCCAATGGCCCACTTAGGAGTTGGTGTCGACTCTAGG [...]
+TTGCTGGAAATGGAACACACGACTTGGAAACAAAGATCGATGAACTGCTCCACGGCGAACCGTATTCTATCGGCGCTTGGACTGACCTAGCTTTGTCTACCCGCCATGCAGGGTAGTGTTCTGGGGACAGGACTGCCCTCCCAGTTATCGGGGATGGGCAACGAAAAAGGTCTTATTGACGTCATCGAGTACGTTGTGGAGGCGCTGAATCTCAGCGTCCGACAATAGTAAGAAACGGGAAGGGCAGGAAGCTAGCAAGTGGAAGAGGGGGAGCGTCTCGTTCCCAGCAAGCAGCTCGAGCCCTGAAGAGATGGAGCAAAGCCCTGTTTCTTTAACAGTTATTCTAAGCGATTGATATGTTGATATAATCGATGGCAATGTGCACCTCTTAAAGCAACTTCTACCCGACGTACCTAGCCTTACGGTACACCCAGATCACCCCGGTGAACTTGCGGCTTTCCTGGTCGCAAATATCCAGGCGGGCTGGTTTCG [...]
+NODE 8 2000 574685 574685 0 0
+GACTATGGGCACCGATTGACTAAACAGCTCGAATAAACAGGATGCCACGGTGTGACTAGGTAGCCCCAGGCATGAGTGTTTACCTCGGGCACAGACCTGATTGCGCGCCTGATTGAAGCATCCCGGCGGATCATGGAACAGTGTACCGCATACGCATGCAGGGAGTGGGCTCATCCTCACCGCGATATAGACACAGGGCGGGGTTCCCGGATATGCTGAGGCCTTGACTTGGAACAGCGCGCTGCGCGAACTAAAGTTAGGCAATAGATCGATCTGATGCGCCATGTGTCGTTGGTTAGCGTACCCCTAAGGTCTTCTGTTATTTTCATCCCTGTCTGTCTTGCACGCCAGAGCGCTCGCGTTGTATCTTCGACGTTTGGATAGAGTCAACTACATATGATTGTCCCCTATTGGAAGTGCTGGTGAATTATCTGTCCGCGATCCGTGACATACATCCAGCGCAACGGTATGGCTGTGGCAGCCAAGGCTGAC [...]
+TTCTCTGGTATCCTCGATAGCGATAGATCTATACCGCGATGAAGGTAGCTCATAATCAATACACGCCATCACGGCAATTTAACAGTGTCGTGTCTCACTTACAAAATGGGGCATAGATAGCACCGCCCCTGACAGGCCGGCGTTGCACGCACGAAGACCACGTTCGTTTATATTTTGTGGGGGTGGGGACTCCGATTCGTCTGTCGGGCTATGCGCTGGCGTCTATGGCTGTGGAGATTTGAATGGTGGCGACCGTAACACGCGTAGAAACCCCACCCCCCCACAACGTCGCCAGGTCCTGCCATGCCTCTACGTCGAGTGAAATAGCTATGTAATTACCCCTGTGATATTTGGGTCGATCGAGTCAAACGGTAGTACGGTGCTGTGCACTGCTGACCTCACTTTACCAAATAGGGACAGCACCCGTTATGCATTTTCAATAAGGTCAGTTAAGTTTCTAGTGCAGTAGGCAGGGGACTCGGAGTAAGATAT [...]
+NODE 9 2000 1931403 1931403 0 0
+GAAGGATGCCTACAACGCAAAAATTCCTGAAGCTGAAGTCTCAGAATCAAGTGCGCTTCGACTCCGATTCTTGGCGGTTTCGGACGTTTTGTACATTCGGCTTAGGTGGTAAAACCGTACCGTCGCTCGTGTGAGGGCATGCCGCTACACGGAAACCACGCAGGGTACTGGAAGATTAGCCGAACTCCAGCTATCAATGAATCCATCGCTCCGTCTCCCTATTCGTGCTAGTTTTTCTCCCCGTATTTAATTCCACTCTATTTACTTCCCCATCCCCCCACGTGGGCTCATTCTCATATAATGAGCACTCGAGCTAGGTGATGCGATAAACCTCGCTGTGGCCGCCCAGAGCCATCGCACTCAGCCTATGAAGGTAGCTCTTCAGCGCGCCAGTACCCGGATGGGAAAGATATGAAGAAAGCTTCATATGCGGTACTCTCTGTTAACTGTAATATCGAGTGGCAAGGCACTTCAGTCCTAGAGATCATTAGT [...]
+CTTCCGATCATTCGGCTTCTCTGCGGGCAGCTTTCTATACCACTCATTAAACACGCACTCCGGGGGTCGTAGGAAAACCGCTTGGTGACACTTGGGCGGGTGCCCGTCCCGTCCATCCTCAGGAGGCCCGTTCAGCACAACCTCTGACGGAAATATCGACTAAGTCCTCAGAACAATGAACCTTGGACACGCAGAGCGTGTGAATTGACAGGAGGGTCATTCACGGTGGCTCGAGAGCAGTCGTGAATTGACAGTTATTTCCATGCTAACTGATCACCTTGTCAAAGACACAGGGAATCTGAGAGAATTTCCAACGGTAGTACTGTATCCTCGATATTTCTTTACACCCTCTCACTGTGTAATGGTCGAATCCGAACGGAGCGGCGCGGCGTGAGACTTGAGGGCACATGATCTGCCCTGCCCGGTACGCGATGGCCAATCTAGGTACTGGGGACCTATCACCTACGTCGTGTAAAATCTTGTCGTAGCCAA [...]
+NODE 10 2000 496973 496973 0 0
+CAGGTTACATTCCGACCAACTCTTCGGCGCGGGACGGGAGTATGTCTCATGTCTCGAGTAGGGCCCAATGTAGTTACCGTGTAGTAATCTAGCTGAATAATCCGAGCTCGTAAACACTACAGTATCAGACCCTAGCGCCTATGATCTATACCTAGGGCTTGAAATCTTGCGGGCTTGTATCGGTACGTATGTTATCATGAAAGCTCAAGATTTGAAGTAGTGATTATTATTCCTACCTCTGCTTGTAAGACCATGTATCAGAGTGCACAATGAGGTTAGACGGAGACACACAAGATGTAGACACACGGTGGCGTCGACTTTTCCGACGGTCGTCGGCCGAACAATTTCGTAAAGGGAAGTTCCCATCGGGTAGACCGCCCTGATAGAAGACGTTTTTCCTGTTACGTTCCTGCACAGTCAACCTTTCTACCTTTTCTAAACGCGCCATGCACAGGAAGATAGATGCTATCAGTTTAGATGCTGTGAGCATCA [...]
+GTCGTGTTTGTTTCCGAAGACAAGCAACGTTACTTCAGCATGACCTTCTGAACGCCCTAGCATGACGGGTCCATTGATAGGCCATAGAATGGAGTTATAATTTGGTATGAGCATACTACTTCTGGGACTTAGTAAGGCCATGCACATAAGATCTAACCATTGGAGGACATCCCGCAGGAGAATTTATGCGTAAAATGTGCACAAATATAACTGCGGTCGCGGCAGGGGCGAGACGCTCCGGAAACTCATCTCTGGAGCAACGCACCGTCCTAACCATACACGCAATATTATCGGGTAGCGGAACCGTAGGAGCACTGAAATACACCAACGTTGGTTGTTTCCTACATCATTCGGGTCGCATCCAATCGGTCCCCCCACGTCGCAATAGCTAGAGAAGAACCGTACATACGGCATGTAGTCTCAATACTTCACGAAGGGAATCATACAATAAATTACCGAAATGTATGGGAGGAAACTACTTTGATCCACTCC [...]
+NODE 11 2000 1468379 1468379 0 0
+ACGTATTATCATATTGCCGCTAACCCCCCGGAACTCGGGAAATCATGAGGATTGGGATCCGGCCCTAATTGCCATTACGCCGGCAGGCTTTGCGAAGGCGCCCAGGCCTCGATCAGAATGCCTCCCGGCCGATGATCACGCACCACCCGTAAACTGGGTCTAAGCCCAAGTCCACGTACCCATTGCAGGTTCTCGGATGAGATAGGACGGTGGACATGTACTGTCCCCCAGAGGTCCAGCGTCCTTGCCCGGCTGGGCTTCAAATCAACCTTAGGCACATGCGCGTTCCGGGGTGTCTAGCACGCTTGCGGTAAGGTTCAACCACTTAATAATGGGACGAGTGTGGACTGGAGTTTCGTTCACAGCTAATTGGAGCGAATACACCATCCCAGATTATGCGGCTTTGGGCTGTGAAATTTGTAGTTTGTAGATTTGCGAGCGTATGTGTTCAACCCGACCCCGTACTTAAATGAGACCCACCAACTTTAGTTT [...]
+TCGATCAGTAGAATGCACCCCAGCGCGGCCTTTGGTGTTCCCCTCAAATGCAGGCCCGATAGAAGCGGGTCGGATGAGCTAGCACCATTACACCATCCGTTTCTCGATTGTGGTGCACCCCTGAATTCCACTGCGAGATGTGACTTAGTTATAACCCTACTAGCTTTTACAACTGGCGTTCTCAGGTGGACCATACAGCTGGCTATGCCCTTTGTGCTCTGCCGCTTAAGTATACATCTCAATTATTGCGGTTCTTTACGGAAATTCGTAGACCCTCTCATAACGCTCTCCAGCCCGGTCCGCGGAGCAAATTACGTCGTTAGACGTTAACGACGGCTATGAACCAGCACAAGAATAGTGGTATCCGGTCCCTGGGCGTTCGGGTACCCGGGTGAGATCGGCCTCCGGCCCGGTTCTCATAAAAGGGGTATGTAATCCCCGTTATATCGGCATGCGTTACTGAAAAGGACGACGGCATAAGTTCATCACAGG [...]
+NODE 12 2000 489155 489155 0 0
+CCAACTTGGGTTCTCGGGAGACGAGTCTTGTGGGACGAGGATAGAGGAATCGATCTGCATCTTCTATACGACCAATGAGTGATGCATGACAAGAGTATTTGTCTCCCGACCGTGGTGTGGAAGACGGGTATGTGTTTTCTAGGTCACGAGTTAGTCTTGTGCCCAACGTGACCAAAGATTAGAGCCCGTGACGTGGGCTGAATAAGCGGGCTGTACTGTCTGCGACGGTCCCGGAAGACCGTCCCGCAGTTGTTTCTAGACACTATTTCAATGTGTATAGAGCCGTCCCAACCTACAACGTTAGGGCGCGCATGACCAAACAGTCTACGCCGCTCCCCTGTTCCGGTCCTAGTGCTAAGATCTAGTCAGCGCGATATCTCGACAGTATTCTAGTTGCCGGCGGTTAACTTCTCTTCATTTCGTACAGATCTCACAGTCTCCAGTATACTGGATTAATACGGCATAGATTCGCGTCAGTAATTTTGTCTATAA [...]
+TAGCGGATTCTGGGCTGGCAAGCTCAAGAGGTTCGCGCCGCACTCGAGGTTGTGCATCTTCGCACCAGTGTGCACAACCATAGTATAGTTGCACTACCCGCGATCTGTTTACCATTTGCGCCGGAATCTTCTTTTGTTCTCTTATGGCTATAAGGTCTCACCAGTTCGATGTGCAGGAGGCAGTATTCCGTCTTAGGCTTACCTACTCTCAACCGTCCCATGAGAGTGCTCTGGCGTACTAGCCACCGGATAACAGACAGATGTCACCAATGGAGTAGCGGTCAAAATCTCTACCACACAAACACTCCGGCTATTGGGAGTGCCAATGTGTGCGTAGCCGTGGAAGCATGGAGGACGTAAGGGTCTCGTGAACCAGCATCCGTGGCTCTCTGGTGTCATTAAACCGGCGTCACTCATGAAAGTGGGTCCTTGGCTCAAAAGTATCCGACCGAGGCAGATGGGGTACAGGATACGCAGACCATCCGTGCTGGT [...]
+NODE 13 2000 1270363 1270363 0 0
+ATAGAGGAGCGAGCCGTTGAGGCCACTCGAGGACATACCGTAGCTCGTAGTGCGTCAGCATCTTAAACACTGCAAACGTGGCGACGCAGCAAAGAATCCTCGTGCAATTTTGACGATGCGGAAAGGCCGTTTCCAATACAATGAGCGACTCTTCGAACCTCCAGTCGGTGATGCCTACTCGTAGTGAGACACTGGCATTCCGCAGGACGGGATGTCTCGTGAATATAGTCGGTAGGCTTCTGAACACCGAGAGCTTGCCCTATTAGTTGCGGAAAAAACTTGCCCAACTATTGAGCTGCTGCCAGGACGCCAAGTACCCGTAGATTTTGAGAGAACGCAAGTGAACCACTCTGAACAGGCACTCTAGGATTCCGCTAAACGGGATACCCGCAGTCCGAGAATCGTAGGTGGATAGACTACAGTCACGGGCAACGGAGGCTTAGGACGCTACTACAGGTGTACCTATAGTCTAAGCTGGCTAACCTAAGACTT [...]
+GTGTCTCCCGAGGATTAGTGTGGCGGAGTGCCCAACGTTAGAGCGAGAAGGCATGCTTCCCAAAACGGGAGACAGAAAGCGGGGTGACCGGAGGTCTTCCTTGGTGCTGCGAGTAAATGTATCATTGCTATCTGCTCTTATTCACTGTCTGCTTTCTTAACCGCACTTCACGTATGGAAGGAACTACCTGTTGTATCGCGATTACGTCCGGCTGAATAGTAGGCCATTTATAACGAGCGTCACGATCTCGAACATAACGGTCGTTTCAGGATGCGTAGAACCAGTGCTTGGCAAGTCGAATGGTTGACTCGAGTACTGACATCTCGAGTAGGAAGTTCCATCCTCCCGTACGTGAACTTCGCCTCGGTATAGGATTGTATCGCTGTCTGCGGTAGAGATAAACCGTATCGAAAGGGCATAGAAACCATCGGTCACAGAGGGGAGACGCAAAACGTTCGCAGGTGTACATACCGTCGCAATACTTCCTGAAGG [...]
+NODE 14 60 20218 20218 0 0
+GTCACACGTCCATTCATCAGTATCCCGACTATCTTGGTCTCAGTATTAAGGATAACGGCG
+GTACTTCACGCGACTGACCCCGGCCAAGCGTAGCCGTGTGGATTCCGAGAGTCTGCCTTA
+NODE 15 1999 592322 592322 0 0
+ATCAGAGAGTATATTTCATGTTGAAGGAATCAGTAAATCCAACTATTAGTATGCTAAAATAGTTAGGTCACCCCCCCCGTATATGGGTACGATCTGGCCAACACGGCCACTCGTAAGACGTCCCGTCCGGTAGTGAGGGTCACGCAGTGCGAAAATTTCACAAGGAGCGGGATGTGTGTGGTACAGTTGCGCTATTTTTTCCTTAGGCCACCTCTACTGTTGGACGCCCATCATTACAATCTGATCGACGGGACTGCGCCGGAACTCTTTGCGTCCTCAATCAGCCAGCCGGTGGAAGAGAAGATCACGGTGTTCGAGCGCGGACGAACGGCCTTTATACTTCGAGTGTAATGTGTACCACTTGAAGCTCTGCCATCGACATAGTCACGGAATTTGTAGACGGCGCGGCTGGGTTGGTGGTTTAGCCTGCACTTTACCCGCCGATCTGGTCGCCCACAGATGATGCCTAAAAAGTACATCTACTCGAGCCAC [...]
+GTTAGAGGCGTTTTAAATTACAGCAGCGCCTGGGTGTTAGAGGGATATTTTGTCCTAGCAGTTCCGGTTATATGCCCGCTTTTCGTAGCATGGATGTATCCCCCCCTTACGATCTATTTCGTAATCCCTTTTATCACGGGCACGGTCCACATCATCCAACCATTAAATTATAGTACTATGTTCAAACTTTCTGGGCGCGCCCCGACGTTGCGTCATCTGCATAACGCGAAAAGCCGCACCGCTCACGGGGTGCATAAGATCGGTCACGGAACGTTCTGTGATTAGTTCTACATGCACCCCTCTGTGAGCCACCCCGCTTTACAATTGTTTGAGGCGCTCATCGGATAGTGACGCTGGTCAAGCGCCGAGTTGTTACTATCGTTTCAGAACGAAAGTCAACTCGTCCGACAAGATTCCTTGTCCGACCGATTATGCATAATGTCCATTTGGAGGTTACGCAAATGATTCCTATTGGAACGTGAGCAACCGTCC [...]
+NODE 16 2000 481550 481550 0 0
+TGGTCCGTGCTCCTCGCGCTCCTTGAACACCTGGATCCCTCAGCTGCAATACTAAAGTGTAAAATCTAAGAGCTTTAGAGCGTGCTCGTTCAGTCCCTGCAGCACATAGCGTGGCCAAGTACTCCGGTTATTGGCATTTCACCTGTACCGGCGTGAAGCGCCCTATGGTGTGCGGGCGAAGCTGTATCGAAGGATCACTATAATATTCGGTCCTTAATTCTTTTCCGTTGGAGTCATCACGTAAAGCTTCTCCTGTGAATTCAGTAGCCAAGCGTTTCACGGGGGTATCGTTCGCCTCCCTGATATGCGAGAATTGATACCCTGCCAAAGAGCACTACTTGCTATTATGGTAGCTTCAGACGTGTAATCGGAATACCACTAGATATTGTACCGTTTCGCACTAAGCCCAGTGAGGTGTCGCTTGAAAGCCAGGTTGGCCCTGCATGGCACTTTGATGCGGCGAATGCCCAACGTAGGCCCAGAGTCCTGACC [...]
+AGCTGGACACTATCGCTGCCAGTGAATATTAGGTGAAGAGGCAGTCTGCCTAAGTCCTGAATCAGCAGTTCTGCCATCTATTTGTGCGGATATAATAGGTTACGATGGCATCAACGATAGCCCAGCCCTGAGACCTCGATGCCCTGTAAGACGGTCCGGTCATAAGGCTGGGTGGTTGAAATCGTTGGAACATTGCAATCTAGGCCTGAAAACAATCTCGTTATTACACCGCCTGGGGCAGTGAGCTAAGGGTCCGAGCTTCTCTACTCTTGCCAGATGCGTCAAGCGCGCTCATTTGTGAGCCCTCCTCACGTCGTCATTACTGTTGTTTTTGTTAATCCTATAATTCATAATAGTCTCGGGGCTGTCAAACACTGGCAATTTGTTCTGATTCTACCCTCCCGTCATTGACGTTATTGTGAGAACAAGGCGCCGGGCAGTTATTTTTGTCCCCATAATAACGGGTATCGCTCCCCATCCAAATCCCGGTGG [...]
+NODE 17 2000 487292 487292 0 0
+CGTGGAGCCCAGAGCTTACGAGTTCAATCTCAGTGCGAAAGCGGTCACTATCCCTCTCCTTGACAAAGATTTCTCCTTTCAGCCTTTTGTCTGTATGATGTGTAAGGTAACTAACCGACTTAAGGACACCGGATAGAGTAATTACCGGACGAAATGTAGGCGTCTCACGACCTTACAGTTTGTCTTAGCCCGGTCCGTAGAACAAGGCTTCAGTCCCCAAAGTTTACCGTCCCCTAGCCATCATCGTTATTGTAGTGCAGCGTGGCTGGATGTCCATTACACCGACAGCGTACTCAGTTACTCGGCCACAAACCCCTAGTACAACCCGCATCTACGACAAGCGAGAATGCGTATCTCACTTTTACTTAGAACCCATTCTGAGTACTGATGACATTGCGCGGCTGGGAATTTTCAAAGCATAAAGAGCCAATGACTTGAAACGGGCTGTGATCCGCGGCAACACAAACAACGTCACAGCCAGCGTTAGACTAC [...]
+CCGTCAATTGCGGGGAATGACCAAATACCGGAATAACGGTCGAATATGACCCTTGGCTACTCTTAGCTGCGAAAAACCGGCGAATCGATAGTGACTTATTTCAGTACGGAGCCAATAGCGTACAGTCACGACACTCGTAAAGACGTAGAATGCCTGGAATGCCACTGTGGGTCGGAATTAGTAGCAGGTCGTGCCTCCCTCACGTATGACAGAATAGTAACCTGCGATAGAAACTAGTTCGATCAGAAAACGCCACTCTTTGTTTCGCTATCCCCCGTAGGATTTCACATACATCTTTCTGAACATTGTGAAACTCATATGGTAATTCTCAACTGGTGCCAGGGGTCGAACTGCGGCTAGCCCATAGGCTAACCTGCACAACCAACGATGGTCTCAGCATATCTCCGTGTTCACAGAGCTCAGTCAGCCCATGTCCAGCCTACGCACGAGACGACTGTTTAGCGCTAATCACAGCTACAGATATACTGCTAA [...]
+ARC 1 -2 312
+ARC 2 -17 298
+ARC -2 -4 589
+ARC 3 6 285
+ARC 3 16 300
+ARC -3 4 611
+ARC 4 -11 913
+ARC -4 9 934
+ARC -5 -15 360
+ARC -5 -6 269
+ARC -7 -8 346
+ARC -7 14 342
+ARC 9 10 318
+ARC 9 13 616
+ARC -12 -13 320
+ARC 13 -14 307
diff --git a/tests/test.Trinity.csv b/tests/test.Trinity.csv
new file mode 100644
index 0000000..6188739
--- /dev/null
+++ b/tests/test.Trinity.csv
@@ -0,0 +1,8 @@
+Node name,DATA
+NODE_19|c0_3912+_length_1565_cov_0,3912PLUS
+NODE_19|c0_3912-_length_1565_cov_0,3912MINUS
+NODE_19|c0_3914_length_13_cov_0,3914PLUS
+NODE_19|c0_3915+,3915PLUS
+19|c0_3923+_length_400_cov_0,3923PLUS
+19|c0_3924+,3924PLUS
+19|c0_3940,3940PLUS
\ No newline at end of file
diff --git a/tests/test.Trinity.fasta b/tests/test.Trinity.fasta
new file mode 100755
index 0000000..ea13951
--- /dev/null
+++ b/tests/test.Trinity.fasta
@@ -0,0 +1,2650 @@
+>TR1|c0_g1_i1 len=280 path=[274:0-228 275:229-279] [-1, 274, 275, -2]
+GTGAGCTGTCAAATAAAGAAAGTAGAGAGGAAAACATGAGTTACTAACTCCCAGCCCTCT
+GATTTCAAGATGTATGGGATCAGCAAGTATGGCCTGTCTCCTTACCTCTGCCTCTACAGT
+GGCCCTGCCAGGTCCTGAGTCAGTTCCTCGACCACAAACTCCCTGCTCTCTCAGGCCCCT
+CCCTGCCAGGTGGCTGCCCAGGTCAGCCTCCTAATGCTGTCTCACCTCTGTCTGGTATAC
+AAACACAAGAAGAGATTTCTACATTTCCAGTAAGCATACC
+>TR1|c0_g2_i1 len=245 path=[276:0-228 277:229-244] [-1, 276, 277, -2]
+GTGAGCTGTCAAATAAAGAAAGTAGAGAGGAAAACATGAGTTACTAACTCCCAGCCCTCT
+GATTTCAAGATGTATGGGATCAGCAAGTATGGCCTGTCTCCTTACCTCTGCCTCTACAGT
+GGCCCTGCCAGGTCCTGAGTCAGTTCCTCGACCACAAACTCCCTGCTCTCTCAGGCCCCT
+CCCTGCCAGGTGGCTGCCCAGGTCAGCCTCCTAATGCTGTCTCACCTCTTTCTGGTATAC
+AAACA
+>TR1|c1_g1_i1 len=436 path=[478:0-98 497:99-146 496:147-356 481:357-380 482:381-435] [-1, 478, 497, 496, 481, 482, -2]
+GAAATCCTCAGCACCTTCCAGAGAGTGCAGGAAGTCCAAAGGATGATGGAATTTAGGGAA
+TCCTCACAAATGAGAAATGGCGGAGCGTGTATATCTGAATGGCACTTTCTAATCCTGAGA
+TACTGTGAATCTTTCATTCATGATATTTTGTTCCCCAGTTTTATTTATGTGATGTTCTGA
+CTGGCTCCAGACCCTTGGGCTGTTTGGGTATGAACTGTGAGAATGTGAGAATGCTTGTAG
+TGGAAGGGAACCAAGATGGCTTTTAGAAATAGGAAAACTCCACACAGAGCCTTGTGAGAC
+GGGGAGAGACAACCCTAGAAGAAAGCGTCTGCCTTGCTTGCTAAGAACCACTTTCCCTAG
+AAGAGGCCTGATCATTTCTGTCAGAGCATGATGGTGAATATCCTAATTTTGGCATAGTGA
+GCTGTCAAATAAAGAG
+>TR2|c0_g1_i1 len=5534 path=[6031:0-50 6032:51-74 6053:75-75 6052:76-413 6044:414-495 6047:496-804 6051:805-1342 @6049@!:1343-2109 6054:2110-2112 6055:2113-2113 6056:2114-2137 6057:2138-2149 5943:2150-2156 5944:2157-2158 @6042@!:2159-3903 5981:3904-3919 6045:3920-4266 6041:4267-4648 6036:4649-4997 5976:4998-4998 5977:4999-5035 5978:5036-5036 6040:5037-5402 5973:5403-5426 6035:5427-5493 5964:5494-5498 5965:5499-5503 5966:5504-5508 5967:5509-5513 5968:5514-5518 5969:5519-5523 5970:5524-552 [...]
+CTCCGCGGCGCGGCGGCCAGTGCGGACTGCGGTTCCCGCCCGGCGCGCGGGCGCTGTGAC
+TGCTCCTCCGGGGCGGACTGGTGACTCTGCAGCGCTCTGGAGCCTCTCGTGCGGGGACTC
+CGTGGTGTCGCATTCCCTCAGAGAGGGAGACACGCACCCGGAGCTCCGAGCACAGCTCTC
+AAGGGCTGGCGGCCACGACGGCGTTTGCTCGGGTTCCCGGTGCAGTCCGAGTCTCTGCGG
+CCGCCCGGTGCGCCCGGGAGAGCGCACCTCCCCCGGCACGGCAGAACCGAGGCGACGAGG
+ATCAGGAGGGTCCTGCGCCCGCTACCACTGCCCACCGCGGGCCAGCCCGGCTGCGAGCAG
+CGGAGTTGCAGCGCTTTTTAGAGCTCTGGAGCCCCAGAAGACCTCTGCGAACCAAACACA
+CTGGGTTCTTCTCTGATTTCCACAGTGGAGCACAACTTCAAAGCTGGGAGTTGGCCAAGA
+AGGAAGAGAGAACCCCAGCATACTGACACGTGAACGAAACCCTCTTCTGGACAACCGTTT
+CTCCAAGGAGGATGAAGCCTTCTAGACCCATGTGATCTCCTATGAAGAACTGACCCCACC
+TGCTGGTCACCCCAGCTCCCACCATGGGCCCTGCAGGAAGCGTACTGAGCAGTGGGCAGA
+TGCAGATGCAGATGGTCCTGTGGGGAAGTCTGGCTGCCGTGGCCATGTTCTTCCTCATCA
+CCTTCCTCGTCCTCCTGTGTTCCACTTGCGACAGAGAGAAGAAGCCACGGCAGCATAGCG
+GGGACCATGAGAACCTGATGAATGTGCCTTCCGACAAGGACATGTTCAGCCATTCGGCAA
+CCAGCCTGACAACAGATGCACTGGCTAGCAGCGAACAGAACGGGGTGCTCACCAATGGCG
+ACATTCTTTCAGAAGACAGCACGCTGACCTGCATGCAGCACTATGAGGAAGTCCAGACCT
+CGGCTTCCGATCTCCTGGACTCCCAGGACAGCACAGGAAAGGCCAAGTGCCACCAGAGCC
+GGGAGCTGCCCAGGATCCCGCCTGAGAACGCCGTGGACGAGATTCTCACAGCCAGGGCTG
+CAGACACGGAACTGGGGCCCGGAGTGGAGGGGCCCTACGAGGTGCTCAAGGACAGCTCCT
+CCCAGGAGAACATGGTGGAGGACTGTCTGTATGAAACAGTGAAGGAGATCAAGGAAGTGG
+CAGACAAAGGCCAGGGTGGCAAGTCCAAGTCCACTTCTGCCTTGAAGGAGCTTCAGGGGG
+CTCCCATGGAGGGCAAGGCCGACTTTGCTGAATATGCCTCTGTGGACAGAAACAAAAAGT
+GCCGCCACAGCGCGAACGCAGAGAGCATTCTGGGAACTTGCAGTGACCTGGACGAGGAAA
+GCCCACCTCCTGTCCCGGTTAAGCTTCTGGATGAGAATGCCAACCTTCCCCAGGAGGGAG
+GAGGACAGGCAGAGGAGCAAGCTGCAGAAGGGACCGGTGGACACAGCAAGAGATTTAGTT
+CCTTGTCATACAAGTCTCGGGAAGAAGACCCGACTCTTACAGAAGAGGAGATCTCAGCAA
+TGTATTCCTCAGTGAATAAGCCTGGCCAGTCGGCACACAAACCTGGACCATGTATGAAAG
+GGCCAGAATCTGCCTGCCACTCCATGAAGGGCCTCCCTCAGAGGTCGTCATCTTCCTGCA
+ATGACCTCTATGCCACTGTGAAAGACTTTGAGAAAACTCCCAACAGCATCAGCACACTGC
+CCCCGGCAAGGAGACCCAGTGAGGAGCCAGAGCCTGACTATGAAGCCATACAGACTCTAA
+ACAGAGAGGATGAGAAGGTCCCTCTGGAGACCAATGGCCACCATGTCCCCAAGGAGAGTG
+ACTACGAGAGCATTGGGGACTTGCAGCAATGCAGAGATGTCACCAGGCTCTAGCAACTAA
+AAGAGGCTGTGATCAGCAGCTCTGCTGTGGAAAGGAGGTGGCTGCAGTTTCTCGCTGCTT
+TGGTTGACTGAAATCTTCAAGTGCAGTCTCCCAGTTGTCTCCCAGTTTCCAAAACAGTAA
+GGTACGGACCTGCCTGCCAGGGCAGCCACCCTCCAGTGCTCCCAAGAAACCCCTGGGACC
+CCTCACCTCCACATTCCACAGAGGAAGGCCAGCTGTGGGTGCTGGCGGGGAAGCCCCACC
+CACCAATGCCAAAATCCCACTGCCTGCTGAAGAAGAGCCAGGTTTCCATCCTTGCTCTCT
+TTCCCTCTGCTCCTCATGCTAAAACACTGGCACTTCACCCCTGGAGACCTCCCATGTGTG
+CTTCATCCCAAGGATGGTCTCCCACTGGCCTGCACTGGCCTTCAGTAAATGTTAGCATGG
+AGAGAAACTGGTTGCCGTTAACCCACCCTCTTCCCAGACCTGCCTCTTAGTCCCTGGGAA
+GGAACCTGGATGTGCAGGCTGTGAGGTATGGGGTGGGCCGTCCCTGGAGTCTCTGGGGTT
+CTTGCTCCTCGTTGGACACTGCATCTGCAGTCTTCAGAGGTTCATGAGGTCAGTTGAGAT
+GTTTTTTAATGTTCTATGTTGAAAACCTTCCCAACAGTGTTTGGATTTTCATAACTACTG
+TGGTACTTCTGTAGCTGTTCACACCCAGTGCTCTTCCTTCCAAACAGAGCCTTAATGTTT
+CTGTGAGGATGGCAGCCATGGTGTCTATCCCCAAAGGGCTGCGGACATAAATGTGTTCCC
+GGTGGTCTTTGCTGCCCACATGTGACTTTCCTATAATCTGATGGTAATCTGAGTAAAATG
+TAAACATTTATTTTATTATATAAATTTATAAGATGTTTTATGTTTAATGCCTAATTTCTA
+GAAAGTGCCAGAAAATATATATTAACTATTTGGATTTTATGTACAACGATTTATACTCTC
+ATTTTACAAACGATACCATAAAGCACATAAGCTAGATAATTATAAGCAGTTTTTATTCTT
+TTCTCTAATGAGTAATATAGCATTGAAGACTTGTTAAGGCTCAACTCCTCAGACAGTACT
+GGGAGTTCTAGATCCAAAACACTGAGGCACTGGTGGCAAAATGCAATGGACATAAATGTG
+TCACTGCTGAGACACTCGGTGTTATAAATAGAACAAAATCTGACTTGGGAATCCTGAAAG
+TACCAGACTTTCACTGATGTCTAGTGACCCCTCTAAAGACAGCAGTGGCGGTGCCCCCGT
+TCAGTCTCTGCCGACGCAAATTGCCCGGTTGTTCATCGCTTCACAGGAATCAGTAGCTGA
+AGCAGCTCACATTGAAAGTTCAGTCATCGCTCTAGATCTTCCCAGGCCAGCATTGGAAAC
+TCTGTTCACTTTTCATTTTAAGAGGAGCCTCGCTGAAGTGCAGGACACAGATAAAGAGAC
+AGCCTTTTCTTTCCTACTGCCATGTGGCATCTTATTCTAATGACTTAAGAATCATGCTAT
+TTTCCTTCCCTGTGATAAAGAGTGTGCGTGGGAAGGTGACATGACCAGCTCTGTGGCCTG
+TCTTTCCATCCTTGTACTCACCGACTGGTTGTGGATCATGCCTGTGGAGCTGCAAACTCT
+CTTGGATGTTGTTGGCATTAGCCTAATCCTCCATGAAGATGGTGGGCACATGGATAAGCA
+TCGCCTCTGCTGGCCCCGCCACAGCGGTGGGATACCCCAGGGAACTGGGAGCAGTAATGG
+GCAAGGCTGTTTGCAACCACTGATTTTCGCTGCTGTGTATTAATGAGTTTGGCCCAACCA
+TCTCTCAGGCCACGAGGGTCCCCTCATCACATGCCACTCCCCGTGCCACAGGGCGCTCCT
+GGACATGTGCTTGCCACCATGCAATTCCTTACAGGCATCGTATAGCTCAGGAGTTTGATT
+ATGTTTTATAAAAAGTCTTAGCAGGAAAGCTGGTATGATCTCTAAAGTATAAAACTCTTT
+TTTTCTATGAATGCACGCTTTATTATTCATGTACCGTCCAGAGACATCAAACCCATCAGC
+CCCCTGCCCCAAGAAGGAAGTTGAAAAACATTAACAGTAAAGAGCCTTTGCCCAAGAGTC
+AGAGATCCTATGACCTGCCTTCTCTGCTTTGGTGCCCAGAAGAGAGTGTGAGACTCTTCA
+AGGCTCCCAGAGCTTCGGGGAATCCAGGGTCATTTTGAGAGGACTCTGGGGTTCTGCCCG
+GTAGTCCCTCTTGATGCACAGTGGCAGCAGCACAGTTTCCAATTCGTGAGGGCCTTAGAC
+AACCGCTTGAGCTTCATCTCACGCCCCTTCTTGAAGAAATAGTACCTGATGTCTCCTTTT
+GTCAGTTTGAGTTTGTCAGCCATGGCCGCCAGAGTCCCCTCCTTAGTCTTTCTCAAAGTG
+CTTTTTTACTTCCTGGAACTGCTCATAGGTGAACCCAGAGTATCCATCCCAGTCGGACAG
+ACCCCGAGTTGTCTCCATCTCAGCTACTTCTATCTCTTCTGCAGCTCACTTGAGTTCTGT
+TCTTCAAGATTCCATAAAACTCTTTCTTCAGAGATAAGTTCATTATAGATAATCATGTCA
+TCTTGAATTCCTGTTGTCCAAATGTCCCAGAGTTTCCAAACGTGGTATGTAGCATGGTCA
+TGAAGTGTGCACTGACATCCCTCTCCTGGTCCGAGAAGCTCGCAGTGGTAAGAGAACATG
+TGACGGGCGATCTCACAGGTTCTGTACAAGGAACCTGGAGACCCTCTCCCCAACATAAAT
+CCAAAGGAATACGCACTAGCTTGTGAGGATACAGATTTTAGCCAAGTGAAAGAGCAAAAG
+CTCACAGCAAAACAAAAGCCTGGACAATCAAGCCAAAGATGCCAGCACAGCAGGAAATGT
+GTGGTAACCATGTACCTGACGCTCGGCTGAGCAAAGCGAGCCCCTCACCAGTCAGTTTGA
+GTTACTTACTTGGCTAAAATCCATGTTCCTGTCTTTGAGCTGGACGGAGCCTGTAGTTTG
+GTTTAAAGTCTAAATGTTACAGAGTTTAAATATGTGGGAAACCATCATCAAAAGGAGGCT
+GGACTGTACACTAAACACCTCTGAGTCTACAGCAGGCTGGACTGTACACTAAACACCACC
+ACAGAGTATACAGCGGTGACTATAGACTCACCACAGACTATCTTATGTGAAACATTTCCA
+ATATTCTAAAAGAAAGTCATTTTTATAAATGTGTTGGCTGCATATTTTTGACTTGTCCTT
+ATCTAAATCACATCACTAAGTCTGCAAAACTTCTAAATAATACCAATACTCTTTGTGGGA
+AAAGGGTTTTTTGCGTCTTTTATTATTTTTACATTGTACCTCTAAATATTTATGTTTTCT
+TGTTCTTCAGGTTCTTTTATTTAACTAAAAGATGTTTGTTCGGATTTTTACTCTCAGATG
+GAAATTGGAAGCATAATTGTGCTTAAAAGGCAGCACTAAAGATCATTCCATTTACTATTC
+AGATAGCCCAGTACAGGCTCCCCCTTGGATTGGCACTGCTATTCTGTAGGACTGCTTTGG
+TTTGGGTTGGGTTGGTTTGGTTTGGTTTGGTTTGGTTTGGTTTGGTTTGGTTTGGTTTGG
+TTTGGTTTGGTTTG
+>TR2|c0_g1_i2 len=5475 path=[5983:0-50 5984:51-65 5985:66-74 6053:75-75 6052:76-413 6024:414-436 6047:437-745 6051:746-1283 @6049@!:1284-2050 6054:2051-2053 6055:2054-2054 6056:2055-2078 6057:2079-2090 5943:2091-2097 5944:2098-2099 @6042@!:2100-3844 5981:3845-3860 6045:3861-4207 6041:4208-4589 6036:4590-4938 5976:4939-4939 5977:4940-4976 5978:4977-4977 6040:4978-5343 5973:5344-5367 6035:5368-5434 5964:5435-5439 5965:5440-5444 5966:5445-5449 5967:5450-5454 5968:5455-5459 5969:5460-5464 59 [...]
+CTCCGCGGCGCGGCGGCCAGTGCGGACTGCGGTTCCCGCCCGGCGCGCGGGTGCTGTGAC
+TGCTCCTCCGGGGCGGACTGGTGACTCTGCAGCGCTCTGGAGCCTCTCGTGCGGGGACTC
+CGTGGTGTCGCATTCCCTCAGAGAGGGAGACACGCACCCGGAGCTCCGAGCACAGCTCTC
+AAGGGCTGGCGGCCACGACGGCGTTTGCTCGGGTTCCCGGTGCAGTCCGAGTCTCTGCGG
+CCGCCCGGTGCGCCCGGGAGAGCGCACCTCCCCCGGCACGGCAGAACCGAGGCGACGAGG
+ATCAGGAGGGTCCTGCGCCCGCTACCACTGCCCACCGCGGGCCAGCCCGGCTGCGAGCAG
+CGGAGTTGCAGCGCTTTTTAGAGCTCTGGAGCCCCAGAAGACCTCTGCGAACCAGCCAAG
+AAGGAAGAGAGAACCCCAGCATACTGACACGTGAACGAAACCCTCTTCTGGACAACCGTT
+TCTCCAAGGAGGATGAAGCCTTCTAGACCCATGTGATCTCCTATGAAGAACTGACCCCAC
+CTGCTGGTCACCCCAGCTCCCACCATGGGCCCTGCAGGAAGCGTACTGAGCAGTGGGCAG
+ATGCAGATGCAGATGGTCCTGTGGGGAAGTCTGGCTGCCGTGGCCATGTTCTTCCTCATC
+ACCTTCCTCGTCCTCCTGTGTTCCACTTGCGACAGAGAGAAGAAGCCACGGCAGCATAGC
+GGGGACCATGAGAACCTGATGAATGTGCCTTCCGACAAGGACATGTTCAGCCATTCGGCA
+ACCAGCCTGACAACAGATGCACTGGCTAGCAGCGAACAGAACGGGGTGCTCACCAATGGC
+GACATTCTTTCAGAAGACAGCACGCTGACCTGCATGCAGCACTATGAGGAAGTCCAGACC
+TCGGCTTCCGATCTCCTGGACTCCCAGGACAGCACAGGAAAGGCCAAGTGCCACCAGAGC
+CGGGAGCTGCCCAGGATCCCGCCTGAGAACGCCGTGGACGAGATTCTCACAGCCAGGGCT
+GCAGACACGGAACTGGGGCCCGGAGTGGAGGGGCCCTACGAGGTGCTCAAGGACAGCTCC
+TCCCAGGAGAACATGGTGGAGGACTGTCTGTATGAAACAGTGAAGGAGATCAAGGAAGTG
+GCAGACAAAGGCCAGGGTGGCAAGTCCAAGTCCACTTCTGCCTTGAAGGAGCTTCAGGGG
+GCTCCCATGGAGGGCAAGGCCGACTTTGCTGAATATGCCTCTGTGGACAGAAACAAAAAG
+TGCCGCCACAGCGCGAACGCAGAGAGCATTCTGGGAACTTGCAGTGACCTGGACGAGGAA
+AGCCCACCTCCTGTCCCGGTTAAGCTTCTGGATGAGAATGCCAACCTTCCCCAGGAGGGA
+GGAGGACAGGCAGAGGAGCAAGCTGCAGAAGGGACCGGTGGACACAGCAAGAGATTTAGT
+TCCTTGTCATACAAGTCTCGGGAAGAAGACCCGACTCTTACAGAAGAGGAGATCTCAGCA
+ATGTATTCCTCAGTGAATAAGCCTGGCCAGTCGGCACACAAACCTGGACCATGTATGAAA
+GGGCCAGAATCTGCCTGCCACTCCATGAAGGGCCTCCCTCAGAGGTCGTCATCTTCCTGC
+AATGACCTCTATGCCACTGTGAAAGACTTTGAGAAAACTCCCAACAGCATCAGCACACTG
+CCCCCGGCAAGGAGACCCAGTGAGGAGCCAGAGCCTGACTATGAAGCCATACAGACTCTA
+AACAGAGAGGATGAGAAGGTCCCTCTGGAGACCAATGGCCACCATGTCCCCAAGGAGAGT
+GACTACGAGAGCATTGGGGACTTGCAGCAATGCAGAGATGTCACCAGGCTCTAGCAACTA
+AAAGAGGCTGTGATCAGCAGCTCTGCTGTGGAAAGGAGGTGGCTGCAGTTTCTCGCTGCT
+TTGGTTGACTGAAATCTTCAAGTGCAGTCTCCCAGTTGTCTCCCAGTTTCCAAAACAGTA
+AGGTACGGACCTGCCTGCCAGGGCAGCCACCCTCCAGTGCTCCCAAGAAACCCCTGGGAC
+CCCTCACCTCCACATTCCACAGAGGAAGGCCAGCTGTGGGTGCTGGCGGGGAAGCCCCAC
+CCACCAATGCCAAAATCCCACTGCCTGCTGAAGAAGAGCCAGGTTTCCATCCTTGCTCTC
+TTTCCCTCTGCTCCTCATGCTAAAACACTGGCACTTCACCCCTGGAGACCTCCCATGTGT
+GCTTCATCCCAAGGATGGTCTCCCACTGGCCTGCACTGGCCTTCAGTAAATGTTAGCATG
+GAGAGAAACTGGTTGCCGTTAACCCACCCTCTTCCCAGACCTGCCTCTTAGTCCCTGGGA
+AGGAACCTGGATGTGCAGGCTGTGAGGTATGGGGTGGGCCGTCCCTGGAGTCTCTGGGGT
+TCTTGCTCCTCGTTGGACACTGCATCTGCAGTCTTCAGAGGTTCATGAGGTCAGTTGAGA
+TGTTTTTTAATGTTCTATGTTGAAAACCTTCCCAACAGTGTTTGGATTTTCATAACTACT
+GTGGTACTTCTGTAGCTGTTCACACCCAGTGCTCTTCCTTCCAAACAGAGCCTTAATGTT
+TCTGTGAGGATGGCAGCCATGGTGTCTATCCCCAAAGGGCTGCGGACATAAATGTGTTCC
+CGGTGGTCTTTGCTGCCCACATGTGACTTTCCTATAATCTGATGGTAATCTGAGTAAAAT
+GTAAACATTTATTTTATTATATAAATTTATAAGATGTTTTATGTTTAATGCCTAATTTCT
+AGAAAGTGCCAGAAAATATATATTAACTATTTGGATTTTATGTACAACGATTTATACTCT
+CATTTTACAAACGATACCATAAAGCACATAAGCTAGATAATTATAAGCAGTTTTTATTCT
+TTTCTCTAATGAGTAATATAGCATTGAAGACTTGTTAAGGCTCAACTCCTCAGACAGTAC
+TGGGAGTTCTAGATCCAAAACACTGAGGCACTGGTGGCAAAATGCAATGGACATAAATGT
+GTCACTGCTGAGACACTCGGTGTTATAAATAGAACAAAATCTGACTTGGGAATCCTGAAA
+GTACCAGACTTTCACTGATGTCTAGTGACCCCTCTAAAGACAGCAGTGGCGGTGCCCCCG
+TTCAGTCTCTGCCGACGCAAATTGCCCGGTTGTTCATCGCTTCACAGGAATCAGTAGCTG
+AAGCAGCTCACATTGAAAGTTCAGTCATCGCTCTAGATCTTCCCAGGCCAGCATTGGAAA
+CTCTGTTCACTTTTCATTTTAAGAGGAGCCTCGCTGAAGTGCAGGACACAGATAAAGAGA
+CAGCCTTTTCTTTCCTACTGCCATGTGGCATCTTATTCTAATGACTTAAGAATCATGCTA
+TTTTCCTTCCCTGTGATAAAGAGTGTGCGTGGGAAGGTGACATGACCAGCTCTGTGGCCT
+GTCTTTCCATCCTTGTACTCACCGACTGGTTGTGGATCATGCCTGTGGAGCTGCAAACTC
+TCTTGGATGTTGTTGGCATTAGCCTAATCCTCCATGAAGATGGTGGGCACATGGATAAGC
+ATCGCCTCTGCTGGCCCCGCCACAGCGGTGGGATACCCCAGGGAACTGGGAGCAGTAATG
+GGCAAGGCTGTTTGCAACCACTGATTTTCGCTGCTGTGTATTAATGAGTTTGGCCCAACC
+ATCTCTCAGGCCACGAGGGTCCCCTCATCACATGCCACTCCCCGTGCCACAGGGCGCTCC
+TGGACATGTGCTTGCCACCATGCAATTCCTTACAGGCATCGTATAGCTCAGGAGTTTGAT
+TATGTTTTATAAAAAGTCTTAGCAGGAAAGCTGGTATGATCTCTAAAGTATAAAACTCTT
+TTTTTCTATGAATGCACGCTTTATTATTCATGTACCGTCCAGAGACATCAAACCCATCAG
+CCCCCTGCCCCAAGAAGGAAGTTGAAAAACATTAACAGTAAAGAGCCTTTGCCCAAGAGT
+CAGAGATCCTATGACCTGCCTTCTCTGCTTTGGTGCCCAGAAGAGAGTGTGAGACTCTTC
+AAGGCTCCCAGAGCTTCGGGGAATCCAGGGTCATTTTGAGAGGACTCTGGGGTTCTGCCC
+GGTAGTCCCTCTTGATGCACAGTGGCAGCAGCACAGTTTCCAATTCGTGAGGGCCTTAGA
+CAACCGCTTGAGCTTCATCTCACGCCCCTTCTTGAAGAAATAGTACCTGATGTCTCCTTT
+TGTCAGTTTGAGTTTGTCAGCCATGGCCGCCAGAGTCCCCTCCTTAGTCTTTCTCAAAGT
+GCTTTTTTACTTCCTGGAACTGCTCATAGGTGAACCCAGAGTATCCATCCCAGTCGGACA
+GACCCCGAGTTGTCTCCATCTCAGCTACTTCTATCTCTTCTGCAGCTCACTTGAGTTCTG
+TTCTTCAAGATTCCATAAAACTCTTTCTTCAGAGATAAGTTCATTATAGATAATCATGTC
+ATCTTGAATTCCTGTTGTCCAAATGTCCCAGAGTTTCCAAACGTGGTATGTAGCATGGTC
+ATGAAGTGTGCACTGACATCCCTCTCCTGGTCCGAGAAGCTCGCAGTGGTAAGAGAACAT
+GTGACGGGCGATCTCACAGGTTCTGTACAAGGAACCTGGAGACCCTCTCCCCAACATAAA
+TCCAAAGGAATACGCACTAGCTTGTGAGGATACAGATTTTAGCCAAGTGAAAGAGCAAAA
+GCTCACAGCAAAACAAAAGCCTGGACAATCAAGCCAAAGATGCCAGCACAGCAGGAAATG
+TGTGGTAACCATGTACCTGACGCTCGGCTGAGCAAAGCGAGCCCCTCACCAGTCAGTTTG
+AGTTACTTACTTGGCTAAAATCCATGTTCCTGTCTTTGAGCTGGACGGAGCCTGTAGTTT
+GGTTTAAAGTCTAAATGTTACAGAGTTTAAATATGTGGGAAACCATCATCAAAAGGAGGC
+TGGACTGTACACTAAACACCTCTGAGTCTACAGCAGGCTGGACTGTACACTAAACACCAC
+CACAGAGTATACAGCGGTGACTATAGACTCACCACAGACTATCTTATGTGAAACATTTCC
+AATATTCTAAAAGAAAGTCATTTTTATAAATGTGTTGGCTGCATATTTTTGACTTGTCCT
+TATCTAAATCACATCACTAAGTCTGCAAAACTTCTAAATAATACCAATACTCTTTGTGGG
+AAAAGGGTTTTTTGCGTCTTTTATTATTTTTACATTGTACCTCTAAATATTTATGTTTTC
+TTGTTCTTCAGGTTCTTTTATTTAACTAAAAGATGTTTGTTCGGATTTTTACTCTCAGAT
+GGAAATTGGAAGCATAATTGTGCTTAAAAGGCAGCACTAAAGATCATTCCATTTACTATT
+CAGATAGCCCAGTACAGGCTCCCCCTTGGATTGGCACTGCTATTCTGTAGGACTGCTTTG
+GTTTGGGTTGGGTTGGTTTGGTTTGGTTTGGTTTGGTTTGGTTTGGTTTGGTTTGGTTTG
+GTTTGGTTTGGTTTG
+>TR2|c1_g1_i1 len=1413 path=[1400:0-26 1401:27-30 1402:31-34 1403:35-38 1404:39-1412] [-1, 1400, 1401, 1402, 1403, 1404, -2]
+TGGATGGATGGATGGATGGATGGATGGATGGATGGATGGGTGCCTAGAGAGTTGAGTCTG
+GAACTCCAATCATTCTATGTATTTTTAGTACATTTTTTAAAGTATCAAATACACAATTGA
+CTCTGAAGGAAGACAAAAATAGCAAAATTTGAACTAAGTGTTGTGAGTAGCTCCTGCCTG
+TCCCCACTTCCCACCTGCCCGTAAGGTCATGTTTCTCAACCTTCCCAATGCTGTGACCCC
+CCCCCCCCAAACACCACCATGTTTTATTGCCATTTCATAACTGTAACTTTGCTACTGTTA
+TGAATCATAATGTAAATGTCTGGTCTGCAGGATAGAGAACCCAAAAGGGGTCTTCACCCA
+CAGGTTGAGTGCCAGTCTTAACATGTAAACAGTAAATGTAAAGGATTCACCCACAGGTTG
+AGTGCTAGTCTTAACATGTAAACAATAAATGTAAAGGAAGACTATGAACTCAAAGGTTAA
+ACTTTTTATTTAGATATTTTCTTTGTAACTCAAGAGTAAGCCAAGTTTGAGGAAAATTTA
+GTGAGGTCATTAAAGTTGTAAATCTGTAAGCCAGAAGAAGTAGCCCTCCCAGTATATTTT
+TTCTAAAGACTTTAAACTGTTTTCTCTAGGAAGATCAACTCCTGGAATAAAAGAACAAAG
+CTCCCATAGCCTTTCCAGCAGAGCATATATCTGTCTGCCACTACCCAGGTGTCTGTTCTT
+GTCATAGTGTTTCAATAATTTATACTGGGGGGAGGGGGAAGTGCATTTTAAATTTTCTTG
+GAAAAGTGAATTAATGTGTTAAATTGTCCAGTTTTGTCTAAAGAGAACGATTCGTTTTGG
+AGACAAGAGCACAGGGCTGTGGTCCCTGTCCCACCATCAAGTTTACTGTGTGACCTCAAG
+CAAATGATTGAACTTCTCTGTGCCTCAGTTTCTCCATATTACAAGATGGGGATAATGATT
+ACCAACCATTGCCTACCTCATAGGGATATTTTGGGAACAAGTCAGATAATGTAAGACAAA
+GGTTTTGATCTCCTTAAAAGGTGCTGTATAAACTGCGGTTGCATTGCTAATGATCCAGCA
+TTGTGTTTAGGATTAGATGATAGCAATACTTTTTGTCACGTTTTAGTCGAGGCATTATTT
+CTACTCTTCTGTGGCCAGATCACAAATTTTCATTCAATAATGGTACTTAAGGAACTGACA
+CGGGTGTTTGTTTTCTGTCTCTAATGCTAATATGTCAATTCTGAACAGTCATAAAAGGGT
+GGAGTTGAACTTGTGATGGCTTCTAGTTCACATGGAACAAATCTTATTCAAGCTGTATAT
+TAAAAGTATAATTACTTGTAAATAGCAGGTACATTGTAATTAAAGACACTTATTAACTTG
+TCTTTGTTCTTTTTAAATTGTAATAAAGGCCAG
+>TR2|c2_g1_i1 len=1096 path=[1035:0-1049 1036:1050-1051 1037:1052-1053 1038:1054-1055 1039:1056-1057 1040:1058-1059 1041:1060-1061 1042:1062-1063 1043:1064-1065 1044:1066-1067 1045:1068-1069 1046:1070-1071 1047:1072-1073 1048:1074-1075 1049:1076-1077 1050:1078-1079 1051:1080-1081 1052:1082-1083 1053:1084-1085 1054:1086-1087 1055:1088-1089 1056:1090-1091 1057:1092-1093 1058:1094-1095] [-1, 1035, 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 1044, 1045, 1046, 1047, 1048, 1049, 1050, 1051 [...]
+GTTTGGTTTGGTTTGGTTTGGTTTAAGATCTAGGAACTGGGCACTGCAGCCCATGCCTGT
+TATCCTATAATGAGGGAGAGTGGGAAAGAAGGACGGTTTTACATTCAAGGCTAACTTGGG
+CTACAAGGCCAGAGCCTATTCTAAACAAAATGTTCTGGTTATCTCAAATCACCTTATATG
+TGTTGTAAAGGTTGGTGACAGTCCCTCCTCAGACTTCTATGTTAACCTGGCACCTGTTCA
+ATGTTGCTGTTGTATTTACATGCCTTGTGATTTGTGGGGGAGTTTGAAATACAAGCAGAT
+AAATACACTGTTACAAGTAGAGGCTGTAGTTCTCATTCCAACAAGTTCCCTCATAAGGAT
+GGTTGGTTGTAGCATGTCCCTAAGGTTCCCAGCCAGTTTGAAGGTACTCCTCTTATTCAA
+GTAGGGTACAAAATAGTCCAAGACACAAAGCAGTTACTAATTATCTCTGCTGATAATTGT
+AACTATCTGATCATCTAGTTCATGAAAGAGTAAAGAGGTTTTGTTCGATGTGAAAATGCT
+TGAACCTTGGCTTTCTATGTTCAAAAATATTCGCATTAGCCTCGGAATCTTAGGGTTCTT
+CCCTGACTCTGATGCCCTTCAAGAGGCAGAAGGACTAGGGTGTGAAGTCAGTGTTTCCTT
+CCCCTCACTTGCCTGCTCCTGCACAGATGACCTACTGCCCCTTCATCCATTTGCCGTTGA
+CCTCGTCCCCATCATGAGTGTCTACACAGCTGTCACCTCTGTGCCATATCTACAGCATGT
+CCAGCTTCTCTTCAGTACCGCTCACCAGCCTAGGTGGGACCACTGACTGTGAGTCTGCAG
+TGGCCACCGCCCAGTCTCTGTGTCTCAAGCTCCAAGAGACGGTCACACACTAACCTGCAA
+GCCAAGGCTGGTGACTTTGACCATCCCTAACGCATGAGTTTTCCATGGAAACCTGGTCGG
+TGAACCTGACACGAAATTCCCAATTCCCCTTTACTCTGTACTGTGTGGCTGGTGCTCTTG
+TTTTCGTTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCTCT
+CTCTCTCTCTCTCTCT
+>TR3|c0_g1_i1 len=304 path=[282:0-303] [-1, 282, -2]
+GGTTTTTGTTGTTGTGTTTGGTTTTGTTTTTAATCAAAGGGCAAGCAAGCAAAGTTTATT
+TAAATTTTTATTTTATGTGTATGGGTATTTTGCTGCATATATGGCTGTCTACTATTTGCA
+TACCTAGTGTCTACAGAGACCAGAAGAAGACATCAAGTCCCCTGAAACTGGAGTTACAGA
+TGGTTATGAGTCATTATGTGGGTGCTGGGAATTGAACCCAGGTGATCTGGAGGAGGAGTC
+ATTTTTTTTGTTTTGTTTTTCATATATGTCATACAAAGTCTATTGAGAAGTAAATAAATC
+TTCG
+>TR4|c0_g1_i1 len=281 path=[275:0-146 276:147-280] [-1, 275, 276, -2]
+GCCAGTAGAAATGTGGACATGATAAGCCATCGTGTGGCCAAACTAGAGGAGACAAGGAAC
+GCTTTTCATCCTCTGTTTTGGAGCCAGGCCATGTCAGTAGCTTTCAGTGGAAAGTCTGAG
+GGGACATTTGACTGTCCATGGCTGTAGAGCAGGCACACTGTCCAGGCCGCCTAACTGTTT
+GACCAGCACTAATGAAATGTCAGTGTCCTGCACTCACTGTCTGCATGTTGTTCAAATGAT
+TTTCTGCATGGTGCTTTGACTTTGGCTGTCCCATGACCCAG
+>TR4|c2_g1_i1 len=518 path=[561:0-25 562:26-40 572:41-109 571:110-255 565:256-279 566:280-517] [-1, 561, 562, 572, 571, 565, 566, -2]
+CCAGTATGAGTGCTGGGTGTGTGTGTGTTGTGTGTTACCTGTGCATTTGTGTATTATGTG
+TGTGCAGGAGAGGAGGTGAGGGCATGCATGTGCATGGGTGTGTGCATGTTGCATGTCTGT
+GTGGGTGTGGGTGTGGTGGGGTACTATGGCCTGGAATGGTGATTCAGCCAGCTCAGTGCA
+CTTCCCTGTGGTGACTTTTTAGAAGTGTGCAAGTGAGTAGGAGAAGGAAGTGCAAGATGG
+CAGCACAGTGTGTTTGATTAACAGTAACACTTTAACTTGTATGATCACTTTTTCTCAGGT
+GCTCTGAGTCAGGTGTGGGGCTGACATCATCACTTTCTAGCCAGGTCTCCCTCACAGTAT
+CCTTAGAATTTCAGAACTTTGAGGTGTCACAAAGTATGAGCTAAGAGCTAGACAGATTTT
+TTTCCTTTTCCAGCGTAATGATGGTTGTCTTAACCAAAACTGGGGGGGGGGGGGATTTTG
+TTGTACCCCCTGGTGGTCTTCATTTGAGTGATTTTGAT
+>TR4|c3_g1_i1 len=360 path=[486:0-57 501:58-225 491:226-249 500:250-323 494:324-359] [-1, 486, 501, 491, 500, 494, -2]
+AAGTGAGCCGGCATTTCCATCAGGTACCTGTGGCTGGTGGCTCCCTCCACGGGGCTGGCT
+ATGTAGCTCCCATATGTCCCTTAGAGAGTCTGTCATCCTCTTTACTTTGTCACTAACCCC
+TTGTCTTAACCAAGCATCATGTGGGCAAAGATGCAGTTTTCCTTTATTAGATGGCCTGGG
+TCTAGATACGCTGGTGGTGGACTTGCCTCACAGGGTTCAGAGTGCTCAGGGAGCTTCCTA
+ACTCTGCTCCTTGTGAAGTGGCCTGACCCCTTCCCTACCATGATCTCCTGAGTTAAGACA
+CTACTTGGAAAGAAAGATTTCTTCCTGCTGATGAGGCTGGAGGAAGGCATTTTGTATTCT
+>TR4|c3_g1_i2 len=395 path=[486:0-57 501:58-225 491:226-249 500:250-323 496:324-334 497:335-358 498:359-394] [-1, 486, 501, 491, 500, 496, 497, 498, -2]
+AAGTGAGCCGGCATTTCCATCAGGTACCTGTGGCTGGTGGCTCCCTCCACGGGGCTGGCT
+ATGTAGCTCCCATATGTCCCTTAGAGAGTCTGTCATCCTCTTTACTTTGTCACTAACCCC
+TTGTCTTAACCAAGCATCATGTGGGCAAAGATGCAGTTTTCCTTTATTAGATGGCCTGGG
+TCTAGATACGCTGGTGGTGGACTTGCCTCACAGGGTTCAGAGTGCTCAGGGAGCTTCCTA
+ACTCTGCTCCTTGTGAAGTGGCCTGACCCCTTCCCTACCATGATCTCCTGAGTTAAGACA
+CTACTTGGAAAGAAAGATTTCTTCTTGCTGATGAGGCTTGAGGAAGTCTGTTTGTAGCCA
+GTAGAAATGTGGACGTGATAAGCCATCGTGTGGCC
+>TR4|c4_g1_i1 len=8757 path=[10067:0-123 10068:124-147 10238:148-333 @10231@!:334-957 10218:958-1805 10145:1806-1829 10237:1830-1874 @10224@!:1875-2722 10230:2723-3111 10216:3112-3436 10223:3437-3734 10131:3735-3758 10215:3759-4380 10245:4381-4699 @10235@!:4700-5459 10241:5460-6645 10251:6646-6646 10135:6647-6661 10240:6662-6662 @10234@!:6663-7161 10253:7162-7164 10089:7165-7182 10249:7183-7260 10248:7261-7623 10226:7624-7968 10255:7969-7969 10075:7970-7982 10076:7983-7983 10077:7984-875 [...]
+GGCGCGCTGACGTCTCCTTCGGACACGTCGGCGGCGGCACCTGGAGCCGGATGTGCCAAG
+ATGGCTGCGGCTGCTGCTGGGAACGCGCTAGTTCCCCCTACTGCCGCCGCCGTCGCCGGC
+TGGGTTTCAGTTCGCGGCGCCTGAGAAGCCAACCACAGCTCACAGGCACAAATTAAAGAA
+AAGCTCTACTCTGCCCCCTTGATAAGCAGCATCTCCTTGTGGAAAAGACTCCAACATGCA
+GCCACCACCTCAGGCAGTCCCGTCTGGGGTGGCTGGACCACCCCCAGCTGGGAATCCTCG
+GAGCATGTTCTGGGCCAACAGCCCTTACAGGAAGCCAGCCAATAATGCACCAGTGGCTCC
+CATAACACGCCCATTGCAGCCAGTAACGGATCCGTTTGCTTTTAATAGACAGACTCTTCA
+AAACACACCAGTAGGAAGTTCATCCAAAAGCAGCCTGCCCAATTTGCCTGGCCCAGCCCT
+CTCTGTTTTTTCTCAGTGGCCTGGTTTGCCTGTGACTCCCACAAATGCTGGGGATAGCTC
+CACAGGATTGCATGAGCCTCTGTCAGGAACTCTGTCACAGCCTAGAGCAGATGCCAGTCT
+ATTTCCTCCTGCATCTACCCCTTCTTCACTCCCTGGGCTGGAGGTGAGCAGGAATGCTGA
+GGCTGATCCCAGCTCAGGACATGAAGTCCAGATGCTGCCACATTCAGCTCACTACATTCC
+AGGAGTGGGTCCTGAGCAGCCTCTCGGGGGCCAAATGAATGACAGTGGGTCCGGGCCTGA
+CCAACCCATGAATAGGCATGCCCCCCATGATGGTGCCGTGACCCACGCAGCATCTCCTTT
+CCTCCCTCAGCCACAGATGCCAGGTCAGTGGGGGCCTGCACAAGGAGGCCCTCAGCCCTC
+CTATCAGCATCACTCACCCTACCTGGAGGGACCTGTTCAGAACATGGGGCTCCAGGCTGC
+CAGCTTGCCCCATTTTCCCCCTCCATCTAGTCTACACCAGGGACCTGGCCATGAGTCTCA
+TGCCCCACAAACATTTACTCCAGCATCCTTGGCCAGTGGTGAAGGGAATGAGATAGTTCA
+CCAGCAAAGTAAAAATCACCCATTGAGTAGCTTCCCCCCTAAACACACTTTTGAGCAGAA
+TTCCAGAATTGGGAATATGTGGGCAAGCCCAGAGTTGAAGCAGAATCCGGGAGTGAATAA
+AGAGCATCTGCTAGACCCTGCCCATGTCAATCCCTTCACTCAGGGAAATAGTCCTGAAAA
+CCAGGCGCATCATCCCCCAGTGGCAGCAACTAACCATGCCCTGCAAGAAGCAGCCTCTGG
+AGCTCTCTCAATGTTTTTTCAAGGGGAAGAGACAGAGAATGAGGAAAATCTCTCATCTGA
+AAAAGCAGGCCTCGATAAGAGATTGAACTTGGATAGCTTTTCTTCTACCTCCAGACTGGG
+CCATCCACCACCACCTGGAGCTAGTGGTGTCTACCAGGCCTTTCCTAGAGGCCCTAGCAG
+TGAGGCTGCGCAGGAAGGAGATGCGCAACCTTATTTTTCGCAGTCTGTGGGCGTCCGTCT
+TGACAAACAGAGCACTGTGCCCCCTGCTAATGATGCATGGGGTGATGTTCCGGGGACCGG
+GACCCGCTGTGCCAGTGGGCCACAGTGTGAGAATGTTGAGAACTTAGAATTTGTTCAGAA
+TCAAGAAGTTTTGCCCCGTGAGACCCTGAGTGTGGATCCCTTCCCCCTGAGTGATCAGAT
+CCGATATGGGCCCCTTCCTGGGCCAGCTGCCTCCAGGCCTGCTACTGTGGGCCTCACCAG
+AGGTGGGGGGCTAAATCTTGAGGCCCCAGACACACCACTGCACCCTACACGACCTGACAG
+TGTGTCATCCAGCTACAGCAGCCATAGCCACAGAAGTCCTCCTGGGTCAGCCAGACCCCA
+AGAATTGGTGGGCACATTCATTCAGCAAGAAGTTGGGAAACTTGAAGATGATACTTCAGG
+GAGTTTTTTTAAGCAAATTGATTCTTCTCCTGTTGGAGGTGAAACAGATGAGGTGACTGG
+GAGCCAAAATTGCTGCAGCAGTCTGTCCCAGCCTTCAACCCCAAGCCCTCCAAAACCTAC
+AGGAGTATTCCAAACAAGTGCAAACAGTTCTTTTGAGCCAGTAAAATCCCACTTGGTTGG
+AGTGAAACCAGTTGAAGCAGATCGTGCCAACATGGTGGTTGAAGTGAGAGGGACCCAATA
+CTGTCCGAAGAAGCGCAGGGCAGCTGTTGCACCACCTGATGCTACCTCAGGAAACCTGGA
+ACAGCCACCAGACAACATGGAGACCCCGTGTGCACCTCAGGCCTGCCCTTTGCCTCTTAG
+CACCACTGGAGAGGCTGGGCAACTGGTTTCAAACACGGCAGGGACACCCCTGGATACTGT
+GCGCCCAGTGCCTGATAAGAGGCCCTCAGCCAGGGCCCAGGGACCTGTGAAGTGTGAGAG
+CCCAGCAACAACTCTGTGGGCACAAAATGAGCTGCCAGATTTTGGTGGCAATGTCCTTCT
+AGCCCCTGCTGCCCCTGCACTTTATGTTCCTGTAAAACCAAAACCTTCAGAGGTTGTTCA
+TCATCCAGAAAAGGGAATGTCTGGACAGAAGGCCTGGAAACAAGGGTCTGTGCCACCTTT
+GCAGAACCAAGACCCTCCTGGTGCTTCTGAGAACCTTGAGAACCCTCCCAAGGTAGGAGA
+AGAGGAGGCCCTTCCAGTGCAGGCAAGTTCTGGTTATGCGAGTTTGCTTTCTTCGCCACC
+CACTGAATCTTTGCACAATCAACCTGTCCTGATTGCTCAGCCTGATCAAAGCTATAATTT
+GGCTCAGCCTATTAATTTTTCTGTGTCCTTACTGAATCCTAATGAGAAGAATCAGTCCTG
+GGGAGATGCTGTGGTGGGGGAGAGATCCATAGTGAGCAACAACTGGGCTCTCGGTGGTGA
+TCCTGAAGAACGTGCTGCTCTGTCTGGAGTTCCAGCCAGTGCTGTCACTGGCGCGTCTTT
+GCCTAGCAGTATCCCCCAGAATTGTGCCCCTCAAGGTTCGGGGTCTTCTGAAATGATTGC
+TAGCCAGTCTGCCAGTTGGTTGGTTCAACAGCTATCCCCTCAAACCCCTCAAAGTCCGCA
+TCCAAATGCAGAAAAGGGCCCTTCCGAGTTTGTTAGTAGCCCTGCTGGCAATACAAGTGT
+GATGCTAGTTCCACCTGCAAGCAGTACTTTGGTTCCTAACAGTAATAAGGCAAAGCACTC
+TAGTAACCAGGAAGAAGCTGTTGGCGCCCTAGACTTCACATTAAATAGAACTTTGGAAAA
+TCCTGTGAGAATGTACAGCCCATCTCCTTCAGATGGCCCAGCTTCTCAGCAGCCTCTTCC
+CAATCATCCCAGACAATCTGGGCCTGGGCTGCATAACCAGGATCATTTCTACCAGCAGGT
+AACAAAAGATGCTCAGGACCAGCATAGACTAGAAAGAGCCCAGCCAGAGCTGGTGCCTCC
+TCGGCCACAGAATTCTCCCCAAGTGCCCCAAGCATCGTGTCCAGAGCCTTCAAATCCTGA
+AAGCCCACCCACACAAGGACAGTCTGAAAGCTTGGCCCAGCCACCAGCAAGTCCAGCTTC
+AGTCAACACAGGCCAGCTGCTGCCTCAGCCACCACAGGCTTCCAGTGCATCCGTTACATC
+TACCAACTCCAGCCAGGCAGCTGTGCGGTCAGAGCAGCTGTGGCTACACCCACCACCTCC
+TAATACTTTTGGCCCAGCACCTCAAGACTTGGCATCCTACTACTATTACAGACCCCTGTA
+TGATGCCTACCAGTCTCAGTACCCTTCACCGTACCCGTCAGATCCTGGGACAGCCTCGCT
+GTACTACCAGGATATGTATGGCCTGTATGAGCCTCGTTACAGACCCTATGACAGCTCAGC
+ATCTGCTTATGCCGAGAACCACCGCTATTCTGAGCCTGAGCGGCCCAGCTCCCGTGCAAG
+TCACTATTCCGACCAGCTTGCTCCCAGGCAAGGATATCCTGAAGGATACTATAATTCCAA
+GAGTGGATGGAGCAGTCACAGTGATTACTATGCAAATTATTACTCTGGCCAGTATGATTA
+TGGAGACCCCAGCCGCTGGGATCGTTACTATGGGTCTCGCCTTAGGGATCCTCGCACCTG
+GGACCGGAGGTACTGGTATGACTCTGAACATGACCCATACAGGAAGGACCACTATGCTTA
+CAGTGACAGGCCTGAGAAATGTGATGATCACTGGAGGTATGACCCTCGCTTCACTGGGAG
+CTTCGACGATGACGCTGAGATCCACAGGGACCCCTATGGAGAAGAAGCAGACAGACGCAG
+CATCCACAGTGAGCACTCGGCACGGAGCCTGCGCAGCACTCACAGTCTGCCCAGCCGCCG
+CAGCAGCCTCAGCTCCCATTCACACCAGAGTCAGATTTACAGAAGCCACCATGTGACTGG
+CGGTTCCTTTGAGGCCCCTCATGCCCCAGGCTCATTTCATGGTGATTATGCCTATGGCAC
+ATATGCCAGCAATTTCAGCGGTGCCCATGGTTTTCCAGAGTACAGCTACCCTGCAGACAC
+CTCCTGGCCTGCTGTGGAGCAAGTTCCATCAAGACCGACCTCTCCTGAGAAGTTTACGGT
+GCCTCATGTCTGTGCCAGGTTTGGTCCTGGTGGTCAGCTCCTTAAAGTGATTCCCAACCT
+GCCTTCAGAAGGACAGCCTGCACTGGTGGAGATCCACAGCTTAGAGACCTTGCTGCAGCA
+CACACCTGAGCAGGAAGAGATGCGCTCCTTCCCAGGACCTCTCGGCAAAGATGATACCCA
+CAAAGTAGATGTTATTAACTTTGCACAGAACAAAGCAACAAAATGTTTGCAGAATGAAAG
+TTTAATTGATAAAGAGTCTGCAAGTCTTCTTTGGAAATTCATTATTCTGTTATGCAGACA
+GAATGGGACTGTTGTGGGAACAGACATTGCAGAGCTTTTGTTACGGGACCATAGAACTGT
+ATGGCTTCCTGGGAAGTCACCCAATGAGGCAAACCTGATAGATTTTACCAATGAGGCTGT
+GGAACAAGTGGAAGAGGAGGAGTCAGGGGAGGCCCAGCTCTCATTTCTCACAGACAGTCA
+GACAGTGACCACCAGCGTGCTGGAGAAGGAGACTGAGCGGTTCCGTGAGCTCTTGCTGTA
+TGGCCGGAAGAAGGATGCTCTGGAGTCTGCCATGAAAAATGGCTTATGGGGTCATGCTCT
+TCTGCTTGCAAGTAAGATGGACAGCCGGACACATGCCCGTGTCATGACCAGGTTTGCCAA
+CAGTCTTCCAATCAATGACCCCCTGCAGACTGTCTACCAGCTCATGTCTGGACGGATGCC
+TGCTGCATCCACGTGTTGTGGCGATGAGAAGTGGGGAGATTGGAGGCCACATCTTGCAAT
+GGTTTTGTCCAACCTGAACAACAACATGGATGTTGAATCTAGGACCATGGCTACGATGGG
+TGATACTCTAGCATCAAAAGGCCTGTTGGATGCTGCACACTTCTGCTACCTGATGGCCCA
+GGTTGGATTTGGGGTTTATACAAAGAAAACTACAAAACTTGTCTTGATAGGCTCAAATCA
+CAGTTTGCCCTTTTTAAAGTTTGCCACCAATGAAGCCATTCAAAGGACGGAGGCTTATGA
+GTATGCTCAGTCCCTTGGGGCACATACCTGTTCCTTACCTAACTTCCAGGTGTTTAAATT
+CATCTACTTGTGCCGCCTGGCTGAAATGGGACTTGCCACACAGGCCTTCCACTACTGCGA
+AGTAATAGCCAAGAGTGTCCTGACACAGCCTGGTGCATACTCTCCAGTACTGATTAGCCA
+GTTGACTCAGATGGCTTCCCAGTTACGCCTCTTCGATCCTCAACTGAAGGAGAAGCCAGA
+AGAGGAGTCCTTTGTGGAGCCTGCCTGGTTGGTGCAGCTGCAGCACGTGGAGAGGCAGAT
+CCAGGAGGGCACTGTGCTGTGGAGCCAGGATGGAACTGAACCCCAGCAGTGTCGCATTAC
+ATCGGGCTCTGAGGTGGAGCAGTCAGATGGCCCTGGACTCAACCAGCAGGCAGGGCCACA
+GGCCGACAACCCTCTACTGATGCCAAGCACTGAGCCTTTGATGCATGGCGTGCAACTGCT
+GCCCACAGCTCCTCAGACATTGCCTGATGGCCAGCCTGCTCACCTTTCCAGGGTGCCGAT
+GTTCCCAGTGCCAATGTCTCGTGGGCCCCTGGAGCTGAGTCCTGCCTATGGACCCCCAGG
+ATCTGCACTTGGCTTCCCAGAATCCTCCAGATCTGATCCTGCAGTGCTGCATCCTGGGCA
+GGCCCTGCCACCCACTACACTAAGTCTCCAGGAAAGTGGGCTTCCACCCCAGGAGGCCAA
+AAGTCCAGACCCAGAAATGGTGCCACGGGGCTCACCTGTCAGACACTCCCCTCCGGAGCT
+CAGTCAAGAGGAGTTTGGCGAGAGCTTCGCTGACCCGGGCTCTTCCAGAACAGCACAGGA
+CTTGGAAACCTCCCCAGTGTGGGATCTTGGCAGCTCCAGTTTGACACGTGCACCATCTTT
+GACATCTGATTCTGAAGGGAAGAAACCTGCACAGGCTGTCAAAAAGGAGCCCAAGGAGCC
+CAAGAAGACTGAGTCCTGGTTCTCTCGTTGGCTGCCTGGAAAAAAAAGGACAGAAGCTTA
+TCTACCAGATGACAAGAACAAATCAATTGTTTGGGATGAAAAGAAAAACCAGTGGGTGAA
+TTTGAATGAACCAGAGGAGGAGAAGAAGGCTCCACCCCCACCTCCAACATCGTTCCCCAG
+GGTTCCCCAGGTGGCTCCCACTGGGCCTGCAGGACCACCCACGGCCTCCGTGAATGTGTT
+TTCTAGAAAAGCAGGTGGGTCCAGAGCTCGCTATGTGGATGTTCTAAACCCAAGTGGAAC
+ACAGCGGAGTGAACCAGCTCTTGCTCCTGCAGATTTCTTTGCTCCTCTCGCCCCACTGCC
+AATTCCTTCTAACTTATTTGTACCAAACCCAGATGCAGAAGAGCCACAACCTGCAGATGG
+GACTGGCTGTAGGGGACAGGCACCAGCTGGGACTCAGTCTAAGGCAGAGTCCACCCTGGA
+ACCCAAGGTGGGAAGTTCTACAGTATCAGCCCCTGGACCTGAGCTCTTACCCTCCAAACC
+AGATGGCTCCCAAGGAGGAGAGGCTCCTGGAGACCATTGTCCTACAGGGGCCCCTCATGG
+TGGGTCTGTGCCCTTTTACAACCCTGCTCAGTTGGTGCAGGCTTCTGTCACCTCGGGAAA
+TTCAAGGCCAGGGAGGATTGGCCAAAGAAAATATGCGGCATTGAACTAGGATTGCTGCTG
+GATTCTTATTTGGAACCCTGAGATGATTAGATAACTGTTCTTCACCAAGAACCAACTAGC
+TGCCTCAGGTCTCGTGGATCCCAGATGGACATGGCAGTAACTCAGAGCCGGTCATACTGT
+GTGTCTCCTTCCTTGCAGCCTATGTATATGAATGATTGAAAAATTGATTTCAAGGTTCCT
+TTCAAATGCTGGATAGAATGAATCTAATTCAAAGTCTTTTATGTAAAAGAACAATGTTTC
+TTTTTTAGTCACTTTAGACAAATTAAGGTTTGAGCCACTTGAGAATATCCCCGCAGAGAG
+GCTAGGCAGGGATTCACTACAGGAGAGCACAGTTACTTGGACACCAAGGCCTTTCTCACC
+TGAGAAATGGTGCAAACCAACCAGGGATCCTTAGGCTACTGAGAAGGCTGTCTGCTTACC
+TGGAGAGGACTGACTGCTGGGATGTCTGGCCTAAGAGGAGCCTCAAACTGCACTGGGCAA
+CTGTGCCTTGTCCTGTGAACTGGGGAGTACATGCCAGCTCCTCAAAGGGTCACCAGATGG
+CAGCGGCTCCCAGGCTGGGGAGGAAGTGGTTACAAGGGCATGTCTCTCCAACATTTCCAG
+CCTCACTCCATTTTCTGTGGCCTCATTAGTGCTGGGTGCGTTTTTTTTTTGCTCCGAGCT
+TTCCGTCATGGCTCAGTCACTGGGGAGAGCCCCAGGGAGCTGATATTCTGAAGCTGCTGA
+TCTGATTAACCAGGTCAAAAACTGGCTGTGTGCTGCAACGTACTGCCCTCCTAGCCAGGA
+GTCTGTATGGAGCCCTCTAGCTGACTCAATGTCACCTGCAGACAGCACTTAAAGCCTTGG
+TGGTATCTTGGAGTGGCTTACGGTGTCCTAGCGCACACTCTGGAACCTTGCATCTCTACC
+CCAAAGCCCACCAGGGACCTTCAGCAGCGACTCACTGGCTCACCCATATCACTTCAAGGA
+GCTGCCACCACATAAGAGTCAAAGCTTTAAGGCTTCACTGACTGTTCCTAAAACTATCCT
+TACACTCTAAAGAGGAAGGGAAAGAGAGTTAAATATTTAAAAATCAGCAGGTAGAAAACA
+TAAATGGTTTGTTTGGTATTAAATTTAGAAATTGTAGAACATGGAATTAGTACAGCCCTT
+CCCGGTTTTCTGGTTCCTTGCATCATCTAGGAAAGACTCACAGAATGGCTTCCAGGACGT
+TCCATAGATGAGTGTACTTGGACCCTCCTGTTCCTGTCATTAAGAAAGGCCTGTCCCTGT
+GGGTCAGTAGCAACTTGTGTCCTTGCTGGGACCAGGCAGGACCCTTGCCTCTGGTTCAAC
+CCTGCCCAGGCTCTGTGTTGACTGCCAACCACTTTGGATTCAAGAAGCTTCCTCCCTGGG
+AGCTGCTATTTTTCCAAAATTCACATTGTTAAATAAAATATTTTGGGCTCTCAAGTG
+>TR4|c4_g1_i2 len=968 path=[10061:0-204 10250:205-259 10248:260-622 10226:623-967] [-1, 10061, 10250, 10248, 10226]
+ACAACCCTGCTCAGTTGGTGCAGAATTGGCAGAACAAAAACAAATCATGTCTGCAGTGCT
+GTGGGCTAGGAAATGCTGAGCAGCAGGAACTTGGCACATACAGAAGGTCTTGCTTACACT
+TGAAGCTAACACAGAGTCTGCCCATTTGTTATTGATCTGTGGGGTTATCCTGTAGCTCCA
+TCGCTGGACAGCCTCTGGGCATGGACACATGTAGGTCATTGCTGTTCCTTTTGTTCTAGG
+CTTCTGTCACCTCGGGAAATTCAAGGCCAGGGAGGATTGGCCAAAGAAAATATGCGGCAT
+TGAACTAGGATTGCTGCTGGATTCTTATTTGGAACCCTGAGATGATTAGATAACTGTTCT
+TCACCAAGAACCAACTAGCTGCCTCAGGTCTCGTGGATCCCAGATGGACATGGCAGTAAC
+TCAGAGCCGGTCATACTGTGTGTCTCCTTCCTTGCAGCCTATGTATATGAATGATTGAAA
+AATTGATTTCAAGGTTCCTTTCAAATGCTGGATAGAATGAATCTAATTCAAAGTCTTTTA
+TGTAAAAGAACAATGTTTCTTTTTTAGTCACTTTAGACAAATTAAGGTTTGAGCCACTTG
+AGAATATCCCCGCAGAGAGGCTAGGCAGGGATTCACTACAGGAGAGCACAGTTACTTGGA
+CACCAAGGCCTTTCTCACCTGAGAAATGGTGCAAACCAACCAGGGATCCTTAGGCTACTG
+AGAAGGCTGTCTGCTTACCTGGAGAGGACTGACTGCTGGGATGTCTGGCCTAAGAGGAGC
+CTCAAACTGCACTGGGCAACTGTGCCTTGTCCTGTGAACTGGGGAGTACATGCCAGCTCC
+TCAAAGGGTCACCAGATGGCAGCGGCTCCCAGGCTGGGGAGGAAGTGGTTACAAGGGCAT
+GTCTCTCCAACATTTCCAGCCTCACTCCATTTTCTGTGGCCTCATTAGTGCTGGGTGCGT
+TTTTTTTT
+>TR4|c4_g1_i3 len=8817 path=[10067:0-123 10068:124-147 10238:148-333 @10231@!:334-957 10218:958-1805 10145:1806-1829 10237:1830-1874 @10224@!:1875-2722 10230:2723-3111 10216:3112-3436 10223:3437-3734 10131:3735-3758 10215:3759-4380 10245:4381-4699 @10235@!:4700-5459 10241:5460-6645 10251:6646-6646 10135:6647-6661 10240:6662-6662 @10234@!:6663-7161 10252:7162-7167 10256:7168-7175 10258:7176-7176 10220:7177-7182 10212:7183-7242 10249:7243-7320 10248:7321-7683 10226:7684-8028 10255:8029-802 [...]
+GGCGCGCTGACGTCTCCTTCGGACACGTCGGCGGCGGCACCTGGAGCCGGATGTGCCAAG
+ATGGCTGCGGCTGCTGCTGGGAACGCGCTAGTTCCCCCTACTGCCGCCGCCGTCGCCGGC
+TGGGTTTCAGTTCGCGGCGCCTGAGAAGCCAACCACAGCTCACAGGCACAAATTAAAGAA
+AAGCTCTACTCTGCCCCCTTGATAAGCAGCATCTCCTTGTGGAAAAGACTCCAACATGCA
+GCCACCACCTCAGGCAGTCCCGTCTGGGGTGGCTGGACCACCCCCAGCTGGGAATCCTCG
+GAGCATGTTCTGGGCCAACAGCCCTTACAGGAAGCCAGCCAATAATGCACCAGTGGCTCC
+CATAACACGCCCATTGCAGCCAGTAACGGATCCGTTTGCTTTTAATAGACAGACTCTTCA
+AAACACACCAGTAGGAAGTTCATCCAAAAGCAGCCTGCCCAATTTGCCTGGCCCAGCCCT
+CTCTGTTTTTTCTCAGTGGCCTGGTTTGCCTGTGACTCCCACAAATGCTGGGGATAGCTC
+CACAGGATTGCATGAGCCTCTGTCAGGAACTCTGTCACAGCCTAGAGCAGATGCCAGTCT
+ATTTCCTCCTGCATCTACCCCTTCTTCACTCCCTGGGCTGGAGGTGAGCAGGAATGCTGA
+GGCTGATCCCAGCTCAGGACATGAAGTCCAGATGCTGCCACATTCAGCTCACTACATTCC
+AGGAGTGGGTCCTGAGCAGCCTCTCGGGGGCCAAATGAATGACAGTGGGTCCGGGCCTGA
+CCAACCCATGAATAGGCATGCCCCCCATGATGGTGCCGTGACCCACGCAGCATCTCCTTT
+CCTCCCTCAGCCACAGATGCCAGGTCAGTGGGGGCCTGCACAAGGAGGCCCTCAGCCCTC
+CTATCAGCATCACTCACCCTACCTGGAGGGACCTGTTCAGAACATGGGGCTCCAGGCTGC
+CAGCTTGCCCCATTTTCCCCCTCCATCTAGTCTACACCAGGGACCTGGCCATGAGTCTCA
+TGCCCCACAAACATTTACTCCAGCATCCTTGGCCAGTGGTGAAGGGAATGAGATAGTTCA
+CCAGCAAAGTAAAAATCACCCATTGAGTAGCTTCCCCCCTAAACACACTTTTGAGCAGAA
+TTCCAGAATTGGGAATATGTGGGCAAGCCCAGAGTTGAAGCAGAATCCGGGAGTGAATAA
+AGAGCATCTGCTAGACCCTGCCCATGTCAATCCCTTCACTCAGGGAAATAGTCCTGAAAA
+CCAGGCGCATCATCCCCCAGTGGCAGCAACTAACCATGCCCTGCAAGAAGCAGCCTCTGG
+AGCTCTCTCAATGTTTTTTCAAGGGGAAGAGACAGAGAATGAGGAAAATCTCTCATCTGA
+AAAAGCAGGCCTCGATAAGAGATTGAACTTGGATAGCTTTTCTTCTACCTCCAGACTGGG
+CCATCCACCACCACCTGGAGCTAGTGGTGTCTACCAGGCCTTTCCTAGAGGCCCTAGCAG
+TGAGGCTGCGCAGGAAGGAGATGCGCAACCTTATTTTTCGCAGTCTGTGGGCGTCCGTCT
+TGACAAACAGAGCACTGTGCCCCCTGCTAATGATGCATGGGGTGATGTTCCGGGGACCGG
+GACCCGCTGTGCCAGTGGGCCACAGTGTGAGAATGTTGAGAACTTAGAATTTGTTCAGAA
+TCAAGAAGTTTTGCCCCGTGAGACCCTGAGTGTGGATCCCTTCCCCCTGAGTGATCAGAT
+CCGATATGGGCCCCTTCCTGGGCCAGCTGCCTCCAGGCCTGCTACTGTGGGCCTCACCAG
+AGGTGGGGGGCTAAATCTTGAGGCCCCAGACACACCACTGCACCCTACACGACCTGACAG
+TGTGTCATCCAGCTACAGCAGCCATAGCCACAGAAGTCCTCCTGGGTCAGCCAGACCCCA
+AGAATTGGTGGGCACATTCATTCAGCAAGAAGTTGGGAAACTTGAAGATGATACTTCAGG
+GAGTTTTTTTAAGCAAATTGATTCTTCTCCTGTTGGAGGTGAAACAGATGAGGTGACTGG
+GAGCCAAAATTGCTGCAGCAGTCTGTCCCAGCCTTCAACCCCAAGCCCTCCAAAACCTAC
+AGGAGTATTCCAAACAAGTGCAAACAGTTCTTTTGAGCCAGTAAAATCCCACTTGGTTGG
+AGTGAAACCAGTTGAAGCAGATCGTGCCAACATGGTGGTTGAAGTGAGAGGGACCCAATA
+CTGTCCGAAGAAGCGCAGGGCAGCTGTTGCACCACCTGATGCTACCTCAGGAAACCTGGA
+ACAGCCACCAGACAACATGGAGACCCCGTGTGCACCTCAGGCCTGCCCTTTGCCTCTTAG
+CACCACTGGAGAGGCTGGGCAACTGGTTTCAAACACGGCAGGGACACCCCTGGATACTGT
+GCGCCCAGTGCCTGATAAGAGGCCCTCAGCCAGGGCCCAGGGACCTGTGAAGTGTGAGAG
+CCCAGCAACAACTCTGTGGGCACAAAATGAGCTGCCAGATTTTGGTGGCAATGTCCTTCT
+AGCCCCTGCTGCCCCTGCACTTTATGTTCCTGTAAAACCAAAACCTTCAGAGGTTGTTCA
+TCATCCAGAAAAGGGAATGTCTGGACAGAAGGCCTGGAAACAAGGGTCTGTGCCACCTTT
+GCAGAACCAAGACCCTCCTGGTGCTTCTGAGAACCTTGAGAACCCTCCCAAGGTAGGAGA
+AGAGGAGGCCCTTCCAGTGCAGGCAAGTTCTGGTTATGCGAGTTTGCTTTCTTCGCCACC
+CACTGAATCTTTGCACAATCAACCTGTCCTGATTGCTCAGCCTGATCAAAGCTATAATTT
+GGCTCAGCCTATTAATTTTTCTGTGTCCTTACTGAATCCTAATGAGAAGAATCAGTCCTG
+GGGAGATGCTGTGGTGGGGGAGAGATCCATAGTGAGCAACAACTGGGCTCTCGGTGGTGA
+TCCTGAAGAACGTGCTGCTCTGTCTGGAGTTCCAGCCAGTGCTGTCACTGGCGCGTCTTT
+GCCTAGCAGTATCCCCCAGAATTGTGCCCCTCAAGGTTCGGGGTCTTCTGAAATGATTGC
+TAGCCAGTCTGCCAGTTGGTTGGTTCAACAGCTATCCCCTCAAACCCCTCAAAGTCCGCA
+TCCAAATGCAGAAAAGGGCCCTTCCGAGTTTGTTAGTAGCCCTGCTGGCAATACAAGTGT
+GATGCTAGTTCCACCTGCAAGCAGTACTTTGGTTCCTAACAGTAATAAGGCAAAGCACTC
+TAGTAACCAGGAAGAAGCTGTTGGCGCCCTAGACTTCACATTAAATAGAACTTTGGAAAA
+TCCTGTGAGAATGTACAGCCCATCTCCTTCAGATGGCCCAGCTTCTCAGCAGCCTCTTCC
+CAATCATCCCAGACAATCTGGGCCTGGGCTGCATAACCAGGATCATTTCTACCAGCAGGT
+AACAAAAGATGCTCAGGACCAGCATAGACTAGAAAGAGCCCAGCCAGAGCTGGTGCCTCC
+TCGGCCACAGAATTCTCCCCAAGTGCCCCAAGCATCGTGTCCAGAGCCTTCAAATCCTGA
+AAGCCCACCCACACAAGGACAGTCTGAAAGCTTGGCCCAGCCACCAGCAAGTCCAGCTTC
+AGTCAACACAGGCCAGCTGCTGCCTCAGCCACCACAGGCTTCCAGTGCATCCGTTACATC
+TACCAACTCCAGCCAGGCAGCTGTGCGGTCAGAGCAGCTGTGGCTACACCCACCACCTCC
+TAATACTTTTGGCCCAGCACCTCAAGACTTGGCATCCTACTACTATTACAGACCCCTGTA
+TGATGCCTACCAGTCTCAGTACCCTTCACCGTACCCGTCAGATCCTGGGACAGCCTCGCT
+GTACTACCAGGATATGTATGGCCTGTATGAGCCTCGTTACAGACCCTATGACAGCTCAGC
+ATCTGCTTATGCCGAGAACCACCGCTATTCTGAGCCTGAGCGGCCCAGCTCCCGTGCAAG
+TCACTATTCCGACCAGCTTGCTCCCAGGCAAGGATATCCTGAAGGATACTATAATTCCAA
+GAGTGGATGGAGCAGTCACAGTGATTACTATGCAAATTATTACTCTGGCCAGTATGATTA
+TGGAGACCCCAGCCGCTGGGATCGTTACTATGGGTCTCGCCTTAGGGATCCTCGCACCTG
+GGACCGGAGGTACTGGTATGACTCTGAACATGACCCATACAGGAAGGACCACTATGCTTA
+CAGTGACAGGCCTGAGAAATGTGATGATCACTGGAGGTATGACCCTCGCTTCACTGGGAG
+CTTCGACGATGACGCTGAGATCCACAGGGACCCCTATGGAGAAGAAGCAGACAGACGCAG
+CATCCACAGTGAGCACTCGGCACGGAGCCTGCGCAGCACTCACAGTCTGCCCAGCCGCCG
+CAGCAGCCTCAGCTCCCATTCACACCAGAGTCAGATTTACAGAAGCCACCATGTGACTGG
+CGGTTCCTTTGAGGCCCCTCATGCCCCAGGCTCATTTCATGGTGATTATGCCTATGGCAC
+ATATGCCAGCAATTTCAGCGGTGCCCATGGTTTTCCAGAGTACAGCTACCCTGCAGACAC
+CTCCTGGCCTGCTGTGGAGCAAGTTCCATCAAGACCGACCTCTCCTGAGAAGTTTACGGT
+GCCTCATGTCTGTGCCAGGTTTGGTCCTGGTGGTCAGCTCCTTAAAGTGATTCCCAACCT
+GCCTTCAGAAGGACAGCCTGCACTGGTGGAGATCCACAGCTTAGAGACCTTGCTGCAGCA
+CACACCTGAGCAGGAAGAGATGCGCTCCTTCCCAGGACCTCTCGGCAAAGATGATACCCA
+CAAAGTAGATGTTATTAACTTTGCACAGAACAAAGCAACAAAATGTTTGCAGAATGAAAG
+TTTAATTGATAAAGAGTCTGCAAGTCTTCTTTGGAAATTCATTATTCTGTTATGCAGACA
+GAATGGGACTGTTGTGGGAACAGACATTGCAGAGCTTTTGTTACGGGACCATAGAACTGT
+ATGGCTTCCTGGGAAGTCACCCAATGAGGCAAACCTGATAGATTTTACCAATGAGGCTGT
+GGAACAAGTGGAAGAGGAGGAGTCAGGGGAGGCCCAGCTCTCATTTCTCACAGACAGTCA
+GACAGTGACCACCAGCGTGCTGGAGAAGGAGACTGAGCGGTTCCGTGAGCTCTTGCTGTA
+TGGCCGGAAGAAGGATGCTCTGGAGTCTGCCATGAAAAATGGCTTATGGGGTCATGCTCT
+TCTGCTTGCAAGTAAGATGGACAGCCGGACACATGCCCGTGTCATGACCAGGTTTGCCAA
+CAGTCTTCCAATCAATGACCCCCTGCAGACTGTCTACCAGCTCATGTCTGGACGGATGCC
+TGCTGCATCCACGTGTTGTGGCGATGAGAAGTGGGGAGATTGGAGGCCACATCTTGCAAT
+GGTTTTGTCCAACCTGAACAACAACATGGATGTTGAATCTAGGACCATGGCTACGATGGG
+TGATACTCTAGCATCAAAAGGCCTGTTGGATGCTGCACACTTCTGCTACCTGATGGCCCA
+GGTTGGATTTGGGGTTTATACAAAGAAAACTACAAAACTTGTCTTGATAGGCTCAAATCA
+CAGTTTGCCCTTTTTAAAGTTTGCCACCAATGAAGCCATTCAAAGGACGGAGGCTTATGA
+GTATGCTCAGTCCCTTGGGGCACATACCTGTTCCTTACCTAACTTCCAGGTGTTTAAATT
+CATCTACTTGTGCCGCCTGGCTGAAATGGGACTTGCCACACAGGCCTTCCACTACTGCGA
+AGTAATAGCCAAGAGTGTCCTGACACAGCCTGGTGCATACTCTCCAGTACTGATTAGCCA
+GTTGACTCAGATGGCTTCCCAGTTACGCCTCTTCGATCCTCAACTGAAGGAGAAGCCAGA
+AGAGGAGTCCTTTGTGGAGCCTGCCTGGTTGGTGCAGCTGCAGCACGTGGAGAGGCAGAT
+CCAGGAGGGCACTGTGCTGTGGAGCCAGGATGGAACTGAACCCCAGCAGTGTCGCATTAC
+ATCGGGCTCTGAGGTGGAGCAGTCAGATGGCCCTGGACTCAACCAGCAGGCAGGGCCACA
+GGCCGACAACCCTCTACTGATGCCAAGCACTGAGCCTTTGATGCATGGCGTGCAACTGCT
+GCCCACAGCTCCTCAGACATTGCCTGATGGCCAGCCTGCTCACCTTTCCAGGGTGCCGAT
+GTTCCCAGTGCCAATGTCTCGTGGGCCCCTGGAGCTGAGTCCTGCCTATGGACCCCCAGG
+ATCTGCACTTGGCTTCCCAGAATCCTCCAGATCTGATCCTGCAGTGCTGCATCCTGGGCA
+GGCCCTGCCACCCACTACACTAAGTCTCCAGGAAAGTGGGCTTCCACCCCAGGAGGCCAA
+AAGTCCAGACCCAGAAATGGTGCCACGGGGCTCACCTGTCAGACACTCCCCTCCGGAGCT
+CAGTCAAGAGGAGTTTGGCGAGAGCTTCGCTGACCCGGGCTCTTCCAGAACAGCACAGGA
+CTTGGAAACCTCCCCAGTGTGGGATCTTGGCAGCTCCAGTTTGACACGTGCACCATCTTT
+GACATCTGATTCTGAAGGGAAGAAACCTGCACAGGCTGTCAAAAAGGAGCCCAAGGAGCC
+CAAGAAGACTGAGTCCTGGTTCTCTCGTTGGCTGCCTGGAAAAAAAAGGACAGAAGCTTA
+TCTACCAGATGACAAGAACAAATCAATTGTTTGGGATGAAAAGAAAAACCAGTGGGTGAA
+TTTGAATGAACCAGAGGAGGAGAAGAAGGCTCCACCCCCACCTCCAACATCGTTCCCCAG
+GGTTCCCCAGGTGGCTCCCACTGGGCCTGCAGGACCACCCACGGCCTCCGTGAATGTGTT
+TTCTAGAAAAGCAGGTGGGTCCAGAGCTCGCTATGTGGATGTTCTAAACCCAAGTGGAAC
+ACAGCGGAGTGAACCAGCTCTTGCTCCTGCAGATTTCTTTGCTCCTCTCGCCCCACTGCC
+AATTCCTTCTAACTTATTTGTACCAAACCCAGATGCAGAAGAGCCACAACCTGCAGATGG
+GACTGGCTGTAGGGGACAGGCACCAGCTGGGACTCAGTCTAAGGCAGAGTCCACCCTGGA
+ACCCAAGGTGGGAAGTTCTACAGTATCAGCCCCTGGACCTGAGCTCTTACCCTCCAAACC
+AGATGGCTCCCAAGGAGGAGAGCTCTCGCGTTGTAGCTCTCTGAGCTCGCTCTCACAGGA
+AGTGAGCCGGCATTTCCATCAGGCTCCTGGAGACCATTGTCCTACAGGGGCCCCTCATGG
+TGGGTCTGTGCCCTTTTACAACCCTGCTCAGTTGGTGCAGGCTTCTGTCACCTCGGGAAA
+TTCAAGGCCAGGGAGGATTGGCCAAAGAAAATATGCGGCATTGAACTAGGATTGCTGCTG
+GATTCTTATTTGGAACCCTGAGATGATTAGATAACTGTTCTTCACCAAGAACCAACTAGC
+TGCCTCAGGTCTCGTGGATCCCAGATGGACATGGCAGTAACTCAGAGCCGGTCATACTGT
+GTGTCTCCTTCCTTGCAGCCTATGTATATGAATGATTGAAAAATTGATTTCAAGGTTCCT
+TTCAAATGCTGGATAGAATGAATCTAATTCAAAGTCTTTTATGTAAAAGAACAATGTTTC
+TTTTTTAGTCACTTTAGACAAATTAAGGTTTGAGCCACTTGAGAATATCCCCGCAGAGAG
+GCTAGGCAGGGATTCACTACAGGAGAGCACAGTTACTTGGACACCAAGGCCTTTCTCACC
+TGAGAAATGGTGCAAACCAACCAGGGATCCTTAGGCTACTGAGAAGGCTGTCTGCTTACC
+TGGAGAGGACTGACTGCTGGGATGTCTGGCCTAAGAGGAGCCTCAAACTGCACTGGGCAA
+CTGTGCCTTGTCCTGTGAACTGGGGAGTACATGCCAGCTCCTCAAAGGGTCACCAGATGG
+CAGCGGCTCCCAGGCTGGGGAGGAAGTGGTTACAAGGGCATGTCTCTCCAACATTTCCAG
+CCTCACTCCATTTTCTGTGGCCTCATTAGTGCTGGGTGCGTTTTTTTTTTGCTCCGAGCT
+TTCCGTCATGGCTCAGTCACTGGGGAGAGCCCCAGGGAGCTGATATTCTGAAGCTGCTGA
+TCTGATTAACCAGGTCAAAAACTGGCTGTGTGCTGCAACGTACTGCCCTCCTAGCCAGGA
+GTCTGTATGGAGCCCTCTAGCTGACTCAATGTCACCTGCAGACAGCACTTAAAGCCTTGG
+TGGTATCTTGGAGTGGCTTACGGTGTCCTAGCGCACACTCTGGAACCTTGCATCTCTACC
+CCAAAGCCCACCAGGGACCTTCAGCAGCGACTCACTGGCTCACCCATATCACTTCAAGGA
+GCTGCCACCACATAAGAGTCAAAGCTTTAAGGCTTCACTGACTGTTCCTAAAACTATCCT
+TACACTCTAAAGAGGAAGGGAAAGAGAGTTAAATATTTAAAAATCAGCAGGTAGAAAACA
+TAAATGGTTTGTTTGGTATTAAATTTAGAAATTGTAGAACATGGAATTAGTACAGCCCTT
+CCCGGTTTTCTGGTTCCTTGCATCATCTAGGAAAGACTCACAGAATGGCTTCCAGGACGT
+TCCATAGATGAGTGTACTTGGACCCTCCTGTTCCTGTCATTAAGAAAGGCCTGTCCCTGT
+GGGTCAGTAGCAACTTGTGTCCTTGCTGGGACCAGGCAGGACCCTTGCCTCTGGTTCAAC
+CCTGCCCAGGCTCTGTGTTGACTGCCAACCACTTTGGATTCAAGAAGCTTCCTCCCTGGG
+AGCTGCTATTTTTCCAAAATTCACATTGTTAAATAAAATATTTTGGGCTCTCAAGTG
+>TR4|c4_g1_i4 len=7787 path=[10147:0-59 @10231@!:60-683 10218:684-1531 10145:1532-1555 10237:1556-1600 @10224@!:1601-2448 10102:2449-2451 10103:2452-2466 10223:2467-2764 10131:2765-2788 10215:2789-3410 10245:3411-3729 @10235@!:3730-4489 10241:4490-5675 10251:5676-5676 10135:5677-5691 10240:5692-5692 @10234@!:5693-6191 10253:6192-6194 10089:6195-6212 10249:6213-6290 10248:6291-6653 10226:6654-6998 10255:6999-6999 10075:7000-7012 10076:7013-7013 10077:7014-7786] [-1, 10147, 10231, 10218, 1 [...]
+GGACCCCCCCCAGCGGGGAATCCTCGGAGCATGTTCGGGGCCAACAGCCCTTACAGGAAG
+CCAGCCAATAATGCACCAGTGGCTCCCATAACACGCCCATTGCAGCCAGTAACGGATCCG
+TTTGCTTTTAATAGACAGACTCTTCAAAACACACCAGTAGGAAGTTCATCCAAAAGCAGC
+CTGCCCAATTTGCCTGGCCCAGCCCTCTCTGTTTTTTCTCAGTGGCCTGGTTTGCCTGTG
+ACTCCCACAAATGCTGGGGATAGCTCCACAGGATTGCATGAGCCTCTGTCAGGAACTCTG
+TCACAGCCTAGAGCAGATGCCAGTCTATTTCCTCCTGCATCTACCCCTTCTTCACTCCCT
+GGGCTGGAGGTGAGCAGGAATGCTGAGGCTGATCCCAGCTCAGGACATGAAGTCCAGATG
+CTGCCACATTCAGCTCACTACATTCCAGGAGTGGGTCCTGAGCAGCCTCTCGGGGGCCAA
+ATGAATGACAGTGGGTCCGGGCCTGACCAACCCATGAATAGGCATGCCCCCCATGATGGT
+GCCGTGACCCACGCAGCATCTCCTTTCCTCCCTCAGCCACAGATGCCAGGTCAGTGGGGG
+CCTGCACAAGGAGGCCCTCAGCCCTCCTATCAGCATCACTCACCCTACCTGGAGGGACCT
+GTTCAGAACATGGGGCTCCAGGCTGCCAGCTTGCCCCATTTTCCCCCTCCATCTAGTCTA
+CACCAGGGACCTGGCCATGAGTCTCATGCCCCACAAACATTTACTCCAGCATCCTTGGCC
+AGTGGTGAAGGGAATGAGATAGTTCACCAGCAAAGTAAAAATCACCCATTGAGTAGCTTC
+CCCCCTAAACACACTTTTGAGCAGAATTCCAGAATTGGGAATATGTGGGCAAGCCCAGAG
+TTGAAGCAGAATCCGGGAGTGAATAAAGAGCATCTGCTAGACCCTGCCCATGTCAATCCC
+TTCACTCAGGGAAATAGTCCTGAAAACCAGGCGCATCATCCCCCAGTGGCAGCAACTAAC
+CATGCCCTGCAAGAAGCAGCCTCTGGAGCTCTCTCAATGTTTTTTCAAGGGGAAGAGACA
+GAGAATGAGGAAAATCTCTCATCTGAAAAAGCAGGCCTCGATAAGAGATTGAACTTGGAT
+AGCTTTTCTTCTACCTCCAGACTGGGCCATCCACCACCACCTGGAGCTAGTGGTGTCTAC
+CAGGCCTTTCCTAGAGGCCCTAGCAGTGAGGCTGCGCAGGAAGGAGATGCGCAACCTTAT
+TTTTCGCAGTCTGTGGGCGTCCGTCTTGACAAACAGAGCACTGTGCCCCCTGCTAATGAT
+GCATGGGGTGATGTTCCGGGGACCGGGACCCGCTGTGCCAGTGGGCCACAGTGTGAGAAT
+GTTGAGAACTTAGAATTTGTTCAGAATCAAGAAGTTTTGCCCCGTGAGACCCTGAGTGTG
+GATCCCTTCCCCCTGAGTGATCAGATCCGATATGGGCCCCTTCCTGGGCCAGCTGCCTCC
+AGGCCTGCTACTGTGGGCCTCACCAGAGGTGGGGGGCTAAATCTTGAGGCCCCAGACACA
+CCACTGCACCCTACACGACCTGACAGTGTGTCATCCAGCTACAGCAGCCATAGCCACAGA
+AGTCCTCCTGGGTCAGCCAGACCCCAAGAATTGGTGGGCACATTCATTCAGCAAGAAGTT
+GGGAAACTTGAAGATGATACTTCAGGGAGTTTTTTTAAGCAAATTGATTCTTCTCCTGTT
+GGAGGTGAAACAGATGAGGTGACTGGGAGCCAAAATTGCTGCAGCAGTCTGTCCCAGCCT
+TCAACCCCAAGCCCTCCAAAACCTACAGGAGTATTCCAAACAAGTGCAAACAGTTCTTTT
+GAGCCAGTAAAATCCCACTTGGTTGGAGTGAAACCAGTTGAAGCAGATCGTGCCAACATG
+GTGGTTGAAGTGAGAGGGACCCAATACTGTCCGAAGAAGCGCAGGGCAGCTGTTGCACCA
+CCTGATGCTACCTCAGGAAACCTGGAACAGCCACCAGACAACATGGAGACCCCGTGTGCA
+CCTCAGGCCTGCCCTTTGCCTCTTAGCACCACTGGAGAGGCTGGGCAACTGGTTTCAAAC
+ACGGCAGGGACACCCCTGGATACTGTGCGCCCAGTGCCTGATAAGAGGCCCTCAGCCAGG
+GCCCAGGGACCTGTGAAGTGTGAGAGCCCAGCAACAACTCTGTGGGCACAAAATGAGCTG
+CCAGATTTTGGTGGCAATGTCCTTCTAGCCCCTGCTGCCCCTGCACTTTATGTTCCTGTA
+AAACCAAAACCTTCAGAGGTTGTTCATCATCCAGAAAAGGGAATGTCTGGACAGAAGGCC
+TGGAAACAAGGGTCTGTGCCACCTTTGCAGAACCAAGACCCTCCTGGTGCTTCTGAGAAC
+CTTGAGAACCCTCCCAAGGTAGGAGAAGAGGAGGCCCTTCCAGTGCAGGTAACAAAAGAT
+GCTCAGGACCAGCATAGACTAGAAAGAGCCCAGCCAGAGCTGGTGCCTCCTCGGCCACAG
+AATTCTCCCCAAGTGCCCCAAGCATCGTGTCCAGAGCCTTCAAATCCTGAAAGCCCACCC
+ACACAAGGACAGTCTGAAAGCTTGGCCCAGCCACCAGCAAGTCCAGCTTCAGTCAACACA
+GGCCAGCTGCTGCCTCAGCCACCACAGGCTTCCAGTGCATCCGTTACATCTACCAACTCC
+AGCCAGGCAGCTGTGCGGTCAGAGCAGCTGTGGCTACACCCACCACCTCCTAATACTTTT
+GGCCCAGCACCTCAAGACTTGGCATCCTACTACTATTACAGACCCCTGTATGATGCCTAC
+CAGTCTCAGTACCCTTCACCGTACCCGTCAGATCCTGGGACAGCCTCGCTGTACTACCAG
+GATATGTATGGCCTGTATGAGCCTCGTTACAGACCCTATGACAGCTCAGCATCTGCTTAT
+GCCGAGAACCACCGCTATTCTGAGCCTGAGCGGCCCAGCTCCCGTGCAAGTCACTATTCC
+GACCAGCTTGCTCCCAGGCAAGGATATCCTGAAGGATACTATAATTCCAAGAGTGGATGG
+AGCAGTCACAGTGATTACTATGCAAATTATTACTCTGGCCAGTATGATTATGGAGACCCC
+AGCCGCTGGGATCGTTACTATGGGTCTCGCCTTAGGGATCCTCGCACCTGGGACCGGAGG
+TACTGGTATGACTCTGAACATGACCCATACAGGAAGGACCACTATGCTTACAGTGACAGG
+CCTGAGAAATGTGATGATCACTGGAGGTATGACCCTCGCTTCACTGGGAGCTTCGACGAT
+GACGCTGAGATCCACAGGGACCCCTATGGAGAAGAAGCAGACAGACGCAGCATCCACAGT
+GAGCACTCGGCACGGAGCCTGCGCAGCACTCACAGTCTGCCCAGCCGCCGCAGCAGCCTC
+AGCTCCCATTCACACCAGAGTCAGATTTACAGAAGCCACCATGTGACTGGCGGTTCCTTT
+GAGGCCCCTCATGCCCCAGGCTCATTTCATGGTGATTATGCCTATGGCACATATGCCAGC
+AATTTCAGCGGTGCCCATGGTTTTCCAGAGTACAGCTACCCTGCAGACACCTCCTGGCCT
+GCTGTGGAGCAAGTTCCATCAAGACCGACCTCTCCTGAGAAGTTTACGGTGCCTCATGTC
+TGTGCCAGGTTTGGTCCTGGTGGTCAGCTCCTTAAAGTGATTCCCAACCTGCCTTCAGAA
+GGACAGCCTGCACTGGTGGAGATCCACAGCTTAGAGACCTTGCTGCAGCACACACCTGAG
+CAGGAAGAGATGCGCTCCTTCCCAGGACCTCTCGGCAAAGATGATACCCACAAAGTAGAT
+GTTATTAACTTTGCACAGAACAAAGCAACAAAATGTTTGCAGAATGAAAGTTTAATTGAT
+AAAGAGTCTGCAAGTCTTCTTTGGAAATTCATTATTCTGTTATGCAGACAGAATGGGACT
+GTTGTGGGAACAGACATTGCAGAGCTTTTGTTACGGGACCATAGAACTGTATGGCTTCCT
+GGGAAGTCACCCAATGAGGCAAACCTGATAGATTTTACCAATGAGGCTGTGGAACAAGTG
+GAAGAGGAGGAGTCAGGGGAGGCCCAGCTCTCATTTCTCACAGACAGTCAGACAGTGACC
+ACCAGCGTGCTGGAGAAGGAGACTGAGCGGTTCCGTGAGCTCTTGCTGTATGGCCGGAAG
+AAGGATGCTCTGGAGTCTGCCATGAAAAATGGCTTATGGGGTCATGCTCTTCTGCTTGCA
+AGTAAGATGGACAGCCGGACACATGCCCGTGTCATGACCAGGTTTGCCAACAGTCTTCCA
+ATCAATGACCCCCTGCAGACTGTCTACCAGCTCATGTCTGGACGGATGCCTGCTGCATCC
+ACGTGTTGTGGCGATGAGAAGTGGGGAGATTGGAGGCCACATCTTGCAATGGTTTTGTCC
+AACCTGAACAACAACATGGATGTTGAATCTAGGACCATGGCTACGATGGGTGATACTCTA
+GCATCAAAAGGCCTGTTGGATGCTGCACACTTCTGCTACCTGATGGCCCAGGTTGGATTT
+GGGGTTTATACAAAGAAAACTACAAAACTTGTCTTGATAGGCTCAAATCACAGTTTGCCC
+TTTTTAAAGTTTGCCACCAATGAAGCCATTCAAAGGACGGAGGCTTATGAGTATGCTCAG
+TCCCTTGGGGCACATACCTGTTCCTTACCTAACTTCCAGGTGTTTAAATTCATCTACTTG
+TGCCGCCTGGCTGAAATGGGACTTGCCACACAGGCCTTCCACTACTGCGAAGTAATAGCC
+AAGAGTGTCCTGACACAGCCTGGTGCATACTCTCCAGTACTGATTAGCCAGTTGACTCAG
+ATGGCTTCCCAGTTACGCCTCTTCGATCCTCAACTGAAGGAGAAGCCAGAAGAGGAGTCC
+TTTGTGGAGCCTGCCTGGTTGGTGCAGCTGCAGCACGTGGAGAGGCAGATCCAGGAGGGC
+ACTGTGCTGTGGAGCCAGGATGGAACTGAACCCCAGCAGTGTCGCATTACATCGGGCTCT
+GAGGTGGAGCAGTCAGATGGCCCTGGACTCAACCAGCAGGCAGGGCCACAGGCCGACAAC
+CCTCTACTGATGCCAAGCACTGAGCCTTTGATGCATGGCGTGCAACTGCTGCCCACAGCT
+CCTCAGACATTGCCTGATGGCCAGCCTGCTCACCTTTCCAGGGTGCCGATGTTCCCAGTG
+CCAATGTCTCGTGGGCCCCTGGAGCTGAGTCCTGCCTATGGACCCCCAGGATCTGCACTT
+GGCTTCCCAGAATCCTCCAGATCTGATCCTGCAGTGCTGCATCCTGGGCAGGCCCTGCCA
+CCCACTACACTAAGTCTCCAGGAAAGTGGGCTTCCACCCCAGGAGGCCAAAAGTCCAGAC
+CCAGAAATGGTGCCACGGGGCTCACCTGTCAGACACTCCCCTCCGGAGCTCAGTCAAGAG
+GAGTTTGGCGAGAGCTTCGCTGACCCGGGCTCTTCCAGAACAGCACAGGACTTGGAAACC
+TCCCCAGTGTGGGATCTTGGCAGCTCCAGTTTGACACGTGCACCATCTTTGACATCTGAT
+TCTGAAGGGAAGAAACCTGCACAGGCTGTCAAAAAGGAGCCCAAGGAGCCCAAGAAGACT
+GAGTCCTGGTTCTCTCGTTGGCTGCCTGGAAAAAAAAGGACAGAAGCTTATCTACCAGAT
+GACAAGAACAAATCAATTGTTTGGGATGAAAAGAAAAACCAGTGGGTGAATTTGAATGAA
+CCAGAGGAGGAGAAGAAGGCTCCACCCCCACCTCCAACATCGTTCCCCAGGGTTCCCCAG
+GTGGCTCCCACTGGGCCTGCAGGACCACCCACGGCCTCCGTGAATGTGTTTTCTAGAAAA
+GCAGGTGGGTCCAGAGCTCGCTATGTGGATGTTCTAAACCCAAGTGGAACACAGCGGAGT
+GAACCAGCTCTTGCTCCTGCAGATTTCTTTGCTCCTCTCGCCCCACTGCCAATTCCTTCT
+AACTTATTTGTACCAAACCCAGATGCAGAAGAGCCACAACCTGCAGATGGGACTGGCTGT
+AGGGGACAGGCACCAGCTGGGACTCAGTCTAAGGCAGAGTCCACCCTGGAACCCAAGGTG
+GGAAGTTCTACAGTATCAGCCCCTGGACCTGAGCTCTTACCCTCCAAACCAGATGGCTCC
+CAAGGAGGAGAGGCTCCTGGAGACCATTGTCCTACAGGGGCCCCTCATGGTGGGTCTGTG
+CCCTTTTACAACCCTGCTCAGTTGGTGCAGGCTTCTGTCACCTCGGGAAATTCAAGGCCA
+GGGAGGATTGGCCAAAGAAAATATGCGGCATTGAACTAGGATTGCTGCTGGATTCTTATT
+TGGAACCCTGAGATGATTAGATAACTGTTCTTCACCAAGAACCAACTAGCTGCCTCAGGT
+CTCGTGGATCCCAGATGGACATGGCAGTAACTCAGAGCCGGTCATACTGTGTGTCTCCTT
+CCTTGCAGCCTATGTATATGAATGATTGAAAAATTGATTTCAAGGTTCCTTTCAAATGCT
+GGATAGAATGAATCTAATTCAAAGTCTTTTATGTAAAAGAACAATGTTTCTTTTTTAGTC
+ACTTTAGACAAATTAAGGTTTGAGCCACTTGAGAATATCCCCGCAGAGAGGCTAGGCAGG
+GATTCACTACAGGAGAGCACAGTTACTTGGACACCAAGGCCTTTCTCACCTGAGAAATGG
+TGCAAACCAACCAGGGATCCTTAGGCTACTGAGAAGGCTGTCTGCTTACCTGGAGAGGAC
+TGACTGCTGGGATGTCTGGCCTAAGAGGAGCCTCAAACTGCACTGGGCAACTGTGCCTTG
+TCCTGTGAACTGGGGAGTACATGCCAGCTCCTCAAAGGGTCACCAGATGGCAGCGGCTCC
+CAGGCTGGGGAGGAAGTGGTTACAAGGGCATGTCTCTCCAACATTTCCAGCCTCACTCCA
+TTTTCTGTGGCCTCATTAGTGCTGGGTGCGTTTTTTTTTTGCTCCGAGCTTTCCGTCATG
+GCTCAGTCACTGGGGAGAGCCCCAGGGAGCTGATATTCTGAAGCTGCTGATCTGATTAAC
+CAGGTCAAAAACTGGCTGTGTGCTGCAACGTACTGCCCTCCTAGCCAGGAGTCTGTATGG
+AGCCCTCTAGCTGACTCAATGTCACCTGCAGACAGCACTTAAAGCCTTGGTGGTATCTTG
+GAGTGGCTTACGGTGTCCTAGCGCACACTCTGGAACCTTGCATCTCTACCCCAAAGCCCA
+CCAGGGACCTTCAGCAGCGACTCACTGGCTCACCCATATCACTTCAAGGAGCTGCCACCA
+CATAAGAGTCAAAGCTTTAAGGCTTCACTGACTGTTCCTAAAACTATCCTTACACTCTAA
+AGAGGAAGGGAAAGAGAGTTAAATATTTAAAAATCAGCAGGTAGAAAACATAAATGGTTT
+GTTTGGTATTAAATTTAGAAATTGTAGAACATGGAATTAGTACAGCCCTTCCCGGTTTTC
+TGGTTCCTTGCATCATCTAGGAAAGACTCACAGAATGGCTTCCAGGACGTTCCATAGATG
+AGTGTACTTGGACCCTCCTGTTCCTGTCATTAAGAAAGGCCTGTCCCTGTGGGTCAGTAG
+CAACTTGTGTCCTTGCTGGGACCAGGCAGGACCCTTGCCTCTGGTTCAACCCTGCCCAGG
+CTCTGTGTTGACTGCCAACCACTTTGGATTCAAGAAGCTTCCTCCCTGGGAGCTGCTATT
+TTTCCAAAATTCACATTGTTAAATAAAATATTTTGGGCTCTCAAGTG
+>TR4|c4_g1_i5 len=7847 path=[10147:0-59 @10231@!:60-683 10218:684-1531 10145:1532-1555 10237:1556-1600 @10224@!:1601-2448 10102:2449-2451 10103:2452-2466 10223:2467-2764 10131:2765-2788 10215:2789-3410 10245:3411-3729 @10235@!:3730-4489 10241:4490-5675 10251:5676-5676 10135:5677-5691 10240:5692-5692 @10234@!:5693-6191 10252:6192-6197 10256:6198-6205 10258:6206-6206 10220:6207-6212 10212:6213-6272 10249:6273-6350 10248:6351-6713 10226:6714-7058 10255:7059-7059 10075:7060-7072 10076:7073-7 [...]
+GGACCCCCCCCAGCGGGGAATCCTCGGAGCATGTTCGGGGCCAACAGCCCTTACAGGAAG
+CCAGCCAATAATGCACCAGTGGCTCCCATAACACGCCCATTGCAGCCAGTAACGGATCCG
+TTTGCTTTTAATAGACAGACTCTTCAAAACACACCAGTAGGAAGTTCATCCAAAAGCAGC
+CTGCCCAATTTGCCTGGCCCAGCCCTCTCTGTTTTTTCTCAGTGGCCTGGTTTGCCTGTG
+ACTCCCACAAATGCTGGGGATAGCTCCACAGGATTGCATGAGCCTCTGTCAGGAACTCTG
+TCACAGCCTAGAGCAGATGCCAGTCTATTTCCTCCTGCATCTACCCCTTCTTCACTCCCT
+GGGCTGGAGGTGAGCAGGAATGCTGAGGCTGATCCCAGCTCAGGACATGAAGTCCAGATG
+CTGCCACATTCAGCTCACTACATTCCAGGAGTGGGTCCTGAGCAGCCTCTCGGGGGCCAA
+ATGAATGACAGTGGGTCCGGGCCTGACCAACCCATGAATAGGCATGCCCCCCATGATGGT
+GCCGTGACCCACGCAGCATCTCCTTTCCTCCCTCAGCCACAGATGCCAGGTCAGTGGGGG
+CCTGCACAAGGAGGCCCTCAGCCCTCCTATCAGCATCACTCACCCTACCTGGAGGGACCT
+GTTCAGAACATGGGGCTCCAGGCTGCCAGCTTGCCCCATTTTCCCCCTCCATCTAGTCTA
+CACCAGGGACCTGGCCATGAGTCTCATGCCCCACAAACATTTACTCCAGCATCCTTGGCC
+AGTGGTGAAGGGAATGAGATAGTTCACCAGCAAAGTAAAAATCACCCATTGAGTAGCTTC
+CCCCCTAAACACACTTTTGAGCAGAATTCCAGAATTGGGAATATGTGGGCAAGCCCAGAG
+TTGAAGCAGAATCCGGGAGTGAATAAAGAGCATCTGCTAGACCCTGCCCATGTCAATCCC
+TTCACTCAGGGAAATAGTCCTGAAAACCAGGCGCATCATCCCCCAGTGGCAGCAACTAAC
+CATGCCCTGCAAGAAGCAGCCTCTGGAGCTCTCTCAATGTTTTTTCAAGGGGAAGAGACA
+GAGAATGAGGAAAATCTCTCATCTGAAAAAGCAGGCCTCGATAAGAGATTGAACTTGGAT
+AGCTTTTCTTCTACCTCCAGACTGGGCCATCCACCACCACCTGGAGCTAGTGGTGTCTAC
+CAGGCCTTTCCTAGAGGCCCTAGCAGTGAGGCTGCGCAGGAAGGAGATGCGCAACCTTAT
+TTTTCGCAGTCTGTGGGCGTCCGTCTTGACAAACAGAGCACTGTGCCCCCTGCTAATGAT
+GCATGGGGTGATGTTCCGGGGACCGGGACCCGCTGTGCCAGTGGGCCACAGTGTGAGAAT
+GTTGAGAACTTAGAATTTGTTCAGAATCAAGAAGTTTTGCCCCGTGAGACCCTGAGTGTG
+GATCCCTTCCCCCTGAGTGATCAGATCCGATATGGGCCCCTTCCTGGGCCAGCTGCCTCC
+AGGCCTGCTACTGTGGGCCTCACCAGAGGTGGGGGGCTAAATCTTGAGGCCCCAGACACA
+CCACTGCACCCTACACGACCTGACAGTGTGTCATCCAGCTACAGCAGCCATAGCCACAGA
+AGTCCTCCTGGGTCAGCCAGACCCCAAGAATTGGTGGGCACATTCATTCAGCAAGAAGTT
+GGGAAACTTGAAGATGATACTTCAGGGAGTTTTTTTAAGCAAATTGATTCTTCTCCTGTT
+GGAGGTGAAACAGATGAGGTGACTGGGAGCCAAAATTGCTGCAGCAGTCTGTCCCAGCCT
+TCAACCCCAAGCCCTCCAAAACCTACAGGAGTATTCCAAACAAGTGCAAACAGTTCTTTT
+GAGCCAGTAAAATCCCACTTGGTTGGAGTGAAACCAGTTGAAGCAGATCGTGCCAACATG
+GTGGTTGAAGTGAGAGGGACCCAATACTGTCCGAAGAAGCGCAGGGCAGCTGTTGCACCA
+CCTGATGCTACCTCAGGAAACCTGGAACAGCCACCAGACAACATGGAGACCCCGTGTGCA
+CCTCAGGCCTGCCCTTTGCCTCTTAGCACCACTGGAGAGGCTGGGCAACTGGTTTCAAAC
+ACGGCAGGGACACCCCTGGATACTGTGCGCCCAGTGCCTGATAAGAGGCCCTCAGCCAGG
+GCCCAGGGACCTGTGAAGTGTGAGAGCCCAGCAACAACTCTGTGGGCACAAAATGAGCTG
+CCAGATTTTGGTGGCAATGTCCTTCTAGCCCCTGCTGCCCCTGCACTTTATGTTCCTGTA
+AAACCAAAACCTTCAGAGGTTGTTCATCATCCAGAAAAGGGAATGTCTGGACAGAAGGCC
+TGGAAACAAGGGTCTGTGCCACCTTTGCAGAACCAAGACCCTCCTGGTGCTTCTGAGAAC
+CTTGAGAACCCTCCCAAGGTAGGAGAAGAGGAGGCCCTTCCAGTGCAGGTAACAAAAGAT
+GCTCAGGACCAGCATAGACTAGAAAGAGCCCAGCCAGAGCTGGTGCCTCCTCGGCCACAG
+AATTCTCCCCAAGTGCCCCAAGCATCGTGTCCAGAGCCTTCAAATCCTGAAAGCCCACCC
+ACACAAGGACAGTCTGAAAGCTTGGCCCAGCCACCAGCAAGTCCAGCTTCAGTCAACACA
+GGCCAGCTGCTGCCTCAGCCACCACAGGCTTCCAGTGCATCCGTTACATCTACCAACTCC
+AGCCAGGCAGCTGTGCGGTCAGAGCAGCTGTGGCTACACCCACCACCTCCTAATACTTTT
+GGCCCAGCACCTCAAGACTTGGCATCCTACTACTATTACAGACCCCTGTATGATGCCTAC
+CAGTCTCAGTACCCTTCACCGTACCCGTCAGATCCTGGGACAGCCTCGCTGTACTACCAG
+GATATGTATGGCCTGTATGAGCCTCGTTACAGACCCTATGACAGCTCAGCATCTGCTTAT
+GCCGAGAACCACCGCTATTCTGAGCCTGAGCGGCCCAGCTCCCGTGCAAGTCACTATTCC
+GACCAGCTTGCTCCCAGGCAAGGATATCCTGAAGGATACTATAATTCCAAGAGTGGATGG
+AGCAGTCACAGTGATTACTATGCAAATTATTACTCTGGCCAGTATGATTATGGAGACCCC
+AGCCGCTGGGATCGTTACTATGGGTCTCGCCTTAGGGATCCTCGCACCTGGGACCGGAGG
+TACTGGTATGACTCTGAACATGACCCATACAGGAAGGACCACTATGCTTACAGTGACAGG
+CCTGAGAAATGTGATGATCACTGGAGGTATGACCCTCGCTTCACTGGGAGCTTCGACGAT
+GACGCTGAGATCCACAGGGACCCCTATGGAGAAGAAGCAGACAGACGCAGCATCCACAGT
+GAGCACTCGGCACGGAGCCTGCGCAGCACTCACAGTCTGCCCAGCCGCCGCAGCAGCCTC
+AGCTCCCATTCACACCAGAGTCAGATTTACAGAAGCCACCATGTGACTGGCGGTTCCTTT
+GAGGCCCCTCATGCCCCAGGCTCATTTCATGGTGATTATGCCTATGGCACATATGCCAGC
+AATTTCAGCGGTGCCCATGGTTTTCCAGAGTACAGCTACCCTGCAGACACCTCCTGGCCT
+GCTGTGGAGCAAGTTCCATCAAGACCGACCTCTCCTGAGAAGTTTACGGTGCCTCATGTC
+TGTGCCAGGTTTGGTCCTGGTGGTCAGCTCCTTAAAGTGATTCCCAACCTGCCTTCAGAA
+GGACAGCCTGCACTGGTGGAGATCCACAGCTTAGAGACCTTGCTGCAGCACACACCTGAG
+CAGGAAGAGATGCGCTCCTTCCCAGGACCTCTCGGCAAAGATGATACCCACAAAGTAGAT
+GTTATTAACTTTGCACAGAACAAAGCAACAAAATGTTTGCAGAATGAAAGTTTAATTGAT
+AAAGAGTCTGCAAGTCTTCTTTGGAAATTCATTATTCTGTTATGCAGACAGAATGGGACT
+GTTGTGGGAACAGACATTGCAGAGCTTTTGTTACGGGACCATAGAACTGTATGGCTTCCT
+GGGAAGTCACCCAATGAGGCAAACCTGATAGATTTTACCAATGAGGCTGTGGAACAAGTG
+GAAGAGGAGGAGTCAGGGGAGGCCCAGCTCTCATTTCTCACAGACAGTCAGACAGTGACC
+ACCAGCGTGCTGGAGAAGGAGACTGAGCGGTTCCGTGAGCTCTTGCTGTATGGCCGGAAG
+AAGGATGCTCTGGAGTCTGCCATGAAAAATGGCTTATGGGGTCATGCTCTTCTGCTTGCA
+AGTAAGATGGACAGCCGGACACATGCCCGTGTCATGACCAGGTTTGCCAACAGTCTTCCA
+ATCAATGACCCCCTGCAGACTGTCTACCAGCTCATGTCTGGACGGATGCCTGCTGCATCC
+ACGTGTTGTGGCGATGAGAAGTGGGGAGATTGGAGGCCACATCTTGCAATGGTTTTGTCC
+AACCTGAACAACAACATGGATGTTGAATCTAGGACCATGGCTACGATGGGTGATACTCTA
+GCATCAAAAGGCCTGTTGGATGCTGCACACTTCTGCTACCTGATGGCCCAGGTTGGATTT
+GGGGTTTATACAAAGAAAACTACAAAACTTGTCTTGATAGGCTCAAATCACAGTTTGCCC
+TTTTTAAAGTTTGCCACCAATGAAGCCATTCAAAGGACGGAGGCTTATGAGTATGCTCAG
+TCCCTTGGGGCACATACCTGTTCCTTACCTAACTTCCAGGTGTTTAAATTCATCTACTTG
+TGCCGCCTGGCTGAAATGGGACTTGCCACACAGGCCTTCCACTACTGCGAAGTAATAGCC
+AAGAGTGTCCTGACACAGCCTGGTGCATACTCTCCAGTACTGATTAGCCAGTTGACTCAG
+ATGGCTTCCCAGTTACGCCTCTTCGATCCTCAACTGAAGGAGAAGCCAGAAGAGGAGTCC
+TTTGTGGAGCCTGCCTGGTTGGTGCAGCTGCAGCACGTGGAGAGGCAGATCCAGGAGGGC
+ACTGTGCTGTGGAGCCAGGATGGAACTGAACCCCAGCAGTGTCGCATTACATCGGGCTCT
+GAGGTGGAGCAGTCAGATGGCCCTGGACTCAACCAGCAGGCAGGGCCACAGGCCGACAAC
+CCTCTACTGATGCCAAGCACTGAGCCTTTGATGCATGGCGTGCAACTGCTGCCCACAGCT
+CCTCAGACATTGCCTGATGGCCAGCCTGCTCACCTTTCCAGGGTGCCGATGTTCCCAGTG
+CCAATGTCTCGTGGGCCCCTGGAGCTGAGTCCTGCCTATGGACCCCCAGGATCTGCACTT
+GGCTTCCCAGAATCCTCCAGATCTGATCCTGCAGTGCTGCATCCTGGGCAGGCCCTGCCA
+CCCACTACACTAAGTCTCCAGGAAAGTGGGCTTCCACCCCAGGAGGCCAAAAGTCCAGAC
+CCAGAAATGGTGCCACGGGGCTCACCTGTCAGACACTCCCCTCCGGAGCTCAGTCAAGAG
+GAGTTTGGCGAGAGCTTCGCTGACCCGGGCTCTTCCAGAACAGCACAGGACTTGGAAACC
+TCCCCAGTGTGGGATCTTGGCAGCTCCAGTTTGACACGTGCACCATCTTTGACATCTGAT
+TCTGAAGGGAAGAAACCTGCACAGGCTGTCAAAAAGGAGCCCAAGGAGCCCAAGAAGACT
+GAGTCCTGGTTCTCTCGTTGGCTGCCTGGAAAAAAAAGGACAGAAGCTTATCTACCAGAT
+GACAAGAACAAATCAATTGTTTGGGATGAAAAGAAAAACCAGTGGGTGAATTTGAATGAA
+CCAGAGGAGGAGAAGAAGGCTCCACCCCCACCTCCAACATCGTTCCCCAGGGTTCCCCAG
+GTGGCTCCCACTGGGCCTGCAGGACCACCCACGGCCTCCGTGAATGTGTTTTCTAGAAAA
+GCAGGTGGGTCCAGAGCTCGCTATGTGGATGTTCTAAACCCAAGTGGAACACAGCGGAGT
+GAACCAGCTCTTGCTCCTGCAGATTTCTTTGCTCCTCTCGCCCCACTGCCAATTCCTTCT
+AACTTATTTGTACCAAACCCAGATGCAGAAGAGCCACAACCTGCAGATGGGACTGGCTGT
+AGGGGACAGGCACCAGCTGGGACTCAGTCTAAGGCAGAGTCCACCCTGGAACCCAAGGTG
+GGAAGTTCTACAGTATCAGCCCCTGGACCTGAGCTCTTACCCTCCAAACCAGATGGCTCC
+CAAGGAGGAGAGCTCTCGCGTTGTAGCTCTCTGAGCTCGCTCTCACAGGAAGTGAGCCGG
+CATTTCCATCAGGCTCCTGGAGACCATTGTCCTACAGGGGCCCCTCATGGTGGGTCTGTG
+CCCTTTTACAACCCTGCTCAGTTGGTGCAGGCTTCTGTCACCTCGGGAAATTCAAGGCCA
+GGGAGGATTGGCCAAAGAAAATATGCGGCATTGAACTAGGATTGCTGCTGGATTCTTATT
+TGGAACCCTGAGATGATTAGATAACTGTTCTTCACCAAGAACCAACTAGCTGCCTCAGGT
+CTCGTGGATCCCAGATGGACATGGCAGTAACTCAGAGCCGGTCATACTGTGTGTCTCCTT
+CCTTGCAGCCTATGTATATGAATGATTGAAAAATTGATTTCAAGGTTCCTTTCAAATGCT
+GGATAGAATGAATCTAATTCAAAGTCTTTTATGTAAAAGAACAATGTTTCTTTTTTAGTC
+ACTTTAGACAAATTAAGGTTTGAGCCACTTGAGAATATCCCCGCAGAGAGGCTAGGCAGG
+GATTCACTACAGGAGAGCACAGTTACTTGGACACCAAGGCCTTTCTCACCTGAGAAATGG
+TGCAAACCAACCAGGGATCCTTAGGCTACTGAGAAGGCTGTCTGCTTACCTGGAGAGGAC
+TGACTGCTGGGATGTCTGGCCTAAGAGGAGCCTCAAACTGCACTGGGCAACTGTGCCTTG
+TCCTGTGAACTGGGGAGTACATGCCAGCTCCTCAAAGGGTCACCAGATGGCAGCGGCTCC
+CAGGCTGGGGAGGAAGTGGTTACAAGGGCATGTCTCTCCAACATTTCCAGCCTCACTCCA
+TTTTCTGTGGCCTCATTAGTGCTGGGTGCGTTTTTTTTTTGCTCCGAGCTTTCCGTCATG
+GCTCAGTCACTGGGGAGAGCCCCAGGGAGCTGATATTCTGAAGCTGCTGATCTGATTAAC
+CAGGTCAAAAACTGGCTGTGTGCTGCAACGTACTGCCCTCCTAGCCAGGAGTCTGTATGG
+AGCCCTCTAGCTGACTCAATGTCACCTGCAGACAGCACTTAAAGCCTTGGTGGTATCTTG
+GAGTGGCTTACGGTGTCCTAGCGCACACTCTGGAACCTTGCATCTCTACCCCAAAGCCCA
+CCAGGGACCTTCAGCAGCGACTCACTGGCTCACCCATATCACTTCAAGGAGCTGCCACCA
+CATAAGAGTCAAAGCTTTAAGGCTTCACTGACTGTTCCTAAAACTATCCTTACACTCTAA
+AGAGGAAGGGAAAGAGAGTTAAATATTTAAAAATCAGCAGGTAGAAAACATAAATGGTTT
+GTTTGGTATTAAATTTAGAAATTGTAGAACATGGAATTAGTACAGCCCTTCCCGGTTTTC
+TGGTTCCTTGCATCATCTAGGAAAGACTCACAGAATGGCTTCCAGGACGTTCCATAGATG
+AGTGTACTTGGACCCTCCTGTTCCTGTCATTAAGAAAGGCCTGTCCCTGTGGGTCAGTAG
+CAACTTGTGTCCTTGCTGGGACCAGGCAGGACCCTTGCCTCTGGTTCAACCCTGCCCAGG
+CTCTGTGTTGACTGCCAACCACTTTGGATTCAAGAAGCTTCCTCCCTGGGAGCTGCTATT
+TTTCCAAAATTCACATTGTTAAATAAAATATTTTGGGCTCTCAAGTG
+>TR4|c4_g1_i6 len=1068 path=[10191:0-221 10212:222-281 10249:282-359 10248:360-722 10226:723-1067] [-1, 10191, 10212, 10249, 10248, 10226]
+TTTTTTCCTTTTCCGGGGGGATGGGGGGTTTTTTTAACAAAAGGGGGGGGGGGGGGCATT
+TGATGCTACCTCTGGCTGTCTTCATTTGAGTGATATTGATTCTAATGGCATCATAAAGCT
+TTTAAAACCAGCTGACAGCTTGGAGCAATGGAGCATGCTGATCTTCATGTCTGTATCTTG
+TGTGTTCTTGCTGTTCCATAGCTCTCGCGTTGTAGCTCTCTGAGCTCGCTCTCACAGGAA
+GTGAGCCGGCATTTCCATCAGGCTCCTGGAGACCATTGTCCTACAGGGGCCCCTCATGGT
+GGGTCTGTGCCCTTTTACAACCCTGCTCAGTTGGTGCAGGCTTCTGTCACCTCGGGAAAT
+TCAAGGCCAGGGAGGATTGGCCAAAGAAAATATGCGGCATTGAACTAGGATTGCTGCTGG
+ATTCTTATTTGGAACCCTGAGATGATTAGATAACTGTTCTTCACCAAGAACCAACTAGCT
+GCCTCAGGTCTCGTGGATCCCAGATGGACATGGCAGTAACTCAGAGCCGGTCATACTGTG
+TGTCTCCTTCCTTGCAGCCTATGTATATGAATGATTGAAAAATTGATTTCAAGGTTCCTT
+TCAAATGCTGGATAGAATGAATCTAATTCAAAGTCTTTTATGTAAAAGAACAATGTTTCT
+TTTTTAGTCACTTTAGACAAATTAAGGTTTGAGCCACTTGAGAATATCCCCGCAGAGAGG
+CTAGGCAGGGATTCACTACAGGAGAGCACAGTTACTTGGACACCAAGGCCTTTCTCACCT
+GAGAAATGGTGCAAACCAACCAGGGATCCTTAGGCTACTGAGAAGGCTGTCTGCTTACCT
+GGAGAGGACTGACTGCTGGGATGTCTGGCCTAAGAGGAGCCTCAAACTGCACTGGGCAAC
+TGTGCCTTGTCCTGTGAACTGGGGAGTACATGCCAGCTCCTCAAAGGGTCACCAGATGGC
+AGCGGCTCCCAGGCTGGGGAGGAAGTGGTTACAAGGGCATGTCTCTCCAACATTTCCAGC
+CTCACTCCATTTTCTGTGGCCTCATTAGTGCTGGGTGCGTTTTTTTTT
+>TR5|c0_g1_i1 len=436 path=[439:0-171 440:172-195 441:196-435] [-1, 439, 440, 441, -2]
+TGTGTATGGCTTGTTCCAGGTGAAAGTGAGGCCAGGACGAGACAAGTAAGCTTTGGGGGC
+TCCTGCCAGTTCTTGGATAGGGTAACTTTTGGGGGATGGATGGCAGGCTTAGGCGAGGCC
+TAATGTTCCACGCAGCCCCTAGGCTATTATGAATCTGCGTCCATCTGAGCCTCAGTCCCA
+GCTGCTTCTTAGGGCATAACTCCCAGGTTACTAATCTTTGTGGTTGCATGAAGAAACGGC
+TTGTTCTGTGACCTGCTGCTCTAGGGTTGAGCAAGCTCCTGGAGGCATCAGCATCACCTT
+CTTTTGGCACAACAGGGTTGTGGTTGGGGCTAGAGCAACCTAGATGGGACGAAGAACCCT
+AACCTCTGGGCAGTGGCCCATTTCCTATGGGGCTCAGCAGGTGTGCAGCTGAGTGAAGTT
+GAGGCCAGCTCTTTTT
+>TR6|c0_g1_i1 len=284 path=[324:0-37 325:38-283] [-1, 324, 325, -2]
+CTGCTGCCCTAGATTCCTTGGGTCAGACCTGTGCTGTCCGTTGTCTCCGCTGCAGCTAGC
+CTCTGAGAGAGAGGAGTTGGCAGAGATTAGGGTATAATGCCATTAAAATGTGTAGTCGGA
+ATGTAGCTCTGGAGCTAGGCGATTACTGTTCCCATGTTTCTGTTTCCCCTTTAAACACTC
+TTAAAACTCGTACAAAAGCACCTCATTGTCCCAATGTTCAGTATAAGCTGGCAGATAACC
+CTTGCTGGGGTATGGGATCTCCGAGGTCCTTAGCCTCTAGGGTG
+>TR6|c0_g2_i1 len=329 path=[322:0-82 323:83-328] [-1, 322, 323, -2]
+TTTTCTTATATCGCCTACATATTTTCCCAAATCAGCATTACCAAGCTGCTGCCCTAGATG
+CCTTGGGTCAGACCTGTGCTGTCCGTTGTCTCCGCTGCAGCTAGCCTCTGAGAGAGAGGA
+GTTGGCAGAGATTAGGGTATAATGCCATTAAAATGTGTAGTCGGAATGTAGCTCTGGAGC
+TAGGCGATTACTGTTCCCATGTTTCTGTTTCCCCTTTAAACACTCTTAAAACTCGTACAA
+AAGCACCTCATTGTCCCAATGTTCAGTATAAGCTGGCAGATAACCCTTGCTGGGGTATGG
+GATCTCCGAGGTCCTTAGCCTCTAGGGTG
+>TR7|c0_g1_i1 len=6692 path=[7480:0-168 @7569@!:169-1348 7543:1349-1369 7568:1370-1420 @7563@!:1421-3733 7542:3734-4263 7525:4264-4287 7566:4288-4474 @7561@!:4475-5543 7549:5544-5891 7572:5892-5892 7574:5893-5893 7523:5894-6691] [-1, 7480, 7569, 7543, 7568, 7563, 7542, 7525, 7566, 7561, 7549, 7572, 7574, 7523, -2]
+CGGCGTGTGACGCAGTCAGGCCTCTGCGCGCTGCGCCCGAAGCGGCGGTCGGTGGCAGCG
+GCGGCGGCGACGACGGTTTTTCTGGAGGCCGCGCGGTGAGCGGCGGGTGACGGGCGGACC
+TGGGCTCTCACTCCAGACGCACCGCTCTTTCTGAAGCAAACACTTGCTTTGAAGATGTTT
+AACAAATCATTTGGAACCCCCTTTGGGGGTAGTACAGGGGGCTTTGGCACAACGTCAACA
+TTTGGGCAAAATACTGGCTTTGGTACGACTAGTGGAGGAGCATTTGGAACATCTGCATTT
+GGTTCTAGCAACAATACTGGAGGCTTATTTGGAAATTCACAGACCAAACCAGGAGGATTA
+TTTGGTACCAGTTCATTTAGCCAGCCAGCAACCTCCACAAGCACTGGGTTTGGGTTTGGC
+ACATCAACAGGAACATCAAATAGCTTATTTGGAACTGCAAGTACCGGGACCAGTCTTTTC
+TCATCCCAGAACAATGCATTTGCACAAAATAAACCAACTGGCTTTGGGAATTTTGGAACC
+AGTACTAGCAGTGGAGGACTCTTTGGAACTACAAATACCACCTCTAATCCTTTTGGTAGC
+ACATCTGGCTCCCTTTTTGGGCCAAGTAGTTTTACAGCAGCACCTACAGGAACTACCATC
+AAATTTAATCCTCCCACTGGTACAGATACTATGGTCAAAGCTGGAGTTAGCACTAACATC
+AGTACAAAGCATCAGTGTATTACTGCTATGAAAGAATATGAAAGCAAGTCATTAGAGGAA
+CTACGTTTGGAGGATTATCAGGCTAACCGGAAAGGCCCACAGAACCAAGTGGGAGGAGGC
+ACCACGGCTGGCTTATTTGGGTCTTCTCCAGCAACTTCCAGTGCAACAGGGCTCTTCAGC
+TCCTCCACCACTAATTCAGCCTTTTCATATGGTCAGAACAAAACTGCCTTTGGAACTAGC
+ACAACTGGATTTGGAACAAATCCAGGTGGTCTCTTTGGCCAACAGAATCAACAGACTACC
+AGTCTCTTCAGCAAACCATTTGGCCAGGCTACAACCACCCCGAATACTGGCTTTTCCTTT
+GGTAATACCAGCACCCTTGGACAGCCAAGCACCAATACTATGGGCCTATTTGGAGTAACC
+CAAGCCTCACAACCAGGAGGTCTTTTTGGGACAGCTACAAACACCAGCACTGGGACAGCA
+TTTGGGACAGGAACAGGTCTCTTTGGGCAGCCCAATACTGGATTTGGTGCAGTTGGTTCG
+ACCCTGTTTGGCAATAACAAGCTTACAACTTTTGGAACCAGCACAACCAGTGCTCCTTCA
+TTTGGTACAACCAGTGGCGGGCTCTTCGGTAACAAACCAACCCTGACTTTAGGAACCAAT
+ACAAACACTTCCAATTTTGGGTTTGGCACAAATAACAGTGGGAGCAGTATTTTTGGAAGT
+AAGCCAGCAGCTGGAACTTTGGGAACTGGACTTGGTACAGGATTTGGAACAGCTCTTGGT
+GCTGGACAGGCATCTTTGTTTGGAAACAACCAACCTAAGATTGGAGGGCCTCTTGGTACA
+GGAGCCTTTGGGGCCCCTGGATTTAATACTTCGACAGCCATTTTGGGCTTTGGCGCCCCC
+CAGGCCCCAGTAGCTTTGACAGATCCAAATGCTTCTGCTGCCCAGCAGGCTGTTCTCCAG
+CAGCACCTCAATAGCCTAACATACTCACCCTTTGGAGACTCCCCCCTCTTCCGGAATCCT
+ATGTCAGATCCTAAGAAGAAAGAAGAGAGACTGAAACCAACCAATCCAGCTGCTCAGAAA
+GCTCTTACAACACCTACTCATTATAAACTTACACCTCGCCCTGCTACCAGAGTCAGGCCA
+AAGGCTTTGCAAACAACAGGCACAGCCAAATCACATCTCTTTGATGGGCTGGATGACGAT
+GAACCATCTCTAGCCAACGGAGCATTCATGCCTAAAAAGAGCATCAAGAAGTTGGTTTTG
+AAAAATCTCAACAATAGCAATCTCTTTTCTCCTGTTAATCATGATTCAGAAGATCTAGCT
+TCACCCTCTGAGTATCCAGAAAATGGAGAAAGATTTAGCTTCCTGAGCAAACCTGTTGAT
+GAGAACAATCAGCAGGATGGAGAAGATGACTCTCTTGTATCACGATTTTACACTAATCCT
+ATTGCCAAACCCATTCCACAAACTCCAGAGAGTGTTGGAAACAAAAATAACAGTAGCAGC
+AATGTGGAAGATACCATTGTTGCCTTGAACATGCGTGCTGCTTTGCGCAATGGATTGGAA
+GGAAGCAGTGAAGAGACGTCATTCCATGATGAGTCATTGCAAGATGACCGAGAAGAGATA
+GAAAATAATGCTTACCACATACACCCAGCAGGCATTGTTCTCACAAAAGTTGGTTATTAC
+ACTATCCCATCTATGGATGACCTTGCTAAAATTACCAACGAGAAGGGAGAATGCATTGTT
+TCTGACTTCACCATTGGTCGTAAAGGATATGGCTCAATCTATTTTGAAGGAGATGTGAAT
+TTGACAAATCTAAATTTGGATGATATTGTGCATATCCGAAGGAAAGAAGTTATTGTCTAT
+GTAGATGATAACCAAAAGCCACCTGTGGGTGAAGGGCTAAATAGGAAGGCTGAAGTTACT
+TTGGATGGAGTTTGGCCAACAGATAAAACATCCCGGTGTTTAATAAAGAGTCCAGATCGA
+CTTGCTGATATCAACTATGAGGGGAGATTAGAAGCAGTCTCAAGAAAGCAAGGGGCCCAA
+TTCAAGGAGTATCGGCCTGAAACTGGTTCTTGGGTATTTAAGGTCTCCCATTTTTCCAAG
+TATGGCCTTCAGGATTCTGATGAAGAGGAGGAGGAACACCCACCCAAAACGACTTCAAAG
+AAGCTGAAGACTGCCCCTTTGCCCCCTGCAGGCCAGGCAACCACTTTCCAGATGACTCTT
+AATGGCAAGCCTGCACCCCCACCTCAGAGCCAGAGCCCAGAAGTGGAGCAGTTAGGCAGG
+GTTGTGGAACTGGACAGCGACATGGTAGATATCACCCAGGAGCCAGTTCCAGATTCTGTG
+TTAGAAGAGAGTGTGCCCGAGGATCAGGAGCCTGTGTCTGCTTCAACGCATATTGCATCT
+TCACTGGGAATTAATCCACATGTTTTACAGATCATGAAAGCATCATTGCTTGTTGACGAA
+GAAGATGTAGATGCCATGGATCAACGCTTTGGTCACATCCCTTCCAAAGGAGAGACTGTC
+CAGGAAATCTGTTCTCCTAGACTCCCCATTTCAGCCTCCCACTCATCAAAATCCCGCTCC
+ATAGTTGGTGGGTTGCTGCAATCAAAATTTGCAAGTGGAACTTTTCTTTCACCAAGTGCC
+TCCGTGCAAGAATGTCGCACTCCCAGGACATCATCTCGCATGAACATCCCATCCACATCC
+CCCTGGTCTGTCCCTCTGCCCCTGGCCACTGTGTTCACAGTGCCCAGCCCAGCCCCTGAG
+GTTCAGCTAAAAACAGTGGGGATACGAAGGCAACCAGGCCTAGTCCCTCTTGAAAAATCC
+ATTACATATGGCAAGGGGAAGCTCTTGATGGACATGGCCCTATTCATGGGACGTTCATTT
+CGGGTTGGTTGGGGTCCCAACTGGACTCTTGCTAATAGTGGAGAACAACTGCATGGCTCC
+CATGAACTGGAAAATCATCAGGTTGCCGATTCTATGGAATATGGATTCCTGCCCAATCCA
+GTAGCTGTTAAATCTCTATCTGAATCCCCATTCAAAGTTCATTTGGAAAAACTCGGCTTA
+AGACAGAGGAAGCTGGATGAAGATCTGCAGTTATACCAGACACCTCTAGAGCTCAAATTA
+AAACATAGCACTGTCCATGTAGATGAGCTGTGTCCTCTCATTGTCCCCAACCCTGGGGTT
+TCAGTCATTCATGATTATGCAGATTGGGTTAAGGACTCACCTGGAGATTTCCTGGAACTA
+CCAATTGTGAAGCACTGGAGCCTGACATGGACATTATGTGAAGCCCTATGGGGCCACCTG
+AAGGAGCTTGACGGCCAGCTGGATGAGCCCAGCGAATACATTCAGACTCTGGAGCGTAGA
+AGAGCTTTTTCCCGCTGGCTGTCACATACCGCTGCACCTCAGATTGAAGAGGAAGTCTCC
+TTAACCCGCAGAGACAGTCCCGTAGAGGCTGTCTTCAGCTACCTCACGGGCAGTAGGATT
+AGTGAGGCCTGTTGTCTGGCACAGCAGTCAGGTGATCATCGCCTTGCCCTTCTTCTGTCT
+CAGTTGGTGGGAAGCCAGTCAGTCCGGGAGCTGCTCACCATGCAGTTGGCCGATTGGCAT
+CAGCTCCAGGCTGACTCCTTCATCCACGATGAGCGATTGCGCATATTTGCCCTGTTGGCT
+GGAAAACCGGTGTGGCAGCTCTCAGAGCAGAAACAAATCAATGTTTGCTCCCAGCTAGAT
+TGGAAACGAACACTTGCTATCCATCTTTGGTATTTGCTTCCGCCAACCGCCTCCATTTCC
+AGGGCTCTCAGCATGTATGAAGAAGCATTTCAGAATACTCCTGAGGGTGATAAATATGCC
+TGCTCCCCTCTTCCTTCTTACCTGGAGGGCTGCGGCTGTATGGTAGAGGAAGAAAAAGAC
+TCCCGGAGACCACTTCAAGATGTTTGCTTTCATCTTCTAAAACTCTACAGTGACAGACAT
+TATGAGCTCAATCAGCTATTAGAACCTCGAAGCATAACTGCAGATCCTTTGGACTACCGC
+CTGAGCTGGCACCTTTGGGAAGTGCTACGTGCTCTTAACTATACCCATCTCTCAGAACAG
+TGTGAAGGTGTGCTACAGGCCAGTTATGCTGGCCAACTGGAAAGTGAAGGACTCTGGGAG
+TGGGCCATCTTTGTCTTCCTACACATTGACAACTCGGGCATGCGTGAGAAGGCTGTTCGA
+GAGCTGCTGACAAGGCACTGCCAACTGTCAGAGACCCCTGAGTCTTGGGCTAAGGAGGCG
+TTCCTCACACAGAAGCTTTGTGTGCCTGCTGAGTGGATTCATGAGGCCAAAGCAGTTCGA
+GCACACATGGAATCCAATAAGCACTTGGAGGCCCTCTATTTATTTAAAGCTGGTCACTGG
+AACCGCTGCCACAAACTAGTCATTCGTCACCTAGCTTCTGATGCCATTATTAATGAGAAC
+TATGACTACCTGAAAGGATTCTTAGAAGATCTGGCACCTCCAGAGCGCAGCAGCCTCATC
+CAGGACTGGGAAACATCTGGGCTCGTTTACCTGGATTATATTCGAGTGATTGAAATGCTC
+CACCGTATTCAGCAGGTGGATTGCTCAGGTTATGAACTAGAGCACTTACATACCAAAGTG
+ACTTCACTGTGCAATCGGATAGAACAGATTCCGTGTTACAATGCCAAGGATCGCCTGGCT
+CAATCAGATATGGCCAAGCGGGTAGCCAACTTACTGCGGGTAGTGCTGAGCCTTCAGCAT
+GCTCCTGATGCCACCTCCAACTCAACGCCAGACCCTCAGCGAGTCCCTTTGCGTCTTTTG
+GCTCCCCACATTGGCAGGCTCCCCATGCCTGAGGACTACGCCTTGGAGGAACTGCGAGGC
+CTTACCCAGTCCTACCTTCGAGAACTGACTGTTGGGAGCCAGTGAGCTTGGCTCTTGCCA
+CCACACTCATGCCCACTCACACTCGCCACACCACAGTCCCCAGCACTGTTTTAGTTGACA
+CTTTGCCAATCTCTGGGAATCCTCCATTCCTTTCTGCTGCATCTTCTAGTTATTCAGGGG
+TTTTCCTAATACTGAGCATAGCCTACAATAGCTCATAAGGGCTTCTGGAACAACAACAAA
+GAAGACAGGTCTCCATTTATCAACCTCAAGACCTTTTTTTTTCTTTTTCTTTTTTTTTTT
+TTTTTTTTTTTTTTCTTTTGAAAAATGGTCAATAAAACCTCTTTGGCAGAACCTCCCAAA
+ACCTAGGGAATTCTTTTCCACACCCAGCGTTCTGGCTCTCACCCCATGCCAGCATCTAAC
+CTCCACCACTGCGATCCTTTTGTACCGTGACTGTTTGACAGACATCTGGCATATGACTGA
+CTGACCTTCCTTACAGATTTGTCCCTCAAGTAGATTTCTCAGTAACGGTGGATTTTGGAG
+TCAAAAGAGAGTTGGACCTTGTTCTTTGGTAAATTTAAGATAGAAGGGCTGTCTGCCATA
+GAGGTAGAGATCTTCAAGGCCTTTACTCATGCCCTGTGTATCCTTTGGACACCATACTAT
+CATGCGCAGTGGCCCCAAGCCACCGAGAACCAGTCTGAGAAGCTCCAGATTCGCTCAGGC
+CCTTGATCATCAGTCGTCGTCGTCTTCGATTTGCCAGAGGAGTTTAGATGAAGAATGTCA
+AGGATGTTCCTCCCTGCCCTCCCATCTAGCCAAGAACATTTCCAAGAAGATAAAACTGTC
+ACTGAGACAGGTCTGGATGCGCCCTAGGGGCAAATAGAGAAGGCCTTTACCACATTGCTG
+CTGGCTATAGGAAGTCCCAGGTACTAGCCTGAAACAGCTGATATTTGGGGCTGTCACAGA
+CAATATGGCCACCCCTTGGTCTTTATGCATGAAGATTATGTAAAGGTTTTTATTAAAAAA
+TATATATATATATATAAATGATCTAGATTATTTTCCTCTTTCTGAAGTACTTTCTTAAAA
+AAATAAAATTAAATGTTTATAGTATTCCCGGT
+>TR7|c0_g1_i2 len=3918 path=[7480:0-168 @7569@!:169-1348 7494:1349-1369 @7563@!:1370-3682 7570:3683-3695 7567:3696-3731 7562:3732-3755 7556:3756-3827 7571:3828-3831 7573:3832-3845 7554:3846-3855 7548:3856-3858 7539:3859-3882 7436:3883-3917] [-1, 7480, 7569, 7494, 7563, 7570, 7567, 7562, 7556, 7571, 7573, 7554, 7548, 7539, 7436, -2]
+CGGCGTGTGACGCAGTCAGGCCTCTGCGCGCTGCGCCCGAAGCGGCGGTCGGTGGCAGCG
+GCGGCGGCGACGACGGTTTTTCTGGAGGCCGCGCGGTGAGCGGCGGGTGACGGGCGGACC
+TGGGCTCTCACTCCAGACGCACCGCTCTTTCTGAAGCAAACACTTGCTTTGAAGATGTTT
+AACAAATCATTTGGAACCCCCTTTGGGGGTAGTACAGGGGGCTTTGGCACAACGTCAACA
+TTTGGGCAAAATACTGGCTTTGGTACGACTAGTGGAGGAGCATTTGGAACATCTGCATTT
+GGTTCTAGCAACAATACTGGAGGCTTATTTGGAAATTCACAGACCAAACCAGGAGGATTA
+TTTGGTACCAGTTCATTTAGCCAGCCAGCAACCTCCACAAGCACTGGGTTTGGGTTTGGC
+ACATCAACAGGAACATCAAATAGCTTATTTGGAACTGCAAGTACCGGGACCAGTCTTTTC
+TCATCCCAGAACAATGCATTTGCACAAAATAAACCAACTGGCTTTGGGAATTTTGGAACC
+AGTACTAGCAGTGGAGGACTCTTTGGAACTACAAATACCACCTCTAATCCTTTTGGTAGC
+ACATCTGGCTCCCTTTTTGGGCCAAGTAGTTTTACAGCAGCACCTACAGGAACTACCATC
+AAATTTAATCCTCCCACTGGTACAGATACTATGGTCAAAGCTGGAGTTAGCACTAACATC
+AGTACAAAGCATCAGTGTATTACTGCTATGAAAGAATATGAAAGCAAGTCATTAGAGGAA
+CTACGTTTGGAGGATTATCAGGCTAACCGGAAAGGCCCACAGAACCAAGTGGGAGGAGGC
+ACCACGGCTGGCTTATTTGGGTCTTCTCCAGCAACTTCCAGTGCAACAGGGCTCTTCAGC
+TCCTCCACCACTAATTCAGCCTTTTCATATGGTCAGAACAAAACTGCCTTTGGAACTAGC
+ACAACTGGATTTGGAACAAATCCAGGTGGTCTCTTTGGCCAACAGAATCAACAGACTACC
+AGTCTCTTCAGCAAACCATTTGGCCAGGCTACAACCACCCCGAATACTGGCTTTTCCTTT
+GGTAATACCAGCACCCTTGGACAGCCAAGCACCAATACTATGGGCCTATTTGGAGTAACC
+CAAGCCTCACAACCAGGAGGTCTTTTTGGGACAGCTACAAACACCAGCACTGGGACAGCA
+TTTGGGACAGGAACAGGTCTCTTTGGGCAGCCCAATACTGGATTTGGTGCAGTTGGTTCG
+ACCCTGTTTGGCAATAACAAGCTTACAACTTTTGGAACCAGCACAACCAGTGCTCCTTCA
+TTTGGTACAACCAGTGGCGGGCTCTTCGGGTTTGGCACAAATAACAGTGGGAGCAGTATT
+TTTGGAAGTAAGCCAGCAGCTGGAACTTTGGGAACTGGACTTGGTACAGGATTTGGAACA
+GCTCTTGGTGCTGGACAGGCATCTTTGTTTGGAAACAACCAACCTAAGATTGGAGGGCCT
+CTTGGTACAGGAGCCTTTGGGGCCCCTGGATTTAATACTTCGACAGCCATTTTGGGCTTT
+GGCGCCCCCCAGGCCCCAGTAGCTTTGACAGATCCAAATGCTTCTGCTGCCCAGCAGGCT
+GTTCTCCAGCAGCACCTCAATAGCCTAACATACTCACCCTTTGGAGACTCCCCCCTCTTC
+CGGAATCCTATGTCAGATCCTAAGAAGAAAGAAGAGAGACTGAAACCAACCAATCCAGCT
+GCTCAGAAAGCTCTTACAACACCTACTCATTATAAACTTACACCTCGCCCTGCTACCAGA
+GTCAGGCCAAAGGCTTTGCAAACAACAGGCACAGCCAAATCACATCTCTTTGATGGGCTG
+GATGACGATGAACCATCTCTAGCCAACGGAGCATTCATGCCTAAAAAGAGCATCAAGAAG
+TTGGTTTTGAAAAATCTCAACAATAGCAATCTCTTTTCTCCTGTTAATCATGATTCAGAA
+GATCTAGCTTCACCCTCTGAGTATCCAGAAAATGGAGAAAGATTTAGCTTCCTGAGCAAA
+CCTGTTGATGAGAACAATCAGCAGGATGGAGAAGATGACTCTCTTGTATCACGATTTTAC
+ACTAATCCTATTGCCAAACCCATTCCACAAACTCCAGAGAGTGTTGGAAACAAAAATAAC
+AGTAGCAGCAATGTGGAAGATACCATTGTTGCCTTGAACATGCGTGCTGCTTTGCGCAAT
+GGATTGGAAGGAAGCAGTGAAGAGACGTCATTCCATGATGAGTCATTGCAAGATGACCGA
+GAAGAGATAGAAAATAATGCTTACCACATACACCCAGCAGGCATTGTTCTCACAAAAGTT
+GGTTATTACACTATCCCATCTATGGATGACCTTGCTAAAATTACCAACGAGAAGGGAGAA
+TGCATTGTTTCTGACTTCACCATTGGTCGTAAAGGATATGGCTCAATCTATTTTGAAGGA
+GATGTGAATTTGACAAATCTAAATTTGGATGATATTGTGCATATCCGAAGGAAAGAAGTT
+ATTGTCTATGTAGATGATAACCAAAAGCCACCTGTGGGTGAAGGGCTAAATAGGAAGGCT
+GAAGTTACTTTGGATGGAGTTTGGCCAACAGATAAAACATCCCGGTGTTTAATAAAGAGT
+CCAGATCGACTTGCTGATATCAACTATGAGGGGAGATTAGAAGCAGTCTCAAGAAAGCAA
+GGGGCCCAATTCAAGGAGTATCGGCCTGAAACTGGTTCTTGGGTATTTAAGGTCTCCCAT
+TTTTCCAAGTATGGCCTTCAGGATTCTGATGAAGAGGAGGAGGAACACCCACCCAAAACG
+ACTTCAAAGAAGCTGAAGACTGCCCCTTTGCCCCCTGCAGGCCAGGCAACCACTTTCCAG
+ATGACTCTTAATGGCAAGCCTGCACCCCCACCTCAGAGCCAGAGCCCAGAAGTGGAGCAG
+TTAGGCAGGGTTGTGGAACTGGACAGCGACATGGTAGATATCACCCAGGAGCCAGTTCCA
+GATTCTGTGTTAGAAGAGAGTGTGCCCGAGGATCAGGAGCCTGTGTCTGCTTCAACGCAT
+ATTGCATCTTCACTGGGAATTAATCCACATGTTTTACAGATCATGAAAGCATCATTGCTT
+GTTGACGAAGAAGATGTAGATGCCATGGATCAACGCTTTGGTCACATCCCTTCCAAAGGA
+GAGACTGTCCAGGAAATCTGTTCTCCTAGACTCCCCATTTCAGCCTCCCACTCATCAAAA
+TCCCGCTCCATAGTTGGTGGGTTGCTGCAATCAAAATTTGCAAGTGGAACTTTTCTTTCA
+CCAAGTGCCTCCGTGCAAGAATGTCGCACTCCCAGGACATCATCTCGCATGAACATCCCA
+TCCACATCCCCCTGGTCTGTCCCTCTGCCCCTGGCCACTGTGTTCACAGTGCCCAGCCCA
+GCCCCTGAGGTTCAGCTAAAAACAGTGGGGATACGAAGGCAACCAGGCCTAGTCCCTCTT
+GAAAAATCCATTACATATGGCAAGGGGAAGCTCTTGATGGACATGGCCCTATTCATGGGA
+CGTTCATTTCGGGTTGGTTGGGGTCCCAACTGGACTCTTGCTAATAGTGGAGAACAACTG
+CATGGCTCCCATGAACTGGAAAATCATCAGGTTGCCGATTCTATGGAATATGGATTCCTG
+CCCAATCCAGTAGCTGTTAAATCGTGAGTTATGTTTATTGATGCTTTGGGGGAATGTCCA
+CATTATAGTTGGGGCTGTTCTGTTATCAAGAAACCCAAGGTCAGCACCCTGCTTTTTGAT
+CTCTCTATATAAATTTTTAACCCAAGTATAAGTATTTCATATGTTATGTACATAGTATCA
+TATATGTTCCTATGTAGTCCCTACAATTAAGTCCTCTGGTAATTATCATACAAAATGTAT
+TGCATTTACACCAAATAA
+>TR7|c0_g1_i3 len=6641 path=[7480:0-168 @7569@!:169-1348 7494:1349-1369 @7563@!:1370-3682 7542:3683-4212 7525:4213-4236 7566:4237-4423 @7561@!:4424-5492 7549:5493-5840 7572:5841-5841 7574:5842-5842 7523:5843-6640] [-1, 7480, 7569, 7494, 7563, 7542, 7525, 7566, 7561, 7549, 7572, 7574, 7523, -2]
+CGGCGTGTGACGCAGTCAGGCCTCTGCGCGCTGCGCCCGAAGCGGCGGTCGGTGGCAGCG
+GCGGCGGCGACGACGGTTTTTCTGGAGGCCGCGCGGTGAGCGGCGGGTGACGGGCGGACC
+TGGGCTCTCACTCCAGACGCACCGCTCTTTCTGAAGCAAACACTTGCTTTGAAGATGTTT
+AACAAATCATTTGGAACCCCCTTTGGGGGTAGTACAGGGGGCTTTGGCACAACGTCAACA
+TTTGGGCAAAATACTGGCTTTGGTACGACTAGTGGAGGAGCATTTGGAACATCTGCATTT
+GGTTCTAGCAACAATACTGGAGGCTTATTTGGAAATTCACAGACCAAACCAGGAGGATTA
+TTTGGTACCAGTTCATTTAGCCAGCCAGCAACCTCCACAAGCACTGGGTTTGGGTTTGGC
+ACATCAACAGGAACATCAAATAGCTTATTTGGAACTGCAAGTACCGGGACCAGTCTTTTC
+TCATCCCAGAACAATGCATTTGCACAAAATAAACCAACTGGCTTTGGGAATTTTGGAACC
+AGTACTAGCAGTGGAGGACTCTTTGGAACTACAAATACCACCTCTAATCCTTTTGGTAGC
+ACATCTGGCTCCCTTTTTGGGCCAAGTAGTTTTACAGCAGCACCTACAGGAACTACCATC
+AAATTTAATCCTCCCACTGGTACAGATACTATGGTCAAAGCTGGAGTTAGCACTAACATC
+AGTACAAAGCATCAGTGTATTACTGCTATGAAAGAATATGAAAGCAAGTCATTAGAGGAA
+CTACGTTTGGAGGATTATCAGGCTAACCGGAAAGGCCCACAGAACCAAGTGGGAGGAGGC
+ACCACGGCTGGCTTATTTGGGTCTTCTCCAGCAACTTCCAGTGCAACAGGGCTCTTCAGC
+TCCTCCACCACTAATTCAGCCTTTTCATATGGTCAGAACAAAACTGCCTTTGGAACTAGC
+ACAACTGGATTTGGAACAAATCCAGGTGGTCTCTTTGGCCAACAGAATCAACAGACTACC
+AGTCTCTTCAGCAAACCATTTGGCCAGGCTACAACCACCCCGAATACTGGCTTTTCCTTT
+GGTAATACCAGCACCCTTGGACAGCCAAGCACCAATACTATGGGCCTATTTGGAGTAACC
+CAAGCCTCACAACCAGGAGGTCTTTTTGGGACAGCTACAAACACCAGCACTGGGACAGCA
+TTTGGGACAGGAACAGGTCTCTTTGGGCAGCCCAATACTGGATTTGGTGCAGTTGGTTCG
+ACCCTGTTTGGCAATAACAAGCTTACAACTTTTGGAACCAGCACAACCAGTGCTCCTTCA
+TTTGGTACAACCAGTGGCGGGCTCTTCGGGTTTGGCACAAATAACAGTGGGAGCAGTATT
+TTTGGAAGTAAGCCAGCAGCTGGAACTTTGGGAACTGGACTTGGTACAGGATTTGGAACA
+GCTCTTGGTGCTGGACAGGCATCTTTGTTTGGAAACAACCAACCTAAGATTGGAGGGCCT
+CTTGGTACAGGAGCCTTTGGGGCCCCTGGATTTAATACTTCGACAGCCATTTTGGGCTTT
+GGCGCCCCCCAGGCCCCAGTAGCTTTGACAGATCCAAATGCTTCTGCTGCCCAGCAGGCT
+GTTCTCCAGCAGCACCTCAATAGCCTAACATACTCACCCTTTGGAGACTCCCCCCTCTTC
+CGGAATCCTATGTCAGATCCTAAGAAGAAAGAAGAGAGACTGAAACCAACCAATCCAGCT
+GCTCAGAAAGCTCTTACAACACCTACTCATTATAAACTTACACCTCGCCCTGCTACCAGA
+GTCAGGCCAAAGGCTTTGCAAACAACAGGCACAGCCAAATCACATCTCTTTGATGGGCTG
+GATGACGATGAACCATCTCTAGCCAACGGAGCATTCATGCCTAAAAAGAGCATCAAGAAG
+TTGGTTTTGAAAAATCTCAACAATAGCAATCTCTTTTCTCCTGTTAATCATGATTCAGAA
+GATCTAGCTTCACCCTCTGAGTATCCAGAAAATGGAGAAAGATTTAGCTTCCTGAGCAAA
+CCTGTTGATGAGAACAATCAGCAGGATGGAGAAGATGACTCTCTTGTATCACGATTTTAC
+ACTAATCCTATTGCCAAACCCATTCCACAAACTCCAGAGAGTGTTGGAAACAAAAATAAC
+AGTAGCAGCAATGTGGAAGATACCATTGTTGCCTTGAACATGCGTGCTGCTTTGCGCAAT
+GGATTGGAAGGAAGCAGTGAAGAGACGTCATTCCATGATGAGTCATTGCAAGATGACCGA
+GAAGAGATAGAAAATAATGCTTACCACATACACCCAGCAGGCATTGTTCTCACAAAAGTT
+GGTTATTACACTATCCCATCTATGGATGACCTTGCTAAAATTACCAACGAGAAGGGAGAA
+TGCATTGTTTCTGACTTCACCATTGGTCGTAAAGGATATGGCTCAATCTATTTTGAAGGA
+GATGTGAATTTGACAAATCTAAATTTGGATGATATTGTGCATATCCGAAGGAAAGAAGTT
+ATTGTCTATGTAGATGATAACCAAAAGCCACCTGTGGGTGAAGGGCTAAATAGGAAGGCT
+GAAGTTACTTTGGATGGAGTTTGGCCAACAGATAAAACATCCCGGTGTTTAATAAAGAGT
+CCAGATCGACTTGCTGATATCAACTATGAGGGGAGATTAGAAGCAGTCTCAAGAAAGCAA
+GGGGCCCAATTCAAGGAGTATCGGCCTGAAACTGGTTCTTGGGTATTTAAGGTCTCCCAT
+TTTTCCAAGTATGGCCTTCAGGATTCTGATGAAGAGGAGGAGGAACACCCACCCAAAACG
+ACTTCAAAGAAGCTGAAGACTGCCCCTTTGCCCCCTGCAGGCCAGGCAACCACTTTCCAG
+ATGACTCTTAATGGCAAGCCTGCACCCCCACCTCAGAGCCAGAGCCCAGAAGTGGAGCAG
+TTAGGCAGGGTTGTGGAACTGGACAGCGACATGGTAGATATCACCCAGGAGCCAGTTCCA
+GATTCTGTGTTAGAAGAGAGTGTGCCCGAGGATCAGGAGCCTGTGTCTGCTTCAACGCAT
+ATTGCATCTTCACTGGGAATTAATCCACATGTTTTACAGATCATGAAAGCATCATTGCTT
+GTTGACGAAGAAGATGTAGATGCCATGGATCAACGCTTTGGTCACATCCCTTCCAAAGGA
+GAGACTGTCCAGGAAATCTGTTCTCCTAGACTCCCCATTTCAGCCTCCCACTCATCAAAA
+TCCCGCTCCATAGTTGGTGGGTTGCTGCAATCAAAATTTGCAAGTGGAACTTTTCTTTCA
+CCAAGTGCCTCCGTGCAAGAATGTCGCACTCCCAGGACATCATCTCGCATGAACATCCCA
+TCCACATCCCCCTGGTCTGTCCCTCTGCCCCTGGCCACTGTGTTCACAGTGCCCAGCCCA
+GCCCCTGAGGTTCAGCTAAAAACAGTGGGGATACGAAGGCAACCAGGCCTAGTCCCTCTT
+GAAAAATCCATTACATATGGCAAGGGGAAGCTCTTGATGGACATGGCCCTATTCATGGGA
+CGTTCATTTCGGGTTGGTTGGGGTCCCAACTGGACTCTTGCTAATAGTGGAGAACAACTG
+CATGGCTCCCATGAACTGGAAAATCATCAGGTTGCCGATTCTATGGAATATGGATTCCTG
+CCCAATCCAGTAGCTGTTAAATCTCTATCTGAATCCCCATTCAAAGTTCATTTGGAAAAA
+CTCGGCTTAAGACAGAGGAAGCTGGATGAAGATCTGCAGTTATACCAGACACCTCTAGAG
+CTCAAATTAAAACATAGCACTGTCCATGTAGATGAGCTGTGTCCTCTCATTGTCCCCAAC
+CCTGGGGTTTCAGTCATTCATGATTATGCAGATTGGGTTAAGGACTCACCTGGAGATTTC
+CTGGAACTACCAATTGTGAAGCACTGGAGCCTGACATGGACATTATGTGAAGCCCTATGG
+GGCCACCTGAAGGAGCTTGACGGCCAGCTGGATGAGCCCAGCGAATACATTCAGACTCTG
+GAGCGTAGAAGAGCTTTTTCCCGCTGGCTGTCACATACCGCTGCACCTCAGATTGAAGAG
+GAAGTCTCCTTAACCCGCAGAGACAGTCCCGTAGAGGCTGTCTTCAGCTACCTCACGGGC
+AGTAGGATTAGTGAGGCCTGTTGTCTGGCACAGCAGTCAGGTGATCATCGCCTTGCCCTT
+CTTCTGTCTCAGTTGGTGGGAAGCCAGTCAGTCCGGGAGCTGCTCACCATGCAGTTGGCC
+GATTGGCATCAGCTCCAGGCTGACTCCTTCATCCACGATGAGCGATTGCGCATATTTGCC
+CTGTTGGCTGGAAAACCGGTGTGGCAGCTCTCAGAGCAGAAACAAATCAATGTTTGCTCC
+CAGCTAGATTGGAAACGAACACTTGCTATCCATCTTTGGTATTTGCTTCCGCCAACCGCC
+TCCATTTCCAGGGCTCTCAGCATGTATGAAGAAGCATTTCAGAATACTCCTGAGGGTGAT
+AAATATGCCTGCTCCCCTCTTCCTTCTTACCTGGAGGGCTGCGGCTGTATGGTAGAGGAA
+GAAAAAGACTCCCGGAGACCACTTCAAGATGTTTGCTTTCATCTTCTAAAACTCTACAGT
+GACAGACATTATGAGCTCAATCAGCTATTAGAACCTCGAAGCATAACTGCAGATCCTTTG
+GACTACCGCCTGAGCTGGCACCTTTGGGAAGTGCTACGTGCTCTTAACTATACCCATCTC
+TCAGAACAGTGTGAAGGTGTGCTACAGGCCAGTTATGCTGGCCAACTGGAAAGTGAAGGA
+CTCTGGGAGTGGGCCATCTTTGTCTTCCTACACATTGACAACTCGGGCATGCGTGAGAAG
+GCTGTTCGAGAGCTGCTGACAAGGCACTGCCAACTGTCAGAGACCCCTGAGTCTTGGGCT
+AAGGAGGCGTTCCTCACACAGAAGCTTTGTGTGCCTGCTGAGTGGATTCATGAGGCCAAA
+GCAGTTCGAGCACACATGGAATCCAATAAGCACTTGGAGGCCCTCTATTTATTTAAAGCT
+GGTCACTGGAACCGCTGCCACAAACTAGTCATTCGTCACCTAGCTTCTGATGCCATTATT
+AATGAGAACTATGACTACCTGAAAGGATTCTTAGAAGATCTGGCACCTCCAGAGCGCAGC
+AGCCTCATCCAGGACTGGGAAACATCTGGGCTCGTTTACCTGGATTATATTCGAGTGATT
+GAAATGCTCCACCGTATTCAGCAGGTGGATTGCTCAGGTTATGAACTAGAGCACTTACAT
+ACCAAAGTGACTTCACTGTGCAATCGGATAGAACAGATTCCGTGTTACAATGCCAAGGAT
+CGCCTGGCTCAATCAGATATGGCCAAGCGGGTAGCCAACTTACTGCGGGTAGTGCTGAGC
+CTTCAGCATGCTCCTGATGCCACCTCCAACTCAACGCCAGACCCTCAGCGAGTCCCTTTG
+CGTCTTTTGGCTCCCCACATTGGCAGGCTCCCCATGCCTGAGGACTACGCCTTGGAGGAA
+CTGCGAGGCCTTACCCAGTCCTACCTTCGAGAACTGACTGTTGGGAGCCAGTGAGCTTGG
+CTCTTGCCACCACACTCATGCCCACTCACACTCGCCACACCACAGTCCCCAGCACTGTTT
+TAGTTGACACTTTGCCAATCTCTGGGAATCCTCCATTCCTTTCTGCTGCATCTTCTAGTT
+ATTCAGGGGTTTTCCTAATACTGAGCATAGCCTACAATAGCTCATAAGGGCTTCTGGAAC
+AACAACAAAGAAGACAGGTCTCCATTTATCAACCTCAAGACCTTTTTTTTTCTTTTTCTT
+TTTTTTTTTTTTTTTTTTTTTTTCTTTTGAAAAATGGTCAATAAAACCTCTTTGGCAGAA
+CCTCCCAAAACCTAGGGAATTCTTTTCCACACCCAGCGTTCTGGCTCTCACCCCATGCCA
+GCATCTAACCTCCACCACTGCGATCCTTTTGTACCGTGACTGTTTGACAGACATCTGGCA
+TATGACTGACTGACCTTCCTTACAGATTTGTCCCTCAAGTAGATTTCTCAGTAACGGTGG
+ATTTTGGAGTCAAAAGAGAGTTGGACCTTGTTCTTTGGTAAATTTAAGATAGAAGGGCTG
+TCTGCCATAGAGGTAGAGATCTTCAAGGCCTTTACTCATGCCCTGTGTATCCTTTGGACA
+CCATACTATCATGCGCAGTGGCCCCAAGCCACCGAGAACCAGTCTGAGAAGCTCCAGATT
+CGCTCAGGCCCTTGATCATCAGTCGTCGTCGTCTTCGATTTGCCAGAGGAGTTTAGATGA
+AGAATGTCAAGGATGTTCCTCCCTGCCCTCCCATCTAGCCAAGAACATTTCCAAGAAGAT
+AAAACTGTCACTGAGACAGGTCTGGATGCGCCCTAGGGGCAAATAGAGAAGGCCTTTACC
+ACATTGCTGCTGGCTATAGGAAGTCCCAGGTACTAGCCTGAAACAGCTGATATTTGGGGC
+TGTCACAGACAATATGGCCACCCCTTGGTCTTTATGCATGAAGATTATGTAAAGGTTTTT
+ATTAAAAAATATATATATATATATAAATGATCTAGATTATTTTCCTCTTTCTGAAGTACT
+TTCTTAAAAAAATAAAATTAAATGTTTATAGTATTCCCGGT
+>TR7|c0_g2_i1 len=832 path=[7527:0-23 7528:24-24 7529:25-25 7530:26-26 7531:27-27 7532:28-28 7533:29-29 7534:30-30 7535:31-31 7536:32-32 7537:33-33 7538:34-831] [-1, 7527, 7528, 7529, 7530, 7531, 7532, 7533, 7534, 7535, 7536, 7537, 7538, -2]
+TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTCTTTTGAAAAATGGTCAATAAAACCT
+CTTTGGCAGAACCTCCCAAAACCTAGGGAATTCTTTTCCACACCCAGCGTTCTGGCTCTC
+ACCCCATGCCAGCATCTAACCTCCACCACTGCGATCCTTTTGTACCGTGACTGTTTGACA
+GACATCTGGCATATGACTGACTGACCTTCCTTACAGATTTGTCCCTCAAGTAGATTTCTC
+AGTAACGGTGGATTTTGGAGTCAAAAGAGAGTTGGACCTTGTTCTTTGGTAAATTTAAGA
+TAGAAGGGCTGTCTGCCATAGAGGTAGAGATCTTCAAGGCCTTTACTCATGCCCTGTGTA
+TCCTTTGGACACCATACTATCATGCGCAGTGGCCCCAAGCCACCGAGAACCAGTCTGAGA
+AGCTCCAGATTCGCTCAGGCCCTTGATCATCAGTCGTCGTCGTCTTCGATTTGCCAGAGG
+AGTTTAGATGAAGAATGTCAAGGATGTTCCTCCCTGCCCTCCCATCTAGCCAAGAACATT
+TCCAAGAAGATAAAACTGTCACTGAGACAGGTCTGGATGCGCCCTAGGGGCAAATAGAGA
+AGGCCTTTACCACATTGCTGCTGGCTATAGGAAGTCCCAGGTACTAGCCTGAAACAGCTG
+ATATTTGGGGCTGTCACAGACAATATGGCCACCCCTTGGTCTTTATGCATGAAGATTATG
+TAAAGGTTTTTATTAAAAAATATATATATATATATAAATGATCTAGATTATTTTCCTCTT
+TCTGAAGTACTTTCTTAAAAAAATAAAATTAAATGTTTATAGTATTCCCGGT
+>TR7|c1_g1_i1 len=341 path=[319:0-340] [-1, 319, -2]
+CAAAGGAATTAAGTAATTTAGAATCAGGCCGTATGTGTTGGTATATGCATATAATCTAGT
+CACTTAGGAGATAAAGGCTGGAGAATCAGAAATTCATCGTCTTTCTTGGCTATATATCAA
+GTTTAGGGTTACATGAGATGTATCTCAAAATATTTGGTATGTATAAACTTACCTTCATAA
+CTTTTGACACCTAAGTATTTGTAAACCAGGCATTCTACATATAACTTTTGATGTTTAGAT
+CTTGTAGTGTCCACATAAGTCGTGAAGCAAGTAATTACTGACTCCCATACTTTTGTACCG
+AGCTGTGCTTTGTTGCATTAAAATGTATTGGTTATCTTGCA
+>TR8|c1_g1_i1 len=252 path=[255:0-88 256:89-112 257:113-251] [-1, 255, 256, 257, -2]
+AATTTCTGTACCTTTCAGAAATTTAATGGAAAGGATTCCAAACTGGTCTCAGTTTTCAAG
+GGTCTACTTGTTCTGGGTGTCTTAAAGATATGCATTTCTTAGTGCATTTCTGCGGGAAAA
+GTGTTGCTTAAATTGGGATATTTTTGTTACTTTGGAAATTTTTTACTAGATAGAAATTTC
+TATATGTCTTTTCCTTTCCAAAATTTAGTACTCATTTCTGATTTAATTGAAAGCAGCTGT
+GCTTGACATTGT
+>TR8|c3_g1_i1 len=235 path=[268:0-36 270:37-108 265:109-234] [-1, 268, 270, 265, -2]
+CGGCCAGGGGCTTGTGGAGGTTAAAGTTTCTGTACAGTCCGCTTCCAGTCTCGTGTATCT
+TCTCTGGAGTGTTGTTTTGCAGTGCGGGGTGAGCTGGTGTGGGTGTTTGAATGCTGCTGT
+TTGCTGTTTTTTAAAGGCCTTCTAGCCCTCCCATGGGGTTGCTGCAGCAGGAATTCTTAC
+CTGTGCTTCAGCCCAGCATACAGACTGCTGACAGGCACCACACAGTCACTCGAGG
+>TR8|c5_g1_i1 len=341 path=[385:0-146 386:147-167 400:168-234 398:235-307 396:308-331 397:332-340] [-1, 385, 386, 400, 398, 396, 397, -2]
+CCCCACTGTAAGCGCCACATGCTTACTTCCTTCTTTACTTCCTGCATACTCTGTGTTTGT
+AAGTCAGTGTCAGAGTTACAACAAGAGACGGCCCAGAACAGGAAGAGTGCATTGCTGAGA
+CTGGAAACCTGCTTTGTCCCTCCGTTTTGGCAGAAGCAAGTTTTTAATTATTGAAAGCAA
+AAGTCCTTCCTTTGCTCTGTCTTTGTAGAGTCTTAGGGGTGTTGGAGGATAGAGGTAAGA
+AAGAAATGCTTATGTTGGGTTTCTGTAACTAAGGAATTTGTCCCATAGTGAGCAATCCCT
+TCCTTATTACATCTTAGCAAGAGTAGGGCCCAGTAGAATCT
+>TR8|c5_g1_i2 len=256 path=[385:0-146 386:147-167 400:168-234 392:235-255] [-1, 385, 386, 400, 392, -2]
+CCCCACTGTAAGCGCCACATGCTTACTTCCTTCTTTACTTCCTGCATACTCTGTGTTTGT
+AAGTCAGTGTCAGAGTTACAACAAGAGACGGCCCAGAACAGGAAGAGTGCATTGCTGAGA
+CTGGAAACCTGCTTTGTCCCTCCGTTTTGGCAGAAGCAAGTTTTTAATTATTGAAAGCAA
+AAGTCCTTCCTTTGCTCTGTCTTTGTAGAGTCTTAGGGGTGTTGGAGGATAGAGGCACCA
+CACAGTCACTCGAGGC
+>TR8|c6_g1_i1 len=349 path=[402:0-137 403:138-169 408:170-186 398:187-210 399:211-348] [-1, 402, 403, 408, 398, 399, -2]
+GAGAGGCTCCTGAAGGTGGAACCTAAAGCTGCCCAAGGCACTGCATTGTGTGAGCTTCAG
+GAGTTCAGAGGCAAAGCAGGTGACACTTCACTTACCATTTGGCTGTGTGAAATGACCCAG
+TCTAGGACAGGAAAGATATCTGCCTAGTATGGAGACTGAGACGAATGGTCAGGAATGGTT
+ATCTGGTTGCAGCTTCTCTTTTTAAGTTTGGTTTAAATGCGTGACTATACTTAGCTATGA
+GGCAGGCTGATTCCTACCCAGGTAACACTAGGTTGTGGTGCTGCTGTTAACCGTGGTCTC
+TTCTGTTTCCCTTTCGCTGACCTCAGGCACCACACAGTCACTCGAGGCA
+>TR8|c7_g1_i1 len=289 path=[342:0-45 347:46-175 345:176-249 341:250-288] [-1, 342, 347, 345, 341, -2]
+AGACCTTTCCTTTCTGAACTGGCAGTATTTAGTACGTAAGCTAAAATGATGCTGTTTATT
+TGGCTAGATTCTCCTGTTCTTAAGCCGTAAGACCTAGCTATCTCTATGTGCCACTTGACA
+CCAGGGACATGCCTGCTGTGCACTGTGCTGTTGCATGGCCATCGTACTGTGCACTTACTC
+AGACCTACATGCTACATACCCAGGCTGTAGGGACCAGTGCAGTCAATCATTGCCTGTGGA
+GCATGACTGTAGTTGACATCATACAGACTTGCATAGAGGCTCTGATGAA
+>TR8|c8_g1_i1 len=2592 path=[3520:0-259 @3555@!:260-1204 3489:1205-1226 3564:1227-1602 3560:1603-1674 3554:1675-2040 3514:2041-2063 3563:2064-2073 3571:2074-2074 3570:2075-2080 3568:2081-2081 3566:2082-2119 3552:2120-2126 3544:2127-2141 3532:2142-2305 3452:2306-2591] [-1, 3520, 3555, 3489, 3564, 3560, 3554, 3514, 3563, 3571, 3570, 3568, 3566, 3552, 3544, 3532, 3452, -2]
+CAGTGGCCACCTGGGGGTTGGCGGCGCCCTAGTGTCGCCTACTGGAAGGGCAAAAACCCG
+GGACCATGTCGGCCCAGGGCGACTGTGAGTTTCTGGTGCAGCGAGCCCGGGAACTAGTGC
+CCCAGGACCTGTGGGCAGCCAAGGCATGGCTGATCACGGCCCGCAGCCTCTACCCGGCCG
+ACTTCAACATCCAGTATGAAATGTACACCATCGAACGGAATGCCGAGAGGACTGCCACCG
+CAGGGAGGTTGCTGTATGACATGTTTGTGAATTTCCCGGACCAGCCGGTGGTATGGAGAG
+AAATCAGCATCATCACGTCAGCATTGAGGAACGACTCACAAGATAAGCAGACCCAGTTCT
+TACGGAGTTTATTTGAAACCCTTCCCGGTCGGGTCCAGTGTGAAATGTTGTTGAAGGTGA
+CAGAGCAATGCTTCAACACGCTGGAACGATCAGAAATGTTGCTGCTGCTGCTGAGGCGTT
+TCCCTGAGACAGTGGTGCAACACGGGGTTGGCCTCGGGGAGGCCCTGCTGGAAGCTGAAA
+CCATTGAAGAACAAGACTCTCCTGTTAACTGCTTTAGAAAGCTATTTGTTTGTGATGTCC
+TTCCTCTAATAATCAACAACCATGATGTCCGCTTGCCCGCCAATCTCTTATATAAATACT
+TGAACAAAGCAGCTGAATTTTACATCAACTATGTCACTCGGTCCACACAGTCAGAAAATC
+AGCATCAAGGTGCACAGGATACATCTGATTTAATGTCGCCTAGCAAGCGTAGCTCTCAGA
+AGTACATAATAGAAGGACTGACTGAGAAATCATCCCACATCGTCGACCCCTGGGAGAGGT
+TGTTTAAGATTCTGAATGTTGTTGGAATGAGATGCGAATGGCAGATGGATAAAGGGAGAC
+GAAGCTGCAGTGACCTGCTGCACCGGATGAAGGAGCTCTGCAGATACATGAACAGCTTTG
+ACAGCGAAGCTCACAACAACTATAAAAACCAAGTGCTCTACTCCACGATGCTGGTGTTCT
+TCAAGAGTGCGTTCCAGTACGTCAGCAGCATACAGCCATCTCTCTTCCAAGGTCCTAACG
+CCCCAAGCCAGGTTCCACTAATTCTTCTGGAAGATGTGGCCAATGTGTATGGTGATGTAG
+AAATTGATCGCAGTAAACACATACACAAGAAGAGGAAGCTAGCTGAGGGAAGAGAAAAAA
+CCATGAGTTCAGATGATGAAGAGTGTTCAGCGAAAGGCAGAAACCGGCACATTGTTGTCA
+GCAAAGCTGACCTCAGCAACTCCATCGAAGTACTGGAGAGCTTCAAACTGGCCAGGGAAA
+GCTGGGAGTTACTCTACTCTCTGGAATTCCTTGACAAAGAATTTACAAGAATTTGCTTGG
+CTTGGAAGACAGACACCTGGCTGTGGCTAAGAATCTTCCTCACAGATATGATCATCTACC
+AGGGTCAATATAAGAAGGCCATAGCCAGTCTGCATCACTTAGCAGCTCTGCAAGGATCCC
+TTTCTCAGCCACAGATCACAGGACAGGGGACTTTAGAACACCAGAGGGCGCTCATCCAGC
+TGGCAACGTGTCACTTTGCTCTGGGGGAGTACAGAATGACGTGCGAGAAAGTCCTAGATC
+TGATGTGTTACATGGTGCTCCCCATACAAGATGGCGGGAAGCCACAGGAAGAGCCGTCCA
+AAGTAAAGCCCAAGTGTAGAAAAGGTTTGGATCTGAAGCTTCTGCCCTGTACCAGTAAGG
+CTATCATGCCATACTGCCTGCACTTGATGCTGGCCTGCTTTAAGCTGAGAGCTTTTACAG
+ACAGCAGAGACGACATGGCACTGGGCCATGTGATTGTACTGCTCCAGCAGGAGTGGCCAC
+GGGGAGAGAACCTTTTCCTGAAAGCCATCAGTAAGATTTGCCAGCAAGGAAATTTCCAGT
+ATGAGAACTTCTTCAGCTATGTTACAAACATTGATATGCTGGAGGAATTTGCTTATTTAA
+GAACCCAAGAAGGAGGGAAGATTCATCTGGAATTACTCCCAAATCAAGGAATGCTGATCA
+ACCATTGCAGACCTTTTGGGTGGTCCCTCCAGATGAGTGGCAGAGATGTTGTGAGCAGTG
+TACCTCTCCTCCCCTTGGGGCACCACACAGTCACTCGAGGCATCACCAAAGGTGTGAAGG
+AGGACTTCCGCCTGGCCATGGAGCGCCAGGTCTCCCGCTGTGGTGAGAACCTGATGGCGG
+TACTACATCGCTTCTGCATTAATGAGAAGATCTTGCTCCTGCAGACTCTGACCTGATAGA
+CCTCCTGGCCACCAGCGGCTCAGCCATGACAAGCGCTGCCAGACCAGGGCTGATGAAGAA
+GAAAAACACCAAGTTCTAACTCCCTTAGTTGCTTAAAAGTCAATCCGAAGAGTATAGGAA
+GTTATTTCTATTTTTAAGACTTCAGGTTTTTTTAGTTTGTACAAAATAAGATTCAATCCA
+TTTTGTAAATAAAAACCCGAAAGATTTGAAGTTTTAAAAAAAAACTTATTTTTAGTTTCA
+AGTAGGGTACATTTGTCTTCTATTTTTCTAATCATGGCAAAGGGGCAAAAATCCAACACA
+ATTAAATGCAGG
+>TR8|c8_g1_i2 len=2514 path=[3520:0-259 @3555@!:260-1204 3489:1205-1226 3564:1227-1602 3560:1603-1674 3554:1675-2040 3572:2041-2041 3466:2042-2063 3532:2064-2227 3452:2228-2513] [-1, 3520, 3555, 3489, 3564, 3560, 3554, 3572, 3466, 3532, 3452, -2]
+CAGTGGCCACCTGGGGGTTGGCGGCGCCCTAGTGTCGCCTACTGGAAGGGCAAAAACCCG
+GGACCATGTCGGCCCAGGGCGACTGTGAGTTTCTGGTGCAGCGAGCCCGGGAACTAGTGC
+CCCAGGACCTGTGGGCAGCCAAGGCATGGCTGATCACGGCCCGCAGCCTCTACCCGGCCG
+ACTTCAACATCCAGTATGAAATGTACACCATCGAACGGAATGCCGAGAGGACTGCCACCG
+CAGGGAGGTTGCTGTATGACATGTTTGTGAATTTCCCGGACCAGCCGGTGGTATGGAGAG
+AAATCAGCATCATCACGTCAGCATTGAGGAACGACTCACAAGATAAGCAGACCCAGTTCT
+TACGGAGTTTATTTGAAACCCTTCCCGGTCGGGTCCAGTGTGAAATGTTGTTGAAGGTGA
+CAGAGCAATGCTTCAACACGCTGGAACGATCAGAAATGTTGCTGCTGCTGCTGAGGCGTT
+TCCCTGAGACAGTGGTGCAACACGGGGTTGGCCTCGGGGAGGCCCTGCTGGAAGCTGAAA
+CCATTGAAGAACAAGACTCTCCTGTTAACTGCTTTAGAAAGCTATTTGTTTGTGATGTCC
+TTCCTCTAATAATCAACAACCATGATGTCCGCTTGCCCGCCAATCTCTTATATAAATACT
+TGAACAAAGCAGCTGAATTTTACATCAACTATGTCACTCGGTCCACACAGTCAGAAAATC
+AGCATCAAGGTGCACAGGATACATCTGATTTAATGTCGCCTAGCAAGCGTAGCTCTCAGA
+AGTACATAATAGAAGGACTGACTGAGAAATCATCCCACATCGTCGACCCCTGGGAGAGGT
+TGTTTAAGATTCTGAATGTTGTTGGAATGAGATGCGAATGGCAGATGGATAAAGGGAGAC
+GAAGCTGCAGTGACCTGCTGCACCGGATGAAGGAGCTCTGCAGATACATGAACAGCTTTG
+ACAGCGAAGCTCACAACAACTATAAAAACCAAGTGCTCTACTCCACGATGCTGGTGTTCT
+TCAAGAGTGCGTTCCAGTACGTCAGCAGCATACAGCCATCTCTCTTCCAAGGTCCTAACG
+CCCCAAGCCAGGTTCCACTAATTCTTCTGGAAGATGTGGCCAATGTGTATGGTGATGTAG
+AAATTGATCGCAGTAAACACATACACAAGAAGAGGAAGCTAGCTGAGGGAAGAGAAAAAA
+CCATGAGTTCAGATGATGAAGAGTGTTCAGCGAAAGGCAGAAACCGGCACATTGTTGTCA
+GCAAAGCTGACCTCAGCAACTCCATCGAAGTACTGGAGAGCTTCAAACTGGCCAGGGAAA
+GCTGGGAGTTACTCTACTCTCTGGAATTCCTTGACAAAGAATTTACAAGAATTTGCTTGG
+CTTGGAAGACAGACACCTGGCTGTGGCTAAGAATCTTCCTCACAGATATGATCATCTACC
+AGGGTCAATATAAGAAGGCCATAGCCAGTCTGCATCACTTAGCAGCTCTGCAAGGATCCC
+TTTCTCAGCCACAGATCACAGGACAGGGGACTTTAGAACACCAGAGGGCGCTCATCCAGC
+TGGCAACGTGTCACTTTGCTCTGGGGGAGTACAGAATGACGTGCGAGAAAGTCCTAGATC
+TGATGTGTTACATGGTGCTCCCCATACAAGATGGCGGGAAGCCACAGGAAGAGCCGTCCA
+AAGTAAAGCCCAAGTGTAGAAAAGGTTTGGATCTGAAGCTTCTGCCCTGTACCAGTAAGG
+CTATCATGCCATACTGCCTGCACTTGATGCTGGCCTGCTTTAAGCTGAGAGCTTTTACAG
+ACAGCAGAGACGACATGGCACTGGGCCATGTGATTGTACTGCTCCAGCAGGAGTGGCCAC
+GGGGAGAGAACCTTTTCCTGAAAGCCATCAGTAAGATTTGCCAGCAAGGAAATTTCCAGT
+ATGAGAACTTCTTCAGCTATGTTACAAACATTGATATGCTGGAGGAATTTGCTTATTTAA
+GAACCCAAGAAGGAGGGAAGATTCATCTGGAATTACTCCCAAATCAAGGAATGCTGATCA
+AGCACCACACAGTCACTCGAGGCATCACCAAAGGTGTGAAGGAGGACTTCCGCCTGGCCA
+TGGAGCGCCAGGTCTCCCGCTGTGGTGAGAACCTGATGGCGGTACTACATCGCTTCTGCA
+TTAATGAGAAGATCTTGCTCCTGCAGACTCTGACCTGATAGACCTCCTGGCCACCAGCGG
+CTCAGCCATGACAAGCGCTGCCAGACCAGGGCTGATGAAGAAGAAAAACACCAAGTTCTA
+ACTCCCTTAGTTGCTTAAAAGTCAATCCGAAGAGTATAGGAAGTTATTTCTATTTTTAAG
+ACTTCAGGTTTTTTTAGTTTGTACAAAATAAGATTCAATCCATTTTGTAAATAAAAACCC
+GAAAGATTTGAAGTTTTAAAAAAAAACTTATTTTTAGTTTCAAGTAGGGTACATTTGTCT
+TCTATTTTTCTAATCATGGCAAAGGGGCAAAAATCCAACACAATTAAATGCAGG
+>TR8|c8_g1_i3 len=2614 path=[3520:0-259 @3555@!:260-1204 3489:1205-1226 3564:1227-1602 3560:1603-1674 3554:1675-2040 3572:2041-2041 3548:2042-2063 3539:2064-2083 3569:2084-2084 3567:2085-2085 3563:2086-2095 3571:2096-2096 3570:2097-2102 3568:2103-2103 3566:2104-2141 3552:2142-2148 3544:2149-2163 3532:2164-2327 3452:2328-2613] [-1, 3520, 3555, 3489, 3564, 3560, 3554, 3572, 3548, 3539, 3569, 3567, 3563, 3571, 3570, 3568, 3566, 3552, 3544, 3532, 3452, -2]
+CAGTGGCCACCTGGGGGTTGGCGGCGCCCTAGTGTCGCCTACTGGAAGGGCAAAAACCCG
+GGACCATGTCGGCCCAGGGCGACTGTGAGTTTCTGGTGCAGCGAGCCCGGGAACTAGTGC
+CCCAGGACCTGTGGGCAGCCAAGGCATGGCTGATCACGGCCCGCAGCCTCTACCCGGCCG
+ACTTCAACATCCAGTATGAAATGTACACCATCGAACGGAATGCCGAGAGGACTGCCACCG
+CAGGGAGGTTGCTGTATGACATGTTTGTGAATTTCCCGGACCAGCCGGTGGTATGGAGAG
+AAATCAGCATCATCACGTCAGCATTGAGGAACGACTCACAAGATAAGCAGACCCAGTTCT
+TACGGAGTTTATTTGAAACCCTTCCCGGTCGGGTCCAGTGTGAAATGTTGTTGAAGGTGA
+CAGAGCAATGCTTCAACACGCTGGAACGATCAGAAATGTTGCTGCTGCTGCTGAGGCGTT
+TCCCTGAGACAGTGGTGCAACACGGGGTTGGCCTCGGGGAGGCCCTGCTGGAAGCTGAAA
+CCATTGAAGAACAAGACTCTCCTGTTAACTGCTTTAGAAAGCTATTTGTTTGTGATGTCC
+TTCCTCTAATAATCAACAACCATGATGTCCGCTTGCCCGCCAATCTCTTATATAAATACT
+TGAACAAAGCAGCTGAATTTTACATCAACTATGTCACTCGGTCCACACAGTCAGAAAATC
+AGCATCAAGGTGCACAGGATACATCTGATTTAATGTCGCCTAGCAAGCGTAGCTCTCAGA
+AGTACATAATAGAAGGACTGACTGAGAAATCATCCCACATCGTCGACCCCTGGGAGAGGT
+TGTTTAAGATTCTGAATGTTGTTGGAATGAGATGCGAATGGCAGATGGATAAAGGGAGAC
+GAAGCTGCAGTGACCTGCTGCACCGGATGAAGGAGCTCTGCAGATACATGAACAGCTTTG
+ACAGCGAAGCTCACAACAACTATAAAAACCAAGTGCTCTACTCCACGATGCTGGTGTTCT
+TCAAGAGTGCGTTCCAGTACGTCAGCAGCATACAGCCATCTCTCTTCCAAGGTCCTAACG
+CCCCAAGCCAGGTTCCACTAATTCTTCTGGAAGATGTGGCCAATGTGTATGGTGATGTAG
+AAATTGATCGCAGTAAACACATACACAAGAAGAGGAAGCTAGCTGAGGGAAGAGAAAAAA
+CCATGAGTTCAGATGATGAAGAGTGTTCAGCGAAAGGCAGAAACCGGCACATTGTTGTCA
+GCAAAGCTGACCTCAGCAACTCCATCGAAGTACTGGAGAGCTTCAAACTGGCCAGGGAAA
+GCTGGGAGTTACTCTACTCTCTGGAATTCCTTGACAAAGAATTTACAAGAATTTGCTTGG
+CTTGGAAGACAGACACCTGGCTGTGGCTAAGAATCTTCCTCACAGATATGATCATCTACC
+AGGGTCAATATAAGAAGGCCATAGCCAGTCTGCATCACTTAGCAGCTCTGCAAGGATCCC
+TTTCTCAGCCACAGATCACAGGACAGGGGACTTTAGAACACCAGAGGGCGCTCATCCAGC
+TGGCAACGTGTCACTTTGCTCTGGGGGAGTACAGAATGACGTGCGAGAAAGTCCTAGATC
+TGATGTGTTACATGGTGCTCCCCATACAAGATGGCGGGAAGCCACAGGAAGAGCCGTCCA
+AAGTAAAGCCCAAGTGTAGAAAAGGTTTGGATCTGAAGCTTCTGCCCTGTACCAGTAAGG
+CTATCATGCCATACTGCCTGCACTTGATGCTGGCCTGCTTTAAGCTGAGAGCTTTTACAG
+ACAGCAGAGACGACATGGCACTGGGCCATGTGATTGTACTGCTCCAGCAGGAGTGGCCAC
+GGGGAGAGAACCTTTTCCTGAAAGCCATCAGTAAGATTTGCCAGCAAGGAAATTTCCAGT
+ATGAGAACTTCTTCAGCTATGTTACAAACATTGATATGCTGGAGGAATTTGCTTATTTAA
+GAACCCAAGAAGGAGGGAAGATTCATCTGGAATTACTCCCAAATCAAGGAATGCTGATCA
+AGTTCCAAACAAATTCTCTGAAGCCATTGCAGACCTTTTGGGTGGTCCCTCCAGATGAGT
+GGCAGAGATGTTGTGAGCAGTGTACCTCTCCTCCCCTTGGGGCACCACACAGTCACTCGA
+GGCATCACCAAAGGTGTGAAGGAGGACTTCCGCCTGGCCATGGAGCGCCAGGTCTCCCGC
+TGTGGTGAGAACCTGATGGCGGTACTACATCGCTTCTGCATTAATGAGAAGATCTTGCTC
+CTGCAGACTCTGACCTGATAGACCTCCTGGCCACCAGCGGCTCAGCCATGACAAGCGCTG
+CCAGACCAGGGCTGATGAAGAAGAAAAACACCAAGTTCTAACTCCCTTAGTTGCTTAAAA
+GTCAATCCGAAGAGTATAGGAAGTTATTTCTATTTTTAAGACTTCAGGTTTTTTTAGTTT
+GTACAAAATAAGATTCAATCCATTTTGTAAATAAAAACCCGAAAGATTTGAAGTTTTAAA
+AAAAAACTTATTTTTAGTTTCAAGTAGGGTACATTTGTCTTCTATTTTTCTAATCATGGC
+AAAGGGGCAAAAATCCAACACAATTAAATGCAGG
+>TR8|c8_g1_i4 len=574 path=[3420:0-43 3569:44-44 3567:45-45 3563:46-55 3571:56-56 3570:57-62 3568:63-63 3566:64-101 3552:102-108 3544:109-123 3532:124-287 3452:288-573] [-1, 3420, 3569, 3567, 3563, 3571, 3570, 3568, 3566, 3552, 3544, 3532, 3452, -2]
+CTTAGGGGTGTTGGAGGATAGAGCCATTGCAGACCTTTTGGGTGGTCCCTCCAGATGAGT
+GGCAGAGATGTTGTGAGCAGTGTACCTCTCCTCCCCTTGGGGCACCACACAGTCACTCGA
+GGCATCACCAAAGGTGTGAAGGAGGACTTCCGCCTGGCCATGGAGCGCCAGGTCTCCCGC
+TGTGGTGAGAACCTGATGGCGGTACTACATCGCTTCTGCATTAATGAGAAGATCTTGCTC
+CTGCAGACTCTGACCTGATAGACCTCCTGGCCACCAGCGGCTCAGCCATGACAAGCGCTG
+CCAGACCAGGGCTGATGAAGAAGAAAAACACCAAGTTCTAACTCCCTTAGTTGCTTAAAA
+GTCAATCCGAAGAGTATAGGAAGTTATTTCTATTTTTAAGACTTCAGGTTTTTTTAGTTT
+GTACAAAATAAGATTCAATCCATTTTGTAAATAAAAACCCGAAAGATTTGAAGTTTTAAA
+AAAAAACTTATTTTTAGTTTCAAGTAGGGTACATTTGTCTTCTATTTTTCTAATCATGGC
+AAAGGGGCAAAAATCCAACACAATTAAATGCAGG
+>TR8|c8_g2_i1 len=338 path=[3486:0-51 3487:52-337] [-1, 3486, 3487, -2]
+GCTCCGGCAGACTCTGACCTGATAGCCCCCCTGGCCACCAGCGGCTCAGCCATGACAAGC
+GCTGCCAGACCAGGGCTGATGAAGAAGAAAAACACCAAGTTCTAACTCCCTTAGTTGCTT
+AAAAGTCAATCCGAAGAGTATAGGAAGTTATTTCTATTTTTAAGACTTCAGGTTTTTTTA
+GTTTGTACAAAATAAGATTCAATCCATTTTGTAAATAAAAACCCGAAAGATTTGAAGTTT
+TAAAAAAAAACTTATTTTTAGTTTCAAGTAGGGTACATTTGTCTTCTATTTTTCTAATCA
+TGGCAAAGGGGCAAAAATCCAACACAATTAAATGCAGG
+>TR8|c9_g1_i1 len=236 path=[1166:0-34 1223:35-37 1221:38-54 @1218@!:55-209 1187:210-235] [-1, 1166, 1223, 1221, 1218, 1187, -2]
+AAGTTAGAAATGTCTCAAGGCACCATAAAGTACTATGCATCAGTTTGTGCCCAGCAGGAG
+TCAGATCTTTAACCCTCAAAGACACCGAGCTGAGTTAGCCAGCTAGACTAGAAATGTCCG
+TGCACCACTATTTTCTCGTGGCCCTGCTGTCTTCCCAGAAGCTCTTTAAAATGCCTGGGT
+TGTTCAGAGTGGTTTGTTTTCACCCGGTGTCACTCCTGCGCTGCCGCTGCGGGGGG
+>TR8|c9_g1_i2 len=316 path=[1178:0-86 1179:87-90 1223:91-93 1221:94-110 @1218@!:111-265 1192:266-297 1193:298-315] [-1, 1178, 1179, 1223, 1221, 1218, 1192, 1193, -2]
+CTGCACACGATGATAACTTGTACTTGGCTCAGTTTTGGGTTGCAGCCCAGGGACTCAAGT
+TAGAAATATCTCAAGGCACCATAAAGTACTATGCATCAGTTTGTGCCCAGCAGGAGTCAG
+ATCTTTAACCCTCAAAGACACCGAGCTGAGTTAGCCAGCTAGACTAGAAATGTCCGTGCA
+CCACTATTTTCTCGTGGCCCTGCTGTCTTCCCAGAAGCTCTTTAAAATGCCTGGGTTGTT
+CAGAGTGGTTTGTTTTCACCCGGTGTTACTTCTGCGCTGCCGCTGCCGAGGTGACTCCCG
+CTCACTTTCTCTGTAA
+>TR8|c9_g2_i1 len=709 path=[1194:0-54 1219:55-177 1222:178-212 1214:213-236 1217:237-411 1197:412-429 1212:430-585 1206:586-614 1207:615-627 1208:628-708] [-1, 1194, 1219, 1222, 1214, 1217, 1197, 1212, 1206, 1207, 1208, -2]
+AGTGGTTTGTTTTCACCCGGTGTTACTTCTGCGCTGCCGCTGCCGAGGTGACTCCTGCTC
+ACTTTCTATGTAATAATGCGGTTTAGAAGCACAAGCCTTCAGCGTGATAGCCACAGCCTC
+AGTTTTCTCAGTAGTTGAACTTTGTGACTTGGAGGAGAGTCAGGGGATAGGCAGGAAACA
+GAGGTAGCTTTTGTTTGTCTGAAATTGTCACATTCCCAAACTAGCAGCCAAAATGCCTCT
+GTTTGTGGTGGAGTCCACTGAATTTTGCTAGACTTTTCTTTTCCTCTGTTCATTTTGTTG
+TCCTTATTTCTGGGGTTCTGTTTGTCCTTTCCCGTCCTAACGCACGGCTCTTGGCGCACA
+GTTAGACACCTCTTGGCTTTTGCTCCCATTTAACCCACCCACAGATGAGCAAGCACATGA
+ATAGCTCTACTCTTCATAGACCCTCACAGGCAGTGGTTGTACCTTTCCAACCTGTGACAT
+GGTTCTGTCTCAGGACAAAAGTCTGGATGGACATGGCACTCAAAGGACCTGCCCTGCCTT
+AGCTCCCTGGGGATAGGCCTGCACCCCGGGACCCCAGCGGCTGTGTGGAGGCCAGAACTT
+CTCTGCACCTAGCAGCCATGGAAGGCCTGCCAGAGAGCTCCTTGGTGACTGGGGCATGCT
+TCCCTCTTCCTGCTGTTGTCTCTCTGGTCTGTGGCCTGGTCTCCGGCAC
+>TR9|c0_g1_i1 len=509 path=[7502:0-44 7503:45-48 7504:49-50 7505:51-508] [-1, 7502, 7503, 7504, 7505, -2]
+TCCTCCCTCTCTTAGGGTTTTAAAAGACAAGCCATTAAAATAGATGACCTTTCACAGACT
+GAAACTTGAATCACTGCAAAATGAATCTAGGTTGCTGTCACTTTTTCTTTTGGGTGGCGG
+GGCTTGATGTAGATTTTATTCTATGTACAGAATTTAATGTTGAATATATTAAAAATAACA
+AACCTGGCATGGTTTTGGGAGGTTAGATTTACTGGAAATGTATTCATACTGTGAACTGTG
+CTCTGATGGTTAGAATGAAAAGCTTATCAAGCATTCCATATAACAGTGGATGTAGAAAAT
+GTTTTCAGGTGGATATGTATATGGTACAGATGTAAAGTTTTCTATGTAAAAAATTCTGTA
+CAACTTTCTGTACAATATTGATTCTCATCTGGCATATCTAATCAGGTTATAGGTCAATAA
+AGTTTTTGAATTATTTCATCAGTGCAGTGTAACCCACAGCCCTGTTTTCATTGTTTTTTG
+TTTGTTTTAATTAAAGGTCAAACCATGAG
+>TR9|c0_g2_i1 len=530 path=[7513:0-49 7514:50-69 7515:70-71 7516:72-529] [-1, 7513, 7514, 7515, 7516, -2]
+GAACAACACCTCCCTGTGACATCCCCCCTCTCTTGGGGTTTTAAAAAACAAGCCATTAAA
+ATAGATGACCTTTCACAGACTGAAACTTGAATCACTGCAAAATGAATCTAGGTTGCTGTC
+ACTTTTTCTTTTGGGTGGCGGGGCTTGATGTAGATTTTATTCTATGTACAGAATTTAATG
+TTGAATATATTAAAAATAACAAACCTGGCATGGTTTTGGGAGGTTAGATTTACTGGAAAT
+GTATTCATACTGTGAACTGTGCTCTGATGGTTAGAATGAAAAGCTTATCAAGCATTCCAT
+ATAACAGTGGATGTAGAAAATGTTTTCAGGTGGATATGTATATGGTACAGATGTAAAGTT
+TTCTATGTAAAAAATTCTGTACAACTTTCTGTACAATATTGATTCTCATCTGGCATATCT
+AATCAGGTTATAGGTCAATAAAGTTTTTGAATTATTTCATCAGTGCAGTGTAACCCACAG
+CCCTGTTTTCATTGTTTTTTGTTTGTTTTAATTAAAGGTCAAACCATGAG
+>TR9|c0_g3_i1 len=528 path=[7519:0-47 7520:48-67 7521:68-69 7522:70-527] [-1, 7519, 7520, 7521, 7522, -2]
+ACAACCCCTACCTGTGACATCCCCGCTCTCTTGGGGTTTTAAAAAACAAGCCATTAAAAT
+AGATGACCTTTCACAGACTGAAACTTGAATCACTGCAAAATGAATCTAGGTTGCTGTCAC
+TTTTTCTTTTGGGTGGCGGGGCTTGATGTAGATTTTATTCTATGTACAGAATTTAATGTT
+GAATATATTAAAAATAACAAACCTGGCATGGTTTTGGGAGGTTAGATTTACTGGAAATGT
+ATTCATACTGTGAACTGTGCTCTGATGGTTAGAATGAAAAGCTTATCAAGCATTCCATAT
+AACAGTGGATGTAGAAAATGTTTTCAGGTGGATATGTATATGGTACAGATGTAAAGTTTT
+CTATGTAAAAAATTCTGTACAACTTTCTGTACAATATTGATTCTCATCTGGCATATCTAA
+TCAGGTTATAGGTCAATAAAGTTTTTGAATTATTTCATCAGTGCAGTGTAACCCACAGCC
+CTGTTTTCATTGTTTTTTGTTTGTTTTAATTAAAGGTCAAACCATGAG
+>TR9|c0_g4_i1 len=7195 path=[7495:0-1805 7496:1806-1823 @7534@!:1824-5598 7533:5599-5739 7532:5740-6174 7529:6175-6730 7489:6731-6734 7490:6735-6736 7491:6737-7194] [-1, 7495, 7496, 7534, 7533, 7532, 7529, 7489, 7490, 7491, -2]
+CGGGCCGCCGGGGCGGGGTGCCGCCGCCGCCGGGCCGTAGGGACGAGTGAGGCGGGCGGC
+CGGGAAGCGACCCCCGGGCCGACGGCGCCGAGGCCGGACGGGCGCGGCCCTCGAACGGCG
+GCCCCTCGAGCGTGGCGAGGCTTTCGACGCCCTTGGCGGCCCCGCGGCCGCTCCGCGTCG
+CCGGCCGCTTCCTGGTGCCGCCGCTGCCCTCCACGCCTCCTCGCCCCCACCGCCACCTCC
+TCGCCTTTCTCCCTCCCCGTCCTCATCCCGGTCCCCGTCCCCCTCCTCCGCCTTCCCTCC
+AGCCGCCGGGACCGCCGCCGCCGCCGCCTCCTCCGCGTCCATGTATGAGGGCAAGAAGAC
+GAAGAACATGTTCCTGACCCGGGCCCTGGAGAAGATTCTGGCCGACAAGGAAGTGAAGAA
+GGCGCATCACTCCCAGCTGCGCAAAGCGTGCGAGGTGGCCCTAGAGGAAATAAAAGTTGA
+AACTGAGAAACAAAGCCCTCCTCATGGAGAAGCAAAAGCTGGATCAGGCACCCTTCCACC
+AGTGAAATCAAAGACAAATTTTATTGAAGCAGACAAGTACTTTTTACCCTTTGAGTTGGC
+ATGCCAGTCCAAATGTCCCCGCATAGTTAGTACATCTCTAGATTGTTTGCAGAAACTTAT
+TGCTTATGGGCACTTGACTGGCAGGGCTCCAGATAGTACGACACCAGGCAAAAAATTAAT
+TGATAGAATTATTGAAACAATATGTGGCTGCTTCCAAGGTCCTCAAACAGATGAAGGAGT
+TCAGTTGCAGATAATAAAGGCTTTACTTACCGCAGTGACATCACAACACATAGAAATCCA
+TGAAGGAACTGTGCTGCAAGCTGTGAGGACATGCTACAATATCTATTTAGCCAGCAAAAA
+TCTCATCAATCAGACAACAGCCAAAGCTACTCTTACTCAAATGCTGAACGTTATCTTTGC
+ACGCATGGAAAACCAAGCATTACAGGAGGCCAAACAAATGGAAAGAGAAAGACATCGGCA
+GCAGCAGCATTTGTTACAGTCTCCAGTAAGCCATCATGAGCCCGAGTCACCTCATCTTAG
+ATATTTGCCACCTCAGACTGTTGATCATATAAACCAAGAGCATGAAGGGGATCTTGAGCC
+CCAAACACATGATGTGGATAAAAGTCTCCAAGATGATACAGAGCCTGAAAACGGATCTGA
+TATTTCCAGTGCAGAAAATGAACAGACAGAAGCTGATCAGGCAACTGCAGCTGAAACATT
+ATCTAAAAATGATATCTTGTATGATGGAGACTATGAAGAAAAGCCACTTGATATTGTCCA
+GAGCATTGTAGAAGAAATGGTGAACATCATTGTTGGAGACATGGGAGAAGGGATGGCTAT
+CAGTGCAAGTACAGAAGGCAACACTGGAACTGTAGAAGATGGTAGTGACAGTGAAAACAT
+CCAAGCAAATGGAATCCCAGGAACACCCATTTCTGTTGCATATACACCATCGTTACCTGA
+CGACAGGTTATCTGTCTCCTCCAATGATACTCAGGAATCTGGAAATTCTTCAGGACCTTC
+ACCTGGTGCTAAGTTTTCCCACATTTTACAAAAGGATGCCTTTCTAGTGTTCAGGTCATT
+GTGTAAGCTGTCAATGAAACCACTGTCAGATGGACCACCAGATCCAAAGTCTCATGAGTT
+ACGGTCCAAGATTCTTTCATTGCAGTTGCTTCTGTCCATTCTGCAGAATGCAGGACCTGT
+TTTCAGGACAAATGAGATGTTTATTAATGCTATCAAGCAGTATCTATGTGTTGCACTCTC
+AAAAAAACGGAGTCTCATCTGTTCCAGAGGTTTTTGAGCTTTCTCTTTCCATATTTCTTA
+CTTTGTTGTCAAACTTCAAGACACATCTGAAGATGCAAATTGAGGTATTCTTTAAAGAAA
+TCTTCCTGTACATTTTGGAAACGTCTACAAGCTCATTTGACCATAAGTGGATGGTTATTC
+AGACACTGACAAGGATCTGTGCAGATGCTCAGAGTGTGGTGGACATTTATGTAAATTATG
+ACTGTGACCTAAATGCAGCAAATATATTTGAAAGACTAGTAAATGACCTGTCGAAAATTG
+CCCAAGGAAGGGGCAGCCAAGAACTTGGTATGAGTAATGTTCAGGAATTGAGCCTGCGAA
+AAAAGGGGTTAGAATGTTTAGTTTCAATTTTGAAATGTATGGTTGAATGGAGCAAGGATC
+AGTATGTGAACCCCAACTCTCAAACTACCCTTGGTCAGGAAAAACCCTCAGAGCAAGAGA
+TAAGTGAAGTTAAACACCCAGAGACTATAAACAGATATGGAAGTTTAAACTCCTTAGAAT
+CCACATCATCATCAGGAATTGGCAGCTACAGTACACAGATGTCTGGCACTGATAATCCAG
+AACAATTTGAGGTCCTAAAGCAGCAAAAAGAAATAATAGAACAAGGGATTGATTTATTTA
+ATAAGAAACCAAAGAGAGGAATACAATACCTCCAAGAACAAGGGATGCTTGGCACCACAC
+CCGAAGATATAGCTCAGTTCTTACATCAAGAAGAAAGATTAGACTCTACTCAGGTGGGTG
+AGTTCCTGGGAGATAATGATAAATTCAATAAAGAAGTCATGTATGCATATGTAGACCAAC
+ATGACTTTTCAGGAAAAGACTTTGTTTCAGCTCTTCGTCTATTTCTGGAAGGATTCCGGC
+TTCCAGGAGAAGCTCAGAAAATTGATCGATTAATGGAAAAATTTGCTGCAAGATACCTAG
+AGTGCAACCAAGGACAAACCCTTTTTGCTAGTGCAGATACTGCTTATGTTTTGGCCTACT
+CAATTATCATGTTGACTACAGACCTTCACAGTCCACAGGTTAAAAACAAAATGACAAAAG
+AACAGTACATTAAAATGAATCGTGGTATCAATGACAGTAAAGATCTCCCTGAAGAGTATC
+TATCAGCCATTTATAACGAAATAGCTGGGAAAAAAATATCAATGAAAGAAACAAAAGAAC
+TAACAATCCCTACAAAGTCAACTAAACAGAATGTAGCCAGTGAAAAGCAAAGACGACTTC
+TGTATAACTTAGAAATGGAACAGATGGCCAAGACGGCTAAAGCACTCATGGAAGCTGTGA
+GCCATGTTCAGGCACCTTTTACAAGTGCAACACACTTGGAGCACGTGAGGCCGATGTTTA
+AGTTGGCTTGGACACCTTTTCTGGCTGCATTCAGTGTGGGTCTCCAAGACTGTGATGATA
+CTGAAGTAGCCTCTCTTTGCCTAGAAGGGATAAGATGTGCTATCAGGATTGCATGCATTT
+TCAGCATTCAGCTGGAAAGAGATGCATATGTCCAAGCACTAGCCAGATTTACCTTACTTA
+CAGTGAGTTCTGGTATTACTGAAATGAAACAGAAGAATATCGACACAATAAAAACACTCA
+TCACGGTGGCTCACACTGATGGAAATTATTTAGGAAATTCGTGGCATGAGATCCTGAAGT
+GCATCAGTCAGTTAGAGCTGGCACAACTTATAGGAACTGGAGTGAAGCCTCGGTACATTT
+CTGGGACTGTGAGAGGCAGAGAAGGGTCTCTCACTGGGACAAAAGATCAGGCTCCAGATG
+AATTTGTTGGTCTAGGGCTAGTTGGAGGAAATGTGGACTGGAAGCAGATAGCCAGTATTC
+AGGAGTCTATTGGAGAAACCAGCTCTCAAAGTGTGGTAGTTGCTGTGGATAGAATATTCA
+CCGGATCCACAAGGCTAGATGGAAATGCTATTGTTGATTTTGTCCGTTGGCTATGTGCTG
+TGTCTATGGATGAATTGCTTTCTACTACACACCCAAGAATGTTTAGTCTACAAAAAATAG
+TAGAAATATCATACTATAACATGGGAAGAATAAGACTGCAGTGGTCTCGGATTTGGGAAG
+TTATTGGAGATCATTTTAATAAGGTTGGTTGCAATCCTAATGAAGATGTAGCCATATTTG
+CAGTAGACTCTCTGAGGCAGCTATCAATGAAGTTTTTAGAGAAAGGAGAGCTTGCAAACT
+TCAGATTCCAAAAGGATTTCTTACGACCTTTTGAACATATAATGAAACGAAACAGGTCTC
+CAACAATTCGAGATATGGTTGTACGGTGTATAGCACAAATGGTTAATTCTCAGGCTGCAA
+ATATTCGTTCAGGATGGAAGAACATTTTCTCAGTATTCCATCTAGCTGCATCAGACCAAG
+ATGAAAGCATAGTAGAACTTGCATTTCAGACAACAGGGCACATTGTCACTCTTGTATTTG
+AAAAACACTTTCCGGCCACCATTGATTCTTTCCAGGATGCAGTGAAGTGTTTGTCTGAAT
+TCGCATGTAATGCAGCTTTCCCAGACACAAGTATGGAAGCAATCCGACTTATTCGCCATT
+GTGCAAAATATGTGTCTGATAGACCGCAGGCTTTCAAGGAGTACACAAGTGATGACATGA
+GCGTGGCACCTGAAGACAGGGTGTGGGTGAGAGGGTGGTTCCCGATCCTCTTTGAGTTGT
+CTTGTATCATCAATAGATGCAAATTAGATGTAAGAACCAGGGGCTTAACAGTAATGTTTG
+AAATAATGAAAACATATGGCCACACTTATGAAAAACATTGGTGGCAGGACTTATTCAGAA
+TTGTTTTCAGAATCTTTGACAACATGAAATTGCCAGAACAGCAGACAGAGAAAGCTGAAT
+GGATGACAACAACTTGTAACCATGCCCTTTATGCAATATGTGATGTATTCACCCAGTATT
+TAGAAGTTCTCAGCGATGTACTTTTGGATGATATTTTTGCCCAGCTTTACTGGTGTGTAC
+AACAAGACAATGAGCAGTTAGCACGATCTGGTACAAACTGCTTAGAAAACGTGGTTATTC
+TGAATGGTGAAAAGTTTACTCTTGAAATCTGGGATAAAACGTGTAACTGCACCCTGGATA
+TCTTCAAAACCACAATTCCTCACGCGCTTCTGACTTGGCGTCCCACCTCTGGCGAGGCCG
+AACCCCCATCTCCATCAGCTGTGAGTGAAAAGCCGTTGGATGCAATATCACAAAAATCTG
+TAGACATACATGATTCTATTCAACCAAGATCTTCAGATAACAGACAGCAAGCACCACTGG
+TTTCTGTTTCTACTGTGAGTGAAGAAGTTAGCAAAGTGAAATCCACAGCAAAATTCCCAG
+AACAAAAATTGTTTGCTGCCCTGTTGATTAAATGTGTTGTGCAGCTGGAACTCATCCAGA
+CCATCGACAACATTGTCTTCTTCCCAGCCACAAGCAAGAAGGAGGATGCAGAGAACTTAG
+CTGCAGCCCAGAGAGATGCAGTAGACTTCGATGTTCGAGTTGATACTCAAGACCAAGGAA
+TGTACCGCTTTTTAACATCACAACAACTGTTCAAGCTACTGGACTGCTTATTAGAGTCGC
+ATAGATTTGCAAAAGCATTTAATTCCAACAATGAACAGAGGACTGCTCTGTGGAAAGCAG
+GCTTCAAAGGCAAGTCCAAGCCCAATCTTCTAAAACAGGAGACAAGCAGCCTGGCGTGTG
+GGCTGCGCATTCTCTTCCGGATGTACATGGACGAGAGCAGAGTCAGTGCCTGGGAAGAAG
+TCCAGCAGAGGCTTTTAAACGTCTGCAGGGAAGCGCTGAGCTACTTCCTCACTCTAACAT
+CCGAAAGTCACCGGGAAGCCTGGACTAACTTACTGTTACTGTTCCTCACTAAAGTTCTGA
+AGATCAGTGACAGCAGGTTTAAAGCTCACGCATCATTCTACTACCCTCTCTTATGTGAAA
+TTATGCAATTTGACTTGATTCCGGAACTGCGTGCTGTTCTTAGAAGATTTTTCCTGCGAA
+TTGGAATAGTATTTCAAATATCACAACCACCTGAACAGGAACTTGGGATAAACAGGCAAT
+GATGAGAGCCGATGTTTTTCTGTTGGTGTTTACATTGCTCTGCTCTGTGAAAGGATCCTG
+CAGCAGAGGCTTCCTACCTGAAAAATGTTTCTCTCAATTGTAGTGTGTGAGTTACTGGTA
+AGACGCTTACACCTATAACTCAAGGTCGGAATAGTCCCTCCAGTCCCTTTAGTAACCCAG
+TGGCCTCTGTCTCGTGTTGGGCTCATGTTGAGCAGAAAGGCTGTTCCCACAGCATCAGCC
+TACCTTTAGGGTCCTTCCCTGTCCTCTAAGCAGGGTGAGCCCACACTGTGGCAGGTACGG
+AAATTACCCAAAGAAGTATAGATGTAAAGACTGAGCTTCTGCGAGAAGTACAACTCAGGA
+GAGCTGTATTTTGAAGGATAAAATGTTTATAATTGGGGGTGGGGGAAGGGAGAAAAAAAT
+TATTGCTCATGGTAAAAGATATTTAGCAACTATGGTATTCTTACTCTGAAGATTTTTGCA
+CACTCAGGCTATCTGAGACACCGGAAATCATCATCTTTCTGTGAAAATGTACAGAGATGC
+AGGTCTGTAATATAAAAATCTTAAACATATTGTTCCTCCTGCACTGTTTTATTTCTTTAT
+TTTCTTATCTACTTGCTAAATACCCATAATATTTTGTCAAATGCACTAAAACATTTGGGT
+TGAACTTTTAGTCTTTGGGGGAGTGGTGGTCATTTTGAGGGCTTGCTGTGCCCTGAATCT
+GTTGTGGCTGATGCCTGTCAAGATGACAACAGGAGGGGATCCACCAAGGTAGAAAACATC
+CCTGCTGACAAGACCTACCTGTGACATACTCACTCTCTTAGGGCTTTTAAAGACAAGCCA
+TTAAAATAGATGACCTTTCACAGACTGAAACTTGAATCACTGCAAAATGAATCTAGGTTG
+CTGTCACTTTTTCTTTTGGGTGGCGGGGCTTGATGTAGATTTTATTCTATGTACAGAATT
+TAATGTTGAATATATTAAAAATAACAAACCTGGCATGGTTTTGGGAGGTTAGATTTACTG
+GAAATGTATTCATACTGTGAACTGTGCTCTGATGGTTAGAATGAAAAGCTTATCAAGCAT
+TCCATATAACAGTGGATGTAGAAAATGTTTTCAGGTGGATATGTATATGGTACAGATGTA
+AAGTTTTCTATGTAAAAAATTCTGTACAACTTTCTGTACAATATTGATTCTCATCTGGCA
+TATCTAATCAGGTTATAGGTCAATAAAGTTTTTGAATTATTTCATCAGTGCAGTGTAACC
+CACAGCCCTGTTTTCATTGTTTTTTGTTTGTTTTAATTAAAGGTCAAACCATGAG
+>TR9|c0_g5_i1 len=530 path=[7506:0-54 7507:55-57 7508:58-71 7509:72-529] [-1, 7506, 7507, 7508, 7509, -2]
+CGAAAACCCCTCCCTGTGACATCCTCCCTCTTTTGGGGTTTTAAAAGAAAAGCCATTAAA
+ATAGATGACCTTTCACAGACTGAAACTTGAATCACTGCAAAATGAATCTAGGTTGCTGTC
+ACTTTTTCTTTTGGGTGGCGGGGCTTGATGTAGATTTTATTCTATGTACAGAATTTAATG
+TTGAATATATTAAAAATAACAAACCTGGCATGGTTTTGGGAGGTTAGATTTACTGGAAAT
+GTATTCATACTGTGAACTGTGCTCTGATGGTTAGAATGAAAAGCTTATCAAGCATTCCAT
+ATAACAGTGGATGTAGAAAATGTTTTCAGGTGGATATGTATATGGTACAGATGTAAAGTT
+TTCTATGTAAAAAATTCTGTACAACTTTCTGTACAATATTGATTCTCATCTGGCATATCT
+AATCAGGTTATAGGTCAATAAAGTTTTTGAATTATTTCATCAGTGCAGTGTAACCCACAG
+CCCTGTTTTCATTGTTTTTTGTTTGTTTTAATTAAAGGTCAAACCATGAG
+>TR9|c0_g6_i1 len=542 path=[7484:0-66 7485:67-69 7486:70-83 7487:84-541] [-1, 7484, 7485, 7486, 7487, -2]
+AACCACCCCTGCTAACAAGCCCTCCCTGTGACATACTCACTCTCTTGGGGTTTTAAAAGA
+AAAGCCATTAAAATAGATGACCTTTCACAGACTGAAACTTGAATCACTGCAAAATGAATC
+TAGGTTGCTGTCACTTTTTCTTTTGGGTGGCGGGGCTTGATGTAGATTTTATTCTATGTA
+CAGAATTTAATGTTGAATATATTAAAAATAACAAACCTGGCATGGTTTTGGGAGGTTAGA
+TTTACTGGAAATGTATTCATACTGTGAACTGTGCTCTGATGGTTAGAATGAAAAGCTTAT
+CAAGCATTCCATATAACAGTGGATGTAGAAAATGTTTTCAGGTGGATATGTATATGGTAC
+AGATGTAAAGTTTTCTATGTAAAAAATTCTGTACAACTTTCTGTACAATATTGATTCTCA
+TCTGGCATATCTAATCAGGTTATAGGTCAATAAAGTTTTTGAATTATTTCATCAGTGCAG
+TGTAACCCACAGCCCTGTTTTCATTGTTTTTTGTTTGTTTTAATTAAAGGTCAAACCATG
+AG
+>TR9|c0_g7_i1 len=509 path=[7492:0-36 7493:37-50 7494:51-508] [-1, 7492, 7493, 7494, -2]
+TACTCACTCTCTTAGGGTTTTAAAAGAAAAGCCATTAAAATAGATGACCTTTCACAGACT
+GAAACTTGAATCACTGCAAAATGAATCTAGGTTGCTGTCACTTTTTCTTTTGGGTGGCGG
+GGCTTGATGTAGATTTTATTCTATGTACAGAATTTAATGTTGAATATATTAAAAATAACA
+AACCTGGCATGGTTTTGGGAGGTTAGATTTACTGGAAATGTATTCATACTGTGAACTGTG
+CTCTGATGGTTAGAATGAAAAGCTTATCAAGCATTCCATATAACAGTGGATGTAGAAAAT
+GTTTTCAGGTGGATATGTATATGGTACAGATGTAAAGTTTTCTATGTAAAAAATTCTGTA
+CAACTTTCTGTACAATATTGATTCTCATCTGGCATATCTAATCAGGTTATAGGTCAATAA
+AGTTTTTGAATTATTTCATCAGTGCAGTGTAACCCACAGCCCTGTTTTCATTGTTTTTTG
+TTTGTTTTAATTAAAGGTCAAACCATGAG
+>TR10|c0_g1_i1 len=348 path=[340:0-93 341:94-117 342:118-118 343:119-347] [-1, 340, 341, 342, 343, -2]
+CTGCCCTGCCCTGCTCTGCCCTGCCCTGCCCTGCCCTGCCCTGTACTTGTCTGTGTGATC
+AAGAATGAACATGTGCAAACACAGACACACACACGCACACACACACACACACACACACAG
+AGCAACTAGAATTATGTTTTCTAGGTGCTGCCAAAGACTAGGTTGTTTTACAGATATTTT
+CTAAAAAGAACAGGCATTCTTATTTCTTCCAAAGGTCACTCTAGTGTATGTTCTGGGTCT
+TAACTTATGGAGGCATAGGTCTTAGGTATAAAGGATTTTCTTGTTAAATCAACTGTCATA
+ATTTGAATAGTGTCACCCAAAGGTCATTGTGTTCAAACTGGCCCTAAC
+>TR10|c0_g2_i1 len=344 path=[344:0-93 345:94-106 346:107-107 347:108-108 348:109-109 349:110-110 350:111-111 351:112-112 352:113-113 353:114-114 354:115-343] [-1, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, -2]
+CTGCCCTGCCCTGCTCTGCCCTGCCCTGCCCTGCCCTGCCCTGTACTTGTCTGTGTGATC
+AAGAATGAACATGTGCAAACACAGACACACACACACACACACACACACACACACAGAGCA
+ACTAGAATTATGTTTTCTAGGTGCTGCCAAAGACTAGGTTGTTTTACAGATATTTTCTAA
+AAAGAACAGGCATTCTTATTTCTTCCAAAGGTCACTCTAGTGTATGTTCTGGGTCTTAAC
+TTATGGAGGCATAGGTCTTAGGTATAAAGGATTTTCTTGTTAAATCAACTGTCATAATTT
+GAATAGTGTCACCCAAAGGTCATTGTGTTCAAACTGGCCCTAAC
+>TR11|c0_g1_i1 len=307 path=[304:0-225 305:226-306] [-1, 304, 305, -2]
+AAATTATTTAGCTTGGAGAGAATAGGGACTGTGTTGTTTATTATAATTATTTGTGTAATA
+CCCTTTCTCAGTATTGTTAAACCATTAGAAGTCTTTTGTCCTCGTGGGGAAAGGTTTGTA
+AATTAGTTATTAGGTTGTTTCTTTGAATGGTAAAGTGGCTTACTTTAATTTTACTTTTAA
+TTTAATGTGGTTTATACTCAATCAAGATAAAGCAATATTTTTAACTTACTGACTTACTCC
+TACAGAGAAGAGTTGTTTATGGGACTTTGTAAAACACCCTCTACCTCTCAGCTACTAAAC
+GCAGGAC
+>TR11|c1_g1_i1 len=312 path=[450:0-36 451:37-54 465:55-60 464:61-160 448:161-164 462:165-196 443:197-311] [-1, 450, 451, 465, 464, 448, 462, 443, -2]
+GTCAGATTAATTTTCTGCAAAAGTTTAGTTCCTTTTTCTCAAGTTGTTTCAGGTAAACTT
+GTAATAGCTATTTAAATAATTGTTATAAAAATATATAATTTATAAAAGCAAGTAAATTGG
+GCTGGTGAGATGGCTCAATGGGTAAGAGCACCCGACTGCTCTTCCAAAGGTCCAAAGTTC
+AAATCCCAGCAACCACATGGTGGCTCATAACCATCCGTAATGAGATCTGACTCCCTCTTC
+TGGAGTGTCTGAAGACAGCTACAGTGTACTTACATATAATCAAAAAAAAAAAATCTTTAA
+AAAAAAAAAAAG
+>TR11|c1_g2_i1 len=247 path=[444:0-95 445:96-99 463:100-131 455:132-246] [-1, 444, 445, 463, 455, -2]
+TTTACCTCACTTTGTAATTGAACTGAATCTGAATTCAGTAACAGAAAATCACAGGGCTGG
+TGAGATGGCTCAGTGGGTAAGAGCACCCGACTGCTCTTCCGAAGGTCCGAAGTTCAAATC
+CCAGCAACCACATGGTGGCTCATAACCATCCGTAATGAGATCTGACTCCCTCTTCTGGAG
+TGTCTGAAGACAGCTACAGTGTACTTACATATAATCAAAAAAAAAAAATCTTTAAAAAAA
+AAAAAAG
+>TR11|c2_g1_i1 len=235 path=[213:0-234] [-1, 213, -2]
+CAACCACTTTCCAGATGACTCTTAATGGCAAGCCTGCACCCCCACCTCAGGTAGAGAAGG
+GCAGAGAATGTGAATGCAGCTGTGGTAAAGAAGTCAGCTGTGCAACCCTGGCTGCTATTT
+TTTACTCAAGATTTAAAGGGTTTTCTTGCTGTTTGGATCATTCTACAGATTGTAACTTTC
+AATTTCTCTCATTTGGACTTGTAATGTTTTGATCAGTGATCAGCTTGAGATAGCA
+>TR12|c0_g1_i1 len=272 path=[299:0-133 300:134-157 305:158-269 298:270-271] [-1, 299, 300, 305, 298, -2]
+GCCTTTGGTGGCTTGAGCCAGTGTTTTCCATCAGAGCATCAGAGTGGTGAGGGTATACCA
+CAGGAAGTCCTTCACCTCATGGCAGAGGAAAAAAAAAAATAGGAAGTGGCCTGGGTTGAC
+TTCTGGCCTACACTACACACACCCACCGAAGGGCATTTGACTGGCTGAGTGGAGAGGGCA
+GACCTGGCTAATGACATCAGCCAGCCAAGGCTGACCACTTCCAAACCCTTTCCTTTGCCG
+TCCTGACCAGATTGTGCCCACCTATGAGAGGA
+>TR12|c2_g1_i1 len=466 path=[524:0-85 525:86-109 530:110-288 529:289-321 527:322-345 518:346-465] [-1, 524, 525, 530, 529, 527, 518, -2]
+GTCCTACCTCTACAGTGCCACTGAAGCAAATGTCCTGTAACCAGGGATGTGAGACCTGGC
+CCCTCTTATCAAAGCGATCCAGGGATCTGATAGTAGTGAAACCTCAGGGCATTCCTTAGA
+GCAGCCTAGCCTTTTCCTCAGCCAATCCAAGAGCAAACAGTTCTGTTGAATGAGTCATGT
+GTAGCTTCAGGCCCCAGAGGTGAAGTTTCCCTGATCAAGTCAGTACTTGTGGGGACTAAG
+ACATGGCTGGCCCATCACTGAGCTCTGTCTTCAGATCACGCCCCTTTCACTGACGGGCAA
+GTCTGTCTCTGAGCTTGGTGTCTCTCATCTAAACACAGCTAAGTGTGTTAGTGTTCTTGT
+CACTGTGAGAGTCTAGAGAGTGAGCTTGGTCTGGCTCTCAGCTTCACGAGTGTCAGCCTT
+TGGTGGCTTGAGCCAGTGTGTTCCATCAGAGCATCAGCGTGGTGAG
+>TR12|c3_g1_i1 len=484 path=[652:0-65 669:66-161 667:162-216 649:217-233 650:234-257 666:258-332 658:333-356 670:357-368 668:369-395 665:396-419 642:420-423 643:424-483] [-1, 652, 669, 667, 649, 650, 666, 658, 670, 668, 665, 642, 643, -2]
+CCAGCGTGGGGCCGGGGGCCGGTGAGTGGCTACCCAGCACCGCGGACAGAGGGGCACCCC
+AAGACCTGTACTCTCTGCCTCTAGGAGGAAGGAGAGTGAAGGGGATAGGATATGAAGTGG
+GTGCCAGACAAGGTGTGGGGATGCTACCACCGATTTGTTCTCCCTACGGCACCAGCTGTA
+GCTTTGGAAGCCGCGCAGCCCCATCTTCCCTAATCTTAGCCCATCCCGTTACTATTTCCA
+GGATAGCCCATCATGCATAGAAAGAAAACAGAGCCCTAGGCAGAGGGAGCCATAACCCAC
+AAGGCATTTGTAGAGAAATGGAAAAAGAGTCGCCCTAGGGTAGCAGCGCAGGGAGCAGGA
+GTCTCCTGTGTCCTGGTGAAGATGCACAGAACAGAAAGCTGGGCCTGCAAGCTGCCTGGC
+TTGTTTGCTTTGGCTTCCTCTCTCCAAAGCCTGACTGTCCTTGGAGTATTCTGGTCCTCT
+GTGG
+>TR12|c4_g1_i1 len=2226 path=[2634:0-75 2716:76-219 2714:220-304 2702:305-325 2713:326-368 2707:369-396 2700:397-420 2712:421-467 2688:468-491 2706:492-540 2721:541-562 2724:563-571 2715:572-584 2710:585-605 @2703@!:606-2032 2640:2033-2225] [-1, 2634, 2716, 2714, 2702, 2713, 2707, 2700, 2712, 2688, 2706, 2721, 2724, 2715, 2710, 2703, 2640, -2]
+AGCTGCCACAGGCTGGGCAGGGCAGTCTCCCAGCAGAGGATCGGGGCGTGTCCCGGTTAG
+AAGTCATGCTTGGAAGGTCTGGCTACCGGGCACTGCCCTTAGGGGATTTTGATCGTTTCC
+AGCAGTCGAGCTTCGGCTTTCTGGGTTCGCAGAAGGGCTGCTTGTCCCCAGAGCCGGGCA
+GCGTGGGGCCGGGGGCCGACGCGCCGGAGAGCTGGCCCTCCTGTCTCTGCCATGGCCTCG
+TCAGTGTCCTGGGGTTCTTGCTGCTGCTGCTCACCTTCCCCATTTCCGGCTGGTTTGCTC
+TGAAGGTTTCTTTTGATCATGATGTTTCTCCCAGTAACATGAGAAACTAGGGCAGTTCCC
+ATCCTTCAGATGGATAAACTGAAGCCCAGACTGAACCAACGGCATCTCGGGAGCCAGGAA
+GGAGCAGAAATTGTTTTCTAGGTCCTGGAATCTGGACATATATATTCCTTTGCAAAATCA
+TCCTCCCTTTGGCTCAGATCCAATCAAAAGAAAAGCACCCAGCATACCCAGCAAGCATGG
+AATAATGAAACTCAGGTCTTGCTTTGCATAACGGTTGCTTAATAGATTGTGCCCACCTAT
+GAGAGGATGATTGTGTTTCGACTGGGCCGGATCCGTAACCCCCAGGGGCCTGGCATGGTT
+CTTCTCCTGCCCTTTATTGACTCCTTCCAGAGGGTAGATTTGAGGACCCGAGCCTTCAAC
+GTTCCTCCTTGCAAGCTGGCCTCTAAGGATGGGGCTGTGCTGTCGGTGGGAGCTGATGTC
+CAGTTCCGCATCTGGGACCCAGTGCTATCCGTGATGGCTGTGAAGGACCTGAACACAGCT
+ACTCGCATGACAGCCCACAACGCCATGACTAAGGCCCTGCTCAGAAGGCCACTGCAGGAG
+ATCCAGATGGAGAAGCTCAAGATCGGTGACCAGCTCCTGCTGGAGATCAATGACGTGACC
+AGAGCTTGGGGACTGGAGGTCGACCGTGTAGAGCTGGCAGTAGAGGCTGTGTTGCAGCCA
+CCGCAAGACAGCCTGACTGTGCCCAGCCTGGACAGCACCCTCCAACAGCTGGCCCTCCAC
+TTGCTAGGGGGAAGTATGAACTCAGCGGTCGGACATGTTCCATCCCCAGGGCCAGACACC
+TTGGAGATGATAAATGAAGTGGAACCTCCTGCCTCTCTTGCTGGGGCCGGGCCTGAGCCC
+AGCCCGAAGCAGCCCGTGGCTGAGGGGCTCCTCACAGCCCTGCAACCCTTCCTGTCAGAG
+GCACTGGTCAGCCAGGTTGGGGCCTGCTACCAGTTCAATGTCATCTTGCCCAGTGGCACC
+CAGAGTATCTACTTCCTGGACCTTACTACAGGACAAGGCCGCGTGGGACATGGAGAGCCT
+GATGGCATCCCTGACGTGGTGGTGGAGATGGCTGAAGCAGACTTGCAGGCCTTGTTGAGC
+AAAGAACTTCGGCCCTTAGGGGCCTACATGAGTGGGCGGCTGAAGGTGAAGGGTGACCTG
+GCCGTGGTCATGAAGCTGGAGGCTGTACTCAAGGCCTTGAAGTAGCCGTGTTGGTTGTCC
+ATCAGACACCTAGCCCTGAACCTGGTGCCAACCCAGAGAAGCCTCTTGGAATAGGAGGCG
+TTGGTTTGGGCCATGGAAAACTGAGGCCTGAAGATGTTTCAGTCCCAACGAGGAGCCCGG
+GAGGCTGGGAGACATCTACTGCTGGTCACAGCTGAGTCGGGTGTACCACCCCTTAGCCTG
+TGGTAGTCCTCTGGACAGGCCTTTGCTCGTTCAATCCCCAACAAATGCTTAGTGCTGAGT
+CGGAACACAGAGTGAAGACAGAGAGCCTGGCCTGCCCTACCCAGCTGATAACCTGACCGA
+CCGGAGAGACGAGAAGCCCAGAAGCTTCTGAATGGCAGCATGTGAAGGGTCAAAGCACAT
+GGATCATGGCTCTGACATTCAGGGAGATCACAGGGAAGGGAAGGTGAGGAAGGGTGGCCC
+TCAAGAAAGGGTTACTGCAGCTGATCCAGGCGGCCCTGCCAGAACAGGCTGGGTGGGGAG
+GGCATGTGATAGAACAATTTGCTTTTCTTATGGGTCTGCTCCTGAAGACACCGGGTCCTA
+TCCTCTGGCTCCATCCTGCATGTTTAAGGAGCTGGGCTCAGGGCAGCATGTGGGAGAGCC
+CTGCTGTTCCGTGCTTATAGAGGCTTGGAGCCTCCAACAAATAAATGTGACATTTACGGT
+GTGGAA
+>TR12|c4_g1_i2 len=1946 path=[2634:0-75 2716:76-219 2714:220-304 2674:305-325 @2703@!:326-1752 2640:1753-1945] [-1, 2634, 2716, 2714, 2674, 2703, 2640, -2]
+AGCTGCCACAGGCTGGGCAGGGCAGTCTCCCAGCAGAGGATCGGGGCGTGTCCCGGTTAG
+AAGTCATGCTTGGAAGGTCTGGCTACCGGGCACTGCCCTTAGGGGATTTTGATCGTTTCC
+AGCAGTCGAGCTTCGGCTTTCTGGGTTCGCAGAAGGGCTGCTTGTCCCCAGAGCCGGGCA
+GCGTGGGGCCGGGGGCCGACGCGCCGGAGAGCTGGCCCTCCTGTCTCTGCCATGGCCTCG
+TCAGTGTCCTGGGGTTCTTGCTGCTGCTGCTCACCTTCCCCATTTCCGGCTGGTTTGCTC
+TGAAGATTGTGCCCACCTATGAGAGGATGATTGTGTTTCGACTGGGCCGGATCCGTAACC
+CCCAGGGGCCTGGCATGGTTCTTCTCCTGCCCTTTATTGACTCCTTCCAGAGGGTAGATT
+TGAGGACCCGAGCCTTCAACGTTCCTCCTTGCAAGCTGGCCTCTAAGGATGGGGCTGTGC
+TGTCGGTGGGAGCTGATGTCCAGTTCCGCATCTGGGACCCAGTGCTATCCGTGATGGCTG
+TGAAGGACCTGAACACAGCTACTCGCATGACAGCCCACAACGCCATGACTAAGGCCCTGC
+TCAGAAGGCCACTGCAGGAGATCCAGATGGAGAAGCTCAAGATCGGTGACCAGCTCCTGC
+TGGAGATCAATGACGTGACCAGAGCTTGGGGACTGGAGGTCGACCGTGTAGAGCTGGCAG
+TAGAGGCTGTGTTGCAGCCACCGCAAGACAGCCTGACTGTGCCCAGCCTGGACAGCACCC
+TCCAACAGCTGGCCCTCCACTTGCTAGGGGGAAGTATGAACTCAGCGGTCGGACATGTTC
+CATCCCCAGGGCCAGACACCTTGGAGATGATAAATGAAGTGGAACCTCCTGCCTCTCTTG
+CTGGGGCCGGGCCTGAGCCCAGCCCGAAGCAGCCCGTGGCTGAGGGGCTCCTCACAGCCC
+TGCAACCCTTCCTGTCAGAGGCACTGGTCAGCCAGGTTGGGGCCTGCTACCAGTTCAATG
+TCATCTTGCCCAGTGGCACCCAGAGTATCTACTTCCTGGACCTTACTACAGGACAAGGCC
+GCGTGGGACATGGAGAGCCTGATGGCATCCCTGACGTGGTGGTGGAGATGGCTGAAGCAG
+ACTTGCAGGCCTTGTTGAGCAAAGAACTTCGGCCCTTAGGGGCCTACATGAGTGGGCGGC
+TGAAGGTGAAGGGTGACCTGGCCGTGGTCATGAAGCTGGAGGCTGTACTCAAGGCCTTGA
+AGTAGCCGTGTTGGTTGTCCATCAGACACCTAGCCCTGAACCTGGTGCCAACCCAGAGAA
+GCCTCTTGGAATAGGAGGCGTTGGTTTGGGCCATGGAAAACTGAGGCCTGAAGATGTTTC
+AGTCCCAACGAGGAGCCCGGGAGGCTGGGAGACATCTACTGCTGGTCACAGCTGAGTCGG
+GTGTACCACCCCTTAGCCTGTGGTAGTCCTCTGGACAGGCCTTTGCTCGTTCAATCCCCA
+ACAAATGCTTAGTGCTGAGTCGGAACACAGAGTGAAGACAGAGAGCCTGGCCTGCCCTAC
+CCAGCTGATAACCTGACCGACCGGAGAGACGAGAAGCCCAGAAGCTTCTGAATGGCAGCA
+TGTGAAGGGTCAAAGCACATGGATCATGGCTCTGACATTCAGGGAGATCACAGGGAAGGG
+AAGGTGAGGAAGGGTGGCCCTCAAGAAAGGGTTACTGCAGCTGATCCAGGCGGCCCTGCC
+AGAACAGGCTGGGTGGGGAGGGCATGTGATAGAACAATTTGCTTTTCTTATGGGTCTGCT
+CCTGAAGACACCGGGTCCTATCCTCTGGCTCCATCCTGCATGTTTAAGGAGCTGGGCTCA
+GGGCAGCATGTGGGAGAGCCCTGCTGTTCCGTGCTTATAGAGGCTTGGAGCCTCCAACAA
+ATAAATGTGACATTTACGGTGTGGAA
+>TR12|c4_g1_i3 len=2104 path=[2693:0-75 2694:76-97 2714:98-182 2702:183-203 2713:204-246 2707:247-274 2700:275-298 2712:299-345 2688:346-369 2706:370-418 2721:419-440 2724:441-449 2715:450-462 2710:463-483 @2703@!:484-1910 2640:1911-2103] [-1, 2693, 2694, 2714, 2702, 2713, 2707, 2700, 2712, 2688, 2706, 2721, 2724, 2715, 2710, 2703, 2640, -2]
+AGCTGCCACAGGCTGGGCAGGGCAGTCTCCCAGCAGAGGATCGGGGCGTGTCCCGGTTAG
+AAGTCATGCTTGGAAGACGCGCCGGAGAGCTGGCCCTCCTGTCTCTGCCATGGCCTCGTC
+AGTGTCCTGGGGTTCTTGCTGCTGCTGCTCACCTTCCCCATTTCCGGCTGGTTTGCTCTG
+AAGGTTTCTTTTGATCATGATGTTTCTCCCAGTAACATGAGAAACTAGGGCAGTTCCCAT
+CCTTCAGATGGATAAACTGAAGCCCAGACTGAACCAACGGCATCTCGGGAGCCAGGAAGG
+AGCAGAAATTGTTTTCTAGGTCCTGGAATCTGGACATATATATTCCTTTGCAAAATCATC
+CTCCCTTTGGCTCAGATCCAATCAAAAGAAAAGCACCCAGCATACCCAGCAAGCATGGAA
+TAATGAAACTCAGGTCTTGCTTTGCATAACGGTTGCTTAATAGATTGTGCCCACCTATGA
+GAGGATGATTGTGTTTCGACTGGGCCGGATCCGTAACCCCCAGGGGCCTGGCATGGTTCT
+TCTCCTGCCCTTTATTGACTCCTTCCAGAGGGTAGATTTGAGGACCCGAGCCTTCAACGT
+TCCTCCTTGCAAGCTGGCCTCTAAGGATGGGGCTGTGCTGTCGGTGGGAGCTGATGTCCA
+GTTCCGCATCTGGGACCCAGTGCTATCCGTGATGGCTGTGAAGGACCTGAACACAGCTAC
+TCGCATGACAGCCCACAACGCCATGACTAAGGCCCTGCTCAGAAGGCCACTGCAGGAGAT
+CCAGATGGAGAAGCTCAAGATCGGTGACCAGCTCCTGCTGGAGATCAATGACGTGACCAG
+AGCTTGGGGACTGGAGGTCGACCGTGTAGAGCTGGCAGTAGAGGCTGTGTTGCAGCCACC
+GCAAGACAGCCTGACTGTGCCCAGCCTGGACAGCACCCTCCAACAGCTGGCCCTCCACTT
+GCTAGGGGGAAGTATGAACTCAGCGGTCGGACATGTTCCATCCCCAGGGCCAGACACCTT
+GGAGATGATAAATGAAGTGGAACCTCCTGCCTCTCTTGCTGGGGCCGGGCCTGAGCCCAG
+CCCGAAGCAGCCCGTGGCTGAGGGGCTCCTCACAGCCCTGCAACCCTTCCTGTCAGAGGC
+ACTGGTCAGCCAGGTTGGGGCCTGCTACCAGTTCAATGTCATCTTGCCCAGTGGCACCCA
+GAGTATCTACTTCCTGGACCTTACTACAGGACAAGGCCGCGTGGGACATGGAGAGCCTGA
+TGGCATCCCTGACGTGGTGGTGGAGATGGCTGAAGCAGACTTGCAGGCCTTGTTGAGCAA
+AGAACTTCGGCCCTTAGGGGCCTACATGAGTGGGCGGCTGAAGGTGAAGGGTGACCTGGC
+CGTGGTCATGAAGCTGGAGGCTGTACTCAAGGCCTTGAAGTAGCCGTGTTGGTTGTCCAT
+CAGACACCTAGCCCTGAACCTGGTGCCAACCCAGAGAAGCCTCTTGGAATAGGAGGCGTT
+GGTTTGGGCCATGGAAAACTGAGGCCTGAAGATGTTTCAGTCCCAACGAGGAGCCCGGGA
+GGCTGGGAGACATCTACTGCTGGTCACAGCTGAGTCGGGTGTACCACCCCTTAGCCTGTG
+GTAGTCCTCTGGACAGGCCTTTGCTCGTTCAATCCCCAACAAATGCTTAGTGCTGAGTCG
+GAACACAGAGTGAAGACAGAGAGCCTGGCCTGCCCTACCCAGCTGATAACCTGACCGACC
+GGAGAGACGAGAAGCCCAGAAGCTTCTGAATGGCAGCATGTGAAGGGTCAAAGCACATGG
+ATCATGGCTCTGACATTCAGGGAGATCACAGGGAAGGGAAGGTGAGGAAGGGTGGCCCTC
+AAGAAAGGGTTACTGCAGCTGATCCAGGCGGCCCTGCCAGAACAGGCTGGGTGGGGAGGG
+CATGTGATAGAACAATTTGCTTTTCTTATGGGTCTGCTCCTGAAGACACCGGGTCCTATC
+CTCTGGCTCCATCCTGCATGTTTAAGGAGCTGGGCTCAGGGCAGCATGTGGGAGAGCCCT
+GCTGTTCCGTGCTTATAGAGGCTTGGAGCCTCCAACAAATAAATGTGACATTTACGGTGT
+GGAA
+>TR12|c4_g2_i1 len=229 path=[2709:0-31 2685:32-44 2701:45-172 2637:173-196 2638:197-228] [2709, 2685, 2701, 2637, 2638, -2]
+AATAATGAAACTCAGGTCTTGCTTTGCATAACGGTTGCTTAATAGGTAAGGGTGAAAGAT
+ACAGATGTAGTTGAACAACACATCTGACTGCTTCAGGGTAGGTGAAGCCCAAGCAGGCTT
+TCCCCTTTGCATAGCCCTAGGCAGTGAAGTCCCTAGAAAGCCTCTGTGTTTGTTGAGTCT
+AGAAAGGAGCGCTGAGGTGAAGCCAGGTCCTACCTCTACAGTGCCACTG
+>TR13|c0_g1_i1 len=261 path=[275:0-189 276:190-260] [-1, 275, 276, -2]
+TGTCTTTCTCTGAGTTTGTTGAGTAGATACTTTGGTTCCTTGTTCTTAGCCTGAAGTAGG
+AAGGTAATAAAGGGAAGGAAATTATTCTTAAATTGAATTCTTACAGAGAAAGTGTTATAA
+AATCATTGTGGCTGAGGACAGAGAGATGGGTCATTTGTTAAGGGTGTTTGCTACCAAGGT
+CATTCTCACATGGGAGAGGGAGAGAACCAACTCCTACAAGTTACCCTCTGACTTCTACAC
+GTATTCTAACACACATGCCCC
+>TR13|c1_g1_i1 len=301 path=[279:0-300] [-1, 279, -2]
+GCCTCTTCCTGAGAAATAACAGGGAGGGTTTCACTGTGTGCTGATCATGCCTTCACCCAG
+GGCTGGATCACTTTTCTTTAAAAACTTTATTTGTGTGTGTGTGTATGCACATGCGTATGC
+ATGCATGGGTTCCCACAGAGGCCAGAGGAGGGCATTGAATCCCCTGGTACTTGAGTTACA
+GGTATTTGGGACCCACTGCATGTGAGTGCCGAGAGCTGATTGCAAGAGCAGCAAGCACTC
+CTAATAAGTGACCCATCTCTCCACCCCCTTGATTTTATTTTGTAACATTACTGTGGTGAG
+G
+>TR14|c0_g1_i1 len=246 path=[261:0-195 262:196-245] [-1, 261, 262, -2]
+GAAAAGCAGAGACGTATTGAGTTCCCAGAGGCCCATTCAGCAGCCCTTCCTGGAGGACAA
+GGCCTCCCAGGGTGCCAGCCTGCTGCTCTCTCCCCAGCTCTCTGACACATGACACAAAAC
+ATGCTGCTTAGGCTGTGCTTGGAAGACACCAGGAAACCAAAGCAGTCTGGCATTACAAAC
+CTGGCTCTTCATATCCCCTTTTCCATTTAAAGTAGGCTGTAGAGCGAGCTAGACAATCAA
+GTAGCA
+>TR14|c1_g1_i1 len=324 path=[327:0-92 328:93-116 329:117-323] [-1, 327, 328, 329, -2]
+CCATATTCTGACCATTAGTTAGACCTAGAGTGTTCACTTCATGCATATCTACGATGTCGG
+CACTGACAGCACACCTTCTGACATTTCTTCCATCCAGTGGAGTCTGTTGATTTTCTCAAC
+ACTTGTCCCCTCTTCTATAGCCTGACTTCTCTTCCTTTTCTGAACACCCCTGGGCGTCTA
+CCCTAACTGCTACCATGACCTATATGTACAACTTTACTCTGTCCACATCTTAATGTCTGT
+GCTCCCTCTATCCCTTGCCTTTGAGGCTTCAAGAGAGGAAGTTTTATGTGAGGGTCTCTT
+TTTCTTATGTAGTACTTAATTGCC
+>TR14|c3_g1_i1 len=422 path=[441:0-290 447:291-364 444:365-421] [-1, 441, 447, 444, -2]
+CTCATAGAATATGTGACCAGTAAGGGTAATGCTATATGTTTACTGACTGCACTACCTACT
+AATTTTGTTTGTACTCAGAACCATGTTCCCACTGCATGTTTCTATTTACTCCGAAGTAAA
+ATCTTTTTTGGTATTGGCAGTACTGTGCTCTGGGTAGTGATTAGGGCAAAAGAAGACACA
+CAATAAAGAACCAGGTGTTAGACGTCAGCAAGTCAAGGCCTTGGTTCTCAGCAGACAGAA
+GACAGCCCTTCTCAATCCTCATCCCTTCCCTGAACAGACATGTCTTCTGCAAGCTTCTCC
+AAGTCAGTTGTTCACAGGAACATCATCAGAATAAATTTGAAATTATGATTAGTATCTGAT
+AAAGCATAGTGTGTGTCTTAAAAGACACGTTGTTAATCACTGTCTGTGCATGAAAAGCAG
+AG
+>TR14|c4_g1_i1 len=272 path=[298:0-50 305:51-200 301:201-224 302:225-271] [-1, 298, 305, 301, 302, -2]
+GAACACAGCCCATTGCTAAACTGGGAAGGATGGATAATCCATCCTGCAGATTCTCAACCT
+TCCGAATGCTGTGACCCTTTAATACAATTAATTCCTCATTACAGCCCCCCCCACCGTAAA
+ATCATTTCCATTGCTACTTTATAATTTTGCTACTGTTATTGATCATAATGTAAATCTCTG
+TGTTTTCTGAGAGGTCTTATGCCAGACCCTATGAAAGGGTGATGCCCATAGGTTGAGAAG
+TGCTATCAGAGGGTAACTATCCTAAGTCTTTT
+>TR14|c7_g1_i1 len=378 path=[402:0-146 403:147-172 410:173-229 408:230-377] [-1, 402, 403, 410, 408, -2]
+GGAGATCTCAAAGGGGGCCTTCCTCAGTCACCCATTCGGGATATAAGGAAGAAAGAATAG
+GTCATTACACACAGGGGGACTGGAGCGGAGTGTCAGCCTTCATATAACTTCAGTGGGAAG
+AGCAGGTGTAGTATAGCGAGGAAGACCACTGTATCTTGGCATGCAGTGGGGGAAAGGAGG
+AATTATAGACCTCAGAGTGACGCTTCTGGTCTCAGTCAAGTTAATGCTCCCCAGAAACAG
+AAAGCACACAACCAAAGCTGGTCTTTACTTTGAAGTTTCGTGATGACATTGTCTTCATGC
+TGCACTCTGGTTGAGCCCCCTCCTGCTCCCTCTGGTGCCCACACATTAGGGTGTGGGACT
+GTACAGGGTACATACAAC
+>TR14|c9_g1_i1 len=242 path=[308:0-103 321:104-147 320:148-179 319:180-180 317:181-203 307:204-241] [-1, 308, 321, 320, 319, 317, 307, -2]
+CTCTGTAACTCCCGACAAGAGCCACGGACGGACCTGGGGCTGCCAGTGATTGGAAGGCCT
+AGGCACTTCACAGGCCTCTTTGCTCTGTAGCTTCTTCTTTATAGGTGTGGACAGGGAGGA
+GGGTGCGGAGGGCTCTTAAGAAGGAAGGTGGCCTGGGTATGAGAGATGCACATCTCAGCT
+GGGCTTCTGTAAGGAAATACATGAGGCTATCCTGGGATATCTCAAAGGGGGCCTTCCTCA
+GT
+>TR14|c10_g1_i1 len=456 path=[515:0-160 520:161-362 519:363-413 511:414-434 512:435-455] [-1, 515, 520, 519, 511, 512, -2]
+TACAAGCCGGGCTCTTCATATCCCCTTTGCCAGTGAAAGCAGGTACTATGGCCAGCTAGA
+CAATCAAGTAGCCTAGGTTGTCACCATTGTGTGGCTCCTAGGTCCACTTGATACCGATCC
+ATCATCCTCTTGGAAGATATTCATCTTAATAGGCAGGGGGTAAACTCTGAACACTGCTAG
+CATCTTAGGAACTGTGGCAGATGTCAGAGGGCTGAGGGAGGCTGTCAGCAGACACTTCCT
+TCTTATCTGTCGTGCTGGGGGTGGGGCTGGAATGCATCTTCCACTTGCCCCGACATTTCC
+TGTAAACATGAGGGGTGTACATTCATGAGGCGTTCAGAGTGGAACATCCTAAGATGCAGG
+CGTGCGCGGGAGAGTTGACCTTTGTCTTGGACAAGCTTTCTCCTGACTGCTGTTTTTCTG
+ATTTCCTTGCAGTTCCTCAGCACTTTGTTTGCCCCC
+>TR14|c11_g1_i1 len=390 path=[617:0-43 630:44-309 625:310-333 626:334-389] [-1, 617, 630, 625, 626, -2]
+TAGAGAGGCTGAGACTGGCTGCCTACAATCTAATCTACCTCGATAACTTAGGACTAACTC
+TTCCTAGAATGTTTGGTTCTTAAGATAAGGCAGCTCATATAAGTAAGCTATCACACAGGC
+CCAGCTCTGCTCAGAATGGGGGAAGGTCAGCACTCTGACCCCTTCTGCTCTCGAGGGCCT
+GTCTTTCCTCCTCGGCTCTTACTCCTTTGAGACTGCACCCCCTAACTTCTGTCTCATCTT
+CATTTATAGGCCTGGACTCTTTGAAGTCTGATATTGATTACAGTGGGATGTCAATTGTCT
+GCTTGCGACAGGGCACCTGGAACCTATTCAGATAAGCAAGAGGTTTCCACTGTGAACCCA
+ACGAGCTGCGAGCTGTGACCTTGCTCTCAG
+>TR14|c12_g1_i1 len=2364 path=[4004:0-610 @4194@!:611-1077 4047:1078-1099 @4211@!:1100-1621 4171:1622-1794 4165:1795-2363] [-1, 4004, 4194, 4047, 4211, 4171, 4165, -2]
+GAGCTCTTCAGGAGGGGGAATGTGCTTGTGGTTTTTGGTCTTGTGCATTTTGTGACAAAG
+GAATTCCCTTTTGAATCGCGCTGTTCCCTTGAAACCCTGGAGCCTCTGGTTCAAGCAGCG
+CAGTCAGTCTGTGCAGTGTCCCTGACGTCATCCGGCGTATGCATAAGCTCTGCTATTGTC
+TTACCGCTAGAGCAGGGCTGAGGACTGCAGTCTCTGCTGCTGCTCGCAGACCTGCCCTGC
+GCTAGCTACCTAGCCCTGCCTCACTGCATCCCTCAAGAGCCGCGGCAGCCTTTCCTTGCC
+TGCTGGATTTTGAGAAGCAGCTCTTCGATTTGGGCTGGTGTAGGAGCCCTGGCTTTCCAT
+TCTCGAGAGAAAGCTGAAGCGCTCAGAGGAGAATCTGGCAGCTGGACATAGCTCGGACTG
+CATTGTCTGGCTTCATGACCCCTGCTGTGTAGCCGGCTCATCTCTTTGCTCTCAGGAGCA
+CATGCACATCTTACATTTTCCTACTTCCTTTTTCTTTTTCTTTCCCTTCTTCTAATTTTT
+TTTTAAAGCACCTTCTGGAGCCAGCCATGTTTGGTACTGAATCTTCATTGAGCATGTTTT
+TGAACACGTTAACCCCAAAGTTCTACGTGGCCCTGACAGGCACTTCCTCGCTAATATCGG
+GACTTATTTTGATATTTGAATGGTGGTATTTTCGCAAGTATGGAACATCTTTCATTGAAC
+AAGTCTCCGTAAGCCACTTGCGCCCCCTTCTGGGAGGGGTTGACAACAACTCTTCCAATA
+ATTCTAATTCCAGTAATGGAGACTCAGATTCCAACAGACAAAGTGTCTCAGAATGCAAAG
+TATGGCGAAATCCACTGAATCTGTTTAGGGGTGCGGAATATAATCGGTACACTTGGGTCA
+CAGGACGAGAGCCTCTGACCTACTATGACATGAACCTCTCTGCCCAGGACCACCAGACAT
+TCTTTACTTGTGATTCAGATCATCTTCGCCCTGCAGATGCAATAATGCAAAAAGCTTGGA
+GAGAAAGGAACCCTCAAGCCAGGATTTCTGCAGCTCATGAAGCCTTGGAGATAAACGAGT
+GTGCAACTGCGTACATTCTCTTGGCGGAAGAAGAAGCGACAACTATTGCTGAAGCAGAAA
+AACTCTTTAAGCAGGCCCTGAAGGCTGGAGATGGTTGTTACCGGCGCTCTCAGCAGCTAC
+AACATCATGGGTCCCAGTATGAAGCTCAACACAGACGAGACACCAATGTCTTAGTCTATA
+TCAAAAGAAGGCTGGCGATGTGTGCCCGGAGACTTGGAAGGACCAGAGAAGCAGTGAAGA
+TGATGAGAGATTTAATGAAGGAGTTTCCCCTCCTAAGCATGTTCAATATCCATGAGAACC
+TTCTAGAAGCTCTTCTGGAACTCCAAGCTTATGCTGATGTTCAGGCAGTCTTAGCAAAGT
+ATGATGATATAAGCTTACCAAAGTCGGCGACAATATGCTACACAGCCGCCCTGCTCAAAG
+CAAGAGCTGTCTCTGACAAATTCTCTCCAGAGGCTGCGTCTCGGAGGGGGCTGAGCACAG
+CAGAGATGAATGCAGTAGAAGCCATCCACAGAGCTGTGGAATTTAATCCACACGTGCCAA
+AATATCTACTAGAAATGAAAAGCTTAATCCTCCCACCAGAACACATCCTGAAGAGAGGAG
+ACAGTGAAGCGATAGCATATGCATTCTTTCATCTTGCACACTGGAAGAGGGTGGAAGGGG
+CTTTGAATCTCTTGCATTGTACGTGGGAAGGCACTTTCCGGATGATCCCGTATCCCCTGG
+AGAAGGGACACCTATTTTATCCATACCCAATCTGTACAGAAACAGCTGACCGGGAGCTGC
+TTCCCTCTTTCCATGAAGTCTCAGTTTACCCAAAGAAGGAACTTCCCTTCTTCATCCTCT
+TCACTGCTGGACTGTGCTCCTTCACAGCCATGCTGGCCCTCCTGACACATCAGTTTCCGG
+AACTTATGGGAGTCTTCGCAAAAGCTTTCCTCAGCACTTTGTTTGCCCCCTTGAACTTTG
+TTATGGAGAAAGTGGAAAGCATCCTCCCCTCCAGTTTGTGGCATCAGCTGACACGGATCT
+GAGGGAGCCTCCCATCCTTCACTTTCCACACCATCCACCATCTCTTCTGTGCCAACCTCT
+CATGGACCGCAAGAAAGCATGACTTTGAAAAAGGGAAACCATTCTGAGATTTTAAACTGC
+TCATGGACTATCAGTTCCTTATTAAAGGCTGGTTTTGTTGTACAAAATTTATTGATGTTC
+AGTTCTATTTTATTTTGCCTTCAAAACTGACTGATCAAAAAGTAAAAAAAATAAATAAAT
+AAACTTTTGTGTATTGCAAGAAAA
+>TR14|c12_g1_i2 len=2166 path=[4166:0-29 4167:30-52 4168:53-60 4169:61-64 4239:65-101 4257:102-102 4259:103-117 4248:118-126 4236:127-131 4221:132-141 4246:142-155 4234:156-166 4219:167-179 4255:180-182 4250:183-191 4243:192-198 4231:199-237 4215:238-245 4242:246-258 4254:259-261 4249:262-271 4241:272-278 4229:279-307 4212:308-343 @4194@!:344-810 4117:811-814 4228:815-901 @4211@!:902-1423 4171:1424-1596 4165:1597-2165] [-1, 4166, 4167, 4168, 4169, 4239, 4257, 4259, 4248, 4236, 4221, 4246 [...]
+CCGGCGGGGGCTCGGAGCGCAGGCCGCGCGCTTTCCCGCCGCATCCGGGCGCCGGGCGAG
+CTCCGGGGACGCCGGGCCCTGGCGGCGGCGGCGGCTCGAGCCGTGCCTCGGGCGGGTGAA
+TCATCCCGGCCGACAGCGAGCGCCGCGGCGGCCCGTAGCAGCGCCGGAAGATGGCCGAGG
+CGGGCGCGGGCTTCCTGGAGCAGCTCAAGTCCTGCATCGTGTGGTCGTGGACCTATCTGT
+GGACCGTGTGGTTCTTCCTCGTGCTCTTCCTGGTCTACATCCTGAGGGTGCCCCTGAGGA
+TCAACGACAACCTGAGCACAGTGAGCATGTTTTTGAACACGTTAACCCCAAAGTTCTACG
+TGGCCCTGACAGGCACTTCCTCGCTAATATCGGGACTTATTTTGATATTTGAATGGTGGT
+ATTTTCGCAAGTATGGAACATCTTTCATTGAACAAGTCTCCGTAAGCCACTTGCGCCCCC
+TTCTGGGAGGGGTTGACAACAACTCTTCCAATAATTCTAATTCCAGTAATGGAGACTCAG
+ATTCCAACAGACAAAGTGTCTCAGAATGCAAAGTATGGCGAAATCCACTGAATCTGTTTA
+GGGGTGCGGAATATAATCGGTACACTTGGGTCACAGGACGAGAGCCTCTGACCTACTATG
+ACATGAACCTCTCTGCCCAGGACCACCAGACATTCTTTACTTGTGATTCAGATCATCTTC
+GCCCTGCAGATGCAATAATGCAAAAAGCTTGGAGAGAAAGGAACCCTCAAGCCAGGATTT
+CTGCAGCTCATGAAGCCTTGGAGATAAACGAAATTAGGTCCAGAGTTGAAGTTCCCCTAA
+TTGCTTCCTCTACCATCTGGGAGATAAAATTGTTACCAAAGTGTGCAACTGCGTACATTC
+TCTTGGCGGAAGAAGAAGCGACAACTATTGCTGAAGCAGAAAAACTCTTTAAGCAGGCCC
+TGAAGGCTGGAGATGGTTGTTACCGGCGCTCTCAGCAGCTACAACATCATGGGTCCCAGT
+ATGAAGCTCAACACAGACGAGACACCAATGTCTTAGTCTATATCAAAAGAAGGCTGGCGA
+TGTGTGCCCGGAGACTTGGAAGGACCAGAGAAGCAGTGAAGATGATGAGAGATTTAATGA
+AGGAGTTTCCCCTCCTAAGCATGTTCAATATCCATGAGAACCTTCTAGAAGCTCTTCTGG
+AACTCCAAGCTTATGCTGATGTTCAGGCAGTCTTAGCAAAGTATGATGATATAAGCTTAC
+CAAAGTCGGCGACAATATGCTACACAGCCGCCCTGCTCAAAGCAAGAGCTGTCTCTGACA
+AATTCTCTCCAGAGGCTGCGTCTCGGAGGGGGCTGAGCACAGCAGAGATGAATGCAGTAG
+AAGCCATCCACAGAGCTGTGGAATTTAATCCACACGTGCCAAAATATCTACTAGAAATGA
+AAAGCTTAATCCTCCCACCAGAACACATCCTGAAGAGAGGAGACAGTGAAGCGATAGCAT
+ATGCATTCTTTCATCTTGCACACTGGAAGAGGGTGGAAGGGGCTTTGAATCTCTTGCATT
+GTACGTGGGAAGGCACTTTCCGGATGATCCCGTATCCCCTGGAGAAGGGACACCTATTTT
+ATCCATACCCAATCTGTACAGAAACAGCTGACCGGGAGCTGCTTCCCTCTTTCCATGAAG
+TCTCAGTTTACCCAAAGAAGGAACTTCCCTTCTTCATCCTCTTCACTGCTGGACTGTGCT
+CCTTCACAGCCATGCTGGCCCTCCTGACACATCAGTTTCCGGAACTTATGGGAGTCTTCG
+CAAAAGCTTTCCTCAGCACTTTGTTTGCCCCCTTGAACTTTGTTATGGAGAAAGTGGAAA
+GCATCCTCCCCTCCAGTTTGTGGCATCAGCTGACACGGATCTGAGGGAGCCTCCCATCCT
+TCACTTTCCACACCATCCACCATCTCTTCTGTGCCAACCTCTCATGGACCGCAAGAAAGC
+ATGACTTTGAAAAAGGGAAACCATTCTGAGATTTTAAACTGCTCATGGACTATCAGTTCC
+TTATTAAAGGCTGGTTTTGTTGTACAAAATTTATTGATGTTCAGTTCTATTTTATTTTGC
+CTTCAAAACTGACTGATCAAAAAGTAAAAAAAATAAATAAATAAACTTTTGTGTATTGCA
+AGAAAA
+>TR14|c12_g1_i3 len=2097 path=[4166:0-29 4167:30-52 4168:53-60 4169:61-64 4239:65-101 4257:102-102 4259:103-117 4248:118-126 4236:127-131 4221:132-141 4246:142-155 4234:156-166 4219:167-179 4255:180-182 4250:183-191 4243:192-198 4231:199-237 4215:238-245 4242:246-258 4254:259-261 4249:262-271 4241:272-278 4229:279-307 4212:308-343 @4194@!:344-810 4047:811-832 @4211@!:833-1354 4171:1355-1527 4165:1528-2096] [-1, 4166, 4167, 4168, 4169, 4239, 4257, 4259, 4248, 4236, 4221, 4246, 4234, 4219, [...]
+CCGGCGGGGGCTCGGAGCGCAGGCCGCGCGCTTTCCCGCCGCATCCGGGCGCCGGGCGAG
+CTCCGGGGACGCCGGGCCCTGGCGGCGGCGGCGGCTCGAGCCGTGCCTCGGGCGGGTGAA
+TCATCCCGGCCGACAGCGAGCGCCGCGGCGGCCCGTAGCAGCGCCGGAAGATGGCCGAGG
+CGGGCGCGGGCTTCCTGGAGCAGCTCAAGTCCTGCATCGTGTGGTCGTGGACCTATCTGT
+GGACCGTGTGGTTCTTCCTCGTGCTCTTCCTGGTCTACATCCTGAGGGTGCCCCTGAGGA
+TCAACGACAACCTGAGCACAGTGAGCATGTTTTTGAACACGTTAACCCCAAAGTTCTACG
+TGGCCCTGACAGGCACTTCCTCGCTAATATCGGGACTTATTTTGATATTTGAATGGTGGT
+ATTTTCGCAAGTATGGAACATCTTTCATTGAACAAGTCTCCGTAAGCCACTTGCGCCCCC
+TTCTGGGAGGGGTTGACAACAACTCTTCCAATAATTCTAATTCCAGTAATGGAGACTCAG
+ATTCCAACAGACAAAGTGTCTCAGAATGCAAAGTATGGCGAAATCCACTGAATCTGTTTA
+GGGGTGCGGAATATAATCGGTACACTTGGGTCACAGGACGAGAGCCTCTGACCTACTATG
+ACATGAACCTCTCTGCCCAGGACCACCAGACATTCTTTACTTGTGATTCAGATCATCTTC
+GCCCTGCAGATGCAATAATGCAAAAAGCTTGGAGAGAAAGGAACCCTCAAGCCAGGATTT
+CTGCAGCTCATGAAGCCTTGGAGATAAACGAGTGTGCAACTGCGTACATTCTCTTGGCGG
+AAGAAGAAGCGACAACTATTGCTGAAGCAGAAAAACTCTTTAAGCAGGCCCTGAAGGCTG
+GAGATGGTTGTTACCGGCGCTCTCAGCAGCTACAACATCATGGGTCCCAGTATGAAGCTC
+AACACAGACGAGACACCAATGTCTTAGTCTATATCAAAAGAAGGCTGGCGATGTGTGCCC
+GGAGACTTGGAAGGACCAGAGAAGCAGTGAAGATGATGAGAGATTTAATGAAGGAGTTTC
+CCCTCCTAAGCATGTTCAATATCCATGAGAACCTTCTAGAAGCTCTTCTGGAACTCCAAG
+CTTATGCTGATGTTCAGGCAGTCTTAGCAAAGTATGATGATATAAGCTTACCAAAGTCGG
+CGACAATATGCTACACAGCCGCCCTGCTCAAAGCAAGAGCTGTCTCTGACAAATTCTCTC
+CAGAGGCTGCGTCTCGGAGGGGGCTGAGCACAGCAGAGATGAATGCAGTAGAAGCCATCC
+ACAGAGCTGTGGAATTTAATCCACACGTGCCAAAATATCTACTAGAAATGAAAAGCTTAA
+TCCTCCCACCAGAACACATCCTGAAGAGAGGAGACAGTGAAGCGATAGCATATGCATTCT
+TTCATCTTGCACACTGGAAGAGGGTGGAAGGGGCTTTGAATCTCTTGCATTGTACGTGGG
+AAGGCACTTTCCGGATGATCCCGTATCCCCTGGAGAAGGGACACCTATTTTATCCATACC
+CAATCTGTACAGAAACAGCTGACCGGGAGCTGCTTCCCTCTTTCCATGAAGTCTCAGTTT
+ACCCAAAGAAGGAACTTCCCTTCTTCATCCTCTTCACTGCTGGACTGTGCTCCTTCACAG
+CCATGCTGGCCCTCCTGACACATCAGTTTCCGGAACTTATGGGAGTCTTCGCAAAAGCTT
+TCCTCAGCACTTTGTTTGCCCCCTTGAACTTTGTTATGGAGAAAGTGGAAAGCATCCTCC
+CCTCCAGTTTGTGGCATCAGCTGACACGGATCTGAGGGAGCCTCCCATCCTTCACTTTCC
+ACACCATCCACCATCTCTTCTGTGCCAACCTCTCATGGACCGCAAGAAAGCATGACTTTG
+AAAAAGGGAAACCATTCTGAGATTTTAAACTGCTCATGGACTATCAGTTCCTTATTAAAG
+GCTGGTTTTGTTGTACAAAATTTATTGATGTTCAGTTCTATTTTATTTTGCCTTCAAAAC
+TGACTGATCAAAAAGTAAAAAAAATAAATAAATAAACTTTTGTGTATTGCAAGAAAA
+>TR14|c12_g1_i4 len=2015 path=[4166:0-29 4167:30-52 4168:53-60 4169:61-64 4239:65-101 4257:102-102 4259:103-117 4248:118-126 4236:127-131 4221:132-141 4246:142-155 4234:156-166 4219:167-179 4255:180-182 4250:183-191 4243:192-198 4231:199-237 4215:238-245 4242:246-258 4254:259-261 4249:262-271 4241:272-278 4229:279-307 4212:308-343 @4194@!:344-810 4117:811-814 4228:815-901 @4211@!:902-1423 3950:1424-1445 3951:1446-2014] [-1, 4166, 4167, 4168, 4169, 4239, 4257, 4259, 4248, 4236, 4221, 4246 [...]
+CCGGCGGGGGCTCGGAGCGCAGGCCGCGCGCTTTCCCGCCGCATCCGGGCGCCGGGCGAG
+CTCCGGGGACGCCGGGCCCTGGCGGCGGCGGCGGCTCGAGCCGTGCCTCGGGCGGGTGAA
+TCATCCCGGCCGACAGCGAGCGCCGCGGCGGCCCGTAGCAGCGCCGGAAGATGGCCGAGG
+CGGGCGCGGGCTTCCTGGAGCAGCTCAAGTCCTGCATCGTGTGGTCGTGGACCTATCTGT
+GGACCGTGTGGTTCTTCCTCGTGCTCTTCCTGGTCTACATCCTGAGGGTGCCCCTGAGGA
+TCAACGACAACCTGAGCACAGTGAGCATGTTTTTGAACACGTTAACCCCAAAGTTCTACG
+TGGCCCTGACAGGCACTTCCTCGCTAATATCGGGACTTATTTTGATATTTGAATGGTGGT
+ATTTTCGCAAGTATGGAACATCTTTCATTGAACAAGTCTCCGTAAGCCACTTGCGCCCCC
+TTCTGGGAGGGGTTGACAACAACTCTTCCAATAATTCTAATTCCAGTAATGGAGACTCAG
+ATTCCAACAGACAAAGTGTCTCAGAATGCAAAGTATGGCGAAATCCACTGAATCTGTTTA
+GGGGTGCGGAATATAATCGGTACACTTGGGTCACAGGACGAGAGCCTCTGACCTACTATG
+ACATGAACCTCTCTGCCCAGGACCACCAGACATTCTTTACTTGTGATTCAGATCATCTTC
+GCCCTGCAGATGCAATAATGCAAAAAGCTTGGAGAGAAAGGAACCCTCAAGCCAGGATTT
+CTGCAGCTCATGAAGCCTTGGAGATAAACGAAATTAGGTCCAGAGTTGAAGTTCCCCTAA
+TTGCTTCCTCTACCATCTGGGAGATAAAATTGTTACCAAAGTGTGCAACTGCGTACATTC
+TCTTGGCGGAAGAAGAAGCGACAACTATTGCTGAAGCAGAAAAACTCTTTAAGCAGGCCC
+TGAAGGCTGGAGATGGTTGTTACCGGCGCTCTCAGCAGCTACAACATCATGGGTCCCAGT
+ATGAAGCTCAACACAGACGAGACACCAATGTCTTAGTCTATATCAAAAGAAGGCTGGCGA
+TGTGTGCCCGGAGACTTGGAAGGACCAGAGAAGCAGTGAAGATGATGAGAGATTTAATGA
+AGGAGTTTCCCCTCCTAAGCATGTTCAATATCCATGAGAACCTTCTAGAAGCTCTTCTGG
+AACTCCAAGCTTATGCTGATGTTCAGGCAGTCTTAGCAAAGTATGATGATATAAGCTTAC
+CAAAGTCGGCGACAATATGCTACACAGCCGCCCTGCTCAAAGCAAGAGCTGTCTCTGACA
+AATTCTCTCCAGAGGCTGCGTCTCGGAGGGGGCTGAGCACAGCAGAGATGAATGCAGTAG
+AAGCCATCCACAGAGCTGTGGAATTTAATCCACACGTGCCAAAACTTTCCGGATGATCCC
+GTATCCCCTGGAGAAGGGACACCTATTTTATCCATACCCAATCTGTACAGAAACAGCTGA
+CCGGGAGCTGCTTCCCTCTTTCCATGAAGTCTCAGTTTACCCAAAGAAGGAACTTCCCTT
+CTTCATCCTCTTCACTGCTGGACTGTGCTCCTTCACAGCCATGCTGGCCCTCCTGACACA
+TCAGTTTCCGGAACTTATGGGAGTCTTCGCAAAAGCTTTCCTCAGCACTTTGTTTGCCCC
+CTTGAACTTTGTTATGGAGAAAGTGGAAAGCATCCTCCCCTCCAGTTTGTGGCATCAGCT
+GACACGGATCTGAGGGAGCCTCCCATCCTTCACTTTCCACACCATCCACCATCTCTTCTG
+TGCCAACCTCTCATGGACCGCAAGAAAGCATGACTTTGAAAAAGGGAAACCATTCTGAGA
+TTTTAAACTGCTCATGGACTATCAGTTCCTTATTAAAGGCTGGTTTTGTTGTACAAAATT
+TATTGATGTTCAGTTCTATTTTATTTTGCCTTCAAAACTGACTGATCAAAAAGTAAAAAA
+AATAAATAAATAAACTTTTGTGTATTGCAAGAAAA
+>TR14|c12_g1_i5 len=2433 path=[4004:0-610 @4194@!:611-1077 4117:1078-1081 4228:1082-1168 @4211@!:1169-1690 4171:1691-1863 4165:1864-2432] [-1, 4004, 4194, 4117, 4228, 4211, 4171, 4165, -2]
+GAGCTCTTCAGGAGGGGGAATGTGCTTGTGGTTTTTGGTCTTGTGCATTTTGTGACAAAG
+GAATTCCCTTTTGAATCGCGCTGTTCCCTTGAAACCCTGGAGCCTCTGGTTCAAGCAGCG
+CAGTCAGTCTGTGCAGTGTCCCTGACGTCATCCGGCGTATGCATAAGCTCTGCTATTGTC
+TTACCGCTAGAGCAGGGCTGAGGACTGCAGTCTCTGCTGCTGCTCGCAGACCTGCCCTGC
+GCTAGCTACCTAGCCCTGCCTCACTGCATCCCTCAAGAGCCGCGGCAGCCTTTCCTTGCC
+TGCTGGATTTTGAGAAGCAGCTCTTCGATTTGGGCTGGTGTAGGAGCCCTGGCTTTCCAT
+TCTCGAGAGAAAGCTGAAGCGCTCAGAGGAGAATCTGGCAGCTGGACATAGCTCGGACTG
+CATTGTCTGGCTTCATGACCCCTGCTGTGTAGCCGGCTCATCTCTTTGCTCTCAGGAGCA
+CATGCACATCTTACATTTTCCTACTTCCTTTTTCTTTTTCTTTCCCTTCTTCTAATTTTT
+TTTTAAAGCACCTTCTGGAGCCAGCCATGTTTGGTACTGAATCTTCATTGAGCATGTTTT
+TGAACACGTTAACCCCAAAGTTCTACGTGGCCCTGACAGGCACTTCCTCGCTAATATCGG
+GACTTATTTTGATATTTGAATGGTGGTATTTTCGCAAGTATGGAACATCTTTCATTGAAC
+AAGTCTCCGTAAGCCACTTGCGCCCCCTTCTGGGAGGGGTTGACAACAACTCTTCCAATA
+ATTCTAATTCCAGTAATGGAGACTCAGATTCCAACAGACAAAGTGTCTCAGAATGCAAAG
+TATGGCGAAATCCACTGAATCTGTTTAGGGGTGCGGAATATAATCGGTACACTTGGGTCA
+CAGGACGAGAGCCTCTGACCTACTATGACATGAACCTCTCTGCCCAGGACCACCAGACAT
+TCTTTACTTGTGATTCAGATCATCTTCGCCCTGCAGATGCAATAATGCAAAAAGCTTGGA
+GAGAAAGGAACCCTCAAGCCAGGATTTCTGCAGCTCATGAAGCCTTGGAGATAAACGAAA
+TTAGGTCCAGAGTTGAAGTTCCCCTAATTGCTTCCTCTACCATCTGGGAGATAAAATTGT
+TACCAAAGTGTGCAACTGCGTACATTCTCTTGGCGGAAGAAGAAGCGACAACTATTGCTG
+AAGCAGAAAAACTCTTTAAGCAGGCCCTGAAGGCTGGAGATGGTTGTTACCGGCGCTCTC
+AGCAGCTACAACATCATGGGTCCCAGTATGAAGCTCAACACAGACGAGACACCAATGTCT
+TAGTCTATATCAAAAGAAGGCTGGCGATGTGTGCCCGGAGACTTGGAAGGACCAGAGAAG
+CAGTGAAGATGATGAGAGATTTAATGAAGGAGTTTCCCCTCCTAAGCATGTTCAATATCC
+ATGAGAACCTTCTAGAAGCTCTTCTGGAACTCCAAGCTTATGCTGATGTTCAGGCAGTCT
+TAGCAAAGTATGATGATATAAGCTTACCAAAGTCGGCGACAATATGCTACACAGCCGCCC
+TGCTCAAAGCAAGAGCTGTCTCTGACAAATTCTCTCCAGAGGCTGCGTCTCGGAGGGGGC
+TGAGCACAGCAGAGATGAATGCAGTAGAAGCCATCCACAGAGCTGTGGAATTTAATCCAC
+ACGTGCCAAAATATCTACTAGAAATGAAAAGCTTAATCCTCCCACCAGAACACATCCTGA
+AGAGAGGAGACAGTGAAGCGATAGCATATGCATTCTTTCATCTTGCACACTGGAAGAGGG
+TGGAAGGGGCTTTGAATCTCTTGCATTGTACGTGGGAAGGCACTTTCCGGATGATCCCGT
+ATCCCCTGGAGAAGGGACACCTATTTTATCCATACCCAATCTGTACAGAAACAGCTGACC
+GGGAGCTGCTTCCCTCTTTCCATGAAGTCTCAGTTTACCCAAAGAAGGAACTTCCCTTCT
+TCATCCTCTTCACTGCTGGACTGTGCTCCTTCACAGCCATGCTGGCCCTCCTGACACATC
+AGTTTCCGGAACTTATGGGAGTCTTCGCAAAAGCTTTCCTCAGCACTTTGTTTGCCCCCT
+TGAACTTTGTTATGGAGAAAGTGGAAAGCATCCTCCCCTCCAGTTTGTGGCATCAGCTGA
+CACGGATCTGAGGGAGCCTCCCATCCTTCACTTTCCACACCATCCACCATCTCTTCTGTG
+CCAACCTCTCATGGACCGCAAGAAAGCATGACTTTGAAAAAGGGAAACCATTCTGAGATT
+TTAAACTGCTCATGGACTATCAGTTCCTTATTAAAGGCTGGTTTTGTTGTACAAAATTTA
+TTGATGTTCAGTTCTATTTTATTTTGCCTTCAAAACTGACTGATCAAAAAGTAAAAAAAA
+TAAATAAATAAACTTTTGTGTATTGCAAGAAAA
+>TR14|c12_g1_i6 len=2213 path=[4004:0-610 @4194@!:611-1077 4047:1078-1099 @4211@!:1100-1621 3950:1622-1643 3951:1644-2212] [-1, 4004, 4194, 4047, 4211, 3950, 3951, -2]
+GAGCTCTTCAGGAGGGGGAATGTGCTTGTGGTTTTTGGTCTTGTGCATTTTGTGACAAAG
+GAATTCCCTTTTGAATCGCGCTGTTCCCTTGAAACCCTGGAGCCTCTGGTTCAAGCAGCG
+CAGTCAGTCTGTGCAGTGTCCCTGACGTCATCCGGCGTATGCATAAGCTCTGCTATTGTC
+TTACCGCTAGAGCAGGGCTGAGGACTGCAGTCTCTGCTGCTGCTCGCAGACCTGCCCTGC
+GCTAGCTACCTAGCCCTGCCTCACTGCATCCCTCAAGAGCCGCGGCAGCCTTTCCTTGCC
+TGCTGGATTTTGAGAAGCAGCTCTTCGATTTGGGCTGGTGTAGGAGCCCTGGCTTTCCAT
+TCTCGAGAGAAAGCTGAAGCGCTCAGAGGAGAATCTGGCAGCTGGACATAGCTCGGACTG
+CATTGTCTGGCTTCATGACCCCTGCTGTGTAGCCGGCTCATCTCTTTGCTCTCAGGAGCA
+CATGCACATCTTACATTTTCCTACTTCCTTTTTCTTTTTCTTTCCCTTCTTCTAATTTTT
+TTTTAAAGCACCTTCTGGAGCCAGCCATGTTTGGTACTGAATCTTCATTGAGCATGTTTT
+TGAACACGTTAACCCCAAAGTTCTACGTGGCCCTGACAGGCACTTCCTCGCTAATATCGG
+GACTTATTTTGATATTTGAATGGTGGTATTTTCGCAAGTATGGAACATCTTTCATTGAAC
+AAGTCTCCGTAAGCCACTTGCGCCCCCTTCTGGGAGGGGTTGACAACAACTCTTCCAATA
+ATTCTAATTCCAGTAATGGAGACTCAGATTCCAACAGACAAAGTGTCTCAGAATGCAAAG
+TATGGCGAAATCCACTGAATCTGTTTAGGGGTGCGGAATATAATCGGTACACTTGGGTCA
+CAGGACGAGAGCCTCTGACCTACTATGACATGAACCTCTCTGCCCAGGACCACCAGACAT
+TCTTTACTTGTGATTCAGATCATCTTCGCCCTGCAGATGCAATAATGCAAAAAGCTTGGA
+GAGAAAGGAACCCTCAAGCCAGGATTTCTGCAGCTCATGAAGCCTTGGAGATAAACGAGT
+GTGCAACTGCGTACATTCTCTTGGCGGAAGAAGAAGCGACAACTATTGCTGAAGCAGAAA
+AACTCTTTAAGCAGGCCCTGAAGGCTGGAGATGGTTGTTACCGGCGCTCTCAGCAGCTAC
+AACATCATGGGTCCCAGTATGAAGCTCAACACAGACGAGACACCAATGTCTTAGTCTATA
+TCAAAAGAAGGCTGGCGATGTGTGCCCGGAGACTTGGAAGGACCAGAGAAGCAGTGAAGA
+TGATGAGAGATTTAATGAAGGAGTTTCCCCTCCTAAGCATGTTCAATATCCATGAGAACC
+TTCTAGAAGCTCTTCTGGAACTCCAAGCTTATGCTGATGTTCAGGCAGTCTTAGCAAAGT
+ATGATGATATAAGCTTACCAAAGTCGGCGACAATATGCTACACAGCCGCCCTGCTCAAAG
+CAAGAGCTGTCTCTGACAAATTCTCTCCAGAGGCTGCGTCTCGGAGGGGGCTGAGCACAG
+CAGAGATGAATGCAGTAGAAGCCATCCACAGAGCTGTGGAATTTAATCCACACGTGCCAA
+AACTTTCCGGATGATCCCGTATCCCCTGGAGAAGGGACACCTATTTTATCCATACCCAAT
+CTGTACAGAAACAGCTGACCGGGAGCTGCTTCCCTCTTTCCATGAAGTCTCAGTTTACCC
+AAAGAAGGAACTTCCCTTCTTCATCCTCTTCACTGCTGGACTGTGCTCCTTCACAGCCAT
+GCTGGCCCTCCTGACACATCAGTTTCCGGAACTTATGGGAGTCTTCGCAAAAGCTTTCCT
+CAGCACTTTGTTTGCCCCCTTGAACTTTGTTATGGAGAAAGTGGAAAGCATCCTCCCCTC
+CAGTTTGTGGCATCAGCTGACACGGATCTGAGGGAGCCTCCCATCCTTCACTTTCCACAC
+CATCCACCATCTCTTCTGTGCCAACCTCTCATGGACCGCAAGAAAGCATGACTTTGAAAA
+AGGGAAACCATTCTGAGATTTTAAACTGCTCATGGACTATCAGTTCCTTATTAAAGGCTG
+GTTTTGTTGTACAAAATTTATTGATGTTCAGTTCTATTTTATTTTGCCTTCAAAACTGAC
+TGATCAAAAAGTAAAAAAAATAAATAAATAAACTTTTGTGTATTGCAAGAAAA
+>TR14|c12_g1_i7 len=1946 path=[4166:0-29 4167:30-52 4168:53-60 4169:61-64 4239:65-101 4257:102-102 4259:103-117 4248:118-126 4236:127-131 4221:132-141 4246:142-155 4234:156-166 4219:167-179 4255:180-182 4250:183-191 4243:192-198 4231:199-237 4215:238-245 4242:246-258 4254:259-261 4249:262-271 4241:272-278 4229:279-307 4212:308-343 @4194@!:344-810 4047:811-832 @4211@!:833-1354 3950:1355-1376 3951:1377-1945] [-1, 4166, 4167, 4168, 4169, 4239, 4257, 4259, 4248, 4236, 4221, 4246, 4234, 4219, [...]
+CCGGCGGGGGCTCGGAGCGCAGGCCGCGCGCTTTCCCGCCGCATCCGGGCGCCGGGCGAG
+CTCCGGGGACGCCGGGCCCTGGCGGCGGCGGCGGCTCGAGCCGTGCCTCGGGCGGGTGAA
+TCATCCCGGCCGACAGCGAGCGCCGCGGCGGCCCGTAGCAGCGCCGGAAGATGGCCGAGG
+CGGGCGCGGGCTTCCTGGAGCAGCTCAAGTCCTGCATCGTGTGGTCGTGGACCTATCTGT
+GGACCGTGTGGTTCTTCCTCGTGCTCTTCCTGGTCTACATCCTGAGGGTGCCCCTGAGGA
+TCAACGACAACCTGAGCACAGTGAGCATGTTTTTGAACACGTTAACCCCAAAGTTCTACG
+TGGCCCTGACAGGCACTTCCTCGCTAATATCGGGACTTATTTTGATATTTGAATGGTGGT
+ATTTTCGCAAGTATGGAACATCTTTCATTGAACAAGTCTCCGTAAGCCACTTGCGCCCCC
+TTCTGGGAGGGGTTGACAACAACTCTTCCAATAATTCTAATTCCAGTAATGGAGACTCAG
+ATTCCAACAGACAAAGTGTCTCAGAATGCAAAGTATGGCGAAATCCACTGAATCTGTTTA
+GGGGTGCGGAATATAATCGGTACACTTGGGTCACAGGACGAGAGCCTCTGACCTACTATG
+ACATGAACCTCTCTGCCCAGGACCACCAGACATTCTTTACTTGTGATTCAGATCATCTTC
+GCCCTGCAGATGCAATAATGCAAAAAGCTTGGAGAGAAAGGAACCCTCAAGCCAGGATTT
+CTGCAGCTCATGAAGCCTTGGAGATAAACGAGTGTGCAACTGCGTACATTCTCTTGGCGG
+AAGAAGAAGCGACAACTATTGCTGAAGCAGAAAAACTCTTTAAGCAGGCCCTGAAGGCTG
+GAGATGGTTGTTACCGGCGCTCTCAGCAGCTACAACATCATGGGTCCCAGTATGAAGCTC
+AACACAGACGAGACACCAATGTCTTAGTCTATATCAAAAGAAGGCTGGCGATGTGTGCCC
+GGAGACTTGGAAGGACCAGAGAAGCAGTGAAGATGATGAGAGATTTAATGAAGGAGTTTC
+CCCTCCTAAGCATGTTCAATATCCATGAGAACCTTCTAGAAGCTCTTCTGGAACTCCAAG
+CTTATGCTGATGTTCAGGCAGTCTTAGCAAAGTATGATGATATAAGCTTACCAAAGTCGG
+CGACAATATGCTACACAGCCGCCCTGCTCAAAGCAAGAGCTGTCTCTGACAAATTCTCTC
+CAGAGGCTGCGTCTCGGAGGGGGCTGAGCACAGCAGAGATGAATGCAGTAGAAGCCATCC
+ACAGAGCTGTGGAATTTAATCCACACGTGCCAAAACTTTCCGGATGATCCCGTATCCCCT
+GGAGAAGGGACACCTATTTTATCCATACCCAATCTGTACAGAAACAGCTGACCGGGAGCT
+GCTTCCCTCTTTCCATGAAGTCTCAGTTTACCCAAAGAAGGAACTTCCCTTCTTCATCCT
+CTTCACTGCTGGACTGTGCTCCTTCACAGCCATGCTGGCCCTCCTGACACATCAGTTTCC
+GGAACTTATGGGAGTCTTCGCAAAAGCTTTCCTCAGCACTTTGTTTGCCCCCTTGAACTT
+TGTTATGGAGAAAGTGGAAAGCATCCTCCCCTCCAGTTTGTGGCATCAGCTGACACGGAT
+CTGAGGGAGCCTCCCATCCTTCACTTTCCACACCATCCACCATCTCTTCTGTGCCAACCT
+CTCATGGACCGCAAGAAAGCATGACTTTGAAAAAGGGAAACCATTCTGAGATTTTAAACT
+GCTCATGGACTATCAGTTCCTTATTAAAGGCTGGTTTTGTTGTACAAAATTTATTGATGT
+TCAGTTCTATTTTATTTTGCCTTCAAAACTGACTGATCAAAAAGTAAAAAAAATAAATAA
+ATAAACTTTTGTGTATTGCAAGAAAA
+>TR14|c12_g1_i8 len=2282 path=[4004:0-610 @4194@!:611-1077 4117:1078-1081 4228:1082-1168 @4211@!:1169-1690 3950:1691-1712 3951:1713-2281] [-1, 4004, 4194, 4117, 4228, 4211, 3950, 3951, -2]
+GAGCTCTTCAGGAGGGGGAATGTGCTTGTGGTTTTTGGTCTTGTGCATTTTGTGACAAAG
+GAATTCCCTTTTGAATCGCGCTGTTCCCTTGAAACCCTGGAGCCTCTGGTTCAAGCAGCG
+CAGTCAGTCTGTGCAGTGTCCCTGACGTCATCCGGCGTATGCATAAGCTCTGCTATTGTC
+TTACCGCTAGAGCAGGGCTGAGGACTGCAGTCTCTGCTGCTGCTCGCAGACCTGCCCTGC
+GCTAGCTACCTAGCCCTGCCTCACTGCATCCCTCAAGAGCCGCGGCAGCCTTTCCTTGCC
+TGCTGGATTTTGAGAAGCAGCTCTTCGATTTGGGCTGGTGTAGGAGCCCTGGCTTTCCAT
+TCTCGAGAGAAAGCTGAAGCGCTCAGAGGAGAATCTGGCAGCTGGACATAGCTCGGACTG
+CATTGTCTGGCTTCATGACCCCTGCTGTGTAGCCGGCTCATCTCTTTGCTCTCAGGAGCA
+CATGCACATCTTACATTTTCCTACTTCCTTTTTCTTTTTCTTTCCCTTCTTCTAATTTTT
+TTTTAAAGCACCTTCTGGAGCCAGCCATGTTTGGTACTGAATCTTCATTGAGCATGTTTT
+TGAACACGTTAACCCCAAAGTTCTACGTGGCCCTGACAGGCACTTCCTCGCTAATATCGG
+GACTTATTTTGATATTTGAATGGTGGTATTTTCGCAAGTATGGAACATCTTTCATTGAAC
+AAGTCTCCGTAAGCCACTTGCGCCCCCTTCTGGGAGGGGTTGACAACAACTCTTCCAATA
+ATTCTAATTCCAGTAATGGAGACTCAGATTCCAACAGACAAAGTGTCTCAGAATGCAAAG
+TATGGCGAAATCCACTGAATCTGTTTAGGGGTGCGGAATATAATCGGTACACTTGGGTCA
+CAGGACGAGAGCCTCTGACCTACTATGACATGAACCTCTCTGCCCAGGACCACCAGACAT
+TCTTTACTTGTGATTCAGATCATCTTCGCCCTGCAGATGCAATAATGCAAAAAGCTTGGA
+GAGAAAGGAACCCTCAAGCCAGGATTTCTGCAGCTCATGAAGCCTTGGAGATAAACGAAA
+TTAGGTCCAGAGTTGAAGTTCCCCTAATTGCTTCCTCTACCATCTGGGAGATAAAATTGT
+TACCAAAGTGTGCAACTGCGTACATTCTCTTGGCGGAAGAAGAAGCGACAACTATTGCTG
+AAGCAGAAAAACTCTTTAAGCAGGCCCTGAAGGCTGGAGATGGTTGTTACCGGCGCTCTC
+AGCAGCTACAACATCATGGGTCCCAGTATGAAGCTCAACACAGACGAGACACCAATGTCT
+TAGTCTATATCAAAAGAAGGCTGGCGATGTGTGCCCGGAGACTTGGAAGGACCAGAGAAG
+CAGTGAAGATGATGAGAGATTTAATGAAGGAGTTTCCCCTCCTAAGCATGTTCAATATCC
+ATGAGAACCTTCTAGAAGCTCTTCTGGAACTCCAAGCTTATGCTGATGTTCAGGCAGTCT
+TAGCAAAGTATGATGATATAAGCTTACCAAAGTCGGCGACAATATGCTACACAGCCGCCC
+TGCTCAAAGCAAGAGCTGTCTCTGACAAATTCTCTCCAGAGGCTGCGTCTCGGAGGGGGC
+TGAGCACAGCAGAGATGAATGCAGTAGAAGCCATCCACAGAGCTGTGGAATTTAATCCAC
+ACGTGCCAAAACTTTCCGGATGATCCCGTATCCCCTGGAGAAGGGACACCTATTTTATCC
+ATACCCAATCTGTACAGAAACAGCTGACCGGGAGCTGCTTCCCTCTTTCCATGAAGTCTC
+AGTTTACCCAAAGAAGGAACTTCCCTTCTTCATCCTCTTCACTGCTGGACTGTGCTCCTT
+CACAGCCATGCTGGCCCTCCTGACACATCAGTTTCCGGAACTTATGGGAGTCTTCGCAAA
+AGCTTTCCTCAGCACTTTGTTTGCCCCCTTGAACTTTGTTATGGAGAAAGTGGAAAGCAT
+CCTCCCCTCCAGTTTGTGGCATCAGCTGACACGGATCTGAGGGAGCCTCCCATCCTTCAC
+TTTCCACACCATCCACCATCTCTTCTGTGCCAACCTCTCATGGACCGCAAGAAAGCATGA
+CTTTGAAAAAGGGAAACCATTCTGAGATTTTAAACTGCTCATGGACTATCAGTTCCTTAT
+TAAAGGCTGGTTTTGTTGTACAAAATTTATTGATGTTCAGTTCTATTTTATTTTGCCTTC
+AAAACTGACTGATCAAAAAGTAAAAAAAATAAATAAATAAACTTTTGTGTATTGCAAGAA
+AA
+>TR15|c0_g1_i1 len=3745 path=[6028:0-88 6297:89-105 6273:106-110 6316:111-119 6338:120-133 6329:134-180 6343:181-184 6342:185-223 6337:224-232 6328:233-279 6294:280-395 6327:396-428 6313:429-442 6293:443-464 6341:465-466 6336:467-479 6326:480-487 6340:488-503 6335:504-511 6325:512-527 6311:528-538 6290:539-586 6263:587-606 6229:607-630 6289:631-725 6169:726-742 6262:743-813 5953:814-857 5954:858-859 6261:860-919 6071:920-943 6334:944-955 6310:956-993 6344:994-999 6347:1000-1000 6309:1001 [...]
+GCCAGGGTGACCACTAGACTGAGCTGGGGCGAACCCTGGGCGGGGGCGGGGGCCGAGGCA
+CGGGGCCGCAGTCGTTGTTCCAGCTGCCACCGTGACTGGCCTAGGTCCGCCTCCGCCAGC
+GCTGGGCCCGGCTGAATCAGACCTCGGGCGTCCGGCGGCGGGTCTGCTGCCGAACGGAGG
+GCGCAGGTGAGCCTAGGACGCTGAGCGCGCTGCCCTACTCTGCCTCGGCGGGGTGGAGGG
+CTGGCCGGGGGTGCTGGACAGACTTGTGCAGCTCCGTGAAGTGCAGCCCCGACCCCCTGG
+CGCCTGTTCTCACGAAGTCGCTTTTAAGACTAGCGAGCTGACTTCGGGGAGCCAAGAGAT
+TTTTCTGCGTTTCCTCAGGCATCGGTGAGAACTCTCAAGTCTCCAGCCATGCAGCTACAG
+GCCCTCCTCCAAAAGGACCGCCCCATGCCACAAAGGGAGCCACTCGAGTTTTCATGGCAT
+CGAGCTGGCGAACTCTGACGTGCATCCTTGACAACAAGAGTTGCTTGTTAACCTCCCAGG
+GAGGATCCCTTTCCTTAGGAGGGCCAGGCTGAGGGGGTCAGGGCTGGCCAGGTCTGGACT
+ATGCCATCCAAGTCAGCTTGCCTGCGTCACACTGAGGCACCTGGGCAGCTAGAAGGCAGA
+ATGCTCCAGGGACAGCCTCCGAACACGGAAAAGAAGCTCATCCCAACACCAGGCTTCTTA
+CCAGCCTCTGACTCTCAGGGTTCAGAGACAAACCCCATGCCTCCTTTCAGCATTCCAGCA
+AAAACAAGCAACCAGAACCCACAAACTAAGGCAAATCTCATCACCCCACAGCCACCCATT
+AGACCCAAGTTGGAGCGAACCCTGTCCCTCGATGACAAGGGCTGGAGAAGGAGGCGTTTC
+CGGGGTAGTCAGGAGGATCTGACTGTCCAGAATGGGGCCAGTCCCTGCAGGGGCTCCTTG
+CAAGACTCAGTAGCCCAGTCCCCTGCCTACAGCCGTCCCCTGCCCTGCCTCAGCACATCC
+TTGCAGGAGATACCTAAGTCCCGAAGGGCCACAGGCAGTGAGGGAGGGAGCCCATCCTTG
+TGGAGTGACTGTCTTTCTGGAATGATCAGCACCTCCTTGGACCTCCTGCACAGAGATGCT
+GCCTCAGGTGGGCCCCCCTCCAGGTTGGCAAGTTTGCATGCCTCACACACACCACCAGCT
+ATGGACCTCAGCATAGCCTCCAGCTCCCTGAGAACAGCAAACAAGGTTGACCCCGAGCAC
+ACGGACTACAAGCTCCGCATGCAGACCAGACTGGTCAGGGCCCACAGCAACCTGGGCCCT
+AGCAGACCCCGGAGCCCCTTGGCTGGTGACGATCACTCCATTCACTCAGCCAGATCTTTC
+AGCCTTCTGGCCCCCATCCGCACCAAGGACATCAGAAGCAGGAGCTATCTGGAGGGAAGT
+CTTCTGGCCAGTGGGGCCCTGCTAGGAGCAGAAGAGCTGGCCAGGTACTTCCCAGACCGA
+AACATGGCTCTCTTCGTGGCTACCTGGAACATGCAGGGCCAGAAGGAGCTCCCAGCGAGC
+CTGGATGAGTTTCTGCTCCCCACCGAGGCTGACTACACTCAGGACCTGTATGTCATTGGA
+ATTCAGGAGGGCTGCTCTGACAGGCGGGAGTGGGAGACACGCCTGCAGGAGACACTGGGC
+CCTCAGTATGTACTGCTGTCATCAGCAGCACATGGGGTCCTGTACATGTCCCTGTTTATC
+CGTAGGGACCTCATCTGGTTCTGCTCAGAGGTCGAGTACTCCACAGTAACTACACGCATC
+GTGTCTCAGATCAAGACCAAGGGGGCCCTGGGCGTCAGCTTCACCTTTTTTGGCACCTCC
+TTCCTCTTCATCACATCTCACTTCACCTCTGGAGATGGGAAGGTAGCAGAGCGGCTACTG
+GACTACAGCAGAACCATCCAAGCCCTAGCCCTGCCCCGGAATGTGCCAGACACAAATCCC
+TACCGCTCTAGTGCAGGGGATGTCACTACCCGGTTTGATGAGGTCTTCTGGTTTGGGGAC
+TTCAACTTCCGCCTGAGTGGTGGACGAGTGGCTGTGGAGGCCTTCCTGAAGCAGAAACCT
+GAGGTGGATGTGCTGGCTCTCCTCCAACACGACCAGCTCACCCGGGAGATGAAGAAAGGG
+TCCATCTTCAGGGGCTTTGAGGAGGCAGAGATTCACTTTCTTCCATCCTACAAGTTTGAC
+ATTGGGAAGGACACCTACGACAGCACCTCCAAGCAAAGGACACCCTCCTACACAGACCGA
+GTCCTATACAAAAGCCGTCACAAGGGTGACATCTGTCCCATGAAGTATTCCTCTTGTCCT
+GGGATCAAGACTTCAGACCACCGTCCTGTGTATGGCTTGTTCCAGGTGAAAGTGAGGCCA
+GGACGAGACAACATCCCATTAGCTGCCGGCAAGTTTGACCGAGAATTGTACTTGATAGGA
+ATTAAAAGGCGGATTTCAAAGGAGATTCAGAGACAGGAAGCACTGAAGAGCCAGAGCTCC
+AGTGCAGTTTGCACCGTGTCCTGAAGATTCCAGACCAGGACTGGCCACAGCAACGGGGGC
+CAAGGTCACTGCAAAGGATGGGCTTCTTCTCAGCTGCTCCTGTAATGCTGGGATTCTAAT
+CCACCACGGCCAGGGGCTCCCTGCTCTCACCACAGACCCAGCCCTCAGGACATTTATACC
+ATGTTCCCACAGGCACATGGCAGGGCATGTGGACACCAAGCAGCAGTTTTGTCCTCAGGA
+GTAGTCCAGACTTCTTGCCCTTGAGCACTGCTGTCTCTTCAAACTCCTTTTATTTATTCC
+TGTTCTCATGCTAGAGCCCAGGTTCTCCATCTGTATCCTCCTAGTAGCTCCTTCCCTCCA
+GGGAAGGATCAGGCAACCTCTGGTATCCTAGATGCTCAATGCCTAGAACCTGCCAGGACT
+TCAATTCTGGGATATTCCCTACAGACATTTTGACAGGCTTTGAGGTTCTACATCCTGGTC
+CCAGGCTCCCAACCCCCAGTTGAGTAGGGACCTCTCCACTCTACAGGCCAAGCCTAGCTA
+TATTAAACTCATAGTTTTTAGGAGCTTCAGACCATTTGCTTTTGTGCTGCTAGTCCCGGA
+AAGGCATGAGAAATTGTTACCAGACAGCACCTTGCTGGGTTTCACTCCTTGAAGAAAGCT
+TAGGAGCATCATTGCTCTCAATCTTACCCCACCCCTTCAGACATAGCCTTGAATGTACAG
+ACACCTAGGGGCATCCACTCTAGTCTTCTAAATCATTTATTTTTCCATATTTATATTTTT
+AAATAAATAAGGATATATTCAATTGTAAACTCTTTCTGGCCAAAGAGTGAACCTTGGAAG
+AAGTCTGCATGCATCTTGGGGCCTCAGGACACCCCAGGGTTTTAAAAGGACATAGAAGTC
+AAAGGCCAAACATTTGGTCTCAGCTGTCACCTGCTACTCAGTCCCATCCCAGGTCTTTCT
+GCTAGGTACTGTCCCTGCTCACAGCCAGAAGCAGCAATAGCTGGAAAAAGTGACGACTTG
+GGACTCCAGTGAACCATAATAAACCAACGAATAAGGTGAAACTCAACAGCATCAGCTTCT
+CCAATATGGAAAGTCACCTGCTTCAATAAACCACTGTGAACTGCAAATTCTACTGGGAAG
+ACAGCCTTTTCTCTCCCAGACAGGCTGCCCTGGACTTCATAATCCTGCCTCAACTATTCC
+TGGCTTGAATAAGGTTTGATGTGGC
+>TR15|c0_g1_i2 len=3637 path=[6028:0-88 6297:89-105 6273:106-110 6316:111-119 6338:120-133 6329:134-180 6343:181-184 6342:185-223 6337:224-232 6328:233-279 6294:280-395 6327:396-428 6313:429-442 6293:443-464 6341:465-466 6336:467-479 6326:480-487 6340:488-503 6335:504-511 6325:512-527 6311:528-538 6290:539-586 6263:587-606 6229:607-630 6289:631-725 6169:726-742 6262:743-813 5953:814-857 5954:858-859 6261:860-919 6071:920-943 6334:944-955 6310:956-993 6344:994-999 6347:1000-1000 6309:1001 [...]
+GCCAGGGTGACCACTAGACTGAGCTGGGGCGAACCCTGGGCGGGGGCGGGGGCCGAGGCA
+CGGGGCCGCAGTCGTTGTTCCAGCTGCCACCGTGACTGGCCTAGGTCCGCCTCCGCCAGC
+GCTGGGCCCGGCTGAATCAGACCTCGGGCGTCCGGCGGCGGGTCTGCTGCCGAACGGAGG
+GCGCAGGTGAGCCTAGGACGCTGAGCGCGCTGCCCTACTCTGCCTCGGCGGGGTGGAGGG
+CTGGCCGGGGGTGCTGGACAGACTTGTGCAGCTCCGTGAAGTGCAGCCCCGACCCCCTGG
+CGCCTGTTCTCACGAAGTCGCTTTTAAGACTAGCGAGCTGACTTCGGGGAGCCAAGAGAT
+TTTTCTGCGTTTCCTCAGGCATCGGTGAGAACTCTCAAGTCTCCAGCCATGCAGCTACAG
+GCCCTCCTCCAAAAGGACCGCCCCATGCCACAAAGGGAGCCACTCGAGTTTTCATGGCAT
+CGAGCTGGCGAACTCTGACGTGCATCCTTGACAACAAGAGTTGCTTGTTAACCTCCCAGG
+GAGGATCCCTTTCCTTAGGAGGGCCAGGCTGAGGGGGTCAGGGCTGGCCAGGTCTGGACT
+ATGCCATCCAAGTCAGCTTGCCTGCGTCACACTGAGGCACCTGGGCAGCTAGAAGGCAGA
+ATGCTCCAGGGACAGCCTCCGAACACGGAAAAGAAGCTCATCCCAACACCAGGCTTCTTA
+CCAGCCTCTGACTCTCAGGGTTCAGAGACAAACCCCATGCCTCCTTTCAGCATTCCAGCA
+AAAACAAGCAACCAGAACCCACAAACTAAGGCAAATCTCATCACCCCACAGCCACCCATT
+AGACCCAAGTTGGAGCGAACCCTGTCCCTCGATGACAAGGGCTGGAGAAGGAGGCGTTTC
+CGGGGTAGTCAGGAGGATCTGACTGTCCAGAATGGGGCCAGTCCCTGCAGGGGCTCCTTG
+CAAGACTCAGTAGCCCAGTCCCCTGCCTACAGCCGTCCCCTGCCCTGCCTCAGCACATCC
+TTGCAGGAGATACCTAAGTCCCGAAGGGCCACAGGCAGTGAGGGAGGGAGCCCATCCTTG
+TGGAGTGACTGTCTTTCTGGAATGATCAGCACCTCCTTGGACCTCCTGCACAGAGATGCT
+GCCTCAGGTGGGCCCCCCTCCAGGTTGGCAAGTTTGCATGCCTCACACACACCACCAGCT
+ATGGACCTCAGCATAGCCTCCAGCTCCCTGAGAACAGCAAACAAGGTTGACCCCGAGCAC
+ACGGACTACAAGCTCCGCATGCAGACCAGACTGGTCAGGGCCCACAGCAACCTGGGCCCT
+AGCAGACCCCGGAGCCCCTTGGCTGGTGACGATCACTCCATTCACTCAGCCAGATCTTTC
+AGCCTTCTGGCCCCCATCCGCACCAAGGACATCAGAAGCAGGAGCTATCTGGAGGGAAGT
+CTTCTGGCCAGTGGGGCCCTGCTAGGAGCAGAAGAGCTGGCCAGGTACTTCCCAGACCGA
+AACATGGCTCTCTTCGTGGCTACCTGGAACATGCAGGGCCAGAAGGAGCTCCCAGCGAGC
+CTGGATGAGTTTCTGCTCCCCACCGAGGCTGACTACACTCAGGACCTGTATGTCATTGGA
+ATTCAGGAGGGCTGCTCTGACAGGCGGGAGTGGGAGACACGCCTGCAGGAGACACTGGGC
+CCTCAGTATGTACTGCTGTCATCAGCAGCACATGGGGTCCTGTACATGTCCCTGTTTATC
+CGTAGGGACCTCATCTGGTTCTGCTCAGAGGTCGAGTACTCCACAGTAACTACACGCATC
+GTGTCTCAGATCAAGACCAAGGGGGCCCTGGGCGTCAGCTTCACCTTTTTTGGCACCTCC
+TTCCTCTTCATCACATCTCACTTCACCTGGGATGTCACTACCCGGTTTGATGAGGTCTTC
+TGGTTTGGGGACTTCAACTTCCGCCTGAGTGGTGGACGAGTGGCTGTGGAGGCCTTCCTG
+AAGCAGAAACCTGAGGTGGATGTGCTGGCTCTCCTCCAACACGACCAGCTCACCCGGGAG
+ATGAAGAAAGGGTCCATCTTCAGGGGCTTTGAGGAGGCAGAGATTCACTTTCTTCCATCC
+TACAAGTTTGACATTGGGAAGGACACCTACGACAGCACCTCCAAGCAAAGGACACCCTCC
+TACACAGACCGAGTCCTATACAAAAGCCGTCACAAGGGTGACATCTGTCCCATGAAGTAT
+TCCTCTTGTCCTGGGATCAAGACTTCAGACCACCGTCCTGTGTATGGCTTGTTCCAGGTG
+AAAGTGAGGCCAGGACGAGACAACATCCCATTAGCTGCCGGCAAGTTTGACCGAGAATTG
+TACTTGATAGGAATTAAAAGGCGGATTTCAAAGGAGATTCAGAGACAGGAAGCACTGAAG
+AGCCAGAGCTCCAGTGCAGTTTGCACCGTGTCCTGAAGATTCCAGACCAGGACTGGCCAC
+AGCAACGGGGGCCAAGGTCACTGCAAAGGATGGGCTTCTTCTCAGCTGCTCCTGTAATGC
+TGGGATTCTAATCCACCACGGCCAGGGGCTCCCTGCTCTCACCACAGACCCAGCCCTCAG
+GACATTTATACCATGTTCCCACAGGCACATGGCAGGGCATGTGGACACCAAGCAGCAGTT
+TTGTCCTCAGGAGTAGTCCAGACTTCTTGCCCTTGAGCACTGCTGTCTCTTCAAACTCCT
+TTTATTTATTCCTGTTCTCATGCTAGAGCCCAGGTTCTCCATCTGTATCCTCCTAGTAGC
+TCCTTCCCTCCAGGGAAGGATCAGGCAACCTCTGGTATCCTAGATGCTCAATGCCTAGAA
+CCTGCCAGGACTTCAATTCTGGGATATTCCCTACAGACATTTTGACAGGCTTTGAGGTTC
+TACATCCTGGTCCCAGGCTCCCAACCCCCAGTTGAGTAGGGACCTCTCCACTCTACAGGC
+CAAGCCTAGCTATATTAAACTCATAGTTTTTAGGAGCTTCAGACCATTTGCTTTTGTGCT
+GCTAGTCCCGGAAAGGCATGAGAAATTGTTACCAGACAGCACCTTGCTGGGTTTCACTCC
+TTGAAGAAAGCTTAGGAGCATCATTGCTCTCAATCTTACCCCACCCCTTCAGACATAGCC
+TTGAATGTACAGACACCTAGGGGCATCCACTCTAGTCTTCTAAATCATTTATTTTTCCAT
+ATTTATATTTTTAAATAAATAAGGATATATTCAATTGTAAACTCTTTCTGGCCAAAGAGT
+GAACCTTGGAAGAAGTCTGCATGCATCTTGGGGCCTCAGGACACCCCAGGGTTTTAAAAG
+GACATAGAAGTCAAAGGCCAAACATTTGGTCTCAGCTGTCACCTGCTACTCAGTCCCATC
+CCAGGTCTTTCTGCTAGGTACTGTCCCTGCTCACAGCCAGAAGCAGCAATAGCTGGAAAA
+AGTGACGACTTGGGACTCCAGTGAACCATAATAAACCAACGAATAAGGTGAAACTCAACA
+GCATCAGCTTCTCCAATATGGAAAGTCACCTGCTTCAATAAACCACTGTGAACTGCAAAT
+TCTACTGGGAAGACAGCCTTTTCTCTCCCAGACAGGCTGCCCTGGACTTCATAATCCTGC
+CTCAACTATTCCTGGCTTGAATAAGGTTTGATGTGGC
+>TR15|c0_g1_i3 len=253 path=[6206:0-56 6337:57-65 6328:66-112 6294:113-228 6080:229-252] [-1, 6206, 6337, 6328, 6294, 6080, -2]
+TGCCGGGCGGCGGGGGCAGGTGAGCCTAGGACGGTGAGCGCGCTGCCCTACTCTGCCTCG
+GCGGGGTGGAGGGCTGGCCGGGGGTGCTGGACAGACTTGTGCAGCTCCGTGAAGTGCAGC
+CCCGACCCCCTGGCGCCTGTTCTCACGAAGTCGCTTTTAAGACTAGCGAGCTGACTTCGG
+GGAGCCAAGAGATTTTTCTGCGTTTCCTCAGGCATCGGTGAGAACTCTCGAGTCTCCAGC
+CATGCAGCTACAG
+>TR16|c0_g1_i1 len=3869 path=[6096:0-46 6189:47-92 6202:93-134 6195:135-209 6187:210-222 6206:223-243 6200:244-564 6214:565-1315 6212:1316-1707 6208:1708-1881 6217:1882-1892 6123:1893-1905 6198:1906-1916 6191:1917-2304 6203:2305-2634 6197:2635-3020 @6190@!:3021-3845 6153:3846-3868] [-1, 6096, 6189, 6202, 6195, 6187, 6206, 6200, 6214, 6212, 6208, 6217, 6123, 6198, 6191, 6203, 6197, 6190, 6153, -2]
+TGACCCGATATGCTGCATCCCTGAGTCAGTATGCTGCTGCCTCCCAGTCCTGTAACTTTG
+CACTCAGGTTTTTCCACTCCAACCAGAAAGATATACTGCAGGCAAACAGCTGGCCGAGGT
+GTCCCCTGGGGGTTTAAAAGCCGCATCGAATGCAGTTGACTTAGCACCCGTGGCGCAGCC
+CCACGGCTTGAAATGAACCCTGCGAGGCTGTGTATCAGAGGACCTCAGAATACATTATTC
+AAGCTTACAAATATGGTGCATTTGAGAAGATCCCAGAGTTTATCGCTTTTAGGAACAGGC
+TGAATAATTCTCTCCATTTTGCACAAGTACGCACTGAGCGGATGCTGTTAGACCTTCTAC
+TTGAAGCAAACATATCAATTAGCTTGGCAGAAAGTATCAAATCAATGAATCTGAGGCCAG
+AGGAAGATGATGTTCCATGGGAAGATTTGCGAGACAACAGAGACTTGGATGTTTTCTTCA
+GTTGGGATCCAAAAGACAGGAATGTTTCTGAAGAGCATAAGAAACTCTCCTTGGAGGAAG
+AAACCATGTGGTTAAGAATTCGCTCCTTAACGTTGAGGCTGATCAGTGGACTTCCAAGTC
+TTACCCACCCTGTGGAGCCCAAGAACTCAGAGAAGATGTCAGAGAACGGTGTGTCCTCCC
+GGATCGACATCCTTCGTTTGCTCCTCCAACAGCTAGAGGTGGCCGTGGAGACGGGGAAGC
+GGTTTATTGAGAAGGAAATTCAGTACCCCTTCCTTGGGCCTGTTCCCACCAGGATGGGCA
+GGTTCTTCAGTTCTGGCTGCTGTCAGTGCCAAGTCCAGTCCTTCCATCTGGTCAGCGACA
+TGTATGAGCTTGACACCAGTGGCTTAGAGGGTACAGTGGATATACAGGAACGAATAGAAA
+ATAGTCTTGCATCTTTACTAGAACTATTGAAAGGTGTCTTCAGCACATGTAAAGGGGACC
+TCTTAGAAGTTACAGATGGCAATGTGAAGACCCAGCCTGCAGTCCTAGAGAATCTGGTCT
+TCTTCGTTGAGACTATTTCTGTCATCCTTTGGGTGTCCAGTTACTGTGAAAGTGTCTTGC
+GACCATACAAATTAAATATCCAGAAAAAGAAAAAGAAGAAAAAAGAAACGAGCATCATCA
+TGCCTCCAATCTTCACCAGTTTCCAAGACTACGTTACTGGACTTCAGACTGTAATTTCCA
+ATGCTGTGGATCATATTAAAGGACTTGAAGCACATCTGATTGCACTTAGACTTGAGGAGC
+TCACGTTAGAGGAAACTTCTATCTCTACGGAAGAAAGAAAATTTTCAAAGACTGTGCAGG
+GGAAAGTCCAGAGCAGTTACCTGCACTCACTTCTGGAGACAGGGGAGCTGCTGAGAAAAA
+GACTTGAGACTACAAAGAAACTAAAAATTTAAGGAATTCTGAACCATAAACACCGAAGGT
+TCCACAGCAGAAGATGACACACCACCTTCCCCAGCAAAAACAACATCTGGCTGGCATTGT
+TCTAATCCAGAACTTCCTCACAAATGCATGAAGGACTTTGATCGTGAATTAATTTTTGAG
+GTATTAAATATATACAACAAATTAAATTATTGTATATAAACCAGAAGCAGGACCCTCATC
+TGGGTTTACCACTCTTTATACCTGTCCATACATACAGGACAGCAACAAGAGCACCCCACC
+TCACTCCCAGCTCCAGGAATGGCTGGGGTGGACATTTCTATACAAGCAGCAATAGAGAAT
+AAGTATAGCATCGACCTCAGAGCAGGTGGGTTGCTTTTTCATCATGCAGTGGGAGTTTGG
+GTTGGGTAGCCCATACTGTAGCCGTATGAGGCAAAAGCAGGTGTAGGAGACCCAGGAGCA
+GGACCCTTCCCTCAGTGGCAGGTTCCTTGTGCCATCCCACAGAACCGGGATGGACCCACA
+GAGGCTCAAGGGAGATGTGGCTGAGTACGTGCCACCACAGGGCACCACACATGACCACAG
+GTGCTCAGTTTTGGCTTCACAGCCCCAGCAGCCAAGACATCCCCAGCCCCGCTCCTGGGA
+GAGCTCAGCCTCAGGGCAGTGAGGAAGTCCAAGTTCTGCCCACTTTGAGGAAGAAATCTG
+AGCACAGCCCACCGTGAGCTTCGTAAACTGCTGAGACTGAGCCCCGCTGGTCTTCTGGGA
+AAGGTGGAAAAGCTGTTGGAAGAGGTTGTACGTGGTGTGTGCAGGCGAGTCTGATATTTG
+TGTCGTCATTAAGTCACCTTGTGCAGCTGATTGATGAGTCACACACAGATACACATATGC
+ATAAATATGCTTGGAAACAGATTTACTACTCTAGTGCTTTTAAGGGGGGCTTTGGGATGG
+AAGGATTAAATATGGGTTTAACCTAGGTTTTTAAGTTTTAGGTTGAAAAAGGTATGTTTT
+ATAATGGGCCTGATGTTGGTGTCCTGTTGACACTTAAGAACTGCATCAGGGTGTATTCAT
+GTTGTTCACCTAAGGTTGGTGGCCTGTTCCCTAAGCCTCCAGCTTAAGAGGCTGGTCTGC
+GAGAAGATGAAAACTGCTCTTGATTATGTCATGCCGAGCTCCGACAGCGCTTTCCGTGAC
+TGTTTTGTGTCTGAATCTCCTCTCTCACTTCTGTTCTTGTTCCCTGTCACTTTATTCCTG
+AGAGTAACTGTAAGGTGAAAAGATGACTTGGTGAGGACTGGTCTTTCCCATGGACTGCTC
+CAGCAGCACACCATTGCATTCTTTATCGTAACTGTCTGGGATTCACAAATCAGCATAGTG
+GTTAACTAATTTACTTGTAAGGAAATGTGTGCAAACTACTTTCTTACTTGTAGGATGTGC
+TGGAGCCTACATCATGGTTGCATCAGAGTATCACGTGCTCCATCCCCAAAAAAAGGGCCT
+TTTTGAATAAGATGGGTTGAAGACCCTGATTTTGACTTGCCTTGAACACCACCTTGTGGT
+ACTGTTCTGTAGTTGTGGCCTGTTTCCCATGGGACTGGGTGGGCGTTTGCTTGCACTGCC
+CTGGCTCCTGGAATAATGTTTCTTGGGATATTCAAATTGTGCTGTGTGTTCACGGTCACA
+GATGCTCTAAATCAAGCTCTGTCAGCTGACCATGGTCCGTATGGACTGCATGGGCTGGCT
+ATGGCCCTCAGGCATAGCTCCTTCCTCTAATGGTCTATCCTGTCAGTCTCCTGCTCTAAC
+ATGTAGGGCCTCCACTGGTCTTGTTGACAAATAATGTCATGGTGGGGTTACACTTCCTCT
+GTTACTTGCTGATTTTCTTACTAAATGTAGCATTTCAATCAGATCTAATTCTTACATTTT
+GAGATAACTGTAAAAAGAGTGAAATTATGAAATGGCCAATATCTTTTATCAGTCTATTCT
+TTTGGAAGCTGTCATGCACTATACATTGTGTACAGTTAAAAGTATATATATATATATATT
+CTTACTGAGTGAACGCCTCCTCTCCCCACGCCTGTATGTCACTAGCATCTAAGGAGAATG
+CTCAAGGCCCAGTGCTGCTGCTGCTGTGGTTTATATGGGTTTTGTTCTGTTTTGTTTTTG
+TGTGGTAAATTGATATTTAAAAACAACAAAAACCACGACTACTGTTTACAGACTGAAAAA
+AAACAATCACTGCTTTTTATACTACTGAGATCCTAAGTCAAGACTTTGCAAAGCAGGAAT
+CGGGTTCAAGTTACTTCTTTGCTGTGGACGGATAGTCCTCTGTAGTATCTCCACATGATG
+GAGAGTGCACAAACCTAGGTGTGCTGCCATCAATTTTGTATATTTTCATAATTTTAATTG
+TTCGAAATTGCATTATATTTTGCAATCACCACATTCAATCTGTATATGTCTTTCATTTCA
+ACTTTTTCAATACAAAAAGGGATTCAATT
+>TR16|c0_g1_i2 len=5399 path=[6143:0-93 6207:94-298 6201:299-347 6194:348-1202 6186:1203-1705 6094:1706-1751 6205:1752-1773 6200:1774-2094 6214:2095-2845 6212:2846-3237 6208:3238-3411 6217:3412-3422 6123:3423-3435 6198:3436-3446 6191:3447-3834 6203:3835-4164 6197:4165-4550 @6190@!:4551-5375 6153:5376-5398] [-1, 6143, 6207, 6201, 6194, 6186, 6094, 6205, 6200, 6214, 6212, 6208, 6217, 6123, 6198, 6191, 6203, 6197, 6190, 6153, -2]
+ACTGAGGTTCTGCGCTTGTCATCATGGCGACGCGGGGCCATGTGCAGGACCCTAACGACC
+GGCGCCTCCGGCCCATTTACGATTATCTTGATAATGGAAATAATAAAATGGCAATTCAGC
+AAGCTGATAAACTGTTGAAGAAACACAAAGATCTTCACTGTGCAAAGGTTCTCAAGGCCA
+TTGGTTTACAGAGAACTGGCAAGCAGGAAGAAGCTTTCACCTTGGCTCAGGAGGTGGCTG
+CCCTTGAGCCCACAGATGACAACTCCCTGCAGGCCCTGACGATTCTCTACCGAGAGATGC
+ACCGGCCGGAGTTAGTCACAAAGCTCTATGAGGCGGCTGTGAAGAAAGTTCCCAACAGCG
+AGGAGTACCACTCTCACCTCTTCATGGCCTATGCCAGAGTGGGCGAGTACAAGAAGATGC
+AGCAGGCTGGCATGGCTCTGTATAAGATTGTCCCCAAAAACCCTTACTACTTTTGGTCAG
+TGATGAGCTTGATCATGCAATCTATATCCGCACGGGATGAGAACCTCTCCAAAACCATGT
+TTCTGCCCCTGGCGGAGAGAATGGTAGAGAAGATGGTGAAGGAGGACAAGATAGAGGCTG
+AAGCTGAGGTTGAACTTTATTACATGATTCTGGAGCGCTTGGGAAAGTACCAGGAAGCCC
+TGGATGTCATTAGAGGAAAATTAGGAGAGAAGTTGACAAGTGAAATTCAGAGTCGGGAAA
+ACAAATGCATGGCCATGTACAAGAAGCTGAGCAAGTGGCCGGAGTGCAACGCCCTTTCCC
+GACGCCTCCTTCTGAAAAACTCAGATGACTGGCAGTTCTATCTGACTTATTTCGATTCTG
+TCTTTCGACTGATTGAGGAAGCCTGGACGCCGCCTGCTGAGGGGGAACACTCCTTAGAAG
+GGGAAGTACACTGCTCTGCAGAAGATGCTGTGAAGTTTATAGAGGACAGGATAACAGAGG
+CATCACAAAGCTCTCGACATGTCCGAGGCCCACACCTAGCTAAGCTGGAGCTCATCAGGC
+GCTTGCGGAGCCAAGGCTGTAATGACGAATACAAGCTGGGTGACCCTGAAGAGTTAATGT
+TCCAGTATTTCAAGAAGTTCGGGGATAAGCCATGCTGCTTCACAGACCTGAAGGTGTTCG
+TTGACCTCTTGCCTGCCGCCCAGTGCACACAATTCATTAACCAGCTCCTTGGAGTTGTTC
+CATTGTCGACGCCGACAGAGGATAAGCTTGCCCTGCCGGCCGACATCCGAGGCCTGCAGC
+AGCATCTGTGTGTTGTGCAGCTGACACGGCTCCTTGGCTTGTACCACAGCATGGATAAGA
+GTCAGAAGCTGGATGTGGTCAAAGAACTGATGTTAAGGTACCAGCACGGACTGGAGTTTG
+GGCGCTCTTGTTTGAAGACAGAGTTGCAGTTCTCAGACTATTACTGCCTGCTCGCTGTTC
+ATGTGCTCATTGATGTATGGAGAGAAGCAGGTGAGGAGACTGCGGTCTGGCAGGCCCTGA
+CTCTGCTGGAAGAAGGCTTAACCCACAGCCCATCCAATGCTCAGTTCAAATTGCTACTTG
+TTCGGATCTACTGCGTGCTGGGTGCATTTGAACCAGTGGTGGATCTCTACTCCAGTCTCG
+ATGCTAAGCACATCCAGCACGACACCATTGGCTATCTTCTGACCCGATATGCTGCATCCC
+TGGGTCAGTATGCTGCTGCCTCCCAGTCCTGTAACTTTGCACTCAGGTTTTTCCACTCCA
+ACCAGAAAGATACCTCAGAATACATTATTCAAGCTTACAAATATGGTGCATTTGAGAAGA
+TCCCAGAGTTTATCGCTTTTAGGAACAGGCTGAATAATTCTCTCCATTTTGCACAAGTAC
+GCACTGAGCGGATGCTGTTAGACCTTCTACTTGAAGCAAACATATCAATTAGCTTGGCAG
+AAAGTATCAAATCAATGAATCTGAGGCCAGAGGAAGATGATGTTCCATGGGAAGATTTGC
+GAGACAACAGAGACTTGGATGTTTTCTTCAGTTGGGATCCAAAAGACAGGAATGTTTCTG
+AAGAGCATAAGAAACTCTCCTTGGAGGAAGAAACCATGTGGTTAAGAATTCGCTCCTTAA
+CGTTGAGGCTGATCAGTGGACTTCCAAGTCTTACCCACCCTGTGGAGCCCAAGAACTCAG
+AGAAGATGTCAGAGAACGGTGTGTCCTCCCGGATCGACATCCTTCGTTTGCTCCTCCAAC
+AGCTAGAGGTGGCCGTGGAGACGGGGAAGCGGTTTATTGAGAAGGAAATTCAGTACCCCT
+TCCTTGGGCCTGTTCCCACCAGGATGGGCAGGTTCTTCAGTTCTGGCTGCTGTCAGTGCC
+AAGTCCAGTCCTTCCATCTGGTCAGCGACATGTATGAGCTTGACACCAGTGGCTTAGAGG
+GTACAGTGGATATACAGGAACGAATAGAAAATAGTCTTGCATCTTTACTAGAACTATTGA
+AAGGTGTCTTCAGCACATGTAAAGGGGACCTCTTAGAAGTTACAGATGGCAATGTGAAGA
+CCCAGCCTGCAGTCCTAGAGAATCTGGTCTTCTTCGTTGAGACTATTTCTGTCATCCTTT
+GGGTGTCCAGTTACTGTGAAAGTGTCTTGCGACCATACAAATTAAATATCCAGAAAAAGA
+AAAAGAAGAAAAAAGAAACGAGCATCATCATGCCTCCAATCTTCACCAGTTTCCAAGACT
+ACGTTACTGGACTTCAGACTGTAATTTCCAATGCTGTGGATCATATTAAAGGACTTGAAG
+CACATCTGATTGCACTTAGACTTGAGGAGCTCACGTTAGAGGAAACTTCTATCTCTACGG
+AAGAAAGAAAATTTTCAAAGACTGTGCAGGGGAAAGTCCAGAGCAGTTACCTGCACTCAC
+TTCTGGAGACAGGGGAGCTGCTGAGAAAAAGACTTGAGACTACAAAGAAACTAAAAATTT
+AAGGAATTCTGAACCATAAACACCGAAGGTTCCACAGCAGAAGATGACACACCACCTTCC
+CCAGCAAAAACAACATCTGGCTGGCATTGTTCTAATCCAGAACTTCCTCACAAATGCATG
+AAGGACTTTGATCGTGAATTAATTTTTGAGGTATTAAATATATACAACAAATTAAATTAT
+TGTATATAAACCAGAAGCAGGACCCTCATCTGGGTTTACCACTCTTTATACCTGTCCATA
+CATACAGGACAGCAACAAGAGCACCCCACCTCACTCCCAGCTCCAGGAATGGCTGGGGTG
+GACATTTCTATACAAGCAGCAATAGAGAATAAGTATAGCATCGACCTCAGAGCAGGTGGG
+TTGCTTTTTCATCATGCAGTGGGAGTTTGGGTTGGGTAGCCCATACTGTAGCCGTATGAG
+GCAAAAGCAGGTGTAGGAGACCCAGGAGCAGGACCCTTCCCTCAGTGGCAGGTTCCTTGT
+GCCATCCCACAGAACCGGGATGGACCCACAGAGGCTCAAGGGAGATGTGGCTGAGTACGT
+GCCACCACAGGGCACCACACATGACCACAGGTGCTCAGTTTTGGCTTCACAGCCCCAGCA
+GCCAAGACATCCCCAGCCCCGCTCCTGGGAGAGCTCAGCCTCAGGGCAGTGAGGAAGTCC
+AAGTTCTGCCCACTTTGAGGAAGAAATCTGAGCACAGCCCACCGTGAGCTTCGTAAACTG
+CTGAGACTGAGCCCCGCTGGTCTTCTGGGAAAGGTGGAAAAGCTGTTGGAAGAGGTTGTA
+CGTGGTGTGTGCAGGCGAGTCTGATATTTGTGTCGTCATTAAGTCACCTTGTGCAGCTGA
+TTGATGAGTCACACACAGATACACATATGCATAAATATGCTTGGAAACAGATTTACTACT
+CTAGTGCTTTTAAGGGGGGCTTTGGGATGGAAGGATTAAATATGGGTTTAACCTAGGTTT
+TTAAGTTTTAGGTTGAAAAAGGTATGTTTTATAATGGGCCTGATGTTGGTGTCCTGTTGA
+CACTTAAGAACTGCATCAGGGTGTATTCATGTTGTTCACCTAAGGTTGGTGGCCTGTTCC
+CTAAGCCTCCAGCTTAAGAGGCTGGTCTGCGAGAAGATGAAAACTGCTCTTGATTATGTC
+ATGCCGAGCTCCGACAGCGCTTTCCGTGACTGTTTTGTGTCTGAATCTCCTCTCTCACTT
+CTGTTCTTGTTCCCTGTCACTTTATTCCTGAGAGTAACTGTAAGGTGAAAAGATGACTTG
+GTGAGGACTGGTCTTTCCCATGGACTGCTCCAGCAGCACACCATTGCATTCTTTATCGTA
+ACTGTCTGGGATTCACAAATCAGCATAGTGGTTAACTAATTTACTTGTAAGGAAATGTGT
+GCAAACTACTTTCTTACTTGTAGGATGTGCTGGAGCCTACATCATGGTTGCATCAGAGTA
+TCACGTGCTCCATCCCCAAAAAAAGGGCCTTTTTGAATAAGATGGGTTGAAGACCCTGAT
+TTTGACTTGCCTTGAACACCACCTTGTGGTACTGTTCTGTAGTTGTGGCCTGTTTCCCAT
+GGGACTGGGTGGGCGTTTGCTTGCACTGCCCTGGCTCCTGGAATAATGTTTCTTGGGATA
+TTCAAATTGTGCTGTGTGTTCACGGTCACAGATGCTCTAAATCAAGCTCTGTCAGCTGAC
+CATGGTCCGTATGGACTGCATGGGCTGGCTATGGCCCTCAGGCATAGCTCCTTCCTCTAA
+TGGTCTATCCTGTCAGTCTCCTGCTCTAACATGTAGGGCCTCCACTGGTCTTGTTGACAA
+ATAATGTCATGGTGGGGTTACACTTCCTCTGTTACTTGCTGATTTTCTTACTAAATGTAG
+CATTTCAATCAGATCTAATTCTTACATTTTGAGATAACTGTAAAAAGAGTGAAATTATGA
+AATGGCCAATATCTTTTATCAGTCTATTCTTTTGGAAGCTGTCATGCACTATACATTGTG
+TACAGTTAAAAGTATATATATATATATATTCTTACTGAGTGAACGCCTCCTCTCCCCACG
+CCTGTATGTCACTAGCATCTAAGGAGAATGCTCAAGGCCCAGTGCTGCTGCTGCTGTGGT
+TTATATGGGTTTTGTTCTGTTTTGTTTTTGTGTGGTAAATTGATATTTAAAAACAACAAA
+AACCACGACTACTGTTTACAGACTGAAAAAAAACAATCACTGCTTTTTATACTACTGAGA
+TCCTAAGTCAAGACTTTGCAAAGCAGGAATCGGGTTCAAGTTACTTCTTTGCTGTGGACG
+GATAGTCCTCTGTAGTATCTCCACATGATGGAGAGTGCACAAACCTAGGTGTGCTGCCAT
+CAATTTTGTATATTTTCATAATTTTAATTGTTCGAAATTGCATTATATTTTGCAATCACC
+ACATTCAATCTGTATATGTCTTTCATTTCAACTTTTTCAATACAAAAAGGGATTCAATT
+>TR17|c0_g1_i1 len=227 path=[228:0-57 229:58-226] [-1, 228, 229, -2]
+CTCCCTAAGCCACTGTCTAGCTTTTCTTTTCATTAGCACTTAGAGCAGCGACTTCAAAGG
+ACCATACTTTAACCGCAGTGCTTGAGAGGCAGAGGCAAGCATATATATCTGTGAGTTCCA
+GGACAGCCTGACTATGTTCAAAACTAAAGAAAGAAATCATGGTGGCACACATATAATCCT
+AGCACTGGGGAAACGAGGCAGAAGGATCAGGAATTTGAGGCCAGCTT
+>TR17|c1_g1_i1 len=298 path=[276:0-297] [-1, 276, -2]
+GACTTGTTCTAAGCAAGGGTCTGTGAGGTGGGGAAAGATAGCACTGTTGTAGTTAACACA
+AATGTTCTTATTGTTCACTAAGCTCTGCTCACTTGTAGAAATGTTAACCAAGAACACCAG
+AAATAGTTGCTCAGCAGCCAGAAGCCAGGAGTTCCTCACCTGTGCCTTTTCGACTTTGAC
+AACATCTGCCTTGAAATTTTGAGAAACAACATTCTTTGTCCTTCCTGCCCGCCTTAGATT
+TTTGTCTGTTCTTCTACACTGTTGTGAATCACACCTTTGTACACTGAAGTCAATGTTT
+>TR18|c0_g1_i1 len=433 path=[461:0-143 462:144-167 467:168-228 465:229-252 466:253-432] [-1, 461, 462, 467, 465, 466, -2]
+AAAAGTATTTGGAATTTTGATTAGTTGGATTTCATTCTGTTTTACTTCATAATAACTAAA
+TATAGTTTGTGCTGAGACTGAATTGTTATTTAGGAAGAAAATTGCTTGTGCATTGTTTGT
+TCCTGTCCTGAGAGCAGTGGTTCAATACATCTCAGAAATCGATATTCCGGTCGCCTATTT
+TAGGAATAAAACTAATCAGGTGCAGAAAAATTTAATTCTTTTATCAGTGAAAGAAAACAC
+CACAATTTGAAGCCAAGTCTCAGTATCAGGCCTGCACAGCCACTCTCTCAGGGACTCCAT
+CTAAGTAAAACTTAGAAAATGGAGCTGGGGGTTTTCTAAACAGTCCCAATAGATCCCCTC
+AGTGTTTGGTTTTCTTCCTCATTTGAAAACCGTGTGTTGGTGCTCGAGTTCACAGAAACA
+AATAGGGTCTAGG
+>TR19|c0_g1_i1 len=3697 path=[3923:0-399 3924:400-417 3945:418-545 3943:546-2131 3912:2132-3696] [-1, 3923, 3924, 3945, 3943, 3912, -2]
+GGAGCTGGAGGCCCCCAGGCAACTACACCGTCCACGTACCCAGAGGGGCTGGGCCCTCCC
+ACCAGAGACCACGCCCTGGTGTGCCTTAGGGGCCCTGGTTTGTTAGTCTCTGAGTGTGCA
+GTTGCTGCACATGGGGCCCTGGCGCTTGCTGCACCAACTTCCTGTTGGGCCCGTGGTCCT
+TGGAGGCATGCAGTTCAGCAGACAGTGACTCAGCCATCCACCCAACATGCGGAACGTGTC
+TCTTCTGCAGGTCCCGGTCCACAGCAGGATTCCCCCTCTGTGAAAAGGCACGCTGATCTG
+TCTGGATAAGTGTGGCCGGCCCCATGTATCCGGAATCAACCACGGGGTCCCCAGCTCGAC
+TCTCCCTGCGGCAGACAGGCTCCCCCGGGATGATCTACAGGAATCTGGGCAAATCTGGCC
+TTCGGGTCTCCTGCCTGGGGCTTGGAACATGGGTGACCTTCGGGGGCCAGATCACGGATG
+AGATGGCAGAGCACCTAATGACCTTGGCCTACGATAATGGCATCAACCTGTTCGATACGG
+CGGAGGTCTACGCTGCTGGAAAAGCTGAAGTGGTATTAGGGAACATCATTAAGAAGAAGG
+GATGGAGACGGTCCAGCCTTGTCATCACCACCAAGATCTTCTGGGGTGGAAAAGCGGAGA
+CTGAGAGAGGCCTTTCCAGGAAGCACATAATTGAAGGACTGAAAGCGTCCCTGGAGCGGC
+TGCAGCTGGAGTACGTGGATGTGGTTTTTGCCAACCGCCCAGACCCCAACACGCCCATGG
+AAGAGACCGTGCGGGCCATGACCCATGTCATCAACCAGGGGATGGCCATGTACTGGGGCA
+CATCACGCTGGAGCTCCATGGAGATCATGGAGGCCTACTCGGTGGCTCGGCAGTTCAACC
+TGATCCCGCCCATCTGCGAGCAAGCGGAATATCACATGTTCCAGAGGGAGAAGGTGGAGG
+TCCAGCTGCCAGAGCTGTTCCACAAGATAGGAGTAGGTGCCATGACCTGGTCCCCTCTGG
+CGTGCGGCATCGTCTCAGGGAAGTATGACAGCGGGATCCCACCCTACTCCAGAGCCTCCC
+TGAAGGGCTACCAGTGGTTGAAGGACAAGATCCTGAGTGAGGAGGGTCGCCGCCAGCAGG
+CCAAGCTGAAGGAACTGCAGGCCATTGCCGAACGCCTGGGCTGCACCCTACCCCAGCTGG
+CCATAGCCTGGTGCCTGAGGAATGAGGGTGTCAGCTCCGTGCTTCTGGGTGCTTCCAATG
+CAGAACAACTTATGGAGAACATTGGAGCAATACAGGTCCTTCCAAAATTGTCGTCTTCCA
+TCGTCCACGAGATCGACAGCATTCTGGGCAATAAACCCTACAGCAAAAAGGACTATAGAT
+CCTAAGTCTACTCCCCACCCCTCGTGCCCCACCCGGACAGTTCCCGGTTCCCTCCTCGTC
+TCTGTTCGCTCGCTTCTGCTGTTCCAAAGCCAAATGCAGAGTGTGGTTCACATCCAAAGG
+GAAATCACTATGCCCAGACGTGACAGGGAATCGACCTCCAAAGTCACCGCCAGATGCCGC
+CTGCCGCTTCTTCACTGGATACTGTCCGACAACGGATGCCAGGGGATGGCATCAGTTAGG
+GGGACATCCAGAGGCTCCCGCCCAAGCCCACCACCTCTGCTTATCCTTCAAGAAGAAACA
+CTTGCCCCCAGCCATGGCCCTTCACGGAAATTCTAGAAGCCATGGCCGGGTGGAGGTCTC
+ATCCTTAGAGCAGGAGGGGCCGCCAAGAGCCCATCTCAAAAGAGGGGTGTGCACCCTTCT
+CCCAGAGTCCTGGTGGTTAGAGCAGGGCCCTCCCTCTTTCCATGGACACCAGGTACTTTG
+CTCAAGGCTGGCCTGGATCCCATTCTTCCTAGGTCTTGACCTGCCCCACATACCCACCGA
+GCCTTGGCTGACATAGCTACCCAGCTGGCCCTTGGCCCCCACCCTCCCCCTTGCTGGCAG
+GGCCAGGGATTCCAGCTGGCTTTCCCAGCATCTTCCAACTGCTGAGCCCCACAGCAGGCA
+AGCTCAGCAGGCTTGGATGGAGCCCATCGGAGTATGCCTCTCAAGACAGACACTCGTGGG
+CAAGTGTGGCAGCTGGCCCCACCGCAGGCAGGTGGCAGCAGGCTTGCAAGACCATATTGC
+TCTCACAGACCTTCCAATACCTCTGCTGTACCGGGGCAGTGGGCTCATGATGTGGGCTTT
+GCCCAGATGAAGCACTTAGAGCTATGTTGCAAGCCAGGGAACTACGGGAGCAGCTCCAGT
+AATAGTCTCCGTGTTTTAAGAATAGATCCCAGAGCTTCTCCCTGGAAAAATGGCTAGGAC
+CACCCATTCCCTTCTGCGTACCCTCATGCTGGCCTAGGGCAGGATGGGGAGAGGAAGTAG
+TGGAAAGGATAGGCAGCCCTTTATCACTGGGATAAATCCTGCATGGATGTTGATGCCAGG
+GAGCCTGCGGGATTGGTCAGTACACACTGCCTGGAGGCCCCATCCCATGGTTTTGTGATG
+CTCTGGGGGACAGGGTCCTACCCAGCTGCCTCCCTAGGAGACCAGCCTCCTGCCCTGCTG
+CACAGACCATGGCCAGCTCCCAGGCACAAGTCCTAGATGCTTAGCACCCTAGCTTTGCCT
+TCTGTAGCTGCTATTACAAGGCTGCTCCTTGCTGCTCTTAAGGCTGGGCAGAGGTGAGGA
+CAGGGGTGGGGGTTGGGGGGGTTTATGGGGAGGAGACAGGAAGAAAGGCAGACAAACCCC
+CCCCCGAAAACCCTGAGCTCTCTAACCTTCGCTGCTCATAGTGCTGACCCTAAGACCTCA
+GAAGCAGCTCTGTGTGTGGGGGGATGGAGACCATGGGCTCTGGTATTTCCATGCCTGGCT
+AGCAGAGCCAGCTTTCTGGACAGGGCCCTGCAGTGGCCCAGCAGGAAGTACCAGACCTGT
+CCACACAGCTGGCCTTGGCCCTGCTTGTTAGGTGGGCCAGGCATGCAGGGATGCCCACAG
+TGGGAGCTACTGCCTGCCTGTGAACCACACCTCAGAGCTAAGCTCCTGCTGGTGATGTGC
+AAGAGACAGGAAAACAGGCTGCCGGGCTAAGGCCCATAGGATTTAGCCCACAGGAGCCCT
+AGATGCAAAAGACATGTTAACCAAGTGTTTCTGAGAGGTTGTCTTCCACACCCACTCTCG
+AAGCGTCAGGGATTTGCTTCTTAAACTTCTGCGGAGGGGTTTGGCTTGGGAGGCCATGTA
+GAGCAAGTACAGACAGCCTGTTAGTGGGAGCTTGCCCCCAGGCCCTCAAAGGGTGTAAGG
+CCAGCTCCTTCCTCCATGGCCTCTCCTTCCTTTAGCCCAGCTGCCTGCAGGCCAGCCCAA
+GCCAGCTTCTCTTCACCTTGAAGTAGTCTGCCAGGCCTGGTGCAGGAGGAGGGCCATGTA
+GAGAGAGGATCTGGCACTCGGAGCCCAAGGTCCCAAGGCACAGCAGCGCACCTGTGTGCC
+TGCTCTCCTCATGTACATACATAACGTGCTTTCTCTCCCCGTTTTTTGTTTGTTTTTTTT
+TAAACGAGCGTGGCTCCTCGCTAACTGCACCCCACCAGGCCGACAGCAAACGCCTCCAGC
+TTCCCGACAGACTCAGACCAAGGTGCGGCCCCGTATTTATGGAATGGCAAATAAAACCCG
+AGCCCTTTGGTCTCCACGTTTCTGATCTCTCCTTTCC
+>TR19|c0_g1_i2 len=3739 path=[3913:0-399 3914:400-412 3915:413-413 3940:414-440 3946:441-459 3945:460-587 3943:588-2173 3912:2174-3738] [-1, 3913, 3914, 3915, 3940, 3946, 3945, 3943, 3912, -2]
+GGAGCTGGAGGCCCCCAGGCAACTACACCGTCCACGTACCCAGAGGGGCTGGGCCCTCCC
+ACCAGAGACCACGCCCTGGTGTGCCTTAGGGGCCCTGGTTTGTTAGTCTCTGAGTGTGCA
+GTTGCTGCACATGGGGCCCTGGCGCTTGCTGCACCAACTTCCTGTTGGGCCCGTGGTCCT
+TGGAGGCATGCAGTTCAGCAGACAGTGACTCAGCCATCCACCCAACATGCGGAACGTGTC
+TCTTCTGCAGGTCCCGGTCCACAGCAGGATTCCCCCTCTGTGAAAAGGCACGCTGATCTG
+TCTGGATAAGTGTGGCCGGCCCCATGTATCCGGAATCAACCACGGGGTCCCCAGCTCGAC
+TCTCCCTGCGGCAGACAGGCTCCCCCGGGATGATCTACAGTACTCGTTATGGGAGTCCCA
+AAAGACAGCTCCAGTTTTACAGGAATCTGGGCAAATCTGGCCTTCGGGTCTCCTGCCTGG
+GGCTTGGAACATGGGTGACCTTCGGGGGCCAGATCACGGATGAGATGGCAGAGCACCTAA
+TGACCTTGGCCTACGATAATGGCATCAACCTGTTCGATACGGCGGAGGTCTACGCTGCTG
+GAAAAGCTGAAGTGGTATTAGGGAACATCATTAAGAAGAAGGGATGGAGACGGTCCAGCC
+TTGTCATCACCACCAAGATCTTCTGGGGTGGAAAAGCGGAGACTGAGAGAGGCCTTTCCA
+GGAAGCACATAATTGAAGGACTGAAAGCGTCCCTGGAGCGGCTGCAGCTGGAGTACGTGG
+ATGTGGTTTTTGCCAACCGCCCAGACCCCAACACGCCCATGGAAGAGACCGTGCGGGCCA
+TGACCCATGTCATCAACCAGGGGATGGCCATGTACTGGGGCACATCACGCTGGAGCTCCA
+TGGAGATCATGGAGGCCTACTCGGTGGCTCGGCAGTTCAACCTGATCCCGCCCATCTGCG
+AGCAAGCGGAATATCACATGTTCCAGAGGGAGAAGGTGGAGGTCCAGCTGCCAGAGCTGT
+TCCACAAGATAGGAGTAGGTGCCATGACCTGGTCCCCTCTGGCGTGCGGCATCGTCTCAG
+GGAAGTATGACAGCGGGATCCCACCCTACTCCAGAGCCTCCCTGAAGGGCTACCAGTGGT
+TGAAGGACAAGATCCTGAGTGAGGAGGGTCGCCGCCAGCAGGCCAAGCTGAAGGAACTGC
+AGGCCATTGCCGAACGCCTGGGCTGCACCCTACCCCAGCTGGCCATAGCCTGGTGCCTGA
+GGAATGAGGGTGTCAGCTCCGTGCTTCTGGGTGCTTCCAATGCAGAACAACTTATGGAGA
+ACATTGGAGCAATACAGGTCCTTCCAAAATTGTCGTCTTCCATCGTCCACGAGATCGACA
+GCATTCTGGGCAATAAACCCTACAGCAAAAAGGACTATAGATCCTAAGTCTACTCCCCAC
+CCCTCGTGCCCCACCCGGACAGTTCCCGGTTCCCTCCTCGTCTCTGTTCGCTCGCTTCTG
+CTGTTCCAAAGCCAAATGCAGAGTGTGGTTCACATCCAAAGGGAAATCACTATGCCCAGA
+CGTGACAGGGAATCGACCTCCAAAGTCACCGCCAGATGCCGCCTGCCGCTTCTTCACTGG
+ATACTGTCCGACAACGGATGCCAGGGGATGGCATCAGTTAGGGGGACATCCAGAGGCTCC
+CGCCCAAGCCCACCACCTCTGCTTATCCTTCAAGAAGAAACACTTGCCCCCAGCCATGGC
+CCTTCACGGAAATTCTAGAAGCCATGGCCGGGTGGAGGTCTCATCCTTAGAGCAGGAGGG
+GCCGCCAAGAGCCCATCTCAAAAGAGGGGTGTGCACCCTTCTCCCAGAGTCCTGGTGGTT
+AGAGCAGGGCCCTCCCTCTTTCCATGGACACCAGGTACTTTGCTCAAGGCTGGCCTGGAT
+CCCATTCTTCCTAGGTCTTGACCTGCCCCACATACCCACCGAGCCTTGGCTGACATAGCT
+ACCCAGCTGGCCCTTGGCCCCCACCCTCCCCCTTGCTGGCAGGGCCAGGGATTCCAGCTG
+GCTTTCCCAGCATCTTCCAACTGCTGAGCCCCACAGCAGGCAAGCTCAGCAGGCTTGGAT
+GGAGCCCATCGGAGTATGCCTCTCAAGACAGACACTCGTGGGCAAGTGTGGCAGCTGGCC
+CCACCGCAGGCAGGTGGCAGCAGGCTTGCAAGACCATATTGCTCTCACAGACCTTCCAAT
+ACCTCTGCTGTACCGGGGCAGTGGGCTCATGATGTGGGCTTTGCCCAGATGAAGCACTTA
+GAGCTATGTTGCAAGCCAGGGAACTACGGGAGCAGCTCCAGTAATAGTCTCCGTGTTTTA
+AGAATAGATCCCAGAGCTTCTCCCTGGAAAAATGGCTAGGACCACCCATTCCCTTCTGCG
+TACCCTCATGCTGGCCTAGGGCAGGATGGGGAGAGGAAGTAGTGGAAAGGATAGGCAGCC
+CTTTATCACTGGGATAAATCCTGCATGGATGTTGATGCCAGGGAGCCTGCGGGATTGGTC
+AGTACACACTGCCTGGAGGCCCCATCCCATGGTTTTGTGATGCTCTGGGGGACAGGGTCC
+TACCCAGCTGCCTCCCTAGGAGACCAGCCTCCTGCCCTGCTGCACAGACCATGGCCAGCT
+CCCAGGCACAAGTCCTAGATGCTTAGCACCCTAGCTTTGCCTTCTGTAGCTGCTATTACA
+AGGCTGCTCCTTGCTGCTCTTAAGGCTGGGCAGAGGTGAGGACAGGGGTGGGGGTTGGGG
+GGGTTTATGGGGAGGAGACAGGAAGAAAGGCAGACAAACCCCCCCCCGAAAACCCTGAGC
+TCTCTAACCTTCGCTGCTCATAGTGCTGACCCTAAGACCTCAGAAGCAGCTCTGTGTGTG
+GGGGGATGGAGACCATGGGCTCTGGTATTTCCATGCCTGGCTAGCAGAGCCAGCTTTCTG
+GACAGGGCCCTGCAGTGGCCCAGCAGGAAGTACCAGACCTGTCCACACAGCTGGCCTTGG
+CCCTGCTTGTTAGGTGGGCCAGGCATGCAGGGATGCCCACAGTGGGAGCTACTGCCTGCC
+TGTGAACCACACCTCAGAGCTAAGCTCCTGCTGGTGATGTGCAAGAGACAGGAAAACAGG
+CTGCCGGGCTAAGGCCCATAGGATTTAGCCCACAGGAGCCCTAGATGCAAAAGACATGTT
+AACCAAGTGTTTCTGAGAGGTTGTCTTCCACACCCACTCTCGAAGCGTCAGGGATTTGCT
+TCTTAAACTTCTGCGGAGGGGTTTGGCTTGGGAGGCCATGTAGAGCAAGTACAGACAGCC
+TGTTAGTGGGAGCTTGCCCCCAGGCCCTCAAAGGGTGTAAGGCCAGCTCCTTCCTCCATG
+GCCTCTCCTTCCTTTAGCCCAGCTGCCTGCAGGCCAGCCCAAGCCAGCTTCTCTTCACCT
+TGAAGTAGTCTGCCAGGCCTGGTGCAGGAGGAGGGCCATGTAGAGAGAGGATCTGGCACT
+CGGAGCCCAAGGTCCCAAGGCACAGCAGCGCACCTGTGTGCCTGCTCTCCTCATGTACAT
+ACATAACGTGCTTTCTCTCCCCGTTTTTTGTTTGTTTTTTTTTAAACGAGCGTGGCTCCT
+CGCTAACTGCACCCCACCAGGCCGACAGCAAACGCCTCCAGCTTCCCGACAGACTCAGAC
+CAAGGTGCGGCCCCGTATTTATGGAATGGCAAATAAAACCCGAGCCCTTTGGTCTCCACG
+TTTCTGATCTCTCCTTTCC
+>TR19|c0_g2_i1 len=420 path=[3899:0-399 3900:400-412 3901:413-413 3902:414-419] [-1, 3899, 3900, 3901, 3902, -2]
+GGAGCTGGAGGCCCCCAGGCAACTACACCGTCCACGTACCCAGAGGGGCTGGGCCCTCCC
+ACCAGAGACCACGCCCTGGTGTGCCTTAGGGGCCCTGGTTTGTTAGTCTCTGAGTGTGCA
+GTTGCTGCACATGGGGCCCTGGCGCTTGCTGCACCAACTTCCTGTTGGGCCCGTGGTCCT
+TGGAGGCATGCAGTTCAGCAGACAGTGACTCAGCCATCCACCCAACATGCGGAACGTGTC
+TCTTCTGCAGGTCCCGGTCCACAGCAGGATTCCCCCTCTGTGAAAAGGCACGCTGATCTG
+TCTGGATAAGTGTGGCCGGCCCCATGTATCCGGAATCAACCACGGGGTCCCCAGCTCGAC
+TCTCCCTGCGGCAGACAGGCTCCCCCGGGATGATCTACAGTACTCGTTATGGGAATCCCG
+>TR20|c1_g1_i1 len=245 path=[223:0-244] [-1, 223, -2]
+GAACTCCAAGCTTATGCTGATGTTCAGGCAGTCTTAGCAAAGTATGATGGTCAAATCTAA
+GTGGATCAAGGAACTCCACATAAAACCAGAGACACTGAAACTTATAGAGGAGAAAGTGGG
+GAAAAGCCTCGAAGATATGGGCACAGGGGAAAAAGACCTGAATAGAAAAGCAATGCCTTG
+TGCTGTAAGATCGAGAATCGACAAATGAGACCTCATAAAATTGCAAAGCTTCTGTAAGGC
+AACAG
+>TR20|c2_g1_i1 len=239 path=[217:0-238] [-1, 217, -2]
+CATAGTACTACCGGAGGATCCCGCAATACCTCTCCTGGGCATATATCCAGAAGATGTCCC
+AACCGGTAAGAAGAACACATGCTCCACTATGTTCATAGCAGCCTTATTTATAATAGCCAG
+AAGCTGGAAAGAACCCAGATGTCCCTCAACAGAGGAATAGATACAGAAAATGTGGTACAT
+TTACACAATGGAGTACTACTCAGCTATTAAAAATAATGAATTTATGAATTTCGTAGTCA
+>TR21|c0_g1_i1 len=930 path=[1486:0-44 1636:45-45 1634:46-84 1630:85-100 1637:101-108 1641:109-110 1605:111-124 1633:125-139 1629:140-197 1638:198-207 1635:208-232 1632:233-239 1628:240-246 1621:247-270 1639:271-271 1601:272-285 1627:286-442 1620:443-542 1600:543-608 1591:609-632 1610:633-680 1536:681-704 1599:705-730 1530:731-737 1531:738-761 1609:762-769 1598:770-770 1619:771-791 1631:792-803 1626:804-831 1640:832-836 1607:837-842 1511:843-855 1512:856-866 1513:867-929] [-1, 1486, 1636 [...]
+CTCCAGAATTTCCTCTGCCTGCCTCTGCCTCCCAAGTGCTGCGATTAAAAGCGTGCACCA
+CCACGCCCGGCTCTTCTGCCCGGTTCTTAGGATTCCTCCTTCCCTGAAGAGGTCAGGAAT
+TAGTTTATGACTTAGACTGTCCTGCAGGCAGGGGCTTCTTGAAGGATAGAACAGACGTCT
+CTTGTCACCTTCCTGTCTAGGGCTGGGGAGGAGAGAACAGATAGCAAGCTCATCCCCAGA
+TTCTGGGCCTGTTTGCTCAACACCCATTCAGGATTCTTAGTTCTTCCTGCCAAAAGGCTT
+GAATTGAAGTACACTATAGATATAGATAGATAGATAGATAGATATAGATATAGATATAGA
+TATAGTTCTTTCAGGGCATTAAAGTGGGAATAAATACTAAACTAGCACTTTAGTCCCACT
+GTGACTGTTACTTGTGAGCATTAGTTTTATCCTTAGTAGCTGAAGCCTTTCCTCTGTAAT
+GACCCCTTGAAAGCATACTTGTGGTGTGGCCAGTAGAATGTGTTAACACCAGCAGTGTCC
+ACTCCACCCAGCATGAGTGCTCTCTATTCCAGGTTTGGGTGGGCGGTACTCATTAGGCAA
+GGGCTTGTTGGTCCATGCTATGTCCAGCAATGAGAAATCGAATGGATCATGTTCTCAGAT
+TCTGTGGCTCTCACCTGGGAGAGAAAAGTCTCCTGTAGGGTGTTGTACCGGTTAGTTATG
+GTGGAGGTCCCTAACTCGCTATGGGGAGCTTTTGGGGCAGAACACAGGCAAAACATACAC
+ATGGCCCACTGTACTCTGGGACACGGTGCCTGAAATTGTCCTGCCAGGCCCAGCTGGTGT
+TCTGTGGTTGCTTCTGCTCTTTTGCCCCCAGACGCGCCGGAGAGCTGGCCCTCCCGTCTA
+TGCCATAGCCTCGTCAGTGTCCTGGGGTTC
+>TR22|c1_g1_i1 len=256 path=[234:0-255] [-1, 234, -2]
+GGACTTGTCTTCAAGTCCATTTTCTTTCCTCGGGGAATCTCCCCTTCCCGACACCCACAC
+CGAACTCCGGGAGCCAGGAAGTACACTGCTTGCAAGACGCCTTTGCAGCCTGCTCCCTCC
+TCCTGGCACCCCACCTGCATCTGCAGACTATCCCCAGGCTTGGCCCTGAGCCCCAGCTAT
+CCCAAACGTGGTCTCCCTTCTCTCTTTCTCTCTCTCAGAGACCGTGCGGGCCATGACCCA
+TGTCATCAACCAGGGG
diff --git a/tests/test.csv b/tests/test.csv
new file mode 100644
index 0000000..17f8613
--- /dev/null
+++ b/tests/test.csv
@@ -0,0 +1,12 @@
+Node name,DATA1,DATA2,DATA3
+NODE_6+_length_50434_cov_42.3615,SIX_PLUS,6plus,plus6
+NODE_6-_length_50434_cov_42.3615,SIX_MINUS,6minus,minus6
+NODE_7+_length_50434_cov_42.3615,SEVEN_PLUS,7plus,plus7
+NODE_4+,FOUR_PLUS,4plus,plus4
+4-,FOUR_MINUS,4minus,minus4
+3,THREE_PLUS,3plus,plus3
+NODE_5-,FIVE_MINUS
+NODE_8,EIGHT_PLUS,8plus,plus8
+NODE_9+,NINE_PLUS,9plus,plus9,extra,extra,extra
+BADLINE
+BADLINE_BADLINE_BADLINE_BADLINE_BADLINE
\ No newline at end of file
diff --git a/tests/test.fastg b/tests/test.fastg
new file mode 100755
index 0000000..42c376e
--- /dev/null
+++ b/tests/test.fastg
@@ -0,0 +1,7282 @@
+>NODE_1_length_6070_cov_43.3434:NODE_12_length_394_cov_88.6719';
+TATTGAACTGTCAGGAGCTGGCTGCACAACAGCCATTACGCCCAATCAACTGGTGCAGTC
+GTCTTCTGAAAATGACAATCGTGCCACCGGCTCCAGGTCTTATCGAACAGCTCAGACACA
+TGGTCCAAATGCTGGTCGATCCGTTCGGCCAGTTTTTCGATGGCCTCTTGCTTGAGCTTG
+TCACTTTCCCTGAACTCGATGTTCAAGGCCCTGGCCACCTGGTTGAGGTTCCGGCCGATA
+GCTCCAAGCTGCCGGCACGATTCCCGTACGGTGTTCACTTCTTCATCAGTGAGGACCGGC
+ATCCGGTTCAACGACCGCAGTCATTTCTGTACCTAAACAGTCCTGCGAATATGTGAGTTT
+TGACCTAATGAGCCACAAAAACTCATTTTCGCCCACGATAATTTTTCTACTTCCTTTCTT
+TGGAATGCTCATTTCAATATTCACATAACGTCGCTATCAATCGCGGAAAAGGCGTAGTGC
+GCGAAGCGAACGAAGCTTTTTGCCGTCGATTGCATAGCTTTGTTAACCCTTTTTCCAAAT
+TTGATAGCAATAGTTAATGTTTGAAGTAAAGTGTTGCTCAAAAACAACTTCGAAGGTATT
+TGGAATACTCGGGAAGAAAACATCCCCCTCTGGCTCGATGTCGATCGTCGATAAGTGGAG
+CGTAGAGGCCATGGGTAATGTTTCTCGGTAAATTTCTCCGCCACCAGACACTATAACGTG
+ACCGGTGAATTCAGCTAGCCTGTCCATGGCCTCTTCGATTGACTGAAATACAACTACATT
+GTCATCATTTGATGTCCAACCTGAGCGGGTAACGACCGCGTATTTCCTATTGGGGAGTGC
+GCCCATAGATTCAAACGTCTTGCGACCCACCAGAAGCCACTGATTGTAGGTCAATGCTTT
+AAAAAGTAGCTGCTCCCCTTTCGCGGACCAGGGTATGTCTGGACCGCAACCAATCACGCC
+GTTTTTCGCTTTCGCAGCCATCAATGATACTTTCAAGGTTCTCATCCTGGGTTAACTTTG
+TTTTAGGGCGACTGCCCTGCTGCGTAACATCGTTGCTGCTCCATAACATCAAACATCGAC
+CCACGGCGTAACGCGCTTGCTGCTTGGATGCCCGAGGCATAGACTGTACAAAAAAACAGT
+CATAACAAGCCATGAAAACCGCCACTGCGCCGTTACCACCGCTGCGTTCGGTCAAGGTTC
+TGGACCAGTTGCGTGAGCGCATACGCTACTTGCATTACAGTTTACGAACCGAACAGGCTT
+ATGTCCACTGGGTTCGTGCCTTCATCCGTTTCCACGGTGTGCGTCACCCGGCAACCTTGG
+GCAGCAGCGAAGTCGAGGCATTTCTGTCCTGGCTGGCGAACGAGCGCAAGGTTTCGGTCT
+CCACGCATCGTCAGGCATTGGCGGCCTTGCTGTTCTTCTACGGCAAGGTGCTGTGCACGG
+ATCTGCCCTGGCTTCAGGAGATCGGAAGACCTCGGCCGTCGCGGCGCTTGCCGGTGGTGC
+TGACCCCGGATGAAGTGGTTCGCATCCTCGGTTTTCTGGAAGGCGAGCATCGTTTGTTCG
+CCCAGCTTCTGTATGGAACGGGCATGCGGATCAGTGAGGGTTTGCAACTGCGGGTCAAGG
+ATCTGGATTTCGATCACGGCACGATCATCGTGCGGGAGGGCAAGGGCTCCAAGGATCGGG
+CCTTGATGTTACCCGAGAGCTTGGCACCCAGCCTGCGCGAGCAGCTGTCGCGTGCACGGG
+CATGGTGGCTGAAGGACCAGGCCGAGGGCCGCAGCGGCGTTGCGCTTCCCGACGCCCTTG
+AGCGGAAGTATCCGCGCGCCGGGCATTCCTGGCCGTGGTTCTGGGTTTTTGCGCAGCACA
+CGCATTCGACCGATCCACGGAGCGGTGTCGTGCGTCGCCATCACATGTATGACCAGACCT
+TTCAGCGCGCCTTCAAACGTGCCGTAGAACAAGCAGGCATCACGAAGCCCGCCACACCGC
+ACACCCTCCGCCACTCGTTCGCGACGGCCTTGCTCCGCAGCGGTTACGACATTCGAACCG
+TGCAGGATCTGCTCGGCCATTCCGACGTCTCTACGACGATGATTTACACGCATGTGCTGA
+AAGTTGGCGGTGCCGGAGTGCGCTCACCGCTTGATGCGCTGCCGCCCCTCACTAGTGAGA
+GGTAGGGCAGCGCAAGTCAATCCTGGCGGATTCACTACCCCTGCGCGAAGGCCATCGGTG
+CCGCATCGAACGGCCGGTTGCGGAAAGTCCTCCCTGCGTCCGCTGATGGCCGGCAGCAGC
+CCGTCGTTGCCTGATGGATCCAACCCCTCCGCTGCTATAGTGCAGTCGGCTTCTGACGTT
+CAGTGCAGCCGTCTTCTGAAAACGACACCATGTGCAAACGATGTCAGAATAGAGTTAAAT
+TTCCTATTGATTGACATATTCCGTCAAAGGTAATAGATTTCATCCTGACACTTTTGCCTT
+TGGAGGCATCTTGCAAGGTCAACGCATCGGCTATGTCCGCGTCAGCAGCTTCGACCAGAA
+CCCGGAACGGCAATTGGAGGGTGTTCAGGTGGCGCGGGTGTTCACCGACAAGGCTTCTGG
+CAAGGACACCCAGCGTCCCGAGCTGGAAAGGCTGCTGGCCTTCGTCCGCGAGGGCGACAC
+CGTGGTGGTGCATAGCATGGACAGGCTGGCACGCAACCTTGATGACCTGCGCCGCATCGT
+CCAAGGGCTGACACAACGGGGCGTGCGCATGGAGTTCGTCAAAGAAGGGCTGAAGTTCAC
+CGGCGAGGACTCACCGATGGCCAATCTGATGCTGTCGGTCATGGGAGCCTTCGCTGAGTT
+CGAGCGCGCCCTGATCCGCGAACGTCAGCGCGAGGGAATCGTGCTGGCCAAGCAGCGCGG
+TGCCTACCGGGGACGAAAGAAATCGCTGAACAGCGAACAAATTGCCGAGTTGAAACGGCG
+AGTTGCGGCAGGCGACCAAAAAACCTTGGTGGCCCGTGACTTCGGCATCAGCCGCGAAAC
+CTTGTACCAGTACCTGCGGGAAGACTGACCATGCCACGCCGCTCAATCCTGTCCGCCACC
+GAGCGCGAAAGCCTGCTGGCACTGCCAGATGCCAAAGACGAACTGATACGGCACTACACG
+TTCAACGAAACCGACCTGTCGGTGATCCGTCAGCGTCGCGGCGCCGCGAATCGATTGGGC
+TTCGCTGTGCAGCTTTGCTACTTGCGATTCCCTGGCACCTTTTTGGGCGTCGATGAGCCT
+CCGTTTCCGCCCCTGTTGCGCATGGTGGCCGCGCAACTCAAGATGCCAGTGGAAAGTTGG
+AGCGAGTACGGCCAGCGCGAACAGACACGGCGGGAGCACTTGGTCGAGCTGCAAACGGTT
+TTTGGGTTCAAGCCCTTCACCATGAGCCACTATCGGCAAGCCGTGCATACATTGACCGAG
+CTGGCCTTGCAGACCGACAAAGGCATCGTGCTGGCGAGCGCACTTGTCGAGAATCTGCGG
+CGGCAGAGCATTATCCTGCCCGCCATGAATGCCATCGAGCGCGCAAGCGCCGAGGCCATC
+ACCCGTGCCAACCGACGCATTTACGCGGCGCTGACCGATTCTTTGTTATCACCCCACCGT
+CAGCGCCTGGACGAACTTCTCAAGCGCAAGGACGGCAGTAAAGTGACGTGGCTGGCATGG
+CTGCGCCAGTCGCCTGCCAAACCGAACTCTCGCCACATGCTCGAACATATTGAGCGCCTG
+AAATCCTGGCAAGCACTTGATCTGCCCGCAGGCATCGAGCGGCAGGTTCACCAGAACCGC
+CTGCTCAAAATCGCTCGTGAAGGTGGCCAGATGACGCCTGCTGATCTGGCAAAGTTCGAG
+GTGCAACGACGCTATGCCACGCTGGTAGCGCTGGCCATCGAAGGCATGGCCACCGTCACC
+GATGAAATCATCGACCTTCACGATCGCATCATCGGCAAGCTGTTCAACGCGGCCAAGAAC
+AAGCATCAGCAGCAGTTCCAGGCTTCCGGCAAGGCGATCAACGACAAGGTGCGGATGTAT
+GGGCGCATCGGTCAAGCGTTGATTGAGGCCAAGCAAAGCGGCAGCGATCCGTTCGCCGCC
+ATCGAGGCCGTTATGCCCTGGGACACCTTCGCCGCCAGCGTCACCGAAGCGCAAACATTG
+GCGCGGCCTGCCGACTTTGATTTCCTGCACCACATCGGTGAAAGCTATGCCACGCTACGC
+CGCTACGCGCCGCAGTTCCTGGGCGTGCTCAAATTGCGGGCTGCGCCCGCCGCCAAGGGT
+GTGCTCGATGCCATCGACATGCTGCGCGGCATGAACAGCGACAGCGCGCGCAAGGTGCCC
+GCCGATGCGCCAACCGCATTCATCAAGCCGCGCTGGGCAAAGCTGGTTCTGACCGACGAC
+GGCATCGACCGGCGTTACTACGAGTTATGCGCCCTGTCGGAGCTGAAGAACGCGCTGCGC
+TCCGGTGATGTCTGGGTGCAGGGTTCTCGCCAGTTCAAGGACTTCGACGAATACCTGGTG
+CCGGTCGAGAAGTTCGCCACTTTGAAGCTGGCCAGCGAATTGCCGCTGGCAGTGGCCACC
+GACTGCGACCAATACCTGCATGACCGGTTGGAATTGTTGGAGGCGCAACTCGCCACAGTC
+AACCGCATGGCTGCGGCCAACGACTTACCGGATGCCATCATCACCACCGCGTCAGGCCTG
+AAGATCACGCCGCTGGACGCGGCAGTACCAGACGCCGCGCAAGCCATGATCGACCAGACA
+GCTATGCTGCTGCCGCACCTCAAAATCACCGAGTTGCTGATGGAGGTCGATGAATGGACG
+GGCTTCACCCGCCACTTCACACACCTGAAGACCAGCGACACGGCCAAGGACAAAACCTTG
+CTGTTGACGACGATCCTGGCCGACGCGATCAACCTGGGTCTGACCAAAATGGCCGAGTCC
+TGCCCTGGCACCACCTACGCCAAGCTGTCTTGGCTGCAAGCCTGGCACATCCGCGATGAA
+ACCTATTCGACGGCGCTGGCCGAGCTGGTGAATGCGCAGTTTCGGCAACCCTTCGCCGGC
+AACTGGGGTGACGGCACCACGTCATCGTCGGACGGCCAGAACTTCAGAACCGGCAGCAAA
+GCAGAAAGCACTGGTCATATCAACCCGAAGTATGGAAGCAGTCCAGGACGGACTTTCTAC
+ACCCATATCTCCGACCAGTACGCGCCCTTCAGTGCCAAGGTGGTCAACGTGGGCATTCGT
+GATTCAACTTACGTGCTTGATGGCCTGCTGTACCACGAGTCGGACTTGCGCATCGAGGAA
+CACTACACCGACACGGCAGGCTTCACCGATCACGTGTTTGGCTTGATGCATTTGCTGGGA
+TTTCGCTTCGCGCCGCGTATCCGTGACTTGGGCGAAACCAAGCTATTCATCCCCAAGGGC
+GATGCCGCCTATGACGCGCTCAAGCCGATGATTAGCAGCGACAGGCTGAACATCAAGCAA
+ATACGCGCCCATTGGGATGAAATTCTGCGGCTGGCCACCTCCATCAAGCAAGGCACGGTA
+ACGGCTTCGCTGATGCTGCGCAAACTCGGCAGCTACCCGCGCCAGAACGGCTTGGCCGTG
+GCGTTGCGCGAGCTGGGGCGCATCGAGCGCACGCTGTTCATTTTGGATTGGCTGCAAAGC
+GTGGAGCTGCGCCGCCGCGTCCATGCGGGGCTGAATAAGGGCGAGGCGCGCAACGCGCTG
+GCCAGGGCGGTCTTCTTCTACCGATTGGGTGAAATCCGCGACCGCAGTTTTGAGCAGCAG
+CGCTACCGGGCCAGCGGCCTCAATCTGGTGACGGCGGCCATCGTGTTGTGGAACACGGTA
+TATCTGGAGCGTGCCACCAGTGCTTTGCGTGGCAACGGCACGGCGCTGGACGACACATTG
+TTGCAATATCTGTCGCCGCTGGGGTGGGAGCACATCAACCTGACCGGCGATTACCTATGG
+CGCAGCAGCGCCAAGGTCGGTGCGGGGAAGTTTAGGCCATTGCGACCGCTGCCACCGGCT
+TAGCGTGCTTTATTTAATGAGATGGTCACTCCCTCCTTCCCGGTACTATGCTGAGGACAG
+GCTTTCATTC
+>NODE_1_length_6070_cov_43.3434':NODE_4_length_123_cov_119.957;
+GAATGAAAGCCTGTCCTCAGCATAGTACCGGGAAGGAGGGAGTGACCATCTCATTAAATA
+AAGCACGCTAAGCCGGTGGCAGCGGTCGCAATGGCCTAAACTTCCCCGCACCGACCTTGG
+CGCTGCTGCGCCATAGGTAATCGCCGGTCAGGTTGATGTGCTCCCACCCCAGCGGCGACA
+GATATTGCAACAATGTGTCGTCCAGCGCCGTGCCGTTGCCACGCAAAGCACTGGTGGCAC
+GCTCCAGATATACCGTGTTCCACAACACGATGGCCGCCGTCACCAGATTGAGGCCGCTGG
+CCCGGTAGCGCTGCTGCTCAAAACTGCGGTCGCGGATTTCACCCAATCGGTAGAAGAAGA
+CCGCCCTGGCCAGCGCGTTGCGCGCCTCGCCCTTATTCAGCCCCGCATGGACGCGGCGGC
+GCAGCTCCACGCTTTGCAGCCAATCCAAAATGAACAGCGTGCGCTCGATGCGCCCCAGCT
+CGCGCAACGCCACGGCCAAGCCGTTCTGGCGCGGGTAGCTGCCGAGTTTGCGCAGCATCA
+GCGAAGCCGTTACCGTGCCTTGCTTGATGGAGGTGGCCAGCCGCAGAATTTCATCCCAAT
+GGGCGCGTATTTGCTTGATGTTCAGCCTGTCGCTGCTAATCATCGGCTTGAGCGCGTCAT
+AGGCGGCATCGCCCTTGGGGATGAATAGCTTGGTTTCGCCCAAGTCACGGATACGCGGCG
+CGAAGCGAAATCCCAGCAAATGCATCAAGCCAAACACGTGATCGGTGAAGCCTGCCGTGT
+CGGTGTAGTGTTCCTCGATGCGCAAGTCCGACTCGTGGTACAGCAGGCCATCAAGCACGT
+AAGTTGAATCACGAATGCCCACGTTGACCACCTTGGCACTGAAGGGCGCGTACTGGTCGG
+AGATATGGGTGTAGAAAGTCCGTCCTGGACTGCTTCCATACTTCGGGTTGATATGACCAG
+TGCTTTCTGCTTTGCTGCCGGTTCTGAAGTTCTGGCCGTCCGACGATGACGTGGTGCCGT
+CACCCCAGTTGCCGGCGAAGGGTTGCCGAAACTGCGCATTCACCAGCTCGGCCAGCGCCG
+TCGAATAGGTTTCATCGCGGATGTGCCAGGCTTGCAGCCAAGACAGCTTGGCGTAGGTGG
+TGCCAGGGCAGGACTCGGCCATTTTGGTCAGACCCAGGTTGATCGCGTCGGCCAGGATCG
+TCGTCAACAGCAAGGTTTTGTCCTTGGCCGTGTCGCTGGTCTTCAGGTGTGTGAAGTGGC
+GGGTGAAGCCCGTCCATTCATCGACCTCCATCAGCAACTCGGTGATTTTGAGGTGCGGCA
+GCAGCATAGCTGTCTGGTCGATCATGGCTTGCGCGGCGTCTGGTACTGCCGCGTCCAGCG
+GCGTGATCTTCAGGCCTGACGCGGTGGTGATGATGGCATCCGGTAAGTCGTTGGCCGCAG
+CCATGCGGTTGACTGTGGCGAGTTGCGCCTCCAACAATTCCAACCGGTCATGCAGGTATT
+GGTCGCAGTCGGTGGCCACTGCCAGCGGCAATTCGCTGGCCAGCTTCAAAGTGGCGAACT
+TCTCGACCGGCACCAGGTATTCGTCGAAGTCCTTGAACTGGCGAGAACCCTGCACCCAGA
+CATCACCGGAGCGCAGCGCGTTCTTCAGCTCCGACAGGGCGCATAACTCGTAGTAACGCC
+GGTCGATGCCGTCGTCGGTCAGAACCAGCTTTGCCCAGCGCGGCTTGATGAATGCGGTTG
+GCGCATCGGCGGGCACCTTGCGCGCGCTGTCGCTGTTCATGCCGCGCAGCATGTCGATGG
+CATCGAGCACACCCTTGGCGGCGGGCGCAGCCCGCAATTTGAGCACGCCCAGGAACTGCG
+GCGCGTAGCGGCGTAGCGTGGCATAGCTTTCACCGATGTGGTGCAGGAAATCAAAGTCGG
+CAGGCCGCGCCAATGTTTGCGCTTCGGTGACGCTGGCGGCGAAGGTGTCCCAGGGCATAA
+CGGCCTCGATGGCGGCGAACGGATCGCTGCCGCTTTGCTTGGCCTCAATCAACGCTTGAC
+CGATGCGCCCATACATCCGCACCTTGTCGTTGATCGCCTTGCCGGAAGCCTGGAACTGCT
+GCTGATGCTTGTTCTTGGCCGCGTTGAACAGCTTGCCGATGATGCGATCGTGAAGGTCGA
+TGATTTCATCGGTGACGGTGGCCATGCCTTCGATGGCCAGCGCTACCAGCGTGGCATAGC
+GTCGTTGCACCTCGAACTTTGCCAGATCAGCAGGCGTCATCTGGCCACCTTCACGAGCGA
+TTTTGAGCAGGCGGTTCTGGTGAACCTGCCGCTCGATGCCTGCGGGCAGATCAAGTGCTT
+GCCAGGATTTCAGGCGCTCAATATGTTCGAGCATGTGGCGAGAGTTCGGTTTGGCAGGCG
+ACTGGCGCAGCCATGCCAGCCACGTCACTTTACTGCCGTCCTTGCGCTTGAGAAGTTCGT
+CCAGGCGCTGACGGTGGGGTGATAACAAAGAATCGGTCAGCGCCGCGTAAATGCGTCGGT
+TGGCACGGGTGATGGCCTCGGCGCTTGCGCGCTCGATGGCATTCATGGCGGGCAGGATAA
+TGCTCTGCCGCCGCAGATTCTCGACAAGTGCGCTCGCCAGCACGATGCCTTTGTCGGTCT
+GCAAGGCCAGCTCGGTCAATGTATGCACGGCTTGCCGATAGTGGCTCATGGTGAAGGGCT
+TGAACCCAAAAACCGTTTGCAGCTCGACCAAGTGCTCCCGCCGTGTCTGTTCGCGCTGGC
+CGTACTCGCTCCAACTTTCCACTGGCATCTTGAGTTGCGCGGCCACCATGCGCAACAGGG
+GCGGAAACGGAGGCTCATCGACGCCCAAAAAGGTGCCAGGGAATCGCAAGTAGCAAAGCT
+GCACAGCGAAGCCCAATCGATTCGCGGCGCCGCGACGCTGACGGATCACCGACAGGTCGG
+TTTCGTTGAACGTGTAGTGCCGTATCAGTTCGTCTTTGGCATCTGGCAGTGCCAGCAGGC
+TTTCGCGCTCGGTGGCGGACAGGATTGAGCGGCGTGGCATGGTCAGTCTTCCCGCAGGTA
+CTGGTACAAGGTTTCGCGGCTGATGCCGAAGTCACGGGCCACCAAGGTTTTTTGGTCGCC
+TGCCGCAACTCGCCGTTTCAACTCGGCAATTTGTTCGCTGTTCAGCGATTTCTTTCGTCC
+CCGGTAGGCACCGCGCTGCTTGGCCAGCACGATTCCCTCGCGCTGACGTTCGCGGATCAG
+GGCGCGCTCGAACTCAGCGAAGGCTCCCATGACCGACAGCATCAGATTGGCCATCGGTGA
+GTCCTCGCCGGTGAACTTCAGCCCTTCTTTGACGAACTCCATGCGCACGCCCCGTTGTGT
+CAGCCCTTGGACGATGCGGCGCAGGTCATCAAGGTTGCGTGCCAGCCTGTCCATGCTATG
+CACCACCACGGTGTCGCCCTCGCGGACGAAGGCCAGCAGCCTTTCCAGCTCGGGACGCTG
+GGTGTCCTTGCCAGAAGCCTTGTCGGTGAACACCCGCGCCACCTGAACACCCTCCAATTG
+CCGTTCCGGGTTCTGGTCGAAGCTGCTGACGCGGACATAGCCGATGCGTTGACCTTGCAA
+GATGCCTCCAAAGGCAAAAGTGTCAGGATGAAATCTATTACCTTTGACGGAATATGTCAA
+TCAATAGGAAATTTAACTCTATTCTGACATCGTTTGCACATGGTGTCGTTTTCAGAAGAC
+GGCTGCACTGAACGTCAGAAGCCGACTGCACTATAGCAGCGGAGGGGTTGGATCCATCAG
+GCAACGACGGGCTGCTGCCGGCCATCAGCGGACGCAGGGAGGACTTTCCGCAACCGGCCG
+TTCGATGCGGCACCGATGGCCTTCGCGCAGGGGTAGTGAATCCGCCAGGATTGACTTGCG
+CTGCCCTACCTCTCACTAGTGAGGGGCGGCAGCGCATCAAGCGGTGAGCGCACTCCGGCA
+CCGCCAACTTTCAGCACATGCGTGTAAATCATCGTCGTAGAGACGTCGGAATGGCCGAGC
+AGATCCTGCACGGTTCGAATGTCGTAACCGCTGCGGAGCAAGGCCGTCGCGAACGAGTGG
+CGGAGGGTGTGCGGTGTGGCGGGCTTCGTGATGCCTGCTTGTTCTACGGCACGTTTGAAG
+GCGCGCTGAAAGGTCTGGTCATACATGTGATGGCGACGCACGACACCGCTCCGTGGATCG
+GTCGAATGCGTGTGCTGCGCAAAAACCCAGAACCACGGCCAGGAATGCCCGGCGCGCGGA
+TACTTCCGCTCAAGGGCGTCGGGAAGCGCAACGCCGCTGCGGCCCTCGGCCTGGTCCTTC
+AGCCACCATGCCCGTGCACGCGACAGCTGCTCGCGCAGGCTGGGTGCCAAGCTCTCGGGT
+AACATCAAGGCCCGATCCTTGGAGCCCTTGCCCTCCCGCACGATGATCGTGCCGTGATCG
+AAATCCAGATCCTTGACCCGCAGTTGCAAACCCTCACTGATCCGCATGCCCGTTCCATAC
+AGAAGCTGGGCGAACAAACGATGCTCGCCTTCCAGAAAACCGAGGATGCGAACCACTTCA
+TCCGGGGTCAGCACCACCGGCAAGCGCCGCGACGGCCGAGGTCTTCCGATCTCCTGAAGC
+CAGGGCAGATCCGTGCACAGCACCTTGCCGTAGAAGAACAGCAAGGCCGCCAATGCCTGA
+CGATGCGTGGAGACCGAAACCTTGCGCTCGTTCGCCAGCCAGGACAGAAATGCCTCGACT
+TCGCTGCTGCCCAAGGTTGCCGGGTGACGCACACCGTGGAAACGGATGAAGGCACGAACC
+CAGTGGACATAAGCCTGTTCGGTTCGTAAACTGTAATGCAAGTAGCGTATGCGCTCACGC
+AACTGGTCCAGAACCTTGACCGAACGCAGCGGTGGTAACGGCGCAGTGGCGGTTTTCATG
+GCTTGTTATGACTGTTTTTTTGTACAGTCTATGCCTCGGGCATCCAAGCAGCAAGCGCGT
+TACGCCGTGGGTCGATGTTTGATGTTATGGAGCAGCAACGATGTTACGCAGCAGGGCAGT
+CGCCCTAAAACAAAGTTAACCCAGGATGAGAACCTTGAAAGTATCATTGATGGCTGCGAA
+AGCGAAAAACGGCGTGATTGGTTGCGGTCCAGACATACCCTGGTCCGCGAAAGGGGAGCA
+GCTACTTTTTAAAGCATTGACCTACAATCAGTGGCTTCTGGTGGGTCGCAAGACGTTTGA
+ATCTATGGGCGCACTCCCCAATAGGAAATACGCGGTCGTTACCCGCTCAGGTTGGACATC
+AAATGATGACAATGTAGTTGTATTTCAGTCAATCGAAGAGGCCATGGACAGGCTAGCTGA
+ATTCACCGGTCACGTTATAGTGTCTGGTGGCGGAGAAATTTACCGAGAAACATTACCCAT
+GGCCTCTACGCTCCACTTATCGACGATCGACATCGAGCCAGAGGGGGATGTTTTCTTCCC
+GAGTATTCCAAATACCTTCGAAGTTGTTTTTGAGCAACACTTTACTTCAAACATTAACTA
+TTGCTATCAAATTTGGAAAAAGGGTTAACAAAGCTATGCAATCGACGGCAAAAAGCTTCG
+TTCGCTTCGCGCACTACGCCTTTTCCGCGATTGATAGCGACGTTATGTGAATATTGAAAT
+GAGCATTCCAAAGAAAGGAAGTAGAAAAATTATCGTGGGCGAAAATGAGTTTTTGTGGCT
+CATTAGGTCAAAACTCACATATTCGCAGGACTGTTTAGGTACAGAAATGACTGCGGTCGT
+TGAACCGGATGCCGGTCCTCACTGATGAAGAAGTGAACACCGTACGGGAATCGTGCCGGC
+AGCTTGGAGCTATCGGCCGGAACCTCAACCAGGTGGCCAGGGCCTTGAACATCGAGTTCA
+GGGAAAGTGACAAGCTCAAGCAAGAGGCCATCGAAAAACTGGCCGAACGGATCGACCAGC
+ATTTGGACCATGTGTCTGAGCTGTTCGATAAGACCTGGAGCCGGTGGCACGATTGTCATT
+TTCAGAAGACGACTGCACCAGTTGATTGGGCGTAATGGCTGTTGTGCAGCCAGCTCCTGA
+CAGTTCAATA
+>NODE_2_length_9792_cov_41.771:NODE_42_length_172_cov_160.495;
+TATTGAACTGTCAGGAGCTGGCTGCACAACAGCCATTACGCCCAATCAACTGGTGCAGTC
+GTCTTCTGAAAATGACACATGGCATCTGACATCAAGTTAGGGTATGCCTCAATCTGACGG
+CTGCGAACCGCCAGGGACAGGCGCAATGTCAGATTCTGTCGCGGCCTTGGCGCGTGCCTG
+GAAGCGTTCATAGCAATCCAGCCCGCAGAAATGTTCGACGTATTCCGCGCCTTCCGGGGT
+GAAGGCGGCATCGAGCGGAATTTCTTTGCAGCATACGCAGCAGGTGGTGCAACTGGCAGT
+GTTCGGGGCGTTTGCGTTCATGGTGGTACTCCTCCAGATTGGTAGCGAAGCTCAAAGCTG
+CCCACTCTCGGCTGGCTGGGAAGCGGTCATGATCTTCCCTTGAAGGCCCGCAGCAGCCGC
+GTCACAGACAGGACAAACAAGCCGGTCAGCGTGAGGGCTGCAATACCCCAGTGCTCCCCG
+ATGAACGCGCCGGCCGTCGTGCCGGCTAGCACAATGGCGAGAATCGGCAAATAGCAGGGA
+CAGGTGAGCACGGCCAGCGCGCCCCACAAGTAGCCGGTGATCGGTTTGTGCGTCTCAGAC
+GGCAAGTGCTCTGGGCTGTTCATGGCAGACTCTCCGCGTGCTGTGCCGGTTCGGTTGGCA
+TGGCGGCCAGTTGCATTTCGAGGCTGGCCAGGGCCTCGCGCCGACGCTCGACGAGTTGCC
+GCAACACGGCAAGCTGCGCAGACGCACCGTCACCGTCCGCAGCATCCAGCGCCCGGCACA
+GCCGCGCCAGTGCGTCCAGGCCGATACCCGCTTCGAAGGCAGCCCGTACAAAGCGCAGCC
+GTTGCAACGCGGTGTCATCGAACAAGCCGTAGCCGCCCGTGGTGTACGCGACCGGCCGTA
+GCAATCCGCGCAGCAGGTAGTCGCGCACGATATGCACGCTCACCCCGGCATCAAGGGCCA
+GCCGGGACACTGTGTAGGCGCTCATTGAACACCTCCTTTTCCTCATCCGGCGCAGCACGA
+AAGCTGCTTCACGTCCTTGCTGAAGGTCTGCGCCGCGAGCTTCAGCCCTTCGACCATGGT
+CAGGTAGGGGAACAATTGGTCGGCCAGTTCCTGCACGGTCATACGGTTGCGAATGGCGAG
+CACCGCCGTCTGGATCAGTTCACCCGCTTCCGGGGCCACCGCTTGCACGCCGATGAGCCG
+TCCGCTACCTTCCTCGATGACCAGCTTGATGAAGCCGCGTGTGTCGAAGTTGGCAAGCGC
+ACGCGGCACGTTATCCAGTGTTAGCAGGCGACTGTCGGTCTCGATCCCGTCGTGATGTGC
+TTCCGCCTCGCTGTAGCCCACGGTGGCGACCTGCGGGTCGGTGAACACCACGGCCGGCAT
+TGCGGTCAGGTCCAGGGCCGCATCGCCGCCAGTCATGTTGATCGCCGCACGAGTGCCGGC
+CGCTGCCGCCACATAGACGAACTGCGGCTGGTCGGTGCAGTCGCCGGCCGCGTAGATGTT
+CGGGCTACTGGTGCGCATGCCCTTGTCGATGACGATGGCCCCCTGCGCATTGACGGCTAC
+CCCCGCCGCTTCCAATGCCAGGCTGCGCGTGTTCGGTGTCCGGCCGGTGGCGACCAGCAG
+CTTGTCGGCGCGCAATTCACCGTGCGTGGTGGTCAGCACGAATTCACCGTCCATATGGGC
+GACCTGGCTGGCTTGCGTGTGCTCCAGCACCTCGATGCCCTCGGCACGGAAAGCGGCTGT
+CACCGCCTCGCCGATGGCCGGGTCTTCACGGAAGAACAAGGTATTGCGCGCCAGGGCCGT
+GACCTTGCTGCCCAGCCGGGCAAAGGCTTGCGCCAGCTCCAGCGCCACCACCGACGAGCC
+GATTACGGCAAGGCGTTCGGGAATGGTGTCGCTCGCCAGGGCCTCGGTGGAAGTCCAGTA
+GGGTGACTCTTTCAAGCCCGGAATCGGCGGGACCGCCGGGCTGGCACCCGTGGCGACCAG
+GCAGCGGTCGAACATCACGACGCGCTCGCCACCCTCGTTCAAACTAACGATAAGGCTCTG
+GTCGTCCTTGAAACGCGCTTCACCGTGCAGAACGGTGATGGCTGAATTGCCGTCCAGGAT
+GCCTTCGTACTTGGCATGACGGAGTTCTTCGACACGGGCCTGCTGCTGGGCCAGCAGCCG
+CTCGCGCAAGATCGTCGGCGGTGTGGGTGGCATGCCGCCGTCGAATGGGCTTTCCCGGCG
+CAGATGGGCGATGTGGGCGGCGCGGATCATGATCTTGGACGGCACACAACCGACGTTGAC
+GCAGGTGCCGCCGATGGTGCCGCGCTCAATCAGCGTGACCTGCGCGCCTTGCTCGACGGC
+CTTCAGTGCTGCCGCCATCGCGGCTCCACCGCTACCAATGACGACGACCTGCAACGGGCG
+TTCGTTGCCACTGGGCTTATCAGCGGCCCCTATCCAGCCGCGCATCTTGTCGAGCAGGCC
+GGCGCGGTTGTCCGTCGGTGGCGCATCGGCAAGCGTTGCCTCGTAGCCCAGTCCGGCCAC
+GGCGGTAGTCAGCGCATCCGATGACGTGCCCGCCTCAATGGCGAGTTGCGCTGTGCCCTT
+CGGATAGGACACCAGCGCCGATTGCACGCCGGGCACTTTCTCCAAGGCTTCCTTGACGTG
+AGCCGCGCACGAGTCGCAGGTCATCCCGGTGATTTTCAGGGTGGTCATGTATTTTTCCTT
+TTCTGTGGTGGCTACGGCTGTTGCCGTCAGCCACGTTGTTCTGGCAATTCACAGCTGTCC
+GGCCCGCAGCGGCGATGTGCTGGCGAGATGAAATCCCAGACCGACACCCCAACCATCAAG
+GCCAGGCCGACATAGAGCAGTCCACCGCTCTGCCAGCCGTAAGCCCGCATTAAAAACACC
+GCTGCCAGCACCAAGATCGGGCCTATCGTGCCGAGCGCCGTGCGTCGCCACTGTCGATGA
+TTGAGCCAAGCGATAGCATTGGCGAGTAACGCGATGCCGGCGAACATCGGCAGCAGGATG
+CCAATGAATAGCCCCTCGTACTGGCTCAAGAAGCCCAGTCCGATGGCCGCGCCAAAGCTG
+GCGATGGCAGGAAAACAGGCGGCGCAGCCCATCGCGGAAACGACGCTGCCGAGCGCGCCG
+GTTTTGCCAGCGATGCGCGTGATGAGTCCCATGTGTCGCTCCCGAGTTCGGTTAACGGAT
+CAGCGTTTGAGGCTGGACGGATAGCCCGCGTCCTCGGTCGCCTTGGTCAACTTCTGGACG
+TTGGTCTTGGCATCGTCGAAGGTGACGACGGCCTGGCGCTTGTCGAAACTTACGTCGGTC
+TTGCTCACGCCCTCAACCTTGGAAAGCGCGTGCTTGACAGTGATCGGGCAAGAGGCGCAG
+GTCATGCCAGGCACGGACAGCGTGACGGTCTGGGTGGCGGCCCACACGGGGGCAACAACG
+GCAGCGAGGGCGAGGGCGGCAAACAGTTTTTTCATGATGAACTCCTGTGATTAATAGAAA
+AATGGCATGACGTAGGGAAATCCGAGCGAGACCAGGACCAGCGCGGCCACGATCCAGAAA
+ATGAGCTTGTAAGTAGCTCGCACTTGGGGAATCGCGCAGACCTCACCCGGTTTGCAGGCT
+TGCGCCGGGCGGTAGATGCGCCGCCAGGCGAAAAACAGCGCGACCAGCGCTGCGCCGATG
+AAGATCGGGCGATAGGGTTCCAGCACCGTCAGGTTGCCGATCCATGCCCCGCTGAACCCC
+AAGGCGATCAAAACCAGCGGCCCCAGGCAGCAGGCCGACGCAAGAATGGCGGCCAGCCCA
+CCGGCGAAGAGCGCGCCGCGCCCGTTTTGTGGTTCAGACTTTTGTGGTTCAGACATACGC
+TTGTCCTTTCAAATTTGGTTTGGATAGCTTAAGCTTACTTCCGTAGTTATGTACGGAGTC
+AAGCGATATGCAAATTAATTTTGAGAATCTGACCATTGGCGTTTTTGCCAAGGCGGCCGG
+GGTCAATGTGGAGACCATCCGGTTCTACCAGCGCAAGGGCCTGCTGCCGGAGCCAGACAA
+GCCCTATGGCAGCATTCGCCGCTATGGCGAGGCGGATGTAACACGAGTGCGGTTCGTGAA
+ATCGGCCCAGCGGCTGGGCTTTAGCCTGGACGAAATCGCCGAGCTACTGCGGCTGGAGGA
+TGGCACCCATTGCGAGGAAGCCAGCGGCCTGGCCGAGCACAAGCTCAAGGATGTGCGCGA
+GAAGATGGCCGACTTGGCACGCATGGAGGCCGTGCTGTCTGAACTGGTGTGCGCCTGCCA
+TGCGCGGAAAGGGAACGTTTTCTGCCCGCTGATTGCGTCACTGCAAGACGGAACGAAGCT
+CGCTGCATCGGCGCGGGGGAGTCACGGGGTGACTACGCCTTAGCGTGCTTTATTTTCCGA
+ATTCTGAGACGACCCCAATAAGGTGATACAGAAACCCGTCGCACCTTTCAGGGTTTTCCC
+ACATCGATTCACAATACTCGTCATAGGCTTTCTGGATAATTGCCGGGGACAACATGGACA
+GCTCCGGGTAAAGAGCCTGGAATTGCTGGTAGTGTTCCGGATCTTGCTCGTCAACGTCCC
+AGGATTTGAGCTCCAGCTGCTCCAGTCCGAACTCACCCGCCCGTGACCACAACGAAGAGA
+TACACTCCGGATTTCCCATGTATGCGTATGTCGCAGCGATAGCGTGGTTCCATTCCCACT
+CCGCCGATTTTATCCCGTTGAACAGTGATTCGGTAACCGGTGCGAAGCCACTGACAAAAT
+CCGTGTTCCAGAGATGTGTGTAGGCACTGGCATCTTCAGACACCGGCACATCCCATTCAG
+GTCGTGGGGGAAGACGGTCCAGGGTAAAGGGCTGGCGAAGGACCATGGACTGCCCCCTGT
+AGACAAAATCCCCCTCACCCTCGACAGGATTGCCGAGAAGTAATCTGGCCGCATCCGCAT
+TACAGGATTCACGGTCGGGATATTTCCGGGGCAGATACGCATTTAAATAGGGGTGATAGA
+TCGCCTGACTATGGTCGATTGTATTGGTCTCACGAGAATACGGCTCGGGGAATACCGACC
+ACGCTTCAATAGCCTCTGCGGCGGTCATTGTTGCCTTCGGAACGAGAGCTAAGGCTGATT
+CCAGGTTGTGGCCATTCTGTTTTACCAGCTGGACAAGTTTCTCGAACACAAAAACATTTT
+CGCCATTTACCTGATAGCTCACAGCGGGGATGCCGTCTATTGAACGGAGTCTTTCACGAA
+GGACATCATCGCTCATATGGAAATTGTGAAACTCATCCAAACAAAAAAATCTACCAGAAG
+GTATTTCACTGCGCATACCGTATTCCTCACGAATTAATGCTCAAATACAGACCGGTCAAA
+AGAGATGTCAATCATAGCATCAGGCAAGCCGGTGACTAACAGGTTGCATAACCTCATTAT
+CATTGGGAGATGTGCCCCTCCGCCGCCTTGCCCGAATCGACCTTGTTCGGTCATCGTGAA
+AGTCTGTTTGCTATTGTCGTTGGGGATAAACCATCAAGCTTTTCAGCATCGCGCATCAAG
+TCCGCAACCCCTTTGCTGGCGTGCCCCAAATCAAACACTACGACCGGGCCAACCTCTATA
+CCCTGCCCAAGAAGCGCCGGATCAATCACTATGATCTGACCTAAATGCTCTGATTTTTTC
+TCAGTACTGAACATCGTAACCACTCTTATTAAAAGCTAACGTGGATGGTGTAACTTGAAC
+TGGTGACTGCCCGGAGACAACAGTTTTCACAGATAAAGCGAATATTTTGCATGTCCTCAT
+CCCACATAGTGTCCGACTCAAACCCAGGTCGTGCCCACCCGACCATCCAGCCCGCTTCAA
+TACACCCTATGTGACAATCGTGCCCTGACCAGGCCGCACGCGAATTTTGAGGAAACAGGG
+AGAAAATAAAAAGAAAACAAAAAGTTATCGGCTGAAGTATTTGCACTGATCTCAAATCAG
+GCGAAGCCTGACAGCACGTATGGGTCTGGCAGGGGACTTTAGGGATGAGGACATGCAATT
+GTGATAACCCTCCCGCCACGGGGTCGGTTAAATTCGTATCCTGCCGGTGCAATTCCAACG
+GACGCATTACCAGTTCGCCGGGTAGCATGGCCAACAAAGCCAGGCATCGAGCACACGGGT
+TTCACTGACGGCCGCTGCATAGACGCCGGTATCCGGGAAGAAATAAACCGGGGTGGCGTT
+GTTCAACTGGTCGCCTTCATCGGCCAGAGCACCGATCACCTCATGAGGCTTCAGCAGCAT
+ATCCGTTAAATATTCATCCGGGTGGATGGCATTCAGCGATATGGCCAGCTCCAGAAATTC
+ATCCAGGGTGTGGCGGGTACGATACCCCCGGAATACTTCGTATGAAGGCGAGACGCATTC
+TCCATACTGGGAACAGGCATCATACCCGGCCAGCTGCTCTTCGGTGAATCTGGAGGCATG
+CTTTGCCACGAGACTCGTAAACTGCTCTTTATCGTCCATCACAATCCTTACACTGTAGGG
+GCCTGTTTTGTCAGACGCGACCACCGGCTATGAACCGACAAGACGTCAGTCGCCTGCCAG
+CCCGGGCGAGGTGGAATACAGTTTACCAGTTCCGGCCGACCGACTTTGCTGCCAGGAGAC
+GCTAAATACACTAATATTGAATCGTTGCATCTTCGATATCCGGGTGACATTCTGGTTCCC
+GGCTTTTCTGATCGGGTATGTAATGATCAATGCCCCCTCCCCCAGGATAAAATTATCAGG
+GCGCAAGGGTAGCTGGAGGAAGGATGGATACCATACATTTCTGCTTAATGCTTTTTTTTT
+GCTTCTGACGTTCTGGTAATCTAATTTTTATCACGATTTGAAAATGATAAATGGAATACA
+CGTAATGAGTTACGCCCACCTTTTTGAAAATTGCGATCATGTTATTGAGGGCAACATTCT
+CCTCGACATTGCGAGTATTCCGCCCGTTCTGAAAAAGGCCCTGATCTTTCTCATCCAATC
+CGGACTGGAGCGGGAGGCATTTAACGCTCAATTAACAGAGCTCTTGATATTACCGCAGCC
+GAATTGTCAGCCCACCTGCTTACTCCGGGAAACGCCTGAATGCGGTTCTTTGTCTTTACC
+TTGTTTTAATTTCACTACATGCTAACGTATGCATACATTAGGCAAAATGGTTTCTCCAAT
+GGAAAAGACGCAATCACCCGCAGAGCGCTTTTACGAAAGCATTTATTATTCTGATGAAAG
+CCTGGAAGAGGATTACCTCGCGGAGCTCCGCAATTTCAGCAGCGACCACTGGGACACTGC
+ACTGCGTGCCGCCCGTTTGTCTGCGGCGGTAAAGCGTTTCAAGACATCGGAGATGCTTCG
+CTTCATTCTGGAATTCGTTGTTCCCGAGAACGCTCAGGAAGACGCCCCCGATCTGACACC
+GCTCGCAGCGAAGCGGCTTTGCAACTCCCTGTTCGGCCGGTCTGGTAGCCAGTCCATTCT
+TGTCTATGTCTTTGGCCAGGCAGGCCGTGTGCATCGCAGTGCAACCTGTTCCCCCAAAAC
+CATAGAGGCTATCGCTGCTCTTTATCGTTCTGACGCTGAACGCTACTGGAATTCAACTCT
+TGCGACAATTGAAAGGGTCAAACACACCTACCGCGCAAAAATCCGAAACTCCTGATCCAG
+TTATTAGACCTTACGCCTTAATGCTAATGTATGCGTCCATTAGCTTTAAGCGAAGACGGA
+CTTATTCAGGATGCTTTTACCAAAGAAGAACCACTGGGATTGGTTTTGATGGCTGTGCCA
+ATTTATATTACCGGTCTGATCATGATAGGTACTCTGTTCACATGTAAGAAATGAACAGCC
+TGTTTCTGTTTAAGGCGAACAGGTTTATTCTCTTCACGCTTCCATGTCCCCCCATAATTT
+CCCATCCCTCTTCAGAGCAATGAGTAATTGTTTGGTCCTTCAGATTCTCCCACCCTACTG
+TCTTCGCAGGCCGTCAGGCAGACACTTTTAAGCCGGTGGTTATAGAGACCAATACGGACG
+ATTTCCTGGAGATAATCCCTTTCCTCCACCGTTAGTAACTGCCCTTCCTTTGATTTTGTA
+ATCATGTCCTGCCAGTTAAGCAATTTCTCGTAATTCACATGCTCACTGGTGTCGAGGCAA
+TGCAGCCGGAAGTAACGCATAAACAGCGGGAATTCGTCGGTCTGGGCGATATCTGAAGCT
+CTGACGGTGAGCCGACACAAACACACAATGGTGGCCTGCTGCATTCTTATCAGCACATTC
+ATGCTCTGGGGTAAGTTGTCCGGCAGCTTCAGGGGGCAGTCGGAAAGGCGTTGTAGAAGT
+GGTCCTGCTTCCGCTGGCTCGCGGCCCTCATATACCTTCAGGGGCTCGGTCCCCAGTTCC
+TGCATCATGGGGTGATACAACCATTCGCGTGACTCCGTCGCATCAATGATGATTTTCTCG
+ATACATTCACTGTAGGTACCATCTCGTCTACCAAGCTGAACCTGACTGATTTCGTATTCT
+ATATCCGGCAGATCAATGCGCAATGCAGCTACCATCTCCGAGGCATGGAGATGGTCGAAC
+GTCAGTTTCCCGGCCACACTGCGGTCAATGTCCAGAAACACAGCTACGCAGAGATCGTTC
+ACCTTCACAAACAGATCTGCCGTTGCGCCGAACATGCTTCCGCTGCCGCTGACTTCATCA
+AGTGGGACCGTGCCTCCATCGTAACCGGCCAGAAGATGCGGGAATCCTAGAAGTTGTTTT
+TCCTGAATAATTTCAATAATTTTTCCCCGAATCGCCTCCATCAGGCCATCACAATCACCG
+AGGAGATCGGTACTGTGGCTATAGTGCCAAAGTTTGACCTCTCCCTGTCTGGCTATCAAA
+TCCGTACGACACCCAGGACAGATGCAGTTGCATGCGCTTCCTCTGCTGACTTCCGTGATG
+TCCAGAAACCGTCCGGTTTCGCGATGGAGTCCGAAAGGAATCCCATAGGTATAGCTCTTT
+CGCATGTCAGTGCCCCCGCTGAATACATACCTTCACTATATCGGGCGAAGACAGCATGAC
+ACTTCGATAAGAAGACTATTTTTCGTGAGATTTTAATACCGTAACTGAGCGGATTGATAA
+AACGATGATGATTAGACACGGGTGAAAAGTTACTTTTCCGATTGCCAAAACCTCCACCAG
+CAGTGTGCCATATTAATCTGGACGGATTCGGAATTAACGAGCGTTTCTTCAGCTGACTCA
+TTTTTTGGCCGAAAATGGCTTTGTTTTATACACCGCAATTACCTTCAATGCAGTTTGTGG
+TTATTAATATAATCCATTATAAATTTCATGAGCTCCGGGTCACTTCGGGCTGAAAAAAGG
+ACTTTCGCTACTTCTTTCATTGCATTTGTCGCATTACTGGGTAATGACTCCAACTTACTG
+ATAGTGTTTTATGGTCAGATAATGCCCGATGACTTTGTCATGCAGCTCCACCGATTTTGA
+GAACGACAGTGACTTCCTGCCCAGCCTTGCCAGATGCTGTCTCAGATTCAGGTTATGCCG
+CTCAATGCGCTGAGTGTAACGCTTGCTGATAACGTGCAGCTTTCCCTTCAGGCGTGATTC
+ATAAAGCGGCCAGTCATCCGTCATCCATACCACGACCTCAAAGGCCGACAGCAGGCCCGG
+AAGACGCTCCAGCGTGGCCAACGTGCGTTCACCGAATACGTGCGCCACAACCGTCCTCCG
+TATCCTGTCATACGCGTAAAACAACCAGAGCTGGCGTGATTTAGCACCGACGTAACCCCA
+CTGTTCGTCCATTTCCGCGCAGACGATGACGTCACTGCCCGGCTGTATGCGCGAGGTTAC
+CGACTGCGGCCT
+>NODE_2_length_9792_cov_41.771':NODE_4_length_123_cov_119.957;
+AGGCCGCAGTCGGTAACCTCGCGCATACAGCCGGGCAGTGACGTCATCGTCTGCGCGGAA
+ATGGACGAACAGTGGGGTTACGTCGGTGCTAAATCACGCCAGCTCTGGTTGTTTTACGCG
+TATGACAGGATACGGAGGACGGTTGTGGCGCACGTATTCGGTGAACGCACGTTGGCCACG
+CTGGAGCGTCTTCCGGGCCTGCTGTCGGCCTTTGAGGTCGTGGTATGGATGACGGATGAC
+TGGCCGCTTTATGAATCACGCCTGAAGGGAAAGCTGCACGTTATCAGCAAGCGTTACACT
+CAGCGCATTGAGCGGCATAACCTGAATCTGAGACAGCATCTGGCAAGGCTGGGCAGGAAG
+TCACTGTCGTTCTCAAAATCGGTGGAGCTGCATGACAAAGTCATCGGGCATTATCTGACC
+ATAAAACACTATCAGTAAGTTGGAGTCATTACCCAGTAATGCGACAAATGCAATGAAAGA
+AGTAGCGAAAGTCCTTTTTTCAGCCCGAAGTGACCCGGAGCTCATGAAATTTATAATGGA
+TTATATTAATAACCACAAACTGCATTGAAGGTAATTGCGGTGTATAAAACAAAGCCATTT
+TCGGCCAAAAAATGAGTCAGCTGAAGAAACGCTCGTTAATTCCGAATCCGTCCAGATTAA
+TATGGCACACTGCTGGTGGAGGTTTTGGCAATCGGAAAAGTAACTTTTCACCCGTGTCTA
+ATCATCATCGTTTTATCAATCCGCTCAGTTACGGTATTAAAATCTCACGAAAAATAGTCT
+TCTTATCGAAGTGTCATGCTGTCTTCGCCCGATATAGTGAAGGTATGTATTCAGCGGGGG
+CACTGACATGCGAAAGAGCTATACCTATGGGATTCCTTTCGGACTCCATCGCGAAACCGG
+ACGGTTTCTGGACATCACGGAAGTCAGCAGAGGAAGCGCATGCAACTGCATCTGTCCTGG
+GTGTCGTACGGATTTGATAGCCAGACAGGGAGAGGTCAAACTTTGGCACTATAGCCACAG
+TACCGATCTCCTCGGTGATTGTGATGGCCTGATGGAGGCGATTCGGGGAAAAATTATTGA
+AATTATTCAGGAAAAACAACTTCTAGGATTCCCGCATCTTCTGGCCGGTTACGATGGAGG
+CACGGTCCCACTTGATGAAGTCAGCGGCAGCGGAAGCATGTTCGGCGCAACGGCAGATCT
+GTTTGTGAAGGTGAACGATCTCTGCGTAGCTGTGTTTCTGGACATTGACCGCAGTGTGGC
+CGGGAAACTGACGTTCGACCATCTCCATGCCTCGGAGATGGTAGCTGCATTGCGCATTGA
+TCTGCCGGATATAGAATACGAAATCAGTCAGGTTCAGCTTGGTAGACGAGATGGTACCTA
+CAGTGAATGTATCGAGAAAATCATCATTGATGCGACGGAGTCACGCGAATGGTTGTATCA
+CCCCATGATGCAGGAACTGGGGACCGAGCCCCTGAAGGTATATGAGGGCCGCGAGCCAGC
+GGAAGCAGGACCACTTCTACAACGCCTTTCCGACTGCCCCCTGAAGCTGCCGGACAACTT
+ACCCCAGAGCATGAATGTGCTGATAAGAATGCAGCAGGCCACCATTGTGTGTTTGTGTCG
+GCTCACCGTCAGAGCTTCAGATATCGCCCAGACCGACGAATTCCCGCTGTTTATGCGTTA
+CTTCCGGCTGCATTGCCTCGACACCAGTGAGCATGTGAATTACGAGAAATTGCTTAACTG
+GCAGGACATGATTACAAAATCAAAGGAAGGGCAGTTACTAACGGTGGAGGAAAGGGATTA
+TCTCCAGGAAATCGTCCGTATTGGTCTCTATAACCACCGGCTTAAAAGTGTCTGCCTGAC
+GGCCTGCGAAGACAGTAGGGTGGGAGAATCTGAAGGACCAAACAATTACTCATTGCTCTG
+AAGAGGGATGGGAAATTATGGGGGGACATGGAAGCGTGAAGAGAATAAACCTGTTCGCCT
+TAAACAGAAACAGGCTGTTCATTTCTTACATGTGAACAGAGTACCTATCATGATCAGACC
+GGTAATATAAATTGGCACAGCCATCAAAACCAATCCCAGTGGTTCTTCTTTGGTAAAAGC
+ATCCTGAATAAGTCCGTCTTCGCTTAAAGCTAATGGACGCATACATTAGCATTAAGGCGT
+AAGGTCTAATAACTGGATCAGGAGTTTCGGATTTTTGCGCGGTAGGTGTGTTTGACCCTT
+TCAATTGTCGCAAGAGTTGAATTCCAGTAGCGTTCAGCGTCAGAACGATAAAGAGCAGCG
+ATAGCCTCTATGGTTTTGGGGGAACAGGTTGCACTGCGATGCACACGGCCTGCCTGGCCA
+AAGACATAGACAAGAATGGACTGGCTACCAGACCGGCCGAACAGGGAGTTGCAAAGCCGC
+TTCGCTGCGAGCGGTGTCAGATCGGGGGCGTCTTCCTGAGCGTTCTCGGGAACAACGAAT
+TCCAGAATGAAGCGAAGCATCTCCGATGTCTTGAAACGCTTTACCGCCGCAGACAAACGG
+GCGGCACGCAGTGCAGTGTCCCAGTGGTCGCTGCTGAAATTGCGGAGCTCCGCGAGGTAA
+TCCTCTTCCAGGCTTTCATCAGAATAATAAATGCTTTCGTAAAAGCGCTCTGCGGGTGAT
+TGCGTCTTTTCCATTGGAGAAACCATTTTGCCTAATGTATGCATACGTTAGCATGTAGTG
+AAATTAAAACAAGGTAAAGACAAAGAACCGCATTCAGGCGTTTCCCGGAGTAAGCAGGTG
+GGCTGACAATTCGGCTGCGGTAATATCAAGAGCTCTGTTAATTGAGCGTTAAATGCCTCC
+CGCTCCAGTCCGGATTGGATGAGAAAGATCAGGGCCTTTTTCAGAACGGGCGGAATACTC
+GCAATGTCGAGGAGAATGTTGCCCTCAATAACATGATCGCAATTTTCAAAAAGGTGGGCG
+TAACTCATTACGTGTATTCCATTTATCATTTTCAAATCGTGATAAAAATTAGATTACCAG
+AACGTCAGAAGCAAAAAAAAAGCATTAAGCAGAAATGTATGGTATCCATCCTTCCTCCAG
+CTACCCTTGCGCCCTGATAATTTTATCCTGGGGGAGGGGGCATTGATCATTACATACCCG
+ATCAGAAAAGCCGGGAACCAGAATGTCACCCGGATATCGAAGATGCAACGATTCAATATT
+AGTGTATTTAGCGTCTCCTGGCAGCAAAGTCGGTCGGCCGGAACTGGTAAACTGTATTCC
+ACCTCGCCCGGGCTGGCAGGCGACTGACGTCTTGTCGGTTCATAGCCGGTGGTCGCGTCT
+GACAAAACAGGCCCCTACAGTGTAAGGATTGTGATGGACGATAAAGAGCAGTTTACGAGT
+CTCGTGGCAAAGCATGCCTCCAGATTCACCGAAGAGCAGCTGGCCGGGTATGATGCCTGT
+TCCCAGTATGGAGAATGCGTCTCGCCTTCATACGAAGTATTCCGGGGGTATCGTACCCGC
+CACACCCTGGATGAATTTCTGGAGCTGGCCATATCGCTGAATGCCATCCACCCGGATGAA
+TATTTAACGGATATGCTGCTGAAGCCTCATGAGGTGATCGGTGCTCTGGCCGATGAAGGC
+GACCAGTTGAACAACGCCACCCCGGTTTATTTCTTCCCGGATACCGGCGTCTATGCAGCG
+GCCGTCAGTGAAACCCGTGTGCTCGATGCCTGGCTTTGTTGGCCATGCTACCCGGCGAAC
+TGGTAATGCGTCCGTTGGAATTGCACCGGCAGGATACGAATTTAACCGACCCCGTGGCGG
+GAGGGTTATCACAATTGCATGTCCTCATCCCTAAAGTCCCCTGCCAGACCCATACGTGCT
+GTCAGGCTTCGCCTGATTTGAGATCAGTGCAAATACTTCAGCCGATAACTTTTTGTTTTC
+TTTTTATTTTCTCCCTGTTTCCTCAAAATTCGCGTGCGGCCTGGTCAGGGCACGATTGTC
+ACATAGGGTGTATTGAAGCGGGCTGGATGGTCGGGTGGGCACGACCTGGGTTTGAGTCGG
+ACACTATGTGGGATGAGGACATGCAAAATATTCGCTTTATCTGTGAAAACTGTTGTCTCC
+GGGCAGTCACCAGTTCAAGTTACACCATCCACGTTAGCTTTTAATAAGAGTGGTTACGAT
+GTTCAGTACTGAGAAAAAATCAGAGCATTTAGGTCAGATCATAGTGATTGATCCGGCGCT
+TCTTGGGCAGGGTATAGAGGTTGGCCCGGTCGTAGTGTTTGATTTGGGGCACGCCAGCAA
+AGGGGTTGCGGACTTGATGCGCGATGCTGAAAAGCTTGATGGTTTATCCCCAACGACAAT
+AGCAAACAGACTTTCACGATGACCGAACAAGGTCGATTCGGGCAAGGCGGCGGAGGGGCA
+CATCTCCCAATGATAATGAGGTTATGCAACCTGTTAGTCACCGGCTTGCCTGATGCTATG
+ATTGACATCTCTTTTGACCGGTCTGTATTTGAGCATTAATTCGTGAGGAATACGGTATGC
+GCAGTGAAATACCTTCTGGTAGATTTTTTTGTTTGGATGAGTTTCACAATTTCCATATGA
+GCGATGATGTCCTTCGTGAAAGACTCCGTTCAATAGACGGCATCCCCGCTGTGAGCTATC
+AGGTAAATGGCGAAAATGTTTTTGTGTTCGAGAAACTTGTCCAGCTGGTAAAACAGAATG
+GCCACAACCTGGAATCAGCCTTAGCTCTCGTTCCGAAGGCAACAATGACCGCCGCAGAGG
+CTATTGAAGCGTGGTCGGTATTCCCCGAGCCGTATTCTCGTGAGACCAATACAATCGACC
+ATAGTCAGGCGATCTATCACCCCTATTTAAATGCGTATCTGCCCCGGAAATATCCCGACC
+GTGAATCCTGTAATGCGGATGCGGCCAGATTACTTCTCGGCAATCCTGTCGAGGGTGAGG
+GGGATTTTGTCTACAGGGGGCAGTCCATGGTCCTTCGCCAGCCCTTTACCCTGGACCGTC
+TTCCCCCACGACCTGAATGGGATGTGCCGGTGTCTGAAGATGCCAGTGCCTACACACATC
+TCTGGAACACGGATTTTGTCAGTGGCTTCGCACCGGTTACCGAATCACTGTTCAACGGGA
+TAAAATCGGCGGAGTGGGAATGGAACCACGCTATCGCTGCGACATACGCATACATGGGAA
+ATCCGGAGTGTATCTCTTCGTTGTGGTCACGGGCGGGTGAGTTCGGACTGGAGCAGCTGG
+AGCTCAAATCCTGGGACGTTGACGAGCAAGATCCGGAACACTACCAGCAATTCCAGGCTC
+TTTACCCGGAGCTGTCCATGTTGTCCCCGGCAATTATCCAGAAAGCCTATGACGAGTATT
+GTGAATCGATGTGGGAAAACCCTGAAAGGTGCGACGGGTTTCTGTATCACCTTATTGGGG
+TCGTCTCAGAATTCGGAAAATAAAGCACGCTAAGGCGTAGTCACCCCGTGACTCCCCCGC
+GCCGATGCAGCGAGCTTCGTTCCGTCTTGCAGTGACGCAATCAGCGGGCAGAAAACGTTC
+CCTTTCCGCGCATGGCAGGCGCACACCAGTTCAGACAGCACGGCCTCCATGCGTGCCAAG
+TCGGCCATCTTCTCGCGCACATCCTTGAGCTTGTGCTCGGCCAGGCCGCTGGCTTCCTCG
+CAATGGGTGCCATCCTCCAGCCGCAGTAGCTCGGCGATTTCGTCCAGGCTAAAGCCCAGC
+CGCTGGGCCGATTTCACGAACCGCACTCGTGTTACATCCGCCTCGCCATAGCGGCGAATG
+CTGCCATAGGGCTTGTCTGGCTCCGGCAGCAGGCCCTTGCGCTGGTAGAACCGGATGGTC
+TCCACATTGACCCCGGCCGCCTTGGCAAAAACGCCAATGGTCAGATTCTCAAAATTAATT
+TGCATATCGCTTGACTCCGTACATAACTACGGAAGTAAGCTTAAGCTATCCAAACCAAAT
+TTGAAAGGACAAGCGTATGTCTGAACCACAAAAGTCTGAACCACAAAACGGGCGCGGCGC
+GCTCTTCGCCGGTGGGCTGGCCGCCATTCTTGCGTCGGCCTGCTGCCTGGGGCCGCTGGT
+TTTGATCGCCTTGGGGTTCAGCGGGGCATGGATCGGCAACCTGACGGTGCTGGAACCCTA
+TCGCCCGATCTTCATCGGCGCAGCGCTGGTCGCGCTGTTTTTCGCCTGGCGGCGCATCTA
+CCGCCCGGCGCAAGCCTGCAAACCGGGTGAGGTCTGCGCGATTCCCCAAGTGCGAGCTAC
+TTACAAGCTCATTTTCTGGATCGTGGCCGCGCTGGTCCTGGTCTCGCTCGGATTTCCCTA
+CGTCATGCCATTTTTCTATTAATCACAGGAGTTCATCATGAAAAAACTGTTTGCCGCCCT
+CGCCCTCGCTGCCGTTGTTGCCCCCGTGTGGGCCGCCACCCAGACCGTCACGCTGTCCGT
+GCCTGGCATGACCTGCGCCTCTTGCCCGATCACTGTCAAGCACGCGCTTTCCAAGGTTGA
+GGGCGTGAGCAAGACCGACGTAAGTTTCGACAAGCGCCAGGCCGTCGTCACCTTCGACGA
+TGCCAAGACCAACGTCCAGAAGTTGACCAAGGCGACCGAGGACGCGGGCTATCCGTCCAG
+CCTCAAACGCTGATCCGTTAACCGAACTCGGGAGCGACACATGGGACTCATCACGCGCAT
+CGCTGGCAAAACCGGCGCGCTCGGCAGCGTCGTTTCCGCGATGGGCTGCGCCGCCTGTTT
+TCCTGCCATCGCCAGCTTTGGCGCGGCCATCGGACTGGGCTTCTTGAGCCAGTACGAGGG
+GCTATTCATTGGCATCCTGCTGCCGATGTTCGCCGGCATCGCGTTACTCGCCAATGCTAT
+CGCTTGGCTCAATCATCGACAGTGGCGACGCACGGCGCTCGGCACGATAGGCCCGATCTT
+GGTGCTGGCAGCGGTGTTTTTAATGCGGGCTTACGGCTGGCAGAGCGGTGGACTGCTCTA
+TGTCGGCCTGGCCTTGATGGTTGGGGTGTCGGTCTGGGATTTCATCTCGCCAGCACATCG
+CCGCTGCGGGCCGGACAGCTGTGAATTGCCAGAACAACGTGGCTGACGGCAACAGCCGTA
+GCCACCACAGAAAAGGAAAAATACATGACCACCCTGAAAATCACCGGGATGACCTGCGAC
+TCGTGCGCGGCTCACGTCAAGGAAGCCTTGGAGAAAGTGCCCGGCGTGCAATCGGCGCTG
+GTGTCCTATCCGAAGGGCACAGCGCAACTCGCCATTGAGGCGGGCACGTCATCGGATGCG
+CTGACTACCGCCGTGGCCGGACTGGGCTACGAGGCAACGCTTGCCGATGCGCCACCGACG
+GACAACCGCGCCGGCCTGCTCGACAAGATGCGCGGCTGGATAGGGGCCGCTGATAAGCCC
+AGTGGCAACGAACGCCCGTTGCAGGTCGTCGTCATTGGTAGCGGTGGAGCCGCGATGGCG
+GCAGCACTGAAGGCCGTCGAGCAAGGCGCGCAGGTCACGCTGATTGAGCGCGGCACCATC
+GGCGGCACCTGCGTCAACGTCGGTTGTGTGCCGTCCAAGATCATGATCCGCGCCGCCCAC
+ATCGCCCATCTGCGCCGGGAAAGCCCATTCGACGGCGGCATGCCACCCACACCGCCGACG
+ATCTTGCGCGAGCGGCTGCTGGCCCAGCAGCAGGCCCGTGTCGAAGAACTCCGTCATGCC
+AAGTACGAAGGCATCCTGGACGGCAATTCAGCCATCACCGTTCTGCACGGTGAAGCGCGT
+TTCAAGGACGACCAGAGCCTTATCGTTAGTTTGAACGAGGGTGGCGAGCGCGTCGTGATG
+TTCGACCGCTGCCTGGTCGCCACGGGTGCCAGCCCGGCGGTCCCGCCGATTCCGGGCTTG
+AAAGAGTCACCCTACTGGACTTCCACCGAGGCCCTGGCGAGCGACACCATTCCCGAACGC
+CTTGCCGTAATCGGCTCGTCGGTGGTGGCGCTGGAGCTGGCGCAAGCCTTTGCCCGGCTG
+GGCAGCAAGGTCACGGCCCTGGCGCGCAATACCTTGTTCTTCCGTGAAGACCCGGCCATC
+GGCGAGGCGGTGACAGCCGCTTTCCGTGCCGAGGGCATCGAGGTGCTGGAGCACACGCAA
+GCCAGCCAGGTCGCCCATATGGACGGTGAATTCGTGCTGACCACCACGCACGGTGAATTG
+CGCGCCGACAAGCTGCTGGTCGCCACCGGCCGGACACCGAACACGCGCAGCCTGGCATTG
+GAAGCGGCGGGGGTAGCCGTCAATGCGCAGGGGGCCATCGTCATCGACAAGGGCATGCGC
+ACCAGTAGCCCGAACATCTACGCGGCCGGCGACTGCACCGACCAGCCGCAGTTCGTCTAT
+GTGGCGGCAGCGGCCGGCACTCGTGCGGCGATCAACATGACTGGCGGCGATGCGGCCCTG
+GACCTGACCGCAATGCCGGCCGTGGTGTTCACCGACCCGCAGGTCGCCACCGTGGGCTAC
+AGCGAGGCGGAAGCACATCACGACGGGATCGAGACCGACAGTCGCCTGCTAACACTGGAT
+AACGTGCCGCGTGCGCTTGCCAACTTCGACACACGCGGCTTCATCAAGCTGGTCATCGAG
+GAAGGTAGCGGACGGCTCATCGGCGTGCAAGCGGTGGCCCCGGAAGCGGGTGAACTGATC
+CAGACGGCGGTGCTCGCCATTCGCAACCGTATGACCGTGCAGGAACTGGCCGACCAATTG
+TTCCCCTACCTGACCATGGTCGAAGGGCTGAAGCTCGCGGCGCAGACCTTCAGCAAGGAC
+GTGAAGCAGCTTTCGTGCTGCGCCGGATGAGGAAAAGGAGGTGTTCAATGAGCGCCTACA
+CAGTGTCCCGGCTGGCCCTTGATGCCGGGGTGAGCGTGCATATCGTGCGCGACTACCTGC
+TGCGCGGATTGCTACGGCCGGTCGCGTACACCACGGGCGGCTACGGCTTGTTCGATGACA
+CCGCGTTGCAACGGCTGCGCTTTGTACGGGCTGCCTTCGAAGCGGGTATCGGCCTGGACG
+CACTGGCGCGGCTGTGCCGGGCGCTGGATGCTGCGGACGGTGACGGTGCGTCTGCGCAGC
+TTGCCGTGTTGCGGCAACTCGTCGAGCGTCGGCGCGAGGCCCTGGCCAGCCTCGAAATGC
+AACTGGCCGCCATGCCAACCGAACCGGCACAGCACGCGGAGAGTCTGCCATGAACAGCCC
+AGAGCACTTGCCGTCTGAGACGCACAAACCGATCACCGGCTACTTGTGGGGCGCGCTGGC
+CGTGCTCACCTGTCCCTGCTATTTGCCGATTCTCGCCATTGTGCTAGCCGGCACGACGGC
+CGGCGCGTTCATCGGGGAGCACTGGGGTATTGCAGCCCTCACGCTGACCGGCTTGTTTGT
+CCTGTCTGTGACGCGGCTGCTGCGGGCCTTCAAGGGAAGATCATGACCGCTTCCCAGCCA
+GCCGAGAGTGGGCAGCTTTGAGCTTCGCTACCAATCTGGAGGAGTACCACCATGAACGCA
+AACGCCCCGAACACTGCCAGTTGCACCACCTGCTGCGTATGCTGCAAAGAAATTCCGCTC
+GATGCCGCCTTCACCCCGGAAGGCGCGGAATACGTCGAACATTTCTGCGGGCTGGATTGC
+TATGAACGCTTCCAGGCACGCGCCAAGGCCGCGACAGAATCTGACATTGCGCCTGTCCCT
+GGCGGTTCGCAGCCGTCAGATTGAGGCATACCCTAACTTGATGTCAGATGCCATGTGTCA
+TTTTCAGAAGACGACTGCACCAGTTGATTGGGCGTAATGGCTGTTGTGCAGCCAGCTCCT
+GACAGTTCAATA
+>NODE_3_length_5869_cov_43.038:NODE_38_length_237_cov_132.244';
+TATTGAACTGTCAGGAGCTGGCTGCACAACAGCCATTACGCCCAATCAACTGGTGCAGTC
+GTCTTCTGAAAATGACATCCATGCCCAGCCCGTGCGCGAGCTGGATCACCGCCCGCACGA
+TAGTTTGGTCACGGGCATCATCCGGGAGCCTGGCGACAAAGGATTGGTCGATTTTCAATG
+TGGTGATGGGGCAGCATTTCAGATGTTGCAGGCAGGAATAGCCGGTGCCGAAGTCGTCGG
+CGGCGAAGCGCACGCCGATGGCGCGCAAGGCGTCGAAACTGGCGAACAGGGCTGGATTGC
+CGAATGCGACCGATTCGGTCAGTTCGATCTCCAGAAGCTCGGCGGGCAGGGCCATATCGG
+CCAGCACCCGCTTTACCTCGTCGTCGAACGTTGGCCCAACCTGGCTGGCGGACACATTGA
+TGGCAAGACGGAACGGTTGCCATGCCGGTCCTTGCCACTTGTGCATCTGGCGACAGGCCT
+CGCCCAGCACCCACGCGCCTATTTCCGGCATCAGGCCGAACGACTCGGCCAGCGGCAGGA
+ACTGGCCGGGCGGCAACAGGCCAAGCCTCGGATGCCGCCAGCGCATCAACGCTTCCGCGC
+CAGCGATCCGGTGATCGCGCAGATCGACCAGCGGCTGGTAATGCAGGTCAAGCTGTCCGC
+GCGCCGCCGCCTGCGCCAACTCGGCCGCCGTCCATCCGGCGGGCTGCGAACTCGTCATGA
+TCCGCCCCGGAAGGCGCGCAGCAGCCGCGTTACGGCCAGAACGAACAAGCCGGTCAGCGC
+GAGCGCGGCAACACCCCAATGCTCGCCAAGGAAGGCACCGGCGGTCGTCCCGGCCAGCAC
+GGCGGCGAGAATCGGCAGATGGCAGGGGCAGGTCAACACGGCCAGCGCACCCCACAGGTA
+GCCGGAAACGGGTTGGCGCGTCTCGGGCGGCAGTTTGTCAGGGGCGTTCACGGCAATGCC
+TCCTCGTGCGCCCGCTCGGCTGGCATGGAGGCCAGTTGCGCGTCCAGATGGGCCAACGCC
+GCGCGCCGCCGCTCGACCAACTGGCGCAGCACGGCAAGCTGCGCTGCGGCTTGTGCGCCG
+TCCGCTGCGTCGAGCGCACGGCACAGCCGCGCCAGGGCATCCAGGCCGATACCCGCCTCG
+AAGGCCGCGCGCACGAAGCACAGCCGTTGCAAGGCCGCATCGTCGAACACGCCGTAGCCG
+CCCGTGGTGCAGGCCACCGGCCGTAACAAGCCGCGCACCAGGTAGTCGCGCACGATATGT
+ACGCTCACCCCAGCGTTATGGGCCAGTTGCGATACCGTGTAGGCGCTCATCGCACACCTC
+CTTGTCCTCACCCGGCGCAGCAGGAAAGCTGCTTCACATCCTTGTTGAAGGTCTGCGCCG
+CGAGCTTCAACCCTTCGACCATCGTCAGGTAGGGGAACAACTGGTCGGCCAGTTCCTGCA
+CCGTCATCCGGTTGCGAATCGCCAGTGCGGCCGTCTGGATCAGTTCGCCCGCTTCCGGGG
+CCACTGCCTGCACGCCGATCAGTCGTCCGCTGCCTTCTTCAACCACCAGTTTGATGAAGC
+CGCGCGTGTCGAAGTTGGCGAGCGCGCGCGGCACGTTGTCCAGCGTTAGCGTGCGACTAT
+CAGTTTTGATGCCGTCATGGTGCGCTTCCGCCTCGCTGTAGCCTACGGTCGCCACTTGCG
+GGTCGGTGAACACCACGGCCGGCATCGCGGTCAGGTTCAGGGCCGCGTCACCGCCGGTCA
+TGTTGATCGCGGCGCGAGTGCCGGCCGCTGCCGCCACATAGACGAACTGCGGCTGGTCGG
+TGCAGTCGCCTGCGGCGTAGATGTGTTCCACGCTTGTACGCATGCCGGGGTCGATGACGA
+TAGCGCCTTGCGGGGTGAGCGTGACGCCCGTCGCATCCAGTGCCAGCTTGCGTGTGTTGG
+GCGCGCGGCCGGTGGCGACCAGCAGCTTGTCGGCGCGCAGTTCGCCGTGCGCCGTGGTGA
+GCACGAATTCGCCGTCCCCTTCACCATTGATATACGCGACCTGGCTGGCCTGGGTGTGTT
+CCCTCACCTCGATGCCCTCCATGCGGAATGCGGCCGTGACGGCTTCGCCTATAGCTGGGT
+CTTCGCGGAAGAACAGCGTGCTGCGAGCCAGGATCGTCACCTTCGCTCCGAGTCGGGCGA
+ACGCCTGCGCCAGCTCCAGCGCCACCACTGATGAGCCAATCACGGCCAGGCGCTTAGGAA
+TCGTCTCGCTGACCAGCGCTTCAGTGGAAGTCCAGTACGGAGTGTCTTTCAGGCCGGGAA
+TCGGCGGCACGGCCGGGCTCGCGCCGGTGGCGATCAGGCAGCGGTCGAATGCCACCACGC
+GCTCGCCGCCGTCGTTGAGTTGCACGATCAGGTTGCGATTGTCCTTAAAGCGGGCGGAGC
+CGTGCAGCACAGTGATCGCCGGATTGCCCTCCAAGATGCCTTCGTACTTGGCGTGGCGCA
+GTTCATCGACGCGGGCCTGCTGCTGGGCCAGCAGCGCCGTGCGCTGGATGGTCGGCGTGG
+TAGCGGCGATGCCGCCATCGAACGGGCTTTCCCGGCGCAGATGGGCGATATGGGCGGCGC
+GGATCATGATCTTGGACGGCACACAACCGACATTGACGCAGGTGCCGCCGATGGTGCCGC
+GCTCGATCAGCGTGACACGTGCGCCTTGCTCGACGGCCTTCAGCGCCGCTGCCATCGCGG
+CCCCGCCGCTGCCGATGACGGCGATATGCAATGCGCCGCTGCTACCCGTCTTGTCGTTTC
+TGCCCAGCAGATCGCGCATCTTGTCGAGCAATCCGCCCGGCGTCGAAACTGAGGGGGCAT
+CGGCCAGCGTGGCCCGATAACCGAGTCCAGCTACAGCGGCCGTCAGCGCGTCGGGTGACG
+TGCCGACCTCAATGGCGAGCTTGGCGCTGCCCTTGGCGTAGGAGACATCCGCTGATTGCA
+CGCCGGGCACTTTCTCCAGGGCGTCCTTGACATGCACTGCGCACGAGTCGCAAGTCATGC
+CGGTGATTTTGAGAGTGCTCATACCATCGTTCCTTATTCGTGTGGGCCGCCGTGTCGCAC
+GGTCAGCCGTCTTTCACAAGCGCTTGGCGGGGAGTTCGCAGCCGTCCGGTCCGCAACGGC
+GATGCGCCGGCGACACGAAGTCCCAGATCGACACCCCAATCATCAAGGCCAGGCCGACGT
+ACATCAGGTTCGCCGTCCACCAGTTGCCGAGCAGCCAGACCGTGGCCGCAAACACGATGG
+CCGGGCCGATCATGCCGAGCAGACTGCGCAGCCATTGCCGATGACTGAACCAACCCAGCG
+CGTTCGCCAGGAAGGCCAGCGCGGCAAACAGCGGCAGCAGGCGGCTGATGAACAGTCCCT
+CGTACTGGCTCAAGAAGCCCAGCCCGATGGCCGCGCCGAAGCTGGCGAGGGCTGGAAAGC
+AGGCGGCGCAGCCCATCGCGGAAACGACGCTGCCGAGCGCGCCGGTTTTATCGGCAATGC
+GTGTCATCAGTCCCATGAAGCGGCTCTCGCTGTTGTCGTTGGCTTGCTGGCTCACTGCTT
+GACGCTGGACGGATAGCCGGCGTCTGCGGTGGCCTTGGTCAGCTTCTGTACGCTGGCCTT
+GGTGTCGTCAAAAGTGACGACGGCCTCGCGCTTCTCGAAGCCCACATCGACCTTGCTCAC
+GCCTTCGACCTTGGAGAGCGCTTTCTTGACTGTGATCGGGCAGGCGACGCAAGTCATGCC
+GGGAACCGCTAGCGTGACGGTCTGGGTAGCGGCCCACACCGGGGCAACAGCGGCGGCGAG
+GGCAAGGGAGGCAAACAGTTTCTTCATGATGAACTCCTGGTTAATAGAAAAATGGAACGA
+CATAGGGAAATCCAAGCGCGACCAGGACCAGCACGGCCACGATCCAGAAAATCAGCTTGT
+AGGTGGCGCGCACCTGCGGAATCGCGCAGACCTCACCTGGCTTGCATGCCTGCACGGGCC
+GGTAAATCCGCTTCCAGGCGAAGAACAGCGCCACTAGCGCCGCGCCGATGAACAACGGTC
+GATAGGGTTCCAGCACCGTCAGGTTGCCGATCCAAGCACCGGAGAAGCCCAGGGCGACCA
+GTACTAGCGGCCCCAGGCAGCAGGTCGATGCAAGAATGGCGGCCAGCCCGCCGGCGAAGA
+GCGCACCGCGCCCGTTTTGTGGTTCAGACATACGTTGGCCCTTTTGAATTTGGATTGGAT
+AGCGTAACCTTACTTCCGTACTCATGTACGGAGTCAAGCGATATGGAAAATAATTTGGAA
+AACCTGACCATTGGCGTTTTTGCCAAGGCGGCCGGGGTCAACGTGGAGACAATCCGCTTC
+TATCAGCGCAAGGGCCTGTTGCGGGAACCGGACAAGCCTTACGGCAGCATCCGCCGCTAT
+GGGGAGGCGGACGTGGTTCGGGTGAAATTCGTGAAATCGGCACAGCGGCTGGGGTTCAGT
+CTGGACGAGATTGCCGAGCTGTTGCGGCTCGACGATGGCACCCACTGCGAGGAGGCCAGC
+AGCCTGGCCGAACACAAGCTCAAGGACGTGCGCGAGAAGATGGCCGACTTGGCGCGCATG
+GAAACCGTGCTGTCTGAACTCGTGTGCGCCTGCCATGCACGAAAGGGGAATGTTTCCTGC
+CCGTTGATCGCGTCACTACAGGGCGAAGCAGGCCTGGCAAGGTCAGCTATGCCTTAGCGT
+GCTTTATTTAATGAGATGGTCACTCCCTCCTTCCCAGTACTATGCTGAGGACAGGCTTTC
+ATTCGGAGAACCATCATGGAAAACATTGCGCTTATTGGTATCGATCTGGGTAAGAACTCT
+TTCCATATTCATTGTCAGGATCATCGTGGGAAGGCCGTTTACCGTAAAAAATTCACCCGA
+CCAAAGCTAATCGAATTTCTGGCGACATGCCCGGCAACAACCATCGCGATGGAAGCCTGT
+GGCGGTTCTCACTTTATGGCACGCAAGCTGGCAGAGTTAGGGCATTTTCCAAAGCTGATA
+TCACCGCAATTTGTCCGCCCATTCGTTAAAAGCAACAAAAATGACTTCGTTGATGCTGAA
+GCTATCTGTGAAGCAGCATCACGTCCATCTATGCGTTTCGTGCAGCCCAGAACCGAATCT
+CAGCAGGCAATGCGAGCTCTGCATCGTGTCCGTGAATCCCTGGTTCAGGATAAGGTGAAA
+ACAACTAATCAGATGCATGCTTTTCTGCTGGAATTTGGTATCAGCGTTCCGCGAGGTGCT
+GCCGTTATTAGTCGACTGAGTACCCTTCTTGAGGACAGTAGTTTGCCTCTTTATCTCAGC
+CAGTTACTGCTGAAATTACAACAGCATTATCACTATCTTGTTGAGCAGATTAAAGATCTG
+GAATCTCAGTTGAAACGAAAGTTGGACGAAGATGAGGTTGGACAGCGCTTGCTGAGTATT
+CCCTGCGTTGGAACGCTGACTGCCAGTACTATTTCAACTGAGATTGGCGACGGGAAGCAG
+TACGCCAGCAGCCGTGACTTTGCGGCGGCAACAGGGCTGGTACCCCGACAGTACAGCACG
+GGAGGTCGGACGACATTGTTAGGGATTAGCAAGCGGGGCAACAAAAAGATCCGAACTTTG
+TTGGTTCAGTGTGCCAGGGTATTCATACAAAAACTGGAACACCAGTCTGGCAAGTTGGCC
+GACTGGGTCAGGGAGTTGTTGTGTCGGAAAAGCAACTTTGTCGTCACCTGTGCTCTGGCA
+AACAAGCTGGCCAGAATAGCCTGGGCACTGACGGCGCGACAGCAAACTTACGAAGCATAA
+AGGCAGAAATACACCAGTTTAAACAATCATTCATCTGGTTTTGCGAATACTGATATTGAT
+GATACTAACGGCCCACCGGCCTGTTGAGGAACCTGTAAAACGGAAAGGC
+>NODE_3_length_5869_cov_43.038':NODE_4_length_123_cov_119.957;
+GCCTTTCCGTTTTACAGGTTCCTCAACAGGCCGGTGGGCCGTTAGTATCATCAATATCAG
+TATTCGCAAAACCAGATGAATGATTGTTTAAACTGGTGTATTTCTGCCTTTATGCTTCGT
+AAGTTTGCTGTCGCGCCGTCAGTGCCCAGGCTATTCTGGCCAGCTTGTTTGCCAGAGCAC
+AGGTGACGACAAAGTTGCTTTTCCGACACAACAACTCCCTGACCCAGTCGGCCAACTTGC
+CAGACTGGTGTTCCAGTTTTTGTATGAATACCCTGGCACACTGAACCAACAAAGTTCGGA
+TCTTTTTGTTGCCCCGCTTGCTAATCCCTAACAATGTCGTCCGACCTCCCGTGCTGTACT
+GTCGGGGTACCAGCCCTGTTGCCGCCGCAAAGTCACGGCTGCTGGCGTACTGCTTCCCGT
+CGCCAATCTCAGTTGAAATAGTACTGGCAGTCAGCGTTCCAACGCAGGGAATACTCAGCA
+AGCGCTGTCCAACCTCATCTTCGTCCAACTTTCGTTTCAACTGAGATTCCAGATCTTTAA
+TCTGCTCAACAAGATAGTGATAATGCTGTTGTAATTTCAGCAGTAACTGGCTGAGATAAA
+GAGGCAAACTACTGTCCTCAAGAAGGGTACTCAGTCGACTAATAACGGCAGCACCTCGCG
+GAACGCTGATACCAAATTCCAGCAGAAAAGCATGCATCTGATTAGTTGTTTTCACCTTAT
+CCTGAACCAGGGATTCACGGACACGATGCAGAGCTCGCATTGCCTGCTGAGATTCGGTTC
+TGGGCTGCACGAAACGCATAGATGGACGTGATGCTGCTTCACAGATAGCTTCAGCATCAA
+CGAAGTCATTTTTGTTGCTTTTAACGAATGGGCGGACAAATTGCGGTGATATCAGCTTTG
+GAAAATGCCCTAACTCTGCCAGCTTGCGTGCCATAAAGTGAGAACCGCCACAGGCTTCCA
+TCGCGATGGTTGTTGCCGGGCATGTCGCCAGAAATTCGATTAGCTTTGGTCGGGTGAATT
+TTTTACGGTAAACGGCCTTCCCACGATGATCCTGACAATGAATATGGAAAGAGTTCTTAC
+CCAGATCGATACCAATAAGCGCAATGTTTTCCATGATGGTTCTCCGAATGAAAGCCTGTC
+CTCAGCATAGTACTGGGAAGGAGGGAGTGACCATCTCATTAAATAAAGCACGCTAAGGCA
+TAGCTGACCTTGCCAGGCCTGCTTCGCCCTGTAGTGACGCGATCAACGGGCAGGAAACAT
+TCCCCTTTCGTGCATGGCAGGCGCACACGAGTTCAGACAGCACGGTTTCCATGCGCGCCA
+AGTCGGCCATCTTCTCGCGCACGTCCTTGAGCTTGTGTTCGGCCAGGCTGCTGGCCTCCT
+CGCAGTGGGTGCCATCGTCGAGCCGCAACAGCTCGGCAATCTCGTCCAGACTGAACCCCA
+GCCGCTGTGCCGATTTCACGAATTTCACCCGAACCACGTCCGCCTCCCCATAGCGGCGGA
+TGCTGCCGTAAGGCTTGTCCGGTTCCCGCAACAGGCCCTTGCGCTGATAGAAGCGGATTG
+TCTCCACGTTGACCCCGGCCGCCTTGGCAAAAACGCCAATGGTCAGGTTTTCCAAATTAT
+TTTCCATATCGCTTGACTCCGTACATGAGTACGGAAGTAAGGTTACGCTATCCAATCCAA
+ATTCAAAAGGGCCAACGTATGTCTGAACCACAAAACGGGCGCGGTGCGCTCTTCGCCGGC
+GGGCTGGCCGCCATTCTTGCATCGACCTGCTGCCTGGGGCCGCTAGTACTGGTCGCCCTG
+GGCTTCTCCGGTGCTTGGATCGGCAACCTGACGGTGCTGGAACCCTATCGACCGTTGTTC
+ATCGGCGCGGCGCTAGTGGCGCTGTTCTTCGCCTGGAAGCGGATTTACCGGCCCGTGCAG
+GCATGCAAGCCAGGTGAGGTCTGCGCGATTCCGCAGGTGCGCGCCACCTACAAGCTGATT
+TTCTGGATCGTGGCCGTGCTGGTCCTGGTCGCGCTTGGATTTCCCTATGTCGTTCCATTT
+TTCTATTAACCAGGAGTTCATCATGAAGAAACTGTTTGCCTCCCTTGCCCTCGCCGCCGC
+TGTTGCCCCGGTGTGGGCCGCTACCCAGACCGTCACGCTAGCGGTTCCCGGCATGACTTG
+CGTCGCCTGCCCGATCACAGTCAAGAAAGCGCTCTCCAAGGTCGAAGGCGTGAGCAAGGT
+CGATGTGGGCTTCGAGAAGCGCGAGGCCGTCGTCACTTTTGACGACACCAAGGCCAGCGT
+ACAGAAGCTGACCAAGGCCACCGCAGACGCCGGCTATCCGTCCAGCGTCAAGCAGTGAGC
+CAGCAAGCCAACGACAACAGCGAGAGCCGCTTCATGGGACTGATGACACGCATTGCCGAT
+AAAACCGGCGCGCTCGGCAGCGTCGTTTCCGCGATGGGCTGCGCCGCCTGCTTTCCAGCC
+CTCGCCAGCTTCGGCGCGGCCATCGGGCTGGGCTTCTTGAGCCAGTACGAGGGACTGTTC
+ATCAGCCGCCTGCTGCCGCTGTTTGCCGCGCTGGCCTTCCTGGCGAACGCGCTGGGTTGG
+TTCAGTCATCGGCAATGGCTGCGCAGTCTGCTCGGCATGATCGGCCCGGCCATCGTGTTT
+GCGGCCACGGTCTGGCTGCTCGGCAACTGGTGGACGGCGAACCTGATGTACGTCGGCCTG
+GCCTTGATGATTGGGGTGTCGATCTGGGACTTCGTGTCGCCGGCGCATCGCCGTTGCGGA
+CCGGACGGCTGCGAACTCCCCGCCAAGCGCTTGTGAAAGACGGCTGACCGTGCGACACGG
+CGGCCCACACGAATAAGGAACGATGGTATGAGCACTCTCAAAATCACCGGCATGACTTGC
+GACTCGTGCGCAGTGCATGTCAAGGACGCCCTGGAGAAAGTGCCCGGCGTGCAATCAGCG
+GATGTCTCCTACGCCAAGGGCAGCGCCAAGCTCGCCATTGAGGTCGGCACGTCACCCGAC
+GCGCTGACGGCCGCTGTAGCTGGACTCGGTTATCGGGCCACGCTGGCCGATGCCCCCTCA
+GTTTCGACGCCGGGCGGATTGCTCGACAAGATGCGCGATCTGCTGGGCAGAAACGACAAG
+ACGGGTAGCAGCGGCGCATTGCATATCGCCGTCATCGGCAGCGGCGGGGCCGCGATGGCA
+GCGGCGCTGAAGGCCGTCGAGCAAGGCGCACGTGTCACGCTGATCGAGCGCGGCACCATC
+GGCGGCACCTGCGTCAATGTCGGTTGTGTGCCGTCCAAGATCATGATCCGCGCCGCCCAT
+ATCGCCCATCTGCGCCGGGAAAGCCCGTTCGATGGCGGCATCGCCGCTACCACGCCGACC
+ATCCAGCGCACGGCGCTGCTGGCCCAGCAGCAGGCCCGCGTCGATGAACTGCGCCACGCC
+AAGTACGAAGGCATCTTGGAGGGCAATCCGGCGATCACTGTGCTGCACGGCTCCGCCCGC
+TTTAAGGACAATCGCAACCTGATCGTGCAACTCAACGACGGCGGCGAGCGCGTGGTGGCA
+TTCGACCGCTGCCTGATCGCCACCGGCGCGAGCCCGGCCGTGCCGCCGATTCCCGGCCTG
+AAAGACACTCCGTACTGGACTTCCACTGAAGCGCTGGTCAGCGAGACGATTCCTAAGCGC
+CTGGCCGTGATTGGCTCATCAGTGGTGGCGCTGGAGCTGGCGCAGGCGTTCGCCCGACTC
+GGAGCGAAGGTGACGATCCTGGCTCGCAGCACGCTGTTCTTCCGCGAAGACCCAGCTATA
+GGCGAAGCCGTCACGGCCGCATTCCGCATGGAGGGCATCGAGGTGAGGGAACACACCCAG
+GCCAGCCAGGTCGCGTATATCAATGGTGAAGGGGACGGCGAATTCGTGCTCACCACGGCG
+CACGGCGAACTGCGCGCCGACAAGCTGCTGGTCGCCACCGGCCGCGCGCCCAACACACGC
+AAGCTGGCACTGGATGCGACGGGCGTCACGCTCACCCCGCAAGGCGCTATCGTCATCGAC
+CCCGGCATGCGTACAAGCGTGGAACACATCTACGCCGCAGGCGACTGCACCGACCAGCCG
+CAGTTCGTCTATGTGGCGGCAGCGGCCGGCACTCGCGCCGCGATCAACATGACCGGCGGT
+GACGCGGCCCTGAACCTGACCGCGATGCCGGCCGTGGTGTTCACCGACCCGCAAGTGGCG
+ACCGTAGGCTACAGCGAGGCGGAAGCGCACCATGACGGCATCAAAACTGATAGTCGCACG
+CTAACGCTGGACAACGTGCCGCGCGCGCTCGCCAACTTCGACACGCGCGGCTTCATCAAA
+CTGGTGGTTGAAGAAGGCAGCGGACGACTGATCGGCGTGCAGGCAGTGGCCCCGGAAGCG
+GGCGAACTGATCCAGACGGCCGCACTGGCGATTCGCAACCGGATGACGGTGCAGGAACTG
+GCCGACCAGTTGTTCCCCTACCTGACGATGGTCGAAGGGTTGAAGCTCGCGGCGCAGACC
+TTCAACAAGGATGTGAAGCAGCTTTCCTGCTGCGCCGGGTGAGGACAAGGAGGTGTGCGA
+TGAGCGCCTACACGGTATCGCAACTGGCCCATAACGCTGGGGTGAGCGTACATATCGTGC
+GCGACTACCTGGTGCGCGGCTTGTTACGGCCGGTGGCCTGCACCACGGGCGGCTACGGCG
+TGTTCGACGATGCGGCCTTGCAACGGCTGTGCTTCGTGCGCGCGGCCTTCGAGGCGGGTA
+TCGGCCTGGATGCCCTGGCGCGGCTGTGCCGTGCGCTCGACGCAGCGGACGGCGCACAAG
+CCGCAGCGCAGCTTGCCGTGCTGCGCCAGTTGGTCGAGCGGCGGCGCGCGGCGTTGGCCC
+ATCTGGACGCGCAACTGGCCTCCATGCCAGCCGAGCGGGCGCACGAGGAGGCATTGCCGT
+GAACGCCCCTGACAAACTGCCGCCCGAGACGCGCCAACCCGTTTCCGGCTACCTGTGGGG
+TGCGCTGGCCGTGTTGACCTGCCCCTGCCATCTGCCGATTCTCGCCGCCGTGCTGGCCGG
+GACGACCGCCGGTGCCTTCCTTGGCGAGCATTGGGGTGTTGCCGCGCTCGCGCTGACCGG
+CTTGTTCGTTCTGGCCGTAACGCGGCTGCTGCGCGCCTTCCGGGGCGGATCATGACGAGT
+TCGCAGCCCGCCGGATGGACGGCGGCCGAGTTGGCGCAGGCGGCGGCGCGCGGACAGCTT
+GACCTGCATTACCAGCCGCTGGTCGATCTGCGCGATCACCGGATCGCTGGCGCGGAAGCG
+TTGATGCGCTGGCGGCATCCGAGGCTTGGCCTGTTGCCGCCCGGCCAGTTCCTGCCGCTG
+GCCGAGTCGTTCGGCCTGATGCCGGAAATAGGCGCGTGGGTGCTGGGCGAGGCCTGTCGC
+CAGATGCACAAGTGGCAAGGACCGGCATGGCAACCGTTCCGTCTTGCCATCAATGTGTCC
+GCCAGCCAGGTTGGGCCAACGTTCGACGACGAGGTAAAGCGGGTGCTGGCCGATATGGCC
+CTGCCCGCCGAGCTTCTGGAGATCGAACTGACCGAATCGGTCGCATTCGGCAATCCAGCC
+CTGTTCGCCAGTTTCGACGCCTTGCGCGCCATCGGCGTGCGCTTCGCCGCCGACGACTTC
+GGCACCGGCTATTCCTGCCTGCAACATCTGAAATGCTGCCCCATCACCACATTGAAAATC
+GACCAATCCTTTGTCGCCAGGCTCCCGGATGATGCCCGTGACCAAACTATCGTGCGGGCG
+GTGATCCAGCTCGCGCACGGGCTGGGCATGGATGTCATTTTCAGAAGACGACTGCACCAG
+TTGATTGGGCGTAATGGCTGTTGTGCAGCCAGCTCCTGACAGTTCAATA
+>NODE_4_length_123_cov_119.957:NODE_33_length_106_cov_94.1379,NODE_34_length_1034_cov_43.0564;
+TGTCATTTTCAGAAGACGACTGCACCAGTTGATTGGGCGTAATGGCTGTTGTGCAGCCAG
+CTCCTGACAGTTCAATATCAGAAGTGATCTGCACCAATCTCGACTATGCTCAATACTCGT
+GTG
+>NODE_4_length_123_cov_119.957':NODE_1_length_6070_cov_43.3434,NODE_2_length_9792_cov_41.771,NODE_3_length_5869_cov_43.038;
+CACACGAGTATTGAGCATAGTCGAGATTGGTGCAGATCACTTCTGATATTGAACTGTCAG
+GAGCTGGCTGCACAACAGCCATTACGCCCAATCAACTGGTGCAGTCGTCTTCTGAAAATG
+ACA
+>NODE_5_length_226_cov_46.5369:NODE_43_length_220_cov_211.224;
+TCACCGAATACGTGCGCAACAACCGTCTTCCGGAGCCTGTCATACGCGTAAAACAGCCAG
+CGCTGGCGCGATTTAGCGCAGACGATGACGTCACTGCCCGGCTGTATGCGCGAGGTTACC
+GACTGCGGCCTGAGTTTTTTAAATGACGTAAAATCGTGTTGAGGCCAACGCCCATAATGC
+GGGCGGTTGCCCGGCATCCAACGCCATTCATGGCCATATCAATGAT
+>NODE_5_length_226_cov_46.5369':NODE_41_length_366_cov_169.284;
+ATCATTGATATGGCCATGAATGGCGTTGGATGCCGGGCAACCGCCCGCATTATGGGCGTT
+GGCCTCAACACGATTTTACGTCATTTAAAAAACTCAGGCCGCAGTCGGTAACCTCGCGCA
+TACAGCCGGGCAGTGACGTCATCGTCTGCGCTAAATCGCGCCAGCGCTGGCTGTTTTACG
+CGTATGACAGGCTCCGGAAGACGGTTGTTGCGCACGTATTCGGTGA
+>NODE_6_length_50434_cov_42.3615:NODE_26_length_130_cov_84.9811;
+AGAGCAGAGATAGCGCTGATGTCCGGCGGTGCTTTTGCCGTTACGCACCACCCCGTCAGT
+AGCTGAACAGGAGGGACGGCTGATAGAAACAGAAGCCACTGGAGCACCTCAAAAACACCA
+TCATACACTAAATCAGTAAGTTGGCAGCATCACCATTTCGTCCAAGCTCGCCGCGTTTAA
+ATAAAAGGAAATGAAGGGAACAGGTAAAAATATTAGATGTTTAATTCTCATACGAGTTAC
+CACCATGGAGCGGAAACAGGATTTTGAATGACGTGATGACTTTACTAATTAAGCTTATTT
+AGAGGTATTAATAGAATATTAAAAAATTTTAATTTTACTGCTGACGTTTTCATAAATCTC
+CTTTCCTGAAAAGTCGGCGATAAATTGGTTACCAATATCTTCATATTACTGACGGACCAG
+TGTCCATACGCTTGCGGGTACTTTATCGTAGAGTTTCTTCATTGTCAGTTCAGCTTTTCG
+ATGGTCATATGCCCCGGAAATTTCCAGTGATGCTATACCTGCATTTTTTTCACAGAGTCG
+TTCGAATACTTTTTCCAGTGTGTCGAAAGAAGAGCACTTACGAAATTTCATTAAATACGC
+CTGCTTAGTTTCGGACATGGTCAACCTTAATTTATTTCCCGCGAAAGTACGGTTTCCCAA
+TCTTATGTCGTTTTGTCCCTAGAATCTAATTTTTTTCACAAATATTTGATGTTTATCTCC
+GGATCGTTGTTGTAGTCGCTCTCTCTTTTTTAGTTGCTGTGAACCTGTTCATAAGTGGAT
+ACCTCAGTGCTAAAATAGCTGTAAATAAAAACAGTGTATTCAGGTGACCACCATGAACAG
+CAAGCCAGTAACCAGACAGTTTGAAGACTCAGACCTCCATCAGGAACTGGTCACGTTTGA
+GGTGCCCAATAATGACCTTAAGGAGCTCATTTTTTACTTTTCTCATATGAAATACAACAC
+GGCTAAAACTTACCTTCAATGGCTGCGTTCCTGGAACGAGTGGTACCAAGCTAATGCAGG
+AAAGGAGGGAAACGAAGCCTGGCCTGCCAGTTCTCTCCCGGTGACAGAACCCCCGTTGTT
+GGCCTATCTGGACTATCTTCAGGGCTCGCTGTCACACAGCAGCATTAAAGGTTGTCTGCA
+CGCGCTGAACAGTATCCATAGGAAAGCACTCGATCGCCCTGGGATCATCACATCCAAGGT
+CAAGAGTATTCTTGCAAGCCTCGAACAAGCTGAAGCCCGAGAGCAAAAAGTGACTCGTCA
+GGCAACGCCATTCCTAGTCTCCGACCTGAAAGCTTTGATTAAAGCCCACGGTACGACACA
+GTCGGTGCGCAAACTCCGAGACCTTTGCATTATCTGGACAGGTTTTGAAACACTGTTGCG
+CTCAGCAGAACTTCGGCGCATTCGGATGCAGGACCTTGTGCTGAATGAACAGACAGGCAG
+TTTTACCCTGACGGTGTACCGGACAAAATCCACTGTCAGTACCCTGCTTACCTATCATCT
+GACCCCTCATCTCACTGCCACCCTAATCAGGCTGATGGATATGGTCAAAAGGGACCAGCA
+AAGCCATCCGAAGGATTATCTCTTCCAGGCAGTTAACTATCAGGACAGCGGATATATGCC
+CCCTGGATGGGGTCTCCGGAGCAAAGGGAATGAGATCAATACGCTGCTGAAAAATCATAA
+TATGCCTTACCGACCTACCCGTCCCCCGATCGGGAAAAATGGAAAGCCCATTATTGTCGA
+TGATGAGGGTATGCTCAGTAAAAACACATTGCTCCGGGCCTTTGAAGCGTTTTGGGATGA
+ACTTCATCCGCAGGAAGCGGGCACCCGATGCTGGACTGGTCACAGCGTTAGGGTTGGCGG
+CGCCATCGAACTTGCTAATGCCGGGTACACGCACTTGCAGATCATGGAGATGGGTAACTG
+GAGCAATCCAGAAATGGTTTCCCGCTATATCCGTAACATTGACGCAGGTAAGAAAGCGAT
+GACGAAGTTCATGCGTGAGGCGCTGGATGAGTAGCGCCCCTGCGGGCGCTAATGAGGATT
+ACTTCTTTCGAAATGGATTAAAGCGGCCAAGATCATGAGGGGCGTCTTTCGGCGGCATCA
+TCCCGGTGCGTTTAAATTTATAAACCCCGTTTAGCTTCATCGTCTGCACGCCCAGATTTA
+ACAGTGCCACCAGCTTCAGGGTATACAGAAACGTGAATGCCGGGACCATCTGAATAAAAA
+TAAATAGCAAACCCGCACACATCACTCGCAGCCAGGCTGCATACTCCATGCTCAGCGGCC
+GCTTAAAGTAATGGATTTCCAGCAATCCGACCGTCTTGTTACTGATCCACACCGCTGCCA
+GTGAGAGTAACAACACGATGCACACCATAATGCCCAGTTCCATGATCCTCACTCCCCGTC
+GATTTGATATTTTGAGTTTCTGATTTACCCGCTTTGGTTTTGTTTTTCGCCTTCTTTTTG
+GGTTTGATATGGTGGAACAGGAAACAATCCACCAGCACCCAACCATTAGCATATCGGGCC
+AGCAGTAATTTCTGGCCCGGATAATGTGTGTGGAAAAGCATTTTCACATCAACGGTATTC
+ATGATCTTCTGCTTGCGCTTCAGTTCCTCCCCAGGCATCTCAAATTCCTGAATAAACGGT
+GATGACAACCGCTGGCGAAGCATTCGAATTGCACTAGCGTTTTCATCGTGTTTTGCCAGC
+CTCCCGAATCGCACAAGCGCCTTATGAGTTACCTGAACAGGCCCCAGATGGGAATTAACC
+AGTTCATACTGCCAGTAGTATCGCAGATCCACTTTTACCCAGCTGATGCTGTCTTCCAGT
+GCGGCTTTCATGATGGTTCCCGACATCGGGACCATGGTCAGCTTGGCCAGACGCATCTGA
+ATGTAATCAGCCAGGGGCCTAAGGGACTCAGGTACATTGCTGTTCAGGAGAAGGTGCTGA
+AGCCCCGGTGTCGACGTCTGCCAGCTCAGGTTGCGGCCGTCAGGCAAAAATTCAAAGTTC
+TGATCCGCTGGCGCCGATTTTGCGTTGTTCTCTTTCCGCATCAGAAAATAATGCCCACAC
+AGTAACTCGGCCCGTACCTGGTCCTCTATCGGGTCATGGCGGGCCTTACTGAGATCAACC
+GTCAACACAACACGGTTGATGGCATCCTCATGGTATTTTTTCACCCAGACACAGACACGA
+TAAAGTCTCTCATCAAGTTTCTGGCTGGTCGTGGAAATCCATTGCATGCTTTTCTCCTCA
+GACCTTTCTCATAATGAAAATGCCAAGATCTGCACCGGGTACAAGTTCCGTGTAGCTATG
+GTTGCTCCTTCGACCATTGGACAGTGCTTCATCCTGCGCTGGCACCCAGTCCTGAAGTCT
+TTTAATTGTTGGCTTTTGTCCGACGCCAAAAATGGGTAATGAGGCTTTCACCACCTTGTA
+ATCAGTCTCGGCATATTTGCTACTTCCACGCTCCTTGCCTTCAGGCCGGTATGTGAACAA
+ATGCGCTATCGGAACCGGGAAGGTATTGGTTCGACAAAGGCGATAACCTTCGCCGTCTCT
+CAGTACTTTTCTTTCCAGTAATGCCTTCGCTCTATCGATGTTCGCCACCACTGTCAGGTC
+AGTTGTCACGGGCGATTTGACCGCTACTAAACGACGCTTATCCAGCATCGCGATGAGATC
+ACTTGCGTTTGTTTTTACCTGGTTTCGGTTTAGCCGCCAGGCAAAAGTAACTTTTTTGAG
+CTGTTCTTCCACAAACAGAATTTTGCGAGTGGAATGCGCAGTCACCAGACCGGGAAGCTT
+ACGGTGAACTTCCTTAAACCGGATGTGTTTCTCCGAATTCACCCTTTTCATTGCAGAGGC
+AAAGTCACTTTTGGCATCATTTATATCGCAAATAATTCCGCTCAGCTGTTCGGCACCCTC
+AGGAACAATAATCAAACCCGGGTATTTGGTTGTCACTTTCGTCGAATTCCTGCTGAGTAC
+ATCAATGTCATCGATACAGAAATCCTGAATAACACGGATAATTTCATCCACGGAGGCATC
+TGAAATAGTACTCACCTCGATGGGGTTCACCTCTTTCAACCGCTCTTCGTGTCGTGTGAC
+GGTCCCCACAGTCATCAGCTCGGCCATCACCGGCTGATGGTCATTCAGAAAGGATCTGAG
+CTTTTCAATTCGCTCCAGAATCCGGTCACGGTAAAAGAGTAAATCTTCACTGGCCATTCA
+TCACTCCGGTTTCAATAAAGCAGCGCAACACCGTTACGTCTTCAACGACTTCTGAAGAGT
+CGATATGCAGCCGGTAGTTGTACTTTTACAGCACCTTCCGCAATTCCCCGGGATTGCCGG
+TTGTATAAAGTGGCAGAGGTTCAACCTGCTGACCGTCATGCCGAAAACAACGATTAAGGT
+CATTCAAAAGGCCAAAACTGACCGGCTGGCGTTGCAGATTGATGCGCTGCCAGTCCTGCT
+TTACACCAAACTTCACCCACCAACCCAGACCAATCAGTTCATTACGTATGTTCTGCACAT
+TGCCCAAATCCGATACTGAAACATCCGGGATTACACCCTTCCCTTCCACCAGCAAATGCA
+TCACGCTCTAAAAATCAGGCTGACGGCTCTTCCTTGCGTGCTTCAGAATTGTACGAATCG
+AACGCAAGCTGTGGCGGGAATGCAAATTACGACGTTCAGCCGAACTAAGCCATCTCTGGA
+TAAGCTCATTTGAATATGACACCGGCATTTCACCGGGGCCTGACCTTTCGATTTCACGCA
+CATACAGCAGGCAGGAAGTAGCGGCACTCACTACTGCGTCAGAATTTTCGTTCATGTTCA
+CGTCCGTTAATATCAGAAATCTGCTTATCCGGTGTCAGGAACAAAGGCTGATAGTACAGG
+CGCCACGGATAGTGTACCGTCAAACCATCCGTTCCAATCCGGTTCAACCGGTAGCGTCCA
+TTAATTCTGTCAACAGACCAGGTGCCAGGAACTACAGAACGACTCCAGCGGAAAACCGGC
+AGATCTCCGAGCTGAAGTGTATTCACGAGCCCTTTATCCATTTCGGTCACGCGTACCTTC
+AACAAGAAGCCCAGCCAGGGTAAAGACCAGATACACAGCCAAACGGGCTGGAGGACAACT
+TTGTTTAACAAATGACCTGTCATGAACATCGCTGATAAAAACATAAAACTGATGATAATC
+CAGAACACCATCCATCCTAACCAGGCTCTTGTCTCACGAAGTTTCCATTCAAGAAGGTAA
+AGTCGCTTTTTCATCCAGAGCCCCCGGAACTCAGTGAATGACTGATGTCTGCTGCATCAA
+AATAGTGGTGCGTGGCAGGATCTCGTTTCGCCACAACTCTTGAGCCGTCGTCCATCCATG
+TAGAATTCCGTTGCCACAGTGTGAATTGAACGCCATGACCTCATCAGTTAGCTGATAGAC
+CAGCCTGTCTGGCATTTCAATGTACTCCGGAAGCGAAAGCAGGACGCCGTGTATCACGTC
+GCCGGTAAGCCTCGACAACGTCTCTTCGTCGTCCAGATTCTTTGTGGGCATCGTCGAAAG
+CGGGATAGAGAAACAACAGAGATCCATTCCCACCGCGTCAAAACCAACATCAAAACCTTC
+GTCATTGAGCACAAATCGGAAGATAGCCTCAGGCGCCTGTTCTAGACCCGGCAGCGAGCC
+CTCCGGCACTTCTGTGCCGGTAAAAAACTTATCAGTCCAGTTACTGAATGGACTGGTGAA
+CACCCAACAAAGCAGAGGCAACGCAATATCCGTTTTAAGTACTCGTTTCGTGCCGGACGT
+TCCTGAAGAGTGAATTTTGCTTTTCATTATTTACCTGTAGAGTGCTTTACTTACAGCTAT
+ATAAACACATTCCGGAATTTCCCCAATAGGTTGGAAAACACTAAAATTCACAGATACTGG
+TTCCCTTCTGTTTTAGCCGGTGCTCAAGATAGATACTTGCCAGGTCGAGTGGCTGATTTT
+CTTCGAGACAGGCCTGAACAAGGTCTTCAGTGGATACGGATACCAGCCCTCGGGTTTCAA
+GAATTTCTTTCGCCGTCGTCAATGCTCGTGAGGCGCTTCGACTTAGCTGAATTTTCACCT
+GAGAACTGTTTTCACACAGGGCATCAGCTGGTACGGTCTGTGAATCTGTATTGCTCATAG
+GGGTATCACTCCATATCAGGGATCGAATGAAAATTAACTGCAATAGACTTCTCTGGTTGA
+CCGTTTTCTACAGTGCTTAGCCAGGTTCGAGCCGGAAGTTGTTGCTCACAAAGAAGCAGA
+TAGCCCTCGCCATTTCGGTGCTTTTGTCCCAGAGCATGCAGGAGATCCCCAGAATATGGA
+CCCAGAGCTGTTCGGGTATAAAACAACGTCCCAGAATGTATCACTTTCGACAATTTGCTA
+AGCAAAACGGTCTTCTCGTCTTCATTTTCGGGTAAGACAAGGATTATCCTGAATCCCTTG
+GCTACATGTGATTGGAGATCTGCCACCAGCGTCCGAAACCTGAACGCATAAATAACCAAT
+CTGAATCGGGTCATTAACAGCGTTGTCGCGGCAAAAATAACGACAACTGAGCCGAATTTA
+GAACGGTAGAACCACCAGTTGAGGGCACCGGCCACTATCAAAACGACCAGCAGCACAATG
+CTTCCGTAAAAAAATGCAGCCGGAAAACGGGTTCTTTTTCCTTCGAGGAACGCAGATGCC
+AGTATTACGCCTGTGATGCAATACACAACCCAGTCAAAGAACGATTCAGTCATCATTAGG
+TGATAGTGTCTCGTGTTGTATTAAATCGGACGCCTGCCGTTATAAAGTCCTCAGCAATCG
+TGTCCCATGCAGCCATCAACTTCGCTAAAATTGTCACAACTCTCGGTTGTAACGTAACGT
+TCCCCACTAGCTAAACGGCGCTGTAAATCGATCTTTACTTCAGCCGCCGGTTTGAGAAAC
+AGATATTCCAGTTGTGAGTCAGTTCCTGAAGAAAGCAGTAGCTCAATACTGAAATCAATA
+TGCCGGTATGTGAAATGGCTATTGTCATTAGAGAAGACCGAATTCACAGGGTTATTGCTC
+AGGATTGTAGTGGCAGGCATAGTGACTCCTTTGTTTTAAACAGTATACAAATCTCTAACG
+ATCCATTTTTCAGATAAGAGACCTATTTTCGCGAAACCGAAACAAAAGAAGTAAAAAGTA
+ATTTGGAGGCTCCAGCATTCGGACTGTGTGCTGCCGGAAACGTCAGCAAGGGGCAAAACA
+TTCGAGTAAAAGAAGCAGAGAAGGAAACAGCTGGAAGGATGTAAATTAGGCTAGGTTTGG
+TTGAAGAAGGTAATGGAAGGCTTACATGTAACGGTGCCAAGAGTACAGTACCGTAAAACA
+TATAGGGCAGTAAGAACGTTGTAAAATTGTAAAAACAATGCAAGTTTTGACGAAAGCAAA
+AAAAAAGGCACGGATAACCGTGCCTTCTTAGAAGTATAAAAACCTGAAAATATATAATTC
+AACCTTCAGGACTCATGCCGCATCAAAGATTTTATCCTCTGATGCTGGGATGAATTCACG
+TAAGTTAGCGAACACCTCAGAAATTAATTCCTGACGGTCATGGATTTTAATCCGACCACC
+AGCTAATTCTGATACATTCACCCCTTGGTAAAGTTCAGTAACAACTTCACCATCTGTATC
+AAGGACTCTAACATTAGCAACCATAGGAAAGTAAGATTTTGAAGCATATCCTTCATAAAT
+CCCAATAATTGATTCATTATTACGGCGTAAAACCACCTTGCCAGACGGCAGCGTTGTTTC
+ATCCATATAACAATCGGTTAATTGCTCTTCGAAATCGTCCTCTTTAAGTGAAATATGCAA
+ACTAAGTTCGTCGGTAATACGACGCGTATATGAATACTCACTAAATGTATAACCGGCCAT
+GTTTATATCACTGAACGTGCGATAAACCTCATAAAGCCCGGATGTTATTTCATCTGATAC
+ATAGTTGATAAGCCCAATAAAATGCGTATCCCAGAATTTTTCCAGTGCAAATCGGGCGAT
+TAAAACCTGACCATCAACTTCCATCAGTCTTTTGTACTCTTCACGATCATAGCCACCTGG
+CTGGGCGCTGTCCGCAGAGTTACTCAGGATCTCACTACAGACATCGTCGTATTCAAAGCG
+GCTGGTCGCGAAATGTTTACCGGAAATATCCAGATATTGACCGGAAACCAGGTCGAAAAC
+CTCAAGGAAGTAAACCAGTCGCTTCTTGAGTGCATCCGCATCCAGGCCAGCCAGTTGGGT
+ATCATTAAGAGTATCCACATAATGCCCCGCAGATTCTCTTAACTCACTGGCTGATATACT
+GCATGTAAACGAAACTTCGTCGCTCTGGCAATGAGAGACACTGATAAACATCTCTGTTTC
+ATCAAAATCAATACCAATGCCTGCCAGTACTGCACGAACGTAGTTCTGGTTATCAGTAGA
+ATTAGTCATCTTCACTTCCTCAGGATTATTAAAGGAAGTGCCCCACAGGGGAGCGACTTC
+CCCAGTGGGTGGATTAAAAATATGTACTACTGCGCCATTCTTTCCTGCAAGTTGATCAGA
+ATAGGTAGCGCGGTCATTTGGTAGAACAAAGTTACTTTTTGGAATGAAGAGGTAAAAAAC
+AAGGGTTAAACAACATCCCGTAACTCTTCGACCGCTTCTTGGACCAACGCAACTCTGTCA
+CAAACCTGCACTCGGCCGGTAGGTCCCACGGAACAGAAAGTACCGTGCGATGATTCAGAC
+AAAACACTCCCGTCACAGCCAGTGAATCGAACGGTCATCATTACAGGAACATCCTTTCCG
+GAACTAACGCCAGTATAAAGACGAATGATTTTTTCATCATCGCGATACACTCCCGTCGTC
+CCTTCAGACTCCTTGAAACCGATGTAAAGGTCTGGCATACAGGCCGGGTATTCATCTGTA
+TTCAAATCAAGATGCAAAGTCAGGTCATCTTTTACACGACGCTGATATTGATATTGACCT
+AAACGGTTAAATGAGTTCTTTACAGATTTAATTATCTGGAGAGAAGTATTCAAACACTTG
+GAGATACTTTTCTCGAACTCTAAGATGAAATCACCAAAATCAGAATGGAAAAATTGCTTA
+AGTGCAAAACGGGCAATGAGAACTTTACCCTCAACACTCATGCGATTTTGATAGATTTCC
+TTTCTTAAAACAGGATCTATTGAATCATGTTCAGACTCCGGTACAGACCCCGCCAATATT
+AATGATGCGATATCGACAATATCTATAGTACTGTGCGCGTTATGATAACCGCGAATTCTT
+ATGTTCTGAAAACCAGACTTTTCATATACTTTAAGAAAGTATTTGATTTTAGTCCGAAGG
+ACTTCAGTTTCAGAATACGGCGCATTATGCTTAATCAATTCTGATATATATAAATCCAGA
+TAAAATAACAAATCATCAAGCGCCACATTTGCTTTAAAAGAAAGTTGTTCAAAATGATTT
+TCTTTGTCATATATTGTAATATCCTCTTGGCTTATATTCAGGCCAAGTTGACATTTAAGC
+ATTGCACTAACAAAGTTTTTATCATCACTTTCATTAAACATATTCACTTCCTCTTTAATG
+AAGAAAGGAAGCAACCCCCACGGGGAATACGCTTCCCCAATGGGTAAAATTAATTACATA
+GAAAGCAGGTCATCTGAATGCTCTGGAGCATACGAATTAACTTGCTTAAGCGAGTTATTT
+ATAGCCTTTCGATAAAGCGATGAAGAGTGTGACTGAACCATTTTATACTCAGTTACGAGA
+AGAGGTGATGTAAAGCAACCTAAGTTCGCATTGAGGGATAAAGATCCACCGTCGCAAGCT
+TCTATAACAGCGTAAATACGCCGCTTCATCACCCTACCCGACAGATAACGATTAACATGG
+TTCAGGAACTTATCCGCTCCTGAAACACTACACACATTCCAGTCAGCAGAAATTATCTGG
+TCTGCGACTGAAACGGGTACAGGTTCGACTACTATCTGGGCATTGATTTGATGGTCAACA
+CTGAAAAAGCTGGTGACTACTTGTGGAACTGAACTCTCCGCAATCTTTTCTGTAACTGCG
+AAAATCAGCGGCAAAGCCGTTGATAAGCGCGAGCGTAAAAGTTCATGCAGATGGTTGATA
+AAATTATGTCCTTTTTCAACCATACCAAGTATTAGATCCTTGTCTGCATTGCTGGAGCGG
+TAATATACATACTCCAGTTTTTCACGGTTCACACCCTCATTTAGACAGTCCGGCTCAACA
+TCCACAAGCCGCAGGTGAGCAGTTGACACTGAAACCTCAAACCGAAAGGTTTCAAGAGTG
+ACCGGCCCAGCCTTCAACAACGCAGCTCCTGAGCAATATTGTGCTATAGGGTGGTAATCC
+ACGTCATGTCCCCATAAAGGCTCACAATCGCGCAGATATCGCCTTAAATGCGGCATTAAA
+GTCCGGACAGGAATATCAGCCTTAACAACTAGACTCTGAATCACACCCGTTTCCAGATTG
+ACACTTTGGATCACGGCACCTTCAAAGCCCATTTTCACCAGCATCGCTTCAATTATTTTA
+TAAATCGCTTTCATTTTGTAGCCCTCGGTTAAGAGGGAATCCTCCCCAAGGGAAGAATTC
+CCTCAGGGATTAGATAAGTTGATAATAAGTATTAATACCCGTTACGAATCGCGTGTTGTC
+TTTCACTCAGGTATGCTTCGTATTCATATTTTCCGGATGCGAAACACTCTTTAAAAAAGA
+CACTGCAAAACGCCTTAAGATCATCTCTGGCATGCATTTCTCTATCTGACATAACTTTCG
+CATAGTCAGATGTGTCAACATCTGCTAAACGCCATCCGTATTTCATGTAAACACGATTAC
+TGAGGGCAAAGCCTTTAAGATAGCGACTTGCATTTTTCATAATCTGACGACTACCTGACA
+AGTTAGACAACAACCTATCAGGTGCAATCATCGTTTCAAGGATATCAACTGGCAGACCCT
+TAGAAAATATTTGTACATTATAACTGCCGAAGCAATCATGATACTTAAAGTCTTTTATAA
+GACGGTCTGGTTGATCAGATGTAATCTTGTTTAAAACATCAAGTGCCAAACGTATACCTT
+CCTTCACTATTTCATGTAATTCGAAATTCACAAATGAAAAGAAGGAACTCAGGCCATCCT
+TGAACGTGAGATAGTCTTCACAAAAACGTCCTTGTCGGGTCAGATGTAGCAATCGTTCCT
+TATTATATTCACATTCAGTCACGTCGTAACTATCACCGCGTGTCAGAGTGAATCCTTCCC
+TTGAGGAAACTGGAAATCTAATATGGTCAATTAAAAAAGACCGATTCCGTTTATTTTTAA
+CTACATCTAACTGACATTTAACACAATCCGCGATGTCCTGGTCTTCAAACCCAGGAAACG
+GGATATCTAAAAATGTTGAACTGTATGCGGGGGCATACGAATAAAGAAAATCAAATGAAA
+CATCGGCGTCACAGCATATTCCAGTAAATTTACCGTCGGTGCCACTCAAGCAGATAACAT
+TACTGACCTTCACTGAATGTTTACGCGATATCAGAAATGCATTAATGATTTTCTCAATAA
+TTTTCATGTAATCCTCACTTAAATAAAAAATGGGATTACACCCATCAGGGATGTAATCCC
+CGGATGGGTAATGTTAATCAGAAATCGTAAAGACCTAAATCTTTATTTCGCCCCGAAATC
+GTGGAAGATATAAGGCGATTGACACGTTTCTGTATATTATGCTCAGATGTCTCTTTTATA
+AAAAGTGGTAATGACTTACCAAGAGACCGTCCATTTTTTGAATATTGACAGACTATATAG
+CCATGTCTCCAACCAGTACTGATATAAGACTGAATGCATTTGATAAACCCAGAAGCCGCC
+GCTTCTGTTCGTAAAGAGGCATATGATTTCAGATACCTTTCTATTGAACATAGTGCAACA
+GCTTTAAGAGTCACCTCCAGCATTTCATTCCCGTGCTTAACTCTCTTAATCAACTGATCT
+TCATTCCGTTGCAGGTATACATTTCGCAGTCCTGCAATCAAAATTAAAACCTGTCTGAGT
+AATGCACAGAGCCTATTACGAACATATTTCATGAAATCTTCAAAATACAAAAGCCAGAAA
+CAAGCCGCCTGACTTATTAAGATTTCATGCGAGCAAGACAGCATCTTAGCCAGCTCGATA
+TCTTCAGTTCGAAAAGAAAAGTTACTTTTCTCAAACCGCTGTTGCTTTGAATTACACGTA
+TAGAGCTCTATCCATACAGAGATAAACTCAAGTGACTCCATGTCTTCACAGAGCAATTCA
+GCACTGTTGATACACTGCTGAAGTTCAAGGCCGATATCATACGAAACCGGACAATCTTTC
+AGAGACTCAACGTAGTCAGGGACGAACTGAGATAAATGCGTTGTTTTCAGATACAGGCTG
+AGATGCACTTGTGTCAATGGCTTTACCAGCGACGTTACAGGCAACTCATTAATGGAAGTT
+GGTACAATGCCATTCTTTATCAGAACCGCATTGACCAGATCTGTAGCTAATTTCATAAGA
+CCTCCAGATTCAACTCTGAGGGCCACCCCGATGGGAGGTGCCATCAGGGATGTAGTAAAA
+ATATGTGTTATCTTTATGCGCAAAGTGCCATGACATTGTCGATATAACTGACAAGTGATG
+GTCGCTCATCCTTTACTGCAAAGTGACGAAGGCCATCAAGGTTGTATGCTGGAAGGAAAT
+CGGCATACCCTCGCGCACGAAGATCATCAATAACAAGTTTTAAATAATCAAATTTACCAA
+GTGAACCTCTTAATGGAGGTCTTCCCGGCTTGGACAAAATTTCAAAAGCTTGCTGCCAGG
+TGATTTCTTCCGCTTCTCGTGTTGCAAGATTAAAATGCACATACTTAAATGCTTTATAAT
+CTCCACGACTTGTAAGATAGTAATTCGGAAAGAAGTATTTATCACAACGCAACAAACAGG
+TTCCTGAAGGACGAATAACGTACAACAGGTTTTTGTCTTTATCTATTATGCTGTGTTTTA
+AAATCGTGAAGTCAATTTCATTATCATGAAGGTAATAACACGAAGATGGTTGCTCAACGA
+TATGAGATGAAATCACAGCAGCGAACGTATTAAATAAATCTTGATTTTCAATATTCATAA
+CAATGCTCTCCGATATTTAACGATGAGCATCACCCTAACGGTAATACTCCCGTCAGGGGT
+TTTAAGTTTTATGGATATACCATGTCATACAACCGACCGTAGCCAGATGTATCGCACATT
+TATTAAACTGAGCAAGCATCTCAGCCGTAAAAAAAACCTGAATAACAGGTGATTTTCACG
+AAGGAAATCGGATTATCTGTTTAGGATTTAACGTAAATAAACACTAAAGAGATAACCCCC
+CCCGGCCTGAAAAGGCGGGGGAGTTATCGGATTTAAAGCTGAGCAAGACATTCAGGAGCC
+CATTTTACGGGGAATCCATCCGGTCCTGTTAATTTTAGTACATCGTTCCAGTCGACTCCT
+TTCTTCCCTACAGGAATATCGAAATCAGGTTCAAAGACTTTAATTGTCAGCTCTGAAGTG
+GGATATCGCTTTGCAAAAAACTCTTTCATACGTTCCTGAAGTCGTTTAGCTGACTCCATT
+CCCGGGGAAGTGCCTTTTGTATTCACAAGATCCTTATCCGCCCAGATGTAAAACTGTATT
+ACTTTCACACCAGGGGGAGGCAGGAGACTATCCGGCACTTCAACGTTTTCAAGGCACCAG
+GCAGAGCTCGCGGCCCAGCACGGTGTTGAAGTCGCTTCAGTAACTGACAGCGCGTTTTCT
+ATGCCTTCAGCCACACCTAACGTCCAGGTACGGGTACCTGGATTGAAGTGTGGATCGTAC
+AGCTGAATTGAGCCGCCAGTCATATCGGCAGGCGGTTTCATCATCAGTTTCGGATTCTCA
+ACATGTGCCTTATCACCATTTAACTCGACGAACGTTCTGTGGATTGTCAGAGGACGCCCA
+CGGGTATCGCGATAAATTGCGATCATTCCCGGGTAAATCGTGGGTTTTTCCAGTGACTTA
+TCCATGTAGTAAAGTCGTTTGTTCAGACCTAAATCCTTGGGAAGGTTGCTCAGAACTCGA
+TTAAGACCTCGATTTCGGAGATACACCCACACAGGGCTCTCAGGTTTGATTTCACCGGTA
+TAGTGATATATCACTTCAAGTTTACGCCCTCGTTTTTCAACTTCATCGCTGTCAAGCGTT
+TCGGTTGCACGAACTGTTGATTTATAACGACGTTCACTTTCGAGATCCGCATCAGTTAAT
+GGAGCGTACAAATCCATCCCAAAGAAATCAGTCAGGATCTTCTTACAAGTCTGGGTCTTG
+CTCAGCTTGTAGTACTCTGCCAATACATCAATACCGTCACAAAATGCATTCACTGGAAAA
+TCATTGTGAATGGCACAACCGGTAAAGAGGTCCTTTTTACGGAACCGGAACTTTGATTTC
+CCGACCCCACTAAATGGGCAAGGAACCTGGCCAGGTGCTTTATCACAAGCGTCTTTAAAT
+GCCGGTATTCTATCGAATACATAGCGCCAGCCTGATACTTCCGCTATACGAGCGTGAACC
+ATTTTTATAAAGTGGTCAGTGACTTCATGTGGTGTACGCTTAACAGCCTGGGATGCATAA
+GTCATTTGTTCTCTCTTATCTGGCATTGTGGGTTTCTCAATGCCCTCTGCGATGCAGAAA
+ACAGGGAGAAACCCACAACGCAGAATCTAAGAATGAGGGCCCACAAGAGCCCTCAACAAT
+TACGCTTCAGTCTTGAAGCCGATATTTTCAAGACGCTGGATAAAACCATCAACCATTGAC
+GTTGCCATTTCTCCATTACCCTCTGGTATAGATACATCCCGGAGAATTCTTTCTTCTGGC
+AATTCACTTTTGACAATTTCACCCATGCGACCAAAAATACGGACACGATGCATCGTCCCG
+ACTTTTTCATACTCGACACGGTAAGTCTTTATCTGAGTCATATATTGCTCCTTAATCCTT
+CAGGGAGCAAAGCGACCCAACCGGGCGTCGTTTTGCCCCGATTGGGTAGAGTTTAATTAG
+ATAGAATTTGATGTACTAATTTACTGACCTCATTCGGCAATAAAGAAATATCATCAACAT
+TTACGAAGGTGCCCTCATTAAAACCCATCAACACATCAGTTTTAATACCAACACCAGCGA
+TTTCAATGCCGTTACTTTCAGCAACTGAAAAAACATCATTAATGGTGTAAGCCGACTCAG
+TCGGATAACCATCAGTAATAAGGAAAACAATTTTCCTGTCAAACTGGCTTTCAAGTAACA
+ACTCTAAAGCAGCATTTAATGCAGAACCCGTTGGGGTATTATTGCCCTTGCAGCCAAGTG
+AGAATTTTGAAAGTTTCTCTTCCGCGTTTTCATCAAACGTTTTGATAACTTCAAAATCTT
+TGTCTACAAACGGATAAATCACATTAGCAACATGCATTTTTGAAATAGCTTCAATTGCCA
+GAGTTAATGCAAGGTCAGTCTTAATTGCATGGATATAACGGTGTTCCAGACTCATTGAAC
+CTGAAATATCACGAACAATGACCAAGCCGACGTGGCCCCGGTTTTTAGATTCGCTTTGTG
+ACCGAAATACATCCCTAACACCCATCGGAGACTGGATCAGTCGATTAATATCGAATGACA
+AGCCTCTATCACGGGTTTTAAATTGACCACGCATTTTTACCTGCTGTAAAACAGATAAAT
+CTGCCCCAAGGGTCTGGCTGATATTTAATGCTTCATTGTAGACATTCAGATCAATGTTCA
+AATCTGGAACATCCCACTCACTTGCACCAAATTCAGCTTTAACCTCATCCGACACACTGG
+CAGCAATTACGGAGATCTCTTTTGCAAGAACCTCATGAAAATCCTCGCTTTCCTCATCAC
+TGTTTAAAAAATCATCCAGCAATTTGGCAAGCATATCCCACTGTTCAGGAGAAAAGTTAC
+TTTCCCCATCAGAAGAATTTCCATTTGAACTGTCGTTTAGGGAAGGTGTCGAGTCAGCAT
+CATCCGAGCCGGGGGTCGCCGATTCATCACCTTCAGACTCACCATCAGGTTCGCCGTTAG
+AGTTCTCAGCATTTTGTTCATCCCCTCCGGATTGGTCCGGTAACCCATTACCTTCCGCAG
+GCGCCTTACCATCACCAGAATCATCGCCTTGACCTTCTTTATCACCATCCCCTTCACCCT
+GGCTATCACCATTGGGTTCGGTATCAGGTTCATTCTCAGAGCCAGATGATTCATCTGTAT
+CGTCATGCGGGTCTTTCGACTGCTCCTCTTCTTGCTGTTTCTCTTTTGCTTCATCCCTTA
+AACGCTCTAAAAGAGCCAGAGTTTTACGCGCCAGAGAATCGCAATTTTGCGTACTTTTGC
+AACTTAGAGCTTGATGAATGATCTCATCGACTTCTGAAGTTACAGGTGCAAGGATTTTCT
+TTGCATAATCGAAAAATGGGTCAAGCGTTTCTTTATGCCCTTCTTGTTGGAGAACGTTAA
+CCCGCAATGTATTAAGCAGGTACATTTCAATAAACTGAACCGGGTTTTGAGGGGTTGAAG
+AAATATCAACCGTCATACGCCCAGCTTCAACCATCAAGGCATAAGTCACCGCGAGGCGTT
+TTTTTGCCTCCTGATAATCAATACCCGTCTTCTCTTCCATCTGGACATCATCAAAAAGAT
+TAATAAGTCCTTTTAGTCGACAAGCACGAGCATATGCTTTTTGCTTTTGTTTTAGGTTTT
+GAAAATCAGCCTTCAAGTCATCATCAATACTGATGAAGCCATCTGCATTGATCAATTCTC
+CAACAAAAGCTTCACGGTATACTTCATGCTCTGTATAACGACCGTGTCCTGCTTCATGAC
+ATATGAATCCTTCAATTAGCTTGACAAATCTCTCATCGCTATAATCACCGTTAGGTAAAA
+CACAGACATTGTTTTGGGTGTTGAAATAAGGTGTACTCACCTTATTGTCAATAATTACAT
+AAATCCCATTTATACCGCTTATCACGCTGGCTATATTCGTCAGGCGTTGAATATGGCGTG
+GTGAAGATTTTAAATCAAATTTCATTTGAGTACCTTTATTTGATAAAGGGTACTCACCCA
+GATGGTGAAGTACCCATCTGGGGATATTTTTACAAGACTAAATTACCAACCGGTCAATTC
+GAGTTCGCAGTCAAATGCTCTATTACTACCACTGGCCTGAATAGAAACATCTTCATCAGG
+GCCAACAGCAGGCTCAGGTGCATTCACTGCCTTGTTCTCAAGATCTTCAACCGGGTCTTC
+TCTGAAAACATTTGCTGAAGAAAAAACATCATCCTCAGCAGTATTCAGAGAGTTAGCCGC
+TGTAACCTGTGAATCGATATTGAATGACCGGGTTATGGAATCCAGCCAGTCGGTTACCTT
+TTGTTCACCGGAGATAATACGTTTCAGCATTGACGCATCGCTCATGAAATAGAACCACTG
+CTTTAATACCGCAACATCACGGGGAGAAGAAATGGCACCTTTTGGTAAATTATTCATGAT
+ATGCTTAATAGCTTCTGCAAGAACAACAGCCTCTTTATGAATGAACATGAAGCTAATTAT
+TTTATCCTGCATCTGCTTTAATCGGTCAATCGTGCTGGAACGCAAATTATCATTTTTGCT
+GATTTTTGTATAAACCTTCATAGCTTCATCGGCCAAGTCAGTTATCAGTTGTTCTTGATA
+AAAGTCCTGCGTTTCATCCCCCTCCACACTAATCGGTGAAAACGGAATGAAATGTGCCAG
+ATTAAACCGGAATGATTTAACAAAATCATCTTTAGTCAATTTCAACTGGTCAATTAAATC
+TGACATCAACGGACTGCGATCTTTCTCAGCCTGAATATGAGTGTCATAGTTATCAACCAC
+GTTCTGGATACCGGCTTGAAATTCACGTTCGATTTCTTGTGCCTCTTCGAGAAACTCCTC
+CATCCTTTCAACTGGCAGTATCCACATATTGCTATAGCGGATGCACAACCGTGAACAAAG
+GGTTGAAATTCGACTAGTGATAGTGCTTTTGAAACTCAGTGCCTTTATGTCTATCCAGCG
+AACTTCGCTTTTAGACACGCTCTTCTGGTCTGTTATATCATCACCGCCATAGGACAGTTC
+GATTTTATCAGTTCGCCGAGAGCCCTGACACCCACTAATTTCAATTTTTGTTATAACAGC
+ACCTTCCTGCAAGTCAGGATATGCTTTTATAAAGTTTTCACTGATTTCCTTTGCAGAAAC
+TTTATTAAGTTTAGAAGTATTGAAAGTCATAGGTTTTCTCCAGATTTAGAAATGGGAAAA
+CCTCCCCGTCGGGAAAGATTTCCCGATAGGGTTAATAATATTACTTTTCAAGTGTTGTTA
+AAAGAATTCCAGGAAATTCATTTTCGACATCCGCCGATTGAATGCTCCCTTGATACATGA
+ATCCTTTTGATTCAAGGCCCTTAATCATGGCTTCCATATCTTTGTTACAGACTTCATAAC
+AAATAAATGAATAGTCATTATTATGCTGCTTCAGACCTATATATTGATTTCCATCTTGTG
+CAATCACGAAAGTTTCAGTTCCGTTTGCACTCAGAAAACCGTAAAACGTAAGATGAGCAA
+AGTCTGTCACACGGCATTCAGCCTTCTGATAACTCGTCCCATCTATAACTACTTTTTTGC
+AGTGTAATACTCCATTGTACGGTTCTTGTCGTCACCGAGAATTAAGTCGATGGCTTCCAA
+CACCATACCAGTGGCATGTGCAGGCAGAGCCGACGCAAAAGCAATTTTAAATGTATCCAG
+TAAGGACATGGTCTTTAACGTCATTGACGTTCCAACCCATGCCACAAGCTGGCGTATATC
+CATTACACTGTCGTCAGTTCCTGTGTTGTTTACTGCAACGGCTACCGAAACGAATTTTTC
+AATTACCAGCATAGGCAGGTTATTGTAGCGTTTAAGCAAAACGTTGGTTAATGCAACCTC
+TGAAGGCCTTTCCATCTCCACAATCAGGAAGCGCTTGATAAACGCTGCATCCTGCCGCTG
+CGATGAAACGAACTTACGAGATCCCCCACTCATGTTTGTGTTTGAAGTACCCATAAACCG
+CGTAAACTTATTTGCCTTAACCACTTCGCCACCGTTGGCAGCTAGTGACCAGGGCTTTCG
+CTCTATAGGCATATGAAGCTTTGCGGCAGTATCAGGGTCAATCTTGTCCACTTCATCCAG
+AAGAATGAGGTGGCCTTCCTGAAATGCCGTTACAAGCTCGCTAGGCACAAAACTGGTGTT
+ACCGTTAATAAGACTACGCTCACCTTCCAGCTCATCAGCGCGAATATTGCTGTTGATTTG
+CTTTATGGTTAGCGGCCAGTTCAGCATATGGCTAATATACATTGCCATTTCAGTCTTACC
+TGATCCAGATTCTCCTTTCAGGCATACACTCAAATCTATATCGTTACTTACAAGCAATTT
+TACTACTTGCTCAAGTATTCGAGAATTTGGTATATAGTCCTTATTCAGATTCGCACGATA
+TGGAGAAAACTTTTTAAACACTGGAACAATCATATCCTCATCCATCTCAGGAATGCCAAA
+TAAATCTTTTGCTTTGACAAGATAATACTGTTCTTTATTCGCAAACATCTTACTTGATAT
+AACATTTGCGGGTAACAGATTACCAATGATTTCTTCCTGTACGGAATTGTCGGATTTTAA
+TACAGTTGCGGCGTTAGTCATTTTTAAAACTCCGGTAAAATGCAAACACCGCCCGCTGGC
+AGATGTTTGCCAGTGGCATGTTAGTGGAAAGTCATCCTACACGCGGTCGCCATCTGTGTT
+CTGATAGCGGCAACGTTGTAACCAAGATGAGTTCCTACGATTTCGAATACTTCTGACTCA
+ATCCATTCAAACTGGCGTTCAAATGTAGGGTTTACGATTACCCAACCAAAAGTATCTCTT
+AAGGTTAACTTGTTATTAACGACAAGTTTTTCAAACAAATTAATTGTTGATTTAAATACT
+TTAGAATAGACATCCATTATATCCCGATCAGTCCATTTCATTGCCAGTTTGTTTTCTTGC
+AACAAATAGTCCTGTTCGAAAAAGATATCCCATCCCATCTCTTCCTTACAATCATGCAGA
+ATAACCTCTTTATCTTGATGATAACGAGCTAATTCAGCATTTTCACCTCCGTAACTGTGC
+GTATATTCATATAAGCTTTTTTTAAGCTCTGACCTGAACTCAATAGCATCAATACCATGA
+GTGGCACATGTAAGCTCAAATGATTTCGACATATACCACCGTGTTTCGGCTTCAAGAAGC
+GGATTCACGGTTATGTTACCGAATTCATCAGTGGAATAGAGTGATTTTGTAATGACGAGA
+TGCCTTACGTTTTCCAACGACTCTTCCATTGCGACGACGTATAACTGATATACATCTTCA
+GGGGCCCAGTCAAAAACCAGACCACCTAACTCCGCACTGTACTCTTCTAGAGTGAAGAGA
+TAATCAGTTTCCGCAGCAAAACTAATGTCATGCAGAATTTGATTTTTGAGTAGTTTGGGA
+CAATTACCAGGCAAAGCAACATCTTCCGACACACTAGGCTCCAGTTCCGGGCCTGAATGT
+TTATCTTCTGATTGAATACTTTGTTGTGCGGCTATTGCATCATTTATATAGTCAAGTGGA
+GACTCAACTATAGTTATTATTTCTTTTTCCTCTTCTTCAAAATCGAATATAGAGAAAAAA
+TCCATTTGCTTACTGCAAAATGCAGTCGGCCTTATTTTTTGTTTCATGGGATCTCCTAAG
+GGAGAACTCCCATGAAGGGATTTCTCCCCTTTTGGGTGGTTTAAATGTCAGATCTGTCTA
+AAGCTACTTTGCCCAAAACCCTTAGGAGGTTTAGGTATGTGAGCTAACTTACTTGTTGCA
+ACTACTCTCATGTAGTCAAGAGGATGCTCTCTCCCTTCCAATGTGATGGTATCCACAACA
+AGATAACCGGAGACCATTAACTCATCACCTTGATTTATACCAGTGAAACAGCCTGAATAC
+ATCTCTGGTGATACTTTGATTTGAATCGAAAATTCTCTCTCAGTAATTTCACCATTAATT
+TCAGTTTTCATTCTGTTTTTGAGCTTTATCAATAACCCAACGTTTCCGCTAGTCATTTCT
+TTCTCCATTGCACTGATAACTATCCCGGACACTTTTACTTCATTAACATATTCAAGATAT
+GACATTACTTCTCTCCTCAATTTAAGCAAAGAGAAGCCCCGTCAGGGTTTCCCCTTAACA
+GGATTAGATAAATTTGTTTACAATGAACATAAATGTCATCATGGCAATAACAGAAAAGCC
+AAACAGCTGACCAAAAGATCTTGGTGCTTTTACCGTTTTAGCGTTATTGATTTGTGCCAA
+GAGTTCATCAACTGTCGCTTGCCGTTTATCTGCTTTCATTTGATAATCTAAACATTGCTC
+CTCGCGTTTAGTGAGAAACTCAATTTTCGACTTGATAGCATAATCCCAGCCTTTGGAATC
+GAAAACGCTCAATTCACTAAAGGTGTGTAACATGAGTTCATCAGGAAAACCTAACTCTTT
+CATTAATGGGCGAACGGCTGCATACATTGCATCTACAGTTTCATAATGTGCTTTGGTCAC
+TTCATTAAATCGATTACGCAATGCTAATTTCTCGCGCTTCTCAATAATTTCAGAAACCCA
+GGCAACCAACTGATCATTTTTTAACTCTCTGGATTTAGCGAGTGAATAATCAAGGTTATC
+CACATCAAGAAATGTGTTCAACCCGTACTTTTCAAACTCTTCATTTAAGAACTTATCCAG
+ATCGGCTAAAGTTTTAAACATTGGAATTGCAGGTGCTTCTTTGAGAAGTGTGTAAGCTTT
+CTCAAAGTCAATTGGATTGACAAGAATTTGCTGCATTTCCACATGATAATAAGTAGAAAA
+AGCAGAAAGCTTTTGAGCCAGCATTGAAACTGATTTCAAAGAATTCAGTTCAATTATGGT
+TGGACCATCTTCATTCATAATAACAATAAGGTCATTATCATGCCCTGAATAAACATTCAG
+AGAATCCAATAACTTCTTGTTAACCACCTTATCCATATCTGGGATCAGATCAGCGAAGGC
+GATGAGAAGAGCTTTACTGCGTGCTTTACTTTTAGACATTTGGGGTCACCTATATATAGT
+AAGAAGGAAGGAATCATTAAATATCCCAACACAAAGGCAAAGCCTGTCATTCATCTCCCG
+TAAGCTATGAACCGCCTGATTTATACTTTCTGGCATTAGAAGTACGCAACGAAAATAGCT
+CAATTAAGAGCTAAGTTAGTTACGATTTGGTAAATTCGATTGTCCTTTTTCAGACATGGG
+AAAGGCACCAGCGACAAAGGTGACATTTTGCCGGTGGTGCCTTGCAGCTTTAGAAAGCTG
+GCCGCTTTTCACGGCTGAATATGCGCTTAACGCGCAAAGTAACTTTTATAAAGTTACTTG
+AAATGTGGGAGCAATAAATTCAAGCTCATATACGTTATACTACACGGGTTCATTCCTGTA
+AATAAAGAAATCAAAATTATTCTGTCAAAGGGGATTCTGTTCTACTTTTCGCAGCCTCTT
+TCAATTTATCTTCAGCACATTCGCTTAAAAAGAAAGACGGATCACCGTACCACATTACAT
+GCAGCTGTTGCTCTGCTCGTGTAAACCCAACAAAAAGCAGTCGTCTTTCTTCTTCAATCG
+CCTCCTGCCCCACTGACCGCTTACTTGGAATCTGATCTGCATTACAACTCATAATAATTA
+CATTTTTCCATTCAAGACCCTTCGAACCGTGCAACGTCGATAAAACTACTTTATCCGGTG
+TATATTCCTCATCCTTCTTCTTTGGCCCCAGACACATCGCCGCAGCTCGATTTATCATAT
+TTTGCCAGCCTGTCTTTTCGGCCCATTGCTTACAGGTATCCAGCGCAATTCTGCTCAGTG
+ATGGTGATCCTTTCTGCGTCCTCATTTTTATCGACGACAACTCCATCCACTTAATCAGAT
+TTGCGAACCTTTTTTCTATTTCAACCTTTTCCCGAGTCTCCTGTGTAAACCGGGTGAAGT
+TTGAATGAAGCGTTCTTGTTTCCAGGGAACTTTCATTCGGGATGTTCAGTTCACCAAAAG
+TTACTTTTCTTCCTTTCATGCTCAATGCTGTCTGGTCCAAGACCTCTTCATTTTCACCGA
+AAAGCGCCAGCACCCTCTTCATTAACCGGACATCGTTGGAATGTCGGAAGAATGCCATCA
+AATGCAATACATCGCTTGTCTCCTTTTCATCCCAAAATGACTTCCCACCATAACGAAGTA
+CCGGCTGCTCTATCAGGCTTTCAAGCTGATCGAGATGTGCATTACCTCTGCTGAGGATTG
+CCCACCCAATCGGGTCTTGGTTAATCAGATTGAGAATGCCTTGAATTTGCTCATCCATAT
+CAACATATGAGCGGAAATGAACTTTTCCCCCACCGCCCTTAGCTGAACGGAGATCTTTAG
+CGTATCTGTAAACATTTTTTTCAATCAATGCCCCTGCTACCTTCAAAATCTCTGGTTCAC
+ATCTGAAACAAGTATTCAAATAAAATATGTTGGGCCTGAATTGTTTTTCAAACTGCTGGA
+ATATTTTGACTCCACCTGATGCCCTGAATGAATAAATTGCCTGATCATCATCCCCAACGA
+TGCTAGTGTTAACACCTGCCCTCGTATGTAGTGAGATCCAGGCATACTGAATCGAGTCGG
+TATCCTGAACTTCATCTACAACTAAATGTGTCAAGTTAAGTGGCTGCATTTTCCCCGAGT
+ACATCTGGCCCACAACAAAACGTGAGAGTGCATTCAAATCTGCAACGTGGTCTTTCTGAC
+ATATTGCCTGATAGGTGTTGAACAAGTGGATTTGTTGCCGCGTATGGCGAACTGAAATGA
+TGTCCGTATCCATTTCCCTTCCAATCGCGTCAATAGCAAATTCTGCATCCGGGTATCGAA
+AAGGCGCGCCGGACTCCTTCAATGCCCTGTGAATTACAGAACGCTGTGCCGAGCTAATCA
+ACATCTTGCCCTTCCAGTTGACCATATCCAGTTGCATCCGGATAAAGCCGTGGAATGTAT
+TGACCAGCACCCTATCCTGGTCTTTCTTACTTAATCGACGTTTCAGTTTTTCAGCCAATG
+AATTTGTTGCTGCACGGGTAAATGTGACCATCCCCACTTTGGCATAAGGGAACTGCCTGA
+GGATAGAGATCACCGCCTCTATCATCGTGAATGACTTTCCAGATCCCGGTGCTGCAATAA
+CCATATTATTAGCATTTGCATTTTCAATGATGACCCTTTGCTCATCTGTTGGTTTACCCA
+TAAAAGCCTCTGAATATTTAGTCCCCTTTATTATACGATTTAAATTTGACGGATTTTTCT
+TTACAAGACTCATTTTTGGTCACTTCATATTTTTCCATTTTTTCTTCATTTAGGTTGTTT
+GAGAAACTGGCGAGTATGAAATAATGCTTCTAGACATAAAATTCATTCAAAAAGGGTCAT
+AAATGAAAAATAAACGGTTTGTATCCTTGGTTTCAGCTTTAGTTGCAAGTGCGTCTCTGG
+TAGGGTGTGCTGGGAACGCAGGTCAATCCCCTAACTCCGCCCAGCACAGCGACACTCATG
+GGCTCTACTGGCATGCTAACGCAAAAGATTCTGTAGCCAAAAATGCTTACTCTCTGGCCG
+GGTTTGACGTTTCTTTTAATGAGGAAACTGTTCAGCCAGGTGGTGATGCAGATAACTTCC
+TTTCCAAACTCTTGATTAGCGGCTCTATGGGATATGTGACAGGCGGTCTCAGCGGATTAA
+GCATTATGAGTTTGGGCTCTCTATACAGCTCCTCTGACGCCGAATACATTCAGGTTAACC
+AGTATGTTGTCTTTGTCCCGAACCCGAAGAAACTTCCTTATAACGATGAAAGCCTAGTTC
+GTGCCGGTGCTGCGTATGTTTACAATCACACCAAAGAGTCACAGGTAATGCTCGGATTCA
+ACCCATCGAAGCAAAGTGCAGCTCTGGCGTCCTGCAAGATTGATAGGGCGGTCATCAATA
+AATGGAGTACATGCGAGCTCACTTCAAAACCAGCTCCTGACGTAATGCCAACTAATTCCA
+TGTACAGCTTCCAGGCTATTCGCCCTGCGACTGGAACTGAAATCCCCCAACTTAATCTAC
+CTGCCGGTGAGTATTCAGTTATTCGTTACGTGTTCATTCCATTTAAAGGCAATGAGTCAA
+GCAATAATTTCTCAGGTATTATTTTCCGTTCTGATAGTCCAAAGTTCACCATGCCAGGCG
+GCGCAGCTGCTTCAATTAATGGGAAAGACTATTACCTCTTCTCTGGTGAGTATGGTCAGA
+AAGGATTCCCGGAAAAAACTCTGAAATCAAAATAACAAAAGGGGCTTTACAGCCCCTTTT
+TTTGGCTATTTGCAATCTGAGGTTGGATTGTAGATTTTAGTTAGAAATGGATCAAAGTCC
+GTTTTGTGCAAAACTTGGTTGACAACCCTCTTTTGGAAGATGTGCCGTTTCGTGCAAAAG
+TTGGTTGGAGGCCAAGATGGCAGAGTTCGTAGGTTCGGCTGCTTCGCAAGCTGATTTCAT
+TTGGAAGAACGCGGAAGACCTGTGGGGGGGATTTCAAGCATACCGACTTCGGCAAGATCA
+TTTTGCCGTTTACTCTGCTGCGTCGATTGGAGTGCGCACTGGAGTCTACACGGGAAGCAT
+CGCTCGATAGCCAACCAGCCACGATTGAGTTCTTAGAAGCAGAGTTCAGTGTTGATTTCG
+ATGCGCTGCTATCTTGACCGCCAATCAGACCCGCATGGTTCAGGTTTGTGTATGAGAGTC
+CCCAAATGGCTGTAGTTCTAACCAAAGCCTTGATTGAAGCCGGCCGCGCCGGAAATAGTG
+GGTACAGAAAAGGCAGTTGCTTGCGCTGGGCGTAAGTTACCCGCCGAAAAGCGGCTGGAT
+CGAACGACTGATCGGCACTGAGGTATCTGACGAGCAGTACGAACGCTTTCTGGGGCACAG
+CACGAGCAAGCAGGCTGAACAGATCCTACGCGGAGAGCAGCCAGCCAAGGGGCTTCAGTA
+TGCAAAGCGAGCGAAGAAGCTCGCTTCTGAAAGAAAAGCCACAATTGATCTGGATAACGA
+GCACCTGTCTGAAATCGAAAAGTATCGGTAGCCCTAGACTTTTAGCCGCTGAAGATCTCT
+TAGATACCATTGGTGAAACTTGCTGAAGTCAGCCTTCTGTTTCTCTACCGTGCTGTTATA
+GATCGCATCACTGGTAACAGCACAAGCAGTCCAGCCAGCCTCATAGACGAAGCGAGTAGC
+TATCGGTGACTTCTTCGGGGTGCTATCCCAGCGGTTTTTGAGCCACCGCGCAAGCCCTTC
+ATCAAGAGGGACCACCAGATTTAGCTGCTGTTTTGTGCGAGTGATACCGACATAAAACAG
+CCGACGTTCCTCCTCGATTTCCTCTTCGGCCGGAGGGGTGTTCATCGATGTGCGAACGCT
+GTAAACATCATCGGGTTTGCCGCCAGGAAATTCCTGCTCATTCAGCCCGATCAGTATTAC
+GTTATCCCACTCCAGCCCCTTGGAACCATGCAGTGTGGAAAGGATGAAGGGATCGCAGTC
+AGTAGCAGCCTCGCCTGGATTCAAGATAAGGTTTAAAAACGTGCGGGAATCGATCTTACT
+GGAGTCAAGTAGCTCCCCGATCCTCACGACCCCTCGTTGCTGGTCGTTCGATCCAGTGCG
+AGTTACACCCTCAGAGCCAACACTATCAATGAAACCCTCCATACTCAGGCGTCGTAACAC
+ATCGATAGCAGGCGTTTCCTCTCCGTCTTTCTGGCAGATAGTGGCGAGCCTGCCCAGCCG
+ATCTTTTTGGTATTGTGCGCCCTCGAATAACTGACCTAGAGCAGACCATAGGTCGGCGTG
+CGGAGCCATCAATCCACTGAGCGCCGCTTTGAATTGCCCTTTCTGCCAGCTAAAACCAGC
+CTCCTTCAGAAAGCCGTAAACAATCGCTTGTTTGTTGGGATGGTTTTCCAGTAGCCGCAG
+ATCGCCGTACACAGACAGCAAGACGCCAACTACCAGTATCCCGATTTCGGTGCGGGTGTG
+TAATGCGCTTGAACCATTGAGGTAGCGATAAGGTAGCCCACACAGGCGTAAAACAATTTC
+CGCCTCAGCAAGGTTCGCCTTAGTGCGGGACAATATGGCTTGTGTTCCACTGCTCACCGA
+GAGGTTTGATAGCACCTTGGATAGGCAGTTATCAAAGTGCAATCTGACCTCTGTTTTGGG
+GGTGCTAGGATGACTGACACAAAGCTTGGTCAGCTTTGTAGAGTTGCGCCGAATTACCGA
+GTTAGCCATCAAGGAAAGCTCATGGCCAAATCTGAACGTGCATGACAGTTGAAACACCTT
+CGTATTCGGGTAGTGCCTTTCAAACAGTCCGCCGATAAAGTCTGGTCGAGCACCACGCCA
+CTCATAAATACACTGGTTAACATCACCAACAGCCATAACCGACGTATCCGACTTAGATAG
+CAAGCGGGTCATGTCATGCTGTATCAGGTTAACGTCCTGATATTCATCAACAATGATGTG
+CTTGAAGTGGGCACCAAGGCTGCTGTCATTACGCAACAGTGCGACAGCCTCAATCAAACA
+GTCATCAAAGGTTCGCAGACTGTTTTCCTCCAGCAGCTCACAATAGCGGCCATAGGCGTG
+AATAAACCCCCGTTTGATGTTGCTGAACGTTGGATCATTGGCAGCATCAACAGGAGTTAC
+GGCCGCCGCCCGGCAGCGAGCAATAAACAGCTCGAAGTTTTCAATTTCATTGGGGTCAAT
+ATAATTCGCCTCATGGTCAAAGCCATAGCGGTAGGCTTGCTTTACCAGTTGCTCATAGCG
+GTAGTCGCTTGGAGTAATGAGGTCTTTCTTCTTGATTATCTGTTGGCGTTCTCCGTAACC
+AACAATCTTTAAGGCCAAGCTGTGGAACGTGCGGATTTCTGGAATCACGCTCGACATCAG
+TGCCGTCTTCAACTTCTCCGTGAAGCTCACCTGCGCCGACTTGTTGTACATCAGGATCAG
+AATGGAGCGAGGATCAGTTCCCGTCTTGACCAGCCGCTCAACGCGCTTTACAAGTGTGGT
+TGTTTTCCCGCTACCAGGTACGGCTTTTACCAACGCATGTCCGGTGTCATGGTTGACAAT
+ACTTTTCTGCTCCCAAGTCAGTCTTTTGGTCATGCCTTAACCTTGTAATTGGCGCACTGA
+CGGGCCTCGGTGTAGGGAACGATCTTTGCCTTACTGTGACATTGCAGATAGCCATCCTCC
+CATCGGCCTGCTTGCTCGCACATAATGCAGTTGGGAAATAGTGAATGAGGATCGGCGTGA
+CGGATAAAAGCTCGTAAGTTATCAGCCAGCTCAGCGGCCCCTAACGATCTAGGCCATGTG
+TTCACGTCAGAATTGATTGTTAAATCCACTTCAGCGAGCGGCATCGTTTGTTCGTAGAGT
+CGGCCGGAACCACTTAAACTCCAGACAGACATATACACGTTACCTACTGAGCAGACGCCG
+CTACAGGTGTCCACAGATTGAAACGGGGGAAGCCAGTTGAATACTCTCAGGATCTTCTCC
+TTGATCGAGTAGGCCCCGGTAAGCAACATCTGAATATCAGAGGCAGATTGGACCTTAAAC
+TCAAGAATCGGGATACCGGCTTCGATCTTGTCTTGAGAGCAGGGGTGTGTGACACAAATC
+TCTACGTAGCAACGCCTTTCGCCAGTCGTATCATACAACATCACGTCTGGTCGCAGCCCT
+GTGACCTTATCGTGTTTTTCCAGCTCTGCCTGATCGAAAAATTGAGTCAAGTTGTAGCGT
+GCAGGCACGGATTTTACGCACTGACGTGCTTCGTCTCTAACCAAGGCTAAATGAGAACCA
+TTACAGGCAACCCGGCGCTCCAGCTCAAGGCTAATAGGCATTTCACGGCTGAGAGCTTGT
+TGGTAGCGATAGAAGAATGCTTCTTTGCCGCACTTGTGAAGATAGGTTTCAAGGGCACAG
+CATTCTTCCGAATGGCGAAAGTGCTTAGCGTTGAACTCGCCCATTACCGGGGTCAGGGGG
+CTCTTACAACCTGGGCAGGTGTAAGTATGTGAGCGCAGGGCAGCGCCAATGTGCGTGAGG
+GTGCCCTCGCCGTCTAGCGCGTAAGCGTATTGTATTGAGCTGGATTGAGTTGTCATGACT
+GCGTATCCTCCCAAAAAAATCCAGCTAAGAACAGACCTTACGGCAGGCAAATGGTAAGTA
+GTGCTTCTTGAAGCAGTCGAGTGTACAGCGGCTCAGTGAAAAAGCTAATCGCCCGCTCAA
+CAACCTAGTGATACTGGTGCAGATTCGACAATGAGTTAATGCCCGGAGAGCATCTGCAAG
+ACTTCTAGCTGGAAGGCATTCCAACCAGCCCTCGCTTCTGAAAAGCCGTCAGGAAACGGT
+AAAATCCAACCAAGTGAGCAACTTCACTTGATCAAAGATCTAAGGCTAGAATGATGGAAT
+TCCAACCTTAGTTTGCAAATAGCCCTTTTTTTTAATATTTTGGTATTTCCTTACCTGTAA
+TTGGATCTACATAAGTTGACCCAACTTCACAAATCGCAGGGCGTGGAAGATAGCTACAGT
+CTACGTTCTCCTCTTTAATGGCCTGAGCGTTTTCCTGTCTGGCTTTTATCATATTCTCCT
+CTCCTCCCATTGCATCTTTTGTTCTTTCTGATGGAAGTTGATAATTCTCGTTTTTAAATG
+GCAAATTTGCTGTTATTGACGATTCTGAGAATGTAGCGTACTGGTCCGGTACTTCTCCGA
+CCTGAACAGCATCGTTAATCCATTCTGTTAAATCAATCTTGTCAAAATCTAACTTTTGGA
+TCTGCCCTATTGATAAGCCAACGCAGTTTGAAGTAACCGGGTCTATTCCAAGCTGCGGGT
+AGGCCTGCTGCATAATAACGCGAGATAACATTGAATTGTAACAGCACATGTCTGTTGCTT
+TTTTAACACATTTCTTTGTAAATCCCAGATTCAGATATTTAACACAACGGTTTGTATCCA
+GTGTAAAACAGGATTTCTGATTTTTGTGAATAGATGCTTCCATTTCTTTTTGATCGCAGG
+CCACCAGCATTTCAAGCAGCATTTTTGTGACTTGATATGCCGTATAAATCCAGCCGATTA
+CATTTAATGCAAGCATAAAGTTTTGAACAGCAGCAGAAAAGACTATTTCTCCACCCGTTG
+TCGCTACATTTTTAAATACGAAGTCTCGAACTGTATCGGGAAGCAGGTCATAGGCTTTTT
+CCATGGCCATCTGCTTAAGTTTACCAAGCCCGAATGAACTCATAGTCTCCTTAGCAAGCT
+GACCACTTTCACCAGCAGCGGATGATCCTACTGTTCGGCCAAGGTTACCGGCCACGTTTT
+CGTAAACGCTGGTTATTGAACTGGTCACATTGTTCCACATTTGTCCGACAGTTTTACCTG
+CCGATGCAGTCCATTCACCCACTGAGTTAGCCATTGATGCCCAGGTTCCGCTCTCCCCTC
+CAGTCCAGTTTACCAGTTGAGCATTCACTCGGGTCCAGTTCGTGTTTCGGATCATCGACC
+CGGCCAGCATTATCGCCTCCAGTGACCCAGCAGCACCCTGCGGCTTTTCGCAGCAATCTG
+TTTTGGCCAGTCCGTTCACAAAACCAACGGACCTGCCGCACCACTCTGCTTTCCCTTCAA
+AGACAGAGCAGGAGTTAGGGTCGTTTGGATCTTCGCATTTTGCTTCACCTTGCATGTACT
+GAACCATATTGGAGTACGCGGCCACTTTCCCAAAATCTTTGTTTTCTTCTTTTGGGCCTG
+TTTCACATGTTCCGCCAGAACATGGGATCATACCTACACAGGAGTTAGTCTGTGACTCTA
+CCTCTCTGACTACGTCTTTCCCTCTGTCACATGTATATTTCTGCTCATACATGTAGCAAG
+TATTTGTGCCTTCATCGAACCAACCTTCAGCACATGTCTGATTATCTAGCACACACGCAG
+CATCATTTTTATATGTGCTGCATGCGTCAGGCATATTTTTTATATCGTCGTAGTTGTAGC
+AAAGGTCTTTGCCTGTGGGGTCTTTCATGATGTTTCCCTTCGCATCATAAGAGCACAGTT
+TTTCCTTCGCCAGGGGATCACAGAAATAGCCTTCAAGGTTTGTTTTCCAGGTTAAGTATC
+CTGTATCACCTTTGTAAAGCGGTGTGGCCATCTTAAGCACACTTTCCGGGAGTCGCTTTG
+TACCAACATCCATGTTGACAAACCTGTCAAACCGACAGAATGAATTCGGCGTTTGTACTG
+CATCAAAACATCCTGCGGGCTCCTGTATATGTTTATCCTCCAACTTCATATTTTCAAAAG
+TCATCTCAACTTCAAAATAGCCTTCCCCACCACCGCCAACCCATACGCGCGAAGCCATAG
+TCACTTCACGATCCTGCTCCTGATATACAGAGGTTTTTACTTGTTCAGTAATATCGTAGA
+CTTTATCGAGCTTCCAGGATTTCTTTAACTCCCATTGACCTTGTGGAGATGGATAATTGC
+TACTTCTATATGCTCCATCTATATGAGCAAAAATCTGTGTACCATCAAGCGTGACCCTCA
+TATGGTCATCCCACTCTGCGTTAATTATTTTCGCAGTTGCGAGCTTTGCATCTGGATGGA
+ATTTTAAGGTTAATGAGTTGTCATAGACTCCATCGTTCCAATAGTTGTCGTCCCTTCTGC
+CAAACCAGACTCTCACACAATTATCTCCGCACATGGACATATCACCATTACCACCTGAGA
+TATAAACCGGCACGGAAAAATCACGAGTTATCGTGCAACTGTTAAAATTATCTTTCTTGG
+GTGAATTGCAGTAAAACTCTTTGTAATCTGGATAGTGCGTAGTAATTGTTTGTTTTGATG
+TTTCCGTATTACAATTCTGTAGCCAGTTTCCTGTACCAGCTACAGCATTTCCTATTTCGT
+TACGACCCGCATTGAACATAGGGTCGTTAGGTTTAATAGTAGATGCTGGGTTTTCTTTAT
+TTGCATTCACCAGAGTACGGTAGGCGACTCCATCATAACTTTGCGCTTCAAACAGCTGAC
+TTTTTCGATTTTTGATGTCATTGATGAAGCCATTTTCATCTCCATACCGGCCACCAGCAT
+TGAACTGAACATCACTGTGCTTCTGCTCTGAGCTGAATAGTTCCCCTGTACTGGTTTTGG
+TACCTGCCGTTGTATTCGGGTTGTTACTTATTCCAATATTACCGCTGCTGTCCCTAGAAA
+GTAACTTTGCCCCCTCTTTCGTATAATTCGAGTTAATTGTACCGCCCGACATGCTAGGTA
+ATTGTACAGCCTTACCGATCGATTTCCCGTCGGACACCGCATTACTCATAACACTTTCAT
+TTGAGTTCGGCGTCCCGTACTTCCCAACATTTAGGTTTGTTGACTCTGCTTTACCAACAT
+ATTTCTCGGAAATTTTGCCGCTCAGATTTTCCCCGGAATCAGCATTTTTATACTTTTCCA
+CAATATCCTGAGCACTGGTGGTTGCGTTCCGGTTGGCGTTGGGATTGGCAAGGTTAAAAT
+TGTTTTCAAGCTGGTCAAAAATCGCATCTGCCGCAAATATTTTAGGCGTTAACGCAATGT
+TTATGAGCGAAACGTAAAATGCCCAACTCATAGTATTAGCTATCATAGACGCAATAATTG
+CTGAAGAAATTATTTTTCTATGTTTCATATATAATACTCAATTTTTTCAATTAGTTGGGT
+ATATACCTGACGCAGCAATCATTATAGCGCCACAGCATGTAAACATAGTTATCTATGCCG
+ATTTTTTTCCGTCCACCTTTAAGCGTTGACCAGTCATGGACAGAATCGCCTAGGCGATGA
+CAGCAATCCGGACCATTCGCCTCCGGCGTTGGGTAAAGCATTGAAAGTCGGTATTGAGAT
+CGAGGAGTGAAGTATTCCCACGTTTTTTCACACATTGCGTCAGCTCCCATTGTTCTCATA
+AGCATTCCCTGCCTATGTAACTTCGTCAGTAGACGCTGAGTTATAAGTGAGCTGGTTCTG
+ACGGCATCATCATTCGCATAGATGTGTCCAGTTAACGGATAAAGGTTCCCATCACACCCG
+GCACAAAAATATGCAGCCAAATTATCCTTCCCGGCAGTCACGGCCACGCAGTCAGCTGCA
+CATACCATTGAGGCGATAGGGTTTGCAAATACCACAGCTTCGGGGTTTAGCACGAGCGTC
+AATAGGTCACTTTCCCACATCGGATCTACTTCGCTGATATACGTCAGACTGGCATCAACA
+TAAGGTTCTGCTGTACATTCACCAATAACCAGCAATTTCAACATCGTCATGATTGGGAAT
+TCCCAGAGATGTACGTCGTAGAATCCGGCTTCTGTTGCGGTCATAGGCTGGTTAGTATTG
+CTCTTGCCGATGTCGAACTGTGATTTTTGCAGCATGGTTCCCTCTAAAAATGGGCTGCAC
+CACGGACTTTTCACCACTTCAACAATTTTTACTGGTTGGAAAAAACTTAGCTGCCATCCG
+ATTTCTGGTATCCCATTTTGATCCGTGCAATAGCAACCAGGGCGTGAGGGGGCGGCACCT
+TCAGGGGCTGCTCCAATTCCCATGATCCGCATCGGGAAGATACAACTCCAGCAGATGTTT
+TTGATTAGGCCCTGCCATACTCCCGCTGACTGGCACATTGCTCCCGGGACACCGGTATCT
+GCGGCCATTGTCATTGCAGGCAGCGAGAGCGACAGCATGACAGCGATCAATATTTCCAAA
+AGTAACTTTTTTAGCTTCTTCACCGGCACGCTCACTATTTAGTAATGAATGTTGTCACGC
+TTTCCATATACGCAACCACTTTGTTAAAACACTCTCTCATCTGGTCCGGGTAAGTTAGCG
+TCAGCCAAGTGGCCAGCAGCGCCCCAAAAATAAATCCTATTTTCATATCAATTCTCCTCT
+GCCGCGATTTTTGTTCCAATACCACGTATTTCAGCTTCACTGAATTGCGTTATACGGAAT
+TTCTCTTTTTCAGTGGAGATCAGCGCTGGCGTGTTTTTTATCTGGAAACGAGCAATAATT
+TGCTCATTAACTTTGAACACCTTCCCATTGAATTTTTCGCGCAGATCATTCAAATGATCC
+CATCCATTTTCCTGTTTGATGCGCGTGAACATCGGCATCACCTGACCGCTGCCAAGACGC
+TGGCGATATTGCTTCTCTGCCCACTCAAGTTGCCCTGGGTTCATTGGGTCAAAAATTATC
+ATTGTGAGGTTCTGCGGGAACCTGGCCAGTGGGTTAATGAGCTCGCCAGCAGAAGCAATG
+ACGCGACCCTGCTTATCTTTAACGTCCTGAGTAACCCTGATTGTCGGGTCGATTAGCCAT
+TCCTTGTGCTCTTGAGCGGGAGGCAGATTAACCATGTACTGGTTTTTCCAGGTATCAGCG
+ACTGCTCTCTTCTTGGCGCCGTCCCAGTCGTATTTCTGTGCTCGCTCTTCGAGCTCTTTA
+ATAATGCTCTTCTCTTCAACCGGATAGGTCGTACCAGCAATCGGGAAAAGATCTTGGTCG
+GGTTTTCTGGCCAGTTCGCGCTGGAAGAAATCAACGTTGAAAGAGCCGACCATTTTTGCA
+AACCGGGATTGCTCACGGGAGATTATTGTCGGGACCTGCGTGATCTGGTACTGGTTAAAT
+GCGTCCGGGTCAATCGTAATTAGTGGGGAGTCAAACTTCCCCTTCACCACCAGCTGGTTG
+ATAGCTGCCTGAGTTTCAGGGAGGCGTGTAGTGCCTTTCTTCAGACCATTAAAAACCACT
+CTCGCCTTATGTTCTGACGCGGTACGGAGTAGATCTTCCAGGACGTAATCAGGCAAGCTA
+AATGACGCAAAGATAGTGATACCGTTTTCTGTCGAGAGCACCTCTTCCCGACTGCTGTCT
+ATTTTACGCTCGAAGTCAGCGGCGGTGATTCCTGATGAACCAAACATCTTTTCGATATTC
+GAAGACTGACTGCGCATAACTTCTGGTTTATTTTCGACGGATTTCAGTGCAGACTCGCTG
+AGCTGTGAATTTCCCTGAATCTCATCACGTCTGCGAATGATGTCGTTAACTGCTTCCGAG
+TTATTACTCTGAGCGCGGATAGCCTGCGTATGGTCTATAACTGCCTGCACACTGTCAGCA
+TTCATACCCGGGACATAACCGCGATTTGTTTGCTGACTGAGGTCCCCGTTTTTCTTCATA
+GCTTCGGCCTGGCGGATGTATTTCTTGGTATCAGGAGAATCCAGAGAACCAGACGGGAGC
+GGACCTTCTGATGCGTGTGGTACCGGTATTTGGGCGCCCAGAACCTGAGCTTGCCTTGCA
+ATGTCATCAGCAACCTGTTGATACTGGGGGCTAGCCACAGCGGTGGATATTAAGGCGTAA
+AATGCCAGACAGGAGGCCAGAGGCTTAATAGTTGTTTTTAATTCAAAAGATCGCATATGT
+TTTCCCAATAACTGAAGTCAACTTAACCGGCCCCCAAAAACGTGAGTCCCATGAGTGGTC
+CGTTTGCCCAATTAAAAAGACCTCCCCTTCCGGAATAGTTAATTCTCTTTCAATGGTCTC
+GGCAGGTATGCCGTATTTCACAGAAATACGTCTGGCATTGGCTTTATAAAATTTGTTCCC
+ATTATAAACACCATCCAATGTGACCCTCAGGCGATCTCCGCCGACTCCTGCCACAATTTT
+AATAACCTTCTCATTTTCACGTATAAAACGGACTGATTTTGGCATATGAAAAGCTATGAT
+ATTCCCTGAACTTACCGATTTATCCTTCAGATCGATCATGTAAAAATCAGCAGGTAAACA
+TCCATTTAATAGTCCATGACCAAACGTAAATCGATTAAAAAAAATCAACATAACCAGTAT
+CAGGATTCCGAGATTTATTGGCACGTACCAATCAAAACTCAGTAAACCACGCTTCTTAGG
+TATGTATTCTCTCATAACCTACTTCTCTCAGAATCAGAAAGCAAAATGGACTGTCTTTTA
+CATTACCTTAAAACCTATTATCCATGTTTTGGTACTTCCTTATTTCAGCAAAGCCAGCTA
+TTTCTGATTATTTACCGCCTTTTTTTCTTTCATTCCGTCTTTGATTTGTGATTGTCCTGG
+CCGCTGTCTTACTCATGTAAAGTAACTTTCCCGACGTTACCCCATCAAAAAGTGAAAAAC
+AAAAAAGCCGGGACATTTCTGCCCCGGCTGTTATTTCATTAGCTTGCCTTACTGCGAGGT
+TTCAACTGAATCTACGGACTTTGACGCGCCCTCATCCGGACCATAAACGGTCGTACGCTG
+AGTTGCTGAATCCCCACTATCATCATACGCGACAACTCGTATATCTTGCTTCCCACGATT
+AAGGTTTTTGGACAGTGTCGCAGTGCTGCCGAAAACATTCCTTAGCTCATCATTGATATA
+CCATTCATATCGAACCAGCTTGCCATCAGTGTCAATACATTTGTTTGTGAAACTCCAGCT
+CATATTAGACTCTGTGTAGCTTAATGCACATTGCGGAGCCGCGTTTTTAACAACCTCAAA
+ATCAACTGATGCGGTACCTCTTTGGCCCATTTTACTGACAACATCCAGCGTGACTTCGTA
+TTTCTTCTCAGTAAGACCAGAAATTAACTGAGCCCAATAGTTTTTACTACCAGGAACAAC
+CTCGCCGTTTACTTTGTATGTCACAGTATCAATACTGTCAGCAGAGTGCGCCAGTTTAAT
+GTTAGATCTTAGCGTGACATCAAGAGGCGCCCTCATGAACTTATTAGAGAATTTCGGTGT
+CATTTCTACAGTCATGGGCGTTTGCTCATCGACTACGAAGGTATTTTCAATACGCTGTTC
+GTTGTTACGGTTATCACGGAAAACGATTACCAACGTATATTTCCCCGGCTTCGCAATTGC
+AAATTCTTTCGTATCACCATCATCTTTTAAAACTGAGATATTGTCCTTATCGTAGATCCA
+TTCCCGAGAATAAGTTACCCCAGGATAGCCACCGTCTTTTATTCCGCTCAGCGCAACATG
+TAAGGTCGACGGGGCCATGGTGTATTTAAGCTTTGTACTGACTTTCATCTCAGGAAACTT
+ATACACCCAAGATTTAACAGATACTTTCCGCGTGGAAATAGTACTGTCCTTACTGTCAGC
+AAGCCATGCACTGTATTCAAATGCCGCATATCCTTGCTTATCCAGCATCTGCTCAGTCAA
+AGTTATCGACAGATTCGCACCTCTGATTTTTTGTCCGTCAGGGGCAGTCCATTCTTCAAT
+GACGTCATTTCCGTTCTTGAATCGGCTGTTCGGGTTAGTGTATTTACCATCTAAAGTAAC
+TTTACTTCCCACCTCGACGCTTGAAATACCACTTACTGAAACAGATAGGCGCTTGGGTTT
+AGCGACGGTTAACCGGGCAGACGTCTCTTTCCAGGATGACTCTTCAGCCAACTCATCAGA
+ATCCAGGTAACGCATTCGGGCGTAAATGGTCGGAGGTAGCGTATCAGCGGCCGATACGTT
+ATAGGTAGTGTCACCCTGAACCCAATTCACTTTATCCTCCGACCACATCACTTCGGCCGT
+ACCCTGCGGAATTGGTTCATCGTTATCCAGCAGCGTGACAGGCAAATCATCGCCTTCGAG
+AATTTCAGCAACATCGATGCTCAGCTTAGGCTGTTTGTACGTTACAACCGTCAGAACGTC
+GCTATAAGACTCTTTCGACGTAAACTTGTTGGTCATTTTTGCCCTGTAAAGCCATTTACC
+AACCTCAGTTTTCCTGATCGAAATGCTTCGCTTCCCTGTCATGTCCTGAAGCATAGTCCA
+TGTCTGTCCATTATCAGAAGACTCCTGCCACTCGGTAGGCGCCAGCGCATCGGAGTTAGC
+TGTACTGGCCGATTTGAAGTTAACAAGCGTACTGAGCGGGATACGTCCGATAATCAGACT
+CTTTGAGAGATTACCTTCTAGCTCTTCGCCCTTATAAACACGGATGCTAACTGCACTGGT
+TTCCCGGGTCAGTTCGAAATCTGCGAAAGGCGATCGTACTTTAGCAATCCCGACAAGTCG
+CACGTTCCCGAGGTCCATATTTTCTATCTTGATCTTGGTTTCAACCACCCCGGCATCATT
+CACGGGCAGTGCTTCGGTTAGGGGTGTACGTTCATACGTCGTTTTATATCGGCCTGTTTC
+TGGATCTTTTCCATAAACACTTTTCTGAGCGTAAATGGTTACATCCCAGTCCCCCATTGT
+TGTCCGACTAAATGAACTTTTGCGGGTTGAATTGTTATAGCGGCCAACAGACACCTTCAA
+TGGCAATTCCATCGTGGTAGCAGTCTTTTTGTCCTCAATTTCCATTGCCGCTCTAATGTT
+AAAGTCGGGTACCGTATACACATTGAGCGTATCAACGGTTCGCATAGTCGGTTCCTTCGA
+GTACTCGACAGCTATGTCGAAGACATTCTTCGTCCACAACGGGGCTGATGCCACTTTAAG
+ACGTTGAACAAACGTCGTTGCATCGTTATTTGATGAACGGTTCTTAAACGTCGTTTTTAC
+GCTTTCCCCCCCGTTTTGTGAAACATAGACTGTCACATCAGCAGGAACCACTTTTGCCAA
+TAGACGAGCTGCTTCCCCGCCAGTGGTATACGCCAGTGCGGTGTTATCGTTAATCCCCGT
+CAACACCTTGTTTTTCTTGTAGGTAAGGACCGGGTTATAAGGTAACTGCGTAATCAGCAC
+ATGGCGGTTTCTGGACGATACAGCTTTAGAGCCCTTGCCGTTTATCATATAGACCTGATA
+GTCGAGCAGGTTATCGCCTGTTTTATTGAAGAACCCTGTCAGGCCTGGCGTCCGACCTTT
+AAAGTAAAATTCAAGCCCGTCAGGCACATTGTTCCACTGAGGGTAACAGGCGGTGATATC
+AGATTTGTCACCATACCATTCAAGGTATGCCAGTGCGTTCTCTTCTGTAGTAAAGAGAGT
+GCATTTATCACCGGCCGTCTGACTCATGAGATCGGTATACTGCCGAACTCGTGAGTACAA
+TGTGATGTCTTTCTCAAAGTTTTTAAGCGTGAATCCTGTTGGTTGATACGTGAAAGTAGT
+ATTAAATGTCACAATCTTGCCGTACAGGTTTTCAGCTATGACCGTGATTTCATGGTCAGC
+ATTCACTTCTAGATCATCCCCAACCGGCAGATAATAAATGCCTTTGTGGTTCGTGGGGGT
+GAGCTCAACAAGTTTGTTATCTATCGTAACAGCTTTAATATCCGCGACTCCGGCCTGGCC
+CTGGAATGCGGCAACAATAATTTCATTTAAGAAATACACAGGAGCTCGTTTGGCCAGAGC
+TGCACCGTCCTTAAGCACCATCAGTGTTGGGTTATCAGAAAGCATCAGTTTGCTTTCAGG
+CTCATTGTACGTAGAGGTATTCTTGCTATTGTTCTCTACCGTGAACGAGGCGGCATAAGA
+ACCATTCGTCAAGTCTGTTAAGTCAAAGATATACAGATATTCATCGCCGACTTTCTGTGG
+CCCGCTCACGGGCTGAAGAGTACGACGTAGCGGTGTTGCCCAGGATTGCTTAAAGTCGAT
+AACCGTACCATCTTCTAAAGTAACTTTTGTTGTCGGCTTAAACACCCCATCAGGATTCAT
+CGTTAGCGTCATAGCGGTTGGTAACCACCACTCACCCTCAGTTCCTTCCTGAGGCACTTT
+GACGGCTACGGCCACCGTTCTAGCTCCTGTATAGATCTCCTGTCCACCAACACTTATTGT
+TTTAGCTTCATCCGTGAAATTCCAGAGAGTATGGTCAACAACAGGAGGACGGTAATCCCA
+GGTCAGCGTTAGCTTCTGCGCTTCAGGAGGGGCAAAGTAATTATTTTTCGAATTGGCAGT
+GACCGTGATTTCCCGTGAACCCATCAGCAAATCCGAATCACTTACTTTGATGCTTCCAAC
+ATCGATCGTGCAGCCATTCCCACCAATTGCGACTTCGCAAGCTGATCCAGACCCGATAGA
+GATATATTGCACATAATTGCGAGGCTCTACGGAGACAGTGACATTCCTAATTGCTTCATC
+CTTAAGATAGGATTTAAGAGTGTAACCATCCTGAACCACTCCATTCATAGACGATTTCAG
+GCCCGTTATCGTCGGTTTAACCGGTACAAGAGCATTAACTGTATACTCCCCATTAACCAC
+TTCTACTTTCTGCCTTTCTGATCCAGAAAAATAAGAAATTTTATACGGCAGTTTTAGTTC
+TCCTGCCGCATTGGGTATCCCTGTTAAATTGAATCCGTTTGCTGTAAAGCCAGAGGTATT
+TGGAAGCCATTCAAAAAAGCAGACCAAGTTATCTACGCTTGATGTCGCACGATCATCAAC
+CGTCACATTGCATGCGTTGCCAGTACCTGAAGCAGTAATTGTATTATTGTTGACGAATGC
+AACAAAATCGCCCGGGCCGGGATTAAACGTGACGGCAGGCATATCAGCCTGGAGTTTTCC
+GGAAATCATAATTGCCTCAGCTTGTACCGATTTAATCGAAGCAATTAAAGAAAACAACAG
+GGTTAAACATAAACCTGATTTTCTCATGACGAACACCTGTTTTTTTACGCAGAATTAGAA
+TCACTCTACGTTAAAAAATTCTGAAATCTTGTTCGTAAAGAGGAAAAAAAACATTAAATT
+TTTGCAGGAAATTGAGGTTTTTTAGCTCACTGACCGCTCTTAGACTCAGATAGGCGAAGG
+GCGGTAATTATCGATTCTGAGGATACCCAAGGCATTTTAAGTGTCAGGAACCCCAACAAG
+AACAAGCCTGTTGAAACGCAATCCATTTGTGTTACGGGAAGGTTATAATTTAAAGGCTTA
+AACGTCCCCATTTTAACCGGTACAATGCTTGCGCTTACCAAAAGGCCCCCACGGTCGTTG
+GGGCCGATATTGATATTTTTGTAGGCTTGGTGAGTGCGATGCGTGGTCTTACGCTTTTCA
+AATTTTAGTGTCGGCTTAATTCTCAGAAAAACAGATGCCAGCGCCATGGCTTCGTTTTGG
+GATAGTTTCATGAGAATGCTGCCCTCTGAATTCCATCCATATTCCCTATTGTCAGACGGA
+GGAGCAAACTGGAGAGACAGGTAATACTTTTCAGTCTCAGTTACAAACGCCGAATTATCA
+GCAGAGCGACTTTTGTCGAGATTTACTTCGAATGCCATCGCGACAGATTGGCTGAATACT
+CTGACCCGTTGAGGCTTCGCACCAGTTGCTGACAGATCGCTCATTGTCATACTCTCTTCT
+TAAAGAACCATGTACCGGACATAACTTCATTATCCTTCGTGTGCGTCAAATCCGAAATAA
+CAAAACCACCTTTTCCTTCCGAAATTATCATGGTGTAAGAGCTCGTATGCACAAGGCGGG
+AATTTTTGACTTGCAGACCCGTACACTTAACTGCAATTTCATTACCCGGAACTCTCTCAA
+CAAAAGTAACTTTTGATGCAACGCCATTGATATGTACGCTTCCGTTATCTGCTATCTGGA
+TGTTCAACGAAGGTGTGGATTCTTTATCACAAGGTTGGAAAACAGAAGTGGTTTTAAGAA
+CTTTGCCAGTAAAATCGTACAAGTCAGGCTTCGACGGTTTTGCGTTAAAGATCGAGTAAG
+ACCCCGCCACTGTTAAACCAACCATTAAAAGGGGGATTACCTTTTTAAAATTAACTTTCA
+TCCTCCAGTTCCTCTCCAATCAAGTGTAAAGCACTTACGCACATAAGCCTGAGTTGATAC
+AGCAAATTGTCGGCGGTGATCCCCCCAACAAATGTCACTGTACGGCGTATCGAAACGCCT
+CCAGGCTCGCATTGAATATGGCCAATACCTGCATCGCGAAGGAAATCATTCTCGGCGCTT
+ACCAGGTCTGCTTCAGCAGGCGGAATGACCACTTCGATGAGTATTGTATCAATTGGAGCC
+CACTCCCAGTCGTACTTAAGCGATGAAATTGGGGCAATGGAAACATGAAATTCATCAATA
+TTAAAAATGACTGGTTTTTTGCCTGTTGATTTAGGCTGAATGAAGGGATTCTCGACCAGG
+ACAACTGGGAATTCAGAAATAGACAGAACTTCGATTAACTGATCTCGACGTAAACCGTGT
+ATTAGTGAGTTGCGTGATAACATTCAGTCAGCCTTTATTATAATAATCAGATAGTTACAC
+ATGATCCCGCTAGTTCCTTACCATCTTCCCGCTTGCAGCGTAGTAACCATTAAGATCTTA
+TGGGTTAGGGTAACAAAAAAATCTAACTTAACCAGTAAAGCATAGAGATTTTTTACATAA
+AATAATAAATAAGTACCAATTTTATTAAGATATTTCCTATCTCAGCCAATACTTTAGGAA
+AAATCTGTACCCGTTTTAACACCTATACATACATCGTGCAAACAAAGAACAGTAAACGGG
+GCCTAAACCACCTTTTTTTAGTGGTTTACCTAACCAAAATTAATTTATCCAAAATCGTAA
+CTGGTTCGACCTGAATCAACCCACGCGAATTTTAATGATTTCTTAGAACTGGCTCTATAA
+TTCTTCAAACTGGCTTAACTGGAGATGTGACAACGAGGGATTCATTTAGTACATGAAACC
+GGTTTACCATTCCCCCTCACCTGTTAATAATATACCAAAAAAAAGCCAGCTGGTAAGCTG
+ACTTTTTATTAATAGATAACTCAATCTAATCAATTGATATTACTATACTTACTTCGCAAG
+ATTTGCGAGGTTTGCATTGGCCTTTTTCTTCGGCTTCCTTGTCACACCTTGGATTTGCGC
+ATGTTCACTCAGCACCGTGTTTTCGCTTTGTGAGGCGCTAACAGCAGCAGAACCATGACT
+AGTATTTAAACCTGAATCATTCTTTTTTGCGCTCTCAATCGGCGTTAAAATCTCTAAAGT
+CTCAGGTTTGGGATTTACAGTCAGTTCTTTAGGTATTAATTCCAGCCGCTGATCCCTTAC
+CCTCTCTGCCTTTAATGTTTCACTGACATCAGATTGACTAGTAGTTGAAAAAGTTGCCTT
+AGAAAAATCACAGCCATTAATCATTGAAAATAATTCATTGAATTTCGAATCAAGCATAAA
+GCTTATTTGTTCTTTCAAATTTTCATTGTTTAATTTGTCTTTATTAAATTCATCATTAAA
+AAATCGATTTAGATCAGCAGCTGTTAATCTCTCATTCAGTCCATTAATAAAACTAGATAA
+CTCGGGGAAGAGATTATTTAGCACTAACCCCGTAGTGATTGCAGATCTTATTAGAGAAAT
+CTGCTCGCCACGATGTGTTAGGGAATTTTTTTTCAAAAAATTATATGCATACGGAGATTG
+TCGTTCCGATAACCAAAACGCACTAATCTGAATACGATCGTTTTCCTTCTCAGATTTTTT
+AGTCATAAAACTCTCCCCTTTGCAAAACCATCATCATGCAAAACCATCATCATGCAAAAA
+CAGTATCTGCGATAGCCAGTGAAAGTGCGAATTGCGGATTATCAACCATGATGATTTTCG
+ATTTGTCAAAATGTTTACGAACTGCCGGTTCAATCAGGTAAGAACCTCCACCAACAAGGA
+AAACATTATGCGGCCGTTCTTCCACTTGAGTGACTGCTTTAATCACTTTTTCTTGAAGTT
+GCGCCACAGCCCCATTAACAGCATTGAACACGCCGTCAAGATCTTCCGGGGACACCTTGA
+GCGAGGCTTTGTTTTCACGATTATCGACTAGGTGATGAATATAGGCGTTACTTGCATTCA
+GCTTTGCAGAATCCAAATAACGACGGATTTCATCATATACGATTGAGCAACCAATACGGT
+CAAAACCCCTGACACTGGAGATCTGTTCCAGCTGACCTGTAATGCTTGCAACATCAAGTG
+TTGTCCCACCTAAATCGATAACCAGGCTTGATTCAAAAGATTCAATTGATTCGATTTCAT
+CAGCACGCGTTACCGCTGGAAGGGATTCCGGGAAAACGGTAACTGAAACAACATTAAATG
+AAACACGTTTACCATCAATATAACGCTCCACCGGCTTCATCAGGTTGTCTTTTTTTCGTT
+GGATGTTTTCATTATTGGTTTCACCCAGAGCGGTATAAAACTGACTGAGTGGCAAAGTTA
+CGTAGAGATGAACATCCTGTGGCATTAGACCTGAGGAATGTAGAGCATGGTGAACATTAA
+GACGACTGATTTCATCGTACTGATGCGCAACGTCGGTAGTTTCTAAAGCATTGCTTGATT
+CGCTGTGGTGCGAGAATCGTTGAAGACCATCAATTAGATAATTGAATGGAATAAGTCCGT
+CATGGCTTACCCGGAAATCTGCAACGAAACTATTTTGAGTCAATAAAGGTACAAGGTCAC
+CTTGATTGTTAGTGCAAACCAGTTTTGCCGCTTTACTACCATCATCAATAACAACTTTGA
+GTGTCTCAAGTTCAGTAGAGTTTGATTCAGCCACAGCCAGTTTTGTTTTTGCTAATTCAG
+TCATGCAGAAACCCTCGTATTGGTTTATTTAGCCCACCACTTTTGTTATGGAATTTATAC
+ACCAATGGTTGCTTTAGGTCAACATTAAACGGGACAAAACACTAACGTAAGTCCTTGTTA
+AAAAAGAATCCTTCAGTTTTAATCCAGATGCAACCCTAGATTCATGTACACCTGAGCAAC
+ACACGCAAAAACTATATTTTGCTCAGCGTTTTTATACCAAAAATAAAACAACTGAGGTGC
+ATTACAGTTGATACGGCTCGGAAACCGAAAAATGATTTCTAGCTCCATTTTGGACACTCA
+CAAAAATTACCCCTCTTATCGAAAAAATTGATGACTTTCATCCGGTAGTATTAATGCAAT
+TTCAGAAAGAGGCATTTATGGCATCCGAGCACGTCCAGACAATTGATCTGACTAATTTTT
+CAGGAAGGGTTTTCTTTCTGGCAGACCCTCATGGTCATTATTCGACGCTATGTAACCTTA
+TCCATTCGATATCAGAACCTGATGAGGAGTTGATCGTTTTCTCCACAGGAAATCTCTTCG
+ATTATGGACCTGAGCCTATGGAGTTAATGACAGCGATCAACACAGGGATTTTTGACGGCC
+GTTCTGTTCGTGTGTTCTCAGCTGCCGGGGCCGGAGAAGAGATGCTGAAAAAGCTCTTAC
+CCATAAATAAAGACCGCAGGACTTATTATCCAAGCACATTTCTTAATGAACGGTGGTGTG
+CAAGAGGCGGGCGATGGCATAAACAAATTAACCGCAACTATCTTGAAGAGGAAATCTGCA
+AACTGCTCTCCACCCAGCTGGCTACTGTGATGAAGGTGCTTTTTAAAGGCAATATTTCTA
+TAGGTATTTGCCCATCCGATTACACAGACATACGGCAGGGCTTCAACAATACATATAACG
+CCCTCCTCGCTTTTAATCAGGCAAATGTGAATATTTTTCAGAGTCAGTTTCTATACGGCA
+TGGATCACGCAGTCAGGCCAGTGAATGTCAGCGATGTAAACCTCGTAGTATTGGGTCGGA
+ATCCAGTTAACAGCATCAGAAAGGCCCATGGGCTACCGCTGACTAACTTACCGGTACTCA
+TAGGAAACTGCCTCCACATCAATACAGGTTCTCTGTACATGTCAGAAATCAGTAGCCCAG
+CACTACTGGCACCAGGTATTCCGCCTACTACAGTTCCGGCAATAACACTGGTCGAGTTGA
+TCCTGGCATCTACACCGACCCTGATTTGCCACCAAATGATCCTGAATAAAAACGGTATTT
+ACACACAAAACACTGCACCACTTAACCTGGATTCAAATGATAATAATATAGAGGCCACAT
+TATAATGCTTAAATTAGAACTGATAATTTTGCCGTTGCTGGCATTTTTAGGTCCATCCAA
+CATTACAAATGCATCGACTAAAACCCCGATACCGTCGTCCCAGCTATCTGATGCCAAAAC
+TGGGGTTAACTATGAATTTATTACTATTGCTGCAAATTACGTCAACGGAATGTGGCTTGT
+TGATGGTCGACAAAGACCAGTAATTAAAACAAGCATGACTAAGCGTAACTATCTTCAGAT
+TGAAAACGACTCTGCTTCAACTCCTTTAAATCTTGTAATACCCAAAATTGAATTTTCCAT
+CATTGCAAAAAATGGCGTGTTTATATCAAAATTTATCTCCCTTGATGAAGATGCATCCGG
+GAAACGAATTCTCTGGTTAGAACCTGGTTCCAGCATGACAATTTCATTCGTCAATGATCT
+ATCCAGTACCCCGTTACAGGCGTTAGTGTCCGTAACAAAGCAGAAAAAAGAGGTTATTGC
+CATTTTTGGCCCAGATCAGGGTAAAAAATTCACCCTGCCCCTACCGTCAGATTCACAACA
+ATCGTCAATCGACTATGTCCCCTCTCCAGAAATCGCATTACGTATCAATGCCCCCAAAAA
+ACTTCAACCCGCTATCGCAATCCCGGAGGACGCTAGTGCATCTTTATTACCTTCACATAC
+CTACAAGATCAGAGCGGCAGAAAAAGTAAGGACTTTTAAATTTTCGTCGTTCGTTTGGGT
+TGGAAAGCGTAACAACCTCCTCGGTGGTTCAGATTATTTCACCAAAGAGTTGAAAATTTA
+CCCAGGAGAAAACTTCGATATCAGTACCATACAGAAAACGACTATGAGGACTGAAAATGA
+TTAAAGTTTCAGCATTTATTCTTACCTTACTTGTGACTGGATGTCAGTCGGTTGGAAGCA
+AAATTGCAGTCCTCCCTTCGGTAGGGTTCGACCCTATAATGAGCAACAGAACTGAAGCCT
+ACACCGACGGAAAAGTTACTTTTCTGATTGAGAGTTCAGGCACTGATGTCTGGTTACTCG
+CCAAGAATGGGACCAAAGAATTTATTGAGTTGTCTGATCTGAATCTCGGCGGGAGTCGTT
+GCACCTATTCGTCACGTGGAAAACAGTTGATATCACCTAGTTCAGTTACAATTTTTACGG
+TGCCCACAGTTGGTTTACTTGGTCTTTGTTACGATAACAATGACCAATTAACATTTATTA
+ATAACTCATTTAAGAACATCTCACAGTCTTCACGAGATGGACTCACATTGCCATTACTGT
+TCAGTATTAAATATAAATTCCCAGGTTCATTTGATTCCAAACAAATTGTAGTCACTCAAT
+CATTTGATTTAGAATTTTTGCAAAAGGAGCAATCATGAAATATATATTGACCGTTTTGTG
+TATTTTTTTCTGCCAGACTGCAAGTGCTTACCCTTATCGCATTTACACTGCCCCAGAAGG
+TGCAATTGTGAAAAATATACTTACTAATGAAGTGATCGGGAAAACACCGGTTGAAGTTGA
+TGTCAGCAATACTGAAGCTGGATCAACTTTCGGAATTTCAATGTATCGTCATGAGAATGT
+AGCTATTAAAATTTTCACAGTAATGCCAAATGCAGAAAATAATTTTACTGTTTCTGGTCC
+AGACGTTGCCACTATGTCTTTACCGGGTAAGGCCCCGTTAAACGTGACCAATGACAGTAA
+TGCAGCAGCGGTTCATATAGATCTAAGACCTTTTCTGTCTGAACCGGCCCATCACCCTGT
+TCAATAACACTTCTAGGCCCCAATCTTTGGGGCCTGCTTAACAATACCGTATATGTTAAA
+ACCCATCATTATCAGATAGTTAAGATATTTTTGCTATTGATTTCTTTTAGGACTTGGTAA
+TGCGTAGACTAAATAAAAGCGTACATGAATAATTTCATCCGCATCTAATGATGCGGATAT
+TTTTTGATTTTAATTATTCATTTCGCTCAGTTTTGATTTTATAAACTTCTCAATTTCGTC
+AATTAATTCTCGGTTCATTCTATTAAACTCAAAACGGATTTTACGCCCCGAGGAACTTTT
+GCTAATTCTTGCATATTTATCTTTATTAGTAAAAGTTGCCAATTCACGTGTATCCCAACC
+TTTGCTAGGTGGTTTAATATCAAGTTTTTCAACTACCGTTGTAATCTTCTCCATTACGGT
+TTTCTGTGCTTCAGCAATATCAGAAATATCCAGATCTCGAATTTCCTCACGTGTATTCTC
+AACAACTTCTTCAAGAGAAAATAAATTCTTCTCTATATATTTTTGAAGTCGGAATAGGCG
+ATTGTAATAAGAATTCGGAATAGCTTCATAGTCAGGAAACAGTGCAATAAGAGTGCTGTT
+AATCTTTGCAGCCTGAACTCGCTTAGAGACGGACACGTGACTGATACCATGATAGTTTGC
+AAGCTCTTCATTGGTAACAAATCCATGCTCTTCCATTTCCCTTAAATACTTTAAACCTAC
+TTCACGATATGAAAAGCGTCGAGAAGTTTGTGTTGCTGATATGATGGAATTAATATCATC
+TGCGTTAACATCATCAGGCAAAACCCATAATGGCAATTCTTTTGCTGATTGAATGCAACA
+GAAACGCCTGCGGCTACCTTCTATTAGCAGATACACTCCGTTCCGCTTAACTGCAACGCC
+CTCAGTATCAACACCTCTTGCTTCAATGTCCTTCAGAATATCTCTTACTGCATTTACAGA
+AAGAGCCTCCTGATTTCGTGGGTTCAGAGGGTGTACTGTGGTTTCCAGTTCCACCTTTTC
+CGCCGGAACAATGATGTGTTCCGCCTCAAGCTTCCGCCCATTGTGTAATGTAAAAAGTTT
+CTTCAGGCGTGGCTGACCTTTCAGGCCTTGAAGCCCGGAGCGATGGATTACTTCAGTACG
+CTTAGGCGCATTAATATAACGGGATTTGTCGTTCCCGATATGCTGCTCATCACTCATACA
+TTACCCCCTTGCTTCACTGAAAAACTCTTAATCTCATTAATAAATTGCTGGTAGACCGCC
+ATCACGGATTCTTCGGCAACATCAAGCTGTTTGGGAGAGCAGAGCTCTTCTGATTTTTTG
+ATATCCAATACGGTTCTACCCCTAGAAGCTGCGGCTTTAAACGCTTCTGAGTTTTTGATA
+TTTGCAGACATAAAGAGTTCCTGCACTGTCCTTACCAGTTTATCCAGGACAATCTTTTCA
+TAGGGACTCTTATCGTCGACATTCACTGCCAACACTTTGAACCAGCTTAGATTTTCGCCC
+TTGCTCGGCGATTGTTTGAATCGCTCACTGATCGTCAACATGAAATCAGTTGTTGAGGCA
+TAATCATACTCACGAGGTGAAACGGCAACCAAAATGCCATCAGCAGCTTCATCCGCTGCC
+CATGTGATTGGCGAATCTTCTGGTGGAGTATCGATAATGATCAGGTCGTACTTGCTCTTC
+AAGACCGGCAGGATTACCTCTTTAAAACGTAGTAATAACTCAGTTCGTTCTTCTCTGGAA
+CACTGCCAGTATTTATCTTTGAAACGTGCATCTGTAGGGAATGCGGTAATAACATCAAGA
+TTCGGAAGGTGTGTTGAAAAAGGCATACCTTCAATAATTTGTTCTTCCGAGTACCCTAAA
+TCAAGATATTTTCTGTAATCTGAGTCTTCTTCGTAAACCCCTAAGATGGCGTCAATAGCA
+GTCAGGAAAACATCATCTTCCGCTACGCTCTGGATCATCCCGCTTCCAATAGACCCTTGT
+GGGTCCCATTCGATCAACAGTATCCGCGCGTTTAGATGCAAATCAAGTGCTGCCGCAACT
+GCAAGAACGCCTGAAGTTGTACTCTTCCCCGTACCACCCTTATGGTTCTGCGTTACGATT
+GTACGGCTACAGTAGTAGTCGCTATATCGAGGATAGTTCAGAGCATCCATTATTTTCTGG
+ACATCCCAGCGGGTATAGAGATGGTTTTTGTTCTGGTAGATAGGAGCACCAACCAGTTCT
+TTTTCTTCAAGATCCGCTAAGATTTTGTTAAAAGTTACGCGAGATTTACCAAAAAAATCT
+GACAGATTTTTTTTATTCAAGCAGTGGTTATAGATTAGGCGATCAACACCGTCTACACTA
+TCATCCGATACCGAAACCCTCGAAGAGACCAATAATGACTCTTTCAGAGAGATCTGCTCG
+CTCTTCATGCGTTGACCGACAAGGGCGATCTTATCAATTAGATTCATTCTCTTCCGATCC
+CTTTTACCTAAATAGTGAAATTAAACGTATATACGTAAACTTTACGCATAATGCGTATAC
+TTTAGCGTTATGCGTTTAATAGTAACCTTAATTCTATTATTACGCTAACGTTCTGTATTC
+TTTTCTTAGATTTTGGAATATCTGCATTATTGAATTTCAATTGGCAGTTCATTGAAGTCT
+TCCAAAAGCCTCTTAAGTATCAACAATACCAATCTTCCGACATAGCAGGATCACTCCATA
+GATGTGGCAATAAGGGGGGTAAATCCCACGGTACCCGACCAGCATTACCCCATAGCCTGG
+CGATTAAGGGGGTTAAATGCCATGGTACGAGACCAGCATTCCTCCATGGCCTGGCGATTA
+AGGAGGTTAAATGCCACGCTACGCGACCTGCTTCTCCATGGCCTGGCGATTAAGGGGGTT
+AAATGCCACACTACGCGACCTGCTTCCCCATAGTCTGGCGATTAAGGGGGTTAAATGCCA
+CGCTACGAGACCAGCTTCCCCATAGCCTGGCGATTAAAGGATTAAATGCCACGCTACGCG
+ACCAGCCTCCCCATGGCCTGGCGATTAAGGGGGTTAAATGCCACGGGACACGACCAGCTT
+TCCTCCATGGTCTGGCGATTAAGGGGGTTAAATT
+>NODE_6_length_50434_cov_42.3615':NODE_43_length_220_cov_211.224';
+AATTTAACCCCCTTAATCGCCAGACCATGGAGGAAAGCTGGTCGTGTCCCGTGGCATTTA
+ACCCCCTTAATCGCCAGGCCATGGGGAGGCTGGTCGCGTAGCGTGGCATTTAATCCTTTA
+ATCGCCAGGCTATGGGGAAGCTGGTCTCGTAGCGTGGCATTTAACCCCCTTAATCGCCAG
+ACTATGGGGAAGCAGGTCGCGTAGTGTGGCATTTAACCCCCTTAATCGCCAGGCCATGGA
+GAAGCAGGTCGCGTAGCGTGGCATTTAACCTCCTTAATCGCCAGGCCATGGAGGAATGCT
+GGTCTCGTACCATGGCATTTAACCCCCTTAATCGCCAGGCTATGGGGTAATGCTGGTCGG
+GTACCGTGGGATTTACCCCCCTTATTGCCACATCTATGGAGTGATCCTGCTATGTCGGAA
+GATTGGTATTGTTGATACTTAAGAGGCTTTTGGAAGACTTCAATGAACTGCCAATTGAAA
+TTCAATAATGCAGATATTCCAAAATCTAAGAAAAGAATACAGAACGTTAGCGTAATAATA
+GAATTAAGGTTACTATTAAACGCATAACGCTAAAGTATACGCATTATGCGTAAAGTTTAC
+GTATATACGTTTAATTTCACTATTTAGGTAAAAGGGATCGGAAGAGAATGAATCTAATTG
+ATAAGATCGCCCTTGTCGGTCAACGCATGAAGAGCGAGCAGATCTCTCTGAAAGAGTCAT
+TATTGGTCTCTTCGAGGGTTTCGGTATCGGATGATAGTGTAGACGGTGTTGATCGCCTAA
+TCTATAACCACTGCTTGAATAAAAAAAATCTGTCAGATTTTTTTGGTAAATCTCGCGTAA
+CTTTTAACAAAATCTTAGCGGATCTTGAAGAAAAAGAACTGGTTGGTGCTCCTATCTACC
+AGAACAAAAACCATCTCTATACCCGCTGGGATGTCCAGAAAATAATGGATGCTCTGAACT
+ATCCTCGATATAGCGACTACTACTGTAGCCGTACAATCGTAACGCAGAACCATAAGGGTG
+GTACGGGGAAGAGTACAACTTCAGGCGTTCTTGCAGTTGCGGCAGCACTTGATTTGCATC
+TAAACGCGCGGATACTGTTGATCGAATGGGACCCACAAGGGTCTATTGGAAGCGGGATGA
+TCCAGAGCGTAGCGGAAGATGATGTTTTCCTGACTGCTATTGACGCCATCTTAGGGGTTT
+ACGAAGAAGACTCAGATTACAGAAAATATCTTGATTTAGGGTACTCGGAAGAACAAATTA
+TTGAAGGTATGCCTTTTTCAACACACCTTCCGAATCTTGATGTTATTACCGCATTCCCTA
+CAGATGCACGTTTCAAAGATAAATACTGGCAGTGTTCCAGAGAAGAACGAACTGAGTTAT
+TACTACGTTTTAAAGAGGTAATCCTGCCGGTCTTGAAGAGCAAGTACGACCTGATCATTA
+TCGATACTCCACCAGAAGATTCGCCAATCACATGGGCAGCGGATGAAGCTGCTGATGGCA
+TTTTGGTTGCCGTTTCACCTCGTGAGTATGATTATGCCTCAACAACTGATTTCATGTTGA
+CGATCAGTGAGCGATTCAAACAATCGCCGAGCAAGGGCGAAAATCTAAGCTGGTTCAAAG
+TGTTGGCAGTGAATGTCGACGATAAGAGTCCCTATGAAAAGATTGTCCTGGATAAACTGG
+TAAGGACAGTGCAGGAACTCTTTATGTCTGCAAATATCAAAAACTCAGAAGCGTTTAAAG
+CCGCAGCTTCTAGGGGTAGAACCGTATTGGATATCAAAAAATCAGAAGAGCTCTGCTCTC
+CCAAACAGCTTGATGTTGCCGAAGAATCCGTGATGGCGGTCTACCAGCAATTTATTAATG
+AGATTAAGAGTTTTTCAGTGAAGCAAGGGGGTAATGTATGAGTGATGAGCAGCATATCGG
+GAACGACAAATCCCGTTATATTAATGCGCCTAAGCGTACTGAAGTAATCCATCGCTCCGG
+GCTTCAAGGCCTGAAAGGTCAGCCACGCCTGAAGAAACTTTTTACATTACACAATGGGCG
+GAAGCTTGAGGCGGAACACATCATTGTTCCGGCGGAAAAGGTGGAACTGGAAACCACAGT
+ACACCCTCTGAACCCACGAAATCAGGAGGCTCTTTCTGTAAATGCAGTAAGAGATATTCT
+GAAGGACATTGAAGCAAGAGGTGTTGATACTGAGGGCGTTGCAGTTAAGCGGAACGGAGT
+GTATCTGCTAATAGAAGGTAGCCGCAGGCGTTTCTGTTGCATTCAATCAGCAAAAGAATT
+GCCATTATGGGTTTTGCCTGATGATGTTAACGCAGATGATATTAATTCCATCATATCAGC
+AACACAAACTTCTCGACGCTTTTCATATCGTGAAGTAGGTTTAAAGTATTTAAGGGAAAT
+GGAAGAGCATGGATTTGTTACCAATGAAGAGCTTGCAAACTATCATGGTATCAGTCACGT
+GTCCGTCTCTAAGCGAGTTCAGGCTGCAAAGATTAACAGCACTCTTATTGCACTGTTTCC
+TGACTATGAAGCTATTCCGAATTCTTATTACAATCGCCTATTCCGACTTCAAAAATATAT
+AGAGAAGAATTTATTTTCTCTTGAAGAAGTTGTTGAGAATACACGTGAGGAAATTCGAGA
+TCTGGATATTTCTGATATTGCTGAAGCACAGAAAACCGTAATGGAGAAGATTACAACGGT
+AGTTGAAAAACTTGATATTAAACCACCTAGCAAAGGTTGGGATACACGTGAATTGGCAAC
+TTTTACTAATAAAGATAAATATGCAAGAATTAGCAAAAGTTCCTCGGGGCGTAAAATCCG
+TTTTGAGTTTAATAGAATGAACCGAGAATTAATTGACGAAATTGAGAAGTTTATAAAATC
+AAAACTGAGCGAAATGAATAATTAAAATCAAAAAATATCCGCATCATTAGATGCGGATGA
+AATTATTCATGTACGCTTTTATTTAGTCTACGCATTACCAAGTCCTAAAAGAAATCAATA
+GCAAAAATATCTTAACTATCTGATAATGATGGGTTTTAACATATACGGTATTGTTAAGCA
+GGCCCCAAAGATTGGGGCCTAGAAGTGTTATTGAACAGGGTGATGGGCCGGTTCAGACAG
+AAAAGGTCTTAGATCTATATGAACCGCTGCTGCATTACTGTCATTGGTCACGTTTAACGG
+GGCCTTACCCGGTAAAGACATAGTGGCAACGTCTGGACCAGAAACAGTAAAATTATTTTC
+TGCATTTGGCATTACTGTGAAAATTTTAATAGCTACATTCTCATGACGATACATTGAAAT
+TCCGAAAGTTGATCCAGCTTCAGTATTGCTGACATCAACTTCAACCGGTGTTTTCCCGAT
+CACTTCATTAGTAAGTATATTTTTCACAATTGCACCTTCTGGGGCAGTGTAAATGCGATA
+AGGGTAAGCACTTGCAGTCTGGCAGAAAAAAATACACAAAACGGTCAATATATATTTCAT
+GATTGCTCCTTTTGCAAAAATTCTAAATCAAATGATTGAGTGACTACAATTTGTTTGGAA
+TCAAATGAACCTGGGAATTTATATTTAATACTGAACAGTAATGGCAATGTGAGTCCATCT
+CGTGAAGACTGTGAGATGTTCTTAAATGAGTTATTAATAAATGTTAATTGGTCATTGTTA
+TCGTAACAAAGACCAAGTAAACCAACTGTGGGCACCGTAAAAATTGTAACTGAACTAGGT
+GATATCAACTGTTTTCCACGTGACGAATAGGTGCAACGACTCCCGCCGAGATTCAGATCA
+GACAACTCAATAAATTCTTTGGTCCCATTCTTGGCGAGTAACCAGACATCAGTGCCTGAA
+CTCTCAATCAGAAAAGTAACTTTTCCGTCGGTGTAGGCTTCAGTTCTGTTGCTCATTATA
+GGGTCGAACCCTACCGAAGGGAGGACTGCAATTTTGCTTCCAACCGACTGACATCCAGTC
+ACAAGTAAGGTAAGAATAAATGCTGAAACTTTAATCATTTTCAGTCCTCATAGTCGTTTT
+CTGTATGGTACTGATATCGAAGTTTTCTCCTGGGTAAATTTTCAACTCTTTGGTGAAATA
+ATCTGAACCACCGAGGAGGTTGTTACGCTTTCCAACCCAAACGAACGACGAAAATTTAAA
+AGTCCTTACTTTTTCTGCCGCTCTGATCTTGTAGGTATGTGAAGGTAATAAAGATGCACT
+AGCGTCCTCCGGGATTGCGATAGCGGGTTGAAGTTTTTTGGGGGCATTGATACGTAATGC
+GATTTCTGGAGAGGGGACATAGTCGATTGACGATTGTTGTGAATCTGACGGTAGGGGCAG
+GGTGAATTTTTTACCCTGATCTGGGCCAAAAATGGCAATAACCTCTTTTTTCTGCTTTGT
+TACGGACACTAACGCCTGTAACGGGGTACTGGATAGATCATTGACGAATGAAATTGTCAT
+GCTGGAACCAGGTTCTAACCAGAGAATTCGTTTCCCGGATGCATCTTCATCAAGGGAGAT
+AAATTTTGATATAAACACGCCATTTTTTGCAATGATGGAAAATTCAATTTTGGGTATTAC
+AAGATTTAAAGGAGTTGAAGCAGAGTCGTTTTCAATCTGAAGATAGTTACGCTTAGTCAT
+GCTTGTTTTAATTACTGGTCTTTGTCGACCATCAACAAGCCACATTCCGTTGACGTAATT
+TGCAGCAATAGTAATAAATTCATAGTTAACCCCAGTTTTGGCATCAGATAGCTGGGACGA
+CGGTATCGGGGTTTTAGTCGATGCATTTGTAATGTTGGATGGACCTAAAAATGCCAGCAA
+CGGCAAAATTATCAGTTCTAATTTAAGCATTATAATGTGGCCTCTATATTATTATCATTT
+GAATCCAGGTTAAGTGGTGCAGTGTTTTGTGTGTAAATACCGTTTTTATTCAGGATCATT
+TGGTGGCAAATCAGGGTCGGTGTAGATGCCAGGATCAACTCGACCAGTGTTATTGCCGGA
+ACTGTAGTAGGCGGAATACCTGGTGCCAGTAGTGCTGGGCTACTGATTTCTGACATGTAC
+AGAGAACCTGTATTGATGTGGAGGCAGTTTCCTATGAGTACCGGTAAGTTAGTCAGCGGT
+AGCCCATGGGCCTTTCTGATGCTGTTAACTGGATTCCGACCCAATACTACGAGGTTTACA
+TCGCTGACATTCACTGGCCTGACTGCGTGATCCATGCCGTATAGAAACTGACTCTGAAAA
+ATATTCACATTTGCCTGATTAAAAGCGAGGAGGGCGTTATATGTATTGTTGAAGCCCTGC
+CGTATGTCTGTGTAATCGGATGGGCAAATACCTATAGAAATATTGCCTTTAAAAAGCACC
+TTCATCACAGTAGCCAGCTGGGTGGAGAGCAGTTTGCAGATTTCCTCTTCAAGATAGTTG
+CGGTTAATTTGTTTATGCCATCGCCCGCCTCTTGCACACCACCGTTCATTAAGAAATGTG
+CTTGGATAATAAGTCCTGCGGTCTTTATTTATGGGTAAGAGCTTTTTCAGCATCTCTTCT
+CCGGCCCCGGCAGCTGAGAACACACGAACAGAACGGCCGTCAAAAATCCCTGTGTTGATC
+GCTGTCATTAACTCCATAGGCTCAGGTCCATAATCGAAGAGATTTCCTGTGGAGAAAACG
+ATCAACTCCTCATCAGGTTCTGATATCGAATGGATAAGGTTACATAGCGTCGAATAATGA
+CCATGAGGGTCTGCCAGAAAGAAAACCCTTCCTGAAAAATTAGTCAGATCAATTGTCTGG
+ACGTGCTCGGATGCCATAAATGCCTCTTTCTGAAATTGCATTAATACTACCGGATGAAAG
+TCATCAATTTTTTCGATAAGAGGGGTAATTTTTGTGAGTGTCCAAAATGGAGCTAGAAAT
+CATTTTTCGGTTTCCGAGCCGTATCAACTGTAATGCACCTCAGTTGTTTTATTTTTGGTA
+TAAAAACGCTGAGCAAAATATAGTTTTTGCGTGTGTTGCTCAGGTGTACATGAATCTAGG
+GTTGCATCTGGATTAAAACTGAAGGATTCTTTTTTAACAAGGACTTACGTTAGTGTTTTG
+TCCCGTTTAATGTTGACCTAAAGCAACCATTGGTGTATAAATTCCATAACAAAAGTGGTG
+GGCTAAATAAACCAATACGAGGGTTTCTGCATGACTGAATTAGCAAAAACAAAACTGGCT
+GTGGCTGAATCAAACTCTACTGAACTTGAGACACTCAAAGTTGTTATTGATGATGGTAGT
+AAAGCGGCAAAACTGGTTTGCACTAACAATCAAGGTGACCTTGTACCTTTATTGACTCAA
+AATAGTTTCGTTGCAGATTTCCGGGTAAGCCATGACGGACTTATTCCATTCAATTATCTA
+ATTGATGGTCTTCAACGATTCTCGCACCACAGCGAATCAAGCAATGCTTTAGAAACTACC
+GACGTTGCGCATCAGTACGATGAAATCAGTCGTCTTAATGTTCACCATGCTCTACATTCC
+TCAGGTCTAATGCCACAGGATGTTCATCTCTACGTAACTTTGCCACTCAGTCAGTTTTAT
+ACCGCTCTGGGTGAAACCAATAATGAAAACATCCAACGAAAAAAAGACAACCTGATGAAG
+CCGGTGGAGCGTTATATTGATGGTAAACGTGTTTCATTTAATGTTGTTTCAGTTACCGTT
+TTCCCGGAATCCCTTCCAGCGGTAACGCGTGCTGATGAAATCGAATCAATTGAATCTTTT
+GAATCAAGCCTGGTTATCGATTTAGGTGGGACAACACTTGATGTTGCAAGCATTACAGGT
+CAGCTGGAACAGATCTCCAGTGTCAGGGGTTTTGACCGTATTGGTTGCTCAATCGTATAT
+GATGAAATCCGTCGTTATTTGGATTCTGCAAAGCTGAATGCAAGTAACGCCTATATTCAT
+CACCTAGTCGATAATCGTGAAAACAAAGCCTCGCTCAAGGTGTCCCCGGAAGATCTTGAC
+GGCGTGTTCAATGCTGTTAATGGGGCTGTGGCGCAACTTCAAGAAAAAGTGATTAAAGCA
+GTCACTCAAGTGGAAGAACGGCCGCATAATGTTTTCCTTGTTGGTGGAGGTTCTTACCTG
+ATTGAACCGGCAGTTCGTAAACATTTTGACAAATCGAAAATCATCATGGTTGATAATCCG
+CAATTCGCACTTTCACTGGCTATCGCAGATACTGTTTTTGCATGATGATGGTTTTGCATG
+ATGATGGTTTTGCAAAGGGGAGAGTTTTATGACTAAAAAATCTGAGAAGGAAAACGATCG
+TATTCAGATTAGTGCGTTTTGGTTATCGGAACGACAATCTCCGTATGCATATAATTTTTT
+GAAAAAAAATTCCCTAACACATCGTGGCGAGCAGATTTCTCTAATAAGATCTGCAATCAC
+TACGGGGTTAGTGCTAAATAATCTCTTCCCCGAGTTATCTAGTTTTATTAATGGACTGAA
+TGAGAGATTAACAGCTGCTGATCTAAATCGATTTTTTAATGATGAATTTAATAAAGACAA
+ATTAAACAATGAAAATTTGAAAGAACAAATAAGCTTTATGCTTGATTCGAAATTCAATGA
+ATTATTTTCAATGATTAATGGCTGTGATTTTTCTAAGGCAACTTTTTCAACTACTAGTCA
+ATCTGATGTCAGTGAAACATTAAAGGCAGAGAGGGTAAGGGATCAGCGGCTGGAATTAAT
+ACCTAAAGAACTGACTGTAAATCCCAAACCTGAGACTTTAGAGATTTTAACGCCGATTGA
+GAGCGCAAAAAAGAATGATTCAGGTTTAAATACTAGTCATGGTTCTGCTGCTGTTAGCGC
+CTCACAAAGCGAAAACACGGTGCTGAGTGAACATGCGCAAATCCAAGGTGTGACAAGGAA
+GCCGAAGAAAAAGGCCAATGCAAACCTCGCAAATCTTGCGAAGTAAGTATAGTAATATCA
+ATTGATTAGATTGAGTTATCTATTAATAAAAAGTCAGCTTACCAGCTGGCTTTTTTTTGG
+TATATTATTAACAGGTGAGGGGGAATGGTAAACCGGTTTCATGTACTAAATGAATCCCTC
+GTTGTCACATCTCCAGTTAAGCCAGTTTGAAGAATTATAGAGCCAGTTCTAAGAAATCAT
+TAAAATTCGCGTGGGTTGATTCAGGTCGAACCAGTTACGATTTTGGATAAATTAATTTTG
+GTTAGGTAAACCACTAAAAAAAGGTGGTTTAGGCCCCGTTTACTGTTCTTTGTTTGCACG
+ATGTATGTATAGGTGTTAAAACGGGTACAGATTTTTCCTAAAGTATTGGCTGAGATAGGA
+AATATCTTAATAAAATTGGTACTTATTTATTATTTTATGTAAAAAATCTCTATGCTTTAC
+TGGTTAAGTTAGATTTTTTTGTTACCCTAACCCATAAGATCTTAATGGTTACTACGCTGC
+AAGCGGGAAGATGGTAAGGAACTAGCGGGATCATGTGTAACTATCTGATTATTATAATAA
+AGGCTGACTGAATGTTATCACGCAACTCACTAATACACGGTTTACGTCGAGATCAGTTAA
+TCGAAGTTCTGTCTATTTCTGAATTCCCAGTTGTCCTGGTCGAGAATCCCTTCATTCAGC
+CTAAATCAACAGGCAAAAAACCAGTCATTTTTAATATTGATGAATTTCATGTTTCCATTG
+CCCCAATTTCATCGCTTAAGTACGACTGGGAGTGGGCTCCAATTGATACAATACTCATCG
+AAGTGGTCATTCCGCCTGCTGAAGCAGACCTGGTAAGCGCCGAGAATGATTTCCTTCGCG
+ATGCAGGTATTGGCCATATTCAATGCGAGCCTGGAGGCGTTTCGATACGCCGTACAGTGA
+CATTTGTTGGGGGGATCACCGCCGACAATTTGCTGTATCAACTCAGGCTTATGTGCGTAA
+GTGCTTTACACTTGATTGGAGAGGAACTGGAGGATGAAAGTTAATTTTAAAAAGGTAATC
+CCCCTTTTAATGGTTGGTTTAACAGTGGCGGGGTCTTACTCGATCTTTAACGCAAAACCG
+TCGAAGCCTGACTTGTACGATTTTACTGGCAAAGTTCTTAAAACCACTTCTGTTTTCCAA
+CCTTGTGATAAAGAATCCACACCTTCGTTGAACATCCAGATAGCAGATAACGGAAGCGTA
+CATATCAATGGCGTTGCATCAAAAGTTACTTTTGTTGAGAGAGTTCCGGGTAATGAAATT
+GCAGTTAAGTGTACGGGTCTGCAAGTCAAAAATTCCCGCCTTGTGCATACGAGCTCTTAC
+ACCATGATAATTTCGGAAGGAAAAGGTGGTTTTGTTATTTCGGATTTGACGCACACGAAG
+GATAATGAAGTTATGTCCGGTACATGGTTCTTTAAGAAGAGAGTATGACAATGAGCGATC
+TGTCAGCAACTGGTGCGAAGCCTCAACGGGTCAGAGTATTCAGCCAATCTGTCGCGATGG
+CATTCGAAGTAAATCTCGACAAAAGTCGCTCTGCTGATAATTCGGCGTTTGTAACTGAGA
+CTGAAAAGTATTACCTGTCTCTCCAGTTTGCTCCTCCGTCTGACAATAGGGAATATGGAT
+GGAATTCAGAGGGCAGCATTCTCATGAAACTATCCCAAAACGAAGCCATGGCGCTGGCAT
+CTGTTTTTCTGAGAATTAAGCCGACACTAAAATTTGAAAAGCGTAAGACCACGCATCGCA
+CTCACCAAGCCTACAAAAATATCAATATCGGCCCCAACGACCGTGGGGGCCTTTTGGTAA
+GCGCAAGCATTGTACCGGTTAAAATGGGGACGTTTAAGCCTTTAAATTATAACCTTCCCG
+TAACACAAATGGATTGCGTTTCAACAGGCTTGTTCTTGTTGGGGTTCCTGACACTTAAAA
+TGCCTTGGGTATCCTCAGAATCGATAATTACCGCCCTTCGCCTATCTGAGTCTAAGAGCG
+GTCAGTGAGCTAAAAAACCTCAATTTCCTGCAAAAATTTAATGTTTTTTTTCCTCTTTAC
+GAACAAGATTTCAGAATTTTTTAACGTAGAGTGATTCTAATTCTGCGTAAAAAAACAGGT
+GTTCGTCATGAGAAAATCAGGTTTATGTTTAACCCTGTTGTTTTCTTTAATTGCTTCGAT
+TAAATCGGTACAAGCTGAGGCAATTATGATTTCCGGAAAACTCCAGGCTGATATGCCTGC
+CGTCACGTTTAATCCCGGCCCGGGCGATTTTGTTGCATTCGTCAACAATAATACAATTAC
+TGCTTCAGGTACTGGCAACGCATGCAATGTGACGGTTGATGATCGTGCGACATCAAGCGT
+AGATAACTTGGTCTGCTTTTTTGAATGGCTTCCAAATACCTCTGGCTTTACAGCAAACGG
+ATTCAATTTAACAGGGATACCCAATGCGGCAGGAGAACTAAAACTGCCGTATAAAATTTC
+TTATTTTTCTGGATCAGAAAGGCAGAAAGTAGAAGTGGTTAATGGGGAGTATACAGTTAA
+TGCTCTTGTACCGGTTAAACCGACGATAACGGGCCTGAAATCGTCTATGAATGGAGTGGT
+TCAGGATGGTTACACTCTTAAATCCTATCTTAAGGATGAAGCAATTAGGAATGTCACTGT
+CTCCGTAGAGCCTCGCAATTATGTGCAATATATCTCTATCGGGTCTGGATCAGCTTGCGA
+AGTCGCAATTGGTGGGAATGGCTGCACGATCGATGTTGGAAGCATCAAAGTAAGTGATTC
+GGATTTGCTGATGGGTTCACGGGAAATCACGGTCACTGCCAATTCGAAAAATAATTACTT
+TGCCCCTCCTGAAGCGCAGAAGCTAACGCTGACCTGGGATTACCGTCCTCCTGTTGTTGA
+CCATACTCTCTGGAATTTCACGGATGAAGCTAAAACAATAAGTGTTGGTGGACAGGAGAT
+CTATACAGGAGCTAGAACGGTGGCCGTAGCCGTCAAAGTGCCTCAGGAAGGAACTGAGGG
+TGAGTGGTGGTTACCAACCGCTATGACGCTAACGATGAATCCTGATGGGGTGTTTAAGCC
+GACAACAAAAGTTACTTTAGAAGATGGTACGGTTATCGACTTTAAGCAATCCTGGGCAAC
+ACCGCTACGTCGTACTCTTCAGCCCGTGAGCGGGCCACAGAAAGTCGGCGATGAATATCT
+GTATATCTTTGACTTAACAGACTTGACGAATGGTTCTTATGCCGCCTCGTTCACGGTAGA
+GAACAATAGCAAGAATACCTCTACGTACAATGAGCCTGAAAGCAAACTGATGCTTTCTGA
+TAACCCAACACTGATGGTGCTTAAGGACGGTGCAGCTCTGGCCAAACGAGCTCCTGTGTA
+TTTCTTAAATGAAATTATTGTTGCCGCATTCCAGGGCCAGGCCGGAGTCGCGGATATTAA
+AGCTGTTACGATAGATAACAAACTTGTTGAGCTCACCCCCACGAACCACAAAGGCATTTA
+TTATCTGCCGGTTGGGGATGATCTAGAAGTGAATGCTGACCATGAAATCACGGTCATAGC
+TGAAAACCTGTACGGCAAGATTGTGACATTTAATACTACTTTCACGTATCAACCAACAGG
+ATTCACGCTTAAAAACTTTGAGAAAGACATCACATTGTACTCACGAGTTCGGCAGTATAC
+CGATCTCATGAGTCAGACGGCCGGTGATAAATGCACTCTCTTTACTACAGAAGAGAACGC
+ACTGGCATACCTTGAATGGTATGGTGACAAATCTGATATCACCGCCTGTTACCCTCAGTG
+GAACAATGTGCCTGACGGGCTTGAATTTTACTTTAAAGGTCGGACGCCAGGCCTGACAGG
+GTTCTTCAATAAAACAGGCGATAACCTGCTCGACTATCAGGTCTATATGATAAACGGCAA
+GGGCTCTAAAGCTGTATCGTCCAGAAACCGCCATGTGCTGATTACGCAGTTACCTTATAA
+CCCGGTCCTTACCTACAAGAAAAACAAGGTGTTGACGGGGATTAACGATAACACCGCACT
+GGCGTATACCACTGGCGGGGAAGCAGCTCGTCTATTGGCAAAAGTGGTTCCTGCTGATGT
+GACAGTCTATGTTTCACAAAACGGGGGGGAAAGCGTAAAAACGACGTTTAAGAACCGTTC
+ATCAAATAACGATGCAACGACGTTTGTTCAACGTCTTAAAGTGGCATCAGCCCCGTTGTG
+GACGAAGAATGTCTTCGACATAGCTGTCGAGTACTCGAAGGAACCGACTATGCGAACCGT
+TGATACGCTCAATGTGTATACGGTACCCGACTTTAACATTAGAGCGGCAATGGAAATTGA
+GGACAAAAAGACTGCTACCACGATGGAATTGCCATTGAAGGTGTCTGTTGGCCGCTATAA
+CAATTCAACCCGCAAAAGTTCATTTAGTCGGACAACAATGGGGGACTGGGATGTAACCAT
+TTACGCTCAGAAAAGTGTTTATGGAAAAGATCCAGAAACAGGCCGATATAAAACGACGTA
+TGAACGTACACCCCTAACCGAAGCACTGCCCGTGAATGATGCCGGGGTGGTTGAAACCAA
+GATCAAGATAGAAAATATGGACCTCGGGAACGTGCGACTTGTCGGGATTGCTAAAGTACG
+ATCGCCTTTCGCAGATTTCGAACTGACCCGGGAAACCAGTGCAGTTAGCATCCGTGTTTA
+TAAGGGCGAAGAGCTAGAAGGTAATCTCTCAAAGAGTCTGATTATCGGACGTATCCCGCT
+CAGTACGCTTGTTAACTTCAAATCGGCCAGTACAGCTAACTCCGATGCGCTGGCGCCTAC
+CGAGTGGCAGGAGTCTTCTGATAATGGACAGACATGGACTATGCTTCAGGACATGACAGG
+GAAGCGAAGCATTTCGATCAGGAAAACTGAGGTTGGTAAATGGCTTTACAGGGCAAAAAT
+GACCAACAAGTTTACGTCGAAAGAGTCTTATAGCGACGTTCTGACGGTTGTAACGTACAA
+ACAGCCTAAGCTGAGCATCGATGTTGCTGAAATTCTCGAAGGCGATGATTTGCCTGTCAC
+GCTGCTGGATAACGATGAACCAATTCCGCAGGGTACGGCCGAAGTGATGTGGTCGGAGGA
+TAAAGTGAATTGGGTTCAGGGTGACACTACCTATAACGTATCGGCCGCTGATACGCTACC
+TCCGACCATTTACGCCCGAATGCGTTACCTGGATTCTGATGAGTTGGCTGAAGAGTCATC
+CTGGAAAGAGACGTCTGCCCGGTTAACCGTCGCTAAACCCAAGCGCCTATCTGTTTCAGT
+AAGTGGTATTTCAAGCGTCGAGGTGGGAAGTAAAGTTACTTTAGATGGTAAATACACTAA
+CCCGAACAGCCGATTCAAGAACGGAAATGACGTCATTGAAGAATGGACTGCCCCTGACGG
+ACAAAAAATCAGAGGTGCGAATCTGTCGATAACTTTGACTGAGCAGATGCTGGATAAGCA
+AGGATATGCGGCATTTGAATACAGTGCATGGCTTGCTGACAGTAAGGACAGTACTATTTC
+CACGCGGAAAGTATCTGTTAAATCTTGGGTGTATAAGTTTCCTGAGATGAAAGTCAGTAC
+AAAGCTTAAATACACCATGGCCCCGTCGACCTTACATGTTGCGCTGAGCGGAATAAAAGA
+CGGTGGCTATCCTGGGGTAACTTATTCTCGGGAATGGATCTACGATAAGGACAATATCTC
+AGTTTTAAAAGATGATGGTGATACGAAAGAATTTGCAATTGCGAAGCCGGGGAAATATAC
+GTTGGTAATCGTTTTCCGTGATAACCGTAACAACGAACAGCGTATTGAAAATACCTTCGT
+AGTCGATGAGCAAACGCCCATGACTGTAGAAATGACACCGAAATTCTCTAATAAGTTCAT
+GAGGGCGCCTCTTGATGTCACGCTAAGATCTAACATTAAACTGGCGCACTCTGCTGACAG
+TATTGATACTGTGACATACAAAGTAAACGGCGAGGTTGTTCCTGGTAGTAAAAACTATTG
+GGCTCAGTTAATTTCTGGTCTTACTGAGAAGAAATACGAAGTCACGCTGGATGTTGTCAG
+TAAAATGGGCCAAAGAGGTACCGCATCAGTTGATTTTGAGGTTGTTAAAAACGCGGCTCC
+GCAATGTGCATTAAGCTACACAGAGTCTAATATGAGCTGGAGTTTCACAAACAAATGTAT
+TGACACTGATGGCAAGCTGGTTCGATATGAATGGTATATCAATGATGAGCTAAGGAATGT
+TTTCGGCAGCACTGCGACACTGTCCAAAAACCTTAATCGTGGGAAGCAAGATATACGAGT
+TGTCGCGTATGATGATAGTGGGGATTCAGCAACTCAGCGTACGACCGTTTATGGTCCGGA
+TGAGGGCGCGTCAAAGTCCGTAGATTCAGTTGAAACCTCGCAGTAAGGCAAGCTAATGAA
+ATAACAGCCGGGGCAGAAATGTCCCGGCTTTTTTGTTTTTCACTTTTTGATGGGGTAACG
+TCGGGAAAGTTACTTTACATGAGTAAGACAGCGGCCAGGACAATCACAAATCAAAGACGG
+AATGAAAGAAAAAAAGGCGGTAAATAATCAGAAATAGCTGGCTTTGCTGAAATAAGGAAG
+TACCAAAACATGGATAATAGGTTTTAAGGTAATGTAAAAGACAGTCCATTTTGCTTTCTG
+ATTCTGAGAGAAGTAGGTTATGAGAGAATACATACCTAAGAAGCGTGGTTTACTGAGTTT
+TGATTGGTACGTGCCAATAAATCTCGGAATCCTGATACTGGTTATGTTGATTTTTTTTAA
+TCGATTTACGTTTGGTCATGGACTATTAAATGGATGTTTACCTGCTGATTTTTACATGAT
+CGATCTGAAGGATAAATCGGTAAGTTCAGGGAATATCATAGCTTTTCATATGCCAAAATC
+AGTCCGTTTTATACGTGAAAATGAGAAGGTTATTAAAATTGTGGCAGGAGTCGGCGGAGA
+TCGCCTGAGGGTCACATTGGATGGTGTTTATAATGGGAACAAATTTTATAAAGCCAATGC
+CAGACGTATTTCTGTGAAATACGGCATACCTGCCGAGACCATTGAAAGAGAATTAACTAT
+TCCGGAAGGGGAGGTCTTTTTAATTGGGCAAACGGACCACTCATGGGACTCACGTTTTTG
+GGGGCCGGTTAAGTTGACTTCAGTTATTGGGAAAACATATGCGATCTTTTGAATTAAAAA
+CAACTATTAAGCCTCTGGCCTCCTGTCTGGCATTTTACGCCTTAATATCCACCGCTGTGG
+CTAGCCCCCAGTATCAACAGGTTGCTGATGACATTGCAAGGCAAGCTCAGGTTCTGGGCG
+CCCAAATACCGGTACCACACGCATCAGAAGGTCCGCTCCCGTCTGGTTCTCTGGATTCTC
+CTGATACCAAGAAATACATCCGCCAGGCCGAAGCTATGAAGAAAAACGGGGACCTCAGTC
+AGCAAACAAATCGCGGTTATGTCCCGGGTATGAATGCTGACAGTGTGCAGGCAGTTATAG
+ACCATACGCAGGCTATCCGCGCTCAGAGTAATAACTCGGAAGCAGTTAACGACATCATTC
+GCAGACGTGATGAGATTCAGGGAAATTCACAGCTCAGCGAGTCTGCACTGAAATCCGTCG
+AAAATAAACCAGAAGTTATGCGCAGTCAGTCTTCGAATATCGAAAAGATGTTTGGTTCAT
+CAGGAATCACCGCCGCTGACTTCGAGCGTAAAATAGACAGCAGTCGGGAAGAGGTGCTCT
+CGACAGAAAACGGTATCACTATCTTTGCGTCATTTAGCTTGCCTGATTACGTCCTGGAAG
+ATCTACTCCGTACCGCGTCAGAACATAAGGCGAGAGTGGTTTTTAATGGTCTGAAGAAAG
+GCACTACACGCCTCCCTGAAACTCAGGCAGCTATCAACCAGCTGGTGGTGAAGGGGAAGT
+TTGACTCCCCACTAATTACGATTGACCCGGACGCATTTAACCAGTACCAGATCACGCAGG
+TCCCGACAATAATCTCCCGTGAGCAATCCCGGTTTGCAAAAATGGTCGGCTCTTTCAACG
+TTGATTTCTTCCAGCGCGAACTGGCCAGAAAACCCGACCAAGATCTTTTCCCGATTGCTG
+GTACGACCTATCCGGTTGAAGAGAAGAGCATTATTAAAGAGCTCGAAGAGCGAGCACAGA
+AATACGACTGGGACGGCGCCAAGAAGAGAGCAGTCGCTGATACCTGGAAAAACCAGTACA
+TGGTTAATCTGCCTCCCGCTCAAGAGCACAAGGAATGGCTAATCGACCCGACAATCAGGG
+TTACTCAGGACGTTAAAGATAAGCAGGGTCGCGTCATTGCTTCTGCTGGCGAGCTCATTA
+ACCCACTGGCCAGGTTCCCGCAGAACCTCACAATGATAATTTTTGACCCAATGAACCCAG
+GGCAACTTGAGTGGGCAGAGAAGCAATATCGCCAGCGTCTTGGCAGCGGTCAGGTGATGC
+CGATGTTCACGCGCATCAAACAGGAAAATGGATGGGATCATTTGAATGATCTGCGCGAAA
+AATTCAATGGGAAGGTGTTCAAAGTTAATGAGCAAATTATTGCTCGTTTCCAGATAAAAA
+ACACGCCAGCGCTGATCTCCACTGAAAAAGAGAAATTCCGTATAACGCAATTCAGTGAAG
+CTGAAATACGTGGTATTGGAACAAAAATCGCGGCAGAGGAGAATTGATATGAAAATAGGA
+TTTATTTTTGGGGCGCTGCTGGCCACTTGGCTGACGCTAACTTACCCGGACCAGATGAGA
+GAGTGTTTTAACAAAGTGGTTGCGTATATGGAAAGCGTGACAACATTCATTACTAAATAG
+TGAGCGTGCCGGTGAAGAAGCTAAAAAAGTTACTTTTGGAAATATTGATCGCTGTCATGC
+TGTCGCTCTCGCTGCCTGCAATGACAATGGCCGCAGATACCGGTGTCCCGGGAGCAATGT
+GCCAGTCAGCGGGAGTATGGCAGGGCCTAATCAAAAACATCTGCTGGAGTTGTATCTTCC
+CGATGCGGATCATGGGAATTGGAGCAGCCCCTGAAGGTGCCGCCCCCTCACGCCCTGGTT
+GCTATTGCACGGATCAAAATGGGATACCAGAAATCGGATGGCAGCTAAGTTTTTTCCAAC
+CAGTAAAAATTGTTGAAGTGGTGAAAAGTCCGTGGTGCAGCCCATTTTTAGAGGGAACCA
+TGCTGCAAAAATCACAGTTCGACATCGGCAAGAGCAATACTAACCAGCCTATGACCGCAA
+CAGAAGCCGGATTCTACGACGTACATCTCTGGGAATTCCCAATCATGACGATGTTGAAAT
+TGCTGGTTATTGGTGAATGTACAGCAGAACCTTATGTTGATGCCAGTCTGACGTATATCA
+GCGAAGTAGATCCGATGTGGGAAAGTGACCTATTGACGCTCGTGCTAAACCCCGAAGCTG
+TGGTATTTGCAAACCCTATCGCCTCAATGGTATGTGCAGCTGACTGCGTGGCCGTGACTG
+CCGGGAAGGATAATTTGGCTGCATATTTTTGTGCCGGGTGTGATGGGAACCTTTATCCGT
+TAACTGGACACATCTATGCGAATGATGATGCCGTCAGAACCAGCTCACTTATAACTCAGC
+GTCTACTGACGAAGTTACATAGGCAGGGAATGCTTATGAGAACAATGGGAGCTGACGCAA
+TGTGTGAAAAAACGTGGGAATACTTCACTCCTCGATCTCAATACCGACTTTCAATGCTTT
+ACCCAACGCCGGAGGCGAATGGTCCGGATTGCTGTCATCGCCTAGGCGATTCTGTCCATG
+ACTGGTCAACGCTTAAAGGTGGACGGAAAAAAATCGGCATAGATAACTATGTTTACATGC
+TGTGGCGCTATAATGATTGCTGCGTCAGGTATATACCCAACTAATTGAAAAAATTGAGTA
+TTATATATGAAACATAGAAAAATAATTTCTTCAGCAATTATTGCGTCTATGATAGCTAAT
+ACTATGAGTTGGGCATTTTACGTTTCGCTCATAAACATTGCGTTAACGCCTAAAATATTT
+GCGGCAGATGCGATTTTTGACCAGCTTGAAAACAATTTTAACCTTGCCAATCCCAACGCC
+AACCGGAACGCAACCACCAGTGCTCAGGATATTGTGGAAAAGTATAAAAATGCTGATTCC
+GGGGAAAATCTGAGCGGCAAAATTTCCGAGAAATATGTTGGTAAAGCAGAGTCAACAAAC
+CTAAATGTTGGGAAGTACGGGACGCCGAACTCAAATGAAAGTGTTATGAGTAATGCGGTG
+TCCGACGGGAAATCGATCGGTAAGGCTGTACAATTACCTAGCATGTCGGGCGGTACAATT
+AACTCGAATTATACGAAAGAGGGGGCAAAGTTACTTTCTAGGGACAGCAGCGGTAATATT
+GGAATAAGTAACAACCCGAATACAACGGCAGGTACCAAAACCAGTACAGGGGAACTATTC
+AGCTCAGAGCAGAAGCACAGTGATGTTCAGTTCAATGCTGGTGGCCGGTATGGAGATGAA
+AATGGCTTCATCAATGACATCAAAAATCGAAAAAGTCAGCTGTTTGAAGCGCAAAGTTAT
+GATGGAGTCGCCTACCGTACTCTGGTGAATGCAAATAAAGAAAACCCAGCATCTACTATT
+AAACCTAACGACCCTATGTTCAATGCGGGTCGTAACGAAATAGGAAATGCTGTAGCTGGT
+ACAGGAAACTGGCTACAGAATTGTAATACGGAAACATCAAAACAAACAATTACTACGCAC
+TATCCAGATTACAAAGAGTTTTACTGCAATTCACCCAAGAAAGATAATTTTAACAGTTGC
+ACGATAACTCGTGATTTTTCCGTGCCGGTTTATATCTCAGGTGGTAATGGTGATATGTCC
+ATGTGCGGAGATAATTGTGTGAGAGTCTGGTTTGGCAGAAGGGACGACAACTATTGGAAC
+GATGGAGTCTATGACAACTCATTAACCTTAAAATTCCATCCAGATGCAAAGCTCGCAACT
+GCGAAAATAATTAACGCAGAGTGGGATGACCATATGAGGGTCACGCTTGATGGTACACAG
+ATTTTTGCTCATATAGATGGAGCATATAGAAGTAGCAATTATCCATCTCCACAAGGTCAA
+TGGGAGTTAAAGAAATCCTGGAAGCTCGATAAAGTCTACGATATTACTGAACAAGTAAAA
+ACCTCTGTATATCAGGAGCAGGATCGTGAAGTGACTATGGCTTCGCGCGTATGGGTTGGC
+GGTGGTGGGGAAGGCTATTTTGAAGTTGAGATGACTTTTGAAAATATGAAGTTGGAGGAT
+AAACATATACAGGAGCCCGCAGGATGTTTTGATGCAGTACAAACGCCGAATTCATTCTGT
+CGGTTTGACAGGTTTGTCAACATGGATGTTGGTACAAAGCGACTCCCGGAAAGTGTGCTT
+AAGATGGCCACACCGCTTTACAAAGGTGATACAGGATACTTAACCTGGAAAACAAACCTT
+GAAGGCTATTTCTGTGATCCCCTGGCGAAGGAAAAACTGTGCTCTTATGATGCGAAGGGA
+AACATCATGAAAGACCCCACAGGCAAAGACCTTTGCTACAACTACGACGATATAAAAAAT
+ATGCCTGACGCATGCAGCACATATAAAAATGATGCTGCGTGTGTGCTAGATAATCAGACA
+TGTGCTGAAGGTTGGTTCGATGAAGGCACAAATACTTGCTACATGTATGAGCAGAAATAT
+ACATGTGACAGAGGGAAAGACGTAGTCAGAGAGGTAGAGTCACAGACTAACTCCTGTGTA
+GGTATGATCCCATGTTCTGGCGGAACATGTGAAACAGGCCCAAAAGAAGAAAACAAAGAT
+TTTGGGAAAGTGGCCGCGTACTCCAATATGGTTCAGTACATGCAAGGTGAAGCAAAATGC
+GAAGATCCAAACGACCCTAACTCCTGCTCTGTCTTTGAAGGGAAAGCAGAGTGGTGCGGC
+AGGTCCGTTGGTTTTGTGAACGGACTGGCCAAAACAGATTGCTGCGAAAAGCCGCAGGGT
+GCTGCTGGGTCACTGGAGGCGATAATGCTGGCCGGGTCGATGATCCGAAACACGAACTGG
+ACCCGAGTGAATGCTCAACTGGTAAACTGGACTGGAGGGGAGAGCGGAACCTGGGCATCA
+ATGGCTAACTCAGTGGGTGAATGGACTGCATCGGCAGGTAAAACTGTCGGACAAATGTGG
+AACAATGTGACCAGTTCAATAACCAGCGTTTACGAAAACGTGGCCGGTAACCTTGGCCGA
+ACAGTAGGATCATCCGCTGCTGGTGAAAGTGGTCAGCTTGCTAAGGAGACTATGAGTTCA
+TTCGGGCTTGGTAAACTTAAGCAGATGGCCATGGAAAAAGCCTATGACCTGCTTCCCGAT
+ACAGTTCGAGACTTCGTATTTAAAAATGTAGCGACAACGGGTGGAGAAATAGTCTTTTCT
+GCTGCTGTTCAAAACTTTATGCTTGCATTAAATGTAATCGGCTGGATTTATACGGCATAT
+CAAGTCACAAAAATGCTGCTTGAAATGCTGGTGGCCTGCGATCAAAAAGAAATGGAAGCA
+TCTATTCACAAAAATCAGAAATCCTGTTTTACACTGGATACAAACCGTTGTGTTAAATAT
+CTGAATCTGGGATTTACAAAGAAATGTGTTAAAAAAGCAACAGACATGTGCTGTTACAAT
+TCAATGTTATCTCGCGTTATTATGCAGCAGGCCTACCCGCAGCTTGGAATAGACCCGGTT
+ACTTCAAACTGCGTTGGCTTATCAATAGGGCAGATCCAAAAGTTAGATTTTGACAAGATT
+GATTTAACAGAATGGATTAACGATGCTGTTCAGGTCGGAGAAGTACCGGACCAGTACGCT
+ACATTCTCAGAATCGTCAATAACAGCAAATTTGCCATTTAAAAACGAGAATTATCAACTT
+CCATCAGAAAGAACAAAAGATGCAATGGGAGGAGAGGAGAATATGATAAAAGCCAGACAG
+GAAAACGCTCAGGCCATTAAAGAGGAGAACGTAGACTGTAGCTATCTTCCACGCCCTGCG
+ATTTGTGAAGTTGGGTCAACTTATGTAGATCCAATTACAGGTAAGGAAATACCAAAATAT
+TAAAAAAAAGGGCTATTTGCAAACTAAGGTTGGAATTCCATCATTCTAGCCTTAGATCTT
+TGATCAAGTGAAGTTGCTCACTTGGTTGGATTTTACCGTTTCCTGACGGCTTTTCAGAAG
+CGAGGGCTGGTTGGAATGCCTTCCAGCTAGAAGTCTTGCAGATGCTCTCCGGGCATTAAC
+TCATTGTCGAATCTGCACCAGTATCACTAGGTTGTTGAGCGGGCGATTAGCTTTTTCACT
+GAGCCGCTGTACACTCGACTGCTTCAAGAAGCACTACTTACCATTTGCCTGCCGTAAGGT
+CTGTTCTTAGCTGGATTTTTTTGGGAGGATACGCAGTCATGACAACTCAATCCAGCTCAA
+TACAATACGCTTACGCGCTAGACGGCGAGGGCACCCTCACGCACATTGGCGCTGCCCTGC
+GCTCACATACTTACACCTGCCCAGGTTGTAAGAGCCCCCTGACCCCGGTAATGGGCGAGT
+TCAACGCTAAGCACTTTCGCCATTCGGAAGAATGCTGTGCCCTTGAAACCTATCTTCACA
+AGTGCGGCAAAGAAGCATTCTTCTATCGCTACCAACAAGCTCTCAGCCGTGAAATGCCTA
+TTAGCCTTGAGCTGGAGCGCCGGGTTGCCTGTAATGGTTCTCATTTAGCCTTGGTTAGAG
+ACGAAGCACGTCAGTGCGTAAAATCCGTGCCTGCACGCTACAACTTGACTCAATTTTTCG
+ATCAGGCAGAGCTGGAAAAACACGATAAGGTCACAGGGCTGCGACCAGACGTGATGTTGT
+ATGATACGACTGGCGAAAGGCGTTGCTACGTAGAGATTTGTGTCACACACCCCTGCTCTC
+AAGACAAGATCGAAGCCGGTATCCCGATTCTTGAGTTTAAGGTCCAATCTGCCTCTGATA
+TTCAGATGTTGCTTACCGGGGCCTACTCGATCAAGGAGAAGATCCTGAGAGTATTCAACT
+GGCTTCCCCCGTTTCAATCTGTGGACACCTGTAGCGGCGTCTGCTCAGTAGGTAACGTGT
+ATATGTCTGTCTGGAGTTTAAGTGGTTCCGGCCGACTCTACGAACAAACGATGCCGCTCG
+CTGAAGTGGATTTAACAATCAATTCTGACGTGAACACATGGCCTAGATCGTTAGGGGCCG
+CTGAGCTGGCTGATAACTTACGAGCTTTTATCCGTCACGCCGATCCTCATTCACTATTTC
+CCAACTGCATTATGTGCGAGCAAGCAGGCCGATGGGAGGATGGCTATCTGCAATGTCACA
+GTAAGGCAAAGATCGTTCCCTACACCGAGGCCCGTCAGTGCGCCAATTACAAGGTTAAGG
+CATGACCAAAAGACTGACTTGGGAGCAGAAAAGTATTGTCAACCATGACACCGGACATGC
+GTTGGTAAAAGCCGTACCTGGTAGCGGGAAAACAACCACACTTGTAAAGCGCGTTGAGCG
+GCTGGTCAAGACGGGAACTGATCCTCGCTCCATTCTGATCCTGATGTACAACAAGTCGGC
+GCAGGTGAGCTTCACGGAGAAGTTGAAGACGGCACTGATGTCGAGCGTGATTCCAGAAAT
+CCGCACGTTCCACAGCTTGGCCTTAAAGATTGTTGGTTACGGAGAACGCCAACAGATAAT
+CAAGAAGAAAGACCTCATTACTCCAAGCGACTACCGCTATGAGCAACTGGTAAAGCAAGC
+CTACCGCTATGGCTTTGACCATGAGGCGAATTATATTGACCCCAATGAAATTGAAAACTT
+CGAGCTGTTTATTGCTCGCTGCCGGGCGGCGGCCGTAACTCCTGTTGATGCTGCCAATGA
+TCCAACGTTCAGCAACATCAAACGGGGGTTTATTCACGCCTATGGCCGCTATTGTGAGCT
+GCTGGAGGAAAACAGTCTGCGAACCTTTGATGACTGTTTGATTGAGGCTGTCGCACTGTT
+GCGTAATGACAGCAGCCTTGGTGCCCACTTCAAGCACATCATTGTTGATGAATATCAGGA
+CGTTAACCTGATACAGCATGACATGACCCGCTTGCTATCTAAGTCGGATACGTCGGTTAT
+GGCTGTTGGTGATGTTAACCAGTGTATTTATGAGTGGCGTGGTGCTCGACCAGACTTTAT
+CGGCGGACTGTTTGAAAGGCACTACCCGAATACGAAGGTGTTTCAACTGTCATGCACGTT
+CAGATTTGGCCATGAGCTTTCCTTGATGGCTAACTCGGTAATTCGGCGCAACTCTACAAA
+GCTGACCAAGCTTTGTGTCAGTCATCCTAGCACCCCCAAAACAGAGGTCAGATTGCACTT
+TGATAACTGCCTATCCAAGGTGCTATCAAACCTCTCGGTGAGCAGTGGAACACAAGCCAT
+ATTGTCCCGCACTAAGGCGAACCTTGCTGAGGCGGAAATTGTTTTACGCCTGTGTGGGCT
+ACCTTATCGCTACCTCAATGGTTCAAGCGCATTACACACCCGCACCGAAATCGGGATACT
+GGTAGTTGGCGTCTTGCTGTCTGTGTACGGCGATCTGCGGCTACTGGAAAACCATCCCAA
+CAAACAAGCGATTGTTTACGGCTTTCTGAAGGAGGCTGGTTTTAGCTGGCAGAAAGGGCA
+ATTCAAAGCGGCGCTCAGTGGATTGATGGCTCCGCACGCCGACCTATGGTCTGCTCTAGG
+TCAGTTATTCGAGGGCGCACAATACCAAAAAGATCGGCTGGGCAGGCTCGCCACTATCTG
+CCAGAAAGACGGAGAGGAAACGCCTGCTATCGATGTGTTACGACGCCTGAGTATGGAGGG
+TTTCATTGATAGTGTTGGCTCTGAGGGTGTAACTCGCACTGGATCGAACGACCAGCAACG
+AGGGGTCGTGAGGATCGGGGAGCTACTTGACTCCAGTAAGATCGATTCCCGCACGTTTTT
+AAACCTTATCTTGAATCCAGGCGAGGCTGCTACTGACTGCGATCCCTTCATCCTTTCCAC
+ACTGCATGGTTCCAAGGGGCTGGAGTGGGATAACGTAATACTGATCGGGCTGAATGAGCA
+GGAATTTCCTGGCGGCAAACCCGATGATGTTTACAGCGTTCGCACATCGATGAACACCCC
+TCCGGCCGAAGAGGAAATCGAGGAGGAACGTCGGCTGTTTTATGTCGGTATCACTCGCAC
+AAAACAGCAGCTAAATCTGGTGGTCCCTCTTGATGAAGGGCTTGCGCGGTGGCTCAAAAA
+CCGCTGGGATAGCACCCCGAAGAAGTCACCGATAGCTACTCGCTTCGTCTATGAGGCTGG
+CTGGACTGCTTGTGCTGTTACCAGTGATGCGATCTATAACAGCACGGTAGAGAAACAGAA
+GGCTGACTTCAGCAAGTTTCACCAATGGTATCTAAGAGATCTTCAGCGGCTAAAAGTCTA
+GGGCTACCGATACTTTTCGATTTCAGACAGGTGCTCGTTATCCAGATCAATTGTGGCTTT
+TCTTTCAGAAGCGAGCTTCTTCGCTCGCTTTGCATACTGAAGCCCCTTGGCTGGCTGCTC
+TCCGCGTAGGATCTGTTCAGCCTGCTTGCTCGTGCTGTGCCCCAGAAAGCGTTCGTACTG
+CTCGTCAGATACCTCAGTGCCGATCAGTCGTTCGATCCAGCCGCTTTTCGGCGGGTAACT
+TACGCCCAGCGCAAGCAACTGCCTTTTCTGTACCCACTATTTCCGGCGCGGCCGGCTTCA
+ATCAAGGCTTTGGTTAGAACTACAGCCATTTGGGGACTCTCATACACAAACCTGAACCAT
+GCGGGTCTGATTGGCGGTCAAGATAGCAGCGCATCGAAATCAACACTGAACTCTGCTTCT
+AAGAACTCAATCGTGGCTGGTTGGCTATCGAGCGATGCTTCCCGTGTAGACTCCAGTGCG
+CACTCCAATCGACGCAGCAGAGTAAACGGCAAAATGATCTTGCCGAAGTCGGTATGCTTG
+AAATCCCCCCCACAGGTCTTCCGCGTTCTTCCAAATGAAATCAGCTTGCGAAGCAGCCGA
+ACCTACGAACTCTGCCATCTTGGCCTCCAACCAACTTTTGCACGAAACGGCACATCTTCC
+AAAAGAGGGTTGTCAACCAAGTTTTGCACAAAACGGACTTTGATCCATTTCTAACTAAAA
+TCTACAATCCAACCTCAGATTGCAAATAGCCAAAAAAAGGGGCTGTAAAGCCCCTTTTGT
+TATTTTGATTTCAGAGTTTTTTCCGGGAATCCTTTCTGACCATACTCACCAGAGAAGAGG
+TAATAGTCTTTCCCATTAATTGAAGCAGCTGCGCCGCCTGGCATGGTGAACTTTGGACTA
+TCAGAACGGAAAATAATACCTGAGAAATTATTGCTTGACTCATTGCCTTTAAATGGAATG
+AACACGTAACGAATAACTGAATACTCACCGGCAGGTAGATTAAGTTGGGGGATTTCAGTT
+CCAGTCGCAGGGCGAATAGCCTGGAAGCTGTACATGGAATTAGTTGGCATTACGTCAGGA
+GCTGGTTTTGAAGTGAGCTCGCATGTACTCCATTTATTGATGACCGCCCTATCAATCTTG
+CAGGACGCCAGAGCTGCACTTTGCTTCGATGGGTTGAATCCGAGCATTACCTGTGACTCT
+TTGGTGTGATTGTAAACATACGCAGCACCGGCACGAACTAGGCTTTCATCGTTATAAGGA
+AGTTTCTTCGGGTTCGGGACAAAGACAACATACTGGTTAACCTGAATGTATTCGGCGTCA
+GAGGAGCTGTATAGAGAGCCCAAACTCATAATGCTTAATCCGCTGAGACCGCCTGTCACA
+TATCCCATAGAGCCGCTAATCAAGAGTTTGGAAAGGAAGTTATCTGCATCACCACCTGGC
+TGAACAGTTTCCTCATTAAAAGAAACGTCAAACCCGGCCAGAGAGTAAGCATTTTTGGCT
+ACAGAATCTTTTGCGTTAGCATGCCAGTAGAGCCCATGAGTGTCGCTGTGCTGGGCGGAG
+TTAGGGGATTGACCTGCGTTCCCAGCACACCCTACCAGAGACGCACTTGCAACTAAAGCT
+GAAACCAAGGATACAAACCGTTTATTTTTCATTTATGACCCTTTTTGAATGAATTTTATG
+TCTAGAAGCATTATTTCATACTCGCCAGTTTCTCAAACAACCTAAATGAAGAAAAAATGG
+AAAAATATGAAGTGACCAAAAATGAGTCTTGTAAAGAAAAATCCGTCAAATTTAAATCGT
+ATAATAAAGGGGACTAAATATTCAGAGGCTTTTATGGGTAAACCAACAGATGAGCAAAGG
+GTCATCATTGAAAATGCAAATGCTAATAATATGGTTATTGCAGCACCGGGATCTGGAAAG
+TCATTCACGATGATAGAGGCGGTGATCTCTATCCTCAGGCAGTTCCCTTATGCCAAAGTG
+GGGATGGTCACATTTACCCGTGCAGCAACAAATTCATTGGCTGAAAAACTGAAACGTCGA
+TTAAGTAAGAAAGACCAGGATAGGGTGCTGGTCAATACATTCCACGGCTTTATCCGGATG
+CAACTGGATATGGTCAACTGGAAGGGCAAGATGTTGATTAGCTCGGCACAGCGTTCTGTA
+ATTCACAGGGCATTGAAGGAGTCCGGCGCGCCTTTTCGATACCCGGATGCAGAATTTGCT
+ATTGACGCGATTGGAAGGGAAATGGATACGGACATCATTTCAGTTCGCCATACGCGGCAA
+CAAATCCACTTGTTCAACACCTATCAGGCAATATGTCAGAAAGACCACGTTGCAGATTTG
+AATGCACTCTCACGTTTTGTTGTGGGCCAGATGTACTCGGGGAAAATGCAGCCACTTAAC
+TTGACACATTTAGTTGTAGATGAAGTTCAGGATACCGACTCGATTCAGTATGCCTGGATC
+TCACTACATACGAGGGCAGGTGTTAACACTAGCATCGTTGGGGATGATGATCAGGCAATT
+TATTCATTCAGGGCATCAGGTGGAGTCAAAATATTCCAGCAGTTTGAAAAACAATTCAGG
+CCCAACATATTTTATTTGAATACTTGTTTCAGATGTGAACCAGAGATTTTGAAGGTAGCA
+GGGGCATTGATTGAAAAAAATGTTTACAGATACGCTAAAGATCTCCGTTCAGCTAAGGGC
+GGTGGGGGAAAAGTTCATTTCCGCTCATATGTTGATATGGATGAGCAAATTCAAGGCATT
+CTCAATCTGATTAACCAAGACCCGATTGGGTGGGCAATCCTCAGCAGAGGTAATGCACAT
+CTCGATCAGCTTGAAAGCCTGATAGAGCAGCCGGTACTTCGTTATGGTGGGAAGTCATTT
+TGGGATGAAAAGGAGACAAGCGATGTATTGCATTTGATGGCATTCTTCCGACATTCCAAC
+GATGTCCGGTTAATGAAGAGGGTGCTGGCGCTTTTCGGTGAAAATGAAGAGGTCTTGGAC
+CAGACAGCATTGAGCATGAAAGGAAGAAAAGTAACTTTTGGTGAACTGAACATCCCGAAT
+GAAAGTTCCCTGGAAACAAGAACGCTTCATTCAAACTTCACCCGGTTTACACAGGAGACT
+CGGGAAAAGGTTGAAATAGAAAAAAGGTTCGCAAATCTGATTAAGTGGATGGAGTTGTCG
+TCGATAAAAATGAGGACGCAGAAAGGATCACCATCACTGAGCAGAATTGCGCTGGATACC
+TGTAAGCAATGGGCCGAAAAGACAGGCTGGCAAAATATGATAAATCGAGCTGCGGCGATG
+TGTCTGGGGCCAAAGAAGAAGGATGAGGAATATACACCGGATAAAGTAGTTTTATCGACG
+TTGCACGGTTCGAAGGGTCTTGAATGGAAAAATGTAATTATTATGAGTTGTAATGCAGAT
+CAGATTCCAAGTAAGCGGTCAGTGGGGCAGGAGGCGATTGAAGAAGAAAGACGACTGCTT
+TTTGTTGGGTTTACACGAGCAGAGCAACAGCTGCATGTAATGTGGTACGGTGATCCGTCT
+TTCTTTTTAAGCGAATGTGCTGAAGATAAATTGAAAGAGGCTGCGAAAAGTAGAACAGAA
+TCCCCTTTGACAGAATAATTTTGATTTCTTTATTTACAGGAATGAACCCGTGTAGTATAA
+CGTATATGAGCTTGAATTTATTGCTCCCACATTTCAAGTAACTTTATAAAAGTTACTTTG
+CGCGTTAAGCGCATATTCAGCCGTGAAAAGCGGCCAGCTTTCTAAAGCTGCAAGGCACCA
+CCGGCAAAATGTCACCTTTGTCGCTGGTGCCTTTCCCATGTCTGAAAAAGGACAATCGAA
+TTTACCAAATCGTAACTAACTTAGCTCTTAATTGAGCTATTTTCGTTGCGTACTTCTAAT
+GCCAGAAAGTATAAATCAGGCGGTTCATAGCTTACGGGAGATGAATGACAGGCTTTGCCT
+TTGTGTTGGGATATTTAATGATTCCTTCCTTCTTACTATATATAGGTGACCCCAAATGTC
+TAAAAGTAAAGCACGCAGTAAAGCTCTTCTCATCGCCTTCGCTGATCTGATCCCAGATAT
+GGATAAGGTGGTTAACAAGAAGTTATTGGATTCTCTGAATGTTTATTCAGGGCATGATAA
+TGACCTTATTGTTATTATGAATGAAGATGGTCCAACCATAATTGAACTGAATTCTTTGAA
+ATCAGTTTCAATGCTGGCTCAAAAGCTTTCTGCTTTTTCTACTTATTATCATGTGGAAAT
+GCAGCAAATTCTTGTCAATCCAATTGACTTTGAGAAAGCTTACACACTTCTCAAAGAAGC
+ACCTGCAATTCCAATGTTTAAAACTTTAGCCGATCTGGATAAGTTCTTAAATGAAGAGTT
+TGAAAAGTACGGGTTGAACACATTTCTTGATGTGGATAACCTTGATTATTCACTCGCTAA
+ATCCAGAGAGTTAAAAAATGATCAGTTGGTTGCCTGGGTTTCTGAAATTATTGAGAAGCG
+CGAGAAATTAGCATTGCGTAATCGATTTAATGAAGTGACCAAAGCACATTATGAAACTGT
+AGATGCAATGTATGCAGCCGTTCGCCCATTAATGAAAGAGTTAGGTTTTCCTGATGAACT
+CATGTTACACACCTTTAGTGAATTGAGCGTTTTCGATTCCAAAGGCTGGGATTATGCTAT
+CAAGTCGAAAATTGAGTTTCTCACTAAACGCGAGGAGCAATGTTTAGATTATCAAATGAA
+AGCAGATAAACGGCAAGCGACAGTTGATGAACTCTTGGCACAAATCAATAACGCTAAAAC
+GGTAAAAGCACCAAGATCTTTTGGTCAGCTGTTTGGCTTTTCTGTTATTGCCATGATGAC
+ATTTATGTTCATTGTAAACAAATTTATCTAATCCTGTTAAGGGGAAACCCTGACGGGGCT
+TCTCTTTGCTTAAATTGAGGAGAGAAGTAATGTCATATCTTGAATATGTTAATGAAGTAA
+AAGTGTCCGGGATAGTTATCAGTGCAATGGAGAAAGAAATGACTAGCGGAAACGTTGGGT
+TATTGATAAAGCTCAAAAACAGAATGAAAACTGAAATTAATGGTGAAATTACTGAGAGAG
+AATTTTCGATTCAAATCAAAGTATCACCAGAGATGTATTCAGGCTGTTTCACTGGTATAA
+ATCAAGGTGATGAGTTAATGGTCTCCGGTTATCTTGTTGTGGATACCATCACATTGGAAG
+GGAGAGAGCATCCTCTTGACTACATGAGAGTAGTTGCAACAAGTAAGTTAGCTCACATAC
+CTAAACCTCCTAAGGGTTTTGGGCAAAGTAGCTTTAGACAGATCTGACATTTAAACCACC
+CAAAAGGGGAGAAATCCCTTCATGGGAGTTCTCCCTTAGGAGATCCCATGAAACAAAAAA
+TAAGGCCGACTGCATTTTGCAGTAAGCAAATGGATTTTTTCTCTATATTCGATTTTGAAG
+AAGAGGAAAAAGAAATAATAACTATAGTTGAGTCTCCACTTGACTATATAAATGATGCAA
+TAGCCGCACAACAAAGTATTCAATCAGAAGATAAACATTCAGGCCCGGAACTGGAGCCTA
+GTGTGTCGGAAGATGTTGCTTTGCCTGGTAATTGTCCCAAACTACTCAAAAATCAAATTC
+TGCATGACATTAGTTTTGCTGCGGAAACTGATTATCTCTTCACTCTAGAAGAGTACAGTG
+CGGAGTTAGGTGGTCTGGTTTTTGACTGGGCCCCTGAAGATGTATATCAGTTATACGTCG
+TCGCAATGGAAGAGTCGTTGGAAAACGTAAGGCATCTCGTCATTACAAAATCACTCTATT
+CCACTGATGAATTCGGTAACATAACCGTGAATCCGCTTCTTGAAGCCGAAACACGGTGGT
+ATATGTCGAAATCATTTGAGCTTACATGTGCCACTCATGGTATTGATGCTATTGAGTTCA
+GGTCAGAGCTTAAAAAAAGCTTATATGAATATACGCACAGTTACGGAGGTGAAAATGCTG
+AATTAGCTCGTTATCATCAAGATAAAGAGGTTATTCTGCATGATTGTAAGGAAGAGATGG
+GATGGGATATCTTTTTCGAACAGGACTATTTGTTGCAAGAAAACAAACTGGCAATGAAAT
+GGACTGATCGGGATATAATGGATGTCTATTCTAAAGTATTTAAATCAACAATTAATTTGT
+TTGAAAAACTTGTCGTTAATAACAAGTTAACCTTAAGAGATACTTTTGGTTGGGTAATCG
+TAAACCCTACATTTGAACGCCAGTTTGAATGGATTGAGTCAGAAGTATTCGAAATCGTAG
+GAACTCATCTTGGTTACAACGTTGCCGCTATCAGAACACAGATGGCGACCGCGTGTAGGA
+TGACTTTCCACTAACATGCCACTGGCAAACATCTGCCAGCGGGCGGTGTTTGCATTTTAC
+CGGAGTTTTAAAAATGACTAACGCCGCAACTGTATTAAAATCCGACAATTCCGTACAGGA
+AGAAATCATTGGTAATCTGTTACCCGCAAATGTTATATCAAGTAAGATGTTTGCGAATAA
+AGAACAGTATTATCTTGTCAAAGCAAAAGATTTATTTGGCATTCCTGAGATGGATGAGGA
+TATGATTGTTCCAGTGTTTAAAAAGTTTTCTCCATATCGTGCGAATCTGAATAAGGACTA
+TATACCAAATTCTCGAATACTTGAGCAAGTAGTAAAATTGCTTGTAAGTAACGATATAGA
+TTTGAGTGTATGCCTGAAAGGAGAATCTGGATCAGGTAAGACTGAAATGGCAATGTATAT
+TAGCCATATGCTGAACTGGCCGCTAACCATAAAGCAAATCAACAGCAATATTCGCGCTGA
+TGAGCTGGAAGGTGAGCGTAGTCTTATTAACGGTAACACCAGTTTTGTGCCTAGCGAGCT
+TGTAACGGCATTTCAGGAAGGCCACCTCATTCTTCTGGATGAAGTGGACAAGATTGACCC
+TGATACTGCCGCAAAGCTTCATATGCCTATAGAGCGAAAGCCCTGGTCACTAGCTGCCAA
+CGGTGGCGAAGTGGTTAAGGCAAATAAGTTTACGCGGTTTATGGGTACTTCAAACACAAA
+CATGAGTGGGGGATCTCGTAAGTTCGTTTCATCGCAGCGGCAGGATGCAGCGTTTATCAA
+GCGCTTCCTGATTGTGGAGATGGAAAGGCCTTCAGAGGTTGCATTAACCAACGTTTTGCT
+TAAACGCTACAATAACCTGCCTATGCTGGTAATTGAAAAATTCGTTTCGGTAGCCGTTGC
+AGTAAACAACACAGGAACTGACGACAGTGTAATGGATATACGCCAGCTTGTGGCATGGGT
+TGGAACGTCAATGACGTTAAAGACCATGTCCTTACTGGATACATTTAAAATTGCTTTTGC
+GTCGGCTCTGCCTGCACATGCCACTGGTATGGTGTTGGAAGCCATCGACTTAATTCTCGG
+TGACGACAAGAACCGTACAATGGAGTATTACACTGCAAAAAAGTAGTTATAGATGGGACG
+AGTTATCAGAAGGCTGAATGCCGTGTGACAGACTTTGCTCATCTTACGTTTTACGGTTTT
+CTGAGTGCAAACGGAACTGAAACTTTCGTGATTGCACAAGATGGAAATCAATATATAGGT
+CTGAAGCAGCATAATAATGACTATTCATTTATTTGTTATGAAGTCTGTAACAAAGATATG
+GAAGCCATGATTAAGGGCCTTGAATCAAAAGGATTCATGTATCAAGGGAGCATTCAATCG
+GCGGATGTCGAAAATGAATTTCCTGGAATTCTTTTAACAACACTTGAAAAGTAATATTAT
+TAACCCTATCGGGAAATCTTTCCCGACGGGGAGGTTTTCCCATTTCTAAATCTGGAGAAA
+ACCTATGACTTTCAATACTTCTAAACTTAATAAAGTTTCTGCAAAGGAAATCAGTGAAAA
+CTTTATAAAAGCATATCCTGACTTGCAGGAAGGTGCTGTTATAACAAAAATTGAAATTAG
+TGGGTGTCAGGGCTCTCGGCGAACTGATAAAATCGAACTGTCCTATGGCGGTGATGATAT
+AACAGACCAGAAGAGCGTGTCTAAAAGCGAAGTTCGCTGGATAGACATAAAGGCACTGAG
+TTTCAAAAGCACTATCACTAGTCGAATTTCAACCCTTTGTTCACGGTTGTGCATCCGCTA
+TAGCAATATGTGGATACTGCCAGTTGAAAGGATGGAGGAGTTTCTCGAAGAGGCACAAGA
+AATCGAACGTGAATTTCAAGCCGGTATCCAGAACGTGGTTGATAACTATGACACTCATAT
+TCAGGCTGAGAAAGATCGCAGTCCGTTGATGTCAGATTTAATTGACCAGTTGAAATTGAC
+TAAAGATGATTTTGTTAAATCATTCCGGTTTAATCTGGCACATTTCATTCCGTTTTCACC
+GATTAGTGTGGAGGGGGATGAAACGCAGGACTTTTATCAAGAACAACTGATAACTGACTT
+GGCCGATGAAGCTATGAAGGTTTATACAAAAATCAGCAAAAATGATAATTTGCGTTCCAG
+CACGATTGACCGATTAAAGCAGATGCAGGATAAAATAATTAGCTTCATGTTCATTCATAA
+AGAGGCTGTTGTTCTTGCAGAAGCTATTAAGCATATCATGAATAATTTACCAAAAGGTGC
+CATTTCTTCTCCCCGTGATGTTGCGGTATTAAAGCAGTGGTTCTATTTCATGAGCGATGC
+GTCAATGCTGAAACGTATTATCTCCGGTGAACAAAAGGTAACCGACTGGCTGGATTCCAT
+AACCCGGTCATTCAATATCGATTCACAGGTTACAGCGGCTAACTCTCTGAATACTGCTGA
+GGATGATGTTTTTTCTTCAGCAAATGTTTTCAGAGAAGACCCGGTTGAAGATCTTGAGAA
+CAAGGCAGTGAATGCACCTGAGCCTGCTGTTGGCCCTGATGAAGATGTTTCTATTCAGGC
+CAGTGGTAGTAATAGAGCATTTGACTGCGAACTCGAATTGACCGGTTGGTAATTTAGTCT
+TGTAAAAATATCCCCAGATGGGTACTTCACCATCTGGGTGAGTACCCTTTATCAAATAAA
+GGTACTCAAATGAAATTTGATTTAAAATCTTCACCACGCCATATTCAACGCCTGACGAAT
+ATAGCCAGCGTGATAAGCGGTATAAATGGGATTTATGTAATTATTGACAATAAGGTGAGT
+ACACCTTATTTCAACACCCAAAACAATGTCTGTGTTTTACCTAACGGTGATTATAGCGAT
+GAGAGATTTGTCAAGCTAATTGAAGGATTCATATGTCATGAAGCAGGACACGGTCGTTAT
+ACAGAGCATGAAGTATACCGTGAAGCTTTTGTTGGAGAATTGATCAATGCAGATGGCTTC
+ATCAGTATTGATGATGACTTGAAGGCTGATTTTCAAAACCTAAAACAAAAGCAAAAAGCA
+TATGCTCGTGCTTGTCGACTAAAAGGACTTATTAATCTTTTTGATGATGTCCAGATGGAA
+GAGAAGACGGGTATTGATTATCAGGAGGCAAAAAAACGCCTCGCGGTGACTTATGCCTTG
+ATGGTTGAAGCTGGGCGTATGACGGTTGATATTTCTTCAACCCCTCAAAACCCGGTTCAG
+TTTATTGAAATGTACCTGCTTAATACATTGCGGGTTAACGTTCTCCAACAAGAAGGGCAT
+AAAGAAACGCTTGACCCATTTTTCGATTATGCAAAGAAAATCCTTGCACCTGTAACTTCA
+GAAGTCGATGAGATCATTCATCAAGCTCTAAGTTGCAAAAGTACGCAAAATTGCGATTCT
+CTGGCGCGTAAAACTCTGGCTCTTTTAGAGCGTTTAAGGGATGAAGCAAAAGAGAAACAG
+CAAGAAGAGGAGCAGTCGAAAGACCCGCATGACGATACAGATGAATCATCTGGCTCTGAG
+AATGAACCTGATACCGAACCCAATGGTGATAGCCAGGGTGAAGGGGATGGTGATAAAGAA
+GGTCAAGGCGATGATTCTGGTGATGGTAAGGCGCCTGCGGAAGGTAATGGGTTACCGGAC
+CAATCCGGAGGGGATGAACAAAATGCTGAGAACTCTAACGGCGAACCTGATGGTGAGTCT
+GAAGGTGATGAATCGGCGACCCCCGGCTCGGATGATGCTGACTCGACACCTTCCCTAAAC
+GACAGTTCAAATGGAAATTCTTCTGATGGGGAAAGTAACTTTTCTCCTGAACAGTGGGAT
+ATGCTTGCCAAATTGCTGGATGATTTTTTAAACAGTGATGAGGAAAGCGAGGATTTTCAT
+GAGGTTCTTGCAAAAGAGATCTCCGTAATTGCTGCCAGTGTGTCGGATGAGGTTAAAGCT
+GAATTTGGTGCAAGTGAGTGGGATGTTCCAGATTTGAACATTGATCTGAATGTCTACAAT
+GAAGCATTAAATATCAGCCAGACCCTTGGGGCAGATTTATCTGTTTTACAGCAGGTAAAA
+ATGCGTGGTCAATTTAAAACCCGTGATAGAGGCTTGTCATTCGATATTAATCGACTGATC
+CAGTCTCCGATGGGTGTTAGGGATGTATTTCGGTCACAAAGCGAATCTAAAAACCGGGGC
+CACGTCGGCTTGGTCATTGTTCGTGATATTTCAGGTTCAATGAGTCTGGAACACCGTTAT
+ATCCATGCAATTAAGACTGACCTTGCATTAACTCTGGCAATTGAAGCTATTTCAAAAATG
+CATGTTGCTAATGTGATTTATCCGTTTGTAGACAAAGATTTTGAAGTTATCAAAACGTTT
+GATGAAAACGCGGAAGAGAAACTTTCAAAATTCTCACTTGGCTGCAAGGGCAATAATACC
+CCAACGGGTTCTGCATTAAATGCTGCTTTAGAGTTGTTACTTGAAAGCCAGTTTGACAGG
+AAAATTGTTTTCCTTATTACTGATGGTTATCCGACTGAGTCGGCTTACACCATTAATGAT
+GTTTTTTCAGTTGCTGAAAGTAACGGCATTGAAATCGCTGGTGTTGGTATTAAAACTGAT
+GTGTTGATGGGTTTTAATGAGGGCACCTTCGTAAATGTTGATGATATTTCTTTATTGCCG
+AATGAGGTCAGTAAATTAGTACATCAAATTCTATCTAATTAAACTCTACCCAATCGGGGC
+AAAACGACGCCCGGTTGGGTCGCTTTGCTCCCTGAAGGATTAAGGAGCAATATATGACTC
+AGATAAAGACTTACCGTGTCGAGTATGAAAAAGTCGGGACGATGCATCGTGTCCGTATTT
+TTGGTCGCATGGGTGAAATTGTCAAAAGTGAATTGCCAGAAGAAAGAATTCTCCGGGATG
+TATCTATACCAGAGGGTAATGGAGAAATGGCAACGTCAATGGTTGATGGTTTTATCCAGC
+GTCTTGAAAATATCGGCTTCAAGACTGAAGCGTAATTGTTGAGGGCTCTTGTGGGCCCTC
+ATTCTTAGATTCTGCGTTGTGGGTTTCTCCCTGTTTTCTGCATCGCAGAGGGCATTGAGA
+AACCCACAATGCCAGATAAGAGAGAACAAATGACTTATGCATCCCAGGCTGTTAAGCGTA
+CACCACATGAAGTCACTGACCACTTTATAAAAATGGTTCACGCTCGTATAGCGGAAGTAT
+CAGGCTGGCGCTATGTATTCGATAGAATACCGGCATTTAAAGACGCTTGTGATAAAGCAC
+CTGGCCAGGTTCCTTGCCCATTTAGTGGGGTCGGGAAATCAAAGTTCCGGTTCCGTAAAA
+AGGACCTCTTTACCGGTTGTGCCATTCACAATGATTTTCCAGTGAATGCATTTTGTGACG
+GTATTGATGTATTGGCAGAGTACTACAAGCTGAGCAAGACCCAGACTTGTAAGAAGATCC
+TGACTGATTTCTTTGGGATGGATTTGTACGCTCCATTAACTGATGCGGATCTCGAAAGTG
+AACGTCGTTATAAATCAACAGTTCGTGCAACCGAAACGCTTGACAGCGATGAAGTTGAAA
+AACGAGGGCGTAAACTTGAAGTGATATATCACTATACCGGTGAAATCAAACCTGAGAGCC
+CTGTGTGGGTGTATCTCCGAAATCGAGGTCTTAATCGAGTTCTGAGCAACCTTCCCAAGG
+ATTTAGGTCTGAACAAACGACTTTACTACATGGATAAGTCACTGGAAAAACCCACGATTT
+ACCCGGGAATGATCGCAATTTATCGCGATACCCGTGGGCGTCCTCTGACAATCCACAGAA
+CGTTCGTCGAGTTAAATGGTGATAAGGCACATGTTGAGAATCCGAAACTGATGATGAAAC
+CGCCTGCCGATATGACTGGCGGCTCAATTCAGCTGTACGATCCACACTTCAATCCAGGTA
+CCCGTACCTGGACGTTAGGTGTGGCTGAAGGCATAGAAAACGCGCTGTCAGTTACTGAAG
+CGACTTCAACACCGTGCTGGGCCGCGAGCTCTGCCTGGTGCCTTGAAAACGTTGAAGTGC
+CGGATAGTCTCCTGCCTCCCCCTGGTGTGAAAGTAATACAGTTTTACATCTGGGCGGATA
+AGGATCTTGTGAATACAAAAGGCACTTCCCCGGGAATGGAGTCAGCTAAACGACTTCAGG
+AACGTATGAAAGAGTTTTTTGCAAAGCGATATCCCACTTCAGAGCTGACAATTAAAGTCT
+TTGAACCTGATTTCGATATTCCTGTAGGGAAGAAAGGAGTCGACTGGAACGATGTACTAA
+AATTAACAGGACCGGATGGATTCCCCGTAAAATGGGCTCCTGAATGTCTTGCTCAGCTTT
+AAATCCGATAACTCCCCCGCCTTTTCAGGCCGGGGGGGGTTATCTCTTTAGTGTTTATTT
+ACGTTAAATCCTAAACAGATAATCCGATTTCCTTCGTGAAAATCACCTGTTATTCAGGTT
+TTTTTTACGGCTGAGATGCTTGCTCAGTTTAATAAATGTGCGATACATCTGGCTACGGTC
+GGTTGTATGACATGGTATATCCATAAAACTTAAAACCCCTGACGGGAGTATTACCGTTAG
+GGTGATGCTCATCGTTAAATATCGGAGAGCATTGTTATGAATATTGAAAATCAAGATTTA
+TTTAATACGTTCGCTGCTGTGATTTCATCTCATATCGTTGAGCAACCATCTTCGTGTTAT
+TACCTTCATGATAATGAAATTGACTTCACGATTTTAAAACACAGCATAATAGATAAAGAC
+AAAAACCTGTTGTACGTTATTCGTCCTTCAGGAACCTGTTTGTTGCGTTGTGATAAATAC
+TTCTTTCCGAATTACTATCTTACAAGTCGTGGAGATTATAAAGCATTTAAGTATGTGCAT
+TTTAATCTTGCAACACGAGAAGCGGAAGAAATCACCTGGCAGCAAGCTTTTGAAATTTTG
+TCCAAGCCGGGAAGACCTCCATTAAGAGGTTCACTTGGTAAATTTGATTATTTAAAACTT
+GTTATTGATGATCTTCGTGCGCGAGGGTATGCCGATTTCCTTCCAGCATACAACCTTGAT
+GGCCTTCGTCACTTTGCAGTAAAGGATGAGCGACCATCACTTGTCAGTTATATCGACAAT
+GTCATGGCACTTTGCGCATAAAGATAACACATATTTTTACTACATCCCTGATGGCACCTC
+CCATCGGGGTGGCCCTCAGAGTTGAATCTGGAGGTCTTATGAAATTAGCTACAGATCTGG
+TCAATGCGGTTCTGATAAAGAATGGCATTGTACCAACTTCCATTAATGAGTTGCCTGTAA
+CGTCGCTGGTAAAGCCATTGACACAAGTGCATCTCAGCCTGTATCTGAAAACAACGCATT
+TATCTCAGTTCGTCCCTGACTACGTTGAGTCTCTGAAAGATTGTCCGGTTTCGTATGATA
+TCGGCCTTGAACTTCAGCAGTGTATCAACAGTGCTGAATTGCTCTGTGAAGACATGGAGT
+CACTTGAGTTTATCTCTGTATGGATAGAGCTCTATACGTGTAATTCAAAGCAACAGCGGT
+TTGAGAAAAGTAACTTTTCTTTTCGAACTGAAGATATCGAGCTGGCTAAGATGCTGTCTT
+GCTCGCATGAAATCTTAATAAGTCAGGCGGCTTGTTTCTGGCTTTTGTATTTTGAAGATT
+TCATGAAATATGTTCGTAATAGGCTCTGTGCATTACTCAGACAGGTTTTAATTTTGATTG
+CAGGACTGCGAAATGTATACCTGCAACGGAATGAAGATCAGTTGATTAAGAGAGTTAAGC
+ACGGGAATGAAATGCTGGAGGTGACTCTTAAAGCTGTTGCACTATGTTCAATAGAAAGGT
+ATCTGAAATCATATGCCTCTTTACGAACAGAAGCGGCGGCTTCTGGGTTTATCAAATGCA
+TTCAGTCTTATATCAGTACTGGTTGGAGACATGGCTATATAGTCTGTCAATATTCAAAAA
+ATGGACGGTCTCTTGGTAAGTCATTACCACTTTTTATAAAAGAGACATCTGAGCATAATA
+TACAGAAACGTGTCAATCGCCTTATATCTTCCACGATTTCGGGGCGAAATAAAGATTTAG
+GTCTTTACGATTTCTGATTAACATTACCCATCCGGGGATTACATCCCTGATGGGTGTAAT
+CCCATTTTTTATTTAAGTGAGGATTACATGAAAATTATTGAGAAAATCATTAATGCATTT
+CTGATATCGCGTAAACATTCAGTGAAGGTCAGTAATGTTATCTGCTTGAGTGGCACCGAC
+GGTAAATTTACTGGAATATGCTGTGACGCCGATGTTTCATTTGATTTTCTTTATTCGTAT
+GCCCCCGCATACAGTTCAACATTTTTAGATATCCCGTTTCCTGGGTTTGAAGACCAGGAC
+ATCGCGGATTGTGTTAAATGTCAGTTAGATGTAGTTAAAAATAAACGGAATCGGTCTTTT
+TTAATTGACCATATTAGATTTCCAGTTTCCTCAAGGGAAGGATTCACTCTGACACGCGGT
+GATAGTTACGACGTGACTGAATGTGAATATAATAAGGAACGATTGCTACATCTGACCCGA
+CAAGGACGTTTTTGTGAAGACTATCTCACGTTCAAGGATGGCCTGAGTTCCTTCTTTTCA
+TTTGTGAATTTCGAATTACATGAAATAGTGAAGGAAGGTATACGTTTGGCACTTGATGTT
+TTAAACAAGATTACATCTGATCAACCAGACCGTCTTATAAAAGACTTTAAGTATCATGAT
+TGCTTCGGCAGTTATAATGTACAAATATTTTCTAAGGGTCTGCCAGTTGATATCCTTGAA
+ACGATGATTGCACCTGATAGGTTGTTGTCTAACTTGTCAGGTAGTCGTCAGATTATGAAA
+AATGCAAGTCGCTATCTTAAAGGCTTTGCCCTCAGTAATCGTGTTTACATGAAATACGGA
+TGGCGTTTAGCAGATGTTGACACATCTGACTATGCGAAAGTTATGTCAGATAGAGAAATG
+CATGCCAGAGATGATCTTAAGGCGTTTTGCAGTGTCTTTTTTAAAGAGTGTTTCGCATCC
+GGAAAATATGAATACGAAGCATACCTGAGTGAAAGACAACACGCGATTCGTAACGGGTAT
+TAATACTTATTATCAACTTATCTAATCCCTGAGGGAATTCTTCCCTTGGGGAGGATTCCC
+TCTTAACCGAGGGCTACAAAATGAAAGCGATTTATAAAATAATTGAAGCGATGCTGGTGA
+AAATGGGCTTTGAAGGTGCCGTGATCCAAAGTGTCAATCTGGAAACGGGTGTGATTCAGA
+GTCTAGTTGTTAAGGCTGATATTCCTGTCCGGACTTTAATGCCGCATTTAAGGCGATATC
+TGCGCGATTGTGAGCCTTTATGGGGACATGACGTGGATTACCACCCTATAGCACAATATT
+GCTCAGGAGCTGCGTTGTTGAAGGCTGGGCCGGTCACTCTTGAAACCTTTCGGTTTGAGG
+TTTCAGTGTCAACTGCTCACCTGCGGCTTGTGGATGTTGAGCCGGACTGTCTAAATGAGG
+GTGTGAACCGTGAAAAACTGGAGTATGTATATTACCGCTCCAGCAATGCAGACAAGGATC
+TAATACTTGGTATGGTTGAAAAAGGACATAATTTTATCAACCATCTGCATGAACTTTTAC
+GCTCGCGCTTATCAACGGCTTTGCCGCTGATTTTCGCAGTTACAGAAAAGATTGCGGAGA
+GTTCAGTTCCACAAGTAGTCACCAGCTTTTTCAGTGTTGACCATCAAATCAATGCCCAGA
+TAGTAGTCGAACCTGTACCCGTTTCAGTCGCAGACCAGATAATTTCTGCTGACTGGAATG
+TGTGTAGTGTTTCAGGAGCGGATAAGTTCCTGAACCATGTTAATCGTTATCTGTCGGGTA
+GGGTGATGAAGCGGCGTATTTACGCTGTTATAGAAGCTTGCGACGGTGGATCTTTATCCC
+TCAATGCGAACTTAGGTTGCTTTACATCACCTCTTCTCGTAACTGAGTATAAAATGGTTC
+AGTCACACTCTTCATCGCTTTATCGAAAGGCTATAAATAACTCGCTTAAGCAAGTTAATT
+CGTATGCTCCAGAGCATTCAGATGACCTGCTTTCTATGTAATTAATTTTACCCATTGGGG
+AAGCGTATTCCCCGTGGGGGTTGCTTCCTTTCTTCATTAAAGAGGAAGTGAATATGTTTA
+ATGAAAGTGATGATAAAAACTTTGTTAGTGCAATGCTTAAATGTCAACTTGGCCTGAATA
+TAAGCCAAGAGGATATTACAATATATGACAAAGAAAATCATTTTGAACAACTTTCTTTTA
+AAGCAAATGTGGCGCTTGATGATTTGTTATTTTATCTGGATTTATATATATCAGAATTGA
+TTAAGCATAATGCGCCGTATTCTGAAACTGAAGTCCTTCGGACTAAAATCAAATACTTTC
+TTAAAGTATATGAAAAGTCTGGTTTTCAGAACATAAGAATTCGCGGTTATCATAACGCGC
+ACAGTACTATAGATATTGTCGATATCGCATCATTAATATTGGCGGGGTCTGTACCGGAGT
+CTGAACATGATTCAATAGATCCTGTTTTAAGAAAGGAAATCTATCAAAATCGCATGAGTG
+TTGAGGGTAAAGTTCTCATTGCCCGTTTTGCACTTAAGCAATTTTTCCATTCTGATTTTG
+GTGATTTCATCTTAGAGTTCGAGAAAAGTATCTCCAAGTGTTTGAATACTTCTCTCCAGA
+TAATTAAATCTGTAAAGAACTCATTTAACCGTTTAGGTCAATATCAATATCAGCGTCGTG
+TAAAAGATGACCTGACTTTGCATCTTGATTTGAATACAGATGAATACCCGGCCTGTATGC
+CAGACCTTTACATCGGTTTCAAGGAGTCTGAAGGGACGACGGGAGTGTATCGCGATGATG
+AAAAAATCATTCGTCTTTATACTGGCGTTAGTTCCGGAAAGGATGTTCCTGTAATGATGA
+CCGTTCGATTCACTGGCTGTGACGGGAGTGTTTTGTCTGAATCATCGCACGGTACTTTCT
+GTTCCGTGGGACCTACCGGCCGAGTGCAGGTTTGTGACAGAGTTGCGTTGGTCCAAGAAG
+CGGTCGAAGAGTTACGGGATGTTGTTTAACCCTTGTTTTTTACCTCTTCATTCCAAAAAG
+TAACTTTGTTCTACCAAATGACCGCGCTACCTATTCTGATCAACTTGCAGGAAAGAATGG
+CGCAGTAGTACATATTTTTAATCCACCCACTGGGGAAGTCGCTCCCCTGTGGGGCACTTC
+CTTTAATAATCCTGAGGAAGTGAAGATGACTAATTCTACTGATAACCAGAACTACGTTCG
+TGCAGTACTGGCAGGCATTGGTATTGATTTTGATGAAACAGAGATGTTTATCAGTGTCTC
+TCATTGCCAGAGCGACGAAGTTTCGTTTACATGCAGTATATCAGCCAGTGAGTTAAGAGA
+ATCTGCGGGGCATTATGTGGATACTCTTAATGATACCCAACTGGCTGGCCTGGATGCGGA
+TGCACTCAAGAAGCGACTGGTTTACTTCCTTGAGGTTTTCGACCTGGTTTCCGGTCAATA
+TCTGGATATTTCCGGTAAACATTTCGCGACCAGCCGCTTTGAATACGACGATGTCTGTAG
+TGAGATCCTGAGTAACTCTGCGGACAGCGCCCAGCCAGGTGGCTATGATCGTGAAGAGTA
+CAAAAGACTGATGGAAGTTGATGGTCAGGTTTTAATCGCCCGATTTGCACTGGAAAAATT
+CTGGGATACGCATTTTATTGGGCTTATCAACTATGTATCAGATGAAATAACATCCGGGCT
+TTATGAGGTTTATCGCACGTTCAGTGATATAAACATGGCCGGTTATACATTTAGTGAGTA
+TTCATATACGCGTCGTATTACCGACGAACTTAGTTTGCATATTTCACTTAAAGAGGACGA
+TTTCGAAGAGCAATTAACCGATTGTTATATGGATGAAACAACGCTGCCGTCTGGCAAGGT
+GGTTTTACGCCGTAATAATGAATCAATTATTGGGATTTATGAAGGATATGCTTCAAAATC
+TTACTTTCCTATGGTTGCTAATGTTAGAGTCCTTGATACAGATGGTGAAGTTGTTACTGA
+ACTTTACCAAGGGGTGAATGTATCAGAATTAGCTGGTGGTCGGATTAAAATCCATGACCG
+TCAGGAATTAATTTCTGAGGTGTTCGCTAACTTACGTGAATTCATCCCAGCATCAGAGGA
+TAAAATCTTTGATGCGGCATGAGTCCTGAAGGTTGAATTATATATTTTCAGGTTTTTATA
+CTTCTAAGAAGGCACGGTTATCCGTGCCTTTTTTTTTGCTTTCGTCAAAACTTGCATTGT
+TTTTACAATTTTACAACGTTCTTACTGCCCTATATGTTTTACGGTACTGTACTCTTGGCA
+CCGTTACATGTAAGCCTTCCATTACCTTCTTCAACCAAACCTAGCCTAATTTACATCCTT
+CCAGCTGTTTCCTTCTCTGCTTCTTTTACTCGAATGTTTTGCCCCTTGCTGACGTTTCCG
+GCAGCACACAGTCCGAATGCTGGAGCCTCCAAATTACTTTTTACTTCTTTTGTTTCGGTT
+TCGCGAAAATAGGTCTCTTATCTGAAAAATGGATCGTTAGAGATTTGTATACTGTTTAAA
+ACAAAGGAGTCACTATGCCTGCCACTACAATCCTGAGCAATAACCCTGTGAATTCGGTCT
+TCTCTAATGACAATAGCCATTTCACATACCGGCATATTGATTTCAGTATTGAGCTACTGC
+TTTCTTCAGGAACTGACTCACAACTGGAATATCTGTTTCTCAAACCGGCGGCTGAAGTAA
+AGATCGATTTACAGCGCCGTTTAGCTAGTGGGGAACGTTACGTTACAACCGAGAGTTGTG
+ACAATTTTAGCGAAGTTGATGGCTGCATGGGACACGATTGCTGAGGACTTTATAACGGCA
+GGCGTCCGATTTAATACAACACGAGACACTATCACCTAATGATGACTGAATCGTTCTTTG
+ACTGGGTTGTGTATTGCATCACAGGCGTAATACTGGCATCTGCGTTCCTCGAAGGAAAAA
+GAACCCGTTTTCCGGCTGCATTTTTTTACGGAAGCATTGTGCTGCTGGTCGTTTTGATAG
+TGGCCGGTGCCCTCAACTGGTGGTTCTACCGTTCTAAATTCGGCTCAGTTGTCGTTATTT
+TTGCCGCGACAACGCTGTTAATGACCCGATTCAGATTGGTTATTTATGCGTTCAGGTTTC
+GGACGCTGGTGGCAGATCTCCAATCACATGTAGCCAAGGGATTCAGGATAATCCTTGTCT
+TACCCGAAAATGAAGACGAGAAGACCGTTTTGCTTAGCAAATTGTCGAAAGTGATACATT
+CTGGGACGTTGTTTTATACCCGAACAGCTCTGGGTCCATATTCTGGGGATCTCCTGCATG
+CTCTGGGACAAAAGCACCGAAATGGCGAGGGCTATCTGCTTCTTTGTGAGCAACAACTTC
+CGGCTCGAACCTGGCTAAGCACTGTAGAAAACGGTCAACCAGAGAAGTCTATTGCAGTTA
+ATTTTCATTCGATCCCTGATATGGAGTGATACCCCTATGAGCAATACAGATTCACAGACC
+GTACCAGCTGATGCCCTGTGTGAAAACAGTTCTCAGGTGAAAATTCAGCTAAGTCGAAGC
+GCCTCACGAGCATTGACGACGGCGAAAGAAATTCTTGAAACCCGAGGGCTGGTATCCGTA
+TCCACTGAAGACCTTGTTCAGGCCTGTCTCGAAGAAAATCAGCCACTCGACCTGGCAAGT
+ATCTATCTTGAGCACCGGCTAAAACAGAAGGGAACCAGTATCTGTGAATTTTAGTGTTTT
+CCAACCTATTGGGGAAATTCCGGAATGTGTTTATATAGCTGTAAGTAAAGCACTCTACAG
+GTAAATAATGAAAAGCAAAATTCACTCTTCAGGAACGTCCGGCACGAAACGAGTACTTAA
+AACGGATATTGCGTTGCCTCTGCTTTGTTGGGTGTTCACCAGTCCATTCAGTAACTGGAC
+TGATAAGTTTTTTACCGGCACAGAAGTGCCGGAGGGCTCGCTGCCGGGTCTAGAACAGGC
+GCCTGAGGCTATCTTCCGATTTGTGCTCAATGACGAAGGTTTTGATGTTGGTTTTGACGC
+GGTGGGAATGGATCTCTGTTGTTTCTCTATCCCGCTTTCGACGATGCCCACAAAGAATCT
+GGACGACGAAGAGACGTTGTCGAGGCTTACCGGCGACGTGATACACGGCGTCCTGCTTTC
+GCTTCCGGAGTACATTGAAATGCCAGACAGGCTGGTCTATCAGCTAACTGATGAGGTCAT
+GGCGTTCAATTCACACTGTGGCAACGGAATTCTACATGGATGGACGACGGCTCAAGAGTT
+GTGGCGAAACGAGATCCTGCCACGCACCACTATTTTGATGCAGCAGACATCAGTCATTCA
+CTGAGTTCCGGGGGCTCTGGATGAAAAAGCGACTTTACCTTCTTGAATGGAAACTTCGTG
+AGACAAGAGCCTGGTTAGGATGGATGGTGTTCTGGATTATCATCAGTTTTATGTTTTTAT
+CAGCGATGTTCATGACAGGTCATTTGTTAAACAAAGTTGTCCTCCAGCCCGTTTGGCTGT
+GTATCTGGTCTTTACCCTGGCTGGGCTTCTTGTTGAAGGTACGCGTGACCGAAATGGATA
+AAGGGCTCGTGAATACACTTCAGCTCGGAGATCTGCCGGTTTTCCGCTGGAGTCGTTCTG
+TAGTTCCTGGCACCTGGTCTGTTGACAGAATTAATGGACGCTACCGGTTGAACCGGATTG
+GAACGGATGGTTTGACGGTACACTATCCGTGGCGCCTGTACTATCAGCCTTTGTTCCTGA
+CACCGGATAAGCAGATTTCTGATATTAACGGACGTGAACATGAACGAAAATTCTGACGCA
+GTAGTGAGTGCCGCTACTTCCTGCCTGCTGTATGTGCGTGAAATCGAAAGGTCAGGCCCC
+GGTGAAATGCCGGTGTCATATTCAAATGAGCTTATCCAGAGATGGCTTAGTTCGGCTGAA
+CGTCGTAATTTGCATTCCCGCCACAGCTTGCGTTCGATTCGTACAATTCTGAAGCACGCA
+AGGAAGAGCCGTCAGCCTGATTTTTAGAGCGTGATGCATTTGCTGGTGGAAGGGAAGGGT
+GTAATCCCGGATGTTTCAGTATCGGATTTGGGCAATGTGCAGAACATACGTAATGAACTG
+ATTGGTCTGGGTTGGTGGGTGAAGTTTGGTGTAAAGCAGGACTGGCAGCGCATCAATCTG
+CAACGCCAGCCGGTCAGTTTTGGCCTTTTGAATGACCTTAATCGTTGTTTTCGGCATGAC
+GGTCAGCAGGTTGAACCTCTGCCACTTTATACAACCGGCAATCCCGGGGAATTGCGGAAG
+GTGCTGTAAAAGTACAACTACCGGCTGCATATCGACTCTTCAGAAGTCGTTGAAGACGTA
+ACGGTGTTGCGCTGCTTTATTGAAACCGGAGTGATGAATGGCCAGTGAAGATTTACTCTT
+TTACCGTGACCGGATTCTGGAGCGAATTGAAAAGCTCAGATCCTTTCTGAATGACCATCA
+GCCGGTGATGGCCGAGCTGATGACTGTGGGGACCGTCACACGACACGAAGAGCGGTTGAA
+AGAGGTGAACCCCATCGAGGTGAGTACTATTTCAGATGCCTCCGTGGATGAAATTATCCG
+TGTTATTCAGGATTTCTGTATCGATGACATTGATGTACTCAGCAGGAATTCGACGAAAGT
+GACAACCAAATACCCGGGTTTGATTATTGTTCCTGAGGGTGCCGAACAGCTGAGCGGAAT
+TATTTGCGATATAAATGATGCCAAAAGTGACTTTGCCTCTGCAATGAAAAGGGTGAATTC
+GGAGAAACACATCCGGTTTAAGGAAGTTCACCGTAAGCTTCCCGGTCTGGTGACTGCGCA
+TTCCACTCGCAAAATTCTGTTTGTGGAAGAACAGCTCAAAAAAGTTACTTTTGCCTGGCG
+GCTAAACCGAAACCAGGTAAAAACAAACGCAAGTGATCTCATCGCGATGCTGGATAAGCG
+TCGTTTAGTAGCGGTCAAATCGCCCGTGACAACTGACCTGACAGTGGTGGCGAACATCGA
+TAGAGCGAAGGCATTACTGGAAAGAAAAGTACTGAGAGACGGCGAAGGTTATCGCCTTTG
+TCGAACCAATACCTTCCCGGTTCCGATAGCGCATTTGTTCACATACCGGCCTGAAGGCAA
+GGAGCGTGGAAGTAGCAAATATGCCGAGACTGATTACAAGGTGGTGAAAGCCTCATTACC
+CATTTTTGGCGTCGGACAAAAGCCAACAATTAAAAGACTTCAGGACTGGGTGCCAGCGCA
+GGATGAAGCACTGTCCAATGGTCGAAGGAGCAACCATAGCTACACGGAACTTGTACCCGG
+TGCAGATCTTGGCATTTTCATTATGAGAAAGGTCTGAGGAGAAAAGCATGCAATGGATTT
+CCACGACCAGCCAGAAACTTGATGAGAGACTTTATCGTGTCTGTGTCTGGGTGAAAAAAT
+ACCATGAGGATGCCATCAACCGTGTTGTGTTGACGGTTGATCTCAGTAAGGCCCGCCATG
+ACCCGATAGAGGACCAGGTACGGGCCGAGTTACTGTGTGGGCATTATTTTCTGATGCGGA
+AAGAGAACAACGCAAAATCGGCGCCAGCGGATCAGAACTTTGAATTTTTGCCTGACGGCC
+GCAACCTGAGCTGGCAGACGTCGACACCGGGGCTTCAGCACCTTCTCCTGAACAGCAATG
+TACCTGAGTCCCTTAGGCCCCTGGCTGATTACATTCAGATGCGTCTGGCCAAGCTGACCA
+TGGTCCCGATGTCGGGAACCATCATGAAAGCCGCACTGGAAGACAGCATCAGCTGGGTAA
+AAGTGGATCTGCGATACTACTGGCAGTATGAACTGGTTAATTCCCATCTGGGGCCTGTTC
+AGGTAACTCATAAGGCGCTTGTGCGATTCGGGAGGCTGGCAAAACACGATGAAAACGCTA
+GTGCAATTCGAATGCTTCGCCAGCGGTTGTCATCACCGTTTATTCAGGAATTTGAGATGC
+CTGGGGAGGAACTGAAGCGCAAGCAGAAGATCATGAATACCGTTGATGTGAAAATGCTTT
+TCCACACACATTATCCGGGCCAGAAATTACTGCTGGCCCGATATGCTAATGGTTGGGTGC
+TGGTGGATTGTTTCCTGTTCCACCATATCAAACCCAAAAAGAAGGCGAAAAACAAAACCA
+AAGCGGGTAAATCAGAAACTCAAAATATCAAATCGACGGGGAGTGAGGATCATGGAACTG
+GGCATTATGGTGTGCATCGTGTTGTTACTCTCACTGGCAGCGGTGTGGATCAGTAACAAG
+ACGGTCGGATTGCTGGAAATCCATTACTTTAAGCGGCCGCTGAGCATGGAGTATGCAGCC
+TGGCTGCGAGTGATGTGTGCGGGTTTGCTATTTATTTTTATTCAGATGGTCCCGGCATTC
+ACGTTTCTGTATACCCTGAAGCTGGTGGCACTGTTAAATCTGGGCGTGCAGACGATGAAG
+CTAAACGGGGTTTATAAATTTAAACGCACCGGGATGATGCCGCCGAAAGACGCCCCTCAT
+GATCTTGGCCGCTTTAATCCATTTCGAAAGAAGTAATCCTCATTAGCGCCCGCAGGGGCG
+CTACTCATCCAGCGCCTCACGCATGAACTTCGTCATCGCTTTCTTACCTGCGTCAATGTT
+ACGGATATAGCGGGAAACCATTTCTGGATTGCTCCAGTTACCCATCTCCATGATCTGCAA
+GTGCGTGTACCCGGCATTAGCAAGTTCGATGGCGCCGCCAACCCTAACGCTGTGACCAGT
+CCAGCATCGGGTGCCCGCTTCCTGCGGATGAAGTTCATCCCAAAACGCTTCAAAGGCCCG
+GAGCAATGTGTTTTTACTGAGCATACCCTCATCATCGACAATAATGGGCTTTCCATTTTT
+CCCGATCGGGGGACGGGTAGGTCGGTAAGGCATATTATGATTTTTCAGCAGCGTATTGAT
+CTCATTCCCTTTGCTCCGGAGACCCCATCCAGGGGGCATATATCCGCTGTCCTGATAGTT
+AACTGCCTGGAAGAGATAATCCTTCGGATGGCTTTGCTGGTCCCTTTTGACCATATCCAT
+CAGCCTGATTAGGGTGGCAGTGAGATGAGGGGTCAGATGATAGGTAAGCAGGGTACTGAC
+AGTGGATTTTGTCCGGTACACCGTCAGGGTAAAACTGCCTGTCTGTTCATTCAGCACAAG
+GTCCTGCATCCGAATGCGCCGAAGTTCTGCTGAGCGCAACAGTGTTTCAAAACCTGTCCA
+GATAATGCAAAGGTCTCGGAGTTTGCGCACCGACTGTGTCGTACCGTGGGCTTTAATCAA
+AGCTTTCAGGTCGGAGACTAGGAATGGCGTTGCCTGACGAGTCACTTTTTGCTCTCGGGC
+TTCAGCTTGTTCGAGGCTTGCAAGAATACTCTTGACCTTGGATGTGATGATCCCAGGGCG
+ATCGAGTGCTTTCCTATGGATACTGTTCAGCGCGTGCAGACAACCTTTAATGCTGCTGTG
+TGACAGCGAGCCCTGAAGATAGTCCAGATAGGCCAACAACGGGGGTTCTGTCACCGGGAG
+AGAACTGGCAGGCCAGGCTTCGTTTCCCTCCTTTCCTGCATTAGCTTGGTACCACTCGTT
+CCAGGAACGCAGCCATTGAAGGTAAGTTTTAGCCGTGTTGTATTTCATATGAGAAAAGTA
+AAAAATGAGCTCCTTAAGGTCATTATTGGGCACCTCAAACGTGACCAGTTCCTGATGGAG
+GTCTGAGTCTTCAAACTGTCTGGTTACTGGCTTGCTGTTCATGGTGGTCACCTGAATACA
+CTGTTTTTATTTACAGCTATTTTAGCACTGAGGTATCCACTTATGAACAGGTTCACAGCA
+ACTAAAAAAGAGAGAGCGACTACAACAACGATCCGGAGATAAACATCAAATATTTGTGAA
+AAAAATTAGATTCTAGGGACAAAACGACATAAGATTGGGAAACCGTACTTTCGCGGGAAA
+TAAATTAAGGTTGACCATGTCCGAAACTAAGCAGGCGTATTTAATGAAATTTCGTAAGTG
+CTCTTCTTTCGACACACTGGAAAAAGTATTCGAACGACTCTGTGAAAAAAATGCAGGTAT
+AGCATCACTGGAAATTTCCGGGGCATATGACCATCGAAAAGCTGAACTGACAATGAAGAA
+ACTCTACGATAAAGTACCCGCAAGCGTATGGACACTGGTCCGTCAGTAATATGAAGATAT
+TGGTAACCAATTTATCGCCGACTTTTCAGGAAAGGAGATTTATGAAAACGTCAGCAGTAA
+AATTAAAATTTTTTAATATTCTATTAATACCTCTAAATAAGCTTAATTAGTAAAGTCATC
+ACGTCATTCAAAATCCTGTTTCCGCTCCATGGTGGTAACTCGTATGAGAATTAAACATCT
+AATATTTTTACCTGTTCCCTTCATTTCCTTTTATTTAAACGCGGCGAGCTTGGACGAAAT
+GGTGATGCTGCCAACTTACTGATTTAGTGTATGATGGTGTTTTTGAGGTGCTCCAGTGGC
+TTCTGTTTCTATCAGCCGTCCCTCCTGTTCAGCTACTGACGGGGTGGTGCGTAACGGCAA
+AAGCACCGCCGGACATCAGCGCTATCTCTGCTCT
+>NODE_7_length_1329_cov_85.8474:NODE_13_length_9382_cov_42.6014,NODE_20_length_5859_cov_41.9915';
+CTGATGAATCCCCTAATGATTTTTATCAAAATCATTAAGTTAAGGTAGATACACATCTTG
+TCATATGATCAAATGGTTTCGCCAAAAATCAATAATCAGACAACAAAATGTGCGAACTCG
+ATATTTTACACGACTCTCTTTACCAATTCTGCCCCGAATTACACTTAAAACGACTCAACA
+GCTTAACGTTGGCTTGCCACGCCTTACTTGACTGTAAAACTCTCACTCTTACCGAACTTG
+GCCGTAACCTGCCAACCAAAGCGAGAACAAAACATAACATCAAACGAATCGACCGATTGT
+TAGGTAATCGTCACCTCCACAAAGAGCGACTCGCTGTATACCGTTGGCATGCTAGCTTTA
+TCTGTTCGGGCAATACGATGCCCATTGTACTTGTTGACTGGTCTGATATCCGTGAGCAAA
+AACGGCTTATGGTATTGCGAGCTTCAGTCGCACTACACGGTCGTTCTGTTACTCTTTATG
+AGAAAGCGTTCCCGCTTTCAGAGCAATGTTCAAAGAAAGCTCATGACCAATTTCTAGCCG
+ACCTTGCGAGCATTCTACCGAGTAACACCACACCGCTCATTGTCAGTGATGCTGGCTTTA
+AAGTGCCATGGTATAAATCCGTTGAGAAGCTGGGTTGGTACTGGTTAAGTCGAGTAAGAG
+GAAAAGTACAATATGCAGACCTAGGAGCGGAAAACTGGAAACCTATCAGCAACTTACATG
+ATATGTCATCTAGTCACTCAAAGACTTTAGGCTATAAGAGGCTGACTAAAAGCAATCCAA
+TCTCATGCCAAATTCTATTGTATAAATCTCGCTCTAAAGGCCGAAAAAATCAGCGCTCGA
+CACGGACTCATTGTCACCACCCGTCACCTAAAATCTACTCAGCGTCGGCAAAGGAGCCAT
+GGATTCTAGCAACTAACTTACCTGTTGAAATTCGAACACCCAAACAACTTGTTAATATCT
+ATTCGAAGCGAATGCAGATTGAAGAAACCTTCCGAGACTTGAAAAGTCCTGCCTACGGAC
+TAGGCCTACGCCATAGCCGAACGAGCAGCTCAGAGCGTTTTGATATCATGCTGCTAATCG
+CCCTGATGCTTCAACTAACATGTTGGCTTGCGGGCGTTCATGCTCAGAAACAAGGTTGGG
+ACAAGCACTTCCAGGCTAACACAGTCAGAAATCGAAACGTACTCTCAACAGTTCGCTTAG
+GCATGGAAGTTTTGCGGCATTCTGGCTACACAATAACAAGGGAAGACTCACTCGTGGCTG
+CAACCCTGCTTACTCAAAATCTATTCACACATGGTTACGTTTTGGGGAAATTATGAGGGG
+ATCTCTCAG
+>NODE_7_length_1329_cov_85.8474':NODE_16_length_35628_cov_42.0221',NODE_25_length_15938_cov_42.5346';
+CTGAGAGATCCCCTCATAATTTCCCCAAAACGTAACCATGTGTGAATAGATTTTGAGTAA
+GCAGGGTTGCAGCCACGAGTGAGTCTTCCCTTGTTATTGTGTAGCCAGAATGCCGCAAAA
+CTTCCATGCCTAAGCGAACTGTTGAGAGTACGTTTCGATTTCTGACTGTGTTAGCCTGGA
+AGTGCTTGTCCCAACCTTGTTTCTGAGCATGAACGCCCGCAAGCCAACATGTTAGTTGAA
+GCATCAGGGCGATTAGCAGCATGATATCAAAACGCTCTGAGCTGCTCGTTCGGCTATGGC
+GTAGGCCTAGTCCGTAGGCAGGACTTTTCAAGTCTCGGAAGGTTTCTTCAATCTGCATTC
+GCTTCGAATAGATATTAACAAGTTGTTTGGGTGTTCGAATTTCAACAGGTAAGTTAGTTG
+CTAGAATCCATGGCTCCTTTGCCGACGCTGAGTAGATTTTAGGTGACGGGTGGTGACAAT
+GAGTCCGTGTCGAGCGCTGATTTTTTCGGCCTTTAGAGCGAGATTTATACAATAGAATTT
+GGCATGAGATTGGATTGCTTTTAGTCAGCCTCTTATAGCCTAAAGTCTTTGAGTGACTAG
+ATGACATATCATGTAAGTTGCTGATAGGTTTCCAGTTTTCCGCTCCTAGGTCTGCATATT
+GTACTTTTCCTCTTACTCGACTTAACCAGTACCAACCCAGCTTCTCAACGGATTTATACC
+ATGGCACTTTAAAGCCAGCATCACTGACAATGAGCGGTGTGGTGTTACTCGGTAGAATGC
+TCGCAAGGTCGGCTAGAAATTGGTCATGAGCTTTCTTTGAACATTGCTCTGAAAGCGGGA
+ACGCTTTCTCATAAAGAGTAACAGAACGACCGTGTAGTGCGACTGAAGCTCGCAATACCA
+TAAGCCGTTTTTGCTCACGGATATCAGACCAGTCAACAAGTACAATGGGCATCGTATTGC
+CCGAACAGATAAAGCTAGCATGCCAACGGTATACAGCGAGTCGCTCTTTGTGGAGGTGAC
+GATTACCTAACAATCGGTCGATTCGTTTGATGTTATGTTTTGTTCTCGCTTTGGTTGGCA
+GGTTACGGCCAAGTTCGGTAAGAGTGAGAGTTTTACAGTCAAGTAAGGCGTGGCAAGCCA
+ACGTTAAGCTGTTGAGTCGTTTTAAGTGTAATTCGGGGCAGAATTGGTAAAGAGAGTCGT
+GTAAAATATCGAGTTCGCACATTTTGTTGTCTGATTATTGATTTTTGGCGAAACCATTTG
+ATCATATGACAAGATGTGTATCTACCTTAACTTAATGATTTTGATAAAAATCATTAGGGG
+ATTCATCAG
+>NODE_8_length_346_cov_41.0595:NODE_27_length_78_cov_99';
+TAAGCAGAGTTTTTGAAATGTAAGGCCTTTGAATAAGACAAAAGGCTGCCTCATCGCTAA
+CTTTGCAACAGTGCCGGCGCGAGCACCTGAGCGAGCTGCAAACCGTGTTCGGTTTCCGGC
+CCTTCACCATGAGCCATTACCGGCAGGCCGTCCAGATGCTGACCGAGCTGGCGATGCAAA
+CCGACAAAGGCATCGTGCTGGCCAGCGCCTTGATCGGGCACCTGCGGCGGCAGTCGGTCA
+TTCTGCCCGCCCTCAACGCCGTCGAGCGGGGGCACTGTTGCAAAGTTAGCGATGAGGCAG
+CCTTTTGTCTTATTCAAAGGCCTTACATTTCAAAAACTCTGCTTAC
+>NODE_8_length_346_cov_41.0595':NODE_28_length_79_cov_78';
+GTAAGCAGAGTTTTTGAAATGTAAGGCCTTTGAATAAGACAAAAGGCTGCCTCATCGCTA
+ACTTTGCAACAGTGCCCCCGCTCGACGGCGTTGAGGGCGGGCAGAATGACCGACTGCCGC
+CGCAGGTGCCCGATCAAGGCGCTGGCCAGCACGATGCCTTTGTCGGTTTGCATCGCCAGC
+TCGGTCAGCATCTGGACGGCCTGCCGGTAATGGCTCATGGTGAAGGGCCGGAAACCGAAC
+ACGGTTTGCAGCTCGCTCAGGTGCTCGCGCCGGCACTGTTGCAAAGTTAGCGATGAGGCA
+GCCTTTTGTCTTATTCAAAGGCCTTACATTTCAAAAACTCTGCTTA
+>NODE_9_length_4537_cov_41.0029:NODE_27_length_78_cov_99';
+TAAGCAGAGTTTTTGAAATGTAAGGCCTTTGAATAAGACAAAAGGCTGCCTCATCGCTAA
+CTTTGCAACAGTGCCGGTAAATCCATGCTGGCCCTGCAACTGGCCGCACAGATTGCAGGC
+GGGCCGGATCTGCTGGAGGTGGGCGAACTGCCCACCGGCCCGGTGATCTACCTGCCCGCC
+GAAGACCCGCCCACCGCCATTCATCACCGCCTGCACGCCCTTGGGGCGCACCTCAGCGCC
+GAGGAACGGCAAGCCGTGGCTGACGGCCTGCTGATCCAGCCGCTGATCGGCAGCCTGCCC
+AACATCATGGCCCCGGAGTGGTTCGACGGCCTCAAGCGCGCCGCCGAGGGCCGCCGCCTG
+ATGGTGCTGGACACGCTGCGCCGGTTCCACATCGAGGAAGAAAACGCCAGCGGCCCCATG
+GCCCAGGTCATCGGTCGCATGGAGGCCATCGCCGCCGATACCGGGTGCTCTATCGTGTTC
+CTGCACCATGCCAGCAAGGGCGCGGCCATGATGGGCGCAGGCGACCAGCAGCAGGCCAGC
+CGGGGCAGCTCGGTACTGGTCGATAACATCCGCTGGCAGTCCTACCTGTCGAGCATGACC
+AGCGCCGAGGCCGAGGAATGGGGTGTGGACGACGACCAGCGCCGGTTCTTCGTCCGCTTC
+GGTGTGAGCAAGGCCAACTATGGCGCACCGTTCGCTGATCGGTGGTTCAGGCGGCATGAC
+GGCGGGGTGCTCAAGCCCGCCGTGCTGGAGAGGCAGCGCAAGAGCAAGGGGGTGCCCCGT
+GGTGAAGCCTAAGAACAAGCACAGCCTCAGCCACGTCCGGCACGACCCGGCGCACTGTCT
+GGCCCCCGGCCTGTTCCGTGCCCTCAAGCGGGGCGAGCGCAAGCGCAGCAAGCTGGACGT
+GACGTATGACTACGGCGACGGCAAGCGGATCGAGTTCAGCGGCCCGGAGCCGCTGGGCGC
+TGATGATCTGCGCATCCTGCAAGGGCTGGTGGCCATGGCTGGGCCTAATGGCCTAGTGCT
+TGGCCCGGAACCCAAGACCGAAGGCGGACGGCAGCTCCGGCTGTTCCTGGAACCCAAGTG
+GGAGGCCGTCACCGCTGATGCCATGGTGGTCAAAGGTAGCTATCGGGCGCTGGCAAAGGA
+AATCGGGGCAGAGGTCGATAGTGGTGGGGCGCTCAAGCACATACAGGACTGCATCGAGCG
+CCTTTGGAAGGTATCCATCATCGCCCAGAATGGCCGCAAGCGGCAGGGGTTTCGGCTGCT
+GTCGGAGTACGCCAGCGACGAGGCGGACGGGCGCCTGTACGTGGCCCTGAACCCCTTGAT
+CGCGCAGGCCGTCATGGGTGGCGGCCAGCATGTGCGCATCAGCATGGACGAGGTGCGGGC
+GCTGGACAGCGAAACCGCCCGCCTGCTGCACCAGCGGCTGTGTGGCTGGATCGACCCCGG
+CAAAACCGGCAAGGCTTCCATAGATACCTTGTGCGGCTATGTCTGGCCGTCAGAGGCCAG
+TGGTTCGACCATGCGCAAGCGCCGCCAGCGGGTGCGCGAGGCGTTGCCGGAGCTGGTCGC
+GCTGGGCTGGACGGTAACCGAGTTCGCGGCGGGCAAGTACGACATCACCCGGCCCAAGGC
+GGCAGGCTGACCCCCCCCACTCTATTGTAAACAAGACATTTTTATCTTTTATATTCAATG
+GCTTATTTTCCTGCTAATTGGTAATACCATGAAAAATACCATGCTCAGAAAAGGCTTAAC
+AATATTTTGAAAAATTGCCTACTGAGCGCTGCCGCACAGCTCCATAGGCCGCTTTCCTGG
+CTTTGCTTCCAGATGTATGCTATTCTGCTCCTGCAGCTAATGGATCACCGCAAACAGGTT
+ACTCGCCTGGGGATTCCCTTTCGACCCGAGCATCCGTATGAGACTCATGCTCGATTATTA
+TTATTATAGAAGCCCCCATGAATAAATCGCTCATCATTTTCGGCATCGTCAACATAACCT
+CGGACAGTTTCTCCGATGGAGGCCGGTATCTGGCGCCAGACGCAGCCATTGCGCAGGCGC
+GTAAGCTGATGGCCGAGGGGGCAGATGTGATCGACCTCGGTCCGGCATCCAGCAACCCCG
+ACGCCGCGCCTGTTTCGTCCGACACAGAAATCGAGCGTATCGCGCCGGTGCTGGACGCGC
+TCAAGGCAGATGGCATTCCCGTCTCGCTCGACAGTTATCAACCCGCGACGCAAGCCTATG
+CCTTGTCGCGTGGTGTGGCCTATCTCAATGATATTCGCGGTTTTCCAGACGCTGCGTTCT
+ATCCGCAATTGGCGAAATCATCTGCCAAACTCGTCGTTATGCATTCGGTGCAAGACGGGC
+AGGCAGATCGGCGCGAGGCACCCGCTGGCGACATCATGGATCACATTGCGGCGTTCTTTG
+ACGCGCGCATCGCGGCGCTGACGGGTGCCGGTATCAAACGCAACCGCCTTGTCCTTGATC
+CCGGCATGGGGTTTTTTCTGGGGGCTGCTCCCGAAACCTCGCTCTCGGTGCTGGCGCGGT
+TCGATGAATTGCGGCTGCGCTTCGATTTGCCGGTGCTTCTGTCTGTTTCGCGCAAATCCT
+TTCTGCGCGCGCTCACAGGCCGTGGTCCGGGGGATGTCGGGGCCGCGACACTCGCTGCAG
+AGCTTGCCGCCGCCGCAGGTGGAGCTGACTTCATCCGCACACACGAGCCGCGCCCCTTGC
+GCGACGGGCTGGCGGTATTGGCGGCGCTAAAAGAAACCGCAAGAATTCGTTAACTGCACA
+TTCGGGATATTTCTCTATATTCGCGCTTCATCAGAAAACTGAAGGAACCTCCATTGAATC
+GAACTAATATTTTTTTTGGTGAATCGCATTCTGACTGGTTGCCTGTCAGAGGCGGAGAAT
+CTGGTGATTTTGTTTTTCGACGTGGTGACGGGCATGCCTTCGCGAAAATCGCACCTGCTT
+CCCGCCGCGGTGAGCTCGCTGGAGAGCGTGACCGCCTCATTTGGCTCAAAGGTCGAGGTG
+TGGCTTGCCCCGAGGTCATCAACTGGCAGGAGGAACAGGAGGGTGCATGCTTGGTGATAA
+CGGCAATTCCGGGAGTACCGGCGGCTGATCTGTCTGGAGCGGATTTGCTCAAAGCGTGGC
+CGTCAATGGGGCAGCAACTTGGCGCTGTTCACAGCCTATCGGTTGATCAATGTCCGTTTG
+AGCGCAGGCTGTCGCGAATGTTCGGACGCGCCGTTGATGTGGTGTCCCGCAATGCCGTCA
+ATCCCGACTTCTTACCGGACGAGGACAAGAGTACGCCGCAGCTCGATCTTTTGGCTCGTG
+TCGAACGAGAGCTACCGGTGCGGCTCGACCAAGAGCGCACCGATATGGTTGTTTGCCATG
+GTGATCCCTGCATGCCGAACTTCATGGTGGACCCTAAAACTCTTCAATGCACGGGTCTGA
+TCGACCTTGGGCGGCTCGGAACAGCAGATCGCTATGCCGATTTGGCACTCATGATTGCTA
+ACGCCGAAGAGAACTGGGCAGCGCCAGATGAAGCAGAGCGCGCCTTCGCTGTCCTATTCA
+ATGTATTGGGGATCGAAGCCCCCGACCGCGAACGCCTTGCCTTCTATCTGCGATTGGACC
+CTCTGACTTGGGGTTGATGTTCATGCCGCCTGTTTTTCCTGCTCATTGGCACGTTTCGCA
+ACCTGTTCTCATTGCGGACACCTTTTCCAGCCTCGTTTGGAAAGTTTCATTGCCAGACGG
+GACTCCTGCAATCGTCAAGGGATTGAAACCTATAGAAGACATTGCTGATGAACTGCGCGG
+GGCCGACTATCTGGTATGGCGCAATGGGAGGGGAGCAGTCCGGTTGCTCGGTCGTGAGAA
+CAATCTGATGTTGCTCGAATATGCCGGGGAGCGAATGCTCTCTCACATCGTTGCCGAGCA
+CGGCGACTACCAGGCGACCGAAATTGCAGCGGAACTAATGGCGAAGCTGTATGCCGCATC
+TGAGGAACCCCTGCCTTCTGCCCTTCTCCCGATCCGGGATCGCTTTGCAGCTTTGTTTCA
+GCGGGCGCGCGATGATCAAAACGCAGGTTGTCAAACTGACTACGTCCACGCGGCGATTAT
+AGCCGATCAAATGATGAGCAATGCCTCGGAACTGCGTGGGCTACATGGCGATCTGCATCA
+TGAAAACATCATGTTCTCCAGTCGCGGCTGGCTGGTGATAGATCCCGTCGGTCTGGTCGG
+TGAAGTGGGCTTTGGCGCCGCCAATATGTTCTACGATCCGGCTGACAGAGACGACCTTTG
+TCTCGATCCTAGACGCATTGCACAGATGGCGGACGCATTCTCTCGTGCGCTGGACGTCGA
+TCCGCGTCGCCTGCTCGACCAGGCGTACGCTTATGGGTGCCTTTCCGCAGCTTGGAACGC
+GGATGGAGAAGAGGAGCAACGCGATCTAGCTATCGCGGCCGCGATCAAGCAGGTGCGACA
+GACGTCATACTAGATATCAAGGGCACTGTTGCAAAGTTAGCGATGAGGCAGCCTTTTGTC
+TTATTCAAAGGCCTTACATTTCAAAAACTCTGCTTAC
+>NODE_9_length_4537_cov_41.0029':NODE_28_length_79_cov_78';
+GTAAGCAGAGTTTTTGAAATGTAAGGCCTTTGAATAAGACAAAAGGCTGCCTCATCGCTA
+ACTTTGCAACAGTGCCCTTGATATCTAGTATGACGTCTGTCGCACCTGCTTGATCGCGGC
+CGCGATAGCTAGATCGCGTTGCTCCTCTTCTCCATCCGCGTTCCAAGCTGCGGAAAGGCA
+CCCATAAGCGTACGCCTGGTCGAGCAGGCGACGCGGATCGACGTCCAGCGCACGAGAGAA
+TGCGTCCGCCATCTGTGCAATGCGTCTAGGATCGAGACAAAGGTCGTCTCTGTCAGCCGG
+ATCGTAGAACATATTGGCGGCGCCAAAGCCCACTTCACCGACCAGACCGACGGGATCTAT
+CACCAGCCAGCCGCGACTGGAGAACATGATGTTTTCATGATGCAGATCGCCATGTAGCCC
+ACGCAGTTCCGAGGCATTGCTCATCATTTGATCGGCTATAATCGCCGCGTGGACGTAGTC
+AGTTTGACAACCTGCGTTTTGATCATCGCGCGCCCGCTGAAACAAAGCTGCAAAGCGATC
+CCGGATCGGGAGAAGGGCAGAAGGCAGGGGTTCCTCAGATGCGGCATACAGCTTCGCCAT
+TAGTTCCGCTGCAATTTCGGTCGCCTGGTAGTCGCCGTGCTCGGCAACGATGTGAGAGAG
+CATTCGCTCCCCGGCATATTCGAGCAACATCAGATTGTTCTCACGACCGAGCAACCGGAC
+TGCTCCCCTCCCATTGCGCCATACCAGATAGTCGGCCCCGCGCAGTTCATCAGCAATGTC
+TTCTATAGGTTTCAATCCCTTGACGATTGCAGGAGTCCCGTCTGGCAATGAAACTTTCCA
+AACGAGGCTGGAAAAGGTGTCCGCAATGAGAACAGGTTGCGAAACGTGCCAATGAGCAGG
+AAAAACAGGCGGCATGAACATCAACCCCAAGTCAGAGGGTCCAATCGCAGATAGAAGGCA
+AGGCGTTCGCGGTCGGGGGCTTCGATCCCCAATACATTGAATAGGACAGCGAAGGCGCGC
+TCTGCTTCATCTGGCGCTGCCCAGTTCTCTTCGGCGTTAGCAATCATGAGTGCCAAATCG
+GCATAGCGATCTGCTGTTCCGAGCCGCCCAAGGTCGATCAGACCCGTGCATTGAAGAGTT
+TTAGGGTCCACCATGAAGTTCGGCATGCAGGGATCACCATGGCAAACAACCATATCGGTG
+CGCTCTTGGTCGAGCCGCACCGGTAGCTCTCGTTCGACACGAGCCAAAAGATCGAGCTGC
+GGCGTACTCTTGTCCTCGTCCGGTAAGAAGTCGGGATTGACGGCATTGCGGGACACCACA
+TCAACGGCGCGTCCGAACATTCGCGACAGCCTGCGCTCAAACGGACATTGATCAACCGAT
+AGGCTGTGAACAGCGCCAAGTTGCTGCCCCATTGACGGCCACGCTTTGAGCAAATCCGCT
+CCAGACAGATCAGCCGCCGGTACTCCCGGAATTGCCGTTATCACCAAGCATGCACCCTCC
+TGTTCCTCCTGCCAGTTGATGACCTCGGGGCAAGCCACACCTCGACCTTTGAGCCAAATG
+AGGCGGTCACGCTCTCCAGCGAGCTCACCGCGGCGGGAAGCAGGTGCGATTTTCGCGAAG
+GCATGCCCGTCACCACGTCGAAAAACAAAATCACCAGATTCTCCGCCTCTGACAGGCAAC
+CAGTCAGAATGCGATTCACCAAAAAAAATATTAGTTCGATTCAATGGAGGTTCCTTCAGT
+TTTCTGATGAAGCGCGAATATAGAGAAATATCCCGAATGTGCAGTTAACGAATTCTTGCG
+GTTTCTTTTAGCGCCGCCAATACCGCCAGCCCGTCGCGCAAGGGGCGCGGCTCGTGTGTG
+CGGATGAAGTCAGCTCCACCTGCGGCGGCGGCAAGCTCTGCAGCGAGTGTCGCGGCCCCG
+ACATCCCCCGGACCACGGCCTGTGAGCGCGCGCAGAAAGGATTTGCGCGAAACAGACAGA
+AGCACCGGCAAATCGAAGCGCAGCCGCAATTCATCGAACCGCGCCAGCACCGAGAGCGAG
+GTTTCGGGAGCAGCCCCCAGAAAAAACCCCATGCCGGGATCAAGGACAAGGCGGTTGCGT
+TTGATACCGGCACCCGTCAGCGCCGCGATGCGCGCGTCAAAGAACGCCGCAATGTGATCC
+ATGATGTCGCCAGCGGGTGCCTCGCGCCGATCTGCCTGCCCGTCTTGCACCGAATGCATA
+ACGACGAGTTTGGCAGATGATTTCGCCAATTGCGGATAGAACGCAGCGTCTGGAAAACCG
+CGAATATCATTGAGATAGGCCACACCACGCGACAAGGCATAGGCTTGCGTCGCGGGTTGA
+TAACTGTCGAGCGAGACGGGAATGCCATCTGCCTTGAGCGCGTCCAGCACCGGCGCGATA
+CGCTCGATTTCTGTGTCGGACGAAACAGGCGCGGCGTCGGGGTTGCTGGATGCCGGACCG
+AGGTCGATCACATCTGCCCCCTCGGCCATCAGCTTACGCGCCTGCGCAATGGCTGCGTCT
+GGCGCCAGATACCGGCCTCCATCGGAGAAACTGTCCGAGGTTATGTTGACGATGCCGAAA
+ATGATGAGCGATTTATTCATGGGGGCTTCTATAATAATAATAATCGAGCATGAGTCTCAT
+ACGGATGCTCGGGTCGAAAGGGAATCCCCAGGCGAGTAACCTGTTTGCGGTGATCCATTA
+GCTGCAGGAGCAGAATAGCATACATCTGGAAGCAAAGCCAGGAAAGCGGCCTATGGAGCT
+GTGCGGCAGCGCTCAGTAGGCAATTTTTCAAAATATTGTTAAGCCTTTTCTGAGCATGGT
+ATTTTTCATGGTATTACCAATTAGCAGGAAAATAAGCCATTGAATATAAAAGATAAAAAT
+GTCTTGTTTACAATAGAGTGGGGGGGGTCAGCCTGCCGCCTTGGGCCGGGTGATGTCGTA
+CTTGCCCGCCGCGAACTCGGTTACCGTCCAGCCCAGCGCGACCAGCTCCGGCAACGCCTC
+GCGCACCCGCTGGCGGCGCTTGCGCATGGTCGAACCACTGGCCTCTGACGGCCAGACATA
+GCCGCACAAGGTATCTATGGAAGCCTTGCCGGTTTTGCCGGGGTCGATCCAGCCACACAG
+CCGCTGGTGCAGCAGGCGGGCGGTTTCGCTGTCCAGCGCCCGCACCTCGTCCATGCTGAT
+GCGCACATGCTGGCCGCCACCCATGACGGCCTGCGCGATCAAGGGGTTCAGGGCCACGTA
+CAGGCGCCCGTCCGCCTCGTCGCTGGCGTACTCCGACAGCAGCCGAAACCCCTGCCGCTT
+GCGGCCATTCTGGGCGATGATGGATACCTTCCAAAGGCGCTCGATGCAGTCCTGTATGTG
+CTTGAGCGCCCCACCACTATCGACCTCTGCCCCGATTTCCTTTGCCAGCGCCCGATAGCT
+ACCTTTGACCACCATGGCATCAGCGGTGACGGCCTCCCACTTGGGTTCCAGGAACAGCCG
+GAGCTGCCGTCCGCCTTCGGTCTTGGGTTCCGGGCCAAGCACTAGGCCATTAGGCCCAGC
+CATGGCCACCAGCCCTTGCAGGATGCGCAGATCATCAGCGCCCAGCGGCTCCGGGCCGCT
+GAACTCGATCCGCTTGCCGTCGCCGTAGTCATACGTCACGTCCAGCTTGCTGCGCTTGCG
+CTCGCCCCGCTTGAGGGCACGGAACAGGCCGGGGGCCAGACAGTGCGCCGGGTCGTGCCG
+GACGTGGCTGAGGCTGTGCTTGTTCTTAGGCTTCACCACGGGGCACCCCCTTGCTCTTGC
+GCTGCCTCTCCAGCACGGCGGGCTTGAGCACCCCGCCGTCATGCCGCCTGAACCACCGAT
+CAGCGAACGGTGCGCCATAGTTGGCCTTGCTCACACCGAAGCGGACGAAGAACCGGCGCT
+GGTCGTCGTCCACACCCCATTCCTCGGCCTCGGCGCTGGTCATGCTCGACAGGTAGGACT
+GCCAGCGGATGTTATCGACCAGTACCGAGCTGCCCCGGCTGGCCTGCTGCTGGTCGCCTG
+CGCCCATCATGGCCGCGCCCTTGCTGGCATGGTGCAGGAACACGATAGAGCACCCGGTAT
+CGGCGGCGATGGCCTCCATGCGACCGATGACCTGGGCCATGGGGCCGCTGGCGTTTTCTT
+CCTCGATGTGGAACCGGCGCAGCGTGTCCAGCACCATCAGGCGGCGGCCCTCGGCGGCGC
+GCTTGAGGCCGTCGAACCACTCCGGGGCCATGATGTTGGGCAGGCTGCCGATCAGCGGCT
+GGATCAGCAGGCCGTCAGCCACGGCTTGCCGTTCCTCGGCGCTGAGGTGCGCCCCAAGGG
+CGTGCAGGCGGTGATGAATGGCGGTGGGCGGGTCTTCGGCGGGCAGGTAGATCACCGGGC
+CGGTGGGCAGTTCGCCCACCTCCAGCAGATCCGGCCCGCCTGCAATCTGTGCGGCCAGTT
+GCAGGGCCAGCATGGATTTACCGGCACTGTTGCAAAGTTAGCGATGAGGCAGCCTTTTGT
+CTTATTCAAAGGCCTTACATTTCAAAAACTCTGCTTA
+>NODE_10_length_211_cov_46.2537:NODE_29_length_751_cov_85.3516';
+CACAATTTGTCCGCCCGTTCGTTAAAAGCAATAAAAACGACTTTGTCGACGCCGAAGCTA
+TTTGTGAAGCTGCATCGCGTCCGTCTATGCGTTTTGTGCAGCCCAGAACGGAATCTCAGC
+AGGCAATGCGGGCTCTGCATCGTGTCCGTGAATCCCTGGTTCAGGATAAGGTAAAAACAA
+CCAATCAAATGCATGCTTTTCTGCTGGAATT
+>NODE_10_length_211_cov_46.2537':NODE_12_length_394_cov_88.6719;
+AATTCCAGCAGAAAAGCATGCATTTGATTGGTTGTTTTTACCTTATCCTGAACCAGGGAT
+TCACGGACACGATGCAGAGCCCGCATTGCCTGCTGAGATTCCGTTCTGGGCTGCACAAAA
+CGCATAGACGGACGCGATGCAGCTTCACAAATAGCTTCGGCGTCGACAAAGTCGTTTTTA
+TTGCTTTTAACGAACGGGCGGACAAATTGTG
+>NODE_11_length_146_cov_38.8551:NODE_29_length_751_cov_85.3516';
+CACAATTTGTCCGCCCGTTCGTTAAAAGCAATAAAAACGACTTTGTCGACGCCGAAGCTA
+TTTGTGAAGCTGCATCGTGTCCGTGAATCCCTGGTTCAGGATAAGGTAAAAACAACCAAT
+CAAATGCATGCTTTTCTGCTGGAATT
+>NODE_11_length_146_cov_38.8551':NODE_12_length_394_cov_88.6719;
+AATTCCAGCAGAAAAGCATGCATTTGATTGGTTGTTTTTACCTTATCCTGAACCAGGGAT
+TCACGGACACGATGCAGCTTCACAAATAGCTTCGGCGTCGACAAAGTCGTTTTTATTGCT
+TTTAACGAACGGGCGGACAAATTGTG
+>NODE_12_length_394_cov_88.6719:NODE_1_length_6070_cov_43.3434',NODE_36_length_2625_cov_42.3034';
+CGATGCAGCTTCACAAATAGCTTCGGCGTCGACAAAGTCGTTTTTATTGCTTTTAACGAA
+CGGGCGGACAAATTGTGGTGATATCAGCTTTGGGGAATGCCCCAACTCTTCCAACTTGCG
+TGCCATAAAGTGAGAACCGCCACAGGCTTCCATTGCGATGGTTGTAGCGGGGCATGTCGC
+CAAAAATTCGATCAACTTTGGCCGGGTAAATTTTTTACGGTAAACAGCCTTCCCGCGACG
+ATCCTGGCAATGAATATGGAAAGAGTTTTTACCCAGATCGATACCAATGAGCGCAATGTT
+TTCCATGATAGTTCTCCGAATGAAAGCCTGTCCTCAGCATAGTACCGGGAAGGAGGGAGT
+GACCATCTCATTAAATAAAGCACGCTAAGCCGGT
+>NODE_12_length_394_cov_88.6719':NODE_10_length_211_cov_46.2537,NODE_11_length_146_cov_38.8551;
+ACCGGCTTAGCGTGCTTTATTTAATGAGATGGTCACTCCCTCCTTCCCGGTACTATGCTG
+AGGACAGGCTTTCATTCGGAGAACTATCATGGAAAACATTGCGCTCATTGGTATCGATCT
+GGGTAAAAACTCTTTCCATATTCATTGCCAGGATCGTCGCGGGAAGGCTGTTTACCGTAA
+AAAATTTACCCGGCCAAAGTTGATCGAATTTTTGGCGACATGCCCCGCTACAACCATCGC
+AATGGAAGCCTGTGGCGGTTCTCACTTTATGGCACGCAAGTTGGAAGAGTTGGGGCATTC
+CCCAAAGCTGATATCACCACAATTTGTCCGCCCGTTCGTTAAAAGCAATAAAAACGACTT
+TGTCGACGCCGAAGCTATTTGTGAAGCTGCATCG
+>NODE_13_length_9382_cov_42.6014:NODE_37_length_78_cov_92;
+CGTGGCTGCAACCCTGCTTACTCAAAATCTATTCACACATGGTTACGTTTTGGGGAAATT
+ATGAGGGGATCTCTCAGAGTTCAGTGTTTATGAAAGATACTGGGAAATAGTTCAGCCAAA
+TAAATAACATAGATTTGCGTGAGATTTATAATACAAAACGCTCATTAGGTCTATGTCTTT
+AAAGGCGCGTGGCTTAATGGGCAATTAAATCCATACTCCTGCAATACATGCTTCAATCCT
+CAACTCGTTTGATAATGGCTGTATTTAATTTGCTGGATTCCACCATTTAAAATGGACAGG
+CTCTGTTTTAAATGAATCACCTGTTTCCGCATGCCAGGTTATTTGGGTGAACAGCCAATA
+TGGTATGATGTTTATAACAAACAAATTCGGAAGGTATAGTTTATGGGGGACCTGGTCAGT
+AAAAATAATATCGATCGCCTTGAACGATTTCATTCTCTGCTGGCAGGGCAGTATTGGTCT
+GCGCTCGTCGATATTCCGGCTGAGGCGATTGTGGCCGGGGACACTCTCCTCATTAACTCG
+TTGCGGTACGTGGATAACAATCTGCATACCGTCATCCTTCGCGCTCACCCCCGGCATTAC
+GGGGAATGGGTAAGCGTTGAAATCGTCGCTGAGAACGGTTCAAAATCAACGAAAGACAAG
+AGACTGAATGAGCATCGGTTTCTGACGGCCGATTTCCTCGCGTTGTTTGAATATCAGCCC
+GACCATGAAATTATCCGTCAGTCGGAGCTCAAAGGCATTCAGGATGAGGTCGCTGACCTG
+CAAATGCGTCTTACGGAAACTCTGCAAGATCCCTCTGCACTCCGGGAACTGGCTATTAAA
+AGGGTCGAAGACGAAGAGGCCAGTAAAAAGGGGGGGGCAACTGAGGACAGAATGCTTCCA
+GCCGTCAGGAATGCAGAAGATGTTGCAGTCACCATGGCGCTGGGTACAGTGCAGAATGCC
+CTTTCTCAGGGGATTTCAGAGGCTCAGGTTTCTCTGATGGCGAAAGTTGCGGAACGGGAA
+GGCAAGATTGCCGGTGCCGTAGCTAACATTATTACGTCGCGTACCGGCGCCATCACCCGG
+GCGCTGGAGAAAATGCATCCGTATTATGCGGAGCTGGCCGCTGCCAAGCTGGCCGGAACG
+CAGGAGGGCATTGAGCAAGCCAGCAAAATTCAGGCAGGTGTTCTCACGCTGGAATTATTC
+GTCGGCAAAAACGTGACGGTAGTTGATGTTGCGGAAGGCGAGCCAGCAGACAGCAGCATC
+CCGTTGACGCTGTGTCAGAAGAAACTCGTCGTGGATGAGGAGTTTTCTGCCTGGAGCGAT
+ATCGACGAACATTTTGATTTCAGGAGTCTTTCCGCATTCCTCAAGGCGCTAAAAGATAAC
+CAGGGGCTGGTGGAGCAAATTTTCCCGACTGAGCGCTGCGTACTTGTCATGGTCACTACC
+CGCAGATTTATTGACTATGGTGATACCTGGGCGAATGCTGAAAACAACGAAAAGAACAGC
+ATCGTGTTTCTGATGGTCCGCAACGGGCAAAATATCAAACAGATCTATTCCCCGGTGGAG
+AGCCATCTTGGGGCGTCCCGGTTATTTCCCTCTGAAGATGAGCAGCAGGGCCACTTCCGA
+GGGTTTGACGGTACCACCATCAAATTTGAAGATGTGGCTTATACCGATCGTCTCAAAGCC
+CATGACCTGATGGCTCTGCATTACCGACGTCTGCTTATCATGCTGTTTGGTCTTGACCAG
+CGACTGGCTCTCTTTGGTCAGTTCTATCCCCAGCATGAAAAGGCGAATTTCTTGAATCTG
+AGCTTCCAGGAACGGTACTTCCATTTTCTGCACGATGAAGACGGCACAGGGCTGCTGGCA
+TCACCAGACTCGCAGACGCTCGATGAATTTATTAGTGAAAAAAACTCCTATATTCAACCG
+GGCTCGCGGCTGCTCTGCAACTGGCGTGAGCTTATGACCCCCAGAACAGCACCTGGTGCC
+GTTAAAGAGGACAGCGGCTATTCAGGGTACTCCTTCATCGCTGACCCTGAGGATAATGTC
+TCTGCTGCGGTTGTGTATCGTCAGGGAGATACTCTGGCCGTTGATGTGGCGGTGAAGCGA
+TTCAGTACAGATAAGATGTTTAACTGTAAGGTAAACGTCTCTGCATATAGCCCGTGGCGG
+CGTGGAGAAGCTGAACTTGCTTATTTGTGCCTTGATGCAGTGGGCCCGGAGGAGCTGACC
+CGGTTTATCCAGCAACGCAAATTCCGGAGTAACCACCTTTTTTATATTCGCTTTTTTAAG
+GCCGCGATCAAATTCCTGGAACAGGAGCGAGAAAACGAACTGCCGCACCGGCAATATCTG
+CTGGCTGCAATGCAGGATTCGGGGATGCACCTGCCGGGGAATATCCAGGAACTGATTCAC
+CAGTGTATTGCTTCATGGAAGACCGGCAACCGTGGGGTTTCCCTCGCTGTCGGGATGAGT
+ACCGAAAAAGGGCGCCAGGCACTGCTGAATCAGCTCTACAGGCTCACTCAGGGTGCAAGC
+GAAATGGTATCGGTCATTCAGGAGCACGTCGCTGCGTCCGGCTCGCAACTTCTTCGGGCC
+GGGGTTAACTCGTCAGGGAATTACGTCGCATTTATCGCGCCTAAACCCTATGAGTGTGAC
+AACAGACTGGAAGCCCATGCGTGGGTCCATCGTGTTGTCTATGCAACCGGGAAACGAAAC
+ATTCGGGAAACCGGCAGATCCTGGGTATCTATGCCGGAGCGTTCGGCATCCGAAATTACT
+CTTTGGGAAGATGAGGAGCAGTCACGAAAATGGTACTCCATGACGCCTGTATTCAGTTCG
+TGGACCGAAAAACAGAAGCTTTTTGAGATGTGCGAAAAAGGCGCAGGGTTACTGAAAGGG
+GCTATGGGGACGCCGGATGATGAGGAATATGGCGACCTGCTAGAGATGTGGGGGGACGCG
+TATATCGCGTGCAATGCCAGCGGTGAGCATGTAACAACCCCGGATATGTTCCTCCCGGTA
+GGCCTGATTAAGTCACGAAAATCATTAAAGCTGATTGCTTTAGGTACATGCTCGACGGAG
+CACTGGATGTATGCCCGGGCAGGGGATGATGACTCAAGGGAGCTGCTGCTGGAATTGTAT
+ACCAGTTGGTATGAGTACCCAGATAAAGCGCGGGCGCGGCTCCTGTCGATGGCAGAAAAA
+AACTCCGGCCTGAGGTTTGTGTTGCTCGAAGGTAAATCAAGGAAACTGGAGCGCTTTGCG
+GTCAAGCGGCCAGAAGAGATTGTCAACTGGCATGCCGGTAACTTAAAGGAAATCCCGACA
+ATGCTGAATGATCAATGGGCATGTCACATGGCAATGGTCAGTCAGAATGATAAGGTCTAC
+CTGACACCGGATTTGCTCGATGATGATGGTCTGCCTAATTTTAATGGAGTCACCAGGCAG
+GTGCCCGGAGAAGGTTATCAGCCAGTCAATGTCTATGAATTTGAAAGTGACTATTTTAAC
+GCGGTATACGATGCAGACGGGAAGAAAGTGGCACTTTGTCACTGGTATGATGTGACGGAT
+AATTCATATTCTGCTGAAGAACTCATAGGCAATATGCCGCATAACGCATTTAAATTTCTT
+CAGTATAGACTGGATAATATCGAGCAGGCTGAGGCATTTATCAAATACAGAAACCGGAAT
+TATCAGCCCCGCGAAAATGCAGACTGGCCTGAGCCACCTGAAGGAGTTAAGCGTTACGTC
+ATCAGAGCCCGAAGCTAGGTGAAAAATATTAAGGCAAAAGTTCAGTATGGAAATTGGTAA
+ATCATACTGAACAATTAATATGACATTAGGCATGACTATAAGTAGGTGCCTTATTGGATG
+GTACATCGTATAAAAAGTAACTTTTCTAATCTCACCCAGCACTCCGGGAATGATGCTAAC
+CTAAATCACGGGAGCAGTGCTGGATATTGGTCAATTTATAGTTCCTGTGGAATGTAAATG
+TAATTAAATGTTGCAATAAAGCGTGGTTGTGTTAAAAAGTAGGCTTCATTACCTAAGTTA
+AATTTTATAATGTATGCCAAAGAAGAATTTATACTCTGAAGAGATTGTGATTGCCAAAAA
+GCAACTCACTCAGCTTTCAACACTAAAAGATAAAGTCAGCCTGCTAACCCGTCAGTGGGA
+AGGTGATATTGGCGCCAATCTGCCTGGTTACACTGAGCTATTAGCTCATGTGGAAAGAAT
+TGAAAGGCAGATTCATGAACAAATTGGCAGCTGGAAAAAAACTCCTGCAATGTAAGATTC
+GCCTATCCATTCTGAAGCGGTGGTTTTGTTTAAGGGTAAAAAAATTCATTCCTTAATAGT
+TCTGTGACGCCGCTTTTAAATCTTGGATGTTTGACTCTAAATGTCTATCATTTAATTAAC
+AGTAATTATGATGTTGTCAGCCTTATTCCTGGCTGAATCTCAATATATTACCATACGACT
+TCATTTTGCTTATCTTCGGGTTCTCGAAGAATTCCGCCATGATTGTCCATAGCAGGAGGT
+TAGTATGGGTGTAGACATGAATTATGAGTTTCAGAAAAAAAGCCCTAAGGGATGGGACCG
+GGTTAACGATAATTTTTCAAACGACCGAAGCTATTTGCTTTATTCATGGTTGGGTCTGGA
+TGCCCGTAACACCTGGGGTGTTGCAGCGATCACTCCTCTCAGGGGATTACCCGATGACAT
+AGAACTTCAATGGGATGAGGATGGATGTGATGACTACTGGGGTGAGCATTCCCAAACGTG
+GTTACTATCCGACGAGATCCTTGCTTCAACCAGCCCGGTAGCCATTGAAGACGATGAACC
+GGGGTCGGTAGTTGCGGAGTTTTGTGCGGAGGTTCAGCGACTTCATGGGCTGCATGGGAC
+GGTAAGAATTGTTCTAGGCTTCACTGGTTAAACAAGGCTGGACTATCTAATGCCTCCAGA
+CAACGTAATCCTGACGTGTTCATCTACTGTAACCTGGTCGCCGGGGATATATCGCGGCCA
+CCCTGACACGTCATTTGCATTTTTGATGATAAACGAAGGGTAGCCGAACTGCTCGGCCGC
+AATATCGATATAAAAAATCATTTCACCGGCACTTACCTCACACCAGTAATGGCCGTGCCC
+GCCAGACTCATTGAAAATACCACCATCATCTGTTCCGTTCCCGCCTCGCACAGCTGCGGA
+CATACCTCTGCGGTGCGCAAATTCACAAACCAGCAGACTGGCGAACATGCATGTTCCTGT
+GGTGTCGCTTGTCCCATTGTCATTGAGGATATTTTTTAGTGATGAATAAGCATCAGTTGC
+GAGTGCCAGAACTGGAGTATCAACGGGAATAGAGGCCTGGTCAGTCATGAAAGAATGTCT
+CCGGTATGATGGAACGGCTAATTAAACAAGCAATGAGTTGATTCCGTTTTTGAGTACTTC
+ACTTTCAGGCAACCAGTACCCGGAACCACACACCCATGATTCGCCCGGGAAAATGAAACC
+TTCGCGGACCAGGAATACTCTAAAATTTGGCGGCAGTACATTTTCTATTTTTAGCATGTA
+TCCTTCCTGAATGGATAGATTTTTCAGCTCAGATAGAAGATTCGGTGAGACGATGAGCTG
+TTCGGTTTCAAGAAGTCCTTGTAGCTCATGTAACTCATCCAAGGCCTCCTGAAGGCGTTC
+GGGGATACAATTCAGGGAAGCCTCGAAATGTTGCTGCTCAGCAGCTTCTTCCATCCAGTC
+CCGAAACCAGCTGTATTCCTGAGCTGCCGCATCCCACTCTAGTGTCTCTTCTTCCGCTTC
+AGGATAGTTAATAGAGATCCATTCATGACGCCATTCTTCCTGTATATCAAACAGCAGTTC
+TTTAATGCTTCCCATAAACTATCCCCTTGTATATTTTGGAGTTCCCACCGGACTACATTA
+TACGATGATTTGTGGCTGCAAATGTTGGTGACGGTTATCAGTATCGACCAAGCGCCATTA
+ACTGGAAGCACACTTCCTCGGAAAGCTCTCCTTTTTTATTTGGGATATGTGAGGGAACAG
+CAGTTATCACATCAACTTCTACGCATAAATACCATGTGTCATCAGCATCACTCCACCAGG
+CGACAATACGATTATCCCAGGTGCGTAATTCGCGGTAGCAGCTGTATCCAGGTAAATTCT
+CGAACTCCATCTCTTGCATCCAGACTCTGCCATGGCCAAGGATCATGAGAGCCTCAAATA
+AAACATCCAATGAAATACTAATTTCCATAATCAACTTCCTTATTACTACATCCATATTAT
+TTATAATCACTGTGCGGGGTAATCCATTGTGCCACACAGTGATTAGTCAGATAACAGCCA
+CAACCACAATTGCCTAACGCAACTTTCCACTGTTTCCTAAGAACAAGTAATAACAAAATT
+TACAGAATCAAAAGATGATAATTTTTGCGATTTGTTCCGTCCGGCCGGTTTGATATACGT
+GGGAAGGCTGTTATTTAATTACATATATTATATCACATTTATATTTTCTGTCCCAAAATT
+CGCGAAAATAATTGTCACACTCCGTCTCCAGGATTTTTCGGATCTGGAAAAATATGAGGG
+CAAAAAAACACAATCTCACACGTTGTTTTAAAAGTATGCAAGAAATGAGAGGGATGTTAG
+AAATCGTTAACCTGTTGATTTCGTGAGAGGCAATGGAGAGATAGAGAGGGACTCATGAAC
+TTAAGAGCAAACCCACCACATTTAACATAATCCATCTTATACGCACTAAGTGTAGAGGCT
+CAATGCTAATGTCTATTTGTGGCTCATTAGGAATGTCCAGGCTATAGTTTTCAAACCTGT
+ATGCCTAGTCAACGACTCGCTTTTCCTGATGAGGAGTTTTCTATGGCTATACATGACGCC
+GGGATGTTCACCGTGAAAGAAATCAACCGCCTCAAAATTCTTCAGGATGTCGTTGAACGT
+AACCTGCGTCCTGGCCAGGCTGCCGAGATGCTCGGCATCACGCCACGTCATTGCAGCCGT
+CTGCTGAAGCGTTATCGCCAGTCCGGGCCGCTTGGTATGAACAACCAGAGTCGCGGTCGC
+ACTGGCAACCGCCTGTTGCCCACATCACTGACTGACCAGGCACTGAGTATCATACGAGAA
+CGCTACCGCGATTTTGGCCCCACGCTGGCCCGGGAAAAACTGGAGGAAGTTCACGGTCTG
+GTCCTGGGCAAGGAAACCATCAGACGCCTTATGATAAAAGCCGGACTCTGGATCCCCCGA
+AGACAACGCGCACCGAAAATTCATCAGCCCCGTTACCGGCGGCCCTGTACTGGCGAGCTT
+ATACAGATTGACGGCTGTGACCATCACTGGTTTGAAAACCGGGGTCGGCCTTGTACGGCA
+CTTGTATATGTCGACGATGCCACCAGTCGTCTGATGCACCTGCTGTTTGTTAAATCTGAG
+TCCACCTTTAGCTATTTTGAAGCGACCCGTGGCTATATCGAGAAATACGGTAAGCCCATG
+ATCCTTTACAGCGATAAAGCCAGCGTATTCAGAGTCAATAATAAGCACGCTACCACTGGT
+CCCGGTGAAACCCAGTTTGCCCGAGCCATGCGCTGCCTCAACATTACCCCGCTATGTGCG
+GAGACCAGCCAGGCAAAGGGCCGTGTGGAACGCGCCCACCTGACACTTCAGGACCGGCTG
+GTTAAGGAGCTCAGGCTTAAAGGGATCAGTACGATAGAAGCCGCGAATGCATTTGCTGAG
+GAATACATGGCGGATTATAACCGGCGCTTCGCCAAAGCCCCCCTGCATGATTTTAACGCA
+CATCGGCCGCTGGCATTAGACGATGACCTGGATGCGGAATTTACCTGGCGAGAGCCCCGT
+CGTGTATCAAAAAGTCTGACCGTACAATATGACAAAATGCTCTATCTGATTGAAGACAGC
+GAATACAGTAGAAGGGCTATCGGCAAGTATATTGATGTCTGGCACTATCCTGACGGACAT
+AAGGAACTGCGGTTGAATGGCGTGCTACTGCCCTACTCCACCTACGACCGATTGTCTGAA
+GTCGATCCTGTCGCGATTGTTGATAACAAAAGACTGGGCCATGTATTGGATGTTGCCCGC
+CAGGTCCAGAAAAAAAGGGACAATAATCGCTCCCAGTCGCTACCTTCAGGAGATGAGCCT
+TCCCGCAGACGACATGCTCCAGGCATCAACAAATCCCAGCGCTCGCTGAACGAAGATGAC
+CTGCTTGAAGCCATAATAAAGCTTCAAGGAAGCTCTGAGGCCATCTTTGGTAAAAGGTGA
+ACTTGTCGGAAACCTCGCACTCACTGACCAGCAGCGCTGTGTTGCAGTTAATGCAATCAA
+AGCCTGAAAAAAATTCTGAGAAATGCAAATAACTTCAATGATATTATATACAAAGAGAAA
+CGTCGGGTAGCCGGGGTAAAGTCCGGGTGTCACAGAACCCCGAACCGCTTCGCGGTGACT
+TCTTACCACAAACCAAGTCTATGTAAAATTTATTGCGTAGATATGAATCTAATCAGAGCC
+TTAAATTTAAAGATGGTAAATTATGTATATGACTGGTCAAGAAATAAACGATAAAAAGAA
+AGAGTATCTTGAATTACTAGATCGAGAAGAGAATGAACAGATTTATCAAACATACCTTGA
+AGAAAATACAATGTTCATACCAAGAGAATTCGAGCAAAACCATGGAATTCACTTCAGTAC
+GGTATTTAGAAAGTTGCCTCTATCAAGCGATTATAAACCTGATTTCGTATATTTATCAAA
+AAGCTCGGATAACTGGAATGTAGTATTAGTTGAAATTGAAAAACCATCGTCGAAATATTT
+TAAAAACAACTCTACAACTTTTCATGCAGACTTCAATCTTGCTTTGCAGCAAATGAACAC
+ATGGAGGGCTTGGTTTGATGATGAATCAAACAGAAATCACTTTAAAAACAATATATTGCA
+GGGATTTATAGAACCGGCACATATGGGGAGAAATCCATTTAATTTCAAGTATGTCCTTGT
+TCATGGTCGTAGATCAGAATATGAAAATAATACACAGAAAACTGCACTAATCAGAGGGCA
+ACAGCGAAGTGACTTCTCAATAATTTCATTTGATAGTTTGGCTGAAAATATAGAGAAAAA
+ATATAAGTTATATGTTGGAGTGAAAAAAAATAGTCACTATGAATTAATATCAAAAGAATT
+TGTTGATGAAGGGATATTTTCATGGATGAACATAGATTTTTTAGCAATTACACAAAGTAT
+ATATGATGATGCAATCGCAAAATCAGATAGTTGGCATCACTATATAATTAAAGAAAATGG
+AACCGTCAAAACAATGGATTATGCTCTCCCTCGAATTAAAATAATTTGAGAGTAGTAAAA
+AAAATAGGTAATGACTCCAACTTATTGATAGTGTTTTATGTTCAGATAATGCCCGATGAC
+TTTGTCATGCAGCTCCACCGAT
+>NODE_13_length_9382_cov_42.6014':NODE_7_length_1329_cov_85.8474';
+ATCGGTGGAGCTGCATGACAAAGTCATCGGGCATTATCTGAACATAAAACACTATCAATA
+AGTTGGAGTCATTACCTATTTTTTTTACTACTCTCAAATTATTTTAATTCGAGGGAGAGC
+ATAATCCATTGTTTTGACGGTTCCATTTTCTTTAATTATATAGTGATGCCAACTATCTGA
+TTTTGCGATTGCATCATCATATATACTTTGTGTAATTGCTAAAAAATCTATGTTCATCCA
+TGAAAATATCCCTTCATCAACAAATTCTTTTGATATTAATTCATAGTGACTATTTTTTTT
+CACTCCAACATATAACTTATATTTTTTCTCTATATTTTCAGCCAAACTATCAAATGAAAT
+TATTGAGAAGTCACTTCGCTGTTGCCCTCTGATTAGTGCAGTTTTCTGTGTATTATTTTC
+ATATTCTGATCTACGACCATGAACAAGGACATACTTGAAATTAAATGGATTTCTCCCCAT
+ATGTGCCGGTTCTATAAATCCCTGCAATATATTGTTTTTAAAGTGATTTCTGTTTGATTC
+ATCATCAAACCAAGCCCTCCATGTGTTCATTTGCTGCAAAGCAAGATTGAAGTCTGCATG
+AAAAGTTGTAGAGTTGTTTTTAAAATATTTCGACGATGGTTTTTCAATTTCAACTAATAC
+TACATTCCAGTTATCCGAGCTTTTTGATAAATATACGAAATCAGGTTTATAATCGCTTGA
+TAGAGGCAACTTTCTAAATACCGTACTGAAGTGAATTCCATGGTTTTGCTCGAATTCTCT
+TGGTATGAACATTGTATTTTCTTCAAGGTATGTTTGATAAATCTGTTCATTCTCTTCTCG
+ATCTAGTAATTCAAGATACTCTTTCTTTTTATCGTTTATTTCTTGACCAGTCATATACAT
+AATTTACCATCTTTAAATTTAAGGCTCTGATTAGATTCATATCTACGCAATAAATTTTAC
+ATAGACTTGGTTTGTGGTAAGAAGTCACCGCGAAGCGGTTCGGGGTTCTGTGACACCCGG
+ACTTTACCCCGGCTACCCGACGTTTCTCTTTGTATATAATATCATTGAAGTTATTTGCAT
+TTCTCAGAATTTTTTTCAGGCTTTGATTGCATTAACTGCAACACAGCGCTGCTGGTCAGT
+GAGTGCGAGGTTTCCGACAAGTTCACCTTTTACCAAAGATGGCCTCAGAGCTTCCTTGAA
+GCTTTATTATGGCTTCAAGCAGGTCATCTTCGTTCAGCGAGCGCTGGGATTTGTTGATGC
+CTGGAGCATGTCGTCTGCGGGAAGGCTCATCTCCTGAAGGTAGCGACTGGGAGCGATTAT
+TGTCCCTTTTTTTCTGGACCTGGCGGGCAACATCCAATACATGGCCCAGTCTTTTGTTAT
+CAACAATCGCGACAGGATCGACTTCAGACAATCGGTCGTAGGTGGAGTAGGGCAGTAGCA
+CGCCATTCAACCGCAGTTCCTTATGTCCGTCAGGATAGTGCCAGACATCAATATACTTGC
+CGATAGCCCTTCTACTGTATTCGCTGTCTTCAATCAGATAGAGCATTTTGTCATATTGTA
+CGGTCAGACTTTTTGATACACGACGGGGCTCTCGCCAGGTAAATTCCGCATCCAGGTCAT
+CGTCTAATGCCAGCGGCCGATGTGCGTTAAAATCATGCAGGGGGGCTTTGGCGAAGCGCC
+GGTTATAATCCGCCATGTATTCCTCAGCAAATGCATTCGCGGCTTCTATCGTACTGATCC
+CTTTAAGCCTGAGCTCCTTAACCAGCCGGTCCTGAAGTGTCAGGTGGGCGCGTTCCACAC
+GGCCCTTTGCCTGGCTGGTCTCCGCACATAGCGGGGTAATGTTGAGGCAGCGCATGGCTC
+GGGCAAACTGGGTTTCACCGGGACCAGTGGTAGCGTGCTTATTATTGACTCTGAATACGC
+TGGCTTTATCGCTGTAAAGGATCATGGGCTTACCGTATTTCTCGATATAGCCACGGGTCG
+CTTCAAAATAGCTAAAGGTGGACTCAGATTTAACAAACAGCAGGTGCATCAGACGACTGG
+TGGCATCGTCGACATATACAAGTGCCGTACAAGGCCGACCCCGGTTTTCAAACCAGTGAT
+GGTCACAGCCGTCAATCTGTATAAGCTCGCCAGTACAGGGCCGCCGGTAACGGGGCTGAT
+GAATTTTCGGTGCGCGTTGTCTTCGGGGGATCCAGAGTCCGGCTTTTATCATAAGGCGTC
+TGATGGTTTCCTTGCCCAGGACCAGACCGTGAACTTCCTCCAGTTTTTCCCGGGCCAGCG
+TGGGGCCAAAATCGCGGTAGCGTTCTCGTATGATACTCAGTGCCTGGTCAGTCAGTGATG
+TGGGCAACAGGCGGTTGCCAGTGCGACCGCGACTCTGGTTGTTCATACCAAGCGGCCCGG
+ACTGGCGATAACGCTTCAGCAGACGGCTGCAATGACGTGGCGTGATGCCGAGCATCTCGG
+CAGCCTGGCCAGGACGCAGGTTACGTTCAACGACATCCTGAAGAATTTTGAGGCGGTTGA
+TTTCTTTCACGGTGAACATCCCGGCGTCATGTATAGCCATAGAAAACTCCTCATCAGGAA
+AAGCGAGTCGTTGACTAGGCATACAGGTTTGAAAACTATAGCCTGGACATTCCTAATGAG
+CCACAAATAGACATTAGCATTGAGCCTCTACACTTAGTGCGTATAAGATGGATTATGTTA
+AATGTGGTGGGTTTGCTCTTAAGTTCATGAGTCCCTCTCTATCTCTCCATTGCCTCTCAC
+GAAATCAACAGGTTAACGATTTCTAACATCCCTCTCATTTCTTGCATACTTTTAAAACAA
+CGTGTGAGATTGTGTTTTTTTGCCCTCATATTTTTCCAGATCCGAAAAATCCTGGAGACG
+GAGTGTGACAATTATTTTCGCGAATTTTGGGACAGAAAATATAAATGTGATATAATATAT
+GTAATTAAATAACAGCCTTCCCACGTATATCAAACCGGCCGGACGGAACAAATCGCAAAA
+ATTATCATCTTTTGATTCTGTAAATTTTGTTATTACTTGTTCTTAGGAAACAGTGGAAAG
+TTGCGTTAGGCAATTGTGGTTGTGGCTGTTATCTGACTAATCACTGTGTGGCACAATGGA
+TTACCCCGCACAGTGATTATAAATAATATGGATGTAGTAATAAGGAAGTTGATTATGGAA
+ATTAGTATTTCATTGGATGTTTTATTTGAGGCTCTCATGATCCTTGGCCATGGCAGAGTC
+TGGATGCAAGAGATGGAGTTCGAGAATTTACCTGGATACAGCTGCTACCGCGAATTACGC
+ACCTGGGATAATCGTATTGTCGCCTGGTGGAGTGATGCTGATGACACATGGTATTTATGC
+GTAGAAGTTGATGTGATAACTGCTGTTCCCTCACATATCCCAAATAAAAAAGGAGAGCTT
+TCCGAGGAAGTGTGCTTCCAGTTAATGGCGCTTGGTCGATACTGATAACCGTCACCAACA
+TTTGCAGCCACAAATCATCGTATAATGTAGTCCGGTGGGAACTCCAAAATATACAAGGGG
+ATAGTTTATGGGAAGCATTAAAGAACTGCTGTTTGATATACAGGAAGAATGGCGTCATGA
+ATGGATCTCTATTAACTATCCTGAAGCGGAAGAAGAGACACTAGAGTGGGATGCGGCAGC
+TCAGGAATACAGCTGGTTTCGGGACTGGATGGAAGAAGCTGCTGAGCAGCAACATTTCGA
+GGCTTCCCTGAATTGTATCCCCGAACGCCTTCAGGAGGCCTTGGATGAGTTACATGAGCT
+ACAAGGACTTCTTGAAACCGAACAGCTCATCGTCTCACCGAATCTTCTATCTGAGCTGAA
+AAATCTATCCATTCAGGAAGGATACATGCTAAAAATAGAAAATGTACTGCCGCCAAATTT
+TAGAGTATTCCTGGTCCGCGAAGGTTTCATTTTCCCGGGCGAATCATGGGTGTGTGGTTC
+CGGGTACTGGTTGCCTGAAAGTGAAGTACTCAAAAACGGAATCAACTCATTGCTTGTTTA
+ATTAGCCGTTCCATCATACCGGAGACATTCTTTCATGACTGACCAGGCCTCTATTCCCGT
+TGATACTCCAGTTCTGGCACTCGCAACTGATGCTTATTCATCACTAAAAAATATCCTCAA
+TGACAATGGGACAAGCGACACCACAGGAACATGCATGTTCGCCAGTCTGCTGGTTTGTGA
+ATTTGCGCACCGCAGAGGTATGTCCGCAGCTGTGCGAGGCGGGAACGGAACAGATGATGG
+TGGTATTTTCAATGAGTCTGGCGGGCACGGCCATTACTGGTGTGAGGTAAGTGCCGGTGA
+AATGATTTTTTATATCGATATTGCGGCCGAGCAGTTCGGCTACCCTTCGTTTATCATCAA
+AAATGCAAATGACGTGTCAGGGTGGCCGCGATATATCCCCGGCGACCAGGTTACAGTAGA
+TGAACACGTCAGGATTACGTTGTCTGGAGGCATTAGATAGTCCAGCCTTGTTTAACCAGT
+GAAGCCTAGAACAATTCTTACCGTCCCATGCAGCCCATGAAGTCGCTGAACCTCCGCACA
+AAACTCCGCAACTACCGACCCCGGTTCATCGTCTTCAATGGCTACCGGGCTGGTTGAAGC
+AAGGATCTCGTCGGATAGTAACCACGTTTGGGAATGCTCACCCCAGTAGTCATCACATCC
+ATCCTCATCCCATTGAAGTTCTATGTCATCGGGTAATCCCCTGAGAGGAGTGATCGCTGC
+AACACCCCAGGTGTTACGGGCATCCAGACCCAACCATGAATAAAGCAAATAGCTTCGGTC
+GTTTGAAAAATTATCGTTAACCCGGTCCCATCCCTTAGGGCTTTTTTTCTGAAACTCATA
+ATTCATGTCTACACCCATACTAACCTCCTGCTATGGACAATCATGGCGGAATTCTTCGAG
+AACCCGAAGATAAGCAAAATGAAGTCGTATGGTAATATATTGAGATTCAGCCAGGAATAA
+GGCTGACAACATCATAATTACTGTTAATTAAATGATAGACATTTAGAGTCAAACATCCAA
+GATTTAAAAGCGGCGTCACAGAACTATTAAGGAATGAATTTTTTTACCCTTAAACAAAAC
+CACCGCTTCAGAATGGATAGGCGAATCTTACATTGCAGGAGTTTTTTTCCAGCTGCCAAT
+TTGTTCATGAATCTGCCTTTCAATTCTTTCCACATGAGCTAATAGCTCAGTGTAACCAGG
+CAGATTGGCGCCAATATCACCTTCCCACTGACGGGTTAGCAGGCTGACTTTATCTTTTAG
+TGTTGAAAGCTGAGTGAGTTGCTTTTTGGCAATCACAATCTCTTCAGAGTATAAATTCTT
+CTTTGGCATACATTATAAAATTTAACTTAGGTAATGAAGCCTACTTTTTAACACAACCAC
+GCTTTATTGCAACATTTAATTACATTTACATTCCACAGGAACTATAAATTGACCAATATC
+CAGCACTGCTCCCGTGATTTAGGTTAGCATCATTCCCGGAGTGCTGGGTGAGATTAGAAA
+AGTTACTTTTTATACGATGTACCATCCAATAAGGCACCTACTTATAGTCATGCCTAATGT
+CATATTAATTGTTCAGTATGATTTACCAATTTCCATACTGAACTTTTGCCTTAATATTTT
+TCACCTAGCTTCGGGCTCTGATGACGTAACGCTTAACTCCTTCAGGTGGCTCAGGCCAGT
+CTGCATTTTCGCGGGGCTGATAATTCCGGTTTCTGTATTTGATAAATGCCTCAGCCTGCT
+CGATATTATCCAGTCTATACTGAAGAAATTTAAATGCGTTATGCGGCATATTGCCTATGA
+GTTCTTCAGCAGAATATGAATTATCCGTCACATCATACCAGTGACAAAGTGCCACTTTCT
+TCCCGTCTGCATCGTATACCGCGTTAAAATAGTCACTTTCAAATTCATAGACATTGACTG
+GCTGATAACCTTCTCCGGGCACCTGCCTGGTGACTCCATTAAAATTAGGCAGACCATCAT
+CATCGAGCAAATCCGGTGTCAGGTAGACCTTATCATTCTGACTGACCATTGCCATGTGAC
+ATGCCCATTGATCATTCAGCATTGTCGGGATTTCCTTTAAGTTACCGGCATGCCAGTTGA
+CAATCTCTTCTGGCCGCTTGACCGCAAAGCGCTCCAGTTTCCTTGATTTACCTTCGAGCA
+ACACAAACCTCAGGCCGGAGTTTTTTTCTGCCATCGACAGGAGCCGCGCCCGCGCTTTAT
+CTGGGTACTCATACCAACTGGTATACAATTCCAGCAGCAGCTCCCTTGAGTCATCATCCC
+CTGCCCGGGCATACATCCAGTGCTCCGTCGAGCATGTACCTAAAGCAATCAGCTTTAATG
+ATTTTCGTGACTTAATCAGGCCTACCGGGAGGAACATATCCGGGGTTGTTACATGCTCAC
+CGCTGGCATTGCACGCGATATACGCGTCCCCCCACATCTCTAGCAGGTCGCCATATTCCT
+CATCATCCGGCGTCCCCATAGCCCCTTTCAGTAACCCTGCGCCTTTTTCGCACATCTCAA
+AAAGCTTCTGTTTTTCGGTCCACGAACTGAATACAGGCGTCATGGAGTACCATTTTCGTG
+ACTGCTCCTCATCTTCCCAAAGAGTAATTTCGGATGCCGAACGCTCCGGCATAGATACCC
+AGGATCTGCCGGTTTCCCGAATGTTTCGTTTCCCGGTTGCATAGACAACACGATGGACCC
+ACGCATGGGCTTCCAGTCTGTTGTCACACTCATAGGGTTTAGGCGCGATAAATGCGACGT
+AATTCCCTGACGAGTTAACCCCGGCCCGAAGAAGTTGCGAGCCGGACGCAGCGACGTGCT
+CCTGAATGACCGATACCATTTCGCTTGCACCCTGAGTGAGCCTGTAGAGCTGATTCAGCA
+GTGCCTGGCGCCCTTTTTCGGTACTCATCCCGACAGCGAGGGAAACCCCACGGTTGCCGG
+TCTTCCATGAAGCAATACACTGGTGAATCAGTTCCTGGATATTCCCCGGCAGGTGCATCC
+CCGAATCCTGCATTGCAGCCAGCAGATATTGCCGGTGCGGCAGTTCGTTTTCTCGCTCCT
+GTTCCAGGAATTTGATCGCGGCCTTAAAAAAGCGAATATAAAAAAGGTGGTTACTCCGGA
+ATTTGCGTTGCTGGATAAACCGGGTCAGCTCCTCCGGGCCCACTGCATCAAGGCACAAAT
+AAGCAAGTTCAGCTTCTCCACGCCGCCACGGGCTATATGCAGAGACGTTTACCTTACAGT
+TAAACATCTTATCTGTACTGAATCGCTTCACCGCCACATCAACGGCCAGAGTATCTCCCT
+GACGATACACAACCGCAGCAGAGACATTATCCTCAGGGTCAGCGATGAAGGAGTACCCTG
+AATAGCCGCTGTCCTCTTTAACGGCACCAGGTGCTGTTCTGGGGGTCATAAGCTCACGCC
+AGTTGCAGAGCAGCCGCGAGCCCGGTTGAATATAGGAGTTTTTTTCACTAATAAATTCAT
+CGAGCGTCTGCGAGTCTGGTGATGCCAGCAGCCCTGTGCCGTCTTCATCGTGCAGAAAAT
+GGAAGTACCGTTCCTGGAAGCTCAGATTCAAGAAATTCGCCTTTTCATGCTGGGGATAGA
+ACTGACCAAAGAGAGCCAGTCGCTGGTCAAGACCAAACAGCATGATAAGCAGACGTCGGT
+AATGCAGAGCCATCAGGTCATGGGCTTTGAGACGATCGGTATAAGCCACATCTTCAAATT
+TGATGGTGGTACCGTCAAACCCTCGGAAGTGGCCCTGCTGCTCATCTTCAGAGGGAAATA
+ACCGGGACGCCCCAAGATGGCTCTCCACCGGGGAATAGATCTGTTTGATATTTTGCCCGT
+TGCGGACCATCAGAAACACGATGCTGTTCTTTTCGTTGTTTTCAGCATTCGCCCAGGTAT
+CACCATAGTCAATAAATCTGCGGGTAGTGACCATGACAAGTACGCAGCGCTCAGTCGGGA
+AAATTTGCTCCACCAGCCCCTGGTTATCTTTTAGCGCCTTGAGGAATGCGGAAAGACTCC
+TGAAATCAAAATGTTCGTCGATATCGCTCCAGGCAGAAAACTCCTCATCCACGACGAGTT
+TCTTCTGACACAGCGTCAACGGGATGCTGCTGTCTGCTGGCTCGCCTTCCGCAACATCAA
+CTACCGTCACGTTTTTGCCGACGAATAATTCCAGCGTGAGAACACCTGCCTGAATTTTGC
+TGGCTTGCTCAATGCCCTCCTGCGTTCCGGCCAGCTTGGCAGCGGCCAGCTCCGCATAAT
+ACGGATGCATTTTCTCCAGCGCCCGGGTGATGGCGCCGGTACGCGACGTAATAATGTTAG
+CTACGGCACCGGCAATCTTGCCTTCCCGTTCCGCAACTTTCGCCATCAGAGAAACCTGAG
+CCTCTGAAATCCCCTGAGAAAGGGCATTCTGCACTGTACCCAGCGCCATGGTGACTGCAA
+CATCTTCTGCATTCCTGACGGCTGGAAGCATTCTGTCCTCAGTTGCCCCCCCCTTTTTAC
+TGGCCTCTTCGTCTTCGACCCTTTTAATAGCCAGTTCCCGGAGTGCAGAGGGATCTTGCA
+GAGTTTCCGTAAGACGCATTTGCAGGTCAGCGACCTCATCCTGAATGCCTTTGAGCTCCG
+ACTGACGGATAATTTCATGGTCGGGCTGATATTCAAACAACGCGAGGAAATCGGCCGTCA
+GAAACCGATGCTCATTCAGTCTCTTGTCTTTCGTTGATTTTGAACCGTTCTCAGCGACGA
+TTTCAACGCTTACCCATTCCCCGTAATGCCGGGGGTGAGCGCGAAGGATGACGGTATGCA
+GATTGTTATCCACGTACCGCAACGAGTTAATGAGGAGAGTGTCCCCGGCCACAATCGCCT
+CAGCCGGAATATCGACGAGCGCAGACCAATACTGCCCTGCCAGCAGAGAATGAAATCGTT
+CAAGGCGATCGATATTATTTTTACTGACCAGGTCCCCCATAAACTATACCTTCCGAATTT
+GTTTGTTATAAACATCATACCATATTGGCTGTTCACCCAAATAACCTGGCATGCGGAAAC
+AGGTGATTCATTTAAAACAGAGCCTGTCCATTTTAAATGGTGGAATCCAGCAAATTAAAT
+ACAGCCATTATCAAACGAGTTGAGGATTGAAGCATGTATTGCAGGAGTATGGATTTAATT
+GCCCATTAAGCCACGCGCCTTTAAAGACATAGACCTAATGAGCGTTTTGTATTATAAATC
+TCACGCAAATCTATGTTATTTATTTGGCTGAACTATTTCCCAGTATCTTTCATAAACACT
+GAACTCTGAGAGATCCCCTCATAATTTCCCCAAAACGTAACCATGTGTGAATAGATTTTG
+AGTAAGCAGGGTTGCAGCCACG
+>NODE_14_length_85_cov_140.75:NODE_39_length_146_cov_169.507';
+GGTGATGCTGCCAACTTACTGATTTAGTGTATGATGGTGTTTTTGAGGTGCTCCAGTGGC
+TTCTGTTTCTATCAGCTGTCCCTCC
+>NODE_14_length_85_cov_140.75':NODE_22_length_78_cov_98',NODE_24_length_52213_cov_42.1417';
+GGAGGGACAGCTGATAGAAACAGAAGCCACTGGAGCACCTCAAAAACACCATCATACACT
+AAATCAGTAAGTTGGCAGCATCACC
+>NODE_15_length_1977_cov_41.2532:NODE_30_length_81_cov_86';
+ATGGGTTCATGTGCAGCTCCATCAGCAAAAGGGGATGATAAGTTTATCACCACCGACTAT
+TTGCAACAGTGCCATATGGGGCAAATGGTGGTCACCATCCTGTCGGCTGTGGCACAGGCT
+GAACGCCGGAGGATCCTAGAACGCACGAATGAGGGCCGACAGGAAGCAAAGCTGAAAGGA
+ATCAAATTTGGCCGCAGGCGTACCGTGGACAGGAACGTCGTGCTGACGCTTCATCAGAAG
+GGCACTGGTGCAACGGAAATTGCTCATCAGCTCAGTATTGCCCGCTCCACGGTTTATAAA
+ATTCTTGAAGACGAAAGGGCCTCGTGATACGCCTATTTTTATAGGTTAATGTCATGATAA
+TAATGGTTTCTTAGACGTCAGGTGGCACTTTTCGGGGAAATGTGCGCGGAACCCCTATTT
+GTTTATTTTTCTAAATACATTCAAATATGTATCCGCTCATGAGACAATAACCCTGGTAAA
+TGCTTCAATAATATTGAAAAAGGAAGAGTATGAGTATTCAACATTTTCGTGTCGCCCTTA
+TTCCCTTTTTTGCGGCATTTTGCCTTCCTGTTTTTGCTCACCCAGAAACGCTGGTGAAAG
+TAAAAGATGCTGAAGATCAGTTGGGTGCACGAGTGGGTTACATCGAACTGGATCTCAACA
+GCGGTAAGATCCTTGAGAGTTTTCGCCCCGAAGAACGTTTTCCAATGATGAGCACTTTTA
+AAGTTCTGCTATGTGGTGCGGTATTATCCCGTGTTGACGCCGGGCAAGAGCAACTCGGTC
+GCCGCATACACTATTCTCAGAATGACTTGGTTGAGTACTCACCAGTCACAGAAAAGCATC
+TTACGGATGGCATGACAGTAAGAGAATTATGCAGTGCTGCCATAACCATGAGTGATAACA
+CTGCGGCCAACTTACTTCTGACAACGATCGGAGGACCGAAGGAGCTAACCGCTTTTTTGC
+ACAACATGGGGGATCATGTAACTCGCCTTGATCGTTGGGAACCGGAGCTGAATGAAGCCA
+TACCAAACGACGAGCGTGACACCACGATGCCTGCAGCAATGGCAACAACGTTGCGCAAAC
+TATTAACTGGCGAACTACTTACTCTAGCTTCCCGGCAACAATTAATAGACTGGATGGAGG
+CGGATAAAGTTGCAGGACCACTTCTGCGCTCGGCCCTTCCGGCTGGCTGGTTTATTGCTG
+ATAAATCTGGAGCCGGTGAGCGTGGGTCTCGCGGTATCATTGCAGCACTGGGGCCAGATG
+GTAAGCCCTCCCGTATCGTAGTTATCTACACGACGGGGAGTCAGGCAACTATGGATGAAC
+GAAATAGACAGATCGCTGAGATAGGTGCCTCACTGATTAAGCATTGGTAACTGTCAGACC
+AAGTTTACTCATATATACTTTAGATTGATTTAAAACTTCATTTTTAATTTAAAAGGATCT
+AGGTGAAGATCCTTTTTGATAATCTCATGACCAAAATCCCTTAACGTGAGTTTTCGTTCC
+ACTGAGCGTCAGACCCCTTATGGCAGAGCAGGGAAAGGAATTGCCGGGCTATGTGCAACG
+GGAATTTGAAGAATTTCTCCAATGCGGGCGGCTGGAGCATGGCTTTCTACGGGTTCGCTG
+CGAGTCTTGCCACGCCGAGCACCTGGTCGCTTTCAGCTGTAAGCGTCGCGGTTTCTGCCC
+GAGCTGTGGGGCGCGGCGGATGGCCGAAAGTGCCGCCTTGCTGGTTGATGAAGTACTGCC
+TGAACAACCCATGCGTCAGTGGGTGTTGAGCTTCCCGTTTCAGCTGCGTTTCCTGTTTGG
+GGTCGTTTGCGGGAAGGGGCGGAATCCTACGCTAAGGCTTTGGCCAGCGATATTCTCCGG
+TGAGATTGATGTGTTCCCAGGGGATAGGAGAAGTCGCTTGATATGGCACTGTTGCAAATA
+GTCGGTGGTGATAAACTTATCATCCCCTTTTGCTGATGGAGCTGCACATGAACCCAT
+>NODE_15_length_1977_cov_41.2532':NODE_30_length_81_cov_86';
+ATGGGTTCATGTGCAGCTCCATCAGCAAAAGGGGATGATAAGTTTATCACCACCGACTAT
+TTGCAACAGTGCCATATCAAGCGACTTCTCCTATCCCCTGGGAACACATCAATCTCACCG
+GAGAATATCGCTGGCCAAAGCCTTAGCGTAGGATTCCGCCCCTTCCCGCAAACGACCCCA
+AACAGGAAACGCAGCTGAAACGGGAAGCTCAACACCCACTGACGCATGGGTTGTTCAGGC
+AGTACTTCATCAACCAGCAAGGCGGCACTTTCGGCCATCCGCCGCGCCCCACAGCTCGGG
+CAGAAACCGCGACGCTTACAGCTGAAAGCGACCAGGTGCTCGGCGTGGCAAGACTCGCAG
+CGAACCCGTAGAAAGCCATGCTCCAGCCGCCCGCATTGGAGAAATTCTTCAAATTCCCGT
+TGCACATAGCCCGGCAATTCCTTTCCCTGCTCTGCCATAAGGGGTCTGACGCTCAGTGGA
+ACGAAAACTCACGTTAAGGGATTTTGGTCATGAGATTATCAAAAAGGATCTTCACCTAGA
+TCCTTTTAAATTAAAAATGAAGTTTTAAATCAATCTAAAGTATATATGAGTAAACTTGGT
+CTGACAGTTACCAATGCTTAATCAGTGAGGCACCTATCTCAGCGATCTGTCTATTTCGTT
+CATCCATAGTTGCCTGACTCCCCGTCGTGTAGATAACTACGATACGGGAGGGCTTACCAT
+CTGGCCCCAGTGCTGCAATGATACCGCGAGACCCACGCTCACCGGCTCCAGATTTATCAG
+CAATAAACCAGCCAGCCGGAAGGGCCGAGCGCAGAAGTGGTCCTGCAACTTTATCCGCCT
+CCATCCAGTCTATTAATTGTTGCCGGGAAGCTAGAGTAAGTAGTTCGCCAGTTAATAGTT
+TGCGCAACGTTGTTGCCATTGCTGCAGGCATCGTGGTGTCACGCTCGTCGTTTGGTATGG
+CTTCATTCAGCTCCGGTTCCCAACGATCAAGGCGAGTTACATGATCCCCCATGTTGTGCA
+AAAAAGCGGTTAGCTCCTTCGGTCCTCCGATCGTTGTCAGAAGTAAGTTGGCCGCAGTGT
+TATCACTCATGGTTATGGCAGCACTGCATAATTCTCTTACTGTCATGCCATCCGTAAGAT
+GCTTTTCTGTGACTGGTGAGTACTCAACCAAGTCATTCTGAGAATAGTGTATGCGGCGAC
+CGAGTTGCTCTTGCCCGGCGTCAACACGGGATAATACCGCACCACATAGCAGAACTTTAA
+AAGTGCTCATCATTGGAAAACGTTCTTCGGGGCGAAAACTCTCAAGGATCTTACCGCTGT
+TGAGATCCAGTTCGATGTAACCCACTCGTGCACCCAACTGATCTTCAGCATCTTTTACTT
+TCACCAGCGTTTCTGGGTGAGCAAAAACAGGAAGGCAAAATGCCGCAAAAAAGGGAATAA
+GGGCGACACGAAAATGTTGAATACTCATACTCTTCCTTTTTCAATATTATTGAAGCATTT
+ACCAGGGTTATTGTCTCATGAGCGGATACATATTTGAATGTATTTAGAAAAATAAACAAA
+TAGGGGTTCCGCGCACATTTCCCCGAAAAGTGCCACCTGACGTCTAAGAAACCATTATTA
+TCATGACATTAACCTATAAAAATAGGCGTATCACGAGGCCCTTTCGTCTTCAAGAATTTT
+ATAAACCGTGGAGCGGGCAATACTGAGCTGATGAGCAATTTCCGTTGCACCAGTGCCCTT
+CTGATGAAGCGTCAGCACGACGTTCCTGTCCACGGTACGCCTGCGGCCAAATTTGATTCC
+TTTCAGCTTTGCTTCCTGTCGGCCCTCATTCGTGCGTTCTAGGATCCTCCGGCGTTCAGC
+CTGTGCCACAGCCGACAGGATGGTGACCACCATTTGCCCCATATGGCACTGTTGCAAATA
+GTCGGTGGTGATAAACTTATCATCCCCTTTTGCTGATGGAGCTGCACATGAACCCAT
+>NODE_16_length_35628_cov_42.0221:NODE_7_length_1329_cov_85.8474;
+ATCGGTGGAGCTGCATGACAAAGTCATCGGGCATTATCTGAACATAAAACACTATCAATA
+AGTTGGAGTCATTACCCAAATTTAATTCCGCCGCCAGCCATGTTCGGCAAGCTTAAAATA
+AATTCATTCTATTTTCCGGGTGCCATTTTTAGTTATTAGAGTAATTTCCAAAATATTTCG
+AGTCGGGTTGTTTGGGGCAAAGTCCGTATTGATATAATAAGCTCACATACCTGGAAGGAG
+TTTTTTATGAATAAGCCTCTGGTTAGCTTCGCGGAGTTATCCGGCAATGCTATTAATGTT
+GCGCGTCAGTCTGTTATCGATATGGAAATGGACGCAACCCGGGAAAAGATTGGAAAGGCT
+CGTTCGTTATTCCACTCAGGTATTCATCGTGCCGTGAATGGCTATCCGCTGATTCAGTCT
+GCGGCTAACCAGCTGGCTGTCATTAAGCGACTCCTTGGCGACACGAAGTACCTCGATGCC
+TGTATTACCGAGAATCTTTGTATGTTCTCGCCAGAGGGTTATCTGTACCTGTTTATGCAA
+CGCCGCTTCATTAATGAACCCGTGGCCTGATGGACGGGACCTGAACATTATTCCATTTAA
+AAGGTGACATTATGAAACCATTCGGACTTGCCGGAAAACCCCAGCCTGAGCCCTGCGGCT
+GTTGCTGGTACCACCCGGAAGATTGTCGCTACGCTGCCGCGAAGCCGCTATATCGCCGCA
+GCCAGCGTAAGGCTGAGCGCCAGCGTCAGCGTGCGTCTATTACCCGCGCCCTGGCCGAAT
+AACGCCAGCCGTAAAGACTGCTCATGGCGGATACCTCACCCTGTTATCTGGCGGCAGTAT
+CCGCTGTGAGTGCTTATGCTAACCTACGTCTCCACGTCGTTTAATGATGTATCCCGATAT
+TACCGGAGTAAAGATGAAACTCAGTCAGCTGGAGGTGGGGATGACCGTCTGGTCACTCTC
+CCGGACCAAAATGGGAAACACCACCATTAAGACGGTGACTCTTCATTCTGTCGTCATCAA
+GGAAGTACACGATAATCACGTGATTGCCAGCTGGAATGGCAATGCACCGCGTCGTTTCGG
+GGAAACGGCTATCACTGGTTGGAAAAAGGAAAAGCCACTGCTGATCCGCGACCGTTCCGG
+AAGTGCCCGACTGGCGACGCGGGAAGAAAAGGCACGAATTCTGGATACAAAATAGCGCCC
+GCCCATCGTATCGGTCTGCTGTTCTGGCCGTTTCCTCCCCACAGAACCGGAGGGAACCAA
+AGCCGCTTACTGCATCCCACCTTCTTGCTGTCATTTCCCTCTTTTTTTAACCGTTTTTTT
+CCAGCCTTTAACCGACAAAACCACTCCTGCTCACCTGGTATGATCAGCTTGCGTCTTACC
+ATTATTTTTCAGAGAGAGGAGAGGGTACATGAATCAAACAGAAACGGGCCCGTCCGGATT
+TACCGAAACAACGGTCGATGAAGAACGCATAGCCATCAGGGTAATGATTGGTGATGTGGT
+CGGCCGCTACCGTAAGCAGGTGCCGCCTGATCGCGTCCAGAAAGCTACTTTTGAAGTGAA
+CGGCGGGCTGCTCATGGCGCTGTTACTGGCTCTGCTGATGCTGGTCTGTATTATTCAGCG
+TCTGGCAACTGGCGACCGCCTAATGAGCTTTACCGGAGAGCCTGACGTCCGGGATATTCA
+GTTTACCCTGATGCTGGTCATCGAGTTCGCACTTGGCATGGTTGTCTGGTTTCTGATTGC
+AACGGGGGAGTTTTCCCGCCCCTGGCTCTACCGCCTTACTCCGGCAAAACCCGTCTGGCT
+TTTTGATGAAGTGGAGGATGCAGACCTGGTACTGCTTTCCGGCAATCCCTTTATCAAACG
+CTGGCTTCACAAGGAAATCTTGAAAATCAGGAGGCTGACGTATACCCGCCTCGATGAGGA
+ACTGGAGAAAATCGCCCCATTACCCGGACAGCCTCCGGCACAGTAGTGTTCGTGCTCACC
+GTTTGTCACTGATCGCTGGTACGAAAACGGACTGATTACAGCCGGAAAGAAGCGGGGGAA
+CAGGCGAGCTGGCGTCGTTGAGTGTTGAGATTCGAATCCGTCTGTTTAATCAGTTATTAC
+GTCAGACACCTGCTGTTACAGCCTGCGAAGCAGCAAAACCTGAAATACTTACTTATTAAA
+TATTTAGGAGAACGATCTGTTCGTTTAAAAGGGGCGGGGTGGTATAATAACCTCGGTGCT
+GGAGGCTTTTGCCCCAGCCAGCAGATTCACTGTTTGACTGTGGTAAAAAGCAGAAAGCCC
+CGAGTAATTTTTTCAAATTAACCCGAGGCCCCTGTATGCTAGTCACATTCAGAGTAGCCT
+CTTACCCGCTTAAATGCAAGGAGAAGAAGGCCATGAAACTGCCGAACCAACCCGTTGTTT
+TGTGCGTATTGATAGTATGTCTTACGCTGTTGATATTCACCTGGCTTACGCGCAATTCGC
+TCTGCGAACTGAGGCTGAAAGACGGTACACGGGAAGTGTCGGCTGTGATGGACTACGAAT
+CCGGTAAGTAGCTGAAAGAGGGGGGGCGACCCCCCTCATTTCAGAATGTGGGCCAGCAAG
+CTAATGGCACCTTTAGAAAAGGGTTTCTCCGGTCGGGGAAACCCTTTTTTCCTTTCTATC
+GTCGGCTAAACCCTTGTTAGTTTGTACATGCAGGAAATAGCTACCCGCCGCCTTGTCGAA
+TTTCAAGTTTTCTGCTTTTCGACGACACGGCGCAATTTCCGTACCTGGCTGGCCGTGGAG
+AGAGTACCGGTCCGTGGATGACACGAACTGGCCTTATCATCGGGCTGTAGCTCATAGGAC
+ATAGCCAGTGCCGTCAATGCTTCTTCGGCTTCCTGAAGCGATTTAATGGCCGTTTGGCGC
+ATCTCTGTGCGGTGTTCAATCATGGTAATGTTTGTCCTCGTTGCACAGTTCCTTTTAGAT
+GCAAGCTCAACGCCTGCATTAAAATTCATGCCGTCTTTTTTGGCTTCGGTGGCTCGCTGG
+GAGGCGATATGGTCGGTAATCTGCGGGTGCCTTCGATTACAGCCGTATCATTTGTGGTCT
+GCCGGGAAAGCTTCATCGGATACTCCTTTGCCCGGAGCCGCCGGGGCGGGGGGGGTGTTC
+ACACCTTGTGTTTGCTGCAACGGCATTTTTTCAGGCAACCGGGAAAGTAACTTTTTCGAC
+ATATTCCTGCTTTATGTACCCGCTTTTCACACTAAAGTGAAATTTGCCCTCCTTAGCGAG
+AATTTAAAACGGACGGATCGCGTACTATAACCCCCGGAAAAAAAGTTACTTTTTTTTCGC
+CTCAGGTTATTAGGAAATGAATCGAACCTGGTATTGTTGTTTTGTAGCGAACAAACACCC
+TAAACGAAAACTAAAAGGAAGGCACCATGTCCACTGTCGAAAATGATGTAAAAACCGCTA
+ACAACGATATCAGCCTGCGCACCTACCTGGAGCGTACCGGTAACGGCGCACGCAAAAGCA
+ATGGTCTAGTCATTAACCCGGCAGTGGTCGAAGAGGAAGAGGGGTTTAACACCCGTACTG
+CTGGCATTGGGGAGAGTTACTACTCATTACCTGACGTGGTAGCCCACCTGAACAGCCTGA
+AAGAGTCCTACAAGATCGATCCTTTAAGCGTACAAGCTATTGTCGTACAGATTCTGAATG
+GCCGTCCGGTCCTGCGCCAGGGAGCATGCCGTATCCGTGCCGTCGCGATGGCAAACATCG
+AGCTGGCAGATGAAGGGCGTGAATTGATCACGTTAATTCGATGCGAGGAGTTTCGCGGTA
+GCCGCGCCAGTGCCGAGCAGTTTACGCTGGACGGTAACTCAAATCTGGCTCTGTCTGTCG
+TAGCTGAGGCGCTCTCCATCAAACGGATGGTTGAAGACGCGGAAGAACCCAAAACGTTCG
+CTGAACTGGCGAAGCGTCGCGGTAAAACCGAACAGCACCTGCGTCAGATGGTTCGCGTCC
+TGGATCTGCCTGAAGCCCTCCAGGCCATGTTGGTGAAGGGTGAAGTGAGTATGTATGTCG
+CGCTGGATGAATACCTTTACAGCGGCGATGAAGCGGTCAACAACATCACCAAAGCCATTG
+ATGTTTATGGTAAGGCGACGGCCAAAACCCTGAAATTCGTCAAAGCTGGCAACATTGATG
+CAGCGATGAAGCCGAAAGCAGCCATCGTGCCGGACGCAAATGCGACCCCCCCGGAAACCA
+CCGTGACTGAACAAACGTCCGGCGAAGGTACTAACGATGAGACCACCCCACCGCAGCTGG
+TGGACGGGAGTGCGGGCACTAACCCGGAGCCGACCCCGGAAAGGACCCCGGCACCGCAGA
+TGAAAGACCCGGTCAAAACGCCAGAGCCTAAAGCTGTGTCGGTCTCCAGCGTACTGAACA
+AAAAGACCGTGACGACGATTGCGGACACGGCAATCCCGCTGTTTTCGCGTATTGCGGAAG
+AAGCTAAACAACGGGCCGCTAAGAACCTCAGCGACGATACTTACACTCTGGTGCTGACCA
+ATGACGAGATGAATGCCATTTGTGAAGCTCACGGCGATCTGACGCAGTACCTGCGTAAAC
+ATGCTGAAAAGCAGAACAAGGGCCAGGCATGATTTCCTGACTGACCCCGCCACCCGGTAG
+GGTCGGTTACCACCACTGGTCAAGGAGAAACAGGGCAATGAAGAATACCGCAATCAACAT
+CAGCACGAAGAAACCATTGCAGACAGTTAAGGACCCGGTGACCCGGGTCAGCATTCATTG
+TACGGCTAAGGATGAGAAGGGCGCAGACGTGGAAGTAAATATTCTCGACCTGGAACAGCA
+CCACACCACCAACGAAATCAAATTGACGTTTGGCGGTTCCCCTTCCCAGGCGCTGACAAT
+GCTCAGCAGAGTGATGGTCGTGCTGCAACAGCAGGCGGCCGAAGAACTGCAACGGAATTC
+CTGCTCCCGTTTGCAGTGAACACCGAAAGGAGCAATGGCACGACGTTATGGATAGAACAT
+GGATTTATAATTTTAAAGGACTCAGTGCTGGCACTAATTATGTTAAAGCGATTAATCTCT
+GCGAGTGAATGTGTAGCTACTAGAATTTGTTGGTCTGGCAAAAAACTCCCTAATAACGCA
+CCACCTATGGAAGCTAGTTAATAAAATCTGCTACCTATTTACATAATTCCACATGCGTCC
+AATTTTTAAGATTGTCGGTTAATTTAAAAAATTTTCAGTGTAGGTTATTAGCCAGCAGCC
+CGGGTTTTATATAATACCAAAAACATAGGAGGTATTATGAAAACCAATCTGGCTTATGCA
+TCTAATTGTTCTGACTCTCTTTACTCCTTTATTTATCCTGCACTGCAACAACGCTCTGGA
+ACCGAGAATGAAAGTCTCTATCAGCAGGCTATTTCCGCCTGCCATACTCCGAAATAAAAA
+ATGAAAATGGGCGGTTACTACGCTGGCCCCTGGCAGATGCTGTTTAACGCATGGTGTCAC
+AACCGTGTACCCAACATTGCCGTACTGCCGGTATTGGCCCAGCAGTGTTTCTCCTCTTTG
+CAATGCGAAGAGCTGATCGCCAACTGGCACTAATCACATTATGCCCTGCTGGTGGATACT
+GGCAGGACTGGAGCACCTATAAATGTATAAATATGACAGGAACCGGCAGACGTTCAACTT
+GATCAATGCGCTTCAGCCGGTCTATCGCAACAATGGTGGCGGTTTGTTTGAGTTCGACCG
+CAGGAAGCAACATGAAACAGCAGATCTGATCTTCGAGGCACTGACTTTCTCCCCAACGCC
+CGAACTGGAGCTGGCGAAATTTGTCCGTCTCAAATCAGTGCGCCGGATTGCACAGTTTGA
+TGACGGGGAAGTACGTTATGGGGTTCACGTGGAACTAGACGAAGCTGTTAATATTAATTC
+CTTCCGCATTTTTAAGGATGATAATACAGGCGGGTTTGATTTTTATTTGTTTTCTGTTTT
+AGGTAATAATGCAGAGCTTGTCCAGATTAATCTGGATGCCAGCAATATTCATTTGCAGGA
+CATTTTTGAACGGTCTACCGGTTTGTGTTTGTCCTACTGATGAATTTATTAAATATTTCA
+CATCAGGTTGTTAGCCACGAGGCTGAATATGAAATAATAAGAAAAACAATGAGGTGAAAT
+ATGAAAACTTTAAATATTCAGGTTAATGACATCGCAGCAATTAGCGCACTTGGCGGCTCA
+ATGTTGGCGGATATTATCGCCGCGCAATATAAAGTGATTGATGATACCAAAGACGCATCT
+GAAATGGCCATGCCGTGCATTGCTTACGGGCAGATCCCCGCAAACATCGGCCCGGGCGTC
+TTTATCAATCGCGTGTACAGCATGGACAGCCAGTCACTGAGTGCCAGCCAGCGTTACGAG
+CTCTTTAACGGACTTGCAACCCAGGCGTTTACCTTCTTTTTCCAGTCGGGCTGGTATGGC
+GCATTCCGTGTTGTGTCTTTCCGTGATAACGGTCCTGCCGGACTCCTTAATATCGGCATT
+GTCCATGACAAGGTGTTAAACGAATTTTGCGATGATTTTCCACGGGCTAATGTCAGCGAA
+ACTGGCTTCAACTGCGGCATGACGTTTGACCAGATCCGGATGTTTATTTCGGACCTGGCC
+TATCAGATGCCTTTGTACAACAACCAAGACCACTTCGTTAAACTCGCCAAACACCTCGCG
+GCCTGACACCCCTAGCCAGGCTCCGGCCTGGCGATTATGAAGGAAATTCTTATGAGCGAT
+TTATTCAGCAGCGAATCACCGGTAACACTGGCTCAGGCACGCACTGTCGCCGCTGGGTAC
+CAGAACGTCTTTATCGAAAACCTCCAGCCAGCAGGCCATTTCCAGATTGTCATCCGTGAT
+CATCGCGACCACGACAGCCAGCTGGTCTGGCGAAACTGGAATTATGAATCCGGTGCCAAT
+GATGCGCTCAATAGCTACCTGCAAAGCCATGGGCTGAAGGCCAGTTGATTAGCACAAGAA
+CCCGGTAACACCGGGTTTCTTTTTTGTGGGCTCAGCACTCAGAGCTGGCATACGGAAAAA
+GGATCATTGGGCTGTCCGGGGCCCGCAGCTGGTGGTGTAAGCCTGGCCTCATGCAGATGG
+TTTAGCCGGGGGCGGTGATGATGCTGGGAACTAAAAAGAGATCTGGCATCCGGAAAGAAA
+TCTTCGGTACCTCATGGCCTGCGTGGTGGATATGTCTGGCTGACGACTGCGGTGTCGTCT
+GTGACGGACTCGCTCCATAATAATTTGCGGTCGGGAGAAAAGGGGCGTGTTAACAAAATT
+TAAGAACAAGGGACTTTAATATAAATACCGAGTCCATTAACGATGACGCACAGGAGTTTT
+GTGATGTTACTCAATATTGCATTAATCCTCTATGTTGCTGTTTGTCTTTACCTCTGTCTC
+CGTAATAAAAAGGCACTTTACCGTTTCCAGGGCGGAGGGCGTCAGTTTACGCAGTCCAGT
+AAGAGTGGAGCGAACACAGGCGAAAGTGGTTTCTTCTTAATCTCCGGCTACTCAGACACT
+GGCGTTGGGGGCGACAGTGGGGACGCTGGTGGCGGATGTGGGGGCGGTGGTGATTGATAC
+AGGGTGCAGGCACCCGATTGTCGGGGGGCTATCGACAGGGGGTAAAGTTGACGGATTTTT
+TCGTAATGGTTTTGCGTCCGTGGTTCTGGCTGGTGGATGGTGAAGTCAGAGGATCTGGTT
+TTAATCAAGACGGATAGAAAGTAACTTTACGGAATCTGTCATACGCAACCGGAAAGAAAA
+TCTCACGCAGGGCAGCAAAGGCACGCCAGAGTGGATTTGCAGATTCGGACGGGAAAGCCT
+ATTTTTCATGCACTGAACCTATTTGGGCTGGAACGGAACCTGGTATAGTAGACTCATACA
+AAGGAGGGCATATGAATACTTTTCTTTACGTGCTGGTGGGCTGGATTATCGTTCTATATC
+TGGTTAATAAAGTCCGCGAAAAGTACAGCAAACCGAAAACAGTTAATATCCTAGTGAAAC
+GCAATGGCGTTTATCAAGAAGTGGAAGCCGTAGTGATGCCTCGAAGCCATAATAGCGATG
+TGGGTACAGGTAAGACCGGCAATGAAGCCGCCCCACAATGGTTGAATAAAGAGGATGATA
+TTTCTGAACTGGAGTACTACAGTGGCGGGTCACTCTTGAAGGCTGCAAGAGATTTTGAAG
+CTCAACAAATGGAGCAAAAATTCTAGCCACACTATCAGTGTCCACGATTGGGAACTGATC
+GTGAAACCCTTTACTTTCAGATTCAATAAAGTCGGATGCGAGGAGTTGATTAATGACAAC
+GGCAAACGTAACCACCACTACTTACCGTTCCGATGACATCGTGCCTTTTCGTCGGCCGCA
+GGGAGATCTGGATAATCGCTATATGCCGCAGGCTTACGCTCTGGTGCGGAGCTGGGCCAG
+CAAACCTGCGGAGTACGGTGCAGGAGTTCTGGCTACCTACAGACAGCCGGTAGTCAATCT
+CGGGTATAAGATAAAAGGGACTCGCGTTGTTTTAATTCTTGTCCCTATCGAATGTGAGCC
+GGTTGGCGTAAAAATGACTGACGCCGCTTTATGGCCGTCTCTATCGATTGGGGAGGCCAT
+GCGAATTATGCAGGAAGCGTGGCAAAATATTCCGGAGTTGAATCCATAAAAAACCCCGCA
+TTTGCAGGGTTTTTTTTACTTTGCCGATCTGAACATTTTACTCAGTATAAGCCGAGAAAA
+GCGCAAAAGGTTATAGGTAATACGCTGCTCCAGCCGCATGGTTGTTTTGTATCGAGTGGT
+AACGTTGTGGATATGGTTCAAATCAGTATAAAGGCCCGGAGGCTTTCTCTTTAGCTTCAG
+CTCTCCACGGATAAAACTTACTGCTTCAGGCTTGAATACATTTAACTGGCGCCTCTCAGT
+GACTTTCCGAACGAACTCCTCCATACCCATGCAAAGCCAGTCTGGCTTCTCACCTTCAAA
+CTTGCAGGGGCCGTTAATGATGACAACATTGATACACTCCAGCTCGCTGGCGCGTAACGT
+GGACTGAATGGCCCTTATGTGCCCGTAGTTCTGCCTGAACGGGTTTTGTAACTTTAGTGT
+CCCTGACGATTTCCATTTTCGCCAGTGGCTCTCCTCCAGCTTCCCATAGAGCTTTCCTGC
+ATAGTTCTTCTGCTCGATGACGTAGAGTCCATGAGAGGCGATAAGAACGTGATCAATCTG
+CGTGGTGCCGGTGGCATTGACCGGCAGCGTTAAGTCGCTCAGAAGCCCTTCTGCATCATC
+AGGCAGGTATATTTCAATCTGTCTGGCTGTCCTGCGTTCAGCAATGGCCGACGATACAAA
+TCCCATCAGGCAGTAAAGCACAATGAGTACTAGGACAATAATGCTGATTCCTATCACTCG
+CCACACCATCAAAATTGCATCCATCTTATCTCACCGTCGGATAGCTGGTGGCCTGAACAG
+AATCAAGTATCCGAGAGGTTGTTCCTGCCAGCGTTTCGACGTTAGTCGACAGACTCATTA
+ACATCCCGAGCGCGGAGCGAAGCGACCGTTGTGGCTCGTTGTACGTCTTGAAGATAGTGG
+TTGAGTACATTTGGGACAGGCGTGAACGGACTTCGACAGGTGTCAGGTCACCGTCGATGA
+GTCCGTACCGGATCGCCTGCTGCGTTGTCCATACCCTGCCGGAATACAGTGCGACAGCAT
+CAGCCTCCGGACGGCTTAATAATTTCTTACCCCTGCCTTGCTCAACGTCCGCAATGAATT
+GTTCGTGCATTGCATCCAGGATTTGCTTCTGCATAAAATCGCGGGTGGCATCAGAAAGTG
+GATGATAGGGGTCGAGTGCATCTTTAAACTCCCCGGCGGTGAGTGGCTCATTTTTAACGC
+CGACAGTATCCATAACGCGAGACAGGTTCCAGTGATCCATTCGGACACCGATCGAACCGG
+TCAGAGCGCTACTGTCTGCATAAATGGCGTCAGCAGGGGACACAGCGTAGTAGCATGCTG
+ACGCACAAATTCCTTTGACGCTGACGATAATAGGCTTGTAGCTGTTTTCCATATCAGAAA
+TGAAATGCCCACTCCCGGCGGAGAGAACGTCCAGCGTATTACGTTTCGACAGTTCGGCAT
+TGCTATCGGCCTGCGAACGTGAAGCACTGTGATCACTCGTGTTACGGGGCTTGCTTGTGG
+ATTCGGCATGTGAAACCCGTTCAATCTTCTGCTGGTGGCTTCGTAGTGCATTAATCTGGC
+GGTAAATAATAATCGCGTCTGAAGGACCGCCGCCACCTGACTCAGCTTCAATAATGACGG
+CTTTGGCATGTGGGTTGTTGTACGCTTTCGCCAGTGCTGTGGCTATCACAGATCCATCGC
+CGACCTCAGAACCGGTACCCATTTCTCCCGAGATACGCACGACGGCGATATGATCCATTC
+GTCCTTCGGATTCCTGATACTTATCGTAAATATTAAAGGCCGAAACCCCTGCGGCGGCTA
+ATGCCAGCAGTGAAATAACCACTTTTGACGTGGTATGGATTCGGAACATTTTATAGAAAC
+GGTCAGCGTTCTCATCAAGCGATTCTTTGATATTGGCAGGTGACTTCTTATTATTACGTT
+TAAACATCTGACCACCTTATTACATAAGTTTTTGAAAGTTAGACCACAAACGGTTGAGTG
+CAATTCCCAATATCAACAATGCGACAGGGGGGAACAGTTGAGCGATATTGTTAAAAAGTG
+ACATATTAGGCATTGATAGGTATATAAAGGTTAATGCACCAATTATCCAGAAGGCCCTGA
+ACCAGATTCTGTAAAACTGAACAGTTACATTACCGAAAACGTAACGTTTTAATTTCCACT
+GATACATGCCATCAGCGAGCATAGCAATTAGGTATGGTGAAAACAAAATCAGCCAACCGA
+GTATCAGATTCCAGCGGAAAATGGACTGATAAATCAGCAGGGGTAGATTTTTTGCCACAG
+TGTAGTTTACTGATGTCATCTTTTCGGCAACGTAATTCATTCCACGTGCAGGTGTCGATG
+TGTCCGGGATCAGTATCGTATTCAGATAGTCGATCAGCTTATAGTCATTAATCAGGGTGG
+ATAAAGTAGCCTCACTATTTGCAATAACAGATAACCACCGGTCATTAGAAATAAGGCTAC
+GACTGGCGTTCACCTCCTGAGTGATTTGTTGCTTTAGCTCGTCGGTGTTCTGGAACCCCA
+GACTATAAATAAGATAAAGCATCATCCCTAGTAAAAGCAGTCCCCTGATGAATATTGCAC
+GAGCAGAATTATCCGCAGCCATTTGCGTCCCTCCACTCCTTGAATAAGTCTAATCGTTTG
+CTATGGTCACGATAGTGACTGCGCCAGATTGTCGGCACACCCAGCAACCAGTGGTATTGC
+TGCGGGATTATCTGGTTGATCAGGCTGTACTCTGCCAGTTCCTTATGCTCCGGACTTTTC
+CAGTGAATTTGGCCGGGTTCAGGAACATAGACACAAGATTTTTCCTTTGCAGCCTGACGA
+CTAAACTCGACAAAATTAATCCCCCACGGGGTCCAGTGCCGGTATTTCCCGGTAATCGTC
+GTATTAAATATCGGGAGCGTCAGCATAGTGTCTGCATAGGTGGAAATGACCTTTTTGCAC
+ACACAAGGGCTATCAATTTGCTCCCGGTTGAGGTGCGTCAGCAGCGCCCGATCCATGATG
+TGATTGAACATGTTGGCATACTGACCGGACGGGTCGGGCAGACGGTCAATTGCCGAGATA
+AGTTTAAATTTGATCCGAGAGAGAAACGCCGAATCTTCTATTGTGAGAATGTGACTTAAT
+GTGGTTTCAGGGTGAATGAGCGGCTTGTTGCGTTGCACCTGTTTAAACGTGATGCTATTA
+GGCAGCGTAATAAACGCAGATGCAGCATTTGTAAAATTGACAAAATAAGGCAATAAATAA
+CTCCCCAGCATTTTGGCATTTTTTTCGACGAGGCTGCGGCGCTCTTCGGAGTTGTCGAAA
+GTTATACGAAAGCTATTAAATGTACGTCGACCATTTTCGCTCGCCAGCAGAGACTGGACC
+CATTCATCACATGGGCCTTGTGCTACGGTCCAGTAACTCGTTTCATGGTCACCGTATTCA
+TTGCTGGTGGACAGTTCGCCTTGCAGCAGAAAAAGCTCGGAAAGGATGATCGCCATCGCT
+GATAAAGACTCAGCATCGTTGTCATGGCAAAATTGCCCCACACATTTCAAAGCACCTTTT
+TCTATCCCCGCCAGTCGGTTACGGACATCCTGCGATTCGGTAAACTTCAACCCTAATGAT
+TGCATACGCCGCTTAACGAGCGAGCGGCTTTTACTTACTTTCAGAGATGCACTGAAAATT
+TGATTTTGTGTCAGAGTAATTTGCTCATCCATCAATGCAATTTCCTTAGATATTTATTTA
+AATAGCTTAAACCCACATTCTGGCGCAAAGTTACTTTTCCGGCGGGTTTCAGGAACATCT
+CCAGTAACGTCGTATTGGGTTTCATCGCTTTTTCACTTACGGCAATCGGGATCTGCCCGA
+CAACTTTACGACCATCCTGAAGTCTGGCCACAATATGGAATTTGGGGACCTGGCCCAAAA
+GCTCTTTTGGAATACTTTCTTCCAGCGTTGTTTGCTTTCTTTCTGATATTGACCCAGAGA
+AGTTATTATGCGGCAAAGTGGTTTCAGATCCTGTCGTATACGTGACCATATTTGTACTAA
+TTGGACTCTTACCAAAGTTTTCTACGACCAGCGTTTGTGTTGGTGTGTCGTTTACCCGCA
+GGCTAATGTAGTTGTTACATAGACCTGTAATACGGTTTGCCGTCTCAGCGTTCGCTGCTG
+CAATAAAGTCGGAAATAGTTTGCGTGCAGATAAATAATGCAATTTGAGCGGCACGACCCT
+GTGCGAGTAAGTTTATCATTGAATTGTTTATGGCAGAGTGTGCTTCGTCGACGAAAATAC
+TGATTCTTGAATGGGAAGACATATCACCATCGTCAGCGTTATAACGACTACCCGCACAAG
+ACGTAAGATCTGACATTATCAACTGCGAAATGGCCCGGGCTGATTCCGGGTTGGAAAGGC
+CATCGAGCGAGATATACAGAACTCCGCCGGTACTGAACATCCCATCTGAAGTGACTATTT
+CACGCGAAGTGAGTGTATTAGGAGACGGCGAAAGCAATTCATTCAGTGGTTGTTCAGTCA
+GTCGACTAAATAGCGGCATAATACCCGCCGTCATTTTAGACATGTGTTCAGGATCAGACA
+TGGAGTAATCCACTAACCGACCGACGGTATCAATCCATTCAATGGGCTCGGCGCCTTCAT
+AATTAAGAAAATGGGCATTAAACCATTCTGTCAGGCGCTTAAATCGAACCTGAAGAGTGT
+CATTCGAAGCGTATTTCACCTTTTCCATCCAGACATCAGGCCCGTAGTGTCGTGCAAAGC
+AGCATTCCATTACTTTTATCGTTAGGTTCACAACAGACATATGGCTTTTCATGTTTTTGT
+GGATGAGATATATCGACGGTTTTTTATCCGTGTAAGACAGACCAGTGATCACCGTTGAGA
+TGAGAGCTTCGGCATATTGCACGAATGGGTTAACTTCCCCGGGAACCGAAACCAGACTAA
+GAAGTCGTGAGGTGAGGTCCGAAACATTTGTGTAAGCATTGCATACATCAATACACACCG
+ATGAAGACGGCTGGGCTGGGTGAAATTTATAAAATGGCAACCCCAGTTCTGACGCTTCAT
+CCATCAGTGACTGTCGCCACTCAGCGTCATTCTTCGGGTCAATAACCACAATGACATGGC
+CCAAATGCAGCATGCTGATGCTCAGTAAGCGCTGAAGTACCGTTTTACCGGTACCGACGT
+TTCCGGTAATGAGGGTATGTCCGAACCAGTTATCTTCGGTCACAAAAATGGGTGCCCGCC
+GGTCAACAGCAAAGATGGCGTTATTGCCCCCCATGGATCTGGCCATTGTTTCAAAATGTC
+GCGCTATAGGGCTTAGAACAAATGGCAGGGCTATCTCTCTTTTGTCACTTGAGAGATTAG
+CAATTTGATATGCGCGGTCTGCATGCTCGGGACCCCATTCAAAGCCGTTACAAAAGTAGG
+TTTTTCTATCCGGTACTGGTCGGTTATTTTTTTTATACTCTTGTACCAGCTGGCGATACT
+TTCGCTCGTTCGAGAAAAAGTTACTTTTATTGATCGTCCTGAGCGACTTGAGGCTAATAA
+ACATTATCTGGCGCTGAAATACGCGCCAGTGTGCCATCAAATAGGGGTGTGCCGTTTTAC
+AACGGTACAAACAAACCAAAAGCAGGAAAACAGCGGTATAAAGAATGATAGGGGCAATAT
+TCACCCCATCTGAACGAAAGCCCATAACCAGCATTATGACGGCGCAAATTAAAAGCACTG
+AGGCACTTCTGTACTCCAGTATCGGCCTGTAAAAGTTTTCCTGAGCGTGCAGGTTGGTTC
+TTTTTGATTTTGTCATTACAGATTCCCGACCTCTTTTAGCTTGTTAATAATTAACTCAAT
+ATCGACCTTTGCCCGGTCTGATGCGGCGACCAGAGTTGGTATGTTGAATGCAATGCATTT
+TGTATTGACTACGGCACCGGATGTGACCTGGTACTGAGGAAGTTGGTTAAAAAGCTCAGG
+CGCATTTAGCTGCGTTCCGTACTTTTCAATACATGACTGCGTCAGATAAAAGGTGTTCTG
+GGTCAAAACCATGAACCGGTTTTTCCTCTTTCTTTTGAACGACCCAGATAACTTCGTCAG
+AATTTGGTGGAGCATGGTGGCAATCTCGACATATTCGAGTTCTGTGACTTCACCGTCGTT
+TAACAGGGTGAATTCTTCCACCGCCTCTTTCTCTTCAGCGCCTGGTGGTTCAATGGAAAT
+AGGAGCCTTAACTGTGGTAGAGGAGGTTGGATTTTTAACCTCTTTAACAGGGGAGGGTTC
+CTGCGTTTTTTCATGCTTCTTCTCAGCATGGGTGCTTACAGCAAAGAGTCGAGCCAATGC
+CGGAGAAAGATGACTCGCTTTCTCCACGGCGGCTACCGTTTCTCGGACATCCTCTGCTGG
+TTCAGGACTTGTTAGTATTGTTTCTTTTCCGGTTGCATCGGGTGCTGGTGGCTTAATGGC
+ACCCTCTGAGTAATCCAAATCACCGGGCGCAACGGACAGGGCCGTTTCACGAGGTAATTG
+GGCAAAATCGCTGCTCTGCGGATCAGTGGCGGGGTATTCTGCCTCAGTACTGTCAGAGGC
+AATTAAATCAGAATATGCCTCACCATCGCTATCAAGGGTCTCTTCCAGCAAATGACCATA
+TTGCTCATACTCAGTAGCGATGACGGAATCCGGTTCGGAGTGGGCGTTAGTCTGTTCAGC
+TACCGAGCTGGCCTCTTCAGCCACAGGTGCATTCAGTCGTGGTTGGGGGAGTTCAAGCGG
+TGTTTGTGGAGGCGAAGCAGCTTCGTTTACTGATGGAGCTTCAGGGATATCCAACGGTTG
+GTACATTGACGTATCAAATAGTGATTTCAGCGATGACGTGTTTCGTGGTTCCGATGTGCT
+TACTTGCATACCGGCGCAGTTATCCCCCAGCTGTATCAGGCGTAGATTGTTTACATCACG
+GACTATCCACATACCATCTAGAGACCCATCACGGTATGTCAACTGGAAAAATGGCCCATT
+ACAAAATGCCGCCTCATCTATACCCGGGATTAACGCAATCGCAGCATCGAGATCCAGGTA
+AGGTACGGAATCAATATTAATGACGGCATGATGGGGCAGTGGGGCGCTCAACAGCATTTC
+ATGAAGTTGTTCAACCAGATGAATCTGGCTCCGGTCGTCATGCTCTTCTACCTGTTCTGG
+CTCATCCGCGTTTACCGTTTCGGCAGTATCAATTGCCGTAACAACTTGCGTTTCAAAAAT
+CTCGTTTGAGATATCCGCGCCAGACTCTTCCAAACTATCCGTAATGGATTCAGTATTTTC
+ACTGCTAATAATATTGTTACTGTCGGCATCAGGGCCGTTTACGAGCTGAAGTCCATACTG
+TGGGGTATTCTCAATGGCGTCATTGACAGTGTCCGTTACTCTGGTAACAGACTCACGACC
+CGGGACCGGCCTTCTGTATTCCGTTACAGTTTTCTGCTCATCAATATAGATGAAATCTTT
+ATTCGCATTAACGCTGAACAGACCAGGAACTGAATCCGGGATTTTATATGAATCAAAAAT
+TAACCCGATCCAACGCAGTTTTAAGAGGTTATAAAATTCCAGCTTACCAATACCGTTCCG
+GAAGATGCTTGCAATTTCATTTTCCGAATATGTCCCGGGAATAAAGTAATGAACCACACG
+TTCATCGTCGTAAGGTTCAACATAACCCCGTTGCACCAGAGATTCGACAAGTACTGTTTT
+GCCTGCATCTCCCTGCGGGAAGTTGAACTTATGGGCTGCAAAATCACTCAGTACAAAGTC
+GAGAAAGGCGTTTTCATTGAGGTAAACTTCACCGTTTACAATAATGATGTGCATGGGTTT
+AGTTTTATAGTTATTAATATTAATGCTAGTAAAGTTATGCTTAATGGTACCTATTGCCCT
+AGCCGCAGCATCATTCGAACGAAGACCCATTATCGGGTCCCTCAACACATTAAGATCAGT
+ACCTGTAGAGTAATAATCAGAAGTTCTTACACATTTTGATAAAAAGTCATTGCCGTCGTT
+ATAGACATTAAGTGCCGTAACCATTTTTGCATAGACACGCTCCTTTTTGACTCGGTCAAG
+GAATGACATACAGACAGGATCTAAAATCCTCTCAAGAAATACGCTGGACCATATATTATG
+TTGGTTATGAATACGTTTTCGCCAATGTATTTCATATTCAACAACATTGTTTTCTCGTGC
+CCAGTCAAGAAGGCTTTGCGAGCTTGGCGCCCATGTTAATGTTTCACTCAAGTTGAGACT
+AACTATATCAAGGTCATATACCTTCCCTGCATCATGTACTAGGCCGCAGATAAAAGCGGC
+ATACAGATAAACTTTTCGGCGAACCACTTCTTCATCCTGATAGCCAATCGGACGTAATTC
+AGAGTGATTGGCATTTTTTAAAGAGATCATCGCCACTTCCAGGCTGTGAGACAACAATCC
+TCCAATACCATTATGGTGATGATTCTCTGACGCAGGAAGTAAATGAATCCAGCGGATGTA
+TTCAATCAATGGTTTTAACACCAGATTAGTGAAGGTATAGGCATCCTCCCGAATGTCTCC
+ATCACTTATTGCCAGCATCATAGAAATAGAGTGCAGCTTGTCTCTGTACAACGAAAGAAT
+AGACTGCTCATTAAATGTCTGTATCCCCGCAGGCCTGGTTGGGTATTCAATGAATTTCAG
+GACTTCAGGATTCGGGTGGTCCGGCACAGTGTATTTCTGCTCTCCTATAATCTGAGCAAA
+TGGCGAGAAGTTCGCTGCATCCTTCATCATTAACTCAGATACATCATTCTCCCTTCTGGA
+GAAAATGCCAAAAACTCGTTGCATACTTAAGAAGAGTGCCCTGAAATTCATCAAATAATC
+CTTACCGGCGTTTACCAGACAGTTCCGCAGCAATATATGCTTGCACGCTTTTATACTGCT
+TTACCTTTTCGATGAACTCATCAGGACTGTAAGCACCTTTTGCGCGGCGGGAAACGTTAA
+GTGTTTTCTTGACCCGTTCGATATACATATTAAGGCTCCGGATAATATTGTGGGCCATAA
+CGTTGTAATCGCTAACCGGTAATTGACCCAGAGAGTTGAATTTGTGCATCTGTGTCAGAA
+GGTTGTTCATTTCAAAGATGTGCTTATAAAAGCGCATCGTGTTTTGATTGTTGAAGTTTA
+ACTGTACAGGTTCAAATCTGAACGGTGAAAACTCAGTTGATGAGAAGAACGGATCGCTTT
+CATCGATATGGATGGTGGCAATGTGGCGCTCCAGATTGTTCTTCATTAGATTATTTTCTT
+CGTGCAATTCATTGAACCAGTCTTGAATTGCCTGCACTAGTTCGGGGTGCTTAACTGCAT
+TGACCGTTCTGAATAAGGATGAAATGGCAATACTGACATCATCAAACCCTCTTATTACGG
+AACGATTACGTGCCGTGAGAAATCGGTTAAAGTCTGGCGTGCCTGGGGTAATAGTTACTG
+TAGCCATGCCGTAATGTTCATTTTTACTTTGCACGACCCTACGGCTATTATCGGACGCAT
+GAGGGGAGCGGGTATTTACGTCAGGTACCTTATGCTCGCTTTCATTCATTGTTACATCGG
+TCATTGTGCCACCTCTGATTTTGAGTATTGACGGACTTTTCGTCCCAGTTCGATATATGC
+AGCATGGTAGAACTCAAGTAATTCTCTGTAGGGTTCCAGTAATCCCTCCGTTTTTTCAAT
+CATTTCATATTCCCAGCTGGCATGATTAACAAAGCAGCTTTTCGTATATTTTCCACTTTT
+CATCGGTGAAATCCGTTTCGACATATGACTAGGTGGCCTGTTTTTATACGGGCTAAACTG
+ATGCCAGGTAATGGTGACTTTCCTGGCATTACCAATTAGCTCAACTTTTGGTGCATATGA
+ACCCAGATACTCCTTCTTTAGAGTTTTGCTATCCCTGGGTAAATTCCTCTCAATGTGATT
+CCGTTCTTTCCACTCGATCCAATAATTGGTGATCAGTTCTTCAGCCTCTTCTCGAAGAAC
+ATCGATTTGTGAGCGCAATAAAGTACGTGAAATCTCCAATGACTTTAATAGCTTCGATTT
+AGACATGGGGCCTCCTGATGTGAAATCACTATACCGAAGTGATTTTCAATTTTTTTTCAC
+GAACGGGACTTTTTTCTGTGAATTTTTTAGGGAATTTTGCATGGCAAATTTAAGAATGGA
+GGAAGCACTGAGAGTGAGTGACATCAGATGTAAACGGGAACGGCCAAAAGGTCCGCATTT
+TATCGTGGAAGAAAAGTAACTTTTCCAGCAATGCTTATTGCTGAGATCGTGATCTGAAAA
+GAACTGTTTTACCTACTAAGTTATACATCTATCTAGTGCCACTTTTTAAAGGAAAGTGAC
+CCTATGATTTTGACGCATAGTGCCACTTTTAAAAAAAGTGACCCTATGTCGTGATTACAT
+AGGGTCACTTTTCATCAAGAAGTGACCCTATGTCGATGGTGCATAGGGCCACTTTTCAGC
+AAAAAGTGACCCTATGTAGTAGTCATGTTAAACAATCGAAAAAATAATCATGCTTACGCG
+CATTTTTCCCTAAGGTTATTGCTACTTAATGCCGATAACGACTCAGGCTTTGAGGTTTTT
+TTATACGGTTCACATTTCGTTAGCAAGGTCAGGGTTTTTTGATAAAATTCTGGTTAGTTT
+GGTTAAAAAGTGTTACAAGTAAGGGTAATGGCTGAAAGGTTAGTTTTAAGGTTCAAAGCG
+GCAGTATTAAAATTCCAAAAGTTACTTTTCATCCTTCAGAATCCAGACCTTAATTTCATG
+TAGAAGATTCGTACAATTGTATTGGCGCAAGGACAATCCGCACATGTCAGAATCAGATAA
+CATCACGCGTAATTTACTCGGTAAACTATTACGTACCGAGATTTCGATTATTCGTAGTTA
+CCGTGCCTTCTTAATGTTATTGCCTCTTCATGGATCTTCTAAGTATCAAACTGGATCACC
+ACTCCTCCAACGCCGACTATTTGGTAATGGATTTGGAGCTATGATTGATAATGCATTTGA
+AGTTGAAACTCGGCCAGGAAGCTTCCTCGTTCCTCGTTCTTTAAGTAAAGAGATCTCTTG
+GGACAAATTCTTTGTAGCTGTAGTTGATGGCGACACTAACGTCATTCGAGAATATGACAG
+TGAAGATACTGACTTCGGCATTTACAATGAAGGTGAAAAAGTAACTTTGCTCAGCGGGCA
+GGAGGAATTTTATAATCCGAGAAAAATTCAGCAACTACGTTCTAAGTGTGTAGACATTCA
+AAATGATTACTTAATGCAAGTTTTCTTTATGTCAATGCTTGCACCTGAGTTTGTTAGTAT
+CTTTTTTGGATTAAAACCTGCCACCGTTGAAGCAATAAAAGATGTCGGGATGTCATCACT
+TAAATTAATTAATGATGTCGTTCTCTTTCCACGAACAATTCCCTTTACGCCAGGTCTGGG
+GGATGACAGTGCTACGCTAAAATCAAAGGTATTTGCTTGGGCATACGAAATATCTGCCGA
+TATTCGTTTGGGTAAAATTAGTGACGATTTAATGGAATTACTGCGTTACGACACTATGTT
+TACATGCCACCGTCAGGATGTGTTCAATACTTTGGCAAATAAAGTGCTCTTGAAGGATTA
+TTGAATATGGCTAAAGTCGATCAAACTAAAGCTAACATGTTATTGAGCGCTACAAAAACG
+ATGTCTCTTGGTGCCAATAAAAACTCCATAAGGATACTCTATGGAAATCATGTTGCCGAA
+AATATAGACTTCAGGTCTGAACCTCAACAAAACTTTAAAAAAGGGATTCGTGGGTGGAGT
+CGCCGCACGGATAACCGCAGGGCTTTTTCTGCGGTTATTGATGTCGCTGTAAACTATTTC
+GGTTTTGATCCTATTCACCCGGAATCCAGTTTTCGAAATATTGACTTCAACCGCATCATG
+AGTGTGCTGCATAACCTTGGATATTTCGTCTGCGCTCCTGAGGTAAATAAAATCATTGAG
+ATTCTAACGTCAATGAAAGAAATCGAGGAGCTTGAAACTTGTGCGAAATGTAAGCGCCCT
+TATATTGTCCCGTATACCAATGATACTCATTGTCCTCGATGCAGATTGTCGTCCACGTCA
+TCGGCAATAGCACGGTATTCCCAGGAAGAGTTAGATTAGCTGTTATTTTATGTGAGTGAT
+TTAAGTAGAGGTCAAAATTCCCAGGGATGTTTCTTCGTTAACTACAAAATTTCTTTACTT
+ACTTCACTGCAAAATAGACTACATGTTGCTGTTTTCTTCAGACAGCTTCCGGCCTAACGT
+AACTGAAACGATTATGCTAATATTATTTTCAACCGTAGTTGCTCATTACCCAGTCAATTC
+TGCCTAACTTTTCTCTGCATAAGTATGACTAACATGAAATGGCATTTTTTAGGTCAATGC
+TGCATATGATATAAACACATTAAACCGTTTTCTTGCCAAATAATATATCCTCAGTTTTTT
+TAATTTATCGAAAATTCCCGATTCGAAAATCAATCGAATGCGGCGCTCATCTAGAAATTT
+TTAAAAGTATCGTCTGGAATTGAATTCAGATTCAATTAACTATGCTGATAACTATTTTCC
+CACCTTTTTAGCTCCCATACCTTCCCTGCACACAGAAGTTCAACAGCCCTTTCAGGGTCT
+TTCTAGTAGTCACATTTATGACTTTTTAACGTTTGAAATCTACCCCGTTACCGAGCTCAT
+GAAGTTTTTTTCTATGCCATCATACCTCTATTCCATGAGGAGATCGGTAAATGACTCGAT
+TAACGTTAATACCTTCAAAGATGTTAGTGCTGCTGTCTTTGTTTATTACTGGGGTCCATG
+CAAATGAAGAGCAGGCCCTTATCAAAGACACTCCCTTTGTATCAGGACAGGCCTTCAAGA
+AAGGCTTTTTCTGGTATGACGACCCGACAAGGAAAACTGAGGAAGAAATTACAGAGACCA
+AGCCTCCTGTTGCATCTTCGACCCAGCCAGAACAAGAAGAAAAGATTGAGCTTAATTCAA
+AGTGGCTAAAGGACAATATGCCTCAGCTTTTGACTAAGGCTATGGATAATCCGACCCCTG
+AAAATTTATCGAGATTTTATACAGCACAACGTTTAATGCTGGATATCGGTACGCGGTTTT
+CGGATAAATCGAAAGATTATTTCCTTAAAAATCCAATGATGTCTGAAAAACGCAGGCAAC
+CGGTTGAAAAGGTAGCGCTCGATGCACATCGTACGGTGGTCGAGAAAAATCAGCAGTCGG
+TTATGAAAGATATTTTCACTAAATCCGGGCTGTTTTTCTTTTTCCAGAGTACTTGTCAGT
+TCTGCCACGAAGAAAGTCAAATACTCCAGTTTATGGAGAATTACTATTCTGTCGACATTC
+TTCCTGTCAGCATGGACGGCAGACCACTACAGAATGGGTTGTTCCAGGATTTCTCTGTAC
+CTAATGCGCAGATTATTGATCAATTTAAAATCCGTGAAGTTCCAACTATTTTCCTTGTCT
+CAAAAGATGGGTCATCAGCGCAACGAATAAGCGAAGGCATGATCACTGCTGAGGAGCTCA
+AGAATACTATTATTCTGGCTGCAAAAGGCATGAAGCTGATTGATGATGCCTCTTTCCAGT
+CCACTTTAGATATTAAGCGCCAATATACCATTGGCGAGGATGGCGTAATTACTGTGAATA
+AATCAGAAATGGACTCTGACCCGTTCTTATTGCAACGAATAATGGATAAGAAACTGGAAG
+GGTACGATATGCCAACGGCGGACCCAGTGAACTATCTGAATGTGGGTGGAAGTTTAGGAG
+GTGCATATGCGCGCTGATTTCCATGTTTGTGCAAAAAAGTTACTTTTATCGTTAGCCGTT
+TGCACGGCGATGATTGCGCCAAATGCCGTTGCCGATAACGCCATGCGTAATATTTTCAAT
+GGCATGATGACGACTACGAGCCCAGCTAGTTTTGAAACGGCCACCCGTACCGGAGTGGTT
+GGCGGCTCATTTTCCTACCGCACGACAAACGTGAATACCAATTTAGTGTCAATGTCTTTT
+CCCAAAGCTTCCGTAGGCTGCAACGGAATCGATGTTTTCCTTGGTTCCTTCAGTATGATT
+AACGGAGATCAGCTGGTTCAGGTTGCTCGCGGTATTGCACAGGGGGCTGCAATTTATGCA
+TTCAATGTCGCGGTATCGGCAATCTGTGCTGACTGTGCTGCGACTATTAACGATATCCAG
+AATAAATTGCAGGCGCTGAATAAATTTGCCAAAGATTCATGCAACGCTACTTATTCGTTT
+CTTACTGAAAATGTTGGTCCACCTAGCCAGTTTGCGAATGCTGTCAGTTCCGGCCCTGCT
+TCAATGCTTGGCACTCTTAATGGACTGTTGCCTGATTTTGGTTCATCAATGACAAAGTCG
+CCGGAAACCGTGACTTCCCAGGTAAAAGCAAAAGACCCTGAAGAGTTTGCTGAAAAATTC
+AGTGGAAACCTTTTCTATATGTCATTTATGGACATCGATAAAGGGTCAATGAATATCGGT
+GGCGTGACTGAGCTATCTGGCTACAGACTTGCTGAGCAGCTGATGTCGCTTGTCGGTACT
+GTAATTATCAACTGGGACGCTAAAGGTGAAAAAGCGGGGATGGAAGTTCGCCCGTCGACG
+ATGACGGTATCGGATTTCATCATGGGCCCACCGGCTGGTGGTTCCATAAAAATGCTCAAA
+TGTTCGCCTGCCCCCGATCCAGCTTCAGCTAGAAAGTCGCAATGCCTGGTTATGTCTGAA
+GTGACGGATGGTGGTTTCAAAGGTTTGAAGGATACAATCTCGGACCTCCTTATTCAGGTT
+CAGACAAAGGCAATTAGTGATGTCAGGATCTCTGATGATGAATTACGCATTATTTCTTAT
+ATTGGCATCCCAACTATTCTTGATTCACTTCAGACGTTTGATGTCCCTGAAGGCTACGCC
+TATATCCAGGATATCAGTGCGATAGCGGCCACCAGCCTTGTTATTAACATGCTTCGGCAA
+GTTGAAGCAAAGATCAGCGCTATGAATATACCCAGCGAATCTCTTTCCGGGCGGCGGCAG
+GACCTGACTAGGTTATCTGAAAACCTGACCAATCAGGTAAAAGCTGCCTATGAGCTAACC
+CGTAGCCAGGTGGGCAACAGCTCTGACGTCATTTCTGCATGGGATGATCGCCGATTAAAG
+AGAAAAGCGTTCATGGAAAGTCTTCGTGGCACAGGTAACTGAGGTCTGATATGGATTACA
+ACATCTATACAGTTGGCGATATTGAATTTGTGTGGTCCGCCCTGAACGGGATTGCCCTGA
+TTTTCTCACAATACACCGGTGTAAAAGCATTTCTAACGACGGCAGCGGTACTGGCTGGAG
+CCAGCCTGTTTTATAAAACGTGGCTTTGGCTGTTGAACCCGACAAAAGCAGAAGTGCCGA
+TATTTTCATGGATTCTTGGGCTGATTCTATTTTCGATGGCAATTGTTCGTGTGGATGTGA
+CGATTGAATCAGTTAAGTCTGGTGAAGTGAGAAATGTCGATGGCATTCCTATTTTTATTG
+CGGCGATGGGAACTGTCACCACGAACCTTAGCCAGGGCTTACTCAAAGACTACAAAACGG
+CATTTGATCCACTGGCGCCGATCGACTTTGCCGCAACGACGCTTGATGATGACATTACTC
+TTGGTCCGATGATTCGTTTCGTTAAATTCTTACAATGGGGTGGTGACAGCCAGGGCTATT
+GTTCTGCGTTTCCCGAACCAGCCAGCGGGTTAGGTGCGATGAATGTGTGCGCGACAGTAC
+AATCACTGGCCTATAACTGTCTCAAGGGAACCCAAAACTCAAGCGCAAAAATTGCTGGGA
+AAGAAACCATTTTTAACGATATTTTCTCTGCAAATATCGTGGATAGCATGGAACGCATTA
+ATCAGGCGATGAAAGGTTCGCTGAAGAACGCCTCTGCCAACATTGTCGGTGTGAATAGCT
+CAAAGTCTGCTACTTGTGAAGAGGTCTGGTCGACCGTTAAACAGGTAACGAGCACCCCAG
+AGGCTCGGCAGACGATTGCATTGATTGGGCAAACAAACGGTATCCTTGCTCCAGATGAGG
+CGGGAGGTGCAGCATCAGGAGCGAGCTTCACGGATGTAATGGCGTCGGCGAATGGCATGT
+ACGGCAAAGCTATTGGTGCTTATGACGCGACGCTTAGTTTGTTCATCATGAATGAACTCC
+GTAATGGTGCCAGCAAGTACAAAACCCCACTCGGGCTGGCCTCGGATATGCAGTTGTTTG
+AGGCATCATTAAAGCGTACGAATACCATGGCATCTCAGGGGCAGCTCTGGCTGCAATTGT
+CCGGTGCAGCCATCGCGTTTCTTGAGATGTTTGCGTACATGGTTGCCCCATTTGCATTGC
+TCATGCTTTTGGCTCTCGGGGGAAATGGTGTGGCCGCTGCTGCAAAATATCTCCAGCTTA
+TTCTTTTCGTAAATATGTGGCCTATTACTGCGGTTATGGTGAATGCCTACGTGAAGAAAG
+TGGCGACCGCAGATCTTGATACATGGAGCACATTGAATAGTCAGAGTAACGCGGTGACAT
+GGATGGGTTTGCCAGGGCTTGCCGAAACATACAGCTCTTATTTATCAGTAGCATCAGCAC
+TCTATGCTCTTATCCCTGTATTGACGCTGTTCCTGATGACGCAATCCATTCATCCAATGA
+TGAACGCGATGAAAGGAGTCACACCACCAGCGCCAGTGGACTCCAGCCACCTCACGCCGA
+AAGTGTGGGATGCGCCAAACAGCGGAAAATCATCGTTTGGGGATGTGAATCGTACCGCGC
+TGACAAGCACCGGCCAAGGATTCAGTGGTGGCGGGGCCATGGACTCCAGTAATTTCCGAC
+TCGGTACGTGGAATGCCGGTTCAAGTATCGCGTCAAGCCAGGGGCAAGGGGCAGCATTTA
+CCTCTTCAGCCATGAGCGCAGCAAGTAACACATTCCAGCAGGCCTTCAACCAGATGAGTG
+AAGTTGGCCGAACGGGGCAATCAGGCCAGCAATTTACCTCCAACCTGCAAAGCTTGAAAT
+CATTTACTGACCAGGCCGGTGCAAACATCGCGAATAGCGTAGGGGCGAAGCATGGAATTA
+ATTCGCAGCAATTAGCTGGCGTGGTGTCAAATCTTCTGCTCAATGGCAGTTTGGGACTTG
+GTGGTGAAGAAAAACTTGGAAAAGGAGGAGGAGGAGGTCTCGCTCAGAAAGTAATGGATA
+GCCTAGGAATAAAAGCGGAGGGGCAAGTTGGATCAGGGATCACGAAAAGTAATTCTGGGA
+ATGAAAGTCTCTTAACTGATTTGAGTAAAGCTATTACGACTCAATTGACTGAAAACTCAG
+GACTGACTGACCAAATGACTAAAGCGGCTGCTCAGATAAACAGTGATCAGTTTGCACAGA
+CCAATGCATTCAAAGAAGCTGCAACAAAAATGAACCAGTCCACACAGACAATGGCCGAAA
+ACTTGTCGACGTCACTTTCAACGAACGCCAGCGCCAATACTGGCATGACACTCGACTCAA
+GACAGGCTATCAACCTGGACAGATTCTCCGATTCTATCCGTAATAAAAACTTTAGCGATG
+AAGATGTGCGTAATTTTGCACGGAAAAATGGTCTTGATGAGAATGCCTTTATGGAGAAGT
+TCAATTCCTATAATGACACATTTAAGGCCAGCACTCAGTTGGGTTCACAACTCCAACGTA
+CAGATGCGCTGGTGGCAACGACACGTGACTTTAGTGAGCAAAAAATAGCGATTGATACTG
+CCCGAGGTGAAACGGCTGAGAGCAATAAACAGGATCTGCGTGAAACTTCCAGCCTGCTTA
+AAGGGCTGGTTGCTGACTTTGGCGGTAACGCTCAACAGATGCTGCCGATTACTAATCAGC
+TTGACCGAATCACTGGTGATGCCTCGGGTATTAACACGATTGCACAGGCGCAGGATCGCA
+CCCCAGAACATGTAAATACGTCCAGCGTAATGAGCGCTGATCGTGTTGCTGACGTGGGGC
+AAAGTATGGATGCTCAGGCAAAAGCCGGGCTGGTACAAAACCAACAAAATGCTAACCAGC
+ATGTTGGTGGACAAACTGAGTCTGGTGTAACTCCGTACAATGTGGACAAGATCAGCAAAG
+AAGATATTCAGGGCATTCATCAAGGTAATGTAAATAAATCCTATAGCGAAGAGAACCAGA
+ATGTGCTCTCGTCATTGGAGAAGAATACCCCTGTTGTGACGAATGAAACTGTGGGAAGAG
+TTCAGGGGGCTGGGGTGGACGTTCAGCACGCCAACCAAACTTTCGACCAGTTACAGGCTG
+GTTCGGGCGGTAAGCATGCGACTTCGGGCATGGGTACTATCAGCGACAAACTGAATAATA
+TGTACGGAGATAACCAGATACGCGGTATATCAGGCAACCTCCCGAATTATTTTGGCAGGA
+TTGCAAATGATCCTACCAAAAAGCCGGATGACAAACGTGCGGAACTGGCCGCACAAGCTG
+TGTTTACCTATGGCGCCAGTACAATGGCAACCGGCGCTGAGAAAGAACAACTGAAAGCGG
+ATACTCAAAATATCCTCTCCGAACTGAGTCACTATAACGTTCGCTGGGGGATGAACGATC
+TCCAGAATATCCATGAAGGTTTCAACATGCATAACAAGGCTTCAGGTTCTCTTGACTCAG
+TTGTGAGGGCGAATCTTGGGGAAGGTGGTTCTGGCGGCGGGCTCGTTGGGCAACGAACCC
+AAACCACGACGGATCTCCTTGTTGGTAATAAAATTGAGTCCAATACAGAACGTGGTGTTA
+TTGGTAGTACGCTTTTATCGGGGCAGGAGAGTGTTGCCAGAGGACTTGACGTTATCGGAG
+CTAAACCTGTAAACGACATGCTCTCAGGTATGGGTATCCTGACCACCCCTTCATCTTTGG
+CAAACGATGCTTCGAATCCACAAAATATGCCGAGCTCGCTATTGGGCAAGGTTGGAAATC
+ACCTGCAAATGTCAGATGGTGTTAGCGAGGTGACCAGCAGGTATAAGGATATGGGGGGGG
+ATGGGATCAAGGCGTATGAGACTGCATCACAAAACTCAGAACGTGCGATTCGTCAGCAAC
+TGACCGATGATCCACGTTTTGGGCCGGATAAAGCAGATGCATTCGTGAGCTTTATGAAGT
+CAAACCTGAATAATACAAATGAACCATATCAGTCGAGAATTGAGAAAGCTAAAAGCTGGC
+TGAATGAAAATAAGAAGTAAAAGTAAGTAGTAGCTGATAAAGGCCGTACTCTCTTTTGAG
+TACGGTCTTTTTTTGCTTGCATCACCCTGATTCAAATTTCCTCACCAAATACAGGTCACC
+CGGCACACTAAGAAAATGTGCATTTCTTCTGTTCAAAATGAAAATTGAGAGAAAAGTAAC
+TTTTCTGAATCGACTGATGCTTTAGTGCCTAGGCTATAGCGCATCAGAGGCTTTGGTTGT
+ATGGAGGGTGTGGAAAAGTTACTTTTTCAATAAAAGCGGGTCATCAGCACATTATATCTG
+GCTATCAGGTCCGTTAGATCCTTTTCATTAACCCCGGTGTAATAATCTGTACGAAACAGG
+TGCGGGTACTCTGGAGGAACAGGGTCGCATCGTCATCAAGGCAGATAAAGGCTTTTACTT
+TGTGTCTGGTGACGAAGTCCTCACATTCAGCTGCACGGACTCCTATACTTCCTGAGGGGA
+GATACAGGGATGGGGTTGCTCCAATTACCCTGTCTCTGTATGGCGAGCGGAAAAGTGACT
+TTAGGTAAGTGATACTGCCGCACTCTCTCCATGAGCTTGATATAACGATGAACATTGAAG
+GACTCGCGTCAAGTAACCTCTCAATCAAATGCATCCTCTCGAACGATTCATTCTGACATT
+TGTGGACTACACCATCAAAATCCAGGAAAAGAACAACATGGATTGATGGCAAAGGACCCC
+ATAATCCAGCGGTTATTTCTTCATGAGACAATATCCCATCCACGTCTTTATTTTTGGGCA
+GCTGCGGTGAACTGCATAAATTGAACAGGAATTTATAAATTGACTGGAGCATCGTTAACC
+TTTTTCTCAGGACGTTTTCATTCTCTAAGAGCCGCATTGTTTATGGCTACGAAACAACTA
+ATAAAAAATTGGAGAGTAGGGTCGTATTTTATTCAGGAAGATTTTTTACAATATGCCCGT
+TGTACTGGGGCTTAGGTTGCGTCCACTGATATAATTCGTCCATTCCATTTCGGCGCTGAA
+TCCGGCGATTGTATTTGATCATGAAGTTGAAGATATACGTCGCCCGGACCTTAGGGGTTT
+TGCTGTTGTAATCGGCAATCCCTTCAAATACGTTACCCTTCCGGTCAACAATCTTCCGGT
+AAAGCCACCAGGTGCCCACCCAGAAACTGGCACAGGCGTCATAGGCCAGCACCCGCCACG
+TAACAGACGGAAAATGGTCGCGTATTTCTGGCAGGTTGGACGAATTGATCTGCATAGGCC
+CAATATCATAAGTGCCATTTTTATTACGGCTGAACGTCCCGACTTTTCCGCCCTCATTAT
+CAAAAAGCGTAAAGACCAACTCCGCATCAATCCCGAAAAAACGGGAGGCATCGGTAATGC
+ACTGCGTGTAGATCTCAACAGGAACGGGAATAGGTTTCACATCGTCTACTGGTGGTATAA
+ACACGAGATAATCTCCGCTGGAATTACGTTCTGGATATTCTCCCATATCGTCGTCAAAAT
+TTTTTTTGCTATAGGGGGGAATTTTTCCCCTTAAGCGAATTAGGCAGATTTTTTCGCATG
+ATAGTATTAACACTCCATTAAAGGAGCTGAAATGAATAAGACTATCAAGGCATCATTATT
+TTTACTGGCATCCTGTACGGCCTTGAGTATGAATGCCCAGACAGCGAACACTGACGTGCT
+TCCCGATGCTGCACTGAAGAAATTAAGAGAAGTGGGCTTGTCTATCGAGCATATTGAACC
+ATCGCCGGTAAAAGATATTTATACCGTCATTTCAAGAGAGGGCGTGAGCTACGTCAGCAA
+AGATGGCGATTACATTTTCACCGGGAGCTTGTTTCATGTGAACGGGAAAGATGTGGAGAA
+CACAACTGAGCAGGCTATTCTGAAAGGTGTCAGGGAGTTCGCCACTAAAACAAAATCCAT
+CGAATATAAGTCGGCGAATGAAAAATACCGTCTGGCAGTGTTTACGGATATTACATGCGG
+CTTTTGCCAGAAATTGCATCAAGATCTTCAATCCTATCTCGACGCCGGGATCTCAATCAA
+ATTCCTCGCCTTTCCACGTGCAGGTCTCAACTCCGTTGTCGCGGGGAATATGGCAAAAAT
+ATGGTGTGCGGCAAAACCTAATGATGCACTGGATGCCGCAATGAGCCCGACATCAACCAT
+TCCGGAAGGACGGCCTGACGAGGCCTGCCTCGATACCATCAAATCGCATTTCCAGGTAGC
+TTCAACTATTCCGCTTCAGGGTACGCCAACGATGGTAACGCTGTCGGGGAAACCTCAGCT
+ATTCACCGGTTGGATGAGCCCGGAAAATCTGGTGACCCGCATGGGTGCCGAACAAAAGTG
+ACTTTCCACGACTGCAAGAGGTGTTTATGAAATCTGCAATACTGACAACGTTAATGCTGG
+TGGCGGTTGGTTCTCAACCCGTCTTTGCTGCCAAATGCCAGTTCGGGGCCTGCGACGCCG
+ACACTGTGGCCAGCAGTGAGAGTCTGGTATCTGCTGCTCAGACAGATAAAGACGCAGTTT
+TAAAAAAACTCAATGATGCGACATCCCGCAGCGACGTGATGTCGAAACGGTTTGAGTCGT
+ATCTGAGCAATGACAGGTTAAAGGTGAACACCGACAGTACCAAGAAAGGCCCTAGCAATG
+AAATCGCTAAGCCGAGGGATGAGTTGGCGCCGGTAAGGCAGCTGAAAGCCATTCGCCCCG
+AGCTGGTACAAACACCCATCTTCCAGCCCATTGTTGCGTTCTATGAACGTCTGGCCTGAG
+TGCGTCGCTGGGGGTTAGAAGATGTCGCTTTGGCTCAGCATTGTCACCCGGGCAACGGGA
+TTGCCGGATAAGCGGTATTTAAATGATCCGGTGATCCTCCGTTATTACCAACAAAAGATC
+CAAAAGGCTCCTTACGCCCTGGTGGGATGGACTCTCTGTTTCATGGCAACCATTGGTGTG
+TCGCTGGGACTGGATCTTTCCAACCAGATGTTACTTCTCGTTCTGCTGATATTGATCTTT
+CTGATGGTGGTGCTCCAGGGGCGGTACCAGTTCATGCATCCGGAAAGATGTATCAATGCC
+AAATTTTACCAAACGGTGCTGGACGATGCGTCAGTCTCAGATATTCAGAAAGCTCAGTTT
+GAATATCTCTTCGTGACCAAAGTGGATGAGCTGACCATCGGTGATCTGTACCGACTCTAT
+GATTTCAACAGAGGAGGCCGGTAAAGACGTGGCATGCAGGTGAGAAAAGTTAATTTGTGG
+TTGGTCGTTACAGTGCCGGTCATCAGTTCCAGGGGACCGAGGCGACGTAGTTTCCGGAGC
+GCAGCGGGGCATCCAGATTCCCGGTCAAAGCGTCAATCATTGCGGAATACGCCACGCTGT
+CCGATGGGATCGGCGCATTGCTCTGCATACTGACTTTTAGCACCTGCTGTGCATTTTTTC
+CCGCAGGGTAGACTTCCACATCAAGACGACGCCAGAAATGTCTTTGTGATACCGTCTCTG
+TTCCTACGATCCCACTGACCGGCTTATAGTCATAGTCCGTCTCAGTTTGCCCGTGCTTAT
+CTTTTCGCGTTGTTTTCTTCTCGATAACATATCCGGTTATTCCCGTCACCGGTAGTTCAC
+TGTATTGCAGATTCTCCTGGGTCTTGCTGTAACTGAATCTGAGAATATATTCGGGCTGAT
+GGCTGGAAATATTAAACCCCTTACCCGTTAATCCGCTCGCAAACCGGGCTGCAAACATTC
+GCGACTGAATACTGTCATCCGGAGCAACAATTTCAAATTTCTTGCTGCCTACCGGGCGAG
+GCAGTAAATCGTACGCATCAACGTCATTTCCAAAATGATAACCGCATCCACATAAGAACG
+TTGTGGCTGTTAGTAAGAAAAATTGCCGTAACATTCTAAATCCTCCAAAAAGGGTTCTTT
+AATGAATAATTCCGATTTACCGTGCCAGTATAATCGAACGCAGGCTGATAACTAACAAGT
+TGAAATGCGTAAAGGTGGCTATGATTAAATTAAATTATTTAAAACCCGTGGCGTCTGTTT
+TAATTTCTGCGGTGATTGCGACGGCTGGCTCTGTGTATATTACGTCGAAATATCTAAAAC
+CCGATGTACCGGGTAACGACGAAATAGGACGAGTGGCTGCTTCCTATCTGGTAAAAAATC
+CCCAGTATCTTCTCGAAGCAGGTAAGGCGCTAGAAAAAGAAAATACTAACGCTTCCCTTG
+AGCGGATTATCCCCTACGCACCGGCACTCTTCGAGACCAAAGAGACACCCAATATCGGAC
+CTGATAATGCGGCCGTCGCTGTTATTGAGTTTTTCGACTACCAGTGTCATTTCTGTATGC
+AGGTAGCGCCGGTTGTTGAATCTGTGTTGAGCCAAAGCACTGATGTAAAGTTCTTCTTTA
+AAGAATTTCCGATCTTCGCTGGCTCAAAACCTGTTTCCGCAATGGGGGCGGCGACAGGCC
+TGCATGTGTATCAGACATTCGGTGCGGAAGCGTATCGTAAGTATCACAACAATCTGATGA
+CCAGTGCGTATGTATTCTTCAACAACCAGCGTGCGTTTACACTCAATGATTTAGACATGG
+TTGTGAATAAATCCGGGTTCAACAGCTCATTCGGCGATCGGGAGAAAAGCCGCTATGAGA
+ACGTTATCTCCGGAAACATGCAGCTGGGGGAAGCTCTCGGGATTAACGGTACGCCAGGGT
+TCATTATTATGAACATGCAAAAACCCGACGCTGCAACGACGTCATTCATCCCGGGCGCTG
+TTGACGAGGCCACCCTGAAATACGCAATCCAGAAGGCCCGTGGAGGCTAAAGTTACTTTT
+CCTTCCGAAACTGGCCATGCCGGGTAACACCGGCATGAACGTCAGGCTTTGACGACAAGT
+AACTCATTCCAGCGAGTGGTATACCGTGGGGACAGCATGGCCTGCTTCCCCCGGAAATCC
+TGATGAATCCCTTCGCAAGCCAGAAACAGAGAGCCTCGATGCTCTTTGTTAAACCGATCC
+ATCACCTTCATCAGTGCTTCACTGCCTCGCCTGGCGGGACGTTCATCGAACAGGGATAGC
+TGCTCAGTGCCATCGGTCATTGACGAAAGCATCACGCCCGCCTTCGCATAATCTATGCCG
+GGTTTGTAGATTCGGGTCAGTATGGCGCCTGCCGCACTGACCAGGTCGCGGGTGTCCTGC
+GTCGCAGTAAGCGGCTCAATACCGCAGCTGCTGTACCGGGCTTCAGCTCTGGCAAACGGG
+CTGCTCTGGATAAACACGGTGATTTGGCGAGTCCAGGAGCCATCGTTTCGAAGCTGTTCA
+GCGGCACGGCCGGTAAAGAATGACACTGCCTCATGCATCTTGCTGAATGTATTAAGGCGC
+TGGCCAAAGCTCCGCGAGACGATAATTTGTTGTCTGACAGGAGGGGATTCATGCAACCGG
+AAACAGGACTCGCCATGCAGCTCCCGCCAGGTACGTTCCATTTCAACACCGAATGCCTTT
+CGTAAAAACCGCACATCGCTGTCATAAAAGTCGCAGGCCGTGATGATCCCGTACGCAGTC
+AGCCGCTCACTGATTTTGCGGCCAATGCCCCAGATTTCCCGGGTACTGATGAGACTCAGC
+AGTTTTTTAATTCGGAATGGGTCTGTAAGGACGACCACACCACCAGTTGCTGCCCATCGC
+TTACTGGCGTAGGTGCATAATTTTGCGAGCGTTTTCGTGGTCGATACTCCAATCCCGCAG
+GTGAGCGAAAGATTGTGTAGCAGCGTTCGTCTGATCAGGCATCCGTACTCTTCAAAATCT
+ACTATTTTGTCCATGTTTTTCAGTAGCATGAAGCTTTCATCCACGCTGTAACGATCGGTA
+TCCTCGGCAAACCCCTCCAGCGTTTCATGAAACCGGTTGGAATAATCTTCGTACAACGTA
+AAGTTGGAGCTCCGTACCGCAATATGATGCTGCTCAATCAGATCCCGGCATTTGAAGATA
+GGCATCCCGCGTTTGAGCCCTGTATTTTTGGCGAGCCTGTTCATGGCGATAATGGTGGCA
+TCGTTGTTGCTCGCGATGATGAGCGGGGATTTGGCAAGTTTGGGGTCCATGGCGCATTCA
+AATGCCGCGTAGGCTCCATTGATATCAACGTGCATGTACATGAGGAAACTGATTCAACGC
+AAAGGTGACAACGCCCCAGATTTCAAGAGTGTCCGGGTTAACAGGTATCGGCTTGAAGGC
+GGGGTTGGAGGGCATCAACATCAGTTTCGGGAAGGTCTGCAAAATCTTCACGGTAAACTC
+GCCGTCAACCAGCGCAACGACGATTGAGCCGTGCTCCGCAGTCAGTGACCGATCCACAAC
+CAGTATGGCGCCGTCGTTTATTCCGGCGTCTACCATGCTGAGACCTGAGGCCCTGACAAA
+GAAAGTCGCGGGGCGATTACGAACCACAAAATCATGTAAATTCAGCTCATTGTCTTCGTG
+TCCGGCGCACGGACTCATCACCCCGCAACTCAGTAGGTCACTGAAAAAAGGGGTTGTATC
+ACGAGGAGGGGATGCAAAACGTTCAGGGAATACAGACATGAGCACACTCGGATTCAATAC
+TGGATATTTAACCAGTATCACCAGATAAAGAGAAAAGATCAAATTTCAATGGCTCAGCAT
+TCGGGAAAGATATCCCGGCACTAAGCCGTAATTTATGTAACGGTATGATATGGTTCAGCG
+GATTTTCATTCACGAACATGACAACAGGAATTCCCTATGGCTATCGATACCGACGATACC
+GATCCGGTAGACGCAGAGGCGTGCGAGAAGTACCTGGCACAGTTACGGGAACTGGAGGCA
+TACAGGGCGTACCGAACGACAGCTGCGATTGACTGGTTCTTTGACCAGGCTACCCGGGCC
+ATTCACGGTGAGTTGTGGCTAGCCGCCTGTACGACTTTCCTGAACGGGATTGAGACCTCA
+CTGATGGTGACGATGAAGCTGAAGGCGTCGCAGGCACAACCGCAGGCACCAACACCGCTG
+GTGGACTTAAGCGATATGGCCACACTCAGTAATGCTCTGCTAAGAAGGGCTCACCAGGCC
+GGTATGCCGGTGACACTGCTGGCCTTTCCCGACGAGCAGGATCTGCTGACCAAGATTGCG
+GACGGCGCCCCGAAACTACCCTATGCGGAAATCGTGAGGGTTCGGCACAATTTATGTCAC
+GGGAACATCCTGGAGCACATCATCACTGCGAGTGACGGTATGGGGGAGCCAGTCCGGTTA
+TTCACACCTGAATGTATGCGTGATCTGGCGCAGACGCTGTCGGCAGTCTCGAAAGTATGG
+ATTGCAGGCCTGCATCAATATTGGTGTGATAACAATTTATCTATGCCTTGAAAATTCCTG
+ACGGATTTTGTTCCCGGTGTCATTTGTACGCCGGGATGAAAAATGATGCTTCACAACAGG
+AATTAGCTGTTTATTGCTTAGAAAGATTTGTGATATAAAAATTATGTTTTGAACTTGATG
+ATAGTAATGGAGAAACATATGAAAATTAAAAACATTGTATTGGCAGGAATAATTTCATTG
+GTATTTTCTGTTCATGCCAGCGATAAGCAGAATATAAAAAGGGACCCAATACCTTATTTA
+GGGTACGACGCAGTTACTTCAAACATGTGCATAGATGCTGGTGGTTTAACTGATCCAGTG
+GAGATGAGAAAGAAAGCTACTGAAACATTACTAATGATTCTTCACAAACAACCAGGTGAT
+AAACTATCTAAACAATCAGAAGATACAATAGAAGCATTTGTTACACGAACAAGATCCTCT
+TCAGATGACATATCTAAATGCCAGTTCAGTGCTGATGAATCCCCTAATGATTTTTATCAA
+AATCATTAAGTTAAGGTAGATACACATCTTGTCATATGATCAAATGGT
+>NODE_16_length_35628_cov_42.0221':NODE_18_length_78_cov_102;
+ACCATTTGATCATATGACAAGATGTGTATCTACCTTAACTTAATGATTTTGATAAAAATC
+ATTAGGGGATTCATCAGCACTGAACTGGCATTTAGATATGTCATCTGAAGAGGATCTTGT
+TCGTGTAACAAATGCTTCTATTGTATCTTCTGATTGTTTAGATAGTTTATCACCTGGTTG
+TTTGTGAAGAATCATTAGTAATGTTTCAGTAGCTTTCTTTCTCATCTCCACTGGATCAGT
+TAAACCACCAGCATCTATGCACATGTTTGAAGTAACTGCGTCGTACCCTAAATAAGGTAT
+TGGGTCCCTTTTTATATTCTGCTTATCGCTGGCATGAACAGAAAATACCAATGAAATTAT
+TCCTGCCAATACAATGTTTTTAATTTTCATATGTTTCTCCATTACTATCATCAAGTTCAA
+AACATAATTTTTATATCACAAATCTTTCTAAGCAATAAACAGCTAATTCCTGTTGTGAAG
+CATCATTTTTCATCCCGGCGTACAAATGACACCGGGAACAAAATCCGTCAGGAATTTTCA
+AGGCATAGATAAATTGTTATCACACCAATATTGATGCAGGCCTGCAATCCATACTTTCGA
+GACTGCCGACAGCGTCTGCGCCAGATCACGCATACATTCAGGTGTGAATAACCGGACTGG
+CTCCCCCATACCGTCACTCGCAGTGATGATGTGCTCCAGGATGTTCCCGTGACATAAATT
+GTGCCGAACCCTCACGATTTCCGCATAGGGTAGTTTCGGGGCGCCGTCCGCAATCTTGGT
+CAGCAGATCCTGCTCGTCGGGAAAGGCCAGCAGTGTCACCGGCATACCGGCCTGGTGAGC
+CCTTCTTAGCAGAGCATTACTGAGTGTGGCCATATCGCTTAAGTCCACCAGCGGTGTTGG
+TGCCTGCGGTTGTGCCTGCGACGCCTTCAGCTTCATCGTCACCATCAGTGAGGTCTCAAT
+CCCGTTCAGGAAAGTCGTACAGGCGGCTAGCCACAACTCACCGTGAATGGCCCGGGTAGC
+CTGGTCAAAGAACCAGTCAATCGCAGCTGTCGTTCGGTACGCCCTGTATGCCTCCAGTTC
+CCGTAACTGTGCCAGGTACTTCTCGCACGCCTCTGCGTCTACCGGATCGGTATCGTCGGT
+ATCGATAGCCATAGGGAATTCCTGTTGTCATGTTCGTGAATGAAAATCCGCTGAACCATA
+TCATACCGTTACATAAATTACGGCTTAGTGCCGGGATATCTTTCCCGAATGCTGAGCCAT
+TGAAATTTGATCTTTTCTCTTTATCTGGTGATACTGGTTAAATATCCAGTATTGAATCCG
+AGTGTGCTCATGTCTGTATTCCCTGAACGTTTTGCATCCCCTCCTCGTGATACAACCCCT
+TTTTTCAGTGACCTACTGAGTTGCGGGGTGATGAGTCCGTGCGCCGGACACGAAGACAAT
+GAGCTGAATTTACATGATTTTGTGGTTCGTAATCGCCCCGCGACTTTCTTTGTCAGGGCC
+TCAGGTCTCAGCATGGTAGACGCCGGAATAAACGACGGCGCCATACTGGTTGTGGATCGG
+TCACTGACTGCGGAGCACGGCTCAATCGTCGTTGCGCTGGTTGACGGCGAGTTTACCGTG
+AAGATTTTGCAGACCTTCCCGAAACTGATGTTGATGCCCTCCAACCCCGCCTTCAAGCCG
+ATACCTGTTAACCCGGACACTCTTGAAATCTGGGGCGTTGTCACCTTTGCGTTGAATCAG
+TTTCCTCATGTACATGCACGTTGATATCAATGGAGCCTACGCGGCATTTGAATGCGCCAT
+GGACCCCAAACTTGCCAAATCCCCGCTCATCATCGCGAGCAACAACGATGCCACCATTAT
+CGCCATGAACAGGCTCGCCAAAAATACAGGGCTCAAACGCGGGATGCCTATCTTCAAATG
+CCGGGATCTGATTGAGCAGCATCATATTGCGGTACGGAGCTCCAACTTTACGTTGTACGA
+AGATTATTCCAACCGGTTTCATGAAACGCTGGAGGGGTTTGCCGAGGATACCGATCGTTA
+CAGCGTGGATGAAAGCTTCATGCTACTGAAAAACATGGACAAAATAGTAGATTTTGAAGA
+GTACGGATGCCTGATCAGACGAACGCTGCTACACAATCTTTCGCTCACCTGCGGGATTGG
+AGTATCGACCACGAAAACGCTCGCAAAATTATGCACCTACGCCAGTAAGCGATGGGCAGC
+AACTGGTGGTGTGGTCGTCCTTACAGACCCATTCCGAATTAAAAAACTGCTGAGTCTCAT
+CAGTACCCGGGAAATCTGGGGCATTGGCCGCAAAATCAGTGAGCGGCTGACTGCGTACGG
+GATCATCACGGCCTGCGACTTTTATGACAGCGATGTGCGGTTTTTACGAAAGGCATTCGG
+TGTTGAAATGGAACGTACCTGGCGGGAGCTGCATGGCGAGTCCTGTTTCCGGTTGCATGA
+ATCCCCTCCTGTCAGACAACAAATTATCGTCTCGCGGAGCTTTGGCCAGCGCCTTAATAC
+ATTCAGCAAGATGCATGAGGCAGTGTCATTCTTTACCGGCCGTGCCGCTGAACAGCTTCG
+AAACGATGGCTCCTGGACTCGCCAAATCACCGTGTTTATCCAGAGCAGCCCGTTTGCCAG
+AGCTGAAGCCCGGTACAGCAGCTGCGGTATTGAGCCGCTTACTGCGACGCAGGACACCCG
+CGACCTGGTCAGTGCGGCAGGCGCCATACTGACCCGAATCTACAAACCCGGCATAGATTA
+TGCGAAGGCGGGCGTGATGCTTTCGTCAATGACCGATGGCACTGAGCAGCTATCCCTGTT
+CGATGAACGTCCCGCCAGGCGAGGCAGTGAAGCACTGATGAAGGTGATGGATCGGTTTAA
+CAAAGAGCATCGAGGCTCTCTGTTTCTGGCTTGCGAAGGGATTCATCAGGATTTCCGGGG
+GAAGCAGGCCATGCTGTCCCCACGGTATACCACTCGCTGGAATGAGTTACTTGTCGTCAA
+AGCCTGACGTTCATGCCGGTGTTACCCGGCATGGCCAGTTTCGGAAGGAAAAGTAACTTT
+AGCCTCCACGGGCCTTCTGGATTGCGTATTTCAGGGTGGCCTCGTCAACAGCGCCCGGGA
+TGAATGACGTCGTTGCAGCGTCGGGTTTTTGCATGTTCATAATAATGAACCCTGGCGTAC
+CGTTAATCCCGAGAGCTTCCCCCAGCTGCATGTTTCCGGAGATAACGTTCTCATAGCGGC
+TTTTCTCCCGATCGCCGAATGAGCTGTTGAACCCGGATTTATTCACAACCATGTCTAAAT
+CATTGAGTGTAAACGCACGCTGGTTGTTGAAGAATACATACGCACTGGTCATCAGATTGT
+TGTGATACTTACGATACGCTTCCGCACCGAATGTCTGATACACATGCAGGCCTGTCGCCG
+CCCCCATTGCGGAAACAGGTTTTGAGCCAGCGAAGATCGGAAATTCTTTAAAGAAGAACT
+TTACATCAGTGCTTTGGCTCAACACAGATTCAACAACCGGCGCTACCTGCATACAGAAAT
+GACACTGGTAGTCGAAAAACTCAATAACAGCGACGGCCGCATTATCAGGTCCGATATTGG
+GTGTCTCTTTGGTCTCGAAGAGTGCCGGTGCGTAGGGGATAATCCGCTCAAGGGAAGCGT
+TAGTATTTTCTTTTTCTAGCGCCTTACCTGCTTCGAGAAGATACTGGGGATTTTTTACCA
+GATAGGAAGCAGCCACTCGTCCTATTTCGTCGTTACCCGGTACATCGGGTTTTAGATATT
+TCGACGTAATATACACAGAGCCAGCCGTCGCAATCACCGCAGAAATTAAAACAGACGCCA
+CGGGTTTTAAATAATTTAATTTAATCATAGCCACCTTTACGCATTTCAACTTGTTAGTTA
+TCAGCCTGCGTTCGATTATACTGGCACGGTAAATCGGAATTATTCATTAAAGAACCCTTT
+TTGGAGGATTTAGAATGTTACGGCAATTTTTCTTACTAACAGCCACAACGTTCTTATGTG
+GATGCGGTTATCATTTTGGAAATGACGTTGATGCGTACGATTTACTGCCTCGCCCGGTAG
+GCAGCAAGAAATTTGAAATTGTTGCTCCGGATGACAGTATTCAGTCGCGAATGTTTGCAG
+CCCGGTTTGCGAGCGGATTAACGGGTAAGGGGTTTAATATTTCCAGCCATCAGCCCGAAT
+ATATTCTCAGATTCAGTTACAGCAAGACCCAGGAGAATCTGCAATACAGTGAACTACCGG
+TGACGGGAATAACCGGATATGTTATCGAGAAGAAAACAACGCGAAAAGATAAGCACGGGC
+AAACTGAGACGGACTATGACTATAAGCCGGTCAGTGGGATCGTAGGAACAGAGACGGTAT
+CACAAAGACATTTCTGGCGTCGTCTTGATGTGGAAGTCTACCCTGCGGGAAAAAATGCAC
+AGCAGGTGCTAAAAGTCAGTATGCAGAGCAATGCGCCGATCCCATCGGACAGCGTGGCGT
+ATTCCGCAATGATTGACGCTTTGACCGGGAATCTGGATGCCCCGCTGCGCTCCGGAAACT
+ACGTCGCCTCGGTCCCCTGGAACTGATGACCGGCACTGTAACGACCAACCACAAATTAAC
+TTTTCTCACCTGCATGCCACGTCTTTACCGGCCTCCTCTGTTGAAATCATAGAGTCGGTA
+CAGATCACCGATGGTCAGCTCATCCACTTTGGTCACGAAGAGATATTCAAACTGAGCTTT
+CTGAATATCTGAGACTGACGCATCGTCCAGCACCGTTTGGTAAAATTTGGCATTGATACA
+TCTTTCCGGATGCATGAACTGGTACCGCCCCTGGAGCACCACCATCAGAAAGATCAATAT
+CAGCAGAACGAGAAGTAACATCTGGTTGGAAAGATCCAGTCCCAGCGACACACCAATGGT
+TGCCATGAAACAGAGAGTCCATCCCACCAGGGCGTAAGGAGCCTTTTGGATCTTTTGTTG
+GTAATAACGGAGGATCACCGGATCATTTAAATACCGCTTATCCGGCAATCCCGTTGCCCG
+GGTGACAATGCTGAGCCAAAGCGACATCTTCTAACCCCCAGCGACGCACTCAGGCCAGAC
+GTTCATAGAACGCAACAATGGGCTGGAAGATGGGTGTTTGTACCAGCTCGGGGCGAATGG
+CTTTCAGCTGCCTTACCGGCGCCAACTCATCCCTCGGCTTAGCGATTTCATTGCTAGGGC
+CTTTCTTGGTACTGTCGGTGTTCACCTTTAACCTGTCATTGCTCAGATACGACTCAAACC
+GTTTCGACATCACGTCGCTGCGGGATGTCGCATCATTGAGTTTTTTTAAAACTGCGTCTT
+TATCTGTCTGAGCAGCAGATACCAGACTCTCACTGCTGGCCACAGTGTCGGCGTCGCAGG
+CCCCGAACTGGCATTTGGCAGCAAAGACGGGTTGAGAACCAACCGCCACCAGCATTAACG
+TTGTCAGTATTGCAGATTTCATAAACACCTCTTGCAGTCGTGGAAAGTCACTTTTGTTCG
+GCACCCATGCGGGTCACCAGATTTTCCGGGCTCATCCAACCGGTGAATAGCTGAGGTTTC
+CCCGACAGCGTTACCATCGTTGGCGTACCCTGAAGCGGAATAGTTGAAGCTACCTGGAAA
+TGCGATTTGATGGTATCGAGGCAGGCCTCGTCAGGCCGTCCTTCCGGAATGGTTGATGTC
+GGGCTCATTGCGGCATCCAGTGCATCATTAGGTTTTGCCGCACACCATATTTTTGCCATA
+TTCCCCGCGACAACGGAGTTGAGACCTGCACGTGGAAAGGCGAGGAATTTGATTGAGATC
+CCGGCGTCGAGATAGGATTGAAGATCTTGATGCAATTTCTGGCAAAAGCCGCATGTAATA
+TCCGTAAACACTGCCAGACGGTATTTTTCATTCGCCGACTTATATTCGATGGATTTTGTT
+TTAGTGGCGAACTCCCTGACACCTTTCAGAATAGCCTGCTCAGTTGTGTTCTCCACATCT
+TTCCCGTTCACATGAAACAAGCTCCCGGTGAAAATGTAATCGCCATCTTTGCTGACGTAG
+CTCACGCCCTCTCTTGAAATGACGGTATAAATATCTTTTACCGGCGATGGTTCAATATGC
+TCGATAGACAAGCCCACTTCTCTTAATTTCTTCAGTGCAGCATCGGGAAGCACGTCAGTG
+TTCGCTGTCTGGGCATTCATACTCAAGGCCGTACAGGATGCCAGTAAAAATAATGATGCC
+TTGATAGTCTTATTCATTTCAGCTCCTTTAATGGAGTGTTAATACTATCATGCGAAAAAA
+TCTGCCTAATTCGCTTAAGGGGAAAAATTCCCCCCTATAGCAAAAAAAATTTTGACGACG
+ATATGGGAGAATATCCAGAACGTAATTCCAGCGGAGATTATCTCGTGTTTATACCACCAG
+TAGACGATGTGAAACCTATTCCCGTTCCTGTTGAGATCTACACGCAGTGCATTACCGATG
+CCTCCCGTTTTTTCGGGATTGATGCGGAGTTGGTCTTTACGCTTTTTGATAATGAGGGCG
+GAAAAGTCGGGACGTTCAGCCGTAATAAAAATGGCACTTATGATATTGGGCCTATGCAGA
+TCAATTCGTCCAACCTGCCAGAAATACGCGACCATTTTCCGTCTGTTACGTGGCGGGTGC
+TGGCCTATGACGCCTGTGCCAGTTTCTGGGTGGGCACCTGGTGGCTTTACCGGAAGATTG
+TTGACCGGAAGGGTAACGTATTTGAAGGGATTGCCGATTACAACAGCAAAACCCCTAAGG
+TCCGGGCGACGTATATCTTCAACTTCATGATCAAATACAATCGCCGGATTCAGCGCCGAA
+ATGGAATGGACGAATTATATCAGTGGACGCAACCTAAGCCCCAGTACAACGGGCATATTG
+TAAAAAATCTTCCTGAATAAAATACGACCCTACTCTCCAATTTTTTATTAGTTGTTTCGT
+AGCCATAAACAATGCGGCTCTTAGAGAATGAAAACGTCCTGAGAAAAAGGTTAACGATGC
+TCCAGTCAATTTATAAATTCCTGTTCAATTTATGCAGTTCACCGCAGCTGCCCAAAAATA
+AAGACGTGGATGGGATATTGTCTCATGAAGAAATAACCGCTGGATTATGGGGTCCTTTGC
+CATCAATCCATGTTGTTCTTTTCCTGGATTTTGATGGTGTAGTCCACAAATGTCAGAATG
+AATCGTTCGAGAGGATGCATTTGATTGAGAGGTTACTTGACGCGAGTCCTTCAATGTTCA
+TCGTTATATCAAGCTCATGGAGAGAGTGCGGCAGTATCACTTACCTAAAGTCACTTTTCC
+GCTCGCCATACAGAGACAGGGTAATTGGAGCAACCCCATCCCTGTATCTCCCCTCAGGAA
+GTATAGGAGTCCGTGCAGCTGAATGTGAGGACTTCGTCACCAGACACAAAGTAAAAGCCT
+TTATCTGCCTTGATGACGATGCGACCCTGTTCCTCCAGAGTACCCGCACCTGTTTCGTAC
+AGATTATTACACCGGGGTTAATGAAAAGGATCTAACGGACCTGATAGCCAGATATAATGT
+GCTGATGACCCGCTTTTATTGAAAAAGTAACTTTTCCACACCCTCCATACAACCAAAGCC
+TCTGATGCGCTATAGCCTAGGCACTAAAGCATCAGTCGATTCAGAAAAGTTACTTTTCTC
+TCAATTTTCATTTTGAACAGAAGAAATGCACATTTTCTTAGTGTGCCGGGTGACCTGTAT
+TTGGTGAGGAAATTTGAATCAGGGTGATGCAAGCAAAAAAAGACCGTACTCAAAAGAGAG
+TACGGCCTTTATCAGCTACTACTTACTTTTACTTCTTATTTTCATTCAGCCAGCTTTTAG
+CTTTCTCAATTCTCGACTGATATGGTTCATTTGTATTATTCAGGTTTGACTTCATAAAGC
+TCACGAATGCATCTGCTTTATCCGGCCCAAAACGTGGATCATCGGTCAGTTGCTGACGAA
+TCGCACGTTCTGAGTTTTGTGATGCAGTCTCATACGCCTTGATCCCATCCCCCCCCATAT
+CCTTATACCTGCTGGTCACCTCGCTAACACCATCTGACATTTGCAGGTGATTTCCAACCT
+TGCCCAATAGCGAGCTCGGCATATTTTGTGGATTCGAAGCATCGTTTGCCAAAGATGAAG
+GGGTGGTCAGGATACCCATACCTGAGAGCATGTCGTTTACAGGTTTAGCTCCGATAACGT
+CAAGTCCTCTGGCAACACTCTCCTGCCCCGATAAAAGCGTACTACCAATAACACCACGTT
+CTGTATTGGACTCAATTTTATTACCAACAAGGAGATCCGTCGTGGTTTGGGTTCGTTGCC
+CAACGAGCCCGCCGCCAGAACCACCTTCCCCAAGATTCGCCCTCACAACTGAGTCAAGAG
+AACCTGAAGCCTTGTTATGCATGTTGAAACCTTCATGGATATTCTGGAGATCGTTCATCC
+CCCAGCGAACGTTATAGTGACTCAGTTCGGAGAGGATATTTTGAGTATCCGCTTTCAGTT
+GTTCTTTCTCAGCGCCGGTTGCCATTGTACTGGCGCCATAGGTAAACACAGCTTGTGCGG
+CCAGTTCCGCACGTTTGTCATCCGGCTTTTTGGTAGGATCATTTGCAATCCTGCCAAAAT
+AATTCGGGAGGTTGCCTGATATACCGCGTATCTGGTTATCTCCGTACATATTATTCAGTT
+TGTCGCTGATAGTACCCATGCCCGAAGTCGCATGCTTACCGCCCGAACCAGCCTGTAACT
+GGTCGAAAGTTTGGTTGGCGTGCTGAACGTCCACCCCAGCCCCCTGAACTCTTCCCACAG
+TTTCATTCGTCACAACAGGGGTATTCTTCTCCAATGACGAGAGCACATTCTGGTTCTCTT
+CGCTATAGGATTTATTTACATTACCTTGATGAATGCCCTGAATATCTTCTTTGCTGATCT
+TGTCCACATTGTACGGAGTTACACCAGACTCAGTTTGTCCACCAACATGCTGGTTAGCAT
+TTTGTTGGTTTTGTACCAGCCCGGCTTTTGCCTGAGCATCCATACTTTGCCCCACGTCAG
+CAACACGATCAGCGCTCATTACGCTGGACGTATTTACATGTTCTGGGGTGCGATCCTGCG
+CCTGTGCAATCGTGTTAATACCCGAGGCATCACCAGTGATTCGGTCAAGCTGATTAGTAA
+TCGGCAGCATCTGTTGAGCGTTACCGCCAAAGTCAGCAACCAGCCCTTTAAGCAGGCTGG
+AAGTTTCACGCAGATCCTGTTTATTGCTCTCAGCCGTTTCACCTCGGGCAGTATCAATCG
+CTATTTTTTGCTCACTAAAGTCACGTGTCGTTGCCACCAGCGCATCTGTACGTTGGAGTT
+GTGAACCCAACTGAGTGCTGGCCTTAAATGTGTCATTATAGGAATTGAACTTCTCCATAA
+AGGCATTCTCATCAAGACCATTTTTCCGTGCAAAATTACGCACATCTTCATCGCTAAAGT
+TTTTATTACGGATAGAATCGGAGAATCTGTCCAGGTTGATAGCCTGTCTTGAGTCGAGTG
+TCATGCCAGTATTGGCGCTGGCGTTCGTTGAAAGTGACGTCGACAAGTTTTCGGCCATTG
+TCTGTGTGGACTGGTTCATTTTTGTTGCAGCTTCTTTGAATGCATTGGTCTGTGCAAACT
+GATCACTGTTTATCTGAGCAGCCGCTTTAGTCATTTGGTCAGTCAGTCCTGAGTTTTCAG
+TCAATTGAGTCGTAATAGCTTTACTCAAATCAGTTAAGAGACTTTCATTCCCAGAATTAC
+TTTTCGTGATCCCTGATCCAACTTGCCCCTCCGCTTTTATTCCTAGGCTATCCATTACTT
+TCTGAGCGAGACCTCCTCCTCCTCCTTTTCCAAGTTTTTCTTCACCACCAAGTCCCAAAC
+TGCCATTGAGCAGAAGATTTGACACCACGCCAGCTAATTGCTGCGAATTAATTCCATGCT
+TCGCCCCTACGCTATTCGCGATGTTTGCACCGGCCTGGTCAGTAAATGATTTCAAGCTTT
+GCAGGTTGGAGGTAAATTGCTGGCCTGATTGCCCCGTTCGGCCAACTTCACTCATCTGGT
+TGAAGGCCTGCTGGAATGTGTTACTTGCTGCGCTCATGGCTGAAGAGGTAAATGCTGCCC
+CTTGCCCCTGGCTTGACGCGATACTTGAACCGGCATTCCACGTACCGAGTCGGAAATTAC
+TGGAGTCCATGGCCCCGCCACCACTGAATCCTTGGCCGGTGCTTGTCAGCGCGGTACGAT
+TCACATCCCCAAACGATGATTTTCCGCTGTTTGGCGCATCCCACACTTTCGGCGTGAGGT
+GGCTGGAGTCCACTGGCGCTGGTGGTGTGACTCCTTTCATCGCGTTCATCATTGGATGAA
+TGGATTGCGTCATCAGGAACAGCGTCAATACAGGGATAAGAGCATAGAGTGCTGATGCTA
+CTGATAAATAAGAGCTGTATGTTTCGGCAAGCCCTGGCAAACCCATCCATGTCACCGCGT
+TACTCTGACTATTCAATGTGCTCCATGTATCAAGATCTGCGGTCGCCACTTTCTTCACGT
+AGGCATTCACCATAACCGCAGTAATAGGCCACATATTTACGAAAAGAATAAGCTGGAGAT
+ATTTTGCAGCAGCGGCCACACCATTTCCCCCGAGAGCCAAAAGCATGAGCAATGCAAATG
+GGGCAACCATGTACGCAAACATCTCAAGAAACGCGATGGCTGCACCGGACAATTGCAGCC
+AGAGCTGCCCCTGAGATGCCATGGTATTCGTACGCTTTAATGATGCCTCAAACAACTGCA
+TATCCGAGGCCAGCCCGAGTGGGGTTTTGTACTTGCTGGCACCATTACGGAGTTCATTCA
+TGATGAACAAACTAAGCGTCGCGTCATAAGCACCAATAGCTTTGCCGTACATGCCATTCG
+CCGACGCCATTACATCCGTGAAGCTCGCTCCTGATGCTGCACCTCCCGCCTCATCTGGAG
+CAAGGATACCGTTTGTTTGCCCAATCAATGCAATCGTCTGCCGAGCCTCTGGGGTGCTCG
+TTACCTGTTTAACGGTCGACCAGACCTCTTCACAAGTAGCAGACTTTGAGCTATTCACAC
+CGACAATGTTGGCAGAGGCGTTCTTCAGCGAACCTTTCATCGCCTGATTAATGCGTTCCA
+TGCTATCCACGATATTTGCAGAGAAAATATCGTTAAAAATGGTTTCTTTCCCAGCAATTT
+TTGCGCTTGAGTTTTGGGTTCCCTTGAGACAGTTATAGGCCAGTGATTGTACTGTCGCGC
+ACACATTCATCGCACCTAACCCGCTGGCTGGTTCGGGAAACGCAGAACAATAGCCCTGGC
+TGTCACCACCCCATTGTAAGAATTTAACGAAACGAATCATCGGACCAAGAGTAATGTCAT
+CATCAAGCGTCGTTGCGGCAAAGTCGATCGGCGCCAGTGGATCAAATGCCGTTTTGTAGT
+CTTTGAGTAAGCCCTGGCTAAGGTTCGTGGTGACAGTTCCCATCGCCGCAATAAAAATAG
+GAATGCCATCGACATTTCTCACTTCACCAGACTTAACTGATTCAATCGTCACATCCACAC
+GAACAATTGCCATCGAAAATAGAATCAGCCCAAGAATCCATGAAAATATCGGCACTTCTG
+CTTTTGTCGGGTTCAACAGCCAAAGCCACGTTTTATAAAACAGGCTGGCTCCAGCCAGTA
+CCGCTGCCGTCGTTAGAAATGCTTTTACACCGGTGTATTGTGAGAAAATCAGGGCAATCC
+CGTTCAGGGCGGACCACACAAATTCAATATCGCCAACTGTATAGATGTTGTAATCCATAT
+CAGACCTCAGTTACCTGTGCCACGAAGACTTTCCATGAACGCTTTTCTCTTTAATCGGCG
+ATCATCCCATGCAGAAATGACGTCAGAGCTGTTGCCCACCTGGCTACGGGTTAGCTCATA
+GGCAGCTTTTACCTGATTGGTCAGGTTTTCAGATAACCTAGTCAGGTCCTGCCGCCGCCC
+GGAAAGAGATTCGCTGGGTATATTCATAGCGCTGATCTTTGCTTCAACTTGCCGAAGCAT
+GTTAATAACAAGGCTGGTGGCCGCTATCGCACTGATATCCTGGATATAGGCGTAGCCTTC
+AGGGACATCAAACGTCTGAAGTGAATCAAGAATAGTTGGGATGCCAATATAAGAAATAAT
+GCGTAATTCATCATCAGAGATCCTGACATCACTAATTGCCTTTGTCTGAACCTGAATAAG
+GAGGTCCGAGATTGTATCCTTCAAACCTTTGAAACCACCATCCGTCACTTCAGACATAAC
+CAGGCATTGCGACTTTCTAGCTGAAGCTGGATCGGGGGCAGGCGAACATTTGAGCATTTT
+TATGGAACCACCAGCCGGTGGGCCCATGATGAAATCCGATACCGTCATCGTCGACGGGCG
+AACTTCCATCCCCGCTTTTTCACCTTTAGCGTCCCAGTTGATAATTACAGTACCGACAAG
+CGACATCAGCTGCTCAGCAAGTCTGTAGCCAGATAGCTCAGTCACGCCACCGATATTCAT
+TGACCCTTTATCGATGTCCATAAATGACATATAGAAAAGGTTTCCACTGAATTTTTCAGC
+AAACTCTTCAGGGTCTTTTGCTTTTACCTGGGAAGTCACGGTTTCCGGCGACTTTGTCAT
+TGATGAACCAAAATCAGGCAACAGTCCATTAAGAGTGCCAAGCATTGAAGCAGGGCCGGA
+ACTGACAGCATTCGCAAACTGGCTAGGTGGACCAACATTTTCAGTAAGAAACGAATAAGT
+AGCGTTGCATGAATCTTTGGCAAATTTATTCAGCGCCTGCAATTTATTCTGGATATCGTT
+AATAGTCGCAGCACAGTCAGCACAGATTGCCGATACCGCGACATTGAATGCATAAATTGC
+AGCCCCCTGTGCAATACCGCGAGCAACCTGAACCAGCTGATCTCCGTTAATCATACTGAA
+GGAACCAAGGAAAACATCGATTCCGTTGCAGCCTACGGAAGCTTTGGGAAAAGACATTGA
+CACTAAATTGGTATTCACGTTTGTCGTGCGGTAGGAAAATGAGCCGCCAACCACTCCGGT
+ACGGGTGGCCGTTTCAAAACTAGCTGGGCTCGTAGTCGTCATCATGCCATTGAAAATATT
+ACGCATGGCGTTATCGGCAACGGCATTTGGCGCAATCATCGCCGTGCAAACGGCTAACGA
+TAAAAGTAACTTTTTTGCACAAACATGGAAATCAGCGCGCATATGCACCTCCTAAACTTC
+CACCCACATTCAGATAGTTCACTGGGTCCGCCGTTGGCATATCGTACCCTTCCAGTTTCT
+TATCCATTATTCGTTGCAATAAGAACGGGTCAGAGTCCATTTCTGATTTATTCACAGTAA
+TTACGCCATCCTCGCCAATGGTATATTGGCGCTTAATATCTAAAGTGGACTGGAAAGAGG
+CATCATCAATCAGCTTCATGCCTTTTGCAGCCAGAATAATAGTATTCTTGAGCTCCTCAG
+CAGTGATCATGCCTTCGCTTATTCGTTGCGCTGATGACCCATCTTTTGAGACAAGGAAAA
+TAGTTGGAACTTCACGGATTTTAAATTGATCAATAATCTGCGCATTAGGTACAGAGAAAT
+CCTGGAACAACCCATTCTGTAGTGGTCTGCCGTCCATGCTGACAGGAAGAATGTCGACAG
+AATAGTAATTCTCCATAAACTGGAGTATTTGACTTTCTTCGTGGCAGAACTGACAAGTAC
+TCTGGAAAAAGAAAAACAGCCCGGATTTAGTGAAAATATCTTTCATAACCGACTGCTGAT
+TTTTCTCGACCACCGTACGATGTGCATCGAGCGCTACCTTTTCAACCGGTTGCCTGCGTT
+TTTCAGACATCATTGGATTTTTAAGGAAATAATCTTTCGATTTATCCGAAAACCGCGTAC
+CGATATCCAGCATTAAACGTTGTGCTGTATAAAATCTCGATAAATTTTCAGGGGTCGGAT
+TATCCATAGCCTTAGTCAAAAGCTGAGGCATATTGTCCTTTAGCCACTTTGAATTAAGCT
+CAATCTTTTCTTCTTGTTCTGGCTGGGTCGAAGATGCAACAGGAGGCTTGGTCTCTGTAA
+TTTCTTCCTCAGTTTTCCTTGTCGGGTCGTCATACCAGAAAAAGCCTTTCTTGAAGGCCT
+GTCCTGATACAAAGGGAGTGTCTTTGATAAGGGCCTGCTCTTCATTTGCATGGACCCCAG
+TAATAAACAAAGACAGCAGCACTAACATCTTTGAAGGTATTAACGTTAATCGAGTCATTT
+ACCGATCTCCTCATGGAATAGAGGTATGATGGCATAGAAAAAAACTTCATGAGCTCGGTA
+ACGGGGTAGATTTCAAACGTTAAAAAGTCATAAATGTGACTACTAGAAAGACCCTGAAAG
+GGCTGTTGAACTTCTGTGTGCAGGGAAGGTATGGGAGCTAAAAAGGTGGGAAAATAGTTA
+TCAGCATAGTTAATTGAATCTGAATTCAATTCCAGACGATACTTTTAAAAATTTCTAGAT
+GAGCGCCGCATTCGATTGATTTTCGAATCGGGAATTTTCGATAAATTAAAAAAACTGAGG
+ATATATTATTTGGCAAGAAAACGGTTTAATGTGTTTATATCATATGCAGCATTGACCTAA
+AAAATGCCATTTCATGTTAGTCATACTTATGCAGAGAAAAGTTAGGCAGAATTGACTGGG
+TAATGAGCAACTACGGTTGAAAATAATATTAGCATAATCGTTTCAGTTACGTTAGGCCGG
+AAGCTGTCTGAAGAAAACAGCAACATGTAGTCTATTTTGCAGTGAAGTAAGTAAAGAAAT
+TTTGTAGTTAACGAAGAAACATCCCTGGGAATTTTGACCTCTACTTAAATCACTCACATA
+AAATAACAGCTAATCTAACTCTTCCTGGGAATACCGTGCTATTGCCGATGACGTGGACGA
+CAATCTGCATCGAGGACAATGAGTATCATTGGTATACGGGACAATATAAGGGCGCTTACA
+TTTCGCACAAGTTTCAAGCTCCTCGATTTCTTTCATTGACGTTAGAATCTCAATGATTTT
+ATTTACCTCAGGAGCGCAGACGAAATATCCAAGGTTATGCAGCACACTCATGATGCGGTT
+GAAGTCAATATTTCGAAAACTGGATTCCGGGTGAATAGGATCAAAACCGAAATAGTTTAC
+AGCGACATCAATAACCGCAGAAAAAGCCCTGCGGTTATCCGTGCGGCGACTCCACCCACG
+AATCCCTTTTTTAAAGTTTTGTTGAGGTTCAGACCTGAAGTCTATATTTTCGGCAACATG
+ATTTCCATAGAGTATCCTTATGGAGTTTTTATTGGCACCAAGAGACATCGTTTTTGTAGC
+GCTCAATAACATGTTAGCTTTAGTTTGATCGACTTTAGCCATATTCAATAATCCTTCAAG
+AGCACTTTATTTGCCAAAGTATTGAACACATCCTGACGGTGGCATGTAAACATAGTGTCG
+TAACGCAGTAATTCCATTAAATCGTCACTAATTTTACCCAAACGAATATCGGCAGATATT
+TCGTATGCCCAAGCAAATACCTTTGATTTTAGCGTAGCACTGTCATCCCCCAGACCTGGC
+GTAAAGGGAATTGTTCGTGGAAAGAGAACGACATCATTAATTAATTTAAGTGATGACATC
+CCGACATCTTTTATTGCTTCAACGGTGGCAGGTTTTAATCCAAAAAAGATACTAACAAAC
+TCAGGTGCAAGCATTGACATAAAGAAAACTTGCATTAAGTAATCATTTTGAATGTCTACA
+CACTTAGAACGTAGTTGCTGAATTTTTCTCGGATTATAAAATTCCTCCTGCCCGCTGAGC
+AAAGTTACTTTTTCACCTTCATTGTAAATGCCGAAGTCAGTATCTTCACTGTCATATTCT
+CGAATGACGTTAGTGTCGCCATCAACTACAGCTACAAAGAATTTGTCCCAAGAGATCTCT
+TTACTTAAAGAACGAGGAACGAGGAAGCTTCCTGGCCGAGTTTCAACTTCAAATGCATTA
+TCAATCATAGCTCCAAATCCATTACCAAATAGTCGGCGTTGGAGGAGTGGTGATCCAGTT
+TGATACTTAGAAGATCCATGAAGAGGCAATAACATTAAGAAGGCACGGTAACTACGAATA
+ATCGAAATCTCGGTACGTAATAGTTTACCGAGTAAATTACGCGTGATGTTATCTGATTCT
+GACATGTGCGGATTGTCCTTGCGCCAATACAATTGTACGAATCTTCTACATGAAATTAAG
+GTCTGGATTCTGAAGGATGAAAAGTAACTTTTGGAATTTTAATACTGCCGCTTTGAACCT
+TAAAACTAACCTTTCAGCCATTACCCTTACTTGTAACACTTTTTAACCAAACTAACCAGA
+ATTTTATCAAAAAACCCTGACCTTGCTAACGAAATGTGAACCGTATAAAAAAACCTCAAA
+GCCTGAGTCGTTATCGGCATTAAGTAGCAATAACCTTAGGGAAAAATGCGCGTAAGCATG
+ATTATTTTTTCGATTGTTTAACATGACTACTACATAGGGTCACTTTTTGCTGAAAAGTGG
+CCCTATGCACCATCGACATAGGGTCACTTCTTGATGAAAAGTGACCCTATGTAATCACGA
+CATAGGGTCACTTTTTTTAAAAGTGGCACTATGCGTCAAAATCATAGGGTCACTTTCCTT
+TAAAAAGTGGCACTAGATAGATGTATAACTTAGTAGGTAAAACAGTTCTTTTCAGATCAC
+GATCTCAGCAATAAGCATTGCTGGAAAAGTTACTTTTCTTCCACGATAAAATGCGGACCT
+TTTGGCCGTTCCCGTTTACATCTGATGTCACTCACTCTCAGTGCTTCCTCCATTCTTAAA
+TTTGCCATGCAAAATTCCCTAAAAAATTCACAGAAAAAAGTCCCGTTCGTGAAAAAAAAT
+TGAAAATCACTTCGGTATAGTGATTTCACATCAGGAGGCCCCATGTCTAAATCGAAGCTA
+TTAAAGTCATTGGAGATTTCACGTACTTTATTGCGCTCACAAATCGATGTTCTTCGAGAA
+GAGGCTGAAGAACTGATCACCAATTATTGGATCGAGTGGAAAGAACGGAATCACATTGAG
+AGGAATTTACCCAGGGATAGCAAAACTCTAAAGAAGGAGTATCTGGGTTCATATGCACCA
+AAAGTTGAGCTAATTGGTAATGCCAGGAAAGTCACCATTACCTGGCATCAGTTTAGCCCG
+TATAAAAACAGGCCACCTAGTCATATGTCGAAACGGATTTCACCGATGAAAAGTGGAAAA
+TATACGAAAAGCTGCTTTGTTAATCATGCCAGCTGGGAATATGAAATGATTGAAAAAACG
+GAGGGATTACTGGAACCCTACAGAGAATTACTTGAGTTCTACCATGCTGCATATATCGAA
+CTGGGACGAAAAGTCCGTCAATACTCAAAATCAGAGGTGGCACAATGACCGATGTAACAA
+TGAATGAAAGCGAGCATAAGGTACCTGACGTAAATACCCGCTCCCCTCATGCGTCCGATA
+ATAGCCGTAGGGTCGTGCAAAGTAAAAATGAACATTACGGCATGGCTACAGTAACTATTA
+CCCCAGGCACGCCAGACTTTAACCGATTTCTCACGGCACGTAATCGTTCCGTAATAAGAG
+GGTTTGATGATGTCAGTATTGCCATTTCATCCTTATTCAGAACGGTCAATGCAGTTAAGC
+ACCCCGAACTAGTGCAGGCAATTCAAGACTGGTTCAATGAATTGCACGAAGAAAATAATC
+TAATGAAGAACAATCTGGAGCGCCACATTGCCACCATCCATATCGATGAAAGCGATCCGT
+TCTTCTCATCAACTGAGTTTTCACCGTTCAGATTTGAACCTGTACAGTTAAACTTCAACA
+ATCAAAACACGATGCGCTTTTATAAGCACATCTTTGAAATGAACAACCTTCTGACACAGA
+TGCACAAATTCAACTCTCTGGGTCAATTACCGGTTAGCGATTACAACGTTATGGCCCACA
+ATATTATCCGGAGCCTTAATATGTATATCGAACGGGTCAAGAAAACACTTAACGTTTCCC
+GCCGCGCAAAAGGTGCTTACAGTCCTGATGAGTTCATCGAAAAGGTAAAGCAGTATAAAA
+GCGTGCAAGCATATATTGCTGCGGAACTGTCTGGTAAACGCCGGTAAGGATTATTTGATG
+AATTTCAGGGCACTCTTCTTAAGTATGCAACGAGTTTTTGGCATTTTCTCCAGAAGGGAG
+AATGATGTATCTGAGTTAATGATGAAGGATGCAGCGAACTTCTCGCCATTTGCTCAGATT
+ATAGGAGAGCAGAAATACACTGTGCCGGACCACCCGAATCCTGAAGTCCTGAAATTCATT
+GAATACCCAACCAGGCCTGCGGGGATACAGACATTTAATGAGCAGTCTATTCTTTCGTTG
+TACAGAGACAAGCTGCACTCTATTTCTATGATGCTGGCAATAAGTGATGGAGACATTCGG
+GAGGATGCCTATACCTTCACTAATCTGGTGTTAAAACCATTGATTGAATACATCCGCTGG
+ATTCATTTACTTCCTGCGTCAGAGAATCATCACCATAATGGTATTGGAGGATTGTTGTCT
+CACAGCCTGGAAGTGGCGATGATCTCTTTAAAAAATGCCAATCACTCTGAATTACGTCCG
+ATTGGCTATCAGGATGAAGAAGTGGTTCGCCGAAAAGTTTATCTGTATGCCGCTTTTATC
+TGCGGCCTAGTACATGATGCAGGGAAGGTATATGACCTTGATATAGTTAGTCTCAACTTG
+AGTGAAACATTAACATGGGCGCCAAGCTCGCAAAGCCTTCTTGACTGGGCACGAGAAAAC
+AATGTTGTTGAATATGAAATACATTGGCGAAAACGTATTCATAACCAACATAATATATGG
+TCCAGCGTATTTCTTGAGAGGATTTTAGATCCTGTCTGTATGTCATTCCTTGACCGAGTC
+AAAAAGGAGCGTGTCTATGCAAAAATGGTTACGGCACTTAATGTCTATAACGACGGCAAT
+GACTTTTTATCAAAATGTGTAAGAACTTCTGATTATTACTCTACAGGTACTGATCTTAAT
+GTGTTGAGGGACCCGATAATGGGTCTTCGTTCGAATGATGCTGCGGCTAGGGCAATAGGT
+ACCATTAAGCATAACTTTACTAGCATTAATATTAATAACTATAAAACTAAACCCATGCAC
+ATCATTATTGTAAACGGTGAAGTTTACCTCAATGAAAACGCCTTTCTCGACTTTGTACTG
+AGTGATTTTGCAGCCCATAAGTTCAACTTCCCGCAGGGAGATGCAGGCAAAACAGTACTT
+GTCGAATCTCTGGTGCAACGGGGTTATGTTGAACCTTACGACGATGAACGTGTGGTTCAT
+TACTTTATTCCCGGGACATATTCGGAAAATGAAATTGCAAGCATCTTCCGGAACGGTATT
+GGTAAGCTGGAATTTTATAACCTCTTAAAACTGCGTTGGATCGGGTTAATTTTTGATTCA
+TATAAAATCCCGGATTCAGTTCCTGGTCTGTTCAGCGTTAATGCGAATAAAGATTTCATC
+TATATTGATGAGCAGAAAACTGTAACGGAATACAGAAGGCCGGTCCCGGGTCGTGAGTCT
+GTTACCAGAGTAACGGACACTGTCAATGACGCCATTGAGAATACCCCACAGTATGGACTT
+CAGCTCGTAAACGGCCCTGATGCCGACAGTAACAATATTATTAGCAGTGAAAATACTGAA
+TCCATTACGGATAGTTTGGAAGAGTCTGGCGCGGATATCTCAAACGAGATTTTTGAAACG
+CAAGTTGTTACGGCAATTGATACTGCCGAAACGGTAAACGCGGATGAGCCAGAACAGGTA
+GAAGAGCATGACGACCGGAGCCAGATTCATCTGGTTGAACAACTTCATGAAATGCTGTTG
+AGCGCCCCACTGCCCCATCATGCCGTCATTAATATTGATTCCGTACCTTACCTGGATCTC
+GATGCTGCGATTGCGTTAATCCCGGGTATAGATGAGGCGGCATTTTGTAATGGGCCATTT
+TTCCAGTTGACATACCGTGATGGGTCTCTAGATGGTATGTGGATAGTCCGTGATGTAAAC
+AATCTACGCCTGATACAGCTGGGGGATAACTGCGCCGGTATGCAAGTAAGCACATCGGAA
+CCACGAAACACGTCATCGCTGAAATCACTATTTGATACGTCAATGTACCAACCGTTGGAT
+ATCCCTGAAGCTCCATCAGTAAACGAAGCTGCTTCGCCTCCACAAACACCGCTTGAACTC
+CCCCAACCACGACTGAATGCACCTGTGGCTGAAGAGGCCAGCTCGGTAGCTGAACAGACT
+AACGCCCACTCCGAACCGGATTCCGTCATCGCTACTGAGTATGAGCAATATGGTCATTTG
+CTGGAAGAGACCCTTGATAGCGATGGTGAGGCATATTCTGATTTAATTGCCTCTGACAGT
+ACTGAGGCAGAATACCCCGCCACTGATCCGCAGAGCAGCGATTTTGCCCAATTACCTCGT
+GAAACGGCCCTGTCCGTTGCGCCCGGTGATTTGGATTACTCAGAGGGTGCCATTAAGCCA
+CCAGCACCCGATGCAACCGGAAAAGAAACAATACTAACAAGTCCTGAACCAGCAGAGGAT
+GTCCGAGAAACGGTAGCCGCCGTGGAGAAAGCGAGTCATCTTTCTCCGGCATTGGCTCGA
+CTCTTTGCTGTAAGCACCCATGCTGAGAAGAAGCATGAAAAAACGCAGGAACCCTCCCCT
+GTTAAAGAGGTTAAAAATCCAACCTCCTCTACCACAGTTAAGGCTCCTATTTCCATTGAA
+CCACCAGGCGCTGAAGAGAAAGAGGCGGTGGAAGAATTCACCCTGTTAAACGACGGTGAA
+GTCACAGAACTCGAATATGTCGAGATTGCCACCATGCTCCACCAAATTCTGACGAAGTTA
+TCTGGGTCGTTCAAAAGAAAGAGGAAAAACCGGTTCATGGTTTTGACCCAGAACACCTTT
+TATCTGACGCAGTCATGTATTGAAAAGTACGGAACGCAGCTAAATGCGCCTGAGCTTTTT
+AACCAACTTCCTCAGTACCAGGTCACATCCGGTGCCGTAGTCAATACAAAATGCATTGCA
+TTCAACATACCAACTCTGGTCGCCGCATCAGACCGGGCAAAGGTCGATATTGAGTTAATT
+ATTAACAAGCTAAAAGAGGTCGGGAATCTGTAATGACAAAATCAAAAAGAACCAACCTGC
+ACGCTCAGGAAAACTTTTACAGGCCGATACTGGAGTACAGAAGTGCCTCAGTGCTTTTAA
+TTTGCGCCGTCATAATGCTGGTTATGGGCTTTCGTTCAGATGGGGTGAATATTGCCCCTA
+TCATTCTTTATACCGCTGTTTTCCTGCTTTTGGTTTGTTTGTACCGTTGTAAAACGGCAC
+ACCCCTATTTGATGGCACACTGGCGCGTATTTCAGCGCCAGATAATGTTTATTAGCCTCA
+AGTCGCTCAGGACGATCAATAAAAGTAACTTTTTCTCGAACGAGCGAAAGTATCGCCAGC
+TGGTACAAGAGTATAAAAAAAATAACCGACCAGTACCGGATAGAAAAACCTACTTTTGTA
+ACGGCTTTGAATGGGGTCCCGAGCATGCAGACCGCGCATATCAAATTGCTAATCTCTCAA
+GTGACAAAAGAGAGATAGCCCTGCCATTTGTTCTAAGCCCTATAGCGCGACATTTTGAAA
+CAATGGCCAGATCCATGGGGGGCAATAACGCCATCTTTGCTGTTGACCGGCGGGCACCCA
+TTTTTGTGACCGAAGATAACTGGTTCGGACATACCCTCATTACCGGAAACGTCGGTACCG
+GTAAAACGGTACTTCAGCGCTTACTGAGCATCAGCATGCTGCATTTGGGCCATGTCATTG
+TGGTTATTGACCCGAAGAATGACGCTGAGTGGCGACAGTCACTGATGGATGAAGCGTCAG
+AACTGGGGTTGCCATTTTATAAATTTCACCCAGCCCAGCCGTCTTCATCGGTGTGTATTG
+ATGTATGCAATGCTTACACAAATGTTTCGGACCTCACCTCACGACTTCTTAGTCTGGTTT
+CGGTTCCCGGGGAAGTTAACCCATTCGTGCAATATGCCGAAGCTCTCATCTCAACGGTGA
+TCACTGGTCTGTCTTACACGGATAAAAAACCGTCGATATATCTCATCCACAAAAACATGA
+AAAGCCATATGTCTGTTGTGAACCTAACGATAAAAGTAATGGAATGCTGCTTTGCACGAC
+ACTACGGGCCTGATGTCTGGATGGAAAAGGTGAAATACGCTTCGAATGACACTCTTCAGG
+TTCGATTTAAGCGCCTGACAGAATGGTTTAATGCCCATTTTCTTAATTATGAAGGCGCCG
+AGCCCATTGAATGGATTGATACCGTCGGTCGGTTAGTGGATTACTCCATGTCTGATCCTG
+AACACATGTCTAAAATGACGGCGGGTATTATGCCGCTATTTAGTCGACTGACTGAACAAC
+CACTGAATGAATTGCTTTCGCCGTCTCCTAATACACTCACTTCGCGTGAAATAGTCACTT
+CAGATGGGATGTTCAGTACCGGCGGAGTTCTGTATATCTCGCTCGATGGCCTTTCCAACC
+CGGAATCAGCCCGGGCCATTTCGCAGTTGATAATGTCAGATCTTACGTCTTGTGCGGGTA
+GTCGTTATAACGCTGACGATGGTGATATGTCTTCCCATTCAAGAATCAGTATTTTCGTCG
+ACGAAGCACACTCTGCCATAAACAATTCAATGATAAACTTACTCGCACAGGGTCGTGCCG
+CTCAAATTGCATTATTTATCTGCACGCAAACTATTTCCGACTTTATTGCAGCAGCGAACG
+CTGAGACGGCAAACCGTATTACAGGTCTATGTAACAACTACATTAGCCTGCGGGTAAACG
+ACACACCAACACAAACGCTGGTCGTAGAAAACTTTGGTAAGAGTCCAATTAGTACAAATA
+TGGTCACGTATACGACAGGATCTGAAACCACTTTGCCGCATAATAACTTCTCTGGGTCAA
+TATCAGAAAGAAAGCAAACAACGCTGGAAGAAAGTATTCCAAAAGAGCTTTTGGGCCAGG
+TCCCCAAATTCCATATTGTGGCCAGACTTCAGGATGGTCGTAAAGTTGTCGGGCAGATCC
+CGATTGCCGTAAGTGAAAAAGCGATGAAACCCAATACGACGTTACTGGAGATGTTCCTGA
+AACCCGCCGGAAAAGTAACTTTGCGCCAGAATGTGGGTTTAAGCTATTTAAATAAATATC
+TAAGGAAATTGCATTGATGGATGAGCAAATTACTCTGACACAAAATCAAATTTTCAGTGC
+ATCTCTGAAAGTAAGTAAAAGCCGCTCGCTCGTTAAGCGGCGTATGCAATCATTAGGGTT
+GAAGTTTACCGAATCGCAGGATGTCCGTAACCGACTGGCGGGGATAGAAAAAGGTGCTTT
+GAAATGTGTGGGGCAATTTTGCCATGACAACGATGCTGAGTCTTTATCAGCGATGGCGAT
+CATCCTTTCCGAGCTTTTTCTGCTGCAAGGCGAACTGTCCACCAGCAATGAATACGGTGA
+CCATGAAACGAGTTACTGGACCGTAGCACAAGGCCCATGTGATGAATGGGTCCAGTCTCT
+GCTGGCGAGCGAAAATGGTCGACGTACATTTAATAGCTTTCGTATAACTTTCGACAACTC
+CGAAGAGCGCCGCAGCCTCGTCGAAAAAAATGCCAAAATGCTGGGGAGTTATTTATTGCC
+TTATTTTGTCAATTTTACAAATGCTGCATCTGCGTTTATTACGCTGCCTAATAGCATCAC
+GTTTAAACAGGTGCAACGCAACAAGCCGCTCATTCACCCTGAAACCACATTAAGTCACAT
+TCTCACAATAGAAGATTCGGCGTTTCTCTCTCGGATCAAATTTAAACTTATCTCGGCAAT
+TGACCGTCTGCCCGACCCGTCCGGTCAGTATGCCAACATGTTCAATCACATCATGGATCG
+GGCGCTGCTGACGCACCTCAACCGGGAGCAAATTGATAGCCCTTGTGTGTGCAAAAAGGT
+CATTTCCACCTATGCAGACACTATGCTGACGCTCCCGATATTTAATACGACGATTACCGG
+GAAATACCGGCACTGGACCCCGTGGGGGATTAATTTTGTCGAGTTTAGTCGTCAGGCTGC
+AAAGGAAAAATCTTGTGTCTATGTTCCTGAACCCGGCCAAATTCACTGGAAAAGTCCGGA
+GCATAAGGAACTGGCAGAGTACAGCCTGATCAACCAGATAATCCCGCAGCAATACCACTG
+GTTGCTGGGTGTGCCGACAATCTGGCGCAGTCACTATCGTGACCATAGCAAACGATTAGA
+CTTATTCAAGGAGTGGAGGGACGCAAATGGCTGCGGATAATTCTGCTCGTGCAATATTCA
+TCAGGGGACTGCTTTTACTAGGGATGATGCTTTATCTTATTTATAGTCTGGGGTTCCAGA
+ACACCGACGAGCTAAAGCAACAAATCACTCAGGAGGTGAACGCCAGTCGTAGCCTTATTT
+CTAATGACCGGTGGTTATCTGTTATTGCAAATAGTGAGGCTACTTTATCCACCCTGATTA
+ATGACTATAAGCTGATCGACTATCTGAATACGATACTGATCCCGGACACATCGACACCTG
+CACGTGGAATGAATTACGTTGCCGAAAAGATGACATCAGTAAACTACACTGTGGCAAAAA
+ATCTACCCCTGCTGATTTATCAGTCCATTTTCCGCTGGAATCTGATACTCGGTTGGCTGA
+TTTTGTTTTCACCATACCTAATTGCTATGCTCGCTGATGGCATGTATCAGTGGAAATTAA
+AACGTTACGTTTTCGGTAATGTAACTGTTCAGTTTTACAGAATCTGGTTCAGGGCCTTCT
+GGATAATTGGTGCATTAACCTTTATATACCTATCAATGCCTAATATGTCACTTTTTAACA
+ATATCGCTCAACTGTTCCCCCCTGTCGCATTGTTGATATTGGGAATTGCACTCAACCGTT
+TGTGGTCTAACTTTCAAAAACTTATGTAATAAGGTGGTCAGATGTTTAAACGTAATAATA
+AGAAGTCACCTGCCAATATCAAAGAATCGCTTGATGAGAACGCTGACCGTTTCTATAAAA
+TGTTCCGAATCCATACCACGTCAAAAGTGGTTATTTCACTGCTGGCATTAGCCGCCGCAG
+GGGTTTCGGCCTTTAATATTTACGATAAGTATCAGGAATCCGAAGGACGAATGGATCATA
+TCGCCGTCGTGCGTATCTCGGGAGAAATGGGTACCGGTTCTGAGGTCGGCGATGGATCTG
+TGATAGCCACAGCACTGGCGAAAGCGTACAACAACCCACATGCCAAAGCCGTCATTATTG
+AAGCTGAGTCAGGTGGCGGCGGTCCTTCAGACGCGATTATTATTTACCGCCAGATTAATG
+CACTACGAAGCCACCAGCAGAAGATTGAACGGGTTTCACATGCCGAATCCACAAGCAAGC
+CCCGTAACACGAGTGATCACAGTGCTTCACGTTCGCAGGCCGATAGCAATGCCGAACTGT
+CGAAACGTAATACGCTGGACGTTCTCTCCGCCGGGAGTGGGCATTTCATTTCTGATATGG
+AAAACAGCTACAAGCCTATTATCGTCAGCGTCAAAGGAATTTGTGCGTCAGCATGCTACT
+ACGCTGTGTCCCCTGCTGACGCCATTTATGCAGACAGTAGCGCTCTGACCGGTTCGATCG
+GTGTCCGAATGGATCACTGGAACCTGTCTCGCGTTATGGATACTGTCGGCGTTAAAAATG
+AGCCACTCACCGCCGGGGAGTTTAAAGATGCACTCGACCCCTATCATCCACTTTCTGATG
+CCACCCGCGATTTTATGCAGAAGCAAATCCTGGATGCAATGCACGAACAATTCATTGCGG
+ACGTTGAGCAAGGCAGGGGTAAGAAATTATTAAGCCGTCCGGAGGCTGATGCTGTCGCAC
+TGTATTCCGGCAGGGTATGGACAACGCAGCAGGCGATCCGGTACGGACTCATCGACGGTG
+ACCTGACACCTGTCGAAGTCCGTTCACGCCTGTCCCAAATGTACTCAACCACTATCTTCA
+AGACGTACAACGAGCCACAACGGTCGCTTCGCTCCGCGCTCGGGATGTTAATGAGTCTGT
+CGACTAACGTCGAAACGCTGGCAGGAACAACCTCTCGGATACTTGATTCTGTTCAGGCCA
+CCAGCTATCCGACGGTGAGATAAGATGGATGCAATTTTGATGGTGTGGCGAGTGATAGGA
+ATCAGCATTATTGTCCTAGTACTCATTGTGCTTTACTGCCTGATGGGATTTGTATCGTCG
+GCCATTGCTGAACGCAGGACAGCCAGACAGATTGAAATATACCTGCCTGATGATGCAGAA
+GGGCTTCTGAGCGACTTAACGCTGCCGGTCAATGCCACCGGCACCACGCAGATTGATCAC
+GTTCTTATCGCCTCTCATGGACTCTACGTCATCGAGCAGAAGAACTATGCAGGAAAGCTC
+TATGGGAAGCTGGAGGAGAGCCACTGGCGAAAATGGAAATCGTCAGGGACACTAAAGTTA
+CAAAACCCGTTCAGGCAGAACTACGGGCACATAAGGGCCATTCAGTCCACGTTACGCGCC
+AGCGAGCTGGAGTGTATCAATGTTGTCATCATTAACGGCCCCTGCAAGTTTGAAGGTGAG
+AAGCCAGACTGGCTTTGCATGGGTATGGAGGAGTTCGTTCGGAAAGTCACTGAGAGGCGC
+CAGTTAAATGTATTCAAGCCTGAAGCAGTAAGTTTTATCCGTGGAGAGCTGAAGCTAAAG
+AGAAAGCCTCCGGGCCTTTATACTGATTTGAACCATATCCACAACGTTACCACTCGATAC
+AAAACAACCATGCGGCTGGAGCAGCGTATTACCTATAACCTTTTGCGCTTTTCTCGGCTT
+ATACTGAGTAAAATGTTCAGATCGGCAAAGTAAAAAAAACCCTGCAAATGCGGGGTTTTT
+TATGGATTCAACTCCGGAATATTTTGCCACGCTTCCTGCATAATTCGCATGGCCTCCCCA
+ATCGATAGAGACGGCCATAAAGCGGCGTCAGTCATTTTTACGCCAACCGGCTCACATTCG
+ATAGGGACAAGAATTAAAACAACGCGAGTCCCTTTTATCTTATACCCGAGATTGACTACC
+GGCTGTCTGTAGGTAGCCAGAACTCCTGCACCGTACTCCGCAGGTTTGCTGGCCCAGCTC
+CGCACCAGAGCGTAAGCCTGCGGCATATAGCGATTATCCAGATCTCCCTGCGGCCGACGA
+AAAGGCACGATGTCATCGGAACGGTAAGTAGTGGTGGTTACGTTTGCCGTTGTCATTAAT
+CAACTCCTCGCATCCGACTTTATTGAATCTGAAAGTAAAGGGTTTCACGATCAGTTCCCA
+ATCGTGGACACTGATAGTGTGGCTAGAATTTTTGCTCCATTTGTTGAGCTTCAAAATCTC
+TTGCAGCCTTCAAGAGTGACCCGCCACTGTAGTACTCCAGTTCAGAAATATCATCCTCTT
+TATTCAACCATTGTGGGGCGGCTTCATTGCCGGTCTTACCTGTACCCACATCGCTATTAT
+GGCTTCGAGGCATCACTACGGCTTCCACTTCTTGATAAACGCCATTGCGTTTCACTAGGA
+TATTAACTGTTTTCGGTTTGCTGTACTTTTCGCGGACTTTATTAACCAGATATAGAACGA
+TAATCCAGCCCACCAGCACGTAAAGAAAAGTATTCATATGCCCTCCTTTGTATGAGTCTA
+CTATACCAGGTTCCGTTCCAGCCCAAATAGGTTCAGTGCATGAAAAATAGGCTTTCCCGT
+CCGAATCTGCAAATCCACTCTGGCGTGCCTTTGCTGCCCTGCGTGAGATTTTCTTTCCGG
+TTGCGTATGACAGATTCCGTAAAGTTACTTTCTATCCGTCTTGATTAAAACCAGATCCTC
+TGACTTCACCATCCACCAGCCAGAACCACGGACGCAAAACCATTACGAAAAAATCCGTCA
+ACTTTACCCCCTGTCGATAGCCCCCCGACAATCGGGTGCCTGCACCCTGTATCAATCACC
+ACCGCCCCCACATCCGCCACCAGCGTCCCCACTGTCGCCCCCAACGCCAGTGTCTGAGTA
+GCCGGAGATTAAGAAGAAACCACTTTCGCCTGTGTTCGCTCCACTCTTACTGGACTGCGT
+AAACTGACGCCCTCCGCCCTGGAAACGGTAAAGTGCCTTTTTATTACGGAGACAGAGGTA
+AAGACAAACAGCAACATAGAGGATTAATGCAATATTGAGTAACATCACAAAACTCCTGTG
+CGTCATCGTTAATGGACTCGGTATTTATATTAAAGTCCCTTGTTCTTAAATTTTGTTAAC
+ACGCCCCTTTTCTCCCGACCGCAAATTATTATGGAGCGAGTCCGTCACAGACGACACCGC
+AGTCGTCAGCCAGACATATCCACCACGCAGGCCATGAGGTACCGAAGATTTCTTTCCGGA
+TGCCAGATCTCTTTTTAGTTCCCAGCATCATCACCGCCCCCGGCTAAACCATCTGCATGA
+GGCCAGGCTTACACCACCAGCTGCGGGCCCCGGACAGCCCAATGATCCTTTTTCCGTATG
+CCAGCTCTGAGTGCTGAGCCCACAAAAAAGAAACCCGGTGTTACCGGGTTCTTGTGCTAA
+TCAACTGGCCTTCAGCCCATGGCTTTGCAGGTAGCTATTGAGCGCATCATTGGCACCGGA
+TTCATAATTCCAGTTTCGCCAGACCAGCTGGCTGTCGTGGTCGCGATGATCACGGATGAC
+AATCTGGAAATGGCCTGCTGGCTGGAGGTTTTCGATAAAGACGTTCTGGTACCCAGCGGC
+GACAGTGCGTGCCTGAGCCAGTGTTACCGGTGATTCGCTGCTGAATAAATCGCTCATAAG
+AATTTCCTTCATAATCGCCAGGCCGGAGCCTGGCTAGGGGTGTCAGGCCGCGAGGTGTTT
+GGCGAGTTTAACGAAGTGGTCTTGGTTGTTGTACAAAGGCATCTGATAGGCCAGGTCCGA
+AATAAACATCCGGATCTGGTCAAACGTCATGCCGCAGTTGAAGCCAGTTTCGCTGACATT
+AGCCCGTGGAAAATCATCGCAAAATTCGTTTAACACCTTGTCATGGACAATGCCGATATT
+AAGGAGTCCGGCAGGACCGTTATCACGGAAAGACACAACACGGAATGCGCCATACCAGCC
+CGACTGGAAAAAGAAGGTAAACGCCTGGGTTGCAAGTCCGTTAAAGAGCTCGTAACGCTG
+GCTGGCACTCAGTGACTGGCTGTCCATGCTGTACACGCGATTGATAAAGACGCCCGGGCC
+GATGTTTGCGGGGATCTGCCCGTAAGCAATGCACGGCATGGCCATTTCAGATGCGTCTTT
+GGTATCATCAATCACTTTATATTGCGCGGCGATAATATCCGCCAACATTGAGCCGCCAAG
+TGCGCTAATTGCTGCGATGTCATTAACCTGAATATTTAAAGTTTTCATATTTCACCTCAT
+TGTTTTTCTTATTATTTCATATTCAGCCTCGTGGCTAACAACCTGATGTGAAATATTTAA
+TAAATTCATCAGTAGGACAAACACAAACCGGTAGACCGTTCAAAAATGTCCTGCAAATGA
+ATATTGCTGGCATCCAGATTAATCTGGACAAGCTCTGCATTATTACCTAAAACAGAAAAC
+AAATAAAAATCAAACCCGCCTGTATTATCATCCTTAAAAATGCGGAAGGAATTAATATTA
+ACAGCTTCGTCTAGTTCCACGTGAACCCCATAACGTACTTCCCCGTCATCAAACTGTGCA
+ATCCGGCGCACTGATTTGAGACGGACAAATTTCGCCAGCTCCAGTTCGGGCGTTGGGGAG
+AAAGTCAGTGCCTCGAAGATCAGATCTGCTGTTTCATGTTGCTTCCTGCGGTCGAACTCA
+AACAAACCGCCACCATTGTTGCGATAGACCGGCTGAAGCGCATTGATCAAGTTGAACGTC
+TGCCGGTTCCTGTCATATTTATACATTTATAGGTGCTCCAGTCCTGCCAGTATCCACCAG
+CAGGGCATAATGTGATTAGTGCCAGTTGGCGATCAGCTCTTCGCATTGCAAAGAGGAGAA
+ACACTGCTGGGCCAATACCGGCAGTACGGCAATGTTGGGTACACGGTTGTGACACCATGC
+GTTAAACAGCATCTGCCAGGGGCCAGCGTAGTAACCGCCCATTTTCATTTTTTATTTCGG
+AGTATGGCAGGCGGAAATAGCCTGCTGATAGAGACTTTCATTCTCGGTTCCAGAGCGTTG
+TTGCAGTGCAGGATAAATAAAGGAGTAAAGAGAGTCAGAACAATTAGATGCATAAGCCAG
+ATTGGTTTTCATAATACCTCCTATGTTTTTGGTATTATATAAAACCCGGGCTGCTGGCTA
+ATAACCTACACTGAAAATTTTTTAAATTAACCGACAATCTTAAAAATTGGACGCATGTGG
+AATTATGTAAATAGGTAGCAGATTTTATTAACTAGCTTCCATAGGTGGTGCGTTATTAGG
+GAGTTTTTTGCCAGACCAACAAATTCTAGTAGCTACACATTCACTCGCAGAGATTAATCG
+CTTTAACATAATTAGTGCCAGCACTGAGTCCTTTAAAATTATAAATCCATGTTCTATCCA
+TAACGTCGTGCCATTGCTCCTTTCGGTGTTCACTGCAAACGGGAGCAGGAATTCCGTTGC
+AGTTCTTCGGCCGCCTGCTGTTGCAGCACGACCATCACTCTGCTGAGCATTGTCAGCGCC
+TGGGAAGGGGAACCGCCAAACGTCAATTTGATTTCGTTGGTGGTGTGGTGCTGTTCCAGG
+TCGAGAATATTTACTTCCACGTCTGCGCCCTTCTCATCCTTAGCCGTACAATGAATGCTG
+ACCCGGGTCACCGGGTCCTTAACTGTCTGCAATGGTTTCTTCGTGCTGATGTTGATTGCG
+GTATTCTTCATTGCCCTGTTTCTCCTTGACCAGTGGTGGTAACCGACCCTACCGGGTGGC
+GGGGTCAGTCAGGAAATCATGCCTGGCCCTTGTTCTGCTTTTCAGCATGTTTACGCAGGT
+ACTGCGTCAGATCGCCGTGAGCTTCACAAATGGCATTCATCTCGTCATTGGTCAGCACCA
+GAGTGTAAGTATCGTCGCTGAGGTTCTTAGCGGCCCGTTGTTTAGCTTCTTCCGCAATAC
+GCGAAAACAGCGGGATTGCCGTGTCCGCAATCGTCGTCACGGTCTTTTTGTTCAGTACGC
+TGGAGACCGACACAGCTTTAGGCTCTGGCGTTTTGACCGGGTCTTTCATCTGCGGTGCCG
+GGGTCCTTTCCGGGGTCGGCTCCGGGTTAGTGCCCGCACTCCCGTCCACCAGCTGCGGTG
+GGGTGGTCTCATCGTTAGTACCTTCGCCGGACGTTTGTTCAGTCACGGTGGTTTCCGGGG
+GGGTCGCATTTGCGTCCGGCACGATGGCTGCTTTCGGCTTCATCGCTGCATCAATGTTGC
+CAGCTTTGACGAATTTCAGGGTTTTGGCCGTCGCCTTACCATAAACATCAATGGCTTTGG
+TGATGTTGTTGACCGCTTCATCGCCGCTGTAAAGGTATTCATCCAGCGCGACATACATAC
+TCACTTCACCCTTCACCAACATGGCCTGGAGGGCTTCAGGCAGATCCAGGACGCGAACCA
+TCTGACGCAGGTGCTGTTCGGTTTTACCGCGACGCTTCGCCAGTTCAGCGAACGTTTTGG
+GTTCTTCCGCGTCTTCAACCATCCGTTTGATGGAGAGCGCCTCAGCTACGACAGACAGAG
+CCAGATTTGAGTTACCGTCCAGCGTAAACTGCTCGGCACTGGCGCGGCTACCGCGAAACT
+CCTCGCATCGAATTAACGTGATCAATTCACGCCCTTCATCTGCCAGCTCGATGTTTGCCA
+TCGCGACGGCACGGATACGGCATGCTCCCTGGCGCAGGACCGGACGGCCATTCAGAATCT
+GTACGACAATAGCTTGTACGCTTAAAGGATCGATCTTGTAGGACTCTTTCAGGCTGTTCA
+GGTGGGCTACCACGTCAGGTAATGAGTAGTAACTCTCCCCAATGCCAGCAGTACGGGTGT
+TAAACCCCTCTTCCTCTTCGACCACTGCCGGGTTAATGACTAGACCATTGCTTTTGCGTG
+CGCCGTTACCGGTACGCTCCAGGTAGGTGCGCAGGCTGATATCGTTGTTAGCGGTTTTTA
+CATCATTTTCGACAGTGGACATGGTGCCTTCCTTTTAGTTTTCGTTTAGGGTGTTTGTTC
+GCTACAAAACAACAATACCAGGTTCGATTCATTTCCTAATAACCTGAGGCGAAAAAAAAG
+TAACTTTTTTTCCGGGGGTTATAGTACGCGATCCGTCCGTTTTAAATTCTCGCTAAGGAG
+GGCAAATTTCACTTTAGTGTGAAAAGCGGGTACATAAAGCAGGAATATGTCGAAAAAGTT
+ACTTTCCCGGTTGCCTGAAAAAATGCCGTTGCAGCAAACACAAGGTGTGAACACCCCCCC
+CGCCCCGGCGGCTCCGGGCAAAGGAGTATCCGATGAAGCTTTCCCGGCAGACCACAAATG
+ATACGGCTGTAATCGAAGGCACCCGCAGATTACCGACCATATCGCCTCCCAGCGAGCCAC
+CGAAGCCAAAAAAGACGGCATGAATTTTAATGCAGGCGTTGAGCTTGCATCTAAAAGGAA
+CTGTGCAACGAGGACAAACATTACCATGATTGAACACCGCACAGAGATGCGCCAAACGGC
+CATTAAATCGCTTCAGGAAGCCGAAGAAGCATTGACGGCACTGGCTATGTCCTATGAGCT
+ACAGCCCGATGATAAGGCCAGTTCGTGTCATCCACGGACCGGTACTCTCTCCACGGCCAG
+CCAGGTACGGAAATTGCGCCGTGTCGTCGAAAAGCAGAAAACTTGAAATTCGACAAGGCG
+GCGGGTAGCTATTTCCTGCATGTACAAACTAACAAGGGTTTAGCCGACGATAGAAAGGAA
+AAAAGGGTTTCCCCGACCGGAGAAACCCTTTTCTAAAGGTGCCATTAGCTTGCTGGCCCA
+CATTCTGAAATGAGGGGGGTCGCCCCCCCTCTTTCAGCTACTTACCGGATTCGTAGTCCA
+TCACAGCCGACACTTCCCGTGTACCGTCTTTCAGCCTCAGTTCGCAGAGCGAATTGCGCG
+TAAGCCAGGTGAATATCAACAGCGTAAGACATACTATCAATACGCACAAAACAACGGGTT
+GGTTCGGCAGTTTCATGGCCTTCTTCTCCTTGCATTTAAGCGGGTAAGAGGCTACTCTGA
+ATGTGACTAGCATACAGGGGCCTCGGGTTAATTTGAAAAAATTACTCGGGGCTTTCTGCT
+TTTTACCACAGTCAAACAGTGAATCTGCTGGCTGGGGCAAAAGCCTCCAGCACCGAGGTT
+ATTATACCACCCCGCCCCTTTTAAACGAACAGATCGTTCTCCTAAATATTTAATAAGTAA
+GTATTTCAGGTTTTGCTGCTTCGCAGGCTGTAACAGCAGGTGTCTGACGTAATAACTGAT
+TAAACAGACGGATTCGAATCTCAACACTCAACGACGCCAGCTCGCCTGTTCCCCCGCTTC
+TTTCCGGCTGTAATCAGTCCGTTTTCGTACCAGCGATCAGTGACAAACGGTGAGCACGAA
+CACTACTGTGCCGGAGGCTGTCCGGGTAATGGGGCGATTTTCTCCAGTTCCTCATCGAGG
+CGGGTATACGTCAGCCTCCTGATTTTCAAGATTTCCTTGTGAAGCCAGCGTTTGATAAAG
+GGATTGCCGGAAAGCAGTACCAGGTCTGCATCCTCCACTTCATCAAAAAGCCAGACGGGT
+TTTGCCGGAGTAAGGCGGTAGAGCCAGGGGCGGGAAAACTCCCCCGTTGCAATCAGAAAC
+CAGACAACCATGCCAAGTGCGAACTCGATGACCAGCATCAGGGTAAACTGAATATCCCGG
+ACGTCAGGCTCTCCGGTAAAGCTCATTAGGCGGTCGCCAGTTGCCAGACGCTGAATAATA
+CAGACCAGCATCAGCAGAGCCAGTAACAGCGCCATGAGCAGCCCGCCGTTCACTTCAAAA
+GTAGCTTTCTGGACGCGATCAGGCGGCACCTGCTTACGGTAGCGGCCGACCACATCACCA
+ATCATTACCCTGATGGCTATGCGTTCTTCATCGACCGTTGTTTCGGTAAATCCGGACGGG
+CCCGTTTCTGTTTGATTCATGTACCCTCTCCTCTCTCTGAAAAATAATGGTAAGACGCAA
+GCTGATCATACCAGGTGAGCAGGAGTGGTTTTGTCGGTTAAAGGCTGGAAAAAAACGGTT
+AAAAAAAGAGGGAAATGACAGCAAGAAGGTGGGATGCAGTAAGCGGCTTTGGTTCCCTCC
+GGTTCTGTGGGGAGGAAACGGCCAGAACAGCAGACCGATACGATGGGCGGGCGCTATTTT
+GTATCCAGAATTCGTGCCTTTTCTTCCCGCGTCGCCAGTCGGGCACTTCCGGAACGGTCG
+CGGATCAGCAGTGGCTTTTCCTTTTTCCAACCAGTGATAGCCGTTTCCCCGAAACGACGC
+GGTGCATTGCCATTCCAGCTGGCAATCACGTGATTATCGTGTACTTCCTTGATGACGACA
+GAATGAAGAGTCACCGTCTTAATGGTGGTGTTTCCCATTTTGGTCCGGGAGAGTGACCAG
+ACGGTCATCCCCACCTCCAGCTGACTGAGTTTCATCTTTACTCCGGTAATATCGGGATAC
+ATCATTAAACGACGTGGAGACGTAGGTTAGCATAAGCACTCACAGCGGATACTGCCGCCA
+GATAACAGGGTGAGGTATCCGCCATGAGCAGTCTTTACGGCTGGCGTTATTCGGCCAGGG
+CGCGGGTAATAGACGCACGCTGACGCTGGCGCTCAGCCTTACGCTGGCTGCGGCGATATA
+GCGGCTTCGCGGCAGCGTAGCGACAATCTTCCGGGTGGTACCAGCAACAGCCGCAGGGCT
+CAGGCTGGGGTTTTCCGGCAAGTCCGAATGGTTTCATAATGTCACCTTTTAAATGGAATA
+ATGTTCAGGTCCCGTCCATCAGGCCACGGGTTCATTAATGAAGCGGCGTTGCATAAACAG
+GTACAGATAACCCTCTGGCGAGAACATACAAAGATTCTCGGTAATACAGGCATCGAGGTA
+CTTCGTGTCGCCAAGGAGTCGCTTAATGACAGCCAGCTGGTTAGCCGCAGACTGAATCAG
+CGGATAGCCATTCACGGCACGATGAATACCTGAGTGGAATAACGAACGAGCCTTTCCAAT
+CTTTTCCCGGGTTGCGTCCATTTCCATATCGATAACAGACTGACGCGCAACATTAATAGC
+ATTGCCGGATAACTCCGCGAAGCTAACCAGAGGCTTATTCATAAAAAACTCCTTCCAGGT
+ATGTGAGCTTATTATATCAATACGGACTTTGCCCCAAACAACCCGACTCGAAATATTTTG
+GAAATTACTCTAATAACTAAAAATGGCACCCGGAAAATAGAATGAATTTATTTTAAGCTT
+GCCGAACATGGCTGGCGGCGGAATTAAATTTGGGTAATGACTCCAACTTATTGATAGTGT
+TTTATGTTCAGATAATGCCCGATGACTTTGTCATGCAGCTCCACCGAT
+>NODE_17_length_219_cov_42.2394:NODE_38_length_237_cov_132.244;
+ATCGGTGGAGCTGCATGACAAAGTCATCGGGCATTATCTGAACATAAAACACTATCAATA
+AGTTGGAGTCATTACCCCCCGGACGAGTGGGAATCCATGGTAGGGATTTTTACCGAAATG
+GAAGAACACTATTAGGGGGCACCTCAGAAAACGGAATCTATGGTCACTCCCGTTTTTGCA
+ACACCGATTTTGACGACAAGTTGGCTTGCTTGAATCTAT
+>NODE_17_length_219_cov_42.2394':NODE_18_length_78_cov_102;
+ATAGATTCAAGCAAGCCAACTTGTCGTCAAAATCGGTGTTGCAAAAACGGGAGTGACCAT
+AGATTCCGTTTTCTGAGGTGCCCCCTAATAGTGTTCTTCCATTTCGGTAAAAATCCCTAC
+CATGGATTCCCACTCGTCCGGGGGGTAATGACTCCAACTTATTGATAGTGTTTTATGTTC
+AGATAATGCCCGATGACTTTGTCATGCAGCTCCACCGAT
+>NODE_18_length_78_cov_102:NODE_41_length_366_cov_169.284';
+GGGTAATGACTCCAACTTATTGATAGTGTTTTATGTTCAGATAATGCCCGATGACTTTGT
+CATGCAGCTCCACCGATT
+>NODE_18_length_78_cov_102':NODE_16_length_35628_cov_42.0221,NODE_17_length_219_cov_42.2394;
+AATCGGTGGAGCTGCATGACAAAGTCATCGGGCATTATCTGAACATAAAACACTATCAAT
+AAGTTGGAGTCATTACCC
+>NODE_19_length_1805_cov_40.386:NODE_37_length_78_cov_92;
+GGAGGGACAGCTGATAGAAACAGAAGCCACTGGAGCACCTCAAAAACACCATCATACACT
+AAATCAGTAAGTTGGCACCATTACCCGGGAAGAGGGGGAAAATCTAGTGTGACAAACTAC
+CCTCAGGATAGGATGACAAATTGCCCTCAATTCTGGCTCCACTACCGGTTACAGCCAAAA
+AACCATGAGTAAGCGCAGGATGCCAGGGAGGGAACAGCAAAACTGTGACAAATCACCCTC
+AACCTTCCAGATCAAATGTGACGAACCACCCTTAAATCTGTGACAAATCACCCTCAACCT
+TCCAGATCAAATGTGACGAACCACCCTTAAATCTGTGACAGATAACCCTCAACCTTCCAG
+ATCAAATGTGACGAACCACCCTTAAATCTGTGACAGATAACCCTCAACTATTCAATCGTC
+ATGGAGGTTATATCACGGAAGGAAAATACGATATGCGTCGTCTGGCGGCCTTTCTTTTTC
+TCGATGTAAGAAAGGCGCATTGGTGTCCGGCTGTTGATCTCGTCAACACTTGCCTTCAGG
+AAACGGCGGCGAAAGTCCGGCATACGCTGGTAACTTTGAGGTAGCTGGTAGCGTTCCATG
+ATCCAGTCGATTTTCAGGGACACGACACCTGAGCCATCAGGTTTACGGTACTGGCACAGA
+GATTCGTATAAACGCATGGCGTACGGATTGGTAATCTCTTTTGTTTCACTGAGCCGGAAC
+TGCGTAAACCGGTTCTGTAACCCGATGAAGAAGGGAATCAGATATGGGTTGATATGTACG
+CTGTAAAGCCCTCTTGATGGGCTGTGCGCACGTTTAATAAACCAGGGAAAGGATTCATAC
+CCTTTTTCATCGCCGGCATCCTCTTCAGGGCGATAGAAAACCACTTCCTTACCCGCAAAA
+CCTTTTAAAGCCTGTCGTATATCCTTACTGGCTTCAGCGGAGGTCAACCCGAATGTTTCA
+GCGTATTTAGCAACGTGAATTTCGCAGATGCCGTCATGTTCCTGCAGGGAGCCGTCGGAT
+TTTCTGATCTGGTGAACGAACAGATACAGCAGACGCTTTTGATCCCTGGAGAGACTATAT
+GCCGCCTCAGTCAGCTCATTTGACTGGACAATCCGCGGGCTATTTTTACGTTTTTTATGG
+TTTATAACCGCTATTTCCGCCATGACAGGTCCATGTGAAGTGTGACAGACTTTAAGATTG
+TCACACTTCATAAAACAGAGTCAACAGGGATGGATAACTTTGTGAAAAGCAACGCTTCCT
+GAGGGCAATTTGTCACAGGGTTAAGGGCAACTTGTCACAGAAAGGGCGGCTATTTGAGGG
+TGATTTGTCACACTGAAAGGGCGTTTTGTCACAGATCCCTCTCTGGAACCCGCATGGATA
+AAGGCCTGTGGGCATTCTAAAAATAAAGATCTAACAACTATTTAAAAAGATCTTATAAAA
+ATATCCCCGTGGATAAGTGGATAACCCCTAGGGGAGGTGATTTTGCAGGCATTGAGCGTA
+TGCAGAATTTATGAGTACTGTTCCATGGTGCTTCCTCGCTCACTCGGGGCTTCGCCCTGT
+CGCTCGGCTGCGGCGAGCACTGCTGGCTCGATTATATCTGTGGCCAGAAGTTAGACATAC
+AGCCTATTAATTACGTGATGAGCGGCAGGGAAAAACACCAAAAGCCTCCCCCATTACCCC
+GGAACAAATTGAAATCCGTGAGCTCAGGAAAAAGCTACAACGTATTGAAGGTAATGACTC
+CAACTTATTGATAGTGTTTTATGTTCAGATAATGCCCGATGACTTTGTCATGCAGCTCCA
+CCGAT
+>NODE_19_length_1805_cov_40.386':NODE_39_length_146_cov_169.507';
+ATCGGTGGAGCTGCATGACAAAGTCATCGGGCATTATCTGAACATAAAACACTATCAATA
+AGTTGGAGTCATTACCTTCAATACGTTGTAGCTTTTTCCTGAGCTCACGGATTTCAATTT
+GTTCCGGGGTAATGGGGGAGGCTTTTGGTGTTTTTCCCTGCCGCTCATCACGTAATTAAT
+AGGCTGTATGTCTAACTTCTGGCCACAGATATAATCGAGCCAGCAGTGCTCGCCGCAGCC
+GAGCGACAGGGCGAAGCCCCGAGTGAGCGAGGAAGCACCATGGAACAGTACTCATAAATT
+CTGCATACGCTCAATGCCTGCAAAATCACCTCCCCTAGGGGTTATCCACTTATCCACGGG
+GATATTTTTATAAGATCTTTTTAAATAGTTGTTAGATCTTTATTTTTAGAATGCCCACAG
+GCCTTTATCCATGCGGGTTCCAGAGAGGGATCTGTGACAAAACGCCCTTTCAGTGTGACA
+AATCACCCTCAAATAGCCGCCCTTTCTGTGACAAGTTGCCCTTAACCCTGTGACAAATTG
+CCCTCAGGAAGCGTTGCTTTTCACAAAGTTATCCATCCCTGTTGACTCTGTTTTATGAAG
+TGTGACAATCTTAAAGTCTGTCACACTTCACATGGACCTGTCATGGCGGAAATAGCGGTT
+ATAAACCATAAAAAACGTAAAAATAGCCCGCGGATTGTCCAGTCAAATGAGCTGACTGAG
+GCGGCATATAGTCTCTCCAGGGATCAAAAGCGTCTGCTGTATCTGTTCGTTCACCAGATC
+AGAAAATCCGACGGCTCCCTGCAGGAACATGACGGCATCTGCGAAATTCACGTTGCTAAA
+TACGCTGAAACATTCGGGTTGACCTCCGCTGAAGCCAGTAAGGATATACGACAGGCTTTA
+AAAGGTTTTGCGGGTAAGGAAGTGGTTTTCTATCGCCCTGAAGAGGATGCCGGCGATGAA
+AAAGGGTATGAATCCTTTCCCTGGTTTATTAAACGTGCGCACAGCCCATCAAGAGGGCTT
+TACAGCGTACATATCAACCCATATCTGATTCCCTTCTTCATCGGGTTACAGAACCGGTTT
+ACGCAGTTCCGGCTCAGTGAAACAAAAGAGATTACCAATCCGTACGCCATGCGTTTATAC
+GAATCTCTGTGCCAGTACCGTAAACCTGATGGCTCAGGTGTCGTGTCCCTGAAAATCGAC
+TGGATCATGGAACGCTACCAGCTACCTCAAAGTTACCAGCGTATGCCGGACTTTCGCCGC
+CGTTTCCTGAAGGCAAGTGTTGACGAGATCAACAGCCGGACACCAATGCGCCTTTCTTAC
+ATCGAGAAAAAGAAAGGCCGCCAGACGACGCATATCGTATTTTCCTTCCGTGATATAACC
+TCCATGACGATTGAATAGTTGAGGGTTATCTGTCACAGATTTAAGGGTGGTTCGTCACAT
+TTGATCTGGAAGGTTGAGGGTTATCTGTCACAGATTTAAGGGTGGTTCGTCACATTTGAT
+CTGGAAGGTTGAGGGTGATTTGTCACAGATTTAAGGGTGGTTCGTCACATTTGATCTGGA
+AGGTTGAGGGTGATTTGTCACAGTTTTGCTGTTCCCTCCCTGGCATCCTGCGCTTACTCA
+TGGTTTTTTGGCTGTAACCGGTAGTGGAGCCAGAATTGAGGGCAATTTGTCATCCTATCC
+TGAGGGTAGTTTGTCACACTAGATTTTCCCCCTCTTCCCGGGTAATGGTGCCAACTTACT
+GATTTAGTGTATGATGGTGTTTTTGAGGTGCTCCAGTGGCTTCTGTTTCTATCAGCTGTC
+CCTCC
+>NODE_20_length_5859_cov_41.9915:NODE_7_length_1329_cov_85.8474';
+GCTGATAGAAACAGAAGCCACTGGAGCACCTCAAAAACACCATCATACACTAAATCAGTA
+AGTTGGCAGCATCACCCATTATCTTGATTATATTATTGATAATAATAAAAACCTTATCCC
+TATCCAAGAAGTGATGCCTATCATTGGTTGGAATGAACTTGAAAAAATTAGCCTTGAATA
+CATTACTGGTAAGGTAAACGCCATTGTCAGCAAATTGATCCAAGAGAACCAACTTAAAGC
+TTATGATGATGATGTGCTTAAAAACTTACTCAATGGCTGGTTTATGCATATCGCAATACA
+TGCGAAAAACCTAAAAGAGCTTGCCGATAAAAAAGGCCAATTTATTGCTATTTACCGCGG
+CTTTTTATTGAGCTTGAAAGATAAATAAAATAGATAGGTTTTATTTGAAGCTAAATCTTC
+TTTATCGTAAAAAATGCCCTCTTGGGTTATCAAGAGGGTCATTATATTTCGCGGAATAAC
+ATCATTTGGTGACGAAATAACTAAGCACTTGTCTCCTGTTTACTCCCCTGAGCTTGAGGG
+GTTAACATGAAGGTCATCGATAGCAGGATAATAATACAGTAAAACGCTAAACCAATAATC
+CAAATCCAGCCATCCCAAATTGGTAGTGAATGATTATAAATAACAGCAAACAGTAATGGG
+CCAATAACACCGGTTGCATTGGTAAGGCTCACCAATAATCCCTGTAAAGCACCTTGCTGA
+TGACTCTTTGTTTGGATAGACATCACTCCCTGTAATGCAGGTAAAGCGATCCCACCACCA
+GCCAATAAAATTAAAACAGGGAAAACTAACCAACCTTCAGATATAAACGCTAAAAAGGCA
+AATGCACTACTATCTGCAATAAATCCGAGCAGTACTGCCGTTTTTTCGCCCCATTTAGTG
+GCTATTCTTCCTGCCACAAAGGCTTGGAATACTGAGTGTAAAAGACCAAGACCCGCTAAT
+GAAAAGCCAACCATCATGCTATTCCATCCAAAACGATTTTCGGTAAATAGCACCCACACC
+GTTGCGGGAATTTGGCCTATCAATTGCGCTGAAAAATAAATAATCAACAAAATGGGCATC
+GTTTTAAATAAAGTGATGTATACCGAATTCGATTGCGTCTCAACCCCTACTTCGGTATCT
+GTATTATCACGTGTATTTTTGGTTTCACGGAACCAAAACATAACCACAAGGAAAGCGACA
+ATATTTAGCAACGCAGCGATAAAAAAGGGACTATGCGGTGAAATCTCTCCTGCAAAACCA
+CCAATAATAGGCCCCGCTATTAAACCAAGCCCAAAACTTGCCCCTAACCAACCGAACCAC
+TTCACGCGTTGAGAAGCTGAGGTGGTATCGGCAATGACCGATGCCGCGACAGCCCCAGTA
+GCTCCTGTGATCCCTGAAAGCAAACGGCCTAAATACAGCATCCAAAGCGCACTTGAAAAA
+GCCAGCAATAAGTAATCCAGCGATGCGCCTATTAATGACAACAACAGCACTGGGCGCCGA
+CCAAATCGGTCAGACATTTTTCCAAGCCAAGGAGCAAAGATAACCTGCATTAACGCATAA
+AGTGCAAGCAATACGCCAAAGTGGTTAGCGATATCTTCCGAAGCAATAAATTCACGTAAT
+AACGTTGGCAAGACTGGCATGATAAGGCCAATCCCCATGGCATCGAGTAACGTAATTACC
+AATGCGATCTTTGTCGAACTATTCATTTCACTTTTCTCTATCACTGATAGGGAGTGGTAA
+AATAACTCTATCAATGATAGAGTGTCAACAAAAATTAGGAATTAATGATGTCTAGATTAG
+ATAAAAGTAAAGTGATTAACAGCGCATTAGAGCTGCTTAATGAGGTCGGAATCGAAGGTT
+TAACAACCCGTAAACTCGCCCAGAAGCTAGGTGTAGAGCAGCCTACATTGTATTGGCATG
+TAAAAAATAAGCGGGCTTTGCTCGACGCCTTAGCCATTGAGATGTTAGATAGGCACCATA
+CTCACTTTTGCCCTTTAGAAGGGGAAAGCTGGCAAGATTTTTTACGTAATAACGCTAAAA
+GTTTTAGATGTGCTTTACTAAGTCATCGCGATGGAGCAAAAGTACATTTAGGTACACGGC
+CTACAGAAAAACAGTATGAAACTCTCGAAAATCAATTAGCCTTTTTATGCCAACAAGGTT
+TTTCACTAGAGAATGCATTATATGCACTCAGCGCTGTGGGGCATTTTACTTTAGGTTGCG
+TATTGGAAGATCAAGAGCATCAAGTCGCTAAAGAAGAAAGGGAAACACCTACTACTGATA
+GTATGCCGCCATTATTACGACAAGCTATCGAATTATTTGATCACCAAGGTGCAGAGCCAG
+CCTTCTTATTCGGCCTTGAATTGATCATATGCGGATTAGAAAAACAACTTAAATGTGAAA
+GTGGGTCTTAAAAGCAGCATAACCTTTTTCCGTGATGGTAACTTCACGGTAACCAAGATG
+TCGAGTTAACCACCCTTTAGATTCATAAAGCGAAAATAATGCGGCTCCAACGTACCCACC
+TAAATGGAAACGGCGTTCACTCCAATCTAAACACGCACAACAGATTTTACGTGAATGTTT
+GGAAGGAACGTCAATTCCCATTTCATGAAAATATTGAATACCACTTAATGTGATCATTGA
+ACCATTTTCAGTGATCCATTGCTGTTGACAAAGGGAATCATAGATCTTAACGGCAACTTC
+GCCAGCTAAATGATCATAGCAAGTACGTGCTTTTCGTAAATGCACTGGCGTGGAAACTCT
+GGCATGTACGCCATGGTTTAAGGAGATCCCCATCATACTTTCCATCAATTCAGCAATATC
+TTTTCCTGCTAGCCGAAAATAACGATGCTTGCCTTGAGCTACTACTGTGATTAGCTGGCA
+ATCTAATAATTTAGATAAATGACTGCTCGCCGTTGAAGCTGATATATTCGCCACAGAACT
+TAGCTCAGTGGCCGTCCAAGCTCGCCCATCCATCAAAGCACTGAGTATTTTAACTCGTGA
+AATGTCAGACATAGCCGCCCCTATCGCGGCTATTGAGGACTCAAAGGTAACCTCTTTTCG
+TATTAAATTAGCCATCGCAAGTTCACTTTATTGCCCAAGGGAGCGTAACAGATGCAGCCA
+TACTATCATTGTCCGTTATTAATATCAGTTGGTTAGCATGGTCACTGTATTGCACTAAAA
+TATTAATGTTATTCTCCGCCAATACTCGTGCTATTTCGCCAAGTTCCCCCGGTTTTTCCT
+GTTTTAACTTACGAATTAATGGTGTCCGGATCGCAAGTACTAACAGTCCAGCTTGCTCTA
+GCGCTATTTTAGCTTCCTTTCCTTGTTCAACAAGAAAATGAGCATGGCATTCATCACCAA
+CCGTAAATATCCCTCCCCCTTCCAATCCAATACCTTTATTACCTAATGTTTTTCCTAGTA
+ATGCTAATTGTCCTATTTGATTATCTAAAACAACGTGAACATCAAACATTATCCTTGTCC
+TTTTTAAATGAATATTCGCGAGTAATATGAGCAATACTAATTTTGTAAAAATCAAATATT
+GACTCTCGCCCTTCTTGTTGAGCTTTCGCATGTAAAACATGATTTTTCCATTGCAGAACT
+GCGTATTCGTTTTCCCACCAAGATAGCGATAACATTTTTCCTTCTGTAGCTAGACTTTGA
+AAACGTTCAATTGAAATAAAACCAGCTACATGACTTAATAGTGGTCTTAACTCCTCAGCT
+AAAGTCAAATAGCGAGTTTGTTGGTCGGGTTGTATTTGCACCTCAAATATTACAGCAATC
+ATATTTTTCTCCGTTATTAATCAACAAACAGAGTAATCCACCCGAAAATTAACACTTCGA
+TAAGCAACGAAATATAGAAAGGTCATGCTGCTGTTTTATGTTGTATATCACACTTCTTTA
+AATTGCTCGGCCTGCGCTTATCATGTTCTCCTTCTCTTATAATTTTGTTTATTATTTATA
+CTTTTTTATTTTTTGCTATCACCGAAAATAGTGCGGATCCCGCATGGTATTTAGGTTTAC
+CCATCATTAAATACCATTGTTGTTATTTTAATCTTTTTAATATTTCATGATTAAGATCAC
+ACTAAAATTATGACCCTATTAACTAAAAGTTATGGATACCCTAATAAAACTCATTGTTAA
+AAATTAGTTAACCAAAGTAACTTCATTTTTCACTATTGTTAAATTGTTATAGTGAAAATT
+CTGGTAAACTAATAGAGGTAAAAAAATGATCCTAGATGCCAGTTATACATTATTAGTCGC
+ATGTATCGCGCTACTCATAGGAATGTTTGTCGTAAAATTTACCCCGTTCCTACAAAAAAA
+CCACATACCAGAAGCCGTCGTTGGTGGCTTTATTGTTGCAATTGTTCTGTTAATTATTGA
+TAAAACATCAGGTTATTCGTTTACTTTTGATGCTTCATTGCAAAGTTTATTAATGCTCAC
+ATTCTTTTCCTCTATCGGGCTAAGTTCTGACTTTTCTCGACTGATTAAAGGAGGAAAGCC
+GTTAGTTCTATTAACTATTGCAGTAACGATCCTAATCGCCATCAAAATACTGTCGGCATG
+AGTATGGCTGTCATGATGAATGAAAGTCCATTTATTGGCTTAATTGCAGGTTCAATTACT
+CTAACAGGTGGTCATGGTAATGCCGGAGCATGGGGCCCTATTCTCGCTGATAAATATGGT
+GTAACAGGCGCCGTTGAATTAGCGATGGCTTGTGCAACACTTGGATTAGTGTTGGGTGGT
+TTAGTTGGCGGCCCTGTTGCCCGTCATCTTTTGAAAAAGGTCTCTATTCCTAAAACAACC
+GAGCAAGAGCGCGACACTATCGTTGAAGCTTTTGAGCAACCAAGCGTCAAAAGAAAAATC
+AATGCAAATAACGTTATTGAAACCATTTCAATGCTGATTATCTGTATTGTTGTTGGTGGC
+TATATCAGTGCATTGTTTAAAGATACTTTTCTGCAACTGCCTACTTTTGTCTGGTGTTTA
+TTTGTCGGTATTATTATCCGTAATACACTGACTCATGTATTTAAACACGAAGTGTTTGAG
+CCGACCGTCGATGTATTAGGTAGCGTTGCTTTATCGCTTTTCTTGGCAATGGCGTTAATG
+TCATTAAAATTTGGTCAATTGGCAAGCATGGCAGGGCCAGTATTAATTATCATTGCTGTA
+CAAACTGTTGTCATGGTGCTATTTGCCTGCTTTGTCACCTTCAAAATGATGGGCAAAGAT
+TATGATGCTGTCGTGATCAGCGCGGGTCACTGTGGCTTTGGTATGGGAGCAACACCAACA
+GCAATTGCGAATATGCAAACAGTCACAAAAGCATTTGGACCATCACATAAAGCTTTCCTT
+GTCGTTCCTATGGTCGGTGCCTTTATTGTTGATATTTCAAACAGTATCTTAATTAAAATA
+TTTATTGAAATTGGTACATACTTTACCTAATAGCTACACACTACTCGGCGTACTTCTCCT
+AACAATTTATTATAGGGCAGTATGCCGAGCCGCTTTCTTACCCCGTATATTCCCCTAGTC
+AATCTATTTAGCTTGCACGTTTACGAATTAATTCTCGTGACAACTAAACCAAAATTTGAA
+TTATGACGAGTATATCTGATTATTTATACTTTATTCGTTAGAATAGTCCGTAGAAATAAA
+TAATCAGTAGGCTACATGGAATGAAATTAAGACATCTCGATATCTTTTATGCTGTAATGA
+CTTGTGGTTCCTTAACGCGTGCGGCTGAAGTTTTACATATTTCTCAACCCGCGGCGAGTA
+AAGCACTCAAACATGCTGAGCACTGAGAGATCCCCTCATAATTTCCCCAAAACGTAACCA
+TGTGTGAATAGATTTTGAGTAAGCAGGGTTGCAGCCACG
+>NODE_20_length_5859_cov_41.9915':NODE_22_length_78_cov_98;
+CGTGGCTGCAACCCTGCTTACTCAAAATCTATTCACACATGGTTACGTTTTGGGGAAATT
+ATGAGGGGATCTCTCAGTGCTCAGCATGTTTGAGTGCTTTACTCGCCGCGGGTTGAGAAA
+TATGTAAAACTTCAGCCGCACGCGTTAAGGAACCACAAGTCATTACAGCATAAAAGATAT
+CGAGATGTCTTAATTTCATTCCATGTAGCCTACTGATTATTTATTTCTACGGACTATTCT
+AACGAATAAAGTATAAATAATCAGATATACTCGTCATAATTCAAATTTTGGTTTAGTTGT
+CACGAGAATTAATTCGTAAACGTGCAAGCTAAATAGATTGACTAGGGGAATATACGGGGT
+AAGAAAGCGGCTCGGCATACTGCCCTATAATAAATTGTTAGGAGAAGTACGCCGAGTAGT
+GTGTAGCTATTAGGTAAAGTATGTACCAATTTCAATAAATATTTTAATTAAGATACTGTT
+TGAAATATCAACAATAAAGGCACCGACCATAGGAACGACAAGGAAAGCTTTATGTGATGG
+TCCAAATGCTTTTGTGACTGTTTGCATATTCGCAATTGCTGTTGGTGTTGCTCCCATACC
+AAAGCCACAGTGACCCGCGCTGATCACGACAGCATCATAATCTTTGCCCATCATTTTGAA
+GGTGACAAAGCAGGCAAATAGCACCATGACAACAGTTTGTACAGCAATGATAATTAATAC
+TGGCCCTGCCATGCTTGCCAATTGACCAAATTTTAATGACATTAACGCCATTGCCAAGAA
+AAGCGATAAAGCAACGCTACCTAATACATCGACGGTCGGCTCAAACACTTCGTGTTTAAA
+TACATGAGTCAGTGTATTACGGATAATAATACCGACAAATAAACACCAGACAAAAGTAGG
+CAGTTGCAGAAAAGTATCTTTAAACAATGCACTGATATAGCCACCAACAACAATACAGAT
+AATCAGCATTGAAATGGTTTCAATAACGTTATTTGCATTGATTTTTCTTTTGACGCTTGG
+TTGCTCAAAAGCTTCAACGATAGTGTCGCGCTCTTGCTCGGTTGTTTTAGGAATAGAGAC
+CTTTTTCAAAAGATGACGGGCAACAGGGCCGCCAACTAAACCACCCAACACTAATCCAAG
+TGTTGCACAAGCCATCGCTAATTCAACGGCGCCTGTTACACCATATTTATCAGCGAGAAT
+AGGGCCCCATGCTCCGGCATTACCATGACCACCTGTTAGAGTAATTGAACCTGCAATTAA
+GCCAATAAATGGACTTTCATTCATCATGACAGCCATACTCATGCCGACAGTATTTTGATG
+GCGATTAGGATCGTTACTGCAATAGTTAATAGAACTAACGGCTTTCCTCCTTTAATCAGT
+CGAGAAAAGTCAGAACTTAGCCCGATAGAGGAAAAGAATGTGAGCATTAATAAACTTTGC
+AATGAAGCATCAAAAGTAAACGAATAACCTGATGTTTTATCAATAATTAACAGAACAATT
+GCAACAATAAAGCCACCAACGACGGCTTCTGGTATGTGGTTTTTTTGTAGGAACGGGGTA
+AATTTTACGACAAACATTCCTATGAGTAGCGCGATACATGCGACTAATAATGTATAACTG
+GCATCTAGGATCATTTTTTTACCTCTATTAGTTTACCAGAATTTTCACTATAACAATTTA
+ACAATAGTGAAAAATGAAGTTACTTTGGTTAACTAATTTTTAACAATGAGTTTTATTAGG
+GTATCCATAACTTTTAGTTAATAGGGTCATAATTTTAGTGTGATCTTAATCATGAAATAT
+TAAAAAGATTAAAATAACAACAATGGTATTTAATGATGGGTAAACCTAAATACCATGCGG
+GATCCGCACTATTTTCGGTGATAGCAAAAAATAAAAAAGTATAAATAATAAACAAAATTA
+TAAGAGAAGGAGAACATGATAAGCGCAGGCCGAGCAATTTAAAGAAGTGTGATATACAAC
+ATAAAACAGCAGCATGACCTTTCTATATTTCGTTGCTTATCGAAGTGTTAATTTTCGGGT
+GGATTACTCTGTTTGTTGATTAATAACGGAGAAAAATATGATTGCTGTAATATTTGAGGT
+GCAAATACAACCCGACCAACAAACTCGCTATTTGACTTTAGCTGAGGAGTTAAGACCACT
+ATTAAGTCATGTAGCTGGTTTTATTTCAATTGAACGTTTTCAAAGTCTAGCTACAGAAGG
+AAAAATGTTATCGCTATCTTGGTGGGAAAACGAATACGCAGTTCTGCAATGGAAAAATCA
+TGTTTTACATGCGAAAGCTCAACAAGAAGGGCGAGAGTCAATATTTGATTTTTACAAAAT
+TAGTATTGCTCATATTACTCGCGAATATTCATTTAAAAAGGACAAGGATAATGTTTGATG
+TTCACGTTGTTTTAGATAATCAAATAGGACAATTAGCATTACTAGGAAAAACATTAGGTA
+ATAAAGGTATTGGATTGGAAGGGGGAGGGATATTTACGGTTGGTGATGAATGCCATGCTC
+ATTTTCTTGTTGAACAAGGAAAGGAAGCTAAAATAGCGCTAGAGCAAGCTGGACTGTTAG
+TACTTGCGATCCGGACACCATTAATTCGTAAGTTAAAACAGGAAAAACCGGGGGAACTTG
+GCGAAATAGCACGAGTATTGGCGGAGAATAACATTAATATTTTAGTGCAATACAGTGACC
+ATGCTAACCAACTGATATTAATAACGGACAATGATAGTATGGCTGCATCTGTTACGCTCC
+CTTGGGCAATAAAGTGAACTTGCGATGGCTAATTTAATACGAAAAGAGGTTACCTTTGAG
+TCCTCAATAGCCGCGATAGGGGCGGCTATGTCTGACATTTCACGAGTTAAAATACTCAGT
+GCTTTGATGGATGGGCGAGCTTGGACGGCCACTGAGCTAAGTTCTGTGGCGAATATATCA
+GCTTCAACGGCGAGCAGTCATTTATCTAAATTATTAGATTGCCAGCTAATCACAGTAGTA
+GCTCAAGGCAAGCATCGTTATTTTCGGCTAGCAGGAAAAGATATTGCTGAATTGATGGAA
+AGTATGATGGGGATCTCCTTAAACCATGGCGTACATGCCAGAGTTTCCACGCCAGTGCAT
+TTACGAAAAGCACGTACTTGCTATGATCATTTAGCTGGCGAAGTTGCCGTTAAGATCTAT
+GATTCCCTTTGTCAACAGCAATGGATCACTGAAAATGGTTCAATGATCACATTAAGTGGT
+ATTCAATATTTTCATGAAATGGGAATTGACGTTCCTTCCAAACATTCACGTAAAATCTGT
+TGTGCGTGTTTAGATTGGAGTGAACGCCGTTTCCATTTAGGTGGGTACGTTGGAGCCGCA
+TTATTTTCGCTTTATGAATCTAAAGGGTGGTTAACTCGACATCTTGGTTACCGTGAAGTT
+ACCATCACGGAAAAAGGTTATGCTGCTTTTAAGACCCACTTTCACATTTAAGTTGTTTTT
+CTAATCCGCATATGATCAATTCAAGGCCGAATAAGAAGGCTGGCTCTGCACCTTGGTGAT
+CAAATAATTCGATAGCTTGTCGTAATAATGGCGGCATACTATCAGTAGTAGGTGTTTCCC
+TTTCTTCTTTAGCGACTTGATGCTCTTGATCTTCCAATACGCAACCTAAAGTAAAATGCC
+CCACAGCGCTGAGTGCATATAATGCATTCTCTAGTGAAAAACCTTGTTGGCATAAAAAGG
+CTAATTGATTTTCGAGAGTTTCATACTGTTTTTCTGTAGGCCGTGTACCTAAATGTACTT
+TTGCTCCATCGCGATGACTTAGTAAAGCACATCTAAAACTTTTAGCGTTATTACGTAAAA
+AATCTTGCCAGCTTTCCCCTTCTAAAGGGCAAAAGTGAGTATGGTGCCTATCTAACATCT
+CAATGGCTAAGGCGTCGAGCAAAGCCCGCTTATTTTTTACATGCCAATACAATGTAGGCT
+GCTCTACACCTAGCTTCTGGGCGAGTTTACGGGTTGTTAAACCTTCGATTCCGACCTCAT
+TAAGCAGCTCTAATGCGCTGTTAATCACTTTACTTTTATCTAATCTAGACATCATTAATT
+CCTAATTTTTGTTGACACTCTATCATTGATAGAGTTATTTTACCACTCCCTATCAGTGAT
+AGAGAAAAGTGAAATGAATAGTTCGACAAAGATCGCATTGGTAATTACGTTACTCGATGC
+CATGGGGATTGGCCTTATCATGCCAGTCTTGCCAACGTTATTACGTGAATTTATTGCTTC
+GGAAGATATCGCTAACCACTTTGGCGTATTGCTTGCACTTTATGCGTTAATGCAGGTTAT
+CTTTGCTCCTTGGCTTGGAAAAATGTCTGACCGATTTGGTCGGCGCCCAGTGCTGTTGTT
+GTCATTAATAGGCGCATCGCTGGATTACTTATTGCTGGCTTTTTCAAGTGCGCTTTGGAT
+GCTGTATTTAGGCCGTTTGCTTTCAGGGATCACAGGAGCTACTGGGGCTGTCGCGGCATC
+GGTCATTGCCGATACCACCTCAGCTTCTCAACGCGTGAAGTGGTTCGGTTGGTTAGGGGC
+AAGTTTTGGGCTTGGTTTAATAGCGGGGCCTATTATTGGTGGTTTTGCAGGAGAGATTTC
+ACCGCATAGTCCCTTTTTTATCGCTGCGTTGCTAAATATTGTCGCTTTCCTTGTGGTTAT
+GTTTTGGTTCCGTGAAACCAAAAATACACGTGATAATACAGATACCGAAGTAGGGGTTGA
+GACGCAATCGAATTCGGTATACATCACTTTATTTAAAACGATGCCCATTTTGTTGATTAT
+TTATTTTTCAGCGCAATTGATAGGCCAAATTCCCGCAACGGTGTGGGTGCTATTTACCGA
+AAATCGTTTTGGATGGAATAGCATGATGGTTGGCTTTTCATTAGCGGGTCTTGGTCTTTT
+ACACTCAGTATTCCAAGCCTTTGTGGCAGGAAGAATAGCCACTAAATGGGGCGAAAAAAC
+GGCAGTACTGCTCGGATTTATTGCAGATAGTAGTGCATTTGCCTTTTTAGCGTTTATATC
+TGAAGGTTGGTTAGTTTTCCCTGTTTTAATTTTATTGGCTGGTGGTGGGATCGCTTTACC
+TGCATTACAGGGAGTGATGTCTATCCAAACAAAGAGTCATCAGCAAGGTGCTTTACAGGG
+ATTATTGGTGAGCCTTACCAATGCAACCGGTGTTATTGGCCCATTACTGTTTGCTGTTAT
+TTATAATCATTCACTACCAATTTGGGATGGCTGGATTTGGATTATTGGTTTAGCGTTTTA
+CTGTATTATTATCCTGCTATCGATGACCTTCATGTTAACCCCTCAAGCTCAGGGGAGTAA
+ACAGGAGACAAGTGCTTAGTTATTTCGTCACCAAATGATGTTATTCCGCGAAATATAATG
+ACCCTCTTGATAACCCAAGAGGGCATTTTTTACGATAAAGAAGATTTAGCTTCAAATAAA
+ACCTATCTATTTTATTTATCTTTCAAGCTCAATAAAAAGCCGCGGTAAATAGCAATAAAT
+TGGCCTTTTTTATCGGCAAGCTCTTTTAGGTTTTTCGCATGTATTGCGATATGCATAAAC
+CAGCCATTGAGTAAGTTTTTAAGCACATCATCATCATAAGCTTTAAGTTGGTTCTCTTGG
+ATCAATTTGCTGACAATGGCGTTTACCTTACCAGTAATGTATTCAAGGCTAATTTTTTCA
+AGTTCATTCCAACCAATGATAGGCATCACTTCTTGGATAGGGATAAGGTTTTTATTATTA
+TCAATAATATAATCAAGATAATGGGTGATGCTGCCAACTTACTGATTTAGTGTATGATGG
+TGTTTTTGAGGTGCTCCAGTGGCTTCTGTTTCTATCAGC
+>NODE_21_length_1646_cov_41.9885:NODE_32_length_86_cov_81.3333';
+GCTGATAGAAACAGAAGCCACTGGAGCACCTCAAAAACACCATCATACACTAAATCAGTA
+AGTTGGCAGCATCACCCGACGCACTTTGCGCCGAATAAATACCTGTGACGGAAGATCACT
+TCGCAGAATAAATAAATCCTGGTGTCCCTGTTGATACCGGGAAGCCCTGGGCCAACTTTT
+GGCGAAAATGAGACGTTGATCGGCACGTAAGAGGTTCCAACTTTCACCATAATGAAATAA
+GATCACTACCGGGCGTATTTTTTGAGTTATCGAGATTTTCAGGAGCTAAGGAAGCTAAAA
+TGGAGAAAAAAATCACTGGATATACCACCGTTGATATATCCCAATGGCATCGTAAAGAAC
+ATTTTGAGGCATTTCAGTCAGTTGCTCAATGTACCTATAACCAGACCGTTCAGCTGGATA
+TTACGGCCTTTTTAAAGACCGTAAAGAAAAATAAGCACAAGTTTTATCCGGCCTTTATTC
+ACATTCTTGCCCGCCTGATGAATGCTCATCCGGAATTCCGTATGGCAATGAAAGACGGTG
+AGCTGGTGATATGGGATAGTGTTCACCCTTGTTACACCGTTTTCCATGAGCAAACTGAAA
+CGTTTTCATCGCTCTGGAGTGAATACCACGACGATTTCCGGCAGTTTCTACACATATATT
+CGCAAGATGTGGCGTGTTACGGTGAAAACCTGGCCTATTTCCCTAAAGGGTTTATTGAGA
+ATATGTTTTTCGTCTCAGCCAATCCCTGGGTGAGTTTCACCAGTTTTGATTTAAACGTGG
+CCAATATGGACAACTTCTTCGCCCCCGTTTTCACCATGGGCAAATATTATACGCAAGGCG
+ACAAGGTGCTGATGCCGCTGGCGATTCAGGTTCATCATGCCGTTTGTGATGGCTTCCATG
+TCGGCAGAATGCTTAATGAATTACAACAGTACTGCGATGAGTGGCAGGGCGGGGCGTAAT
+TTTTTTAAGGCAGTTATTGGTGCCCTTAAACGCCTGGTTGCTACGCCTGAATAAGTGATA
+ATAAGCGGATGAATGGCAGAAATTCGAAAGCAAATTCGACCCGGTCGTCGGTTCAGGGCA
+GGGTCGTTAAATAGCCGCTTATGTCTATTGCTGGTTTACCGGTTTATTGACTACCGGAAG
+CAGTGTGACCGTGTGCTTCTCAAATGCCTGAGGCCAGTTTGCTCAGGCTCTCCCCGTGGA
+GGTAATAATTGACGATATGATCATTTATTCTGCCTCCCAGAGCCTGATAAAAACGGTTAG
+CGCCGGGGTTGGATTTTTCAGCGTTCCAGCTAAGGCTAAGGCATTCCTGTTCAAGCGCAA
+GCCGGGCTATAAAGCGCATTATCGCTTTACCCGTGCCCTTATTTCGATCGCACTGAGAAA
+CATACAGCTCTTTAATATGCAGCTGACCGCTGTATCGGGGCGAGGGATAAAGAATATTGC
+AACATGCCAGGCCAGTAATGTTATTGCCGCAGCGCGCTCTGATCACCAGGGTACCGGAAA
+GCCGGTTGAATAACTTTTTACAGAGATAATCCTTCATCAACGCTTCCTGAATGATACCTT
+CGCCATAATAGGGGTCGTCTCAGAAAACGGAATCTATGGTCACTCCCGTTTTTGCAACAC
+CGATTTTGACGACAAGTTGGCTTGCT
+>NODE_21_length_1646_cov_41.9885':NODE_22_length_78_cov_98;
+AGCAAGCCAACTTGTCGTCAAAATCGGTGTTGCAAAAACGGGAGTGACCATAGATTCCGT
+TTTCTGAGACGACCCCTATTATGGCGAAGGTATCATTCAGGAAGCGTTGATGAAGGATTA
+TCTCTGTAAAAAGTTATTCAACCGGCTTTCCGGTACCCTGGTGATCAGAGCGCGCTGCGG
+CAATAACATTACTGGCCTGGCATGTTGCAATATTCTTTATCCCTCGCCCCGATACAGCGG
+TCAGCTGCATATTAAAGAGCTGTATGTTTCTCAGTGCGATCGAAATAAGGGCACGGGTAA
+AGCGATAATGCGCTTTATAGCCCGGCTTGCGCTTGAACAGGAATGCCTTAGCCTTAGCTG
+GAACGCTGAAAAATCCAACCCCGGCGCTAACCGTTTTTATCAGGCTCTGGGAGGCAGAAT
+AAATGATCATATCGTCAATTATTACCTCCACGGGGAGAGCCTGAGCAAACTGGCCTCAGG
+CATTTGAGAAGCACACGGTCACACTGCTTCCGGTAGTCAATAAACCGGTAAACCAGCAAT
+AGACATAAGCGGCTATTTAACGACCCTGCCCTGAACCGACGACCGGGTCGAATTTGCTTT
+CGAATTTCTGCCATTCATCCGCTTATTATCACTTATTCAGGCGTAGCAACCAGGCGTTTA
+AGGGCACCAATAACTGCCTTAAAAAAATTACGCCCCGCCCTGCCACTCATCGCAGTACTG
+TTGTAATTCATTAAGCATTCTGCCGACATGGAAGCCATCACAAACGGCATGATGAACCTG
+AATCGCCAGCGGCATCAGCACCTTGTCGCCTTGCGTATAATATTTGCCCATGGTGAAAAC
+GGGGGCGAAGAAGTTGTCCATATTGGCCACGTTTAAATCAAAACTGGTGAAACTCACCCA
+GGGATTGGCTGAGACGAAAAACATATTCTCAATAAACCCTTTAGGGAAATAGGCCAGGTT
+TTCACCGTAACACGCCACATCTTGCGAATATATGTGTAGAAACTGCCGGAAATCGTCGTG
+GTATTCACTCCAGAGCGATGAAAACGTTTCAGTTTGCTCATGGAAAACGGTGTAACAAGG
+GTGAACACTATCCCATATCACCAGCTCACCGTCTTTCATTGCCATACGGAATTCCGGATG
+AGCATTCATCAGGCGGGCAAGAATGTGAATAAAGGCCGGATAAAACTTGTGCTTATTTTT
+CTTTACGGTCTTTAAAAAGGCCGTAATATCCAGCTGAACGGTCTGGTTATAGGTACATTG
+AGCAACTGACTGAAATGCCTCAAAATGTTCTTTACGATGCCATTGGGATATATCAACGGT
+GGTATATCCAGTGATTTTTTTCTCCATTTTAGCTTCCTTAGCTCCTGAAAATCTCGATAA
+CTCAAAAAATACGCCCGGTAGTGATCTTATTTCATTATGGTGAAAGTTGGAACCTCTTAC
+GTGCCGATCAACGTCTCATTTTCGCCAAAAGTTGGCCCAGGGCTTCCCGGTATCAACAGG
+GACACCAGGATTTATTTATTCTGCGAAGTGATCTTCCGTCACAGGTATTTATTCGGCGCA
+AAGTGCGTCGGGTGATGCTGCCAACTTACTGATTTAGTGTATGATGGTGTTTTTGAGGTG
+CTCCAGTGGCTTCTGTTTCTATCAGC
+>NODE_22_length_78_cov_98:NODE_14_length_85_cov_140.75;
+GGGTGATGCTGCCAACTTACTGATTTAGTGTATGATGGTGTTTTTGAGGTGCTCCAGTGG
+CTTCTGTTTCTATCAGCT
+>NODE_22_length_78_cov_98':NODE_20_length_5859_cov_41.9915,NODE_21_length_1646_cov_41.9885;
+AGCTGATAGAAACAGAAGCCACTGGAGCACCTCAAAAACACCATCATACACTAAATCAGT
+AAGTTGGCAGCATCACCC
+>NODE_23_length_1411_cov_42.084:NODE_26_length_130_cov_84.9811;
+TCTGGCGATTAAGGGGGTTAAATTCCATGGGACACGCCCAGCTTTCCTCCATGGTCTGGC
+GATTAAGGGGGTTAAATCCCACGGTACCCGGCCAGCTTCCCGCCATGCTCTGGCGATTAA
+GGGGGTTAAATGCCAGGATACGCGACCAGCATTCCCCATGGTCTGGCGAATAAGGGAGTT
+AAATACCACGGTACCTGACCAGAATGACCCCATGTCCTGGCGATTAAAGGGTTAAATGCC
+ACGCTACGCGACCAGCCTCCCCATGGCCTGGCGATTAAGGGGGTTAAATGCCACGGTACC
+CGACCAGCTTGCCTCCATGGTCTGGCGATTATGGGGGTTAAATCCCACGGTACCCGACCA
+GCAGGCACCGTGGTCATTGGCTAAAGGGGAAATTGCCTCGGCTTGCAGACAGGACAACGT
+GACGCCCTAGCGGTTAAGTGGGTTTAATACGACGGTACACAATAAGTATCCCACCAGAAT
+CTGTCTATTGAGTGGATTAGATTAAAAGATATTCGGCCTGGATCTCGACTTAGAATGACG
+AAATATTTGGCAAAAAAATAGGGTATTCGGCAAATCCTGTTGTTAAGACATCCCGAATAC
+CCAAAAAATATTTGGCAATCAATATGAATTGCCCATACCCACAATTGACAATAAGAGAGT
+TTTTTGGCAATTCGTATAATTAGGCCAATTCATCCGTGTCGTCTATTGCACTAACGAAGT
+ATTCCGTGCGGTAGTCATCTCCCCCCCTCAACTAGACTGAAGGTGATCCATCTTTTGCAA
+GCGTACGGTCACCTGACATGCTGTCCGCTCGTACAGGAATTGTCATGCATTCTTTAATGG
+TATCTGCTTCAGCCACGTGTCCAGTACACTGGTTTTCAAATCCAGCAACTACTACATACG
+CATCCGGGTCGAGCCTTTTAAGCTGGTCTATAAGCTCTTTTACTTTTATGGGTTACCTCT
+ACGTTTTTGTATATTTTATCACGCTGAACGGAAGGGCGAATAACTGTAGTGAAACAAAAA
+AAGTTTTGGCCGGAAAACCTTTTAGACTGGCTTTCCTTTAGCAAAGAACTGGTGAATAGG
+GGAGCAATTCCGCGCTACGCAACCAGCATCCCATCGTGTACAGACGAGTAAGTGGTTAAA
+TGGCCTGGTACCCGGCAATAATCCCTCCATGGTCTGCCGATTAAGGGGTTAAATGCCACA
+GTACCCGACCAGCTTCCCCCCATGGTCTGGCGATTAAGGGGGTTAAATACCACGGGACAC
+GACCAGCTTTCCTCCATGGTCTGGCGATTAAGGGGGTTAAATGCCACGGTACGCAACCAG
+CTTTCCTCCATGGTCTGGCGATTAAGGGGGTTAAATGCCACGGGACACGACCAGCTTTCC
+TCCATGGTCTGGCGATTAAGGGGGTTAAATT
+>NODE_23_length_1411_cov_42.084':NODE_26_length_130_cov_84.9811';
+AATTTAACCCCCTTAATCGCCAGACCATGGAGGAAAGCTGGTCGTGTCCCGTGGCATTTA
+ACCCCCTTAATCGCCAGACCATGGAGGAAAGCTGGTTGCGTACCGTGGCATTTAACCCCC
+TTAATCGCCAGACCATGGAGGAAAGCTGGTCGTGTCCCGTGGTATTTAACCCCCTTAATC
+GCCAGACCATGGGGGGAAGCTGGTCGGGTACTGTGGCATTTAACCCCTTAATCGGCAGAC
+CATGGAGGGATTATTGCCGGGTACCAGGCCATTTAACCACTTACTCGTCTGTACACGATG
+GGATGCTGGTTGCGTAGCGCGGAATTGCTCCCCTATTCACCAGTTCTTTGCTAAAGGAAA
+GCCAGTCTAAAAGGTTTTCCGGCCAAAACTTTTTTTGTTTCACTACAGTTATTCGCCCTT
+CCGTTCAGCGTGATAAAATATACAAAAACGTAGAGGTAACCCATAAAAGTAAAAGAGCTT
+ATAGACCAGCTTAAAAGGCTCGACCCGGATGCGTATGTAGTAGTTGCTGGATTTGAAAAC
+CAGTGTACTGGACACGTGGCTGAAGCAGATACCATTAAAGAATGCATGACAATTCCTGTA
+CGAGCGGACAGCATGTCAGGTGACCGTACGCTTGCAAAAGATGGATCACCTTCAGTCTAG
+TTGAGGGGGGGAGATGACTACCGCACGGAATACTTCGTTAGTGCAATAGACGACACGGAT
+GAATTGGCCTAATTATACGAATTGCCAAAAAACTCTCTTATTGTCAATTGTGGGTATGGG
+CAATTCATATTGATTGCCAAATATTTTTTGGGTATTCGGGATGTCTTAACAACAGGATTT
+GCCGAATACCCTATTTTTTTGCCAAATATTTCGTCATTCTAAGTCGAGATCCAGGCCGAA
+TATCTTTTAATCTAATCCACTCAATAGACAGATTCTGGTGGGATACTTATTGTGTACCGT
+CGTATTAAACCCACTTAACCGCTAGGGCGTCACGTTGTCCTGTCTGCAAGCCGAGGCAAT
+TTCCCCTTTAGCCAATGACCACGGTGCCTGCTGGTCGGGTACCGTGGGATTTAACCCCCA
+TAATCGCCAGACCATGGAGGCAAGCTGGTCGGGTACCGTGGCATTTAACCCCCTTAATCG
+CCAGGCCATGGGGAGGCTGGTCGCGTAGCGTGGCATTTAACCCTTTAATCGCCAGGACAT
+GGGGTCATTCTGGTCAGGTACCGTGGTATTTAACTCCCTTATTCGCCAGACCATGGGGAA
+TGCTGGTCGCGTATCCTGGCATTTAACCCCCTTAATCGCCAGAGCATGGCGGGAAGCTGG
+CCGGGTACCGTGGGATTTAACCCCCTTAATCGCCAGACCATGGAGGAAAGCTGGGCGTGT
+CCCATGGAATTTAACCCCCTTAATCGCCAGA
+>NODE_24_length_52213_cov_42.1417:NODE_14_length_85_cov_140.75;
+TCTGGCGATTAAGGGGGTTAAATTCCATGGGACACGCCCAGCTTTCCTCCATGGTCTGGC
+GATTAAGGGGGTTAAATGCCACGGTACGCAACCAGCTTCCCTCCATGGTCTGGCGATTAA
+GGGGGCTCAATGCCACGGTACCCTACCAACTTTCTACCATGGTCAGTCGATTCAAGTGGT
+TAAATTTCGTTATTGAATAAGCTTAAAATGGTTTCTTATTCCAACCAGAAAGTTAGATGG
+TTAAGTTATTATGGAGATAAGACCTGATCTTACTTGTTTTTTGGTTGTTTTAACAAACCA
+TTCACCTTAATAATATCTACGCATCGCATAACAGTTGCATTCTCAAATCTAATTAACGTA
+TAGTTTATACAACCATCATCTAGATATTAGATCCAATTATTTCAAGGACTTAAAAGAAAA
+AACGACAAATTCATCTATATAATGGTTATTTATTATAACCGTAAAAATGATGTTTGTATC
+TGCCATACAAAAACCACACCCCCTTGGTTGGTTCTTGTACCCAAAACATAATACCTGCTC
+TGATTAACTTCACAGCAAAAGCCTGGTAGGGAGAATAATTCTGGAGTAAATTTCATCATA
+TTCATTCACCTTCAAAAGAAGAATGACAAAGGCATCGAATTTCATGTATGACGGTTTGAG
+AGGACTTAATCCGAGCTAGATATTCTTAACCCGGGCTATTATTTCGGGGGAGGGCAGGCA
+ATGACAGCTAACAACTATTTACTTCAAAGACGTACTGGATACCTCAGTCAAAACAAAATG
+AGGTAACCAGTAACTTAAAACGTCAGGCAGCTGATTTGCTCGCAACTTCCTGTTCGTACA
+GAATCTCAATTGCTTCGCCGTAAGAGCAATCAAGTCGGCTTTGGATTTCCCATAGTTTTC
+CACGATCGGTGCTGTCAGTCGTAAAGCAAAGCTCCATTTTTCTATCTACATAGAGGCGAC
+ATATCTCCTGGAAATTTTCGAATCGTACGAGCATCTCGGAAAATGCACGCTTTACCGTTC
+GAATATTTTTCATACGCTCATATTCCGCATCAGTTGTGGAGAAGTAGTTGTTCACCTTCA
+TGGCTTCAATACTTTCCTTTTCCTGCTTCATGATGATCTTCCACGGCGAGTTAGCCGTTA
+GTGCGCGACCAACCGATGAGGTGAAGTAATCTTCAAAGGATTGAGTAATACAAATACCGG
+CACAGTTCGTTTTCCTGAATCGGCGCCAAGCGGCCTCAAGGAAAGAGGAGAAAAATTGAT
+TTGAATGATTACTGGAACCTGAAGCATTGTCCGGACGGATATACTCCCATGCCTCATCAA
+GTATGAACAACCGGCGGCGTCCGTCTTTCTTGATAAACATTGCATGCTGAGCGGCCTGAA
+TAATCGACATCAGAACGACAGTCTGAAGGTGTGGGGTCCCCTTCAATTCTTCAAGTTCCA
+GAACAATAAACCGGCTATCAAAATTTATTGGCGGGAGATTTTCTGTAAAGCGATTCCCAT
+AAATCCCTCCTTCACACCATTGCCCCAACTGGTCACCGATATCTTTAATACGCTTATCTT
+CATGGTTAGAACAGCGTCGCGCAAATCCAGTAATAGAGCCTGTACGTCCAACTTTGCGTG
+ATTCGTTATATTCTTCACTAATCAGTTGCAGCATGACCGATTGTTGAAAATCGTCAATAT
+TTCCTTTTTCAGATGCCATTATTTTTAACTGGTTTAGAACCATAATGGTCTGGGCTACTT
+TATCCTTATCATCATCATGATTATTTGAATCGTCATTAAAGACAGGTGCTTCATCAAAAA
+CACGCTCTCCAACAGTCACATCAGTCAAAAATGCGAATGGATTTAGCGTAAAATCAGGCT
+TTTTCCCAAAGTCTATAAACTGACTATTAGTATATTGTTCCGAAATACCTTGGTATGAGC
+GTCCGACATCAACTACGAAAATCTGGGCTCCATCAGGGTCAAATGCATCATAAGAATTGT
+TTTTGAATCCCTCAAAAGTATCTCGATAATGGATCAGATTATTAGAACGCGGACCTGCGC
+CTAGATAATTATTAATGATGTATGCGACCCAGAATGATTTACCAGCACCAGACGTTGCAC
+CAACGACCATGTTATAGCTGGCAGAAGTCTTGAAGATATCCAGCCCCAACAGCTGTCCTT
+CTCGTGAGACAAGGTTAAGTACGGGTCTGTCCGTATTACCTTTCCAAGGACCAAATATGG
+GGGTCATGTGCGCAGCACCAGTATTACTCACGACCTCAAAACGATCCAGTTCTAGTATTG
+TCTTTGGGTCATTACACATCGGCAGGCTTGAAACAAATGAGGGAAATACTATGTACGAGT
+CATCAGCAACATTAACACGACTTTCCAGATAAAATGATTTTAACTGGTCTGCGGCAGACT
+GAACATCAACTGCTGAATTCCCCATTACAGTAAATGTCAGATAACTGTGTAGGAGGCGAG
+CCCCATCTTCCAGTTCGCGTGTTATCGTCATGTAATCATTATCCATATCCTTTAATCTTG
+GACAAAACGTCAAAACTGTTGGAATACTGGCTTGTTTGTTAGTAATTGCCTTATATCTGA
+CGTTTTCTCTTGATAATTTTAAAGGATCGGCGAAATGGACAGTCTGGGTTATCATGAAAG
+GGCTAAAGATCGTTTTACGTCCATTCAACCAATTAACTACAAGTTCATACATGCAGCCAA
+AGTTTACAAATTCTGGAAACTTCACTACTGATAATTGTTTGAAATAACGATGCTCAGAAA
+TATCATTGCTCTGCGTTGTAGATGAGAAATGATTCTCTGTCACTGTATATTTTCGACCCG
+GTACATTGATCTGCTCGTTTAGGCGTCTCATGGTGCTAGCTTCAACATGACCTTCAGACC
+AACGCGATGTTTTTCCCGGATGCAATAACTTATCCATGCAATAAAGCCAATTTTCAGCAC
+CAACTTTGTGTGGGAAAAGGCCTACTGTATTCAACTTACTGATTAAGTCAGAGTAAAGCG
+CATCAATGCGACTCTTTTCTATTTCAGAAGGAAGTGCTGACTTCAATGGAATTGAAAAGG
+AAATCCAGACCTGAAAATCTCGAAGCATCAATTTATCGTGGTCCGGCTTCAAAGGTTCAT
+TCAGGCTTCGGTCATAATAATCCAGTTGATATGCAGTGAGTAAATCCCCCTTAAGCTTAT
+CATGACCTTCCATTCGACCACCACGAACGGCAGACCAGGCACTTAAGTGCAAGATCAAGT
+CTGGCAGCGCAGTTAATGAGGTCTGACAGATGGTGTCAGTTGGGAAGTCCATTTTAAATA
+ATTCAGTTAACACATCCTGCTGATTATCAAAGACACCGGGCGACGGACTACAGATAAACA
+TAAAACCGAGTCGGTTTCCGTCAAGTAGAAAATAATGTGTACCCGGAATCTGATCATACA
+CGGGAATAAATCCACCTAACTGATGACGGCTTAATTCTTTATTATAGACGTTAGCTGATC
+TCATTCGTGACCTCAGAGTTGTCTCACAATACCGTTTGACGAAACTGCTTTCGTTGCTCG
+CTGTTGCTGTTGCATATTTTCACGAGCCGCATCCTGGACTTCCAAAGGAACAATTCGTGC
+CGGATTTGATGTTGAATTTTTGCCCGCAATCCAAGTTTGCGGTTTGACATTCACATAAAC
+AAAGCCAGGCAGATTTAGCGCGTCATTATCATCCGTATATGGTGCAAAGGTGATTCTCAT
+GACGCGGCCTTGCTGAAGCACAGCAAGAGGCTCTGGTGCAACGACTGCCTGTTTGTAGCC
+TTGTGTACGGTATTGCTGTACCTGCCCAGAGCTGAGCGTAGGGTTTACTGGCTGTCCATT
+GTTAATGGAATAAAGGTCTTTACTTGCATTGATATCAGAATTTGGTGCTACATAGCGCGG
+TGCAGGCGCGGGAGTAACAACCTGAGTTGTTTTTTTCACGACTTCAGCAGACGGATGCAA
+AAAGGGGTTAACGGATGACCCATTTGAGTTGTAACTCGTTGTCATCCGTACATTAGAATT
+AACAGGATTCCCGCTGATTGGCCGTGGTCCAATTGTTGAAGTTGGCGCCCCCATTTTTAA
+TGTCTGATCATACATCACCGGGAGCTGTCCAACCGGTTTTACTTCCGTCGTTGTGTATGT
+CACTGGCTTATTAACAAGTACAGACGACTTGGGGTACTGCACTGCGCCAGGCGGCGTTAG
+TTGGGCAGGGTACTGGCTGTCATTGACAGCCGATTTCCCCTTTCCCGAATTAGCCTCTTC
+CTCCCCAAGGCCGGAGAGATCATCACGATTGTTCGTCAGTTCCATAACTTCACGCGGGCC
+TTTACAAATAACTCCTTTTTCAATTCCCGGGCATTCAGATTCTGCGCTGCCAATAGTACA
+ACCCGCCAGGTATGAAGATGAACCAACAACCAGAGCGCTGAAAATAACTTTTTTAATGTT
+CATTTCATTACCTTAATTAGTATCAAATGGGTTTTTGAGTAAGGGTTCGACACTTTGTTT
+TAACCAGTAATCAAAATCTTTCGGTATGCCATTACCAGCGAGTCCATCCTGTCTTACAAC
+TGAGGGGACTCCCTGTAATTTATAAATGCCAGCCAGCATTAATGACGCGACTAACGGTTC
+AGCCGGACATGCTTCTGCCTCTTCTTTCGTCAGGAGTCGTTTTTCTATATCGGCCTTATT
+ACCCATAAGCCAACGCAAGATATCAAGATCATTCACTTTGCCTTTTTCTTTACTGCACCA
+TAATTGACGCAATTCCTGCTTTGGCTCGCCGGGGGAGGGGATTAAAACTATATCGACCCG
+ATACTTTTCGCGTTCATCATAGAATTTCTTTATTAAATCCTGACAACCGTCACAATCAAG
+CGTAATAAATATTGCCGCTTGACGTTTGAGTTTTGGGTTTCCTAAAGGTATCGATGCCAC
+AGTTTCAAGAGGGAAAGGGGCGTCGTCTAAATTAATAAAGAACGACTTTCGTATATCCTC
+TACTGATAACACTGACTTTCTCTGAAGAATGTCCATGACGCTCCCCCCCGTGATTGTATA
+CCGTCCGTCAGTGGTCACCGCCATCAACTGAGAACGTTCATCCTGGAACAAATAAAGACC
+GCCAGTAGGGATGTAAATAGCATCTTTAGGCTTATAGCTTTTCATTTTCGCCAATACACC
+GTCTAAAGGTTTCGTTGATACTCCACCTTCTTTTGCCTTTTCCATTAACGCAGCGGCATC
+ACGATTGTTTAATACATTTTCAACAGCCAGAGTAAGCGGCGGGCACGCTGAGGTAATGGA
+AATCAGCAGAGACAAAAGTAACTTTTTCAATTATCGAATCTCACTTTCTTTAGGTTCGCC
+TGGAAGAGATTGTACCTCACCAAAACTTCCACCAAGGTCGATATAAGAGACTATTTCAAC
+ATTCTCTGGAATAGTTACTGCCAAGGATGCATCAATAACCAAATAGCCACGTTCACGGTA
+AACCTTCATTAATGCCTTAAAATAATTTTCAAAGTTAGTTTTGGATTGCTGCGAATCCAA
+CACCGGATTTTGCTTATTAAATACTTTTCTTAAAGTTTGCATATCCAGCACGGCAATCTG
+GTAGGCCGGTTGCGACATTGCTTTGAAGTTGTCATATACAAAACGTCCACCCTTGTATCC
+ATAGATCACGATAAGAACTGCCAGGCCTGCGACCATCAGATACTTAAGAGTTTTCTCGAT
+ATCGATCTCTAAAGTTACTTTTTTGGTAGTACGTATACCCCCAACCGGTTTAGCCGCGTC
+GATATTTAAGCTATCAGCAGACTCACTCTTTTTTGGTGATTCATTGTCGTTGTTATTTTC
+CATAATTATTCTCAGCGGCTTGTCAGGTTTGTAGGTATTGTCGCCCCTTTTTGAACGACA
+AAAGTAATTGGGCGCCCTGGGCTAATTTCTACAATTGGCCACTGCTGCTCAGCTATTGAC
+GTATAGTAGTCCACAAGACGGTTTAGACCCCCCTGAGCTGCACCGGCTCCGGCCAGCGCT
+CCTAATGCACCTATGTTTGGCGATTGGTATTGTGCCGTAGAGTTTGGATCTATATTAAGC
+GAAGACACCTTTGATGGACTCAGACTCCCCGCCAATGCTGACAGCCCTCCTGCAAACGCA
+GAACCTGCAATCGCATTTCCATTTCTGCTTATCAGATTCCCACGAATGCCATTTTTCCCG
+TCATTTTCACTAACCGCATAAGCTTCCACTATTACGTCGAATGCTTTTCCTTTCGAGTTG
+ACACACGATATGGAGGTTGCCCTAATGTACGCACGCTGAGATGCCAGATCCCCCACAGCA
+GAACCCAATAAATTACAATCACGCAAATCCATCGTGTAATTGTTAGGCATGATGATGTCT
+TTTTTAATGCGCATGGTAACCGGCATCGGTTCTGCTTTAGAGGACAAACTCGTTGGAGCT
+TCCAGCCCGGTAATTAGCACCCCAGTAATAATTGACGTCGCTGGAAGAAACATTTCATCC
+TTACGGGCCGCATGACGAGCTTTACTATCAACAGGTGCAGTCCCATCGCCGCGAATAGTT
+CGCGTTGGGGCCTTTTCACTTCCCGCAACAACCTCGCGCCCCTCTCTGATCCGGTTCTCT
+GATATCGGCATCACCTGAATGACACCATCAGTGCCGTTTGTCTTAATTGAACTCTGTGTT
+ATTGTCCGCATTGGACTGTTTCGGGTCGGAGATATAGGTGCGTATCCAGAACTAACCCCG
+TTCACCGCTGCATTTGGATTAAGCTGGTATGGCTTTGCTGGGGCTTGTTCATTGACGTTG
+TTGCGTGGTCCGCCTGCATCGAGATTGCGATTACCATTTCTTGAGGTCTGCATTTCAGTC
+AACTGCGTAGTGAGTTGCTGAACTTGCGAAGCAAGACTGGCTATCTGTGCTTTGTTTTCT
+TGCTGAGCCTTTTCAGCTTTGTCACGGTCAGCCTTGGCAGCGTTCTGGTCAATACGGTTC
+TGCCTTACCATTTCGTTATAAGTCTTCTGGCTTTCCTCATTACTCAGCTTGTTCATTTGT
+GAATCATCAATAAGGAATCCAGTTTGCATATCTTTTTTCTGGGTTTTCTTCTCTTTTTTA
+ACTGGTGTGGTAAAGATTGATTGACTGATGACAACAATCAATACCATCAATGCAGCACCA
+ATTACTGAGATTCTGACAGTTTTATTTTCCCAGGCCTTTTTAATGTCCATTATTAACTCC
+ATTCTTTGGTTGCTGGAATCGCTTAACTTTCAAATTCCGCTCGTATTCTGTCATCTGAGG
+CACGATATAAGGTTCACCAGCCCTAGGCCATTTATCTCCAACCGTCAAACCTGATTTATC
+AGACTCATCATGAATAAATTTCGAACCATTATTTTGCGTGCCCAATTCTTTTATTACATT
+AACTTCATGCCGACCGACAGACTCGGTTGAACTTCCAACAAATTTATCCGCAAGCGTTGG
+GTCGCTTATAACAATCGTGCTTTTCTCAAAGGCATCATCAACGATCTCACCCTGTCGGTG
+GACATCAGGAAATATATTCACGGTGCCTTTCGGGATATACTTAGTTTGGTAGTAATAACT
+GGTACCCAAAAAGACAACTAAACCAAACGAGATCACTGTAAGAAAAGTAGCTTTTCTCAT
+ATTATCTTTTAATCAGGCTTGGGCGCGTAGTAACACGAGTCTGACGCTCTTTAAATAATT
+TATCCCGCACAATATAAAGTTCGGTCTCTTCCCCGGGCTGAAGGAATGCTTTATCGAATA
+GAGCGCTTGCAACCACGCCTTCAGTTATACATTGCTGATCAGCCACTACCTGTCCGTAAG
+GCTTATCATTCTTAACAAGAACGACATCTATCAATTCCCGAGATCCCACCAGTCTTTGAC
+CTAACTTGGCGTACATATTGAAATTACATGGGGACTGCTCTGAGCTTGGTATGCGTGACA
+AGCGGTCTTCTTGTAAACTGAAACCAGAAGGAACCTCACCCAGTGCAACCGGAGTCAACA
+AATCAATGATCCGCTGTTTATGGTCATCCTGCCGAGGGTCTGAAGGAGTCAACTCTTCTG
+ATTGTGAGCGTGCCAGCATCTCATCATAATTTTGTTTATCAAGAGAAGTTTCTCGTTTTG
+CCTGCATTGTCGGGCTCAAAGAAGTTGTTACTGAAATCATGGCCCCTGGTACATCCAGTG
+GAACCAGTGTCAGGTTATAAGTAGATTCAGGAACTGAATCTTCTGAAAGCATAATTCCTA
+TAGGCTTATCTGTATTTGTTGAAATAAAAACATCCCCGCCATTAACGAAAATACTGGCTT
+CATCAGCTGGCGTTGAAGTACTTACAGATGCATTTTTAAATGAAGTCGAAATTCTGTTTT
+GCAGCCCCCGAGAAACCGGGAGTACAATATTGCCACCAGGCGGAACGTTTACTCGTTGTA
+CTTCTTTATAGCGATTACGTGCTTCAACATAAAGTTCATCTGCCTTTGAAGGGGACCCGG
+TACTTTGTGCATTTTGTTGAGGTTCTTTCCCTGCTGGTCTTCCGTAACTATCAAAATTTC
+CTGATTTAACCTGTTGCTGGTAACCAGCTAGAGTAGGGTTATTTGACAACGCCCCGGTTA
+TTTCATTGACTGCGGGAGAAGCACTGCTTGCAGGTGAAAGACTTGGCAGAGCAGTTGTCG
+GTTTTGTTGCTTGTACGGTCTCAGTCGTAGTGCCAGTGTCTTTAATTATCGCATTTTTCA
+CACCGTTCTGAAATTCATCGGCCCCGACAGGCATAACTACCGGATTATTTACTGTCGCCG
+GTAACTGATAGTCTTCAGCAAATACCACATTCGAAGTTGCCAGCAAAATCACTGCTGTAA
+TCGCGGTGCAGTGAAAAACCTTTTTTGAAGTCATAATTAGTTACCTATTGACGGCGGCGG
+ATTATCGAGTGTTGCCAGTTGTTCTTTGCCGTTGATTGTAATTTTCTTAATATTTGGTGT
+ACCTGAATACTGGTTCACATAGGCTATGCGCGGTCGTCCATTTTTCATTCCCAGGACCCA
+TTCAAACGTCCATTTGGATGATTCAGTTTTGTCCGGAACATTAATCAAACGAGTTGACTT
+TGTTCCCCAGACATAGACCATGTCATTTTTGGTGTCGTAATACATATCGATCGGCTTAAA
+TGACTGCTCTACACCACGAGCCTGCATTATATTGGTTTGCTGCTGTAGTGATTCCCGGGT
+CTTTGCCTGTAAATCCGGAGAAAGCGCATCCAATATAGTTGTTGTAACAAAACCGATGTT
+TGTTGGGTTTATGTTTCCAATCAAAGTACTAAAGAATAAGGCCCACTGCGTTTTATATGA
+TTCTGAGGCTTTATTTCCAACAACTTTGACTTCTTCCGTCATATTTGGCGGTAGCACTAT
+AGTCACAGGATCAGTGAGAAATTGATTTTTTACAACCAGAACCCCAATAATGATCATTGC
+AACTGTATTCACACGTAGGAGTTTTTCGTCGCGTTTAATCAATGCACTATATGTAATTCC
+AATTTCAGAACCTTCAATTTCTTTACTAAAGCGTGCTTTTGAATCCAGAAAACTTCCTTT
+TACTTCTTCACCTCCTTTTTGCGAAGTCTCATCCTTGTTATCAAAATCGCCATTACTGGA
+ATTTTTAATGAATGGAATTTTTAACCTGCTGAGAAGTTTCATTCTTAGCTCCATCAAGAA
+TAGAGGTTTCTGATAAATGGATCGGTAAAGTAACGACTACTAAACACCGATTTTCCAGGA
+AAAAAGCCGTACCACCACAGTTTGTGTTTTAGTTTTCCTCTAATCCCTTCCTCTGCTGCT
+TTCTTATATGCAAACCAGAACACCACCGCCACAACTACCGAAGTTATAAAGAAATCAAAA
+ATATTACCGCTCGCGATAGTCACGAATGTTATACCCAATTGCTTTGCATCCCAGAATAGA
+ATTAGTAACGGCATATTTATTCTGTATGGAAAGCGATATGTATGTGGCGGTATCTCGTAC
+TGGCTTGTCATAAAAACTCCAGAGAGGGGGAATATCCCCCTCATTGTTATTGTTCTAACA
+AATCACAGAGGAATACCAGCATCCAGGAACGAGCTGATAATTTTTTCACCGTTTGCCATA
+ACCAGCATCATTAATGCTGATACCAGCGCCAAACCAAGGTTAGGTTTTACAACGCCGAAA
+TAAGCCACCGAGAACAACATGCCGCACGCGATGATTTTACCCGGCGCACCAGTCAAGGCT
+TCGCTCATGTAGGCCCAGATATCGCCGAAGGCTCCATCATCGGAACCCGCGTACGCAAAA
+CTGCAATTTGCTAAAACCAAGAGAATAAACAAAGGCACTTTTGCATGTTTGGACTTCAAA
+AATGCAAAAGCGTTAGTTTTTCCTCTTTCAACGTTAGTATTCAATGTCAGTTCCATAATT
+ACTCCGTGTTGATTTGAATTCACGAAAACGCATTGGCATAATACTTTTTATTTTTCTTTC
+ATTTTTCTGTTAACCACCTTTTTTTTGACTTAATTGCGCTTGGTGTTTTTTTAGCCATCG
+AATGTCAGAAAAGAATCCCGCATGTAATCGGATTAAAGAAGGTGCGTTTAATTAACATGC
+CAAATAGGGAAGAGGGGCATCGTCTGCCCCTTTACCATTTTTATGGCATTCATCCAGCCA
+GATATTTAACAAAGGACACGGTAAGGATGACATTCCAAAAGTCACTTTTCCCCCATTGAT
+GCGAGTGCTTTTCACCCACAAGGATTATGTATCCCCCATTCATACAAATGCTTTTCAATG
+AAAGCCACCTCTGCGGAGCACATTCATACGAATGCTGTTCGATGAAAGCAAAACTGCGGA
+GCTCATTCATTCAAATGCTGATTGGGGAATGCGCGTCTGCGGTGCCCATTCATTCAAATG
+CTTATCGTAAAAGTCACTTCTTCTGAATCCATTCATGCAAATGCTTTTCAAACAAAGACA
+CCTATCAGGGACTCATTCATGCAAATGCTTTCCAACCAAAGGCAACTTACACTTCCCCAT
+TCATTCAAATGCTTTCCGACCAAAGGCAACTTGCATTCTCCTATTCGTGCAAATGCTTTT
+CGAACAAAGGCACCTTACACTGTCCCTTGCGAGCCCTGCTTCCCGACCAAAAGCAACTTT
+CACCGCAGCATTCATACAAATGCTTTTTTCAAAAGGCACTTTTCTGCCGCCATTGAAGCA
+AATGCTTTTATACAAAAGGCACTTTTCTGCCGCCATTGGAGCAAATGCTTTTATACAAAA
+GGCACTTTTTTGCTCTCCATTGAAACAAATGCCTTTCATCTCCTTGATATCCAATTTGAG
+TAATTTTCATTTATTATCAGAATGTTATGTTATTTCTCTAGGTCCTTCATTGGCCTGCAT
+ATTCATAAAATGCCGTCGACCAGGCTCATATCCCAGTCGTTTGCAGGCGTTAAGGAACTG
+TAAATACGCCGAGTGGCACAAGGAGTATAGGGATTTGCGTTTAAAGCCCAATACAACACG
+ATGGAGGGTAGTGTAGTTAAAGGCATATGTATGAATGAGTCTTATTAAACTAGCAAAATG
+AATAGGTTACGTTGTCTCAACTAGCAAGCATGATTTTTTCTGAAAAGCATTCGAACGAAT
+ACCAGAAGAACCCGGGTATCAGAAATGATAGGAAGTTTGGAAACAGGGAAGGGTGTTCAA
+ATCCGGAGAAACATTAAAAAGCATTTGGATGAATGCCCATACTCCTCATTACATCCAAAG
+TAACTTTTGTGCGTACTATACCCGGAGCATCAACTGTGTTTTGCCAGAGCAAGTTTTGGA
+CTTCTTTTAAAAATCTGGAACTGGATATCTCTACCTTTCTTAACCTCTTGATATTCAAGA
+TATCCTATTGATTTTAACTCCAGCATCGCCTTCCTGATGATCTGGTTTTGAGTTCGTACA
+GGAGTCGTCAACAGAAGTCGCTCACGCAAACGCTTCATGCTTACGAATAACGTACCGGCA
+GGCATCGCCTCAAAATATATGTACAGGCTTTGTGCTGCCTCTTTTTTAGCGAGAACCGAA
+AGCACCTGCAAACTAAGTAAGGTTTTATGATCATACCGGTAAAGCTCCCACATTGAGGGA
+TCGCCCACCAACTCTACGGTGTCCTTCTTAGGATCAATCACTGCTTTCTGCACAAGGTGC
+GTGACAGTAAAACGTTCAGTTTTTGAATCACGGAAAGAAATCACAACGGAAGCTAGGTTT
+GCTAGCGCCTCCTGAAATCGTGAGCGAGTTCGCTTGTTTATGTTTGTAGAACTGATACCA
+CACATTTTTGCAAACTCATTGAATGACAATGTGATTTTATCGGAAGCGAAACCATATTTG
+CTGAACGCCATTATGCAACCGAGCCAACACTTAAAATCGGTTGACATCGAAAGCTTAAGA
+CCAGTGATCCGAATGTCATCGTATCCTTCTGAACGGGCCAGCTCCATGCTCGACAACTCA
+TCAGAAGCGTCAACCTCAAAATTTCTGTATCGCTTCTCTTTAGTTCCCACCGGGGTAAAA
+ACACTTAAGCGCAGTAAAGCAATGGGTTGGACCGATTTCGAAGAGTTTGGACTCAGTTGA
+TAAGTCTTCCCTGTCTCCGTGTTGGTCACATCAAAAGGATGTGTTACCTCATTGTTATCA
+CTCATTTAAATTTACCCACCATGGTTTATCCCTTGATACATTTAGATGTGAATAGATTAT
+TCGTGCAAATGCTTTTCTCGCATTAAACTAAATGCCTTTTCAATTCAAGTAAATGCTTTT
+CTTATTCAATCAAATGCTTTTTACATGCACCTGAATGCCTGATCATGCTTATTCCATAAT
+AAAATCAGTCATTTACGGAACCTGTGATCTTTTTTGTACTCTCTTGATCTCTCTTGATCT
+AAAGAATTGATCTAACTTGTGGAAAACGTGGATAAATTCCGTCTGTTAACCAACTCTGAC
+CTAAAAAGTTCAGGTTCGGACTCTAGCCAAGTAGGGAATGCAGCCGGAAGAAGTATCAAT
+CAATCTTAAGCTTTTAAGATATATTAATTTCAAACCATTCAGATTTAAAAATTTCAAATT
+AAAATGGCCTAATTCCTTCATAACTAAAATTACAGTCAAGCACCGAATTAATTGTTTTTT
+GCTTTTGGGTTATTTGAAACTGAGTCAATTAATGTATCATGTAATAAAAAGGAGGTTATA
+TGAATCACTGCGACTATCAGATTATTGAGATCAGTCCTAAAGCACTTTTTATCGAATCTG
+GATTCAATCCACGTGAAGCGGTAATTGGTGAACTTTGTTATGAACAGGAACCAGTAAAAT
+CGACCATTGTTTCTATTAAACAAGCCTATAAAGAGGGCAGACGAGTCGATTTAATTAAGG
+TTGTTAAGAAAGACTCCAATTACGTTGTAAGGCAGGGGCATTGCCGTTACAGAGCACTAT
+CTCTTGCTCTTGCGGAAGGAGCTGATATTCAGCTCATTTCAGTAGTTGTTATGAACTATA
+AGAATAAAAGTGAAGAATACCTGGAGAACCTTGATGGGAATAGGAATAACGGTCTTAATC
+CCGTAGCCTTAGCTTATGCACTGGCAGAGGCGCTGAAGCTTGGCTCTACCGTTGAATCCC
+TTGCTATGCGCTATCAACGGTCTAGCACTGCTATTCGTAACCAGCTTAAAATCCTTGATA
+TGCCTTTAGAACTACAACGTTTAATCAGTCTAAACCTGATTAAAAAAACACTCGCGATTG
+AGATCATGTTGAAGTATTCCAATGACCATGCAAAAGTCCTTGCACATTTGGAATCGTGTT
+CTCTTTTAGTACCATCAACTGAACCAGAACCTGTTTTATCTAAGACATCAAGCGTTCAAA
+CATCATCAAACGATGAGAAACTAGATAACCCGGAAACACTCCCTGTTCATGTTATTCCTA
+AGGAAGTTAAAACAAAATCCATCACTCGCAGTTCATTGGGTATTAAACGGCTTTCTCATA
+AAAAAACTGAACGCTTAAAAACTGAATTTATCGGGCTGATTGATACTGTACGGCCAGCAC
+TAAACGACAGTAATAAACTCACCGAATTAATTTTCGACGGACAACATTCCAATTTATTTA
+CGAACATCAGCAGCACTTCCATCACAAAGACAACGGAAAGTGTAAAGATCACTCTAGATG
+AAGCAAAACTCCAGCTTTTATTAAGCCTTCTGAATGATGAAAATACTGCTATCATCATTC
+CAAAATCTAAGGTTACAGAACTGCATGAAATTCGTGACCTGTTAACAAGTGAGTAGAATG
+CTAAGGACCGTTTATGGACAAGATTGCACAGTTTACTGTAATTAATACTTATAACGATCT
+ACTTATTACAAAAGGCACACTCGATCGCAACATTGAAGAGATCAAGGCTGGAAAGCGTTT
+TGATCATTTTGAAGAAGGGCACGATCAATACGTACAGAAGGTAACTGACGCTTTACAGCT
+CGTGGAGGCTCGACTGGAGAACCTTAAAAAATGAAACATTCTCTTTTTTTTACTCAGGAT
+GGTTATTTACTGCCATCATCCGTAAAGCCTATCTACGGTAAAGATGGACACTATTACGCC
+GTTATCACCCGTGAGTGCTTTGAATGCGGAGGGACTGGAAAGATTGCGAACGCCGTCTGT
+GTGACATGCAATGGCTCCAAAACGTCTCCAGCCACAGAGGAAAAGCTGGTACTGAAAGAG
+TGCATTGAATTCCTTGAAACTATCCCGGAACTTCGCTGCAATCCCGATCTTGAAGCCTGG
+AAACGTAGGCACAGCGAGCAGTTAGCATTGCTGCAAGCTGACAATTCTAAGTTTGCAGCA
+AGCATTGCACAGCAGTTAAACAACAATCTCTTTTTAACAGTCCGTCAGTTGGAGTCTTTC
+TACTCGACATACCAGCCTGTTTCTGAAGCTTTTTCAGAAAACGCCGGTTTTCCAATTGAA
+CATTCTTTCAACATTGGTGATGTAGTTAGTTTTGATATTATTTTTACAGAAGTGCGAGCT
+GCGTTTTCAAAAGGTTCTCATAGCTATTTTTTTACTTTTACAGGCAAAAAGCAGAATGAT
+GGATTCGCGTTGACTGGTAATGTTCAGGATCACGTTTTATTGGGGCATAGCTATCATCTT
+TCGGGAAAAGTGAGAAAGATCCACTACTTTGACTCAGTGCCCTACGCATTACTGACTGTG
+TTTAAATTAACAGCATAGCCTGGTGTCTAGTGACCGGAACTCCCAAATACAGGCCGTTTT
+TACATTAGCCACCGGCTTTCTGCACTGTCGTGCCGACTCACTCACGTCAAATCTGTTGCT
+CACGCATCGGGTTTTTACCCGGTTTTACACTCCGAAAATAAGCCGATTTATTTTAAATTC
+AACACCCGTTATTAACTAATCTTTTAAATTAAAAATGATAATCTTATTAATTATATTTTT
+TAATTTTTTGTCTCTTCTTAACATATAGGTTAAGGAGATTTTGTTAAAACGGAGTGATAT
+ATGCAAAATGATCTTGGACTTGGGTTCATCCGCAAGTCAGCAAGAACGTCAGCAAAAATT
+ATTTCCCGAAAAGTTACTTTTCCGCTCGATGACTTGGATAATGCAAAGCTAACGCTAACT
+GGCCTACAGTGTCATCCATCCTGCCGTTTTCCATTTTACCAGCTGTCTATGCTTATCCAT
+AACCAACTCGCTGAGCACGGCGTCATTTCTGCCGATGAAAACGCACCGTTCACTGTATCC
+ATAAGCATTCACGAGTGGCTGAGTCGTGCCAGAGTGGCATTTATTGATTATCACGGTCTT
+CGTAATAGCGATAAGACGGTCATGATCACACGCGCTCATCTGGAAGAATTGCTTACTTAC
+TTGTCTACGACATTGGCTGTTTATGTCCCGTATTCAAAGAAGCGACTAAACTTCAGCTTC
+CTGACGTCCTTCACTCTGGTCAAAACATCGCAGTCTTATACGTTAACGTTCCCTGGGGTA
+CTTCGTCCGTTCCTGATGTTGCTGGGGGGATTAATTCAGGAATTTATGACGGAAAAATTA
+TTGAAGCGACGGAATGCCCAGTTTGTCATCTTTGATTATTTGCGAAAGTCCCGGCGCCAT
+TCACACAAAATTACCGATATCGTGAATGATCTTCAGTTGCATACAGTGAACGTACGAATC
+ATGAATGTCCTTACCCAACTTGCAGATCAGGGGTTCATATCGTTTATATGCGAAGGTAAG
+AGAGGGGAGCGATCAATTGAAGAGCTTCAGTTTATTCCCTATGCCAGCCGTGACCATTCC
+GAAGTGCTGAGCTTCGAGGAATGGATAAGCCCGATCGACTAACTACTGATCGCCGCTCAA
+CGAAGGACGGCCAGAATTTCTATTTCCTTCTTACGCGACTTTGATTGACTGCCGACAGAC
+CGATAAGCGTTGTGAGTATGAATATCAAAACCGCGTTCTTCATAGAGCTCCAGCGTAAAG
+GGAGTCATGCTGTTGGATATGGCCACTGAGGCCCCTTTACGATTAGCATCCACCAGCATA
+TCCGCCAGTTTAACATGTGCGCTCTTATCGAACGGTATACCATCATAGCTTACAAAGCTG
+GTTTTACTGATTTTGTCATATGGCGGATCGCAATATATTTGGTCACCACCACCTGCAAAC
+TCCAGCGTCTGACCAAAATCTGCGGTTTTCAATTCAACGCTCGAAAGCCTGAATGAGAGG
+TAATCAACCTTCTGGATATCCAGACTGAACTGGTATCGCTTTCCCCATGGAACTGAGAAC
+TTTCGCTTCAGGTTGTAACGACACAGACCGTTATATCCGAGTCGATTCATCGCGTAGAAA
+ATGGCTGCTCGTTGTAGCGGGGCATCATCAAAACTGGTGCTGTTAAAGGTATTACGCAGC
+ACGTAGTAATCCTCTTCTTCAAAATGCCTTTCCGCCAGCAGCTGCACTTCTCTGATGAAT
+GCCGGTTTATTTCGCTGTATGTTGCGGTACAGATTGATTAGGTCCGGGTTGCTGTCTGCT
+AGGAGAGCCTCGGTGGCAAACATGTTCAGAAACACGGCGCCACCGCCGATAAACGGTTCA
+ACCCAGCGTCGGCTCTTATCATGTGGGAAGTGCTTACTGAGGAACGGCATCAGTTTGGTT
+TTACCCCCCGCCCATTTGATGATTGGTGTATGTTTTCGCAACGAGTCTTCTCCGTTCAGC
+TTTATCGGTATGCCACACTTATGGTACCGAAAGGCGGATTGCTACCAATAAGGTATGAGC
+AGGAAAAAACGTGGCTTTTGTTAACGAGATTGTCATTTCGACACATTTTTTAATTTTTTT
+TCACTTCTCAGAAAAAAGTTTATCCTTTACGAATTAACCATAACCATCTGTTTTATTTGA
+GTTATTTTTTCTTTTTGTTCTGATCGCCAGAACAATTTTCCTCGTTCAATTCGGAATAGA
+CCCAAAAAGTACCTTTTTAACGAAAAAGTGAGATTTTTTTTTCCGGTAGTATTCACGCAC
+AGATGAAAGGTATGACAAAAAAGAATTCAACGGAGTATCTATGAGTGATCTGATGACTGA
+TTCCCAACAGCAAACTAACTCACGGGTCTTTAAATCCCCACTCGTGTCTTTTTCAACAGT
+GACCGGTTCCGGCCGATTCGTCAGTGGTATGAAGCAGTTCCGCGACGCGAACCCTGACCT
+TTGTAATGAAGTCACTGAACAGAAAGCATGGGCTATCAGCCCAACCGTGGTTCAAATCAC
+GGAAGGATTCAACTCCCGTGAGATGGGAATGGGGGAAGCTTATTACCAGTTGCCAGAAGT
+CGCCGATCATCTCAATAACATCAAGAATGCGTACATCCGGGGTGATTACGTAGACCCTAT
+CCGCGTTCTGATCAAAGACGGCATTCCGTACGTTCGCCAGGGACATTGCCGTTTAAAGGC
+TGCTTTGATGGCTGTGGCAGAAGGGCATTCTAACCTCACCATTCTTTGCATCGAGATGAA
+AGCCGATGAGATCAGCTGCGAATTGACAACGATTGACGGAAACCGTGGCCTGGCTCTTTC
+TCCTGTGGCTTTGGGTGAATCCTACCGACGTCTTCAGGCGCTGGGTGGATGGTCGCTTGA
+CCGTATTGCCGAACGTGAGGGAAAAAGTAATACCACAATTGCTGCTCTTATTCGTTTAAC
+CGGCTGCTGTGTCTATCTCAAAAAACTGATCCATGCCGATGCCATTTCCTATGTAGCAGT
+CCTGTCCCTTATCGATGAGTTCGGTGAAACGGAAGCTGTTGCGCGGATCGAAAAGATGAT
+CGCAGACCTTGAAAAGGCTGATTCAAGCGGTATCCAGATTAAGAAAACGCCACGCGGGCA
+GATCCGTGTTGTCCCTTCCGATTTTAAACCCGCACGTGTTCCACCAGTTCTCGCTACAAA
+AGCCGTCGAAGGGGTCAAACTCATTACGACGAGTCTATTGCAGAAACTCGGTGATATCGA
+GTTGCCGGAGGTGACCGACTCCAGCGAAGATGAAGAAATTACCTTTACGCTGAACCGGAG
+CATGCTGGAGATGCTCAAGAACCTGCAAAGTGAGATTACGGAATCAGAAAACAAGCAGCT
+TCGCCGGGCCGAAAATCGGCAAGCCCGATTGAAAGGGGAAAAAGTGACTTACAAAACCAA
+GAAAAACGATAAAAATGGCGGAGAACCGCAATCCGAAACACCCCCAGCACAGGCTTAAAT
+GAATTATTTCAGAGTGTGAGAAGACTACAATAAGAAGTACGATATTTTAGAGCGAGCCAC
+CCAGGCTCTCCCCCCGTTGCCCCTACTATGTAGGGGTTTTTTTGTCCTGTCTCCGGCCCG
+TTTCTTCTGATTAAAACCACATCTGTCTTTCTGACTTTCCGCAGTGTTAATTTCTCCATT
+TTCATGTCAGCCAACCTATTAGCTTTTTGTTCAAGGTTGTTATCCTGGTATCAGATAAAC
+CCTTCAAAAAGGACTGGTGCTATGTCTGCTGTTGAATCTGATTCCCTGCCAATGGGTGCC
+CCTGGGAGTTCTCTGGTTGCTTATATGCCTCATACTGGCCTCCTTATTAACGACGATAAC
+TTCCTGCCCGAAATGCGGGAAGAGCTCGATGTCATTAACAGGCAGGTCGAATCATATAAC
+GATGAGCTTAGCTTACTGAGGTCCATGTCCGCTCAGTTCCTGAAATGCGGGAATCAGAAG
+CTCTATTCATACCTCTCCGGATACAATCATCTCATTTCAGAAGCGGATGCCAGCTACGCA
+GAAAACGCGCTGCGTTCAGAATACTGGAAGAGGGTCATGGCCCTGACCGATGTACTGTCT
+GTGATGTCTGACGAAAAGAAGAAAGAATGGGATAAGCAGTTTACTGCTGACCGTTACCAC
+CTTCCTCCTCAGGAGATCCCTGATTTTACACTCGATGCTGTTGTTACCACGGTTGTCGCG
+TTGCTCAATGACCGGCATCAGTTCATTAAAGATCGTGTCTATGCCGTCTTTCAGTCATTA
+AGCCGTCAACACAAAACCAATAAAGCATTTGGCTTCTCTACTCGCATGATCACCTCCGGC
+GTATGTGAAGGCGTGAAAGACAAATGGGTAAAACTGAAGGTTGAGTTTAAAGAATCCGGC
+CTCATGCCACTTTCGGAGTTGCGGGTGATCTGTTCTTATTTCCGGGGCGAAACAGTTAAA
+CCGGTCTATGACACGAAAAAAATGGTTGAGAATATGGTTGGTCATGTTGGATTCAGAAAC
+TGGATCAGCCTGGATGGCAACAGTATTCGTTTTCGGGTCTACAAAAACGGATCGATGCAC
+ATTGATGTGCATCCTGATATCGCCGAACGGCTTAACAACATTCTTGCTGCCATCGTCCCT
+CTGGCTCTGCCTGCTGAACGCGTGGCCCATACCAAAGCGACGTTGCAGGAGTTCCCGGCA
+CTGAAACGCTGCATCGATTTTCATTCACGGATGCAGCTTGCAGAGCTGGATTTTACCCAG
+AATGAAAAGGAATGGTCCAGCTGGACATCGCTCGGCTATGCCGGTGAGAACGCTGATAAA
+ACGCGGCAGGTGAACGCGGATGTTCTGCGATTTCTCGGTGCCCGAGTGACAAGCTACCAT
+GTGACGTTTGATTATGACCCGACCGAAGTGATGCGCTTCATCGGACATATGGGCGCCATG
+CCTGATATTAAATCCCACCAGTTTTATCCGTCGTCGGCGCGACTCAGTGAATACGTCGCA
+TCCATTATTGCGGCCGGGGAGGGGGAACGGCTGCTGGAGCCCAATATTGGGCACGGGGAT
+TTGCTTCAATGTTTCCCGAAAAGTGTCAACGTAACCGGCATCGAACTGGATACACTGAAT
+TGTCTGGTCTCCCGGGCTAAAGGTTACGAGACCACGGAAGCCGATTTTCTGGCCTGGTCG
+GCGGCGAATCAGATTCAGAAATTTGATTGCGTGGTGATGAACCCTCCTTTTGCTGACAAC
+CGGGCTAAGCTGCATCTGCTGGCCGCTGCGTCTCATCTGGTTCCCGGCGGGCGTTTAGCT
+GCCGTCCTGCCTCTGTCCCTTCAGGGGATCGATAACCTGCTGGGCGAGGGGTTCAGGACC
+GAGTGGATGGATACCTTCGATAATGAGTTTGACAACACTGCCGTCTCCGTCCGCGTTCTG
+TATGCAGAACGCTTTTAACTGAAGGAAAGACTATGTCCAAAAGTTCGCCTGTCTTGCCTG
+AGGACCGTGATGATATTGAGTTTGTGATGGATGATTTCCAGCGGAGCCTGGGGAAAAGTA
+AACCAGTACGTGAAGTGCAATTTCTGGGAGAGTCACAGCAAAGTGAAGAATCTGCGAACT
+CTGCCGATTCGCCCTGGTTTGAAAGCTAATCTATTCTGATGGCGCCGTGCTGATTTAAAA
+TGACTCCCCGGCAGTGAGCGGGGAGTTATTACAACTTTTACCTGTACTGAACAACAGTTC
+CGGCTAAGGTACAAACGGGTATGAAGAGCTGGACATCAACATGATGCCAGTAAGGCAGCG
+GCACCCTGTACCCTCCCTTACGATGATGGACAATCATCGCCTGTTGCTGACATTTCACCT
+CATTTAATCGTCCTAATTTCTGCTTTTCCTATTTCTTCTCAAGAGAAAAGTTACTTTTCT
+TCCACCGTAATCAGCCCTGTTGAAGTTGCCTTAACTTTCGTTTTGTTCTGACCCGACAAC
+ATTGCTATCACGGCAACATTTAAAAGTTTTATGCCGTGAAATACCCCGGCTAACCAGCAA
+GCCCAGGTGAAAAGATTTCGTAAAATAGGGGCAAATACATCCCGGGAGTATCACATGCGT
+AAAATTCTGACAGGCTGTATCATTGCCACGGCCATAGCTTCAGTTTATCCGGCGGCGGCT
+CAGATTTTCAGCTATTCGTATACTGACACCAATCAGCTGGCAAAGACGCTTAAGCCTGCC
+ACGCAGAGCTACCTTAATCCGGCAAGCACAATGACCCTGAATCTGATCTCCGGCCTTGAC
+CGATACGAACGAGTGAGTGTGACCAGGGACAGTGACAAAAAGGTCATGTATTCCGCAGTG
+ACAGGAAAGATAAGCGTCGCAGATCGCATTGTTGCCGCAGACGGCACGGAATATTACGGA
+AAGGACTTGGCGTTACCCGCACTCGGTGAAGGGGCCTTCACCGTCATCAACGATACTCTG
+GATCTCCAGCAGGCTGTCGTCAGCTCTTCAACGTATCATTTCACAATCGACACTACAGCG
+CCAAAGTATACCAGCATCTACCCGAGCCAGAACGCAGGCTATGAAATGGTCCTGAGTGGC
+CCAGTTTGGGGGCTTGGGCGCGGAGGATCTGGCCAGTTTTCCATCTTTGCTGATGGAGTT
+GATGATGCGAATGGCATAGACAAGATCCGTCTGGTCATCAAGCGCGGAAATGGCACAGTC
+GTGTCCGACAACACACTCAGTTACGATACGGCGGCAAAACGTGCCTTTTACCCCTGGATC
+AAGGACTCGGTCACTCAACCCGGTATGCCCACCAGCGATCTCAATGAAGAATTTACCTTC
+AATTTTATCATCACAGATAAAGCCGGAAACACGCTGAATATTCCGCCGCAGCGCTTTTTA
+TTTGATGACCAGATAGGTGAATACACCCCCTTTGCGGTTCATGACTCACGCGTCAGTACG
+AGTGTGGTCCCGGGGATCTCTTCAGGGTACGTCCCGTTTGTTCGGGGGCTATCTGTACTC
+GAAAACCCATACCGTATGGTCATCCGTATCCCCCGAACCAACTGGAAGCCATACCGTAAC
+GGCGGCATCACCATTCTTAACAATTATGGCGGTGCTAAGGTTATTTCAGAAGACACGACC
+TATGTGTACGTCGAGGTGAAGCTTCCCCAGGGCGCTCTGGATATAAACTACTATCGCCCA
+GTGAACACGTACCAATGGTCCGGAGGCGATCTGACTCAATACGCCTCCTGGCTGAACTGG
+GACCCGGCTTCGGTAAAAAGTCCTGCATGGGGGAGTCCGGCGATTGAGCGACAGATGTCC
+GATGGTACCTGGTTTAACAGCGTCAATTGGAAATACTTCAAGGCTTCAGATATGCCGGTG
+AACCTGACCCAGATCCGTTTCAATGTGCAGGCAAGGCCCTACGACCAAAAAATTACTGGC
+GGTGCCACCTGCAACATCCCTGCCGGGTCAACGTCGTGTACCGTCGCCCTGACACAGGCG
+ATTACAAACGGCACCACCGGCTATCTGCATAGTGGTTATGAGGTACGTTCCACAACAGAA
+TCCACCTTCTTCATGCCTATCTGGGAAAACGTCGTCTGGCATACGCTGGGGCCTTCGGTC
+ACTGGCTATGACTACAATGATACGACCAACATCCTTCAGGTTTACATCAACCAGCCGGGA
+GACGGATCGTATTTCGATACCGTTAAACTGAGCCGGGTGTGGCTGTCCGACAAATCCCGC
+AATAACGCGGATATCAATGTGACCGGAACACTAACGGGGCGTAACACAGCAACCGGGAAT
+TATACATACGAGTTCAACCTGAAACTAATCCCGGAGGGCAGCTATAACGTGCAGCTCAAC
+GCCCAGGATTCGTTCAACAATACGGGTAGTCTGGACTATAAGACTGTGACGGTCGATAAC
+ACGCCGCCGTCCATCAGTATCAGCTACGAAACCAAACCTATCACCAGCAGTGTAACGGTG
+TATGGACTGGAGAACATTCGTATTCAGCTCGCAGATACCCTGACCAAGCCCTCTTTAACG
+CGAATGACGCTTCGCGGTGGCCCGGTATCTGATGCTGTTGAGTTGTCGTGGGTAAACCTC
+GGAAATAATCTTTATGCCCCGAATTACCCGAAGATCTTTCCTTCACTTAACGACGGCGAA
+ACTTACACGCTTACCGTGCAGGCCAAAGACGAGATGAACAACGTTAAAGAAAGCGCCGTC
+GAATTTAGTTACTTGCCGAACAACCTGGTTCGTCTGGAAAACCTTAAGACCATCTCCGTT
+AGTACCGCGCTGAAAACGTCCGATGACACACCGCTGGCGGTTCTTTATGCCAGCCAGCTG
+CGTAAGAAGGACGGGTCTATCGCAACCGGGAAACAGGACGCGATACTGACGGTGCGTAAG
+GATGCAGCCTTCGGCGTCACGGTGAATGGGGTTTCCGCAGCTCCTGGGGAGAGCAAAAAT
+GTTCAGTTGGATCTGGGTCTGGGTGACAGCCGCAGCTTCCCTATTTTTCCTTCGACTTCC
+GGCGTCGTTGGAACTTCTGAATTTATGCTGAATATAGAGGAACTGAAGTAAAAGCAGGGT
+AGGGTGGCCAAGTCCGGGCCACTTCTTTCTGTTGTTGTCGCCGCAATGATGATTATCCAG
+ATTCCGGTCACAGGGTTATTCACCGTTTTTGTGGATAACCTTCCGTCCCATCAGTAAAAC
+TGCGAATGACACAGGCCTGCCACTCGCTGCGGGTTTGCTCATAAAACTACCCGTCAGCGT
+GGATCAACATATCATTCACCCGGTATAGTGGATACCCTTCATCCGGCACGCGATTCCTGC
+GGCCAGCGCCTGTCATGGTGATGGATGCAGGGCCACCAGCTGCAAACACAGGTTCAGCCT
+GGGATTACACTATACCGGGCGACGTTAACCTAATTCGCGGCCATGATGTCAAACAGCGAC
+GGACTGGCGGGGTGCGTTTAACTACTGTGGCTATAAACAGACTGGTCTTCCCATGACTCA
+CTCTCATTTTCTAGGGGACCGGTGATCCACTTTGCGGAGCGTGAGGCTCGGGAGCGAAAA
+GCCCATGCCTCGTCAGGACCGATAGTGACGCTTTCCTCCGTCATTGAGGCGTTTTTTGGC
+ATTCGCTTTACGCCGGTACAGAATGACGGTAACTTTTCTAAGGCAGCGGATGATTACAAA
+CGCAGTCTCTCAAAACTCGTACAAAATGGAGCCCCAAAAGAATGAAAATTAGCACGGGCA
+TGATGAAAAGCAATGCACCGCTCATCATTCTGATTTGTTTAATGATCGCTTTTTCCGCCT
+ATGTTAAATCATGGTCATTGTTATACACCTTGCTGGCGGCATCAGTCTCACTCACAGTCA
+TGATCTCACTGCCTTTTATCGTTTCGCCTCTACAGCACTCAAAATTTATAGCCTTACGAA
+TTTTGCGTTTACTGGTTATTACGCTTTGGACGATTGGCCTTGTCGGCGTCTTCTTTTCAG
+TTGTTGAACGCCTTGTATGGGTTAATGCGGACAGCTATCCGGCATGGCTGGCGAAGGAAC
+TGGATTCTCCGGCCATCACGGATGGTGAAAATTTTATTAAAGCAACAGAGTCTTTTGAGA
+AGATCTGCGGGAAAAATAAAGGCTATCTTAGCGTTGTCACCAAGCATAACGGCATATTTA
+TGCGCTGCGATGATAGCTTGTCTTTCGACTCCTGGTGGAAGGGTGTCTACCGGCTTAAAA
+CCCCTGAGACTCGATGATATATTTCTTTAATGCTGCGACTGAATGGTCATCTTTTAGTTA
+AGACCTTTACGACGATATCCGCCCCTCCACTGTACCGGGTGCTGCTCCCCCATCAGCTAC
+TGGTACGCGCTTTAAGTCGCTCCACTAAACCGGGTTAAACTTTCACTTCAGCATCATCAC
+GTTAACAGGGTTGTACACCATTCGCTATCCACTATACCGGGTACGGTTTCCTAACCGTGA
+CGTCATGCTATCCGGAAAGATGACACTGCCACGATCCACTATACCGGGTAAACCTTTCCA
+CCCAGTACCACCACATTCCCGGTAACCGATTAGCAGTAGTTCTCATCCACTATACCGGGT
+ACGGATCACATTTCTGTGACTCCACTGTACCGGGTATAGATCACATTTTTGGTGAAAAAA
+CACACTAAATATTCAGTGTAAGGCTGAAGAGGAGGGGCTGCATCGTAATTTTAGGCCTGA
+CACTACCCGGTGTAGTGGAGATCCATTGTACCGGGTAAAGCAGAGTGGAAAGGAGAAGAA
+TGTCCACTATACCGGGTAACGCAGCCACCCACGCGGCAGGCAGGTGCATTATCCGGCATC
+GGTCATGGCTTCATGTTTCTCTTTAGAATATTCAGTACGTAATCGCCGTTTTCTTTGTCT
+ATGGAGTATTCCAGAAAACCGATCTCTTTAAGCTGGCCCAGCGCCTTTTTAACCGTGGCA
+TTCTGGTTACCGAGGTGTGATGACAGTTGGAGTCGTCCACGAAGCCGATCGAATCCGATG
+CGGTAAAAGGTGCTCGGCAGCTCAGCCAGATACAGGTACAGGGCCTGTGCGGACTCCTTA
+CGGGCCAGTTTTTGCAATGTCTTCAGGTAGAGTCGGGTTTTACCGTCGACGCGATACAGC
+GTATTGAGCTTCGAATTTGGCTTGATGATGATTTTTCCCGTGGAACTGTCGTAATACGTC
+GATTCCACCAGGTGCATGTTTATCGTTATCTGATCATCTGTACCGGGTATTTTCTTAATA
+AATGAAATGTTGGTCCGGGCTATACGCGTCAGCGAAGCATCAAAGCGCTCTTTCAGTTGT
+TTATCAATGCGCTTGGTATCAAACCCACAAAATTTTGCAAACTCCGGAAAATTCAGCTCC
+AGCTGACCTTCTGAATCAAGCGGCCGGTTAGACAACGCATAAACGATCCCACACCATGAT
+TTGAAATCGGTATCCATATCGAGACGCGGCCCGTAGATTTGGATCTGGCTGTAACCTTCA
+CCCTCTACAATAGATAACCTTGATAGCGGCTCAGTGGCATCGATATGATGGCTCTTCCTC
+CCCCCCTTGTCCGTAGATTTCAAAGTCGGCACAAACACACCTAGGCGGAGTAAAACTTTC
+GGTTGAATGGTCTGTTTTAATGTGGGAAAGAGTTGTATAACTTCCCCTGAATCTTTTAGG
+GACTCTTCAATGACGAGAGATAACTTGTTGTTATTACTTGACATATTGGGAGATCCGTTT
+TGTGCATAAGATCTACATCCTACCCGCTATAGTGTATCGAATCTACCCGGTATAGTGGAT
+TATGCGCCCGGTACAGTGGATGGATTACCCGACATAGTGTATTTCTCCCCCTGTACAGTG
+GATGCTGATCCGCTGAGAGGCCCGATATCACTGGGCTGCGAGGATCGTTATTCCTTTTTG
+ATCTGCTATTGATCCTCTATTGATCTTTATTATTATTCTATCCTGTTGATAACTATGCTC
+TGTCACGTATTGAATCATCACGATCAAAATGTGAGTAAATTCCGATCCGTTCTAAAAACA
+TCAGAAGCACACTTCAACCCTTACAGAAAAAGTTACTTTCGTTAAGCCGCCAGTACTACC
+GACGGCCCATTCTCATTACTTCAGCTCATCGATCTGGATCATGAACTCGGATGTACCCAC
+TTTGCCGTTTTCAGCAGGGTATATAGGTACTAAAAGGTTATCACCGAGCCCCATATCAAT
+TTTCACCTCTACAGATTCACCAAGCGCGGCCTGCACGCCGTTGAACTTAATACCGAAGGC
+AGCGTCTTTACGTACCGTTAGCGTCGCACTCTGGACGTTTTTGCAATCTCACCGTTGGAC
+TTACGCAACACGTTGGTTGACAGATAAGCAAGAGGCTCATTTAACGACGTTTTGAGTGCT
+GAACTGACGGATAAGGTTCGCAGGTTATGCAACTGCACTAGGTTATTCGGGAGGTAGCTG
+AATTTCTGGGTATAAGTTTTGCTGTTCGACTGACTGTCGGAGACCGTCACGCTAAGCGCA
+TAGTTTTCGGAAGGCTCGAATGAGGGGAACAGCCTTGGATATTCTGGCGCATAAACGTTC
+GTGCCAGCAGGTGACCACGTGAGCTCAACGTTATCTGCCGTTGGCCCTCCGGTTATCTGA
+AGACGGGTGATCCGGGGTGTTGTCAGGTTATCCGCCAGAGCTATACGGATATTCTCCAGC
+CCGTATACCACCGTACTAGGGCAGGATCATTTCAACGTAGGTATAGGTGCTGTCCGTCGC
+AATCTCGGTCGGGGAAGAATACAGGTTATAGAATAGCAGGCCGCCCTCGGCATATGACCG
+GTAGTTGGACTTTGGCACGCGATATACAAGATGAATCGGATTCTCATTAACGGTCATCCC
+AGCTGAATAGGCCGGATATCCGGAAACCCCTGGCACCACGCTGGCGGAGCTTTGCGGATC
+TCGGACCGCCCAGATAGTTATCATATCGAAAGAGCTGCAACGGAAGGGTTCGGGTGTTTC
+CTGCGTTGTCATAAATGACTACCTTGGCCGTGAAATCTTCATCCAGATTGCTGTCGGGAA
+TACCCGCGCCTTTGACCGAGTTTTTTGAGTAAGTGTGATACATCTTCTGACCAGTCACGT
+CGTACTGAACAGACTGCCGTTACTGTGATAGACATAAAACATACCTTTCTCGATGCCATT
+TACGTCCGTGACATTGGTTGAGGTAAAATCAAACTGCCCCGTGGCCTCCAGCCCCATTTT
+CCAGACGCTACCCGCAGTTGATCCATAGGCGGCGTTGCCTGTGAGGGCATTACCAGACAG
+CGGTGTGGTGTCTACCAGCCAGTTGTAGCTGTAGGTGGCTACAACGGACTGATTCAGATC
+CAGAATACTGACCTGCACAACCGACCTGCCTTCGCCAAGCACCGGTAAAGTTACTTTTTT
+TCCGTAAAATTCGCTGCCATCTCCGGCCTTCAGACGGTCGGATACGCTGGTGCGCGTAGT
+AGTGGTGTTCAGCAGTTGCGTGCCGGTGGCGCTGGTGATTTTGACATTCACATAACGGTC
+AAGACCGGCAATGAGCGTCAGGGTTACCGGTGAGGCCGGATTCAGCAACAGCCGGGTTGA
+GGGGGCGTGAACTTCAATACCATTGGTATCTGTGAAGATGGATTCATAAATTTGAGCAGA
+TGCCGGAACTGAGACTCCGAGCATAGCCATAGCCAAAGCTATAGCCTGATTTTTCATTCA
+GTATTCCCCTTTTAGTTGTTGCTATTTTAAACGTCTGCCCTGCGGATTTTTCCGTTAAGG
+GGGGGATTTCTGGGGAATTAATCAGCCTAAAACGGACATTGGGATGGGGTATTTCCCGCA
+GGCCTGCCGATTAAATCTGGCAAAAAGCACACAAACGGACGATGTTTTACTGAACAATTA
+CCCCTCTTAGCGCCCGGGCGAAGAAAACGATTCAGGTAAAATTTTCTGGCCAACCAGGAG
+AACCGAAATGAAATTTTGCCGACGTCCGTTGATTGTCGCCGTCTATACGGCACTGCTGTT
+CCCGCTTTACAGCCAGGCTCAGCTTTACAACTATTCGTATACCGACACACGCGGCACGAA
+AGTGAATGCTGAACCCACCAGAGAGTATCTCAACCCGGGCAGCGCAATTACGCTGAATCT
+GATATCTGGTCTCGACCGCTACGAGCGCGTTACCGTGACACGTTCATCCGATAATGTGCA
+GATGTTCCAGAGTGTCACCGGCCTGGTGACAGTGGCCGACAGGATCACTGCCGCTGATGG
+TAGTGAGTACTACGGCAAGTCCATGACACTGCCGGTACTGGGCGAGGGTACTTTTTCTCT
+TAAATCCGAAACACTCGACAATAAGTCGAATGTCGTGGCGACAACCAGCTACTCTTTCAG
+CATCGATATCACTCCTCCCGTTCTACCAGATCCGATGCAGTGGATCAGGGCTGGTTTTCA
+GTACGGAAGTCTGGATATTTTCGGCGACAGGACCGCAACCCAGGCCATTTCGTTATCGAA
+CGTCTCTGATGCGAGGTCAGGACTGGATAAAGCGGAGTGGTTTGCTATTGACAGCAGCGG
+TGTCCGCCGGACTGTAAATGCTCAGCTGAATGCACTCACGGGGGTGGTCCAGGCACTGGC
+GGCGGTGGCGGCAGGAAGCACGGTTGCGCCCGTCAGTCCGGCATATTACACCGTAGGTTT
+TCGGGTTTATGACAAAGCCGGGAACTGGACAGAAACATCACATCGCTCTGGTATTGATCG
+TACAATACCCAGCTACATTCAACATCAGGTGCGGAATGCGAAAACAGGCGTCTGGGAAGA
+TTATGTTCCTGGCATGACTATTTTCGAGAACCCAGTCAAATTCAGGTACAAACGCCTTAA
+ATCGGACTCAACCAATTTTAACGGGACAGACTTCGGCTGGGTCGATCAGATTACCAACTC
+CGACAATACCTATTTTTATACTGAAGCCACGGTGAGCTACCCGGAAACCTATATGTACTA
+CGAGCTTCATACTAAAGCGGGCCTTAACGTCAACCTCCAGTACAAAACGCTGAAATTTAC
+TCCGGGTAACGGCGTGGCTGAAGCCCCCCGCTATTTGTCAGGGCAGTACCATTTCAGAGA
+TGCTAATACATGGACTTCGAGTGACATCGTCAGGTTTACCGGGCCGGATTGCGTAGATTT
+GGGTCGTGTAAACGTTGAACCGCGCTCTTATGTGCAAACTGCTACTATCGTCGGCATTGG
+CAGTTGCAATGTTTCAGTGGGTGAGAGCAGTTGCCAGGTCAGCATGAATTACTGTAAGAC
+GAGCGGGAAAGGCTATGTTCCGTACCAAATTCATATCAGAGGGACCGGTTCATACGCAAA
+TCTCGGCGGACTACAGTCGCATTTCTACACCTACTGGGATATGAACGCCCCGGTTATCAA
+CAGTATCGTCTCCAGCCCACTGGATAAAACGGTGGTAATGCTGGTGACGGACAGTGACGT
+AACTAACGACTGGACCAATTATATGTGGGCCACCAATATCTTTAACCTCACACTGAAGGA
+CACCAGTAATAAAGTCTCTACCTTGTCGCCGAAAAACGTTACGGTCCTGAACTACCAGCT
+GAAACAAGTGACGTTTGATTACAGCGCGTTACCCTCCGGGAAATACACTGCAACGGGTGC
+CGCGACGGACACCTACAACAACACGGCAGAACTGACGCTATCGAATACCATCCTGCATGA
+CGTCACGCCGCCTGTTGTCGATATCAGTTTTGAGGGAAAGCAGGCTGACGGAGCACTGGT
+CAAAGGGCTGGAAAATCTGGTGATCACACTGGCCGACGATATGACAAAAGCTTCCCTGAA
+AAGCATCACGCTGAGCGGCGGACCCACTTCTGACAAAGTCAGTGTGGGCTGGTACAGCCA
+GGGAACTGATAAATACGGGCTGAACTACCCGCGTATCTTCCCCGCGACAGATGATGCGGA
+TTCCTACCAGCTTACTGCGGTTGCGGTAGATGAAGCCGGTAATACCACGACAAAGGTCAG
+CCGGTTCCGTTATGTACCGAACAACCTGATTGAATTTAACACTCTCAAAACGCTGGCCGT
+GGGTATGGGGCTGAAGACATCAGATAACCAGCCGCTGGCGTATCTGCGTACCAATAGCAT
+CCGGAAAAAAGATGGTTCGCTGATCACTGGAGCACAAACCGGCACGCTGACGGTCCGCAA
+AGATGCGGCCTTTGCGGTTAGTATGAATGGGGTGGCCGTCGTACCCGGGGATTCGAAAGA
+CATCACGATAGATTTCGGGCAGGGTGATGGCGTCCTGATCCCCATCTTCCCGGCCACCAG
+CGGCAATGTCGGTGAATCAAGCTTCATGATCGAGCTGCCGCAAATCCAGTAACTGCCTCC
+GAACCGGCCCCGTATTACGGGGCTTTTTCATAGTGTCTTAACGTAATCAGAAAGAAACGA
+AACAGGCTGATTTAGTCGCATGTCAGAACTTGCTGAGAAACCTCTTATCACGCGTGTAGC
+TCCCCTGGAGAGGATTTATTATTGCGCTTCCCGGGCAGAGGGTCTGAAGCCAGATCGCCA
+TGAAATTCGAATGCAGAGCCAGTTTTTGCTGCTTGGCGTCATCTGGTTACCACCTGCACT
+CGCTATGGCAGAACTGGAACGCCTGCTGAAGGGATATGACGCTGACCACAGCCGGTTACT
+GGAAAACGTCCTGGAGACTGCCCACCAGCAATTCCTGAAGTTCTGTGAGCCGCAGAAGAG
+AGAAGGGGGGGGCGTAGAAAACCACGTAGAATGTCCCCGACAGGACGACGCACTTCAGTG
+TTTACGGTTTATGTCAACGCGGTATGCGCTGGCCGTTGATCTGTGTGCCGCGTATGTGTG
+CAGCAGGTATGGACGTTAGTGCATTTCATGATTTACGGGCGGGCGCACCGGTTACTTCTT
+CTCTTCCAGCGAGGCAAGGCTGCTCATTTCTTTCATACCCAGACGAGCGGCTACGCCCAT
+GGCGGTGGCTTCGAGTTCGGCCTTGCCGTGTGAGACGATATTCACCATGGATTCCTGAAT
+GAGTTGGTTGGTGAAGGCCAGATTGACCGGCAAGTTATTGATTACGCTTAACAGCGACTG
+ATAGGCTTCGTCAAGCTCACGCTTTCCAGCCTTGCCTTTTACCGCCAGCAAACGCAGCAC
+TTCCAGCTTTTCATGCAATTTCGCCATTTCACGCTCAGCGGCTTCCCGGATCTGCCGTTC
+GTATCGTTCGCGTGTCGACTCAATATAGCCAATCTCCGGCTGCCGCTCATAATCGCCGCG
+AATCAGGCTGTTAATGGTACACGGCACGCCGTCACTCATTCCGAACGATGTGATCATCGT
+GGCCCACTGCGCCGGAGACAGACTGACTTGCAGGAGCGGTGAGCGGCGTCGGCCTTCCGC
+CAGTCGATGACGGATCACACCGTCGCGTTCAATCTGCTCTGATTCACTGAAGGTCATCGT
+GACTACCTCTTTATGACTGAGGTCGGAGGCATAAAGGCGCTGTCCCGTCGTGGACGTGCG
+GCTTACTGATACCAGTCCGTAAGCCGAGTGGCGGGTGATCACCTCTCCCATCTCGTTTTC
+AGTCACCGTCGGTATTACTGTGTTTTTCATCGTCATGCCCTACAAAGAATTAAAAATGAC
+AGCGTCTGGCGTAAATCAGATGCGGAACCGGAATGTCTGGGAACTTTTCCCACGTCACTC
+GCTGAATTGTACGCCTGCTGCAATTGGTGGCGAGTTTCCCACTTATAGGCCGCTTCCCGC
+ACGACACGAGCCACGATATTTTTACCCTTCATTACTCTAGTTCTCCGGCGCAGCCAGCCA
+TCTTACTCACTTCCGTGCGTATGTCAGCGAATAATGACCAGGTCAGGACCAAAACTGAAT
+CCATCGCCCATCCGGTCGGAATGCTTGGATACATATGATTTCCCGTATTTCTCCAGGTCT
+TGCAAACTGGATCTTGCCAAGTTCCATGAATACTCATGCCCCCAGATTTCCCCATCCCGA
+TCAGCAAATCGTGCGGGTTTATAGTTGGCCTTGAGCAGAGCATAGACCTGTTCGAGAGTG
+GGTAATACCGGGCTGGTCTTCCCGTCATTTGCGTTAGCGTTCGTCATTATTATGTACTCA
+GTCGAGTTATTGTGTGGGGATGGTTGCACGCGAACTGTGCCGCCTCCCGTTGTACGGAAG
+ACCTGTCGGCGCTCATGCAGCACGGAATTAGAATGCTTGCAGGCACGTTACGCTTCCTGA
+AAATCTTCTCCCATTCCGGCGCTTAGGAAGCGCGTATTCGCCGTCAAATCGGTAAATCCC
+GACCTTAGAGCATGGGCCGTCGTTTTTAACTAATTCCCAGATGAAGTCGGCACGGTCACT
+GAAATAGCCTGGACCTTCGTCAAAGGATGAAAATTCACTATGCACAACGCACAGATCGCC
+GTGCTGGCCGTTGATAAAAACGAAGTGACCTTTATGCTTTTCGCCTAGCTTCGCGTCGAG
+GTGTCCGAACGTTTGATACATTACGGAGGCTTGATGTTCTGCACCTGCCATTCCAAGTAA
+TTCGCGCAATTCACTCCTCCTTCACGCTAACGCCATAGTCGGCCAGCGCCTCTTTATCCG
+CTTTACCGCGAGCATTCCAGCGTCGAAGTACGCCATCGTTAATTTTCGGTGGTAGTGTGG
+CAACATCGCCCATCTGCCTGACTCCTGTTCTGAATAATTTTACCCGGGGCCAAAATACCG
+CTGGGCAGTTTGCCTGGTTACACCCCAGGCACCAACAGGGACGGGCTGTTATAAGAAAAG
+CGATCTACAGGAGCATCTTCAAATCTGTGGCTCGGTGCATCCGGTGTCAGAACCAGGCCG
+TCATGTGCCGCGTGAATGTGCAGCAGTGAATCACTGCCCGTATCAATGTGCAGCGTCGGT
+ACACCACGGTCGATCTCCAAAATGAGGCCGAAACACGTGGTGCCGGTTTCATTCGTCACT
+TCGCACTGAACGTTTTTATTTTCTGCTAACACCTTCACCTGGTAGGGCTGACAGTCTTCT
+TCTGGGATCTCGGCTTCACCCAGTTGCCAGTCCTGCAAAGTCAGTCTCATTTCTGAAGAG
+GTGGTATGGGATTCCGGCGTCAGCAGTGCATAAACCTGCTGGCGGAACTGCTCGCTCATC
+TCTGGAGTCAGGGCATCGGTCTCTCCGTTGAAATGCTCTTCCCAGCCATCATGATCAGCG
+TGCATCCAGACGTTTTGCGTCACCGACGGCAGTGAGGCGTCAGGGTGTACGATGAGATAC
+GGAGAGCTTTCTTTGGTTTCCAGATAGCGGACGGGCTGGCCATTCTGCAACGCGCCTTCA
+GCAGCCGTACCATCGGTCTCCGGTAGTGCGATTTCAGTGACATTACCGCCACAATGCTCT
+GCCACAACACGCCCCAGATCTTCCATCAGGGCGCGATGTTTTTCTGGGGAATCCAGCTCG
+CCCAGTAATTCTGGTTTTACCAGTAATGCAGTAATAATTGTTGCCAGTTCACGCGTCGAA
+ATTAATTTAGCCATGATAGTCCCCTTTTCTCTGATGAATTAATTCTACCAGTTCTAGTTT
+GCTGGCTAATAACCTGAAAGAAAGTTTTTTAAAATATACTCGCCCCATAAGTTAGGGGCG
+AAAAATGGGGGTAAATAATAATGACGGATTTTGAATTAATAAATCAGTAGGCGGCTTTCA
+ATAATAATCCAGGGCGTCCGTAGGTATACTGGTCAGAGGGCGAAATACTGAAATCATGAT
+TAAGGGAGTCGGTTGAAAGAACCAGACCACCGTGAGCTGCCCGGATGTGCAGAACTGAAG
+GATCAGTGTCACCCGCATTAACGTGGACAGAGGGAACTCCATTTTCAATCAAGAGTGTCA
+GGGCCATCACCAGACGGGAATCTGTATCTTTTACTGCCAGCATGGCATGACCACCGAGCG
+CCATTGTGACGTTAAACTCTGCTGAAGAATCGGTCTGCTCAACATCGTCGGTGCTGTACT
+CACACATCCGTACCACCTGTACTGGCAGATTAGCATGGCTGGTTTCTTCCTGAAGGAGCA
+GACGCTGGAGGGTGTAGCGGCGTACAGCGCACTCTTTGTGGGTCGGCAGTTCATCAGGGC
+TTTCTTCGACACTGCCTTTGATATGGTCAAGCCAGCCATCCCGGGCATGATGACGCCAGA
+CGTTATCTGTGAGGGAGTGCATGTCCTGGCCAGGAGAGACAACAATATAAGGGGTTTCAT
+CTGGAGATGTCAGGTAATCGGCCTGGCTGTCTTCATCGCGTACCTCAGGCATGATCACGC
+CGTCAATTTGACCGCCGCAATGTTTCGCCACCAGCTCGCCGATGTCCTGCATAAATGCTT
+TATGCGTGGCTGGTGTTTTTAATTCATTCAATAATGCTGGTTGCACCAGTAATCCACAAA
+CAATTTCCGCAAGCTCGGCAGGTAACAAATATTTTGGCATGGTTAGTTCTCCTCTTTTTG
+AATGAGAACACTCTAGCATTTTGACTTACTTTTCTAATAAGTTGACGACAGGTATTTTTT
+TAAAAAAATATCCCCTGAATTTATATTAAAAGCAAGACTGCATTAATCCTGGAAAAGTAA
+CTTTTCTCAGGGCTTCACGGGAGGGCATTACCCGTTATGCCCTCACCACAACTGAATCAC
+TTGAACAAAAACGTGTAGATGTCCATTTCAACAGCTACCTGAACGCCGGTGTTCTTTGAC
+CCAGGCAGTTCCCGAAAGCCTCTAACCGTCTGGGAGTGCGCCAGCGATACCTGCGGATGA
+GACGGGTTTTGTAGACGGGGACGAGCGATACAGCCGGAAGACGAACAGGCTCTGGTGTTT
+CAGCTTGCGAGTGCCGCGATCCTGAGGCACCAGTAGATGCCTGCGTTTTCCAGATTAAAG
+CGGCATCACGCCGCTGTGCCACCCCCCGGAACTGCGTTAGACCGTGCGTGTTATACATGT
+CAGCCATATGGACTGTTTCGGCAACCGGAAGTAAAGCATCATTAAGGTGACGGACAGGCA
+TTCCCTGAGCCGTATCACGCTGCTGTTATACCTTAAAACGGATAAATACTTAAGCATCGC
+TACTCAAATGAGTGAAAAGCAATCACTTTTATTGTGATGCAATAAATGCCTCATTAGGAT
+TTGTTTCGTTTTTTGTAAACAGATAATTCTGAAAATACCCTCCATTAAAATTGAATCCTG
+CATATATAAATCATCTCAATCATCCTTCCTGATTTATTTTCAAAAAACGTTCGTTCAGGT
+TATTAGCCAGCGAGGCCAATCTGTCATTATTACTTCAGACCAAACCTGAGGAATCAAAAA
+TGGATAAATACTTTGACCGTAGCGGAATGGCAATCGATAACGCTAAGATTAAGTGTATTG
+ATTCAGTAAAAGGCACCGGGGAATATATTTACCGTGTTACTTGCAATAAATGCAATGGAC
+GTGGCGAACGCAATCACTTTTATAAGAGCCGCTGTATTGCCTGTAATGCCACTGGCTATA
+GCCTGGTCACTACCCGTACCTGTTACACCCTGACTGCACTGTATCGCATATACCCAGAAG
+CTGCTCGCAAGATCTCAGCCGCTCAGGCAGCAGAGCGTCAACGTGCTGTTCAATCAAAGA
+CTTCCGCGTTCAACCTCTGGTGTCAGAACCACCAAGAACTGGTGGACGCCATCACGCAGC
+AAGACGGCGAGAACAGTTTTTTGAACAGCCTGAAGTCGACGTTATCACGCAAATTTCCAT
+TAAGTGATAAACAACTGACGGTCGCAGCCAGAATCCTCGGGATGTAATAAATTAGATTCA
+GGCTTTTTTAATTCTTATTTATTTAAACTCATTTCGTTACGGAGGAAAATATGATCCATT
+CATTTAAAGACAGGCGATTGGAAAAGTTTTTCCGTAATGGAAAATCCACGGCAGGCATTC
+CTGCTGAACTGATTAATGCGATTTCATGCAGACTGGAAACGTTAAATAATGTTAAAAACG
+AACGCGAATTGTTATCTGGTAGTTTGCGGTACGAACGCTTAAGAATGACCGCAAACCGGT
+ATTCTTCCATTCGAGTTAATTCAAAATATCGGCTATTCTTTGAGTGGAACGATGGCGTAC
+ATAACGTCCACCTGTCGGCGCATGATTATAAATCGCTCATCCATTAAGGTAAAAAATGAA
+ACTTTTCGGTATTTCATCCCGGGATTCAGGCATGGATGCGATGTTTTATATTCAGGCCAG
+CACAAAACAACAGGCAAGCTTCATATTTGACTTCCTCGCCACCCGGCTGTATGCGCATTG
+CCAGCTTATTGAACCTCTGAATGAAACCATCATTCCCTCCTTAAGTCGGACGACGCTTTC
+ATTACAGCCCTGGTCCCAGAACTCCCAGACCCGGACGAGTGAGATGCAGATGGTTACGCA
+CGGTCTGACACTCTCCGGGGCAGTGATGGTGGAGCACTCCCGCCAGATCGTCGACTTCTG
+CGATAACCTGGGTCTTCGCCTTGATGCTCCCACCGGAAAACCCGGTTGGACAGAACTGAT
+CAATGCCGACTGCGAACAACTCAATTCCCCGCGTCTATACCCCGTCCTGATCCAACCGGG
+CACTGAAGGACAGTTTCAGATTTATGTTCCAGCTCCGGCTGTCATTGACGCCGATACGGT
+CATTGCCAGTGTGATCGACGAGTGTTTTAGCGATGTTACCTCGTACTGCTTGGCCGGTAC
+GCCGTTTCCAATGACGGAGAAACCAGTGATCCGCATGGAGGCACACCTTAGTGACGCACA
+TACCCGGGTTTTTGAGCTGACATTCATCAGCTATAACCTGGCGCTCTCTGCCACGGTCTA
+TGACAAAAACCTGCGCCAGGTACTGATGTTATGTGAAGACTTTGGCGTCACTCTTCAGGG
+GCGAGCCGGTGCATCCTGTCATGCCTATATGCGTAACGAGTACCGACGTCTTGCTCATGT
+CGGCGTCTACTCACGCTCCGGGGCTGAAAATGATGTTCGCGCCTACAGCTCAGATAAAGA
+GGAAACCCTGATCCGCCAGTTGATGACTCAGGCGACAGCGGGGAGCGCGTTGATTCCGGC
+GCGGCACGGAAAGCAATTTAACGGCGTGCTGATGAATGCCAACCCGTCATCAGCCACCAC
+TGGCTTTATCTACCTGTCACCGGAATTTCCGCAAGGGCAGTTTATGATGACGGCGGAAGT
+TGTGAAATCCAGTTGCACGCCACGGGGGATCAGCTACATCGAAACGGTGGACGGATACCG
+TTTTATTGTGACGGCATATGACACGAAGGCGATGCATTCCCTGACCGAATTTCTTGCTGT
+TAACGAGGACTATTTTACCCCTTATCGCTGGGAGTAGCGCCATCGTGCCGGACGACTAAG
+GAGGGCATCCGGGAAAGGCGATTTTACGCTAGGTGCGGGGCGTTGAATCTGCGGTAAAAC
+AGACCGGTTCTATTTTAATACCCGATCACCGTAGCCAGCTGCTGCCCAGGTAGGATGTAA
+GAGCAGACCGGTATAAACGATACGGGATCAAGGCAGGGCAACCGGGAAAAGTAACTTTTC
+AGCCAGACCATGCCTTCACAGGAATTGGCGTAATTCTCCGGCGGGGCATTATCAGTTTTT
+TTAATAAACTGTCCGGGCAATGGATGCCCGGTAATTCAGCGCCCTGCCAATTTGCACATT
+AAATACCCTGATTAATAATAATTAAAATAGGCCGAGTCAGTTTAAATAATTAATATTCAT
+TCCATATGAAAGAAACTTCAATGAATGAAAAAAAATCACTTCTTACTTATTAGCCAGAGA
+GCCGACTTTGGTAAAATATCCCTACAGCAACCCAACTGACGGTCGAGGTTAATAGTATGG
+AATCCGAACAGCTCATTACTAAAATTACTCAGACACTGAAACGCCCCGACGGCTCTGAAG
+TACGTATTGTGGTGGAGCAGGCATTCGGCAGTGGCCTCACGCCTTCGCTGGGTGTATATG
+TCCTGCGTCGCCCGACCACTGCCAACAACTGGCAGTTGTGCAAAACCGCACCGCACAAGG
+ACTGGCGCACTATGTCGGTGGATGAATACCAGAAACACGGGCGTTCGGAAATGCTTCGGT
+ACGTCTCCATCGGCGAAATCCTTCGCCTGAGCGCCGCGATCGGCAAACCAATGAGCTACG
+TTGATACCTGTCCGGGTTTACAGGGCTGATGCTGTTTTTTACACGTAGCAGAACTGACAA
+ATTTAAAAATTGAAGGCGGAGAAAAATGATGATTAACTAACAGGGCATCGCTGTAAATAC
+CCCAGACTTAAGCCGACTGTATATTATCTCAGGCCGCATGATGTTTGATGATGAGGAAGA
+GGTGATGCTGGTCGAAGCGGACTCCTGCGGTGAAGCTGAAGCGGCATTCCAGCAACATAT
+CGACGAAGGTGTAGCGCACTTGGATCAGGTGCTTGTTATTTCGTCTGCGTCCCTACAATC
+ACTGTTACCAGACAGGCTCATTGCTTCCTCCCTGACACATACCGTATAACCAAATCTTTC
+CCGTCTAATAAATTCCGCCCTTGTGGCGGTTTTTTGTTTTCCCGTATATTTATTTTACAC
+CGTATCCAGAATAAAAGTTGGATTATTAAATATGGCGCTGTCTGCTCTATAAAAATTTCG
+AACATATTTCATTATTGGTTATTAGGTGCAGGTATCTGTTTTGATATTATCTATTCACAG
+ACAGCAATCACATTTAATTAAATAAGGAGTTATGCAATGGCGAACAATTACACTCAGGCA
+TCCTTCACAATTCTCTGTTCACAGGAACAGGCACAGATGGCACTGGACGCGATTGCGTAT
+GTTACAGACACGGATGTGGCGGAAGGTGAACACTTGCTGTCTAAACCGGTTTCAGAGTGT
+TCCCTCACTGAATTGCTTGTCCTGGGTATTATTCAGAACCACCCGGAGTGCGATCCGTTT
+GAGCCGACTTTTGGTCAGTCGGAGTCACCAGAAAACAATTACGAGCTGGAACTCAAAGCG
+GAAATCACCGGTAAAGGCCTGGCAATCTGCCATGATGAAAGCATTAACCTCGACCACGCT
+ATCGCGGTAACAACTGCCGTGTTGTCGGTGTTTAACCTGCCTGAGATGGTCACAATCAAT
+GCCGCTTTCGTCTGCGACCGACCACGCGAAAACGAGTTCGGCGGTGCGACTATTGTGGTG
+ACTAAAGATACACACCACTACGAAGAAGGCTTTAATTTTTCTCGCCTGATGAACGAAGCT
+CATGATGCCGGTGTTCAGTATGCGTTGGTGAAAGTGAACCAGTACAACCACGAATACACA
+TACACTCAATGCTATCTGATGAGCTGCAAAAAATCAGAATCGGCTTATGACGTTGCACGC
+CACCGCCTGGCCTCTGACGAGAGCACGCCCGACAATCCTGGTGAGGATGGAGTTATCATT
+CTCAGCGAAGAAGACAATACCAGCATGGCGCTTCACAGCGTCACTGAATTGATGCCCGTC
+GTGTACGAAAGCCTGAGCAAATTACTGCCTTCACTTGACGAATTGTGCCCCGTGACTGCC
+TGATAATCCCTGATTGCCACCGGAACAGCCGGTGGCATGGAGAGCTGAAAATGACCAATA
+AAATCCTGATTTTGTCCGCTAGCTGCATCAATGAATTTGCGAGTGATGTCCCGCAAAGCG
+TCTTCTTTTCCATTGATACGTCGCTGGCTAAGCGTATCCGTGAACTGGCGGCATACGTGA
+AAGAAAATGATTTGTACGCCGCCGAGTTTTTCTTCTATGACTGCCACTGGTCCGAAACAT
+TGGAAGAGGACATTGAGGTTCTCATGTCGCAGGCTGCGTTTATTGAAAGTGACAGCAGCG
+GACAGGAAACGATGCTCCGGGACGTAATGCCCTCCTGCCGCACGGAAACAACTTCCATCC
+GGGTCATGAAAGAATCATTTCATCTGACGGCTGTACCCCGTCATTGCGGCGATGACATGA
+TGCTCAATACGCCCCTAATTCCGTTGGCAGAGCTGGAATCAAATGCGACGGTTTTAATTA
+CCCAGCAGTATTCGTGAGAGCGTGGAGAATATAATATATTTATTGCCGCGTAATTTTATT
+TGTTCAGTGTTATTTAATTAAATTGGCATGATTTCAATTTAACTATTTTTAGCTTCACAT
+ATTGCGCTGAAGATATTAAATGGATTTAATAAATATCGCGACAATACAGCGAAAGCCAAA
+TTCAGGAAATAATATGTATATCGAAATGAAAGAAACATTCCTTGAATTACCCTCAGAAAT
+TCAATTTTCTGAGGCGGCTAACGCTGCCATTCTGACGCAGGATAAATGGGGCGATGTCTG
+GCAGACACTGAAGACCGATGCGGATCTGAATTATACTGATGCCGGTGAGCCGGTCAGTCT
+CGCTTCGCGCGTGACGACGGCAACCAGTGCCATTTATCATGCGATTACCGAAGGCTGGAC
+CATGTGCGTCGGCTACAGCGGCGGGAAAGACTCTCACTCGCTACTGCACTTGTTCCTTAT
+GGCCTTGATCCGTGCAGTACGAAACGGGTCGAACGTCAGCCAGCACCACTTCATTCAGAT
+GTCTGACACCCTGATTGAAAACCCTGAGATGCATCATCAGGCCACGCAGGTTCTCAGCCA
+GCTCAGAGCCTTTATTGCCGAACAAGAACTGCCTTTGACCGTCCTTGTGGCCCGCCCGTC
+CATGACCCAGAGCTGGGTCGGACGCATTCTGACCGGGCGTGGACTTCCAACCTGGACAAA
+TTCTTCTACGCGTCAATGCGCTACAGATCTAAAGCGTTCTCCACTGCGCCAGGCCAAAGC
+CCGTTATCTGAAAAATGCACCTGCTTCTGTCCGCAACAAAGTGTGCCTGATGCTGGGTTC
+CCGCGATGATGAGAGCGCCCGTCGGGCAGACAACATCCTAAGAATGGGCGGGCAGGCGGA
+CAGCGTCTCGCTCACGGAGCACGGCGGCGAACTGTACCCGGTGAAAGAGTGGCGGGCACA
+GGATATCTGGTCATTTCTGATGGCCTGTGGTTCTCTGGCGCGATTTCCGCTGCCAAGCTT
+TTTGCCGGACAACTTCAGCCTCGCCACGCTTTACAAAGACGCGACCGGGGAATGTATCTG
+GACGCCGGAGAAATCCACTGTCCGGTCTTCTGCCTGCGGCGCTCGCTATGGATGCTCGCT
+ATGCTGCGCCGTCGGCATTGATCACTCGATGGAAACCTTACTCCGCACTGACCCTGAGAA
+GTACGGCTACCAGGCTGGTCTCAACCGCCTTCAGCGTTTCCTGACCAAAATTCAGTACGA
+CTGGAGCCTTCGGGATTATATCGGACGCAAAGTGTTTGAGGGCGGGTATGTGCGTCTTCA
+GCCCAATGTGTTCTCGTCGTCCCTGACCGAAAGACTGTTCCATATCTGTTGCAGCCTCGA
+TTACGTGGAGGCTCAGCGGGCCGCAGCGGTGCATGAAAAGTTACTTTCAGGCGAGATCGA
+AGATACCGCGCATAACCGCCGCATGTCGGAGCCGCAGTTTCGACTGGTGCAGGAGGCTAA
+CGTGCTGCATATCGACTTTCTCTGGTCACTGCATTGCTTTAACCCGCGCCCATTTCGTGC
+CATTGAACTTTACCGCCAGGTGTGGGAAGGGGGGGCACTGGATCTTCTCGACGATGAGCC
+AGCTATGCAACCAGTACCCCGCACGCCGATGCCAGCACCACGCTGGATGAAGTTGCCGGA
+AGGCCGTATCGGGACGTCATTTGACGGGCTGTCCGATCCGTCATCCGAAATAGCCTATTT
+TGACGGTCGGGAGGATGAGCGAGCTTCCCGCAGTCTGATGAGTAGCGGGGAAGGCCTGAA
+CATCGTTGCATTCGAAGAAGAGGATGAGCTGACGGTCGATGAAGACACGGCATCCTGGAT
+TATCTGGCATGAATATGACGGATTACGCCAGCGTGTGTCTGACGGTGAGTTTACCCCTGT
+GGCGGCGGCACAGTACCTGCTTAGATACGGCGCCGTCCGAATTTCGCGGGGGAAAGGTGC
+GGTGTACCATCGACTCGCTCAACGCGGGCAGGCCTATTCACGTCTTGGCATTAACGACCA
+GACGCCGCTGCCGTCTCTGCTCGCCAGCCGCCGTTTCAAGATCCTGACCGACAGCGATTA
+TCGCTTGCTCGTAGCCCGCAAACTGCGGGGGCAGCGGCAGAAACTGCGCTTCTGGTGCTG
+TGTTGCGGCCTGTGTGGCACTGCACACCTACAACAAAACCCCTCTGGGGGGGTGGATAAC
+GACGCAACTGGAGACAGAACAACAGCTACATCTGGCCCGGACGGGAGACGAACTGAAGGC
+AAGGACTCTTGACGCTGTCCTGACCCTCTGTAACCTGCGGATTTCGTCACAGCAACCGGA
+AGAACGTCTGTATTACCGGGCCGTAAGAAAACGCTTTCTGGAGACATTAGCCGGGTGTAT
+TTCGCCGGAGCGCGAAGGAACCTTACGGGAAGTCATCTGGGAGCTGCGGATGTTATCCGG
+CCCCCAGTCTTCGAAAAAGACGGGGTTCCGGCATGTGGATGAATGCCGGGAGAGGACGGC
+GGCGTTGTTAAGGCCTCTGTTGAAACGTATGGTCCGCCTGCTGGCGTGAGCCCACCAGCA
+AAATCAGACATACGTGCAAAAAACGTGAAAATAGCCCCGTTAACGGAAAAAGCGCCGAAT
+GGTGTGTGTTGTAATGAGCGCAGGTGCGGAATTCGTTAAAGGGACTGTTTTGAAAAGTAA
+CTTTTACATCAGACTAATAATAACCATTTTTTTATAAGTAAGGACTGATATATGACCGAT
+ATTAAGGAGAAACAAAATCACTTTAGTAAATTAAAGTGTATTGCAATTTCCTGGCATTTT
+AATAAACCTACTGGGAAGGAGCACCTTCTTTTATTTGTTGCCATTGTGGCATGGATTTTC
+CCAGGACTGGTGTTTTTCAAACATTCTCTATGGGGCGGACTCCTGTTCTTTTTTTTTGTT
+GCAGGTAGTTATGCATTCCTGGCTTTTCCTCATTTTACTCATCGGAAGAAAATCTGGAAG
+GAAAGGCTTGACCAGTCGCTGAAAGAGTATCAGCCGCTTGATCTGCAAGCCTGGGCGTAT
+TTTAAGGACCGCGTTAGAGAGGAAGGCATGACTTATAAAGCCTGTGAGTCATGGATGAGT
+ACTGAGGCTAGTGCATTATATAAAAGCCCCAAACAAGAATGGTCATTTCTCGACAGCACT
+TCGGTTGGAGAAAATGATAAGTCACAACCCGATTAACAGATTCACTAATTATTGAAAACG
+AACATTTAAATTTAATCAAAAACCGCCCTGATCACAGGGCTAATTATTCAGAGGATTGCA
+CTATGCCTATTCAAGAAAAAACCACCGTTTTCGTTTTTAATGCCTGTCATGCTGACAAGG
+CTGCTGCTGCCAGCGCCAATGCACTGCACAGCCTGGAAGTTGAATACCCAATGACCCTGA
+ATGATTTGTCATTGCTGTGTGAGTCCGTCGCTAAAGCGTTGGATGTACCCGGCGGAGTGA
+AATATGAAATTACGACTGAGCCGGTAGTGGATGGGGAATACGATTAATTTTGGGGGAGAA
+CACCACTTTATCAGGTAGGGGGGCAGTTGCCCGTTCCCGTAAAACTACCGACAGTTTCGG
+TATGCCTGGCTGATAAAGAGGGATAGGCCTCTCAATGTGTGAACCATGTGTGAAAGGAGT
+CAGCACAGTGAAGACACGTGGAATGCTTTTTAATGATGAAATGGTCCGGGCAATTCTGGC
+AGATCAGAAAACACAGACGCGGCGGATTATAAAGCCTCAATATAGTTCGGATGAATGGTC
+TATAAGGCCTGCGCAAACACCGCGACATCGCGGGCACACGCATGACTGGTGGCTTCCAAC
+AGGGACCCAGCCATACTCGGCGCTTCGGCCTTGTCCGTACGGCGTAGTTGGCGACCGCAT
+TACGGTCCGTGAGGCGTTTTCATTGCTCGGGAATGAAGATGCGTGCGCGGTGGACTGGAA
+TGACAACATCGTGATGGACAGGACTGAAGCAGCCCGCATTTACCGGGCGAGCTGCGAACA
+GCGGTCGGGGGATTATGGGCTGTGGTCGATCCCTGATGAGGCCGACTGGAAGCCTCGTAC
+CGAAAATATGAAGTTCGAAGGTGCGTGGACACCTTCAATCCATATGCCTCGCTGGGCCAG
+CCGTATTGCACTGGAAATTACCGATTTGCGGGTAGAGCGGTTAAATACCATCAGCGAGGA
+AGATGCCAAAGCTGAAGGCGCACCAACAGAATGTTGTGTTCTTGGCGATAAGCACTTTCT
+TGGCTTCCGCAGCCTCTGGAAAAACACGTACGGCGAGGACAGTTGGCAGGCCAACCCGTG
+GGTCTGGGTCGTCAACTTTAAGCGTATTACCGGGGAGGTCGTATGAATAATGAGATGAGT
+TCGCTGGGTACGCAAAAGGCCGAGGGCCCTTTTGTCCTCCTGACGTTGGTCGGAGAGGGT
+TTTATCTTCGACGAGCGGCATGAAATCGTCAGAATTAATGGAAGACCAAAGCAGATTGGG
+GTAAAGCGGAATTACTTTGAATCTGATCTGGGAGAAGGTAAAGCGAAATACTGGACACTG
+GATATTAATGAGGCCCATGTATTTCCCACTCTGGATGCCGCGACCGAACAGCTATGCAAA
+TTAAGCCGACCACACCTGATTAAAATTCGAAAACTAATTCAGGAAAATAAATAAAAAATC
+GTCTTAATATGGTTGGGAGGTCCGGTGAAAGTTCTAAATAACAAAGGCGCAGTAATCGAA
+TTACCCAATTTTTCAGAACTCCTCCCGAAGGTTGAATCTGATGATGGGCGATTTTCAAAA
+CCAAAAAATAAAATATCCAAAGAGCAACGAGCCGAACTGCGTTTGAAATTTGGCGGTCGG
+TGTGCCTACTGCGGCTGTCCTTTGCCGGAAAAAGGCTGGCATGCCGATCATGTTGAACCG
+GTGAGGCGGGATTTTGAAATGGTCAGAGCCCCCGCTGGAAGTCGAGTGACACACCGGGCT
+CGAAGTACCGGTAAGGTCATGCACCCTGAACTGCATGCAATCGAAAATCTTTTTCCGGCT
+TGCGCCCCCTGCAATCTCTTTAAAGGTGCATTAAGTGTTGAAGGCATGAGGAAAGAAATA
+AGCCGCCAGGTAGAACGCGCCAGGGCATACAGCGTCAACTTCAGAACCGCAGAGCGATTT
+GGGTTAATTGAAGTCACGGAAAAGCCGGTTGTCTTCTGGTTCGAAATACATCAGGCGACG
+GCACAATAATTGAAGGCTTAATAAACGAGGAGAATACCGATGTTTTTGCACCTTGTACCA
+AAAATCCTGCATCCGATGGGAAATCTTTGCACGCTGGATTCCGTAAGCGTCCCGGAACTG
+TCGCTACGCCTGACTGGTAATGACCTTGTTGCGATGCGCCCTTATCCCAACAAGCAATAC
+CTGGTGGGGATGCTGAAGGGGCGTAGGGCGCTGAATGGATTTTTGGTCAAAAGTCCCCGT
+GCGTTTGAAGAGTTTACGATGGTGTCCGTCTGGAATATCGAAGGATTCGGCAAAATAACG
+CACACCCTGAAGACTTTTGTCGAAGATACAGATTATGACCTGGTTTCCCATGACGTGCTG
+CTGGCGCAAGGGAGCTACCGAGCACAAGCGTCTGAACAGTGTCGTGTTCACCCTGTTTAT
+AAAAACATTGCGCCGGTACACATCGAACCGAAGATGGAATCACTGCTGTCGACCGAACCC
+AATTTCGAGAACGATGTCTGTGAAACCCATTCGTGGGGGATGCTGGTGCGTTCGCGGGAT
+GAGGGGTTTAAGGCAATGACGATGCCTTCCGCACGCCTCCAGGAGTCGGTAGCGCTGCGG
+GGGGATCGCCAGCCACAATTGGAACAGGCCATCGTTATTACCGGGTGAGCGAAGGTCAGC
+CTGATGTCGTTGCTCAGGCTGACAGATATCTCAATGGATATATATGACATGACTGAAAAA
+GAGGTTCGAATGGACGAAGATAAGGTACTGAGTTTCATAAACAGCGGGGACGGCGACGCC
+GGAGATCTCCTTGATGATGCAATGCCGACTGCCGCACGTCGATTCTACCGACTGACTCAG
+TCGATGCACACATTGCTGGGGGAAGTCAGAGAGCATTTTCCTGATGCTATGTTTTATTCC
+GCTAACGGCAAGGTGAGCCTACTGCTTGGGAGTAGTCATAACAAGCATGACCAGCCAATG
+CAGGAAATGGTGGCTGTTTCTGCGACGCAACTTCATATCGAAGGTGGTGACTGGTAGGCC
+TGTCGGTGTAAATCGCGAAAACGCGAAAAATTTTAGAGACGTGTCCTATATGTCGAATAC
+ATACTGAAGGTGGATGATTCCTTTCTTCATCCTGAAGGATATTAGTTTAGTAACTCGATT
+CAGTATAATAAATTTAAACCCCATCCATTCAATTACCTGCAAGGACATGAATATGGATAA
+GTATCTGGCGCTGGACAGGGCACTCAACGAAATTCTTACCCCAGTTCCTACGCCGTTCTC
+GACATTATTTGCCGGAGAGATCAAAGCAGAGTGTCACCGGATTGCAGCCGGGGAAAGCAA
+TCCGCAACCGTCGCATATTCTTGATCGCCGTTTGCTGGCGCTGTGTAAAGCAGGTCAAAT
+TAATTATACAACCGGAAAAGGGTGGCTTAAATGAGATGGTGCCATTTTGCCACAAACTTG
+AGGAAAAACTCATGACAAGCAATCGCTGCCGTGAAATTAAAACGCCACCAGAGCATATTA
+TTGCGGATTACATTCTTCGCTTTATGAAGAACAATAAAGAGGCAAAACTCTACGAAGCCA
+TGAGCCGCCTTGAAAGTAAAATCAATCTCTTTGTAGCTGACGGTCATGATGAACTACACA
+TCCGGGCATTGTTAAATCAGGCCGCACATAGCCATACCAAAGAATCATTGAAACAGGCCT
+GTGAACGGATTTGTAATTAAATTTTTTGTGTTAAATTCTGTCTGTAGTTGCCTCGCCACA
+GGCATCCTGACCGACACTCTGCCACCGAAAGAGGGACGCAATTCTAGTGAAATTTATCCT
+TATGTTTTTCATTTTAGCCATTCTGATCTGGGGTTTTACAGGTCTGACTTTTAAAGATGC
+CATTCTGTTTACATCCGTCGGCCTGAGCATTTCGGTTGTGGCTTTGTCTGCGCTGCTTGT
+GGTAGCTCTGACATTTGTCATGGCTGCAATGTATGCGGCTCATGAACTGGGATCGCTTGG
+TAAAATGATTATCTCTCAGGTCGTTCTGGTTGGATTCTGGAACCTGATTTTTTCTGTTAT
+CCCGGACGGAAAATTAATTTCGTTTTTTGGCGTTAATGTCTGGCAATCTGGTTCATATCT
+AGTTTACTTCATGACGGTGTTGGTAGCTGTTTTCGCAGCGTATATCGCGCTCCAGAAGCA
+GCGATAGTTCTTTTCCTGATGTAGTGCATAAGCCTTCCCTTTCGGAAGGCTTTTTTCTGC
+CTTTAGCGCGGAGTGTTTTTAAACTGAGTCCGGCTGCACTCCATTTAAATTTAATTCAGT
+CCTATCTAATAAATCGCTTATTTTTTCATTCTGGGTTATTAGCCAGACGAGACAGTTTGT
+TATATTTGAATTACATCAACCGAGGGCGAGAAAAATGCAGATTAATAAAGTTATGTCTTT
+ACTTGATATTCTTACCAGCTGGCTCGAAGACAATATTAATATGGAGTCTGACCTGTTTTT
+CGATAACGATGTAGACAATACCACCTCAGAGTCCCTGTATCCCGCTGTGGAAAAAGCTAA
+CGCTGTATTGAGCAAACTGGCGTCACTGTCGTCAGAGACGATTCAGGCGACGCGTCAGCG
+TTTGCAGGACGCGGTAGAAGGCAAAGGGGAGGTTTCAACTGCTGACGTCAAAGAGTTGCT
+ACTGGCCACCCGATATCTGATGCTGACTACGGATGGAGAATAAGTTTATGACCACATTAA
+CATTCGAAATTGCTGGGGTAAAAAAGCTCCTCGAAGAACTCCGCTCGGCGGAACGGTTCA
+ATGCAACCATTGAACAGCTTTTTGAACCGTCAAATTACCCCGGCGGTACTCCTCTCAACG
+AAGAGGGCAAAACAGAAGTGGAAATGAACCAGACGGGGGGAATTTTCTGGCCATCATCCA
+AACACATTGACCCGGCCCGCCTGACTCCACAGATCCTTCTGGTAAAAGATCATGGCGTCT
+ATCTGATTACCAATGCATCTCTGGATGGAACCCCTGTTTCCCGTGATACGGTTGTCTATG
+CCCGTGGGATGAATCCGTCTGTTGATGATGAATGGTATGACGAGGCAGAGGAGGCATTGG
+GCGGCGATGATAGTTCGGTCTCTATCCCGGTGGCGTGGTTTGAACTCGCTCTTAAAAAGA
+AATTTAATGCTTTTAGTATCAAAGTATCCCCCACAAAAATCACTCTGGTGAATGGATAAC
+CACGGCACAGGCTGGCTATCTCGCTTAAACAGTCCGTCCCTGATCTATTAACAGGGCGGA
+CCTTATTTAAGACACAGGACACTAAAAATGGTTATTGACGCTGAGAATTCGGAAATGCAT
+CAAGTACGTGATTTTATCGCTGCAAACTGGAGCCTGTTTACTTCGCACATCCGCGAGAAA
+AGCATGACTGATGAACAGGCCGAAGAGGAAGCTCAACGCATTTTTGTTGTTGTCGGAGGG
+GGAAGAGTAAAGGCATTTGCCTCGCTCAGGGATTCAGCCAGGTGCTGGATATGCACGTTA
+TTTTCAGGTCTGTCCGCTAATCTGTCAGCCGGACAGCCCTCGTTATAAAAGGAACATTAT
+GGCAGACACAAAACGTCCCAGCTCCCCGCTTACACAGGCCCAAATCTATGTGCTACGTCG
+CCTGGCATCCGGAACGACATGCAAGTTTTTTTGACTTTCCCGCGCGGAACCCAATTCACT
+GATTTGTGCCCTGCATAAGAATAACTTGCCGCCGGACATATCGTCGGTGGAAAAGTTACT
+TTTCTATATTTCGATTGTGTTCTACAGCATCGTTCTTTTCCTGAGTTCAGGAAGTGACAG
+GCCATAGGCACCTCGAAAATACTCTCGTCATTGCCTCCCTGATGTGTCTTTTTTCTTGTC
+AAAATAGGCCCGTTACCGAAAAAAAATTGGCATCTGATATGGTGTAATGCTGGTGTCATT
+TCACCCCAGAAGGATAGCTCCTGATGAAATTGTTCTACAGCAAACCTGTTCGCTTTATCG
+TCATTATCTGCGTATTTCTCCTCGGCGTTGATAACCTGAGCGATATGTTCGTCGATATCT
+CCCGACCAGTATTCTACGGCGGTCTCGCTGCACTCCTGGCCGCTGCCGTCGTTATTGCCC
+GCGTTGATTACAACAAGAACGCGGAAAAAAAGGCCAGCCAGGTCCATTAACCTTTATTCA
+GCCACCTTACGGTGGCTTCTTTTTTATTAACAAGGACTGACTCATGCATAACCTTGAAAT
+CTCTACCATAGCCATTTTCAGTGCCCAGTATAAAAATATCGAAGAGGCCGAGAACGCCGG
+GGCCTTATATTCCGTCGATATCGAATATCCGATGACTCTGAATGACCTGTCGCTGCTGTG
+TGAATCTGTAGCAAAAGCCGTTGGCGTCCCTAATGGGGTGAAGTACCAGTTTGTCACCCA
+GCCGCAACCGGAAGAAAGTGATTATTAACGCGTATAGCGCCTGACTGAACAGGAGAGGAA
+TAATGGGCCATGTCGATTATACCCGGACACTCCGGGTCCAGCTTTACGATGCCAGCCGCT
+TTCATGATGGTGCGACGGCGGAACAGGCTGGTGAACTGCACACCGTCGCATTCAGTAAAC
+CCGCGATTGCCGATGATATTCAGAAAATTGTCGATACCACTGCCGAGGTGCTCGGTAAAC
+GGTACAGCGTTAACGTATTCTCGAACTGAGCGCCAGTGAAGGAGGTATTCAGAAAACCTC
+CTTCTTTCTATATTTTATATCAAAAACCGTCAAATTTAAGATGCCGCCGTTCATCGCCAT
+CTGCACCTGACCCTGACTATTAATATCCGCCAGCAGAGCATGTAACGTTCCCCACGCTTC
+GCCATTGGCTTTTTGCCAGTACATTTTCACCCGCTCTGTTTGAGGATTAACGGTATACGC
+CTGTACGGTCAGCGTCGGATCTGAGAGTGCGCAATCATCAGCGGCAACAGCAAACAAGGG
+AAGTAAGGTGAGGGCGAGAAAAATCCGTTTGAGATTCAAGGTGATCATTCCTTTACCAAT
+GAGTAGCTGATGCGCCATTATAGGTCCTGGATGTGGGATTTTTTTATCCTGTTAGCGACC
+TTGACGAGTACCAAAAAGCGCGAAGTTCAACTATTGTTCTGTGGTGTTCTGTTGCGTGTT
+GACGGCAAAATTTTGCTGGCGTAACATGCGCGCACGATCACTCTAAGAGGACATTCGCCT
+TGGACACACCCAGTAGATACTGGCTCACTATCCTGTCATCCAGGATCAACTCCTAAGGCT
+ATCCCTTTTTGCTGATAGCCTTAGCGGTTGTCAGCGACCTCAATTTTTCCCGTCGCGCTG
+AGTCAGGCTGTTTAATGGTCTGAAACCCAATTTGTTTCTGTGTGCCCACCGAACTGTCCG
+ATATTTTAAGCATTGGGAGTCCCGGTCATGCTGAGCGCATTTCAACTGGAAAATAACCGA
+CTGACCCGGCTGGAAGTCGAAGAGTCACAACCCCTTGTAAATGCAGTATGGATTGATCTT
+GTCGAACCGGACGACGACGAGCGACTGCGCTTACAATCTGAACTTGGCCAGAGCCTGGCA
+ACCCGCCCGGAACTGGAAGACATCGAAGCATCGGCACGTTTCTTTGAAGACGACGACGGC
+CTGCATATTCACTCCTTCTTCTTCTTTGAAGATGCGGAAGATCACGCCGGTAACTCCACT
+GTGGCATTTACCATCCGTGATGGTCGTCTGTTTACTCTGCGTGAGCGTGAACTGCCCGCT
+TTTCGTCTGTATCGTATGCGTGCCCGTAGCCAGTCGATGGTAGACGGTAACGCCTACGAG
+TTGCTGCTGGATCTGTTCGAAACCAAAATCGAACAGTTGGCAGATGAAATTGAAAATATC
+TATAGCGACCTGGAGCAGTTGAGCCGGGTGATTATGGAAGGGCATCAGGGCGATGAGTAC
+GACGAGGCGCTCTCCACTCTGGCGGAACTGGAAGATATCGGCTGGAAAGTTCGCCTGTGT
+CTGATGGATACCCAGCGCGCGCTCAACTTCCTGGTGCGTAAAGCGCGTTTACCGGGTGGG
+CAACTGGAGCAGGCGCGTGAAATCCTGCGAGATATCGAATCCCTGCTGCCGCATAACGAA
+TCCCTGTTCCAGAAGGTGAACTTCCTGATGCAGGCGGCAATGGGTTTTATCAACATCGAG
+CAGAACCGCATCATCAAAATCTTCTCGGTGGTATCCGTGGTATTCCTGCCGCCGACGCTC
+GTTGCTTCCAGCTATGGCATGAACTTTGAGTTTATGCCAGAACTGAAGTGGAGGTTCGGC
+TACCCTGCCGCGATTATCTTTATGATCCTCGCGGGCCTGGCACCGTATCTGTACTTTAAG
+CGGAAGAACTGGTTGTAATATGAGTGCCGGATAAAGCTATTTTTTTATCCGGCTTATTTC
+TAAAAATTGTCTTTTTTAAAGTCATGCGGATTGAAAACTCTCTCTATTTTATTTTCGGTG
+ATGCTGCCAACTTACTGATTTAGTGTATGATGGTGTTTTTGAGGTGCTCCAGTGGCTTCT
+GTTTCTATCAGCT
+>NODE_24_length_52213_cov_42.1417':NODE_26_length_130_cov_84.9811';
+AGCTGATAGAAACAGAAGCCACTGGAGCACCTCAAAAACACCATCATACACTAAATCAGT
+AAGTTGGCAGCATCACCGAAAATAAAATAGAGAGAGTTTTCAATCCGCATGACTTTAAAA
+AAGACAATTTTTAGAAATAAGCCGGATAAAAAAATAGCTTTATCCGGCACTCATATTACA
+ACCAGTTCTTCCGCTTAAAGTACAGATACGGTGCCAGGCCCGCGAGGATCATAAAGATAA
+TCGCGGCAGGGTAGCCGAACCTCCACTTCAGTTCTGGCATAAACTCAAAGTTCATGCCAT
+AGCTGGAAGCAACGAGCGTCGGCGGCAGGAATACCACGGATACCACCGAGAAGATTTTGA
+TGATGCGGTTCTGCTCGATGTTGATAAAACCCATTGCCGCCTGCATCAGGAAGTTCACCT
+TCTGGAACAGGGATTCGTTATGCGGCAGCAGGGATTCGATATCTCGCAGGATTTCACGCG
+CCTGCTCCAGTTGCCCACCCGGTAAACGCGCTTTACGCACCAGGAAGTTGAGCGCGCGCT
+GGGTATCCATCAGACACAGGCGAACTTTCCAGCCGATATCTTCCAGTTCCGCCAGAGTGG
+AGAGCGCCTCGTCGTACTCATCGCCCTGATGCCCTTCCATAATCACCCGGCTCAACTGCT
+CCAGGTCGCTATAGATATTTTCAATTTCATCTGCCAACTGTTCGATTTTGGTTTCGAACA
+GATCCAGCAGCAACTCGTAGGCGTTACCGTCTACCATCGACTGGCTACGGGCACGCATAC
+GATACAGACGAAAAGCGGGCAGTTCACGCTCACGCAGAGTAAACAGACGACCATCACGGA
+TGGTAAATGCCACAGTGGAGTTACCGGCGTGATCTTCCGCATCTTCAAAGAAGAAGAAGG
+AGTGAATATGCAGGCCGTCGTCGTCTTCAAAGAAACGTGCCGATGCTTCGATGTCTTCCA
+GTTCCGGGCGGGTTGCCAGGCTCTGGCCAAGTTCAGATTGTAAGCGCAGTCGCTCGTCGT
+CGTCCGGTTCGACAAGATCAATCCATACTGCATTTACAAGGGGTTGTGACTCTTCGACTT
+CCAGCCGGGTCAGTCGGTTATTTTCCAGTTGAAATGCGCTCAGCATGACCGGGACTCCCA
+ATGCTTAAAATATCGGACAGTTCGGTGGGCACACAGAAACAAATTGGGTTTCAGACCATT
+AAACAGCCTGACTCAGCGCGACGGGAAAAATTGAGGTCGCTGACAACCGCTAAGGCTATC
+AGCAAAAAGGGATAGCCTTAGGAGTTGATCCTGGATGACAGGATAGTGAGCCAGTATCTA
+CTGGGTGTGTCCAAGGCGAATGTCCTCTTAGAGTGATCGTGCGCGCATGTTACGCCAGCA
+AAATTTTGCCGTCAACACGCAACAGAACACCACAGAACAATAGTTGAACTTCGCGCTTTT
+TGGTACTCGTCAAGGTCGCTAACAGGATAAAAAAATCCCACATCCAGGACCTATAATGGC
+GCATCAGCTACTCATTGGTAAAGGAATGATCACCTTGAATCTCAAACGGATTTTTCTCGC
+CCTCACCTTACTTCCCTTGTTTGCTGTTGCCGCTGATGATTGCGCACTCTCAGATCCGAC
+GCTGACCGTACAGGCGTATACCGTTAATCCTCAAACAGAGCGGGTGAAAATGTACTGGCA
+AAAAGCCAATGGCGAAGCGTGGGGAACGTTACATGCTCTGCTGGCGGATATTAATAGTCA
+GGGTCAGGTGCAGATGGCGATGAACGGCGGCATCTTAAATTTGACGGTTTTTGATATAAA
+ATATAGAAAGAAGGAGGTTTTCTGAATACCTCCTTCACTGGCGCTCAGTTCGAGAATACG
+TTAACGCTGTACCGTTTACCGAGCACCTCGGCAGTGGTATCGACAATTTTCTGAATATCA
+TCGGCAATCGCGGGTTTACTGAATGCGACGGTGTGCAGTTCACCAGCCTGTTCCGCCGTC
+GCACCATCATGAAAGCGGCTGGCATCGTAAAGCTGGACCCGGAGTGTCCGGGTATAATCG
+ACATGGCCCATTATTCCTCTCCTGTTCAGTCAGGCGCTATACGCGTTAATAATCACTTTC
+TTCCGGTTGCGGCTGGGTGACAAACTGGTACTTCACCCCATTAGGGACGCCAACGGCTTT
+TGCTACAGATTCACACAGCAGCGACAGGTCATTCAGAGTCATCGGATATTCGATATCGAC
+GGAATATAAGGCCCCGGCGTTCTCGGCCTCTTCGATATTTTTATACTGGGCACTGAAAAT
+GGCTATGGTAGAGATTTCAAGGTTATGCATGAGTCAGTCCTTGTTAATAAAAAAGAAGCC
+ACCGTAAGGTGGCTGAATAAAGGTTAATGGACCTGGCTGGCCTTTTTTTCCGCGTTCTTG
+TTGTAATCAACGCGGGCAATAACGACGGCAGCGGCCAGGAGTGCAGCGAGACCGCCGTAG
+AATACTGGTCGGGAGATATCGACGAACATATCGCTCAGGTTATCAACGCCGAGGAGAAAT
+ACGCAGATAATGACGATAAAGCGAACAGGTTTGCTGTAGAACAATTTCATCAGGAGCTAT
+CCTTCTGGGGTGAAATGACACCAGCATTACACCATATCAGATGCCAATTTTTTTTCGGTA
+ACGGGCCTATTTTGACAAGAAAAAAGACACATCAGGGAGGCAATGACGAGAGTATTTTCG
+AGGTGCCTATGGCCTGTCACTTCCTGAACTCAGGAAAAGAACGATGCTGTAGAACACAAT
+CGAAATATAGAAAAGTAACTTTTCCACCGACGATATGTCCGGCGGCAAGTTATTCTTATG
+CAGGGCACAAATCAGTGAATTGGGTTCCGCGCGGGAAAGTCAAAAAAACTTGCATGTCGT
+TCCGGATGCCAGGCGACGTAGCACATAGATTTGGGCCTGTGTAAGCGGGGAGCTGGGACG
+TTTTGTGTCTGCCATAATGTTCCTTTTATAACGAGGGCTGTCCGGCTGACAGATTAGCGG
+ACAGACCTGAAAATAACGTGCATATCCAGCACCTGGCTGAATCCCTGAGCGAGGCAAATG
+CCTTTACTCTTCCCCCTCCGACAACAACAAAAATGCGTTGAGCTTCCTCTTCGGCCTGTT
+CATCAGTCATGCTTTTCTCGCGGATGTGCGAAGTAAACAGGCTCCAGTTTGCAGCGATAA
+AATCACGTACTTGATGCATTTCCGAATTCTCAGCGTCAATAACCATTTTTAGTGTCCTGT
+GTCTTAAATAAGGTCCGCCCTGTTAATAGATCAGGGACGGACTGTTTAAGCGAGATAGCC
+AGCCTGTGCCGTGGTTATCCATTCACCAGAGTGATTTTTGTGGGGGATACTTTGATACTA
+AAAGCATTAAATTTCTTTTTAAGAGCGAGTTCAAACCACGCCACCGGGATAGAGACCGAA
+CTATCATCGCCGCCCAATGCCTCCTCTGCCTCGTCATACCATTCATCATCAACAGACGGA
+TTCATCCCACGGGCATAGACAACCGTATCACGGGAAACAGGGGTTCCATCCAGAGATGCA
+TTGGTAATCAGATAGACGCCATGATCTTTTACCAGAAGGATCTGTGGAGTCAGGCGGGCC
+GGGTCAATGTGTTTGGATGATGGCCAGAAAATTCCCCCCGTCTGGTTCATTTCCACTTCT
+GTTTTGCCCTCTTCGTTGAGAGGAGTACCGCCGGGGTAATTTGACGGTTCAAAAAGCTGT
+TCAATGGTTGCATTGAACCGTTCCGCCGAGCGGAGTTCTTCGAGGAGCTTTTTTACCCCA
+GCAATTTCGAATGTTAATGTGGTCATAAACTTATTCTCCATCCGTAGTCAGCATCAGATA
+TCGGGTGGCCAGTAGCAACTCTTTGACGTCAGCAGTTGAAACCTCCCCTTTGCCTTCTAC
+CGCGTCCTGCAAACGCTGACGCGTCGCCTGAATCGTCTCTGACGACAGTGACGCCAGTTT
+GCTCAATACAGCGTTAGCTTTTTCCACAGCGGGATACAGGGACTCTGAGGTGGTATTGTC
+TACATCGTTATCGAAAAACAGGTCAGACTCCATATTAATATTGTCTTCGAGCCAGCTGGT
+AAGAATATCAAGTAAAGACATAACTTTATTAATCTGCATTTTTCTCGCCCTCGGTTGATG
+TAATTCAAATATAACAAACTGTCTCGTCTGGCTAATAACCCAGAATGAAAAAATAAGCGA
+TTTATTAGATAGGACTGAATTAAATTTAAATGGAGTGCAGCCGGACTCAGTTTAAAAACA
+CTCCGCGCTAAAGGCAGAAAAAAGCCTTCCGAAAGGGAAGGCTTATGCACTACATCAGGA
+AAAGAACTATCGCTGCTTCTGGAGCGCGATATACGCTGCGAAAACAGCTACCAACACCGT
+CATGAAGTAAACTAGATATGAACCAGATTGCCAGACATTAACGCCAAAAAACGAAATTAA
+TTTTCCGTCCGGGATAACAGAAAAAATCAGGTTCCAGAATCCAACCAGAACGACCTGAGA
+GATAATCATTTTACCAAGCGATCCCAGTTCATGAGCCGCATACATTGCAGCCATGACAAA
+TGTCAGAGCTACCACAAGCAGCGCAGACAAAGCCACAACCGAAATGCTCAGGCCGACGGA
+TGTAAACAGAATGGCATCTTTAAAAGTCAGACCTGTAAAACCCCAGATCAGAATGGCTAA
+AATGAAAAACATAAGGATAAATTTCACTAGAATTGCGTCCCTCTTTCGGTGGCAGAGTGT
+CGGTCAGGATGCCTGTGGCGAGGCAACTACAGACAGAATTTAACACAAAAAATTTAATTA
+CAAATCCGTTCACAGGCCTGTTTCAATGATTCTTTGGTATGGCTATGTGCGGCCTGATTT
+AACAATGCCCGGATGTGTAGTTCATCATGACCGTCAGCTACAAAGAGATTGATTTTACTT
+TCAAGGCGGCTCATGGCTTCGTAGAGTTTTGCCTCTTTATTGTTCTTCATAAAGCGAAGA
+ATGTAATCCGCAATAATATGCTCTGGTGGCGTTTTAATTTCACGGCAGCGATTGCTTGTC
+ATGAGTTTTTCCTCAAGTTTGTGGCAAAATGGCACCATCTCATTTAAGCCACCCTTTTCC
+GGTTGTATAATTAATTTGACCTGCTTTACACAGCGCCAGCAAACGGCGATCAAGAATATG
+CGACGGTTGCGGATTGCTTTCCCCGGCTGCAATCCGGTGACACTCTGCTTTGATCTCTCC
+GGCAAATAATGTCGAGAACGGCGTAGGAACTGGGGTAAGAATTTCGTTGAGTGCCCTGTC
+CAGCGCCAGATACTTATCCATATTCATGTCCTTGCAGGTAATTGAATGGATGGGGTTTAA
+ATTTATTATACTGAATCGAGTTACTAAACTAATATCCTTCAGGATGAAGAAAGGAATCAT
+CCACCTTCAGTATGTATTCGACATATAGGACACGTCTCTAAAATTTTTCGCGTTTTCGCG
+ATTTACACCGACAGGCCTACCAGTCACCACCTTCGATATGAAGTTGCGTCGCAGAAACAG
+CCACCATTTCCTGCATTGGCTGGTCATGCTTGTTATGACTACTCCCAAGCAGTAGGCTCA
+CCTTGCCGTTAGCGGAATAAAACATAGCATCAGGAAAATGCTCTCTGACTTCCCCCAGCA
+ATGTGTGCATCGACTGAGTCAGTCGGTAGAATCGACGTGCGGCAGTCGGCATTGCATCAT
+CAAGGAGATCTCCGGCGTCGCCGTCCCCGCTGTTTATGAAACTCAGTACCTTATCTTCGT
+CCATTCGAACCTCTTTTTCAGTCATGTCATATATATCCATTGAGATATCTGTCAGCCTGA
+GCAACGACATCAGGCTGACCTTCGCTCACCCGGTAATAACGATGGCCTGTTCCAATTGTG
+GCTGGCGATCCCCCCGCAGCGCTACCGACTCCTGGAGGCGTGCGGAAGGCATCGTCATTG
+CCTTAAACCCCTCATCCCGCGAACGCACCAGCATCCCCCACGAATGGGTTTCACAGACAT
+CGTTCTCGAAATTGGGTTCGGTCGACAGCAGTGATTCCATCTTCGGTTCGATGTGTACCG
+GCGCAATGTTTTTATAAACAGGGTGAACACGACACTGTTCAGACGCTTGTGCTCGGTAGC
+TCCCTTGCGCCAGCAGCACGTCATGGGAAACCAGGTCATAATCTGTATCTTCGACAAAAG
+TCTTCAGGGTGTGCGTTATTTTGCCGAATCCTTCGATATTCCAGACGGACACCATCGTAA
+ACTCTTCAAACGCACGGGGACTTTTGACCAAAAATCCATTCAGCGCCCTACGCCCCTTCA
+GCATCCCCACCAGGTATTGCTTGTTGGGATAAGGGCGCATCGCAACAAGGTCATTACCAG
+TCAGGCGTAGCGACAGTTCCGGGACGCTTACGGAATCCAGCGTGCAAAGATTTCCCATCG
+GATGCAGGATTTTTGGTACAAGGTGCAAAAACATCGGTATTCTCCTCGTTTATTAAGCCT
+TCAATTATTGTGCCGTCGCCTGATGTATTTCGAACCAGAAGACAACCGGCTTTTCCGTGA
+CTTCAATTAACCCAAATCGCTCTGCGGTTCTGAAGTTGACGCTGTATGCCCTGGCGCGTT
+CTACCTGGCGGCTTATTTCTTTCCTCATGCCTTCAACACTTAATGCACCTTTAAAGAGAT
+TGCAGGGGGCGCAAGCCGGAAAAAGATTTTCGATTGCATGCAGTTCAGGGTGCATGACCT
+TACCGGTACTTCGAGCCCGGTGTGTCACTCGACTTCCAGCGGGGGCTCTGACCATTTCAA
+AATCCCGCCTCACCGGTTCAACATGATCGGCATGCCAGCCTTTTTCCGGCAAAGGACAGC
+CGCAGTAGGCACACCGACCGCCAAATTTCAAACGCAGTTCGGCTCGTTGCTCTTTGGATA
+TTTTATTTTTTGGTTTTGAAAATCGCCCATCATCAGATTCAACCTTCGGGAGGAGTTCTG
+AAAAATTGGGTAATTCGATTACTGCGCCTTTGTTATTTAGAACTTTCACCGGACCTCCCA
+ACCATATTAAGACGATTTTTTATTTATTTTCCTGAATTAGTTTTCGAATTTTAATCAGGT
+GTGGTCGGCTTAATTTGCATAGCTGTTCGGTCGCGGCATCCAGAGTGGGAAATACATGGG
+CCTCATTAATATCCAGTGTCCAGTATTTCGCTTTACCTTCTCCCAGATCAGATTCAAAGT
+AATTCCGCTTTACCCCAATCTGCTTTGGTCTTCCATTAATTCTGACGATTTCATGCCGCT
+CGTCGAAGATAAAACCCTCTCCGACCAACGTCAGGAGGACAAAAGGGCCCTCGGCCTTTT
+GCGTACCCAGCGAACTCATCTCATTATTCATACGACCTCCCCGGTAATACGCTTAAAGTT
+GACGACCCAGACCCACGGGTTGGCCTGCCAACTGTCCTCGCCGTACGTGTTTTTCCAGAG
+GCTGCGGAAGCCAAGAAAGTGCTTATCGCCAAGAACACAACATTCTGTTGGTGCGCCTTC
+AGCTTTGGCATCTTCCTCGCTGATGGTATTTAACCGCTCTACCCGCAAATCGGTAATTTC
+CAGTGCAATACGGCTGGCCCAGCGAGGCATATGGATTGAAGGTGTCCACGCACCTTCGAA
+CTTCATATTTTCGGTACGAGGCTTCCAGTCGGCCTCATCAGGGATCGACCACAGCCCATA
+ATCCCCCGACCGCTGTTCGCAGCTCGCCCGGTAAATGCGGGCTGCTTCAGTCCTGTCCAT
+CACGATGTTGTCATTCCAGTCCACCGCGCACGCATCTTCATTCCCGAGCAATGAAAACGC
+CTCACGGACCGTAATGCGGTCGCCAACTACGCCGTACGGACAAGGCCGAAGCGCCGAGTA
+TGGCTGGGTCCCTGTTGGAAGCCACCAGTCATGCGTGTGCCCGCGATGTCGCGGTGTTTG
+CGCAGGCCTTATAGACCATTCATCCGAACTATATTGAGGCTTTATAATCCGCCGCGTCTG
+TGTTTTCTGATCTGCCAGAATTGCCCGGACCATTTCATCATTAAAAAGCATTCCACGTGT
+CTTCACTGTGCTGACTCCTTTCACACATGGTTCACACATTGAGAGGCCTATCCCTCTTTA
+TCAGCCAGGCATACCGAAACTGTCGGTAGTTTTACGGGAACGGGCAACTGCCCCCCTACC
+TGATAAAGTGGTGTTCTCCCCCAAAATTAATCGTATTCCCCATCCACTACCGGCTCAGTC
+GTAATTTCATATTTCACTCCGCCGGGTACATCCAACGCTTTAGCGACGGACTCACACAGC
+AATGACAAATCATTCAGGGTCATTGGGTATTCAACTTCCAGGCTGTGCAGTGCATTGGCG
+CTGGCAGCAGCAGCCTTGTCAGCATGACAGGCATTAAAAACGAAAACGGTGGTTTTTTCT
+TGAATAGGCATAGTGCAATCCTCTGAATAATTAGCCCTGTGATCAGGGCGGTTTTTGATT
+AAATTTAAATGTTCGTTTTCAATAATTAGTGAATCTGTTAATCGGGTTGTGACTTATCAT
+TTTCTCCAACCGAAGTGCTGTCGAGAAATGACCATTCTTGTTTGGGGCTTTTATATAATG
+CACTAGCCTCAGTACTCATCCATGACTCACAGGCTTTATAAGTCATGCCTTCCTCTCTAA
+CGCGGTCCTTAAAATACGCCCAGGCTTGCAGATCAAGCGGCTGATACTCTTTCAGCGACT
+GGTCAAGCCTTTCCTTCCAGATTTTCTTCCGATGAGTAAAATGAGGAAAAGCCAGGAATG
+CATAACTACCTGCAACAAAAAAAAAGAACAGGAGTCCGCCCCATAGAGAATGTTTGAAAA
+ACACCAGTCCTGGGAAAATCCATGCCACAATGGCAACAAATAAAAGAAGGTGCTCCTTCC
+CAGTAGGTTTATTAAAATGCCAGGAAATTGCAATACACTTTAATTTACTAAAGTGATTTT
+GTTTCTCCTTAATATCGGTCATATATCAGTCCTTACTTATAAAAAAATGGTTATTATTAG
+TCTGATGTAAAAGTTACTTTTCAAAACAGTCCCTTTAACGAATTCCGCACCTGCGCTCAT
+TACAACACACACCATTCGGCGCTTTTTCCGTTAACGGGGCTATTTTCACGTTTTTTGCAC
+GTATGTCTGATTTTGCTGGTGGGCTCACGCCAGCAGGCGGACCATACGTTTCAACAGAGG
+CCTTAACAACGCCGCCGTCCTCTCCCGGCATTCATCCACATGCCGGAACCCCGTCTTTTT
+CGAAGACTGGGGGCCGGATAACATCCGCAGCTCCCAGATGACTTCCCGTAAGGTTCCTTC
+GCGCTCCGGCGAAATACACCCGGCTAATGTCTCCAGAAAGCGTTTTCTTACGGCCCGGTA
+ATACAGACGTTCTTCCGGTTGCTGTGACGAAATCCGCAGGTTACAGAGGGTCAGGACAGC
+GTCAAGAGTCCTTGCCTTCAGTTCGTCTCCCGTCCGGGCCAGATGTAGCTGTTGTTCTGT
+CTCCAGTTGCGTCGTTATCCACCCCCCCAGAGGGGTTTTGTTGTAGGTGTGCAGTGCCAC
+ACAGGCCGCAACACAGCACCAGAAGCGCAGTTTCTGCCGCTGCCCCCGCAGTTTGCGGGC
+TACGAGCAAGCGATAATCGCTGTCGGTCAGGATCTTGAAACGGCGGCTGGCGAGCAGAGA
+CGGCAGCGGCGTCTGGTCGTTAATGCCAAGACGTGAATAGGCCTGCCCGCGTTGAGCGAG
+TCGATGGTACACCGCACCTTTCCCCCGCGAAATTCGGACGGCGCCGTATCTAAGCAGGTA
+CTGTGCCGCCGCCACAGGGGTAAACTCACCGTCAGACACACGCTGGCGTAATCCGTCATA
+TTCATGCCAGATAATCCAGGATGCCGTGTCTTCATCGACCGTCAGCTCATCCTCTTCTTC
+GAATGCAACGATGTTCAGGCCTTCCCCGCTACTCATCAGACTGCGGGAAGCTCGCTCATC
+CTCCCGACCGTCAAAATAGGCTATTTCGGATGACGGATCGGACAGCCCGTCAAATGACGT
+CCCGATACGGCCTTCCGGCAACTTCATCCAGCGTGGTGCTGGCATCGGCGTGCGGGGTAC
+TGGTTGCATAGCTGGCTCATCGTCGAGAAGATCCAGTGCCCCCCCTTCCCACACCTGGCG
+GTAAAGTTCAATGGCACGAAATGGGCGCGGGTTAAAGCAATGCAGTGACCAGAGAAAGTC
+GATATGCAGCACGTTAGCCTCCTGCACCAGTCGAAACTGCGGCTCCGACATGCGGCGGTT
+ATGCGCGGTATCTTCGATCTCGCCTGAAAGTAACTTTTCATGCACCGCTGCGGCCCGCTG
+AGCCTCCACGTAATCGAGGCTGCAACAGATATGGAACAGTCTTTCGGTCAGGGACGACGA
+GAACACATTGGGCTGAAGACGCACATACCCGCCCTCAAACACTTTGCGTCCGATATAATC
+CCGAAGGCTCCAGTCGTACTGAATTTTGGTCAGGAAACGCTGAAGGCGGTTGAGACCAGC
+CTGGTAGCCGTACTTCTCAGGGTCAGTGCGGAGTAAGGTTTCCATCGAGTGATCAATGCC
+GACGGCGCAGCATAGCGAGCATCCATAGCGAGCGCCGCAGGCAGAAGACCGGACAGTGGA
+TTTCTCCGGCGTCCAGATACATTCCCCGGTCGCGTCTTTGTAAAGCGTGGCGAGGCTGAA
+GTTGTCCGGCAAAAAGCTTGGCAGCGGAAATCGCGCCAGAGAACCACAGGCCATCAGAAA
+TGACCAGATATCCTGTGCCCGCCACTCTTTCACCGGGTACAGTTCGCCGCCGTGCTCCGT
+GAGCGAGACGCTGTCCGCCTGCCCGCCCATTCTTAGGATGTTGTCTGCCCGACGGGCGCT
+CTCATCATCGCGGGAACCCAGCATCAGGCACACTTTGTTGCGGACAGAAGCAGGTGCATT
+TTTCAGATAACGGGCTTTGGCCTGGCGCAGTGGAGAACGCTTTAGATCTGTAGCGCATTG
+ACGCGTAGAAGAATTTGTCCAGGTTGGAAGTCCACGCCCGGTCAGAATGCGTCCGACCCA
+GCTCTGGGTCATGGACGGGCGGGCCACAAGGACGGTCAAAGGCAGTTCTTGTTCGGCAAT
+AAAGGCTCTGAGCTGGCTGAGAACCTGCGTGGCCTGATGATGCATCTCAGGGTTTTCAAT
+CAGGGTGTCAGACATCTGAATGAAGTGGTGCTGGCTGACGTTCGACCCGTTTCGTACTGC
+ACGGATCAAGGCCATAAGGAACAAGTGCAGTAGCGAGTGAGAGTCTTTCCCGCCGCTGTA
+GCCGACGCACATGGTCCAGCCTTCGGTAATCGCATGATAAATGGCACTGGTTGCCGTCGT
+CACGCGCGAAGCGAGACTGACCGGCTCACCGGCATCAGTATAATTCAGATCCGCATCGGT
+CTTCAGTGTCTGCCAGACATCGCCCCATTTATCCTGCGTCAGAATGGCAGCGTTAGCCGC
+CTCAGAAAATTGAATTTCTGAGGGTAATTCAAGGAATGTTTCTTTCATTTCGATATACAT
+ATTATTTCCTGAATTTGGCTTTCGCTGTATTGTCGCGATATTTATTAAATCCATTTAATA
+TCTTCAGCGCAATATGTGAAGCTAAAAATAGTTAAATTGAAATCATGCCAATTTAATTAA
+ATAACACTGAACAAATAAAATTACGCGGCAATAAATATATTATATTCTCCACGCTCTCAC
+GAATACTGCTGGGTAATTAAAACCGTCGCATTTGATTCCAGCTCTGCCAACGGAATTAGG
+GGCGTATTGAGCATCATGTCATCGCCGCAATGACGGGGTACAGCCGTCAGATGAAATGAT
+TCTTTCATGACCCGGATGGAAGTTGTTTCCGTGCGGCAGGAGGGCATTACGTCCCGGAGC
+ATCGTTTCCTGTCCGCTGCTGTCACTTTCAATAAACGCAGCCTGCGACATGAGAACCTCA
+ATGTCCTCTTCCAATGTTTCGGACCAGTGGCAGTCATAGAAGAAAAACTCGGCGGCGTAC
+AAATCATTTTCTTTCACGTATGCCGCCAGTTCACGGATACGCTTAGCCAGCGACGTATCA
+ATGGAAAAGAAGACGCTTTGCGGGACATCACTCGCAAATTCATTGATGCAGCTAGCGGAC
+AAAATCAGGATTTTATTGGTCATTTTCAGCTCTCCATGCCACCGGCTGTTCCGGTGGCAA
+TCAGGGATTATCAGGCAGTCACGGGGCACAATTCGTCAAGTGAAGGCAGTAATTTGCTCA
+GGCTTTCGTACACGACGGGCATCAATTCAGTGACGCTGTGAAGCGCCATGCTGGTATTGT
+CTTCTTCGCTGAGAATGATAACTCCATCCTCACCAGGATTGTCGGGCGTGCTCTCGTCAG
+AGGCCAGGCGGTGGCGTGCAACGTCATAAGCCGATTCTGATTTTTTGCAGCTCATCAGAT
+AGCATTGAGTGTATGTGTATTCGTGGTTGTACTGGTTCACTTTCACCAACGCATACTGAA
+CACCGGCATCATGAGCTTCGTTCATCAGGCGAGAAAAATTAAAGCCTTCTTCGTAGTGGT
+GTGTATCTTTAGTCACCACAATAGTCGCACCGCCGAACTCGTTTTCGCGTGGTCGGTCGC
+AGACGAAAGCGGCATTGATTGTGACCATCTCAGGCAGGTTAAACACCGACAACACGGCAG
+TTGTTACCGCGATAGCGTGGTCGAGGTTAATGCTTTCATCATGGCAGATTGCCAGGCCTT
+TACCGGTGATTTCCGCTTTGAGTTCCAGCTCGTAATTGTTTTCTGGTGACTCCGACTGAC
+CAAAAGTCGGCTCAAACGGATCGCACTCCGGGTGGTTCTGAATAATACCCAGGACAAGCA
+ATTCAGTGAGGGAACACTCTGAAACCGGTTTAGACAGCAAGTGTTCACCTTCCGCCACAT
+CCGTGTCTGTAACATACGCAATCGCGTCCAGTGCCATCTGTGCCTGTTCCTGTGAACAGA
+GAATTGTGAAGGATGCCTGAGTGTAATTGTTCGCCATTGCATAACTCCTTATTTAATTAA
+ATGTGATTGCTGTCTGTGAATAGATAATATCAAAACAGATACCTGCACCTAATAACCAAT
+AATGAAATATGTTCGAAATTTTTATAGAGCAGACAGCGCCATATTTAATAATCCAACTTT
+TATTCTGGATACGGTGTAAAATAAATATACGGGAAAACAAAAAACCGCCACAAGGGCGGA
+ATTTATTAGACGGGAAAGATTTGGTTATACGGTATGTGTCAGGGAGGAAGCAATGAGCCT
+GTCTGGTAACAGTGATTGTAGGGACGCAGACGAAATAACAAGCACCTGATCCAAGTGCGC
+TACACCTTCGTCGATATGTTGCTGGAATGCCGCTTCAGCTTCACCGCAGGAGTCCGCTTC
+GACCAGCATCACCTCTTCCTCATCATCAAACATCATGCGGCCTGAGATAATATACAGTCG
+GCTTAAGTCTGGGGTATTTACAGCGATGCCCTGTTAGTTAATCATCATTTTTCTCCGCCT
+TCAATTTTTAAATTTGTCAGTTCTGCTACGTGTAAAAAACAGCATCAGCCCTGTAAACCC
+GGACAGGTATCAACGTAGCTCATTGGTTTGCCGATCGCGGCGCTCAGGCGAAGGATTTCG
+CCGATGGAGACGTACCGAAGCATTTCCGAACGCCCGTGTTTCTGGTATTCATCCACCGAC
+ATAGTGCGCCAGTCCTTGTGCGGTGCGGTTTTGCACAACTGCCAGTTGTTGGCAGTGGTC
+GGGCGACGCAGGACATATACACCCAGCGAAGGCGTGAGGCCACTGCCGAATGCCTGCTCC
+ACCACAATACGTACTTCAGAGCCGTCGGGGCGTTTCAGTGTCTGAGTAATTTTAGTAATG
+AGCTGTTCGGATTCCATACTATTAACCTCGACCGTCAGTTGGGTTGCTGTAGGGATATTT
+TACCAAAGTCGGCTCTCTGGCTAATAAGTAAGAAGTGATTTTTTTTCATTCATTGAAGTT
+TCTTTCATATGGAATGAATATTAATTATTTAAACTGACTCGGCCTATTTTAATTATTATT
+AATCAGGGTATTTAATGTGCAAATTGGCAGGGCGCTGAATTACCGGGCATCCATTGCCCG
+GACAGTTTATTAAAAAAACTGATAATGCCCCGCCGGAGAATTACGCCAATTCCTGTGAAG
+GCATGGTCTGGCTGAAAAGTTACTTTTCCCGGTTGCCCTGCCTTGATCCCGTATCGTTTA
+TACCGGTCTGCTCTTACATCCTACCTGGGCAGCAGCTGGCTACGGTGATCGGGTATTAAA
+ATAGAACCGGTCTGTTTTACCGCAGATTCAACGCCCCGCACCTAGCGTAAAATCGCCTTT
+CCCGGATGCCCTCCTTAGTCGTCCGGCACGATGGCGCTACTCCCAGCGATAAGGGGTAAA
+ATAGTCCTCGTTAACAGCAAGAAATTCGGTCAGGGAATGCATCGCCTTCGTGTCATATGC
+CGTCACAATAAAACGGTATCCGTCCACCGTTTCGATGTAGCTGATCCCCCGTGGCGTGCA
+ACTGGATTTCACAACTTCCGCCGTCATCATAAACTGCCCTTGCGGAAATTCCGGTGACAG
+GTAGATAAAGCCAGTGGTGGCTGATGACGGGTTGGCATTCATCAGCACGCCGTTAAATTG
+CTTTCCGTGCCGCGCCGGAATCAACGCGCTCCCCGCTGTCGCCTGAGTCATCAACTGGCG
+GATCAGGGTTTCCTCTTTATCTGAGCTGTAGGCGCGAACATCATTTTCAGCCCCGGAGCG
+TGAGTAGACGCCGACATGAGCAAGACGTCGGTACTCGTTACGCATATAGGCATGACAGGA
+TGCACCGGCTCGCCCCTGAAGAGTGACGCCAAAGTCTTCACATAACATCAGTACCTGGCG
+CAGGTTTTTGTCATAGACCGTGGCAGAGAGCGCCAGGTTATAGCTGATGAATGTCAGCTC
+AAAAACCCGGGTATGTGCGTCACTAAGGTGTGCCTCCATGCGGATCACTGGTTTCTCCGT
+CATTGGAAACGGCGTACCGGCCAAGCAGTACGAGGTAACATCGCTAAAACACTCGTCGAT
+CACACTGGCAATGACCGTATCGGCGTCAATGACAGCCGGAGCTGGAACATAAATCTGAAA
+CTGTCCTTCAGTGCCCGGTTGGATCAGGACGGGGTATAGACGCGGGGAATTGAGTTGTTC
+GCAGTCGGCATTGATCAGTTCTGTCCAACCGGGTTTTCCGGTGGGAGCATCAAGGCGAAG
+ACCCAGGTTATCGCAGAAGTCGACGATCTGGCGGGAGTGCTCCACCATCACTGCCCCGGA
+GAGTGTCAGACCGTGCGTAACCATCTGCATCTCACTCGTCCGGGTCTGGGAGTTCTGGGA
+CCAGGGCTGTAATGAAAGCGTCGTCCGACTTAAGGAGGGAATGATGGTTTCATTCAGAGG
+TTCAATAAGCTGGCAATGCGCATACAGCCGGGTGGCGAGGAAGTCAAATATGAAGCTTGC
+CTGTTGTTTTGTGCTGGCCTGAATATAAAACATCGCATCCATGCCTGAATCCCGGGATGA
+AATACCGAAAAGTTTCATTTTTTACCTTAATGGATGAGCGATTTATAATCATGCGCCGAC
+AGGTGGACGTTATGTACGCCATCGTTCCACTCAAAGAATAGCCGATATTTTGAATTAACT
+CGAATGGAAGAATACCGGTTTGCGGTCATTCTTAAGCGTTCGTACCGCAAACTACCAGAT
+AACAATTCGCGTTCGTTTTTAACATTATTTAACGTTTCCAGTCTGCATGAAATCGCATTA
+ATCAGTTCAGCAGGAATGCCTGCCGTGGATTTTCCATTACGGAAAAACTTTTCCAATCGC
+CTGTCTTTAAATGAATGGATCATATTTTCCTCCGTAACGAAATGAGTTTAAATAAATAAG
+AATTAAAAAAGCCTGAATCTAATTTATTACATCCCGAGGATTCTGGCTGCGACCGTCAGT
+TGTTTATCACTTAATGGAAATTTGCGTGATAACGTCGACTTCAGGCTGTTCAAAAAACTG
+TTCTCGCCGTCTTGCTGCGTGATGGCGTCCACCAGTTCTTGGTGGTTCTGACACCAGAGG
+TTGAACGCGGAAGTCTTTGATTGAACAGCACGTTGACGCTCTGCTGCCTGAGCGGCTGAG
+ATCTTGCGAGCAGCTTCTGGGTATATGCGATACAGTGCAGTCAGGGTGTAACAGGTACGG
+GTAGTGACCAGGCTATAGCCAGTGGCATTACAGGCAATACAGCGGCTCTTATAAAAGTGA
+TTGCGTTCGCCACGTCCATTGCATTTATTGCAAGTAACACGGTAAATATATTCCCCGGTG
+CCTTTTACTGAATCAATACACTTAATCTTAGCGTTATCGATTGCCATTCCGCTACGGTCA
+AAGTATTTATCCATTTTTGATTCCTCAGGTTTGGTCTGAAGTAATAATGACAGATTGGCC
+TCGCTGGCTAATAACCTGAACGAACGTTTTTTGAAAATAAATCAGGAAGGATGATTGAGA
+TGATTTATATATGCAGGATTCAATTTTAATGGAGGGTATTTTCAGAATTATCTGTTTACA
+AAAAACGAAACAAATCCTAATGAGGCATTTATTGCATCACAATAAAAGTGATTGCTTTTC
+ACTCATTTGAGTAGCGATGCTTAAGTATTTATCCGTTTTAAGGTATAACAGCAGCGTGAT
+ACGGCTCAGGGAATGCCTGTCCGTCACCTTAATGATGCTTTACTTCCGGTTGCCGAAACA
+GTCCATATGGCTGACATGTATAACACGCACGGTCTAACGCAGTTCCGGGGGGTGGCACAG
+CGGCGTGATGCCGCTTTAATCTGGAAAACGCAGGCATCTACTGGTGCCTCAGGATCGCGG
+CACTCGCAAGCTGAAACACCAGAGCCTGTTCGTCTTCCGGCTGTATCGCTCGTCCCCGTC
+TACAAAACCCGTCTCATCCGCAGGTATCGCTGGCGCACTCCCAGACGGTTAGAGGCTTTC
+GGGAACTGCCTGGGTCAAAGAACACCGGCGTTCAGGTAGCTGTTGAAATGGACATCTACA
+CGTTTTTGTTCAAGTGATTCAGTTGTGGTGAGGGCATAACGGGTAATGCCCTCCCGTGAA
+GCCCTGAGAAAAGTTACTTTTCCAGGATTAATGCAGTCTTGCTTTTAATATAAATTCAGG
+GGATATTTTTTTAAAAAAATACCTGTCGTCAACTTATTAGAAAAGTAAGTCAAAATGCTA
+GAGTGTTCTCATTCAAAAAGAGGAGAACTAACCATGCCAAAATATTTGTTACCTGCCGAG
+CTTGCGGAAATTGTTTGTGGATTACTGGTGCAACCAGCATTATTGAATGAATTAAAAACA
+CCAGCCACGCATAAAGCATTTATGCAGGACATCGGCGAGCTGGTGGCGAAACATTGCGGC
+GGTCAAATTGACGGCGTGATCATGCCTGAGGTACGCGATGAAGACAGCCAGGCCGATTAC
+CTGACATCTCCAGATGAAACCCCTTATATTGTTGTCTCTCCTGGCCAGGACATGCACTCC
+CTCACAGATAACGTCTGGCGTCATCATGCCCGGGATGGCTGGCTTGACCATATCAAAGGC
+AGTGTCGAAGAAAGCCCTGATGAACTGCCGACCCACAAAGAGTGCGCTGTACGCCGCTAC
+ACCCTCCAGCGTCTGCTCCTTCAGGAAGAAACCAGCCATGCTAATCTGCCAGTACAGGTG
+GTACGGATGTGTGAGTACAGCACCGACGATGTTGAGCAGACCGATTCTTCAGCAGAGTTT
+AACGTCACAATGGCGCTCGGTGGTCATGCCATGCTGGCAGTAAAAGATACAGATTCCCGT
+CTGGTGATGGCCCTGACACTCTTGATTGAAAATGGAGTTCCCTCTGTCCACGTTAATGCG
+GGTGACACTGATCCTTCAGTTCTGCACATCCGGGCAGCTCACGGTGGTCTGGTTCTTTCA
+ACCGACTCCCTTAATCATGATTTCAGTATTTCGCCCTCTGACCAGTATACCTACGGACGC
+CCTGGATTATTATTGAAAGCCGCCTACTGATTTATTAATTCAAAATCCGTCATTATTATT
+TACCCCCATTTTTCGCCCCTAACTTATGGGGCGAGTATATTTTAAAAAACTTTCTTTCAG
+GTTATTAGCCAGCAAACTAGAACTGGTAGAATTAATTCATCAGAGAAAAGGGGACTATCA
+TGGCTAAATTAATTTCGACGCGTGAACTGGCAACAATTATTACTGCATTACTGGTAAAAC
+CAGAATTACTGGGCGAGCTGGATTCCCCAGAAAAACATCGCGCCCTGATGGAAGATCTGG
+GGCGTGTTGTGGCAGAGCATTGTGGCGGTAATGTCACTGAAATCGCACTACCGGAGACCG
+ATGGTACGGCTGCTGAAGGCGCGTTGCAGAATGGCCAGCCCGTCCGCTATCTGGAAACCA
+AAGAAAGCTCTCCGTATCTCATCGTACACCCTGACGCCTCACTGCCGTCGGTGACGCAAA
+ACGTCTGGATGCACGCTGATCATGATGGCTGGGAAGAGCATTTCAACGGAGAGACCGATG
+CCCTGACTCCAGAGATGAGCGAGCAGTTCCGCCAGCAGGTTTATGCACTGCTGACGCCGG
+AATCCCATACCACCTCTTCAGAAATGAGACTGACTTTGCAGGACTGGCAACTGGGTGAAG
+CCGAGATCCCAGAAGAAGACTGTCAGCCCTACCAGGTGAAGGTGTTAGCAGAAAATAAAA
+ACGTTCAGTGCGAAGTGACGAATGAAACCGGCACCACGTGTTTCGGCCTCATTTTGGAGA
+TCGACCGTGGTGTACCGACGCTGCACATTGATACGGGCAGTGATTCACTGCTGCACATTC
+ACGCGGCACATGACGGCCTGGTTCTGACACCGGATGCACCGAGCCACAGATTTGAAGATG
+CTCCTGTAGATCGCTTTTCTTATAACAGCCCGTCCCTGTTGGTGCCTGGGGTGTAACCAG
+GCAAACTGCCCAGCGGTATTTTGGCCCCGGGTAAAATTATTCAGAACAGGAGTCAGGCAG
+ATGGGCGATGTTGCCACACTACCACCGAAAATTAACGATGGCGTACTTCGACGCTGGAAT
+GCTCGCGGTAAAGCGGATAAAGAGGCGCTGGCCGACTATGGCGTTAGCGTGAAGGAGGAG
+TGAATTGCGCGAATTACTTGGAATGGCAGGTGCAGAACATCAAGCCTCCGTAATGTATCA
+AACGTTCGGACACCTCGACGCGAAGCTAGGCGAAAAGCATAAAGGTCACTTCGTTTTTAT
+CAACGGCCAGCACGGCGATCTGTGCGTTGTGCATAGTGAATTTTCATCCTTTGACGAAGG
+TCCAGGCTATTTCAGTGACCGTGCCGACTTCATCTGGGAATTAGTTAAAAACGACGGCCC
+ATGCTCTAAGGTCGGGATTTACCGATTTGACGGCGAATACGCGCTTCCTAAGCGCCGGAA
+TGGGAGAAGATTTTCAGGAAGCGTAACGTGCCTGCAAGCATTCTAATTCCGTGCTGCATG
+AGCGCCGACAGGTCTTCCGTACAACGGGAGGCGGCACAGTTCGCGTGCAACCATCCCCAC
+ACAATAACTCGACTGAGTACATAATAATGACGAACGCTAACGCAAATGACGGGAAGACCA
+GCCCGGTATTACCCACTCTCGAACAGGTCTATGCTCTGCTCAAGGCCAACTATAAACCCG
+CACGATTTGCTGATCGGGATGGGGAAATCTGGGGGCATGAGTATTCATGGAACTTGGCAA
+GATCCAGTTTGCAAGACCTGGAGAAATACGGGAAATCATATGTATCCAAGCATTCCGACC
+GGATGGGCGATGGATTCAGTTTTGGTCCTGACCTGGTCATTATTCGCTGACATACGCACG
+GAAGTGAGTAAGATGGCTGGCTGCGCCGGAGAACTAGAGTAATGAAGGGTAAAAATATCG
+TGGCTCGTGTCGTGCGGGAAGCGGCCTATAAGTGGGAAACTCGCCACCAATTGCAGCAGG
+CGTACAATTCAGCGAGTGACGTGGGAAAAGTTCCCAGACATTCCGGTTCCGCATCTGATT
+TACGCCAGACGCTGTCATTTTTAATTCTTTGTAGGGCATGACGATGAAAAACACAGTAAT
+ACCGACGGTGACTGAAAACGAGATGGGAGAGGTGATCACCCGCCACTCGGCTTACGGACT
+GGTATCAGTAAGCCGCACGTCCACGACGGGACAGCGCCTTTATGCCTCCGACCTCAGTCA
+TAAAGAGGTAGTCACGATGACCTTCAGTGAATCAGAGCAGATTGAACGCGACGGTGTGAT
+CCGTCATCGACTGGCGGAAGGCCGACGCCGCTCACCGCTCCTGCAAGTCAGTCTGTCTCC
+GGCGCAGTGGGCCACGATGATCACATCGTTCGGAATGAGTGACGGCGTGCCGTGTACCAT
+TAACAGCCTGATTCGCGGCGATTATGAGCGGCAGCCGGAGATTGGCTATATTGAGTCGAC
+ACGCGAACGATACGAACGGCAGATCCGGGAAGCCGCTGAGCGTGAAATGGCGAAATTGCA
+TGAAAAGCTGGAAGTGCTGCGTTTGCTGGCGGTAAAAGGCAAGGCTGGAAAGCGTGAGCT
+TGACGAAGCCTATCAGTCGCTGTTAAGCGTAATCAATAACTTGCCGGTCAATCTGGCCTT
+CACCAACCAACTCATTCAGGAATCCATGGTGAATATCGTCTCACACGGCAAGGCCGAACT
+CGAAGCCACCGCCATGGGCGTAGCCGCTCGTCTGGGTATGAAAGAAATGAGCAGCCTTGC
+CTCGCTGGAAGAGAAGAAGTAACCGGTGCGCCCGCCCGTAAATCATGAAATGCACTAACG
+TCCATACCTGCTGCACACATACGCGGCACACAGATCAACGGCCAGCGCATACCGCGTTGA
+CATAAACCGTAAACACTGAAGTGCGTCGTCCTGTCGGGGACATTCTACGTGGTTTTCTAC
+GCCCCCCCCTTCTCTCTTCTGCGGCTCACAGAACTTCAGGAATTGCTGGTGGGCAGTCTC
+CAGGACGTTTTCCAGTAACCGGCTGTGGTCAGCGTCATATCCCTTCAGCAGGCGTTCCAG
+TTCTGCCATAGCGAGTGCAGGTGGTAACCAGATGACGCCAAGCAGCAAAAACTGGCTCTG
+CATTCGAATTTCATGGCGATCTGGCTTCAGACCCTCTGCCCGGGAAGCGCAATAATAAAT
+CCTCTCCAGGGGAGCTACACGCGTGATAAGAGGTTTCTCAGCAAGTTCTGACATGCGACT
+AAATCAGCCTGTTTCGTTTCTTTCTGATTACGTTAAGACACTATGAAAAAGCCCCGTAAT
+ACGGGGCCGGTTCGGAGGCAGTTACTGGATTTGCGGCAGCTCGATCATGAAGCTTGATTC
+ACCGACATTGCCGCTGGTGGCCGGGAAGATGGGGATCAGGACGCCATCACCCTGCCCGAA
+ATCTATCGTGATGTCTTTCGAATCCCCGGGTACGACGGCCACCCCATTCATACTAACCGC
+AAAGGCCGCATCTTTGCGGACCGTCAGCGTGCCGGTTTGTGCTCCAGTGATCAGCGAACC
+ATCTTTTTTCCGGATGCTATTGGTACGCAGATACGCCAGCGGCTGGTTATCTGATGTCTT
+CAGCCCCATACCCACGGCCAGCGTTTTGAGAGTGTTAAATTCAATCAGGTTGTTCGGTAC
+ATAACGGAACCGGCTGACCTTTGTCGTGGTATTACCGGCTTCATCTACCGCAACCGCAGT
+AAGCTGGTAGGAATCCGCATCATCTGTCGCGGGGAAGATACGCGGGTAGTTCAGCCCGTA
+TTTATCAGTTCCCTGGCTGTACCAGCCCACACTGACTTTGTCAGAAGTGGGTCCGCCGCT
+CAGCGTGATGCTTTTCAGGGAAGCTTTTGTCATATCGTCGGCCAGTGTGATCACCAGATT
+TTCCAGCCCTTTGACCAGTGCTCCGTCAGCCTGCTTTCCCTCAAAACTGATATCGACAAC
+AGGCGGCGTGACGTCATGCAGGATGGTATTCGATAGCGTCAGTTCTGCCGTGTTGTTGTA
+GGTGTCCGTCGCGGCACCCGTTGCAGTGTATTTCCCGGAGGGTAACGCGCTGTAATCAAA
+CGTCACTTGTTTCAGCTGGTAGTTCAGGACCGTAACGTTTTTCGGCGACAAGGTAGAGAC
+TTTATTACTGGTGTCCTTCAGTGTGAGGTTAAAGATATTGGTGGCCCACATATAATTGGT
+CCAGTCGTTAGTTACGTCACTGTCCGTCACCAGCATTACCACCGTTTTATCCAGTGGGCT
+GGAGACGATACTGTTGATAACCGGGGCGTTCATATCCCAGTAGGTGTAGAAATGCGACTG
+TAGTCCGCCGAGATTTGCGTATGAACCGGTCCCTCTGATATGAATTTGGTACGGAACATA
+GCCTTTCCCGCTCGTCTTACAGTAATTCATGCTGACCTGGCAACTGCTCTCACCCACTGA
+AACATTGCAACTGCCAATGCCGACGATAGTAGCAGTTTGCACATAAGAGCGCGGTTCAAC
+GTTTACACGACCCAAATCTACGCAATCCGGCCCGGTAAACCTGACGATGTCACTCGAAGT
+CCATGTATTAGCATCTCTGAAATGGTACTGCCCTGACAAATAGCGGGGGGCTTCAGCCAC
+GCCGTTACCCGGAGTAAATTTCAGCGTTTTGTACTGGAGGTTGACGTTAAGGCCCGCTTT
+AGTATGAAGCTCGTAGTACATATAGGTTTCCGGGTAGCTCACCGTGGCTTCAGTATAAAA
+ATAGGTATTGTCGGAGTTGGTAATCTGATCGACCCAGCCGAAGTCTGTCCCGTTAAAATT
+GGTTGAGTCCGATTTAAGGCGTTTGTACCTGAATTTGACTGGGTTCTCGAAAATAGTCAT
+GCCAGGAACATAATCTTCCCAGACGCCTGTTTTCGCATTCCGCACCTGATGTTGAATGTA
+GCTGGGTATTGTACGATCAATACCAGAGCGATGTGATGTTTCTGTCCAGTTCCCGGCTTT
+GTCATAAACCCGAAAACCTACGGTGTAATATGCCGGACTGACGGGCGCAACCGTGCTTCC
+TGCCGCCACCGCCGCCAGTGCCTGGACCACCCCCGTGAGTGCATTCAGCTGAGCATTTAC
+AGTCCGGCGGACACCGCTGCTGTCAATAGCAAACCACTCCGCTTTATCCAGTCCTGACCT
+CGCATCAGAGACGTTCGATAACGAAATGGCCTGGGTTGCGGTCCTGTCGCCGAAAATATC
+CAGACTTCCGTACTGAAAACCAGCCCTGATCCACTGCATCGGATCTGGTAGAACGGGAGG
+AGTGATATCGATGCTGAAAGAGTAGCTGGTTGTCGCCACGACATTCGACTTATTGTCGAG
+TGTTTCGGATTTAAGAGAAAAAGTACCCTCGCCCAGTACCGGCAGTGTCATGGACTTGCC
+GTAGTACTCACTACCATCAGCGGCAGTGATCCTGTCGGCCACTGTCACCAGGCCGGTGAC
+ACTCTGGAACATCTGCACATTATCGGATGAACGTGTCACGGTAACGCGCTCGTAGCGGTC
+GAGACCAGATATCAGATTCAGCGTAATTGCGCTGCCCGGGTTGAGATACTCTCTGGTGGG
+TTCAGCATTCACTTTCGTGCCGCGTGTGTCGGTATACGAATAGTTGTAAAGCTGAGCCTG
+GCTGTAAAGCGGGAACAGCAGTGCCGTATAGACGGCGACAATCAACGGACGTCGGCAAAA
+TTTCATTTCGGTTCTCCTGGTTGGCCAGAAAATTTTACCTGAATCGTTTTCTTCGCCCGG
+GCGCTAAGAGGGGTAATTGTTCAGTAAAACATCGTCCGTTTGTGTGCTTTTTGCCAGATT
+TAATCGGCAGGCCTGCGGGAAATACCCCATCCCAATGTCCGTTTTAGGCTGATTAATTCC
+CCAGAAATCCCCCCCTTAACGGAAAAATCCGCAGGGCAGACGTTTAAAATAGCAACAACT
+AAAAGGGGAATACTGAATGAAAAATCAGGCTATAGCTTTGGCTATGGCTATGCTCGGAGT
+CTCAGTTCCGGCATCTGCTCAAATTTATGAATCCATCTTCACAGATACCAATGGTATTGA
+AGTTCACGCCCCCTCAACCCGGCTGTTGCTGAATCCGGCCTCACCGGTAACCCTGACGCT
+CATTGCCGGTCTTGACCGTTATGTGAATGTCAAAATCACCAGCGCCACCGGCACGCAACT
+GCTGAACACCACTACTACGCGCACCAGCGTATCCGACCGTCTGAAGGCCGGAGATGGCAG
+CGAATTTTACGGAAAAAAAGTAACTTTACCGGTGCTTGGCGAAGGCAGGTCGGTTGTGCA
+GGTCAGTATTCTGGATCTGAATCAGTCCGTTGTAGCCACCTACAGCTACAACTGGCTGGT
+AGACACCACACCGCTGTCTGGTAATGCCCTCACAGGCAACGCCGCCTATGGATCAACTGC
+GGGTAGCGTCTGGAAAATGGGGCTGGAGGCCACGGGGCAGTTTGATTTTACCTCAACCAA
+TGTCACGGACGTAAATGGCATCGAGAAAGGTATGTTTTATGTCTATCACAGTAACGGCAG
+TCTGTTCAGTACGACGTGACTGGTCAGAAGATGTATCACACTTACTCAAAAAACTCGGTC
+AAAGGCGCGGGTATTCCCGACAGCAATCTGGATGAAGATTTCACGGCCAAGGTAGTCATT
+TATGACAACGCAGGAAACACCCGAACCCTTCCGTTGCAGCTCTTTCGATATGATAACTAT
+CTGGGCGGTCCGAGATCCGCAAAGCTCCGCCAGCGTGGTGCCAGGGGTTTCCGGATATCC
+GGCCTATTCAGCTGGGATGACCGTTAATGAGAATCCGATTCATCTTGTATATCGCGTGCC
+AAAGTCCAACTACCGGTCATATGCCGAGGGCGGCCTGCTATTCTATAACCTGTATTCTTC
+CCCGACCGAGATTGCGACGGACAGCACCTATACCTACGTTGAAATGATCCTGCCCTAGTA
+CGGTGGTATACGGGCTGGAGAATATCCGTATAGCTCTGGCGGATAACCTGACAACACCCC
+GGATCACCCGTCTTCAGATAACCGGAGGGCCAACGGCAGATAACGTTGAGCTCACGTGGT
+CACCTGCTGGCACGAACGTTTATGCGCCAGAATATCCAAGGCTGTTCCCCTCATTCGAGC
+CTTCCGAAAACTATGCGCTTAGCGTGACGGTCTCCGACAGTCAGTCGAACAGCAAAACTT
+ATACCCAGAAATTCAGCTACCTCCCGAATAACCTAGTGCAGTTGCATAACCTGCGAACCT
+TATCCGTCAGTTCAGCACTCAAAACGTCGTTAAATGAGCCTCTTGCTTATCTGTCAACCA
+ACGTGTTGCGTAAGTCCAACGGTGAGATTGCAAAAACGTCCAGAGTGCGACGCTAACGGT
+ACGTAAAGACGCTGCCTTCGGTATTAAGTTCAACGGCGTGCAGGCCGCGCTTGGTGAATC
+TGTAGAGGTGAAAATTGATATGGGGCTCGGTGATAACCTTTTAGTACCTATATACCCTGC
+TGAAAACGGCAAAGTGGGTACATCCGAGTTCATGATCCAGATCGATGAGCTGAAGTAATG
+AGAATGGGCCGTCGGTAGTACTGGCGGCTTAACGAAAGTAACTTTTTCTGTAAGGGTTGA
+AGTGTGCTTCTGATGTTTTTAGAACGGATCGGAATTTACTCACATTTTGATCGTGATGAT
+TCAATACGTGACAGAGCATAGTTATCAACAGGATAGAATAATAATAAAGATCAATAGAGG
+ATCAATAGCAGATCAAAAAGGAATAACGATCCTCGCAGCCCAGTGATATCGGGCCTCTCA
+GCGGATCAGCATCCACTGTACAGGGGGAGAAATACACTATGTCGGGTAATCCATCCACTG
+TACCGGGCGCATAATCCACTATACCGGGTAGATTCGATACACTATAGCGGGTAGGATGTA
+GATCTTATGCACAAAACGGATCTCCCAATATGTCAAGTAATAACAACAAGTTATCTCTCG
+TCATTGAAGAGTCCCTAAAAGATTCAGGGGAAGTTATACAACTCTTTCCCACATTAAAAC
+AGACCATTCAACCGAAAGTTTTACTCCGCCTAGGTGTGTTTGTGCCGACTTTGAAATCTA
+CGGACAAGGGGGGGAGGAAGAGCCATCATATCGATGCCACTGAGCCGCTATCAAGGTTAT
+CTATTGTAGAGGGTGAAGGTTACAGCCAGATCCAAATCTACGGGCCGCGTCTCGATATGG
+ATACCGATTTCAAATCATGGTGTGGGATCGTTTATGCGTTGTCTAACCGGCCGCTTGATT
+CAGAAGGTCAGCTGGAGCTGAATTTTCCGGAGTTTGCAAAATTTTGTGGGTTTGATACCA
+AGCGCATTGATAAACAACTGAAAGAGCGCTTTGATGCTTCGCTGACGCGTATAGCCCGGA
+CCAACATTTCATTTATTAAGAAAATACCCGGTACAGATGATCAGATAACGATAAACATGC
+ACCTGGTGGAATCGACGTATTACGACAGTTCCACGGGAAAAATCATCATCAAGCCAAATT
+CGAAGCTCAATACGCTGTATCGCGTCGACGGTAAAACCCGACTCTACCTGAAGACATTGC
+AAAAACTGGCCCGTAAGGAGTCCGCACAGGCCCTGTACCTGTATCTGGCTGAGCTGCCGA
+GCACCTTTTACCGCATCGGATTCGATCGGCTTCGTGGACGACTCCAACTGTCATCACACC
+TCGGTAACCAGAATGCCACGGTTAAAAAGGCGCTGGGCCAGCTTAAAGAGATCGGTTTTC
+TGGAATACTCCATAGACAAAGAAAACGGCGATTACGTACTGAATATTCTAAAGAGAAACA
+TGAAGCCATGACCGATGCCGGATAATGCACCTGCCTGCCGCGTGGGTGGCTGCGTTACCC
+GGTATAGTGGACATTCTTCTCCTTTCCACTCTGCTTTACCCGGTACAATGGATCTCCACT
+ACACCGGGTAGTGTCAGGCCTAAAATTACGATGCAGCCCCTCCTCTTCAGCCTTACACTG
+AATATTTAGTGTGTTTTTTCACCAAAAATGTGATCTATACCCGGTACAGTGGAGTCACAG
+AAATGTGATCCGTACCCGGTATAGTGGATGAGAACTACTGCTAATCGGTTACCGGGAATG
+TGGTGGTACTGGGTGGAAAGGTTTACCCGGTATAGTGGATCGTGGCAGTGTCATCTTTCC
+GGATAGCATGACGTCACGGTTAGGAAACCGTACCCGGTATAGTGGATAGCGAATGGTGTA
+CAACCCTGTTAACGTGATGATGCTGAAGTGAAAGTTTAACCCGGTTTAGTGGAGCGACTT
+AAAGCGCGTACCAGTAGCTGATGGGGGAGCAGCACCCGGTACAGTGGAGGGGCGGATATC
+GTCGTAAAGGTCTTAACTAAAAGATGACCATTCAGTCGCAGCATTAAAGAAATATATCAT
+CGAGTCTCAGGGGTTTTAAGCCGGTAGACACCCTTCCACCAGGAGTCGAAAGACAAGCTA
+TCATCGCAGCGCATAAATATGCCGTTATGCTTGGTGACAACGCTAAGATAGCCTTTATTT
+TTCCCGCAGATCTTCTCAAAAGACTCTGTTGCTTTAATAAAATTTTCACCATCCGTGATG
+GCCGGAGAATCCAGTTCCTTCGCCAGCCATGCCGGATAGCTGTCCGCATTAACCCATACA
+AGGCGTTCAACAACTGAAAAGAAGACGCCGACAAGGCCAATCGTCCAAAGCGTAATAACC
+AGTAAACGCAAAATTCGTAAGGCTATAAATTTTGAGTGCTGTAGAGGCGAAACGATAAAA
+GGCAGTGAGATCATGACTGTGAGTGAGACTGATGCCGCCAGCAAGGTGTATAACAATGAC
+CATGATTTAACATAGGCGGAAAAAGCGATCATTAAACAAATCAGAATGATGAGCGGTGCA
+TTGCTTTTCATCATGCCCGTGCTAATTTTCATTCTTTTGGGGCTCCATTTTGTACGAGTT
+TTGAGAGACTGCGTTTGTAATCATCCGCTGCCTTAGAAAAGTTACCGTCATTCTGTACCG
+GCGTAAAGCGAATGCCAAAAAACGCCTCAATGACGGAGGAAAGCGTCACTATCGGTCCTG
+ACGAGGCATGGGCTTTTCGCTCCCGAGCCTCACGCTCCGCAAAGTGGATCACCGGTCCCC
+TAGAAAATGAGAGTGAGTCATGGGAAGACCAGTCTGTTTATAGCCACAGTAGTTAAACGC
+ACCCCGCCAGTCCGTCGCTGTTTGACATCATGGCCGCGAATTAGGTTAACGTCGCCCGGT
+ATAGTGTAATCCCAGGCTGAACCTGTGTTTGCAGCTGGTGGCCCTGCATCCATCACCATG
+ACAGGCGCTGGCCGCAGGAATCGCGTGCCGGATGAAGGGTATCCACTATACCGGGTGAAT
+GATATGTTGATCCACGCTGACGGGTAGTTTTATGAGCAAACCCGCAGCGAGTGGCAGGCC
+TGTGTCATTCGCAGTTTTACTGATGGGACGGAAGGTTATCCACAAAAACGGTGAATAACC
+CTGTGACCGGAATCTGGATAATCATCATTGCGGCGACAACAACAGAAAGAAGTGGCCCGG
+ACTTGGCCACCCTACCCTGCTTTTACTTCAGTTCCTCTATATTCAGCATAAATTCAGAAG
+TTCCAACGACGCCGGAAGTCGAAGGAAAAATAGGGAAGCTGCGGCTGTCACCCAGACCCA
+GATCCAACTGAACATTTTTGCTCTCCCCAGGAGCTGCGGAAACCCCATTCACCGTGACGC
+CGAAGGCTGCATCCTTACGCACCGTCAGTATCGCGTCCTGTTTCCCGGTTGCGATAGACC
+CGTCCTTCTTACGCAGCTGGCTGGCATAAAGAACCGCCAGCGGTGTGTCATCGGACGTTT
+TCAGCGCGGTACTAACGGAGATGGTCTTAAGGTTTTCCAGACGAACCAGGTTGTTCGGCA
+AGTAACTAAATTCGACGGCGCTTTCTTTAACGTTGTTCATCTCGTCTTTGGCCTGCACGG
+TAAGCGTGTAAGTTTCGCCGTCGTTAAGTGAAGGAAAGATCTTCGGGTAATTCGGGGCAT
+AAAGATTATTTCCGAGGTTTACCCACGACAACTCAACAGCATCAGATACCGGGCCACCGC
+GAAGCGTCATTCGCGTTAAAGAGGGCTTGGTCAGGGTATCTGCGAGCTGAATACGAATGT
+TCTCCAGTCCATACACCGTTACACTGCTGGTGATAGGTTTGGTTTCGTAGCTGATACTGA
+TGGACGGCGGCGTGTTATCGACCGTCACAGTCTTATAGTCCAGACTACCCGTATTGTTGA
+ACGAATCCTGGGCGTTGAGCTGCACGTTATAGCTGCCCTCCGGGATTAGTTTCAGGTTGA
+ACTCGTATGTATAATTCCCGGTTGCTGTGTTACGCCCCGTTAGTGTTCCGGTCACATTGA
+TATCCGCGTTATTGCGGGATTTGTCGGACAGCCACACCCGGCTCAGTTTAACGGTATCGA
+AATACGATCCGTCTCCCGGCTGGTTGATGTAAACCTGAAGGATGTTGGTCGTATCATTGT
+AGTCATAGCCAGTGACCGAAGGCCCCAGCGTATGCCAGACGACGTTTTCCCAGATAGGCA
+TGAAGAAGGTGGATTCTGTTGTGGAACGTACCTCATAACCACTATGCAGATAGCCGGTGG
+TGCCGTTTGTAATCGCCTGTGTCAGGGCGACGGTACACGACGTTGACCCGGCAGGGATGT
+TGCAGGTGGCACCGCCAGTAATTTTTTGGTCGTAGGGCCTTGCCTGCACATTGAAACGGA
+TCTGGGTCAGGTTCACCGGCATATCTGAAGCCTTGAAGTATTTCCAATTGACGCTGTTAA
+ACCAGGTACCATCGGACATCTGTCGCTCAATCGCCGGACTCCCCCATGCAGGACTTTTTA
+CCGAAGCCGGGTCCCAGTTCAGCCAGGAGGCGTATTGAGTCAGATCGCCTCCGGACCATT
+GGTACGTGTTCACTGGGCGATAGTAGTTTATATCCAGAGCGCCCTGGGGAAGCTTCACCT
+CGACGTACACATAGGTCGTGTCTTCTGAAATAACCTTAGCACCGCCATAATTGTTAAGAA
+TGGTGATGCCGCCGTTACGGTATGGCTTCCAGTTGGTTCGGGGGATACGGATGACCATAC
+GGTATGGGTTTTCGAGTACAGATAGCCCCCGAACAAACGGGACGTACCCTGAAGAGATCC
+CCGGGACCACACTCGTACTGACGCGTGAGTCATGAACCGCAAAGGGGGTGTATTCACCTA
+TCTGGTCATCAAATAAAAAGCGCTGCGGCGGAATATTCAGCGTGTTTCCGGCTTTATCTG
+TGATGATAAAATTGAAGGTAAATTCTTCATTGAGATCGCTGGTGGGCATACCGGGTTGAG
+TGACCGAGTCCTTGATCCAGGGGTAAAAGGCACGTTTTGCCGCCGTATCGTAACTGAGTG
+TGTTGTCGGACACGACTGTGCCATTTCCGCGCTTGATGACCAGACGGATCTTGTCTATGC
+CATTCGCATCATCAACTCCATCAGCAAAGATGGAAAACTGGCCAGATCCTCCGCGCCCAA
+GCCCCCAAACTGGGCCACTCAGGACCATTTCATAGCCTGCGTTCTGGCTCGGGTAGATGC
+TGGTATACTTTGGCGCTGTAGTGTCGATTGTGAAATGATACGTTGAAGAGCTGACGACAG
+CCTGCTGGAGATCCAGAGTATCGTTGATGACGGTGAAGGCCCCTTCACCGAGTGCGGGTA
+ACGCCAAGTCCTTTCCGTAATATTCCGTGCCGTCTGCGGCAACAATGCGATCTGCGACGC
+TTATCTTTCCTGTCACTGCGGAATACATGACCTTTTTGTCACTGTCCCTGGTCACACTCA
+CTCGTTCGTATCGGTCAAGGCCGGAGATCAGATTCAGGGTCATTGTGCTTGCCGGATTAA
+GGTAGCTCTGCGTGGCAGGCTTAAGCGTCTTTGCCAGCTGATTGGTGTCAGTATACGAAT
+AGCTGAAAATCTGAGCCGCCGCCGGATAAACTGAAGCTATGGCCGTGGCAATGATACAGC
+CTGTCAGAATTTTACGCATGTGATACTCCCGGGATGTATTTGCCCCTATTTTACGAAATC
+TTTTCACCTGGGCTTGCTGGTTAGCCGGGGTATTTCACGGCATAAAACTTTTAAATGTTG
+CCGTGATAGCAATGTTGTCGGGTCAGAACAAAACGAAAGTTAAGGCAACTTCAACAGGGC
+TGATTACGGTGGAAGAAAAGTAACTTTTCTCTTGAGAAGAAATAGGAAAAGCAGAAATTA
+GGACGATTAAATGAGGTGAAATGTCAGCAACAGGCGATGATTGTCCATCATCGTAAGGGA
+GGGTACAGGGTGCCGCTGCCTTACTGGCATCATGTTGATGTCCAGCTCTTCATACCCGTT
+TGTACCTTAGCCGGAACTGTTGTTCAGTACAGGTAAAAGTTGTAATAACTCCCCGCTCAC
+TGCCGGGGAGTCATTTTAAATCAGCACGGCGCCATCAGAATAGATTAGCTTTCAAACCAG
+GGCGAATCGGCAGAGTTCGCAGATTCTTCACTTTGCTGTGACTCTCCCAGAAATTGCACT
+TCACGTACTGGTTTACTTTTCCCCAGGCTCCGCTGGAAATCATCCATCACAAACTCAATA
+TCATCACGGTCCTCAGGCAAGACAGGCGAACTTTTGGACATAGTCTTTCCTTCAGTTAAA
+AGCGTTCTGCATACAGAACGCGGACGGAGACGGCAGTGTTGTCAAACTCATTATCGAAGG
+TATCCATCCACTCGGTCCTGAACCCCTCGCCCAGCAGGTTATCGATCCCCTGAAGGGACA
+GAGGCAGGACGGCAGCTAAACGCCCGCCGGGAACCAGATGAGACGCAGCGGCCAGCAGAT
+GCAGCTTAGCCCGGTTGTCAGCAAAAGGAGGGTTCATCACCACGCAATCAAATTTCTGAA
+TCTGATTCGCCGCCGACCAGGCCAGAAAATCGGCTTCCGTGGTCTCGTAACCTTTAGCCC
+GGGAGACCAGACAATTCAGTGTATCCAGTTCGATGCCGGTTACGTTGACACTTTTCGGGA
+AACATTGAAGCAAATCCCCGTGCCCAATATTGGGCTCCAGCAGCCGTTCCCCCTCCCCGG
+CCGCAATAATGGATGCGACGTATTCACTGAGTCGCGCCGACGACGGATAAAACTGGTGGG
+ATTTAATATCAGGCATGGCGCCCATATGTCCGATGAAGCGCATCACTTCGGTCGGGTCAT
+AATCAAACGTCACATGGTAGCTTGTCACTCGGGCACCGAGAAATCGCAGAACATCCGCGT
+TCACCTGCCGCGTTTTATCAGCGTTCTCACCGGCATAGCCGAGCGATGTCCAGCTGGACC
+ATTCCTTTTCATTCTGGGTAAAATCCAGCTCTGCAAGCTGCATCCGTGAATGAAAATCGA
+TGCAGCGTTTCAGTGCCGGGAACTCCTGCAACGTCGCTTTGGTATGGGCCACGCGTTCAG
+CAGGCAGAGCCAGAGGGACGATGGCAGCAAGAATGTTGTTAAGCCGTTCGGCGATATCAG
+GATGCACATCAATGTGCATCGATCCGTTTTTGTAGACCCGAAAACGAATACTGTTGCCAT
+CCAGGCTGATCCAGTTTCTGAATCCAACATGACCAACCATATTCTCAACCATTTTTTTCG
+TGTCATAGACCGGTTTAACTGTTTCGCCCCGGAAATAAGAACAGATCACCCGCAACTCCG
+AAAGTGGCATGAGGCCGGATTCTTTAAACTCAACCTTCAGTTTTACCCATTTGTCTTTCA
+CGCCTTCACATACGCCGGAGGTGATCATGCGAGTAGAGAAGCCAAATGCTTTATTGGTTT
+TGTGTTGACGGCTTAATGACTGAAAGACGGCATAGACACGATCTTTAATGAACTGATGCC
+GGTCATTGAGCAACGCGACAACCGTGGTAACAACAGCATCGAGTGTAAAATCAGGGATCT
+CCTGAGGAGGAAGGTGGTAACGGTCAGCAGTAAACTGCTTATCCCATTCTTTCTTCTTTT
+CGTCAGACATCACAGACAGTACATCGGTCAGGGCCATGACCCTCTTCCAGTATTCTGAAC
+GCAGCGCGTTTTCTGCGTAGCTGGCATCCGCTTCTGAAATGAGATGATTGTATCCGGAGA
+GGTATGAATAGAGCTTCTGATTCCCGCATTTCAGGAACTGAGCGGACATGGACCTCAGTA
+AGCTAAGCTCATCGTTATATGATTCGACCTGCCTGTTAATGACATCGAGCTCTTCCCGCA
+TTTCGGGCAGGAAGTTATCGTCGTTAATAAGGAGGCCAGTATGAGGCATATAAGCAACCA
+GAGAACTCCCAGGGGCACCCATTGGCAGGGAATCAGATTCAACAGCAGACATAGCACCAG
+TCCTTTTTGAAGGGTTTATCTGATACCAGGATAACAACCTTGAACAAAAAGCTAATAGGT
+TGGCTGACATGAAAATGGAGAAATTAACACTGCGGAAAGTCAGAAAGACAGATGTGGTTT
+TAATCAGAAGAAACGGGCCGGAGACAGGACAAAAAAACCCCTACATAGTAGGGGCAACGG
+GGGGAGAGCCTGGGTGGCTCGCTCTAAAATATCGTACTTCTTATTGTAGTCTTCTCACAC
+TCTGAAATAATTCATTTAAGCCTGTGCTGGGGGTGTTTCGGATTGCGGTTCTCCGCCATT
+TTTATCGTTTTTCTTGGTTTTGTAAGTCACTTTTTCCCCTTTCAATCGGGCTTGCCGATT
+TTCGGCCCGGCGAAGCTGCTTGTTTTCTGATTCCGTAATCTCACTTTGCAGGTTCTTGAG
+CATCTCCAGCATGCTCCGGTTCAGCGTAAAGGTAATTTCTTCATCTTCGCTGGAGTCGGT
+CACCTCCGGCAACTCGATATCACCGAGTTTCTGCAATAGACTCGTCGTAATGAGTTTGAC
+CCCTTCGACGGCTTTTGTAGCGAGAACTGGTGGAACACGTGCGGGTTTAAAATCGGAAGG
+GACAACACGGATCTGCCCGCGTGGCGTTTTCTTAATCTGGATACCGCTTGAATCAGCCTT
+TTCAAGGTCTGCGATCATCTTTTCGATCCGCGCAACAGCTTCCGTTTCACCGAACTCATC
+GATAAGGGACAGGACTGCTACATAGGAAATGGCATCGGCATGGATCAGTTTTTTGAGATA
+GACACAGCAGCCGGTTAAACGAATAAGAGCAGCAATTGTGGTATTACTTTTTCCCTCACG
+TTCGGCAATACGGTCAAGCGACCATCCACCCAGCGCCTGAAGACGTCGGTAGGATTCACC
+CAAAGCCACAGGAGAAAGAGCCAGGCCACGGTTTCCGTCAATCGTTGTCAATTCGCAGCT
+GATCTCATCGGCTTTCATCTCGATGCAAAGAATGGTGAGGTTAGAATGCCCTTCTGCCAC
+AGCCATCAAAGCAGCCTTTAAACGGCAATGTCCCTGGCGAACGTACGGAATGCCGTCTTT
+GATCAGAACGCGGATAGGGTCTACGTAATCACCCCGGATGTACGCATTCTTGATGTTATT
+GAGATGATCGGCGACTTCTGGCAACTGGTAATAAGCTTCCCCCATTCCCATCTCACGGGA
+GTTGAATCCTTCCGTGATTTGAACCACGGTTGGGCTGATAGCCCATGCTTTCTGTTCAGT
+GACTTCATTACAAAGGTCAGGGTTCGCGTCGCGGAACTGCTTCATACCACTGACGAATCG
+GCCGGAACCGGTCACTGTTGAAAAAGACACGAGTGGGGATTTAAAGACCCGTGAGTTAGT
+TTGCTGTTGGGAATCAGTCATCAGATCACTCATAGATACTCCGTTGAATTCTTTTTTGTC
+ATACCTTTCATCTGTGCGTGAATACTACCGGAAAAAAAAATCTCACTTTTTCGTTAAAAA
+GGTACTTTTTGGGTCTATTCCGAATTGAACGAGGAAAATTGTTCTGGCGATCAGAACAAA
+AAGAAAAAATAACTCAAATAAAACAGATGGTTATGGTTAATTCGTAAAGGATAAACTTTT
+TTCTGAGAAGTGAAAAAAAATTAAAAAATGTGTCGAAATGACAATCTCGTTAACAAAAGC
+CACGTTTTTTCCTGCTCATACCTTATTGGTAGCAATCCGCCTTTCGGTACCATAAGTGTG
+GCATACCGATAAAGCTGAACGGAGAAGACTCGTTGCGAAAACATACACCAATCATCAAAT
+GGGCGGGGGGTAAAACCAAACTGATGCCGTTCCTCAGTAAGCACTTCCCACATGATAAGA
+GCCGACGCTGGGTTGAACCGTTTATCGGCGGTGGCGCCGTGTTTCTGAACATGTTTGCCA
+CCGAGGCTCTCCTAGCAGACAGCAACCCGGACCTAATCAATCTGTACCGCAACATACAGC
+GAAATAAACCGGCATTCATCAGAGAAGTGCAGCTGCTGGCGGAAAGGCATTTTGAAGAAG
+AGGATTACTACGTGCTGCGTAATACCTTTAACAGCACCAGTTTTGATGATGCCCCGCTAC
+AACGAGCAGCCATTTTCTACGCGATGAATCGACTCGGATATAACGGTCTGTGTCGTTACA
+ACCTGAAGCGAAAGTTCTCAGTTCCATGGGGAAAGCGATACCAGTTCAGTCTGGATATCC
+AGAAGGTTGATTACCTCTCATTCAGGCTTTCGAGCGTTGAATTGAAAACCGCAGATTTTG
+GTCAGACGCTGGAGTTTGCAGGTGGTGGTGACCAAATATATTGCGATCCGCCATATGACA
+AAATCAGTAAAACCAGCTTTGTAAGCTATGATGGTATACCGTTCGATAAGAGCGCACATG
+TTAAACTGGCGGATATGCTGGTGGATGCTAATCGTAAAGGGGCCTCAGTGGCCATATCCA
+ACAGCATGACTCCCTTTACGCTGGAGCTCTATGAAGAACGCGGTTTTGATATTCATACTC
+ACAACGCTTATCGGTCTGTCGGCAGTCAATCAAAGTCGCGTAAGAAGGAAATAGAAATTC
+TGGCCGTCCTTCGTTGAGCGGCGATCAGTAGTTAGTCGATCGGGCTTATCCATTCCTCGA
+AGCTCAGCACTTCGGAATGGTCACGGCTGGCATAGGGAATAAACTGAAGCTCTTCAATTG
+ATCGCTCCCCTCTCTTACCTTCGCATATAAACGATATGAACCCCTGATCTGCAAGTTGGG
+TAAGGACATTCATGATTCGTACGTTCACTGTATGCAACTGAAGATCATTCACGATATCGG
+TAATTTTGTGTGAATGGCGCCGGGACTTTCGCAAATAATCAAAGATGACAAACTGGGCAT
+TCCGTCGCTTCAATAATTTTTCCGTCATAAATTCCTGAATTAATCCCCCCAGCAACATCA
+GGAACGGACGAAGTACCCCAGGGAACGTTAACGTATAAGACTGCGATGTTTTGACCAGAG
+TGAAGGACGTCAGGAAGCTGAAGTTTAGTCGCTTCTTTGAATACGGGACATAAACAGCCA
+ATGTCGTAGACAAGTAAGTAAGCAATTCTTCCAGATGAGCGCGTGTGATCATGACCGTCT
+TATCGCTATTACGAAGACCGTGATAATCAATAAATGCCACTCTGGCACGACTCAGCCACT
+CGTGAATGCTTATGGATACAGTGAACGGTGCGTTTTCATCGGCAGAAATGACGCCGTGCT
+CAGCGAGTTGGTTATGGATAAGCATAGACAGCTGGTAAAATGGAAAACGGCAGGATGGAT
+GACACTGTAGGCCAGTTAGCGTTAGCTTTGCATTATCCAAGTCATCGAGCGGAAAAGTAA
+CTTTTCGGGAAATAATTTTTGCTGACGTTCTTGCTGACTTGCGGATGAACCCAAGTCCAA
+GATCATTTTGCATATATCACTCCGTTTTAACAAAATCTCCTTAACCTATATGTTAAGAAG
+AGACAAAAAATTAAAAAATATAATTAATAAGATTATCATTTTTAATTTAAAAGATTAGTT
+AATAACGGGTGTTGAATTTAAAATAAATCGGCTTATTTTCGGAGTGTAAAACCGGGTAAA
+AACCCGATGCGTGAGCAACAGATTTGACGTGAGTGAGTCGGCACGACAGTGCAGAAAGCC
+GGTGGCTAATGTAAAAACGGCCTGTATTTGGGAGTTCCGGTCACTAGACACCAGGCTATG
+CTGTTAATTTAAACACAGTCAGTAATGCGTAGGGCACTGAGTCAAAGTAGTGGATCTTTC
+TCACTTTTCCCGAAAGATGATAGCTATGCCCCAATAAAACGTGATCCTGAACATTACCAG
+TCAACGCGAATCCATCATTCTGCTTTTTGCCTGTAAAAGTAAAAAAATAGCTATGAGAAC
+CTTTTGAAAACGCAGCTCGCACTTCTGTAAAAATAATATCAAAACTAACTACATCACCAA
+TGTTGAAAGAATGTTCAATTGGAAAACCGGCGTTTTCTGAAAAAGCTTCAGAAACAGGCT
+GGTATGTCGAGTAGAAAGACTCCAACTGACGGACTGTTAAAAAGAGATTGTTGTTTAACT
+GCTGTGCAATGCTTGCTGCAAACTTAGAATTGTCAGCTTGCAGCAATGCTAACTGCTCGC
+TGTGCCTACGTTTCCAGGCTTCAAGATCGGGATTGCAGCGAAGTTCCGGGATAGTTTCAA
+GGAATTCAATGCACTCTTTCAGTACCAGCTTTTCCTCTGTGGCTGGAGACGTTTTGGAGC
+CATTGCATGTCACACAGACGGCGTTCGCAATCTTTCCAGTCCCTCCGCATTCAAAGCACT
+CACGGGTGATAACGGCGTAATAGTGTCCATCTTTACCGTAGATAGGCTTTACGGATGATG
+GCAGTAAATAACCATCCTGAGTAAAAAAAAGAGAATGTTTCATTTTTTAAGGTTCTCCAG
+TCGAGCCTCCACGAGCTGTAAAGCGTCAGTTACCTTCTGTACGTATTGATCGTGCCCTTC
+TTCAAAATGATCAAAACGCTTTCCAGCCTTGATCTCTTCAATGTTGCGATCGAGTGTGCC
+TTTTGTAATAAGTAGATCGTTATAAGTATTAATTACAGTAAACTGTGCAATCTTGTCCAT
+AAACGGTCCTTAGCATTCTACTCACTTGTTAACAGGTCACGAATTTCATGCAGTTCTGTA
+ACCTTAGATTTTGGAATGATGATAGCAGTATTTTCATCATTCAGAAGGCTTAATAAAAGC
+TGGAGTTTTGCTTCATCTAGAGTGATCTTTACACTTTCCGTTGTCTTTGTGATGGAAGTG
+CTGCTGATGTTCGTAAATAAATTGGAATGTTGTCCGTCGAAAATTAATTCGGTGAGTTTA
+TTACTGTCGTTTAGTGCTGGCCGTACAGTATCAATCAGCCCGATAAATTCAGTTTTTAAG
+CGTTCAGTTTTTTTATGAGAAAGCCGTTTAATACCCAATGAACTGCGAGTGATGGATTTT
+GTTTTAACTTCCTTAGGAATAACATGAACAGGGAGTGTTTCCGGGTTATCTAGTTTCTCA
+TCGTTTGATGATGTTTGAACGCTTGATGTCTTAGATAAAACAGGTTCTGGTTCAGTTGAT
+GGTACTAAAAGAGAACACGATTCCAAATGTGCAAGGACTTTTGCATGGTCATTGGAATAC
+TTCAACATGATCTCAATCGCGAGTGTTTTTTTAATCAGGTTTAGACTGATTAAACGTTGT
+AGTTCTAAAGGCATATCAAGGATTTTAAGCTGGTTACGAATAGCAGTGCTAGACCGTTGA
+TAGCGCATAGCAAGGGATTCAACGGTAGAGCCAAGCTTCAGCGCCTCTGCCAGTGCATAA
+GCTAAGGCTACGGGATTAAGACCGTTATTCCTATTCCCATCAAGGTTCTCCAGGTATTCT
+TCACTTTTATTCTTATAGTTCATAACAACTACTGAAATGAGCTGAATATCAGCTCCTTCC
+GCAAGAGCAAGAGATAGTGCTCTGTAACGGCAATGCCCCTGCCTTACAACGTAATTGGAG
+TCTTTCTTAACAACCTTAATTAAATCGACTCGTCTGCCCTCTTTATAGGCTTGTTTAATA
+GAAACAATGGTCGATTTTACTGGTTCCTGTTCATAACAAAGTTCACCAATTACCGCTTCA
+CGTGGATTGAATCCAGATTCGATAAAAAGTGCTTTAGGACTGATCTCAATAATCTGATAG
+TCGCAGTGATTCATATAACCTCCTTTTTATTACATGATACATTAATTGACTCAGTTTCAA
+ATAACCCAAAAGCAAAAAACAATTAATTCGGTGCTTGACTGTAATTTTAGTTATGAAGGA
+ATTAGGCCATTTTAATTTGAAATTTTTAAATCTGAATGGTTTGAAATTAATATATCTTAA
+AAGCTTAAGATTGATTGATACTTCTTCCGGCTGCATTCCCTACTTGGCTAGAGTCCGAAC
+CTGAACTTTTTAGGTCAGAGTTGGTTAACAGACGGAATTTATCCACGTTTTCCACAAGTT
+AGATCAATTCTTTAGATCAAGAGAGATCAAGAGAGTACAAAAAAGATCACAGGTTCCGTA
+AATGACTGATTTTATTATGGAATAAGCATGATCAGGCATTCAGGTGCATGTAAAAAGCAT
+TTGATTGAATAAGAAAAGCATTTACTTGAATTGAAAAGGCATTTAGTTTAATGCGAGAAA
+AGCATTTGCACGAATAATCTATTCACATCTAAATGTATCAAGGGATAAACCATGGTGGGT
+AAATTTAAATGAGTGATAACAATGAGGTAACACATCCTTTTGATGTGACCAACACGGAGA
+CAGGGAAGACTTATCAACTGAGTCCAAACTCTTCGAAATCGGTCCAACCCATTGCTTTAC
+TGCGCTTAAGTGTTTTTACCCCGGTGGGAACTAAAGAGAAGCGATACAGAAATTTTGAGG
+TTGACGCTTCTGATGAGTTGTCGAGCATGGAGCTGGCCCGTTCAGAAGGATACGATGACA
+TTCGGATCACTGGTCTTAAGCTTTCGATGTCAACCGATTTTAAGTGTTGGCTCGGTTGCA
+TAATGGCGTTCAGCAAATATGGTTTCGCTTCCGATAAAATCACATTGTCATTCAATGAGT
+TTGCAAAAATGTGTGGTATCAGTTCTACAAACATAAACAAGCGAACTCGCTCACGATTTC
+AGGAGGCGCTAGCAAACCTAGCTTCCGTTGTGATTTCTTTCCGTGATTCAAAAACTGAAC
+GTTTTACTGTCACGCACCTTGTGCAGAAAGCAGTGATTGATCCTAAGAAGGACACCGTAG
+AGTTGGTGGGCGATCCCTCAATGTGGGAGCTTTACCGGTATGATCATAAAACCTTACTTA
+GTTTGCAGGTGCTTTCGGTTCTCGCTAAAAAAGAGGCAGCACAAAGCCTGTACATATATT
+TTGAGGCGATGCCTGCCGGTACGTTATTCGTAAGCATGAAGCGTTTGCGTGAGCGACTTC
+TGTTGACGACTCCTGTACGAACTCAAAACCAGATCATCAGGAAGGCGATGCTGGAGTTAA
+AATCAATAGGATATCTTGAATATCAAGAGGTTAAGAAAGGTAGAGATATCCAGTTCCAGA
+TTTTTAAAAGAAGTCCAAAACTTGCTCTGGCAAAACACAGTTGATGCTCCGGGTATAGTA
+CGCACAAAAGTTACTTTGGATGTAATGAGGAGTATGGGCATTCATCCAAATGCTTTTTAA
+TGTTTCTCCGGATTTGAACACCCTTCCCTGTTTCCAAACTTCCTATCATTTCTGATACCC
+GGGTTCTTCTGGTATTCGTTCGAATGCTTTTCAGAAAAAATCATGCTTGCTAGTTGAGAC
+AACGTAACCTATTCATTTTGCTAGTTTAATAAGACTCATTCATACATATGCCTTTAACTA
+CACTACCCTCCATCGTGTTGTATTGGGCTTTAAACGCAAATCCCTATACTCCTTGTGCCA
+CTCGGCGTATTTACAGTTCCTTAACGCCTGCAAACGACTGGGATATGAGCCTGGTCGACG
+GCATTTTATGAATATGCAGGCCAATGAAGGACCTAGAGAAATAACATAACATTCTGATAA
+TAAATGAAAATTACTCAAATTGGATATCAAGGAGATGAAAGGCATTTGTTTCAATGGAGA
+GCAAAAAAGTGCCTTTTGTATAAAAGCATTTGCTCCAATGGCGGCAGAAAAGTGCCTTTT
+GTATAAAAGCATTTGCTTCAATGGCGGCAGAAAAGTGCCTTTTGAAAAAAGCATTTGTAT
+GAATGCTGCGGTGAAAGTTGCTTTTGGTCGGGAAGCAGGGCTCGCAAGGGACAGTGTAAG
+GTGCCTTTGTTCGAAAAGCATTTGCACGAATAGGAGAATGCAAGTTGCCTTTGGTCGGAA
+AGCATTTGAATGAATGGGGAAGTGTAAGTTGCCTTTGGTTGGAAAGCATTTGCATGAATG
+AGTCCCTGATAGGTGTCTTTGTTTGAAAAGCATTTGCATGAATGGATTCAGAAGAAGTGA
+CTTTTACGATAAGCATTTGAATGAATGGGCACCGCAGACGCGCATTCCCCAATCAGCATT
+TGAATGAATGAGCTCCGCAGTTTTGCTTTCATCGAACAGCATTCGTATGAATGTGCTCCG
+CAGAGGTGGCTTTCATTGAAAAGCATTTGTATGAATGGGGGATACATAATCCTTGTGGGT
+GAAAAGCACTCGCATCAATGGGGGAAAAGTGACTTTTGGAATGTCATCCTTACCGTGTCC
+TTTGTTAAATATCTGGCTGGATGAATGCCATAAAAATGGTAAAGGGGCAGACGATGCCCC
+TCTTCCCTATTTGGCATGTTAATTAAACGCACCTTCTTTAATCCGATTACATGCGGGATT
+CTTTTCTGACATTCGATGGCTAAAAAAACACCAAGCGCAATTAAGTCAAAAAAAAGGTGG
+TTAACAGAAAAATGAAAGAAAAATAAAAAGTATTATGCCAATGCGTTTTCGTGAATTCAA
+ATCAACACGGAGTAATTATGGAACTGACATTGAATACTAACGTTGAAAGAGGAAAAACTA
+ACGCTTTTGCATTTTTGAAGTCCAAACATGCAAAAGTGCCTTTGTTTATTCTCTTGGTTT
+TAGCAAATTGCAGTTTTGCGTACGCGGGTTCCGATGATGGAGCCTTCGGCGATATCTGGG
+CCTACATGAGCGAAGCCTTGACTGGTGCGCCGGGTAAAATCATCGCGTGCGGCATGTTGT
+TCTCGGTGGCTTATTTCGGCGTTGTAAAACCTAACCTTGGTTTGGCGCTGGTATCAGCAT
+TAATGATGCTGGTTATGGCAAACGGTGAAAAAATTATCAGCTCGTTCCTGGATGCTGGTA
+TTCCTCTGTGATTTGTTAGAACAATAACAATGAGGGGGATATTCCCCCTCTCTGGAGTTT
+TTATGACAAGCCAGTACGAGATACCGCCACATACATATCGCTTTCCATACAGAATAAATA
+TGCCGTTACTAATTCTATTCTGGGATGCAAAGCAATTGGGTATAACATTCGTGACTATCG
+CGAGCGGTAATATTTTTGATTTCTTTATAACTTCGGTAGTTGTGGCGGTGGTGTTCTGGT
+TTGCATATAAGAAAGCAGCAGAGGAAGGGATTAGAGGAAAACTAAAACACAAACTGTGGT
+GGTACGGCTTTTTTCCTGGAAAATCGGTGTTTAGTAGTCGTTACTTTACCGATCCATTTA
+TCAGAAACCTCTATTCTTGATGGAGCTAAGAATGAAACTTCTCAGCAGGTTAAAAATTCC
+ATTCATTAAAAATTCCAGTAATGGCGATTTTGATAACAAGGATGAGACTTCGCAAAAAGG
+AGGTGAAGAAGTAAAAGGAAGTTTTCTGGATTCAAAAGCACGCTTTAGTAAAGAAATTGA
+AGGTTCTGAAATTGGAATTACATATAGTGCATTGATTAAACGCGACGAAAAACTCCTACG
+TGTGAATACAGTTGCAATGATCATTATTGGGGTTCTGGTTGTAAAAAATCAATTTCTCAC
+TGATCCTGTGACTATAGTGCTACCGCCAAATATGACGGAAGAAGTCAAAGTTGTTGGAAA
+TAAAGCCTCAGAATCATATAAAACGCAGTGGGCCTTATTCTTTAGTACTTTGATTGGAAA
+CATAAACCCAACAAACATCGGTTTTGTTACAACAACTATATTGGATGCGCTTTCTCCGGA
+TTTACAGGCAAAGACCCGGGAATCACTACAGCAGCAAACCAATATAATGCAGGCTCGTGG
+TGTAGAGCAGTCATTTAAGCCGATCGATATGTATTACGACACCAAAAATGACATGGTCTA
+TGTCTGGGGAACAAAGTCAACTCGTTTGATTAATGTTCCGGACAAAACTGAATCATCCAA
+ATGGACGTTTGAATGGGTCCTGGGAATGAAAAATGGACGACCGCGCATAGCCTATGTGAA
+CCAGTATTCAGGTACACCAAATATTAAGAAAATTACAATCAACGGCAAAGAACAACTGGC
+AACACTCGATAATCCGCCGCCGTCAATAGGTAACTAATTATGACTTCAAAAAAGGTTTTT
+CACTGCACCGCGATTACAGCAGTGATTTTGCTGGCAACTTCGAATGTGGTATTTGCTGAA
+GACTATCAGTTACCGGCGACAGTAAATAATCCGGTAGTTATGCCTGTCGGGGCCGATGAA
+TTTCAGAACGGTGTGAAAAATGCGATAATTAAAGACACTGGCACTACGACTGAGACCGTA
+CAAGCAACAAAACCGACAACTGCTCTGCCAAGTCTTTCACCTGCAAGCAGTGCTTCTCCC
+GCAGTCAATGAAATAACCGGGGCGTTGTCAAATAACCCTACTCTAGCTGGTTACCAGCAA
+CAGGTTAAATCAGGAAATTTTGATAGTTACGGAAGACCAGCAGGGAAAGAACCTCAACAA
+AATGCACAAAGTACCGGGTCCCCTTCAAAGGCAGATGAACTTTATGTTGAAGCACGTAAT
+CGCTATAAAGAAGTACAACGAGTAAACGTTCCGCCTGGTGGCAATATTGTACTCCCGGTT
+TCTCGGGGGCTGCAAAACAGAATTTCGACTTCATTTAAAAATGCATCTGTAAGTACTTCA
+ACGCCAGCTGATGAAGCCAGTATTTTCGTTAATGGCGGGGATGTTTTTATTTCAACAAAT
+ACAGATAAGCCTATAGGAATTATGCTTTCAGAAGATTCAGTTCCTGAATCTACTTATAAC
+CTGACACTGGTTCCACTGGATGTACCAGGGGCCATGATTTCAGTAACAACTTCTTTGAGC
+CCGACAATGCAGGCAAAACGAGAAACTTCTCTTGATAAACAAAATTATGATGAGATGCTG
+GCACGCTCACAATCAGAAGAGTTGACTCCTTCAGACCCTCGGCAGGATGACCATAAACAG
+CGGATCATTGATTTGTTGACTCCGGTTGCACTGGGTGAGGTTCCTTCTGGTTTCAGTTTA
+CAAGAAGACCGCTTGTCACGCATACCAAGCTCAGAGCAGTCCCCATGTAATTTCAATATG
+TACGCCAAGTTAGGTCAAAGACTGGTGGGATCTCGGGAATTGATAGATGTCGTTCTTGTT
+AAGAATGATAAGCCTTACGGACAGGTAGTGGCTGATCAGCAATGTATAACTGAAGGCGTG
+GTTGCAAGCGCTCTATTCGATAAAGCATTCCTTCAGCCCGGGGAAGAGACCGAACTTTAT
+ATTGTGCGGGATAAATTATTTAAAGAGCGTCAGACTCGTGTTACTACGCGCCCAAGCCTG
+ATTAAAAGATAATATGAGAAAAGCTACTTTTCTTACAGTGATCTCGTTTGGTTTAGTTGT
+CTTTTTGGGTACCAGTTATTACTACCAAACTAAGTATATCCCGAAAGGCACCGTGAATAT
+ATTTCCTGATGTCCACCGACAGGGTGAGATCGTTGATGATGCCTTTGAGAAAAGCACGAT
+TGTTATAAGCGACCCAACGCTTGCGGATAAATTTGTTGGAAGTTCAACCGAGTCTGTCGG
+TCGGCATGAAGTTAATGTAATAAAAGAATTGGGCACGCAAAATAATGGTTCGAAATTTAT
+TCATGATGAGTCTGATAAATCAGGTTTGACGGTTGGAGATAAATGGCCTAGGGCTGGTGA
+ACCTTATATCGTGCCTCAGATGACAGAATACGAGCGGAATTTGAAAGTTAAGCGATTCCA
+GCAACCAAAGAATGGAGTTAATAATGGACATTAAAAAGGCCTGGGAAAATAAAACTGTCA
+GAATCTCAGTAATTGGTGCTGCATTGATGGTATTGATTGTTGTCATCAGTCAATCAATCT
+TTACCACACCAGTTAAAAAAGAGAAGAAAACCCAGAAAAAAGATATGCAAACTGGATTCC
+TTATTGATGATTCACAAATGAACAAGCTGAGTAATGAGGAAAGCCAGAAGACTTATAACG
+AAATGGTAAGGCAGAACCGTATTGACCAGAACGCTGCCAAGGCTGACCGTGACAAAGCTG
+AAAAGGCTCAGCAAGAAAACAAAGCACAGATAGCCAGTCTTGCTTCGCAAGTTCAGCAAC
+TCACTACGCAGTTGACTGAAATGCAGACCTCAAGAAATGGTAATCGCAATCTCGATGCAG
+GCGGACCACGCAACAACGTCAATGAACAAGCCCCAGCAAAGCCATACCAGCTTAATCCAA
+ATGCAGCGGTGAACGGGGTTAGTTCTGGATACGCACCTATATCTCCGACCCGAAACAGTC
+CAATGCGGACAATAACACAGAGTTCAATTAAGACAAACGGCACTGATGGTGTCATTCAGG
+TGATGCCGATATCAGAGAACCGGATCAGAGAGGGGCGCGAGGTTGTTGCGGGAAGTGAAA
+AGGCCCCAACGCGAACTATTCGCGGCGATGGGACTGCACCTGTTGATAGTAAAGCTCGTC
+ATGCGGCCCGTAAGGATGAAATGTTTCTTCCAGCGACGTCAATTATTACTGGGGTGCTAA
+TTACCGGGCTGGAAGCTCCAACGAGTTTGTCCTCTAAAGCAGAACCGATGCCGGTTACCA
+TGCGCATTAAAAAAGACATCATCATGCCTAACAATTACACGATGGATTTGCGTGATTGTA
+ATTTATTGGGTTCTGCTGTGGGGGATCTGGCATCTCAGCGTGCGTACATTAGGGCAACCT
+CCATATCGTGTGTCAACTCGAAAGGAAAAGCATTCGACGTAATAGTGGAAGCTTATGCGG
+TTAGTGAAAATGACGGGAAAAATGGCATTCGTGGGAATCTGATAAGCAGAAATGGAAATG
+CGATTGCAGGTTCTGCGTTTGCAGGAGGGCTGTCAGCATTGGCGGGGAGTCTGAGTCCAT
+CAAAGGTGTCTTCGCTTAATATAGATCCAAACTCTACGGCACAATACCAATCGCCAAACA
+TAGGTGCATTAGGAGCGCTGGCCGGAGCCGGTGCAGCTCAGGGGGGTCTAAACCGTCTTG
+TGGACTACTATACGTCAATAGCTGAGCAGCAGTGGCCAATTGTAGAAATTAGCCCAGGGC
+GCCCAATTACTTTTGTCGTTCAAAAAGGGGCGACAATACCTACAAACCTGACAAGCCGCT
+GAGAATAATTATGGAAAATAACAACGACAATGAATCACCAAAAAAGAGTGAGTCTGCTGA
+TAGCTTAAATATCGACGCGGCTAAACCGGTTGGGGGTATACGTACTACCAAAAAAGTAAC
+TTTAGAGATCGATATCGAGAAAACTCTTAAGTATCTGATGGTCGCAGGCCTGGCAGTTCT
+TATCGTGATCTATGGATACAAGGGTGGACGTTTTGTATATGACAACTTCAAAGCAATGTC
+GCAACCGGCCTACCAGATTGCCGTGCTGGATATGCAAACTTTAAGAAAAGTATTTAATAA
+GCAAAATCCGGTGTTGGATTCGCAGCAATCCAAAACTAACTTTGAAAATTATTTTAAGGC
+ATTAATGAAGGTTTACCGTGAACGTGGCTATTTGGTTATTGATGCATCCTTGGCAGTAAC
+TATTCCAGAGAATGTTGAAATAGTCTCTTATATCGACCTTGGTGGAAGTTTTGGTGAGGT
+ACAATCTCTTCCAGGCGAACCTAAAGAAAGTGAGATTCGATAATTGAAAAAGTTACTTTT
+GTCTCTGCTGATTTCCATTACCTCAGCGTGCCCGCCGCTTACTCTGGCTGTTGAAAATGT
+ATTAAACAATCGTGATGCCGCTGCGTTAATGGAAAAGGCAAAAGAAGGTGGAGTATCAAC
+GAAACCTTTAGACGGTGTATTGGCGAAAATGAAAAGCTATAAGCCTAAAGATGCTATTTA
+CATCCCTACTGGCGGTCTTTATTTGTTCCAGGATGAACGTTCTCAGTTGATGGCGGTGAC
+CACTGACGGACGGTATACAATCACGGGGGGGAGCGTCATGGACATTCTTCAGAGAAAGTC
+AGTGTTATCAGTAGAGGATATACGAAAGTCGTTCTTTATTAATTTAGACGACGCCCCTTT
+CCCTCTTGAAACTGTGGCATCGATACCTTTAGGAAACCCAAAACTCAAACGTCAAGCGGC
+AATATTTATTACGCTTGATTGTGACGGTTGTCAGGATTTAATAAAGAAATTCTATGATGA
+ACGCGAAAAGTATCGGGTCGATATAGTTTTAATCCCCTCCCCCGGCGAGCCAAAGCAGGA
+ATTGCGTCAATTATGGTGCAGTAAAGAAAAAGGCAAAGTGAATGATCTTGATATCTTGCG
+TTGGCTTATGGGTAATAAGGCCGATATAGAAAAACGACTCCTGACGAAAGAAGAGGCAGA
+AGCATGTCCGGCTGAACCGTTAGTCGCGTCATTAATGCTGGCTGGCATTTATAAATTACA
+GGGAGTCCCCTCAGTTGTAAGACAGGATGGACTCGCTGGTAATGGCATACCGAAAGATTT
+TGATTACTGGTTAAAACAAAGTGTCGAACCCTTACTCAAAAACCCATTTGATACTAATTA
+AGGTAATGAAATGAACATTAAAAAAGTTATTTTCAGCGCTCTGGTTGTTGGTTCATCTTC
+ATACCTGGCGGGTTGTACTATTGGCAGCGCAGAATCTGAATGCCCGGGAATTGAAAAAGG
+AGTTATTTGTAAAGGCCCGCGTGAAGTTATGGAACTGACGAACAATCGTGATGATCTCTC
+CGGCCTTGGGGAGGAAGAGGCTAATTCGGGAAAGGGGAAATCGGCTGTCAATGACAGCCA
+GTACCCTGCCCAACTAACGCCGCCTGGCGCAGTGCAGTACCCCAAGTCGTCTGTACTTGT
+TAATAAGCCAGTGACATACACAACGACGGAAGTAAAACCGGTTGGACAGCTCCCGGTGAT
+GTATGATCAGACATTAAAAATGGGGGCGCCAACTTCAACAATTGGACCACGGCCAATCAG
+CGGGAATCCTGTTAATTCTAATGTACGGATGACAACGAGTTACAACTCAAATGGGTCATC
+CGTTAACCCCTTTTTGCATCCGTCTGCTGAAGTCGTGAAAAAAACAACTCAGGTTGTTAC
+TCCCGCGCCTGCACCGCGCTATGTAGCACCAAATTCTGATATCAATGCAAGTAAAGACCT
+TTATTCCATTAACAATGGACAGCCAGTAAACCCTACGCTCAGCTCTGGGCAGGTACAGCA
+ATACCGTACACAAGGCTACAAACAGGCAGTCGTTGCACCAGAGCCTCTTGCTGTGCTTCA
+GCAAGGCCGCGTCATGAGAATCACCTTTGCACCATATACGGATGATAATGACGCGCTAAA
+TCTGCCTGGCTTTGTTTATGTGAATGTCAAACCGCAAACTTGGATTGCGGGCAAAAATTC
+AACATCAAATCCGGCACGAATTGTTCCTTTGGAAGTCCAGGATGCGGCTCGTGAAAATAT
+GCAACAGCAACAGCGAGCAACGAAAGCAGTTTCGTCAAACGGTATTGTGAGACAACTCTG
+AGGTCACGAATGAGATCAGCTAACGTCTATAATAAAGAATTAAGCCGTCATCAGTTAGGT
+GGATTTATTCCCGTGTATGATCAGATTCCGGGTACACATTATTTTCTACTTGACGGAAAC
+CGACTCGGTTTTATGTTTATCTGTAGTCCGTCGCCCGGTGTCTTTGATAATCAGCAGGAT
+GTGTTAACTGAATTATTTAAAATGGACTTCCCAACTGACACCATCTGTCAGACCTCATTA
+ACTGCGCTGCCAGACTTGATCTTGCACTTAAGTGCCTGGTCTGCCGTTCGTGGTGGTCGA
+ATGGAAGGTCATGATAAGCTTAAGGGGGATTTACTCACTGCATATCAACTGGATTATTAT
+GACCGAAGCCTGAATGAACCTTTGAAGCCGGACCACGATAAATTGATGCTTCGAGATTTT
+CAGGTCTGGATTTCCTTTTCAATTCCATTGAAGTCAGCACTTCCTTCTGAAATAGAAAAG
+AGTCGCATTGATGCGCTTTACTCTGACTTAATCAGTAAGTTGAATACAGTAGGCCTTTTC
+CCACACAAAGTTGGTGCTGAAAATTGGCTTTATTGCATGGATAAGTTATTGCATCCGGGA
+AAAACATCGCGTTGGTCTGAAGGTCATGTTGAAGCTAGCACCATGAGACGCCTAAACGAG
+CAGATCAATGTACCGGGTCGAAAATATACAGTGACAGAGAATCATTTCTCATCTACAACG
+CAGAGCAATGATATTTCTGAGCATCGTTATTTCAAACAATTATCAGTAGTGAAGTTTCCA
+GAATTTGTAAACTTTGGCTGCATGTATGAACTTGTAGTTAATTGGTTGAATGGACGTAAA
+ACGATCTTTAGCCCTTTCATGATAACCCAGACTGTCCATTTCGCCGATCCTTTAAAATTA
+TCAAGAGAAAACGTCAGATATAAGGCAATTACTAACAAACAAGCCAGTATTCCAACAGTT
+TTGACGTTTTGTCCAAGATTAAAGGATATGGATAATGATTACATGACGATAACACGCGAA
+CTGGAAGATGGGGCTCGCCTCCTACACAGTTATCTGACATTTACTGTAATGGGGAATTCA
+GCAGTTGATGTTCAGTCTGCCGCAGACCAGTTAAAATCATTTTATCTGGAAAGTCGTGTT
+AATGTTGCTGATGACTCGTACATAGTATTTCCCTCATTTGTTTCAAGCCTGCCGATGTGT
+AATGACCCAAAGACAATACTAGAACTGGATCGTTTTGAGGTCGTGAGTAATACTGGTGCT
+GCGCACATGACCCCCATATTTGGTCCTTGGAAAGGTAATACGGACAGACCCGTACTTAAC
+CTTGTCTCACGAGAAGGACAGCTGTTGGGGCTGGATATCTTCAAGACTTCTGCCAGCTAT
+AACATGGTCGTTGGTGCAACGTCTGGTGCTGGTAAATCATTCTGGGTCGCATACATCATT
+AATAATTATCTAGGCGCAGGTCCGCGTTCTAATAATCTGATCCATTATCGAGATACTTTT
+GAGGGATTCAAAAACAATTCTTATGATGCATTTGACCCTGATGGAGCCCAGATTTTCGTA
+GTTGATGTCGGACGCTCATACCAAGGTATTTCGGAACAATATACTAATAGTCAGTTTATA
+GACTTTGGGAAAAAGCCTGATTTTACGCTAAATCCATTCGCATTTTTGACTGATGTGACT
+GTTGGAGAGCGTGTTTTTGATGAAGCACCTGTCTTTAATGACGATTCAAATAATCATGAT
+GATGATAAGGATAAAGTAGCCCAGACCATTATGGTTCTAAACCAGTTAAAAATAATGGCA
+TCTGAAAAAGGAAATATTGACGATTTTCAACAATCGGTCATGCTGCAACTGATTAGTGAA
+GAATATAACGAATCACGCAAAGTTGGACGTACAGGCTCTATTACTGGATTTGCGCGACGC
+TGTTCTAACCATGAAGATAAGCGTATTAAAGATATCGGTGACCAGTTGGGGCAATGGTGT
+GAAGGAGGGATTTATGGGAATCGCTTTACAGAAAATCTCCCGCCAATAAATTTTGATAGC
+CGGTTTATTGTTCTGGAACTTGAAGAATTGAAGGGGACCCCACACCTTCAGACTGTCGTT
+CTGATGTCGATTATTCAGGCCGCTCAGCATGCAATGTTTATCAAGAAAGACGGACGCCGC
+CGGTTGTTCATACTTGATGAGGCATGGGAGTATATCCGTCCGGACAATGCTTCAGGTTCC
+AGTAATCATTCAAATCAATTTTTCTCCTCTTTCCTTGAGGCCGCTTGGCGCCGATTCAGG
+AAAACGAACTGTGCCGGTATTTGTATTACTCAATCCTTTGAAGATTACTTCACCTCATCG
+GTTGGTCGCGCACTAACGGCTAACTCGCCGTGGAAGATCATCATGAAGCAGGAAAAGGAA
+AGTATTGAAGCCATGAAGGTGAACAACTACTTCTCCACAACTGATGCGGAATATGAGCGT
+ATGAAAAATATTCGAACGGTAAAGCGTGCATTTTCCGAGATGCTCGTACGATTCGAAAAT
+TTCCAGGAGATATGTCGCCTCTATGTAGATAGAAAAATGGAGCTTTGCTTTACGACTGAC
+AGCACCGATCGTGGAAAACTATGGGAAATCCAAAGCCGACTTGATTGCTCTTACGGCGAA
+GCAATTGAGATTCTGTACGAACAGGAAGTTGCGAGCAAATCAGCTGCCTGACGTTTTAAG
+TTACTGGTTACCTCATTTTGTTTTGACTGAGGTATCCAGTACGTCTTTGAAGTAAATAGT
+TGTTAGCTGTCATTGCCTGCCCTCCCCCGAAATAATAGCCCGGGTTAAGAATATCTAGCT
+CGGATTAAGTCCTCTCAAACCGTCATACATGAAATTCGATGCCTTTGTCATTCTTCTTTT
+GAAGGTGAATGAATATGATGAAATTTACTCCAGAATTATTCTCCCTACCAGGCTTTTGCT
+GTGAAGTTAATCAGAGCAGGTATTATGTTTTGGGTACAAGAACCAACCAAGGGGGTGTGG
+TTTTTGTATGGCAGATACAAACATCATTTTTACGGTTATAATAAATAACCATTATATAGA
+TGAATTTGTCGTTTTTTCTTTTAAGTCCTTGAAATAATTGGATCTAATATCTAGATGATG
+GTTGTATAAACTATACGTTAATTAGATTTGAGAATGCAACTGTTATGCGATGCGTAGATA
+TTATTAAGGTGAATGGTTTGTTAAAACAACCAAAAAACAAGTAAGATCAGGTCTTATCTC
+CATAATAACTTAACCATCTAACTTTCTGGTTGGAATAAGAAACCATTTTAAGCTTATTCA
+ATAACGAAATTTAACCACTTGAATCGACTGACCATGGTAGAAAGTTGGTAGGGTACCGTG
+GCATTGAGCCCCCTTAATCGCCAGACCATGGAGGGAAGCTGGTTGCGTACCGTGGCATTT
+AACCCCCTTAATCGCCAGACCATGGAGGAAAGCTGGGCGTGTCCCATGGAATTTAACCCC
+CTTAATCGCCAGA
+>NODE_25_length_15938_cov_42.5346:NODE_7_length_1329_cov_85.8474;
+AGCAAGCCAACTTGTCGTCAAAATCGGTGTTGCAAAAACGGGAGTGACCATAGATTCCGT
+TTTCTGAGACGACCCCTTATTGGCAGTACCGTCAGTTCGGATATCTCCCGCGACAACCCA
+GAAAAAACCGGCAGACTCATCGCTCACGCGTTACTGACGGGGGCCTCGATTGAGGATGCC
+TGTCGCTTTGCCTCAGAGGCTCAGCAGTTCGATACCGCTCTATCGGGACTGGCTTACCAG
+GTAGCCGTGGCCATGAAATTTGTTGCCGGTGATTCTGCGGCCGTAAGGAATGAAGGCCAT
+CCGGTCATTACACTTTCCGACTCCTTCCGTCTTATGAGAAAAGCAAATATTAACACCCTG
+ACGGCCACACAGAACAACCGGAAATGATGAGCACAAATCGATATGGATGCCGATATTAAG
+AACGATGATTATGTTGACTGTCTCATTGAGCAGGTAACCGTATAGCGGACTGGAACACGA
+ATGCTGATGCTCTACACCAGGCCTGCGGCGCCTTCGTAGATGCACCGCATTCAAAACAAA
+CGACAGGTGATAATTTATGAAGTTGACAAAAATGATGGCGACCTTGTTCCTGCTTATTCC
+CTTGACATCTTTTTCGCAGGAATTGGGCCAGCGAATATCACAGGATGACAGTGCAGAACT
+GGCGAATAAGGCAGGTACAGCTTTGACAGAGATGCTTTTGCTAAAAGTTCAGCAATTGCC
+ACAGGTGAAAAAGAACAGTGGAATGGACCTTGCGGCTGCAAATGACGCTGTTGCTTCCTT
+ACTCAGCAAAGAGTTTTTCATTTTTAAACCAGTTGATGAAATCAGCATAAAAACCTCTGC
+TCAAAAATTAAAAGAGCTGAATGATGATGCCGACGCACTTGCTAAGGGGTACACCATCAT
+TCAACCAGATGATGTCGGAAGCTCCTACATTTCGTATAAGGTGACGTCCAGCTCTCGAAC
+CTGCTTCATTCGCCTTTCAAAGGATCTGTCATCGTCATTAAATACCAGAATTGTAACTGT
+GAATAGCATGGAGTGTTCGAACCCATAAACCACGTTGACCGGCTAATTCACTTTACGGGG
+TAAATGAGTTGTGAAACCCATTTTATTTTCACCCTCAATTACAGAAATTCAAGCCGAATA
+GAGACTGTAATGATTATTATCCTTGGTGTTCTGCTTTTATTGTCTCTTTTCTTCAATATC
+TGGTTTTGGGATCACTATATGCGTGTCATTCCGTTATCAGCGGATAAAAGTAGCATGTTT
+GCTATCGCCTCCAGCTGTGAAAACCCTCGGTGGGTGCAAGAAGTTGAGAGCCGTGGGGGG
+ATGACCCGTAAGGAATGGGCTGACTTTGTGGATCGAAATTTTAACCCTCCTAAATAGAGT
+AAATTCCGATTGGCATTGTTGCAGGAATTATGGTGCCGCAGCTTATTGGGTGTTTGTCAA
+TTGCCGGGAAGTATTCGCTGGCATATCACTTAAACGGGAGTAGTAAGTGAGAGAACCTCG
+TCCACGCCATACATTACAGGTAGTCTGTGTCCCGTCTCTGAATATACAGGATCTGGGGCT
+AACCAGTTTTCATAGCTGGCTCTTATCAAAAGGCTATGACACGACCAATGCCAGGAACAA
+CCGTACTTGCTGGGCAAGGGAAGGTGGCTGGCACCTGAAGCGATGCAGACATCTGGCAAC
+GGGCGAAGATCATTTCTGGTTTATCGCATTCAACGGTACCGGCGGCGACATTTTTCCTGT
+GAAAACCCAGCAGGACTACCGTGCTGCCTACCGCAAGCTTGAAGCGTATGGATATGCACC
+GGCCGTTATTGAACAATTGAACACAGGCGTTGCCTATAATCTTGCTTATTCACGGACACC
+GTTAAAACGCCCTGAGAGCGCCACCAGCGAACTGAAGCGAAAACCTGACGTGAATATTCA
+GGGTGAGCCTTGCGAACGCTTTGTGACCGAACGGAGCAGCGCAGCGCAGAATAAATTCAA
+AACCCTGCTCATTGAGAACTTCGCCGGTCGGTGTGCAGTCACTGGATGGGTTAATGGTGG
+TGTGCTGGTGGCGGCTCATATCGAGCATGGGACGCGCTACAACCCTTCGAACGGCATCCT
+GTTGACGCCGACAATGCACGCGTTGTTTGACGCGGATCTGATGGGTATAGACCCTTCAAC
+ACTCACCGTTCATTTTAAACCGGGCATCGAGGCGGGAGAGCTGTTTGAAGGAAAAACGCT
+CAATCCGTTGGTGTATGATCTGGATACCGACCGGCTGGCTGCTCGCTGGGCTGACTTTAT
+AGGTGCCGAGTGATTGATGGGAAATTCAGCCTATAACCGATGGCAGTGTTTTCGGGATGG
+ACACCACTTACTGATGGGGGCTGGCTGCACGCCACCTTTATATTGAAATCCAACAGAGTT
+GATACAACAAATGCAAAATTGCCTTTCGGGATATTTAAAAGCGACCATTGTTATTTTATC
+TGCGGGCCTGACAGGTTGCGACCTGGCAAATGGGACTGCGGAAAGTGGAGTGTATCAGAA
+ATACACGAATGGACCTTTCAAGGAACCGACTATCGTGATGAGTCCGGGCTGGCGGATGGA
+TGACCACGGCAGGGAAGCACTAATATTCGGGAGCAGCCACTGCCCGGATGTAAACGGCAA
+TAATACGTCTGAGGGCGGCTGCGTCCTCATTGAGGAGCACTCTGCGACTGTCGCGGTCAC
+TGTTGTTGATGCGACAAATCAGTCCCGTCGCCAGGAAACCTGGACGATTGAACGTAAAAA
+GGATCGAGTTATAGTGAAGCGCCCGGATAACAGTTTTGTGATGCCCTGGGGAAAATAGCC
+AAGATACAAGATGACCACAAAAATGAATAAGCCGCAATGTTGTTTTGTGTGTTGAACGTC
+CTGATGGAGCCTTTGACATTTACACTGGCCGTTTTATACAGTTCCACCAAATTGACAACA
+GTAGAAGAAAAATTGTTGAAATAAGTGATCCTGACCTGGTGGGGATGACTTATTCAATCC
+CGATGGTTTTTAACGGAGGGAAGTTCAGTGGTCAAGGGGTTACCTGTCTCTCGCTCCCCG
+CAGTAACATTAATAAAAGTAACTTTTCCTTCCCGAACTTATCAGGAGGGGCAGGAACAAA
+TCACAATGTCGAGCCCGGACCTGGCACTATTTTCTGAAGATGTCCGGAAAAACTGCGCCG
+GTACGTGTGTTCTTACCGGCGTTCGAGGCAGACAAAGAACTGAGGCTGCGCACATAAAAC
+CCCGTCATGCTGGTGGTGAGCCGGATGTGACAAACGGGATTCTACTGCGAAGTGACATCA
+ATACCCTCTTTGACAATTGGCACTTTTCGATCGACCCTGATTCAATGAAAGCCCGTTTCA
+GCCCGGATGTGCTCTCCGTCGATAAAGACTTACTACAACTGGAAGGCAAGCAAATTGATT
+TTTCCCGCCTGCAAATGCCTATCAATATTGAACACCTTCGACATCACTGGAACAAATTTT
+TTAACCGTCATGTCAATCCAGTCATAAAGAATGCGCTAAATAAAAAAATCAACAATTATG
+AAAAACGGCCAGTTAGCAGCAACATACATTATTAGGCTACGTTAGCCTAATGGCATTCTG
+AAAGTCTGCCCAATTAGACTGAAGTTCAATAAGAAGGAATGAAAATGAACTTGAAAAGTA
+TTGTTCCGAAGGCTGCTGGCCTTGCTGCATGGATTGTAGGAATCATTTATAGTGGTTTTG
+CTCTTTCTGTTCTGTGGGGGGGGTTTTGTGCCTCTCGGTGTGGTGCCGATCACAACTCCA
+TGGGCTATTGGAATTTACTGCTTGGCAGGCATAATAAGAGGCAATAGAGTAAAAATCCCG
+AAAGAACAAGATATGCCATGTACGCTTCAATTAACGATGATATATGTCGGCATCACCTTT
+TTCCTAATTGTCGGTTATATCTGCCATCAAATAACTTAGAACTGATTTAGAATTGAATTT
+GATAAAGCTTACTACAAAGTAGTTTTGTCAATGTTCAACCTGTTTATCAAACCTACGGTG
+ACTTTTTATGACTGGGAATGGTATCAATACTGTACGCATAAACAACGAAGTGAAACACAT
+CTCAGAGTTAGATCCGGAGATCTCTTTTTCTTGAATGGAATAAACTGAAAAGTGAAAATA
+ACGAACTGTATCGCTGCATAAAGGAAGCAAATTCTGGTTGGCGTGGTTTTGTCCTTCGTT
+TAATAGGGGTTTATCTACCTGATGGCAAAACAATTGTCATTAAACCCTAGATTATTTGAA
+TATTCCTAAACATAGGCTTAATAAGAAAAGCCACTGAAAAGTGGCTTTTGAACTGAGCTG
+TTCGCGATTTTAATTTCAACTTAGATGAGGAAATCATCCAGTGTTTTACCGGCTTCAAGT
+TGTTCGGCCAGTGCTTTAGGGGTACGCCCCTGGCCAGTCCAGGTTTTCGTTTCACCATTA
+ACATCAGTGTATTTATATTTCGCAGGGCGCGGTTCGCGAACTTTTTTAGGTGCTCCGGAC
+TTTGCAGAGAAAGAACTCAGTAACTCTTCAGGGTCAATTCCATCTTCAAGCATTAATTGA
+CGCAGGGATTCAATCTTCTCCAGACGCGCTTTCAGCTCAGCTTCTTTTGAAGATTCTTCC
+TGACGTCGTTCTTCAACAACAACGCTTAATTTTTCCAGCAGTTCTTCAAGGATCTCTAAC
+GGCAGTTCACGGCCCTGCGCACGAAGAGTACGAATGTTGTTTAATGATTTGAGTGCTTCG
+GACATATGACCTCACTAAGAGTAATAAATAAAATCAATAGAATACTTTGCGATATTACAC
+TCTTTTATTATTTTGAGCCAGCTAGACGCGTAAGATTTTCTGGGCGCATGATATCAATCA
+TTGGTACCTAAAGACATTAACCACCCCGCGTATGGAAACAAATGCATTATCACTTGCCAG
+TTCCTCTGTAGTGCCAACTCCGCAAGATTAGATAAAATCGCCGTCTGTCTCATGCGATTA
+TTACTTTCGGTTACTGGAGAGACCTTTTAATATTGATTTTCTTCCTCTTGATTTCTTAGT
+TGTTTGTCCTTTTCGTTAATATGGAAAGGGTCGTATGTGTTGGTATTATATGCGTTCTTA
+ACGTTTGCTGCCCACTGTTCAATGCGGAGCATCATTGCATATGTTGCTGCGGCATCAAGA
+TCCAGTTGTTCAGAGTGTTCAGGGAGCAGAATTTTACAATATTCCAGTTCATGAGCCACA
+GCTCCGAGCCGTTCATAAAGTGAAGATAGTTGCGTTATGGAATCATCAGTGCGGTTCATG
+AATAGCGCCGACTTCCAATAATATATTGAGCAAGTTTGATGTTAAGACATACCATGTTGC
+TTGATAGTTGCCGCATCATACGGGATTCGCTACGAATTAAATAGGATTCAAGTAGTCCAG
+AATATTCCCCTGACGTTACAACCGTCAACTGGGCAATGTGATTATTTAATTTGCTTGCCC
+CTGCCAGGATATCATCCTCCGTCGCCTCGATATAAACGGGGGAGGCAGCGATAACATAAT
+CATCGAAAGGTCTTGCTGCCATCAATGTCTCAATAGATTTCGCCGTCCTTTCTTTCCCGA
+ATGTATTTGTTAATTCCCGCCACCATTGTCGGTGACTGAACGGTAAATCATGAAAGGTGG
+CTTCATAAGCGTCCACGAGGTCACGACTATTCAAAAAACCCAACCCGGCCGAGATCACCC
+ACAACTCCAGGTTCTCAGTTGTCCGTAATATCTCTTTTGCCGTTGACCAGTGATTACCGG
+CATAGAGCGACAGGGCCGGTACCGGTGAAGCACTTTGCGACCGTTTAATCGTTGCTGCCC
+AGCTGGACATTGCCTCTTCTGGTGTCTGTCCAGACCGGATACTCAGTTCTGGCATGGAGC
+CGCACTGGCTGTGCTTACCTTTGGTACAGGACGTTATTAGGTGTGTAATTCGCGACGCCG
+CCATTTTGTAGCCCTCAGCCAAATGTGTGTAATCACTGTCTAACTATCGTAACAGCCCCT
+CATCCGCCATAACGACAAAGAGGAAGCCCTAAACGTAAACGACTACCCCATTATACATTT
+AGTCATGCCTTTACTAATAACTAGTTACCAAAATAAACACCCCAGATGTGACACCGTCAC
+GTTTTTCGGCTTTATTTAGTTCATTTTGTGTACTATGGGATTTAATTCGGGGTAAATCCC
+ATCGTACACATAGCCCCCCTCATAGTGTAATTGCGGATAAAAACCTTATTAATCAGTCAT
+ATAGCTCAATGGTTGTGCATTCAGGGAATGCGATCGCCACTTAACGGGTTGCGGGTTGTT
+GGTCACCCGACATCTGTGTGCTAATCTTTTTCATCTTTAGTCATTAGTAAAGGCGTTACT
+ATAAATGACGCTACGAGAATTTTTTTAACTAGAGAGGTGGATAGGCCAGTGAAAATCTCT
+CAGCCAAAACAGTGGGAAAAGGATCGTGAAATGAGCATGAATTCGCAGCCGGAACTGAAG
+TTGAGTACCCGTACCGAACAACTCGCCAGTAGTCGTGATGCCGCTATGCAAAAATTTCTG
+GACGGCATGACGCTGATTGCCGAAGCCTCAGCAATTTGCGGGTTTTCACTGTTTAACAGC
+AAAATTATGGCCCCTAATGCTTTTGGCCTTCCTGCGTCCCTGGCCGCAAGCATCGAGGAA
+GGGCGACAGCAAATAGACCGTAAGACATGGAACAATCTTTTTGAAGAAACGGGTATTGAC
+CGATTCTGGAATCACAACCAGCGGGCGGAGTTCCGTGAGTCTCTCCGGAACGCTCCGCCA
+ATTGCGTCGTTAACCGTAATCCGCAGTACATTGCGCCAGGCAGTTGCCATGCGCAGCATT
+ACGCTTGCTGAAGGGTTTGTTGATCTGCTATGCCAGCTTGATCGCCGGTATAAAACTAAT
+GCCTAGCAATTTGTGATGCCAAAAAAACTGGTACTACGCGGCATTTTTCCCGACTCGAAC
+ATGATGAGATATAATGGCTTTTCTCAGGATAATCTCTTCTATTTAAACGACTTTGAGAAT
+GTCGTTTGCATCTGCTCCAATGCAGCAACACCGCCTGTCGGCAGTGGAATGAACATGTAC
+GATCGGCTTGCTGTCTTACGGAAAACCGATTTCACGGGTGACATTACCGACCCGAAGGGC
+TGGAAGTTCCGATTGTTCGGAAATGGTAACGTCCATATCTCAGTTGAGTGTGAAAGCCTG
+CATAACGCACTGAATGACCTGATTAGCATTTATTTTGCCAACCAGATCCCGGCCAAAGGA
+TAAGAATGATGACTGACAATGTAAATTTGATGAACGGGGATGAACAAACTGCGTCCAGTT
+TAAGTGAAGAGACTTCAAAAACGCCCCCTCTAAGCCCCGAGTTACTGAAGAATTCCCCTT
+ACTCGTCAATAGCTAAGGTTAAATATTTCACCGAGATTGAACAAATCTGCCTCGATAAGA
+GCATCAGCACCGAAAACCTCGACCAGTTTTTCAAAGCCCACTGGCTGCGGGATAAAATGG
+GGGGGTCTTTTGCCCGGGCTCAGGAGATGCTGGCGGCCTACAAGCAATACGTGGACGAGG
+TGCCCGAGGAAGCACGCGCGATTGAAATCCCTGACCAGATTAAAGATGCATTCAGTGATT
+TTACTGCGTTTATCACCTGGTACTTCCGCTTAAGCTATACGGCTATCCAGAGTGATAGCG
+TGAAAATTGCGAAGGCAGAAATTACTCAGTTACGGCAGCGGAATGCTGAAATTCTGGAAG
+AACTGTCACAGTCGAAAGAACAGGCTACAGTCCTGAATAACGAAAAAGTTAACCTGATTA
+ACCTGCTGGAGCAGCAGCGTGAACTCTCCAGTAAATTAGAAGATTCACTTCAGGAAGCAG
+AAGAAACTCTGGCAGGAACTCAAAGTGAATTACAGCATGCCCAAAACGAGATCCAGCTTT
+TACAGCAGACAGTAGGGACACTGAACCAGCAACTGAGTGAGCGCAAACAGGAACTGGCCT
+CGCAGCAGGAGTATCAGAAGCAGCTGAATGATGAGAATAAAGCGCAGCAGGTAGAGCTGA
+CAGCCCTCAAAAGCCAGAATGATCACTTACAACGGACCGTGTCTGATTTAAAAGTCAGTG
+TCAGTCAGCTTGAACAGGACCTTTCCTCAGTACAGACCCATTCCTCTGAATTGAGCTCAT
+CTTTAGCCGAAAAGGACACGACCCTGACGCTCGTGCGGTCGGAGCTCTCAACAGCTAAAG
+GGGAGAATGACCAACTACGAGCTGAAGCACAACGCTTAGCTGATGAGAGCCTGGTTGCCA
+AAAAAGTGCAAACAGATCAGACAGAAGAGCTTCAACAGCTCAGGAATCAGATGATTTCCA
+TGGAAGCGACACTCAATGCGGAAAAGACCATTGCCGAGTCTTTACGAGGAACAATCAAGC
+AGCTTACCGAAGCTATGACCGGCGCAGTTGCCATCAAACCTAAATCCTCTGGGGCATCAA
+AACCGCGAAACAAAAAGACGACATAACTGCTCCCGCCAGGAATTTGCAATAGACTTAAAT
+TCCTGGCGTCCACAGGCTCTTTATCCCGTTCGCAGGAGTTTACGTCCTTCCGACAGCATT
+AGGCTGATTTTCCCCGAATCACTGATCTCAATAGCATCAACCAGGCTAGTGATCCCGCCA
+ACAGCTTGCTGTTGTGAAATAGCTCCCAGTTTGTAGTCATCGAGTACTGCCGCCAAAAAC
+GCCTTCAGTTTAACCTGCTCACTCATCGAAAGTATGTACGCCATTTTTAGCCCAATTTTA
+AGGTTGTGATTCGGGTTAATTTTATCGTCTAGCTTCCGGGAAATGAGGGAGTTCCTGGTA
+TTCAGTCTTCTCCGTAGCATCCCAGTGCCACCATCCATAGGCCCCATATTCCTGGTTGTA
+ATACGCCTTCTTAAGTTCCTTTCGCGCAAGATAGGCAGGTGTCGACATCCCGAAAACTTC
+CATCGGGAACGGCTTATCACTTCGTGTATCCAGTAAATAAAAATCTGGGAAAACATCGCT
+CGCACTGGCGTCATACCGCATAGGCTTAACATAGTGCCGGTGTTCGGCATCAAGTTTACG
+GGACACTATCGCTTCGTAGGAGGAGTCCAGAGGTATCCAGTTATCACTCACCAGCATAAG
+CACTATCTGATGAGCTCGTGCAGAGATACCTCTACTGGTCACCGATACGGGAGATGTAAG
+AGCAAAAACAACAACTTTGCCCCCATTTTTCCAGGCGGCATATTCCAGAGGGAATCGCCG
+CTTCACGCTATCCCAGTGCCCGTCTGAGTTAAAGAAGGTAAGGGGCATACCGCCGAAGTT
+ACGCATAGGTAGAAACTTCAGCGGCTTCTCATGCTTTTCTGCGTCATAGCGCGGCAGTAC
+TGATAGCAGCAGCAGTCGTTTGTCGCTCAGTTCCGCCGACGACAGCAGTTGAACCTGCTC
+ACTGGCCACTTTGCTTTTAGAGTCCGCCACCCCGATAAAAAGATGGTCGCCAATACATGC
+TCTACCCGATCTAATCTGCTTTGCGGCTTCCAACATCCGGTATCGAACCAGCGAATCATT
+TCGCTTCCCGGCCATATTCGGATACCAGACATTAAGACCGGCTTCAGTCCACAACAAACT
+CAGAAGTCCGGAGAGGGTCATTGAAGCCTGGCCACCTTCAGGTCGCTGGATTTGGGGCAG
+GGAAGGAACCTCAGACTTTTCCGGCGGATCTTTCTCCGTCATGCCTATTCCAAGGCGGAT
+TGACATGGTCCCCTCATTGTTGATGCGTACAACATTGCTGGCATAACCCTTTAACCCTGT
+ATGCCTGGCATCAAGGTCGAAAAACACACACGATGGATCATGCTCAGTGCCTGTATTTGC
+AGCCTTAATCAGGATGAACGTATCACTGTTTGGTAGTGAGCGGACGTAGAGACGCTTTGC
+GCCTTTTCCCCGACATCCGCAGCTGATCACAGATTTCTGCCCGGACGTGTGGTGTGCTTT
+CTTCAGGGCCGACTGCCATCCCTTTACATACTCATCCTGTGTCTGAAATTCAGCCGAGTA
+TCGTTTCGTGTTTGGTTCGTCATCGTAAGCAATAAAAACTGCAAACTTCTGGCCCATGGG
+ACCTCCTGAAATTTAAAAATACTAATAGCCTAGCCATATCAATACTTCTTGCGCGTTGTA
+CTCTTCCCTCTCACCCAACTCGGAAAAAAATACGTCTATGTCGCTGGCTACGACGCCATG
+TTTTGCAAGCTCTTGCAGAGCTCTCTGTTTTGAAATGGTGAGGTCTTCTGCTGAATCAAA
+ATACGTCATCATTACCTCCTGATGAAGGAGTTGACTGAAGCAGGCCTTTCTCTCCCTGCC
+CAGGTTTTTTTCTGTGTAAAAGTTACAATATTAGTGAAATAAACCATTACGTTAACCTGC
+AAAATCACACAGAAGAATTACTATGATGCCGCTTCAAACTCTCCCTTGAGACGAGCCGCA
+ACGGCGATCTCAATACGGCTTCGAAGCAAACTGGCCACGGCCGCAAATACGTCGACGATG
+ACCGAATTGCCGAACTGGCGATAGGCCTGGGTATCAGAGACTGGAATGCGAAAAGTAACT
+TTTCCCGGTTGCTCGAATCCCATAAGGCGGGCACATTCTCGCGGGGTTAAACGGCGCGGG
+CGCCTTGCCATATTTACAGGATCATTAAAGTCCTTTTCGCCTATGCTGTGATCCCATCCA
+CGGTCTAGCAAAATTTCAGAGCCATCACGATAGTACCGTGCGCTGAGTGTTCTGCAAACA
+ACTGATTTATCAAGTGGATTTACCAGTCCGAAGCCAAATCCATTACCTTTTGCCTGGTGC
+TTTTTAGCGTAGTTATAAAGGTACTCCCAGAGCTTTGGAGAAAGGATGTAACGGCTATCG
+ACCTCAGCGTCCAGCAGCTCCCCAAGGGTTGGCCGTCGTGAAGGATAAAGAGCCGATACA
+CCACTTAACGAAAAGCCATCATGGAGCTTCAGATCGCGCCTGAATCCAACCAACACGATA
+CGTTCCCGGTGCTGAGGCCTGAAGTTCTTACCGTCAATTATTTTGGGGTCCTTTGATCCG
+TGAGCATCGCAGTCGGCAACATCGTAGCCAAGTTCATCAAGCGCTTTCATGATGATGCGG
+AACGTATTTCCCTTATCGTGGCTCTTCAGATTTTTTACGTTCTCAAGAACGAAAATGGCA
+GGCTGTTTGGCTCGGATGATCCGGGCGACATCAAAAAAAAGGGTCCCCTGGGTGTCGCAT
+TCAAAGCCGTGTTTTCGGCCCAAAGAGTTCTTTTTGCTGACACCGGCAATACTGAACGGT
+TGGCATGGGAAACCTGCGAGCAAAACATCATGGTCTGGGATGGATGCATCGATAGAAGCA
+TAGGCCTGGTCATCCGAAACATCGGGAAGATTACTGAGTGTAATGTCCCGGATATCTGAG
+TTGAAATAGTGCTCAGTCTCGTCACAGTACCAGTTTGCACTGTATGTCCGGCGGGAGAAC
+TGATTCCATTCGCTTGTAAACACGCATTTCCCGCCAATGGCGTCAAAACCACTCCGGAGG
+CCACCGATCCCAGCAAACAAGTCAATAAAACGGAAAAATTTCTGGTCATAGTCTGCTGGG
+CGTGAGGGGAGCAACGATCGAAGATAATGATATTCTTCCTGGGTTATTCGACATTCATTA
+ACTGAACCTTTGATCTGGCGAATAAGTGATGCCCTCGACCAGTCGCTGCCGGTTGCAGCA
+TTAAGTTGCGCAGCCAAATCTTTTACGTCATAGATACTTGCAACCTGCACCAGTAATTTA
+TGGATAGAGGAAGGCGTCTCATCATTAAGCAATGCTGTTATTGCAGGCTCAGTTCTATCG
+TTGTACATCCTTACTCCATGAAATGTGATTAATTTAGGACCTCAGACTACCACGCGGTGA
+AAATTCAATTTTTTGTTAAAGGCCTTTATTTTCATCTCCTGAATTAAAATTTTTAATCCA
+CTCAAATTGCCTCCGTTAACGGAAAATCGCCGAGTTTCTAATTGGTACAATAAGCGCGTC
+AAATCACACGACTTATTTGTTACTACGAACCATCTAATTCAGGGAGAACGTATGACTCTG
+TTGAAAAAGTTACTTTTGCCGACATTAATCGTCCTTTTCCCGGCGGCAACTCTGGCTGCC
+CAATCGTCATTTGAAGCGAAAGTGGTAAAAATTATCGACGGGGACACAATCACCGCGCTC
+GATGGTCAGAATACAAGCATCAAAATCCGCTTGTACGGTATTGATGCCCCCGAAAGTAAG
+CAGGCCTTTGGACAAAAGTCTAAACAAGCGTTGAGCGCCGCGATTGCTGCACAGAATATT
+ACGGTAATAGACCACGGACCTGATATTTACGGCAGGATGCTGGGAACCATTTGGCTTGAT
+GGTTATGACATAAACGCCTCAATGGTAGACAGCGGCTATGCATGGGTATACCGGTTTGAC
+GGTAATGCCATCGTCCCAAACTATCTGAAATTCGAAGCTTCAGCTCAGAAAGCAGTTAAA
+GGCCTCTGGGTAGATCCTAATCCCGTTGCCCCCTGGGAGTGGCGCCAGCAAAACCAGAAA
+CCTCAAAAGACGAAAAGCAGGGGGTGACCGCGATGACAAGACAGCATCCTTTATTGAAAA
+TTGCGCTTAATAGCGATGGACATCTTTCGTGGCCAATTTTACCAGGAGAGACTCACCGCT
+GCCCAACGTGTCTGCGACACGTTACTACGGGCCCGGATGGGGATTTGGTGCATTCGATGG
+AGGAGGGCGGCAACGTCTGCATACCTTCAGCTTCTGTTGTTATTTCAAAGGCAATTATTG
+AAATGCTCAGCGCAGGCGAACGTCTCTATGTTAATCCAATCAAGAATGGGAATAAAACCC
+TAGCACCGTCATTTATCTTTCTGCATACAGACCAGCAACTCCGCCCATTTATCAATTCGG
+ATTATCAGCCAGCCGGTGCCAGCTGGAGAAGTGATAAAGGTTTCAGGCTTGGCCTTTTCT
+TTATGAATGAGCGAGCCTCTAAAATTAATAAAGACCAGTTTGATTTTATTGCAGTAATAG
+ACCCATTGACCTTTCAGTCAGAATTTGATGCGACATGGTCCCGTGGTGAATTTGATGACC
+CTCTAAAGGCATTACGGTATTCAATTGTTTCTGAAAACTTGTCTTCCGTCTGGGTGAAAT
+GGCCCGTAAAAAACCTGCAACCGAGGAAAGAAACGGTGATGGCCGATTACTGGTATGACT
+ATTATTCACCTCATTCCCCAGCTCAGCAGGCTGCTTGCACAGCAACGGTGACTGGAATAG
+ATGGGAATGTATCCGGCGAAACTATTTACATGCTCCAGATCGCTTTAGAGCGGTCGACAG
+TTGAGTACCAGCTTGTAAAATCGCTAGGGGTCATATTGCTACTGGATAATACAGGAAATT
+TGGTATCGGAGGCGCAGCCGCACTTTGATATAATCATCAAGGCATGCATATCGGGCGTCA
+GAGACTTTGTTCTTCAGAATCCTCGGACGCTGGGTTTTGAAAACAAGGTTGCATAGTTAT
+AAAAAATCTTGCCGTTCTCAAGGCATCATTAAAAATTAAAATGAGGTATACATGGTACAA
+GTACTCAACACCACTGGTTTGAATTATCAACTTGAAAAAACAATCACTGAAGCTGAGGAA
+AGGATAATTCTCATTAGCCCATACCTTAAGCTTAGTAATCGCATTAAAGAGCTGATCGAA
+GATAAAAATAGACTAAAAGTTGACATCAGAATAGTTTATGGGAAATCAGAACTAAACTCT
+AAAGAATATGAATGGTTAACAAACCTGCCTTTTGTACGCCTTAGTTTTTGTAAAAACCTC
+CATGCAAAATTATATGCCAATGAAAATCAATGTATTGTGTGCAGTCTAAACCTTTATGAT
+TTTAGTCAGATTAATAACCATGAAATTGGAGTGTTAATTATTAAGGAGCAGGAGAAGGAT
+GCATACACTTCATCGTTAAATGAAGCTCAGCGACTGATCAGAATCAGCACAGATAACATT
+CAGCCACTAACAACAGATAAAGAAACAACAGGTTCAAAAGAAAGTGAAAAAACTAATAAA
+GAGTCATCCGACTTCACTTCAGCCTTTCATGAAGAACCATTAACAAATCAAAATGGATTG
+ATTACTGATTTAAATACAAATTCAAAACTCACTTCGACAAATCTAGCAAAAAATCATAAA
+ACTGATTTGTTATCTCTATATAAAAAATTAATCGAAGCTGGATATCTCATGGACGTAGAA
+GGAAAATACATATTGACTGATGCTGGCATAGCGGCAGGGGCAGAAGCCAAGCCAAATCGA
+TATAAAAAAGGAGAAAACTATTTTCTGTGGCCTGATAACCTAGCATTATGATTTTACATC
+ACGTACTGTGTCCCTGCGTAGCCATGAGGGACATAGAAGGGTCAATGAAAAATAGCTTGT
+TTAGTACTGATTCGAATACTGGGGTCACCTTTACCATCTCGCCTCACGGCCAGGGATGTA
+AACTGTCTGTAGAGCCTGAATATCGTCGCAAAGGAACACAAAATTACGATGGCTGGTTCC
+CTCGATATTACACTAAGCCACAATACGCTAAAGCAGCATTGACACGGTTTCTTGGGGAAC
+CTGTTAATTGGTTGGATTGTAATGACCATAATTAGGGCTTTCAGACAGTTAGCCAACAAA
+AAAATCTTTAACTCACCAACAATATTGAGAATTACCAAATGGAAAATCTGGATGTTGTAT
+CAGCGGTAGATTTTTACTTAGAAAAAGCATTTTATTTATTTGGATTCATAATGTTAGGTA
+TGGCATGGCTTACTTTTCGTGCTGGTTCAACTTATCAGCATTTTAAAAATGCTGATAAGT
+TAGTCAGTGAAGGTAGAGGCTCAGTTTCAAGCGGTAAAGAGCCTGAAATGATCCGGCGGC
+TTAAGTTCCAAACATTGATCTGGTACATTGCTAATTGTGTGGTGTTAGCATTATCCACTA
+TTGCTTTTGGGTATTTATTTTATCTTCTACACAGTTAATCAAACAATGAGAGATTTTTAT
+TTTCTATAATCAGGTACATATTTATTTTCTTGGAGATATTGATGAACGAAAACAATCCAC
+TTCTGCAATCTGAACTGCTGTTTTGAATACGTTAGTGGAGGTAATGCCTATGGTATTAGA
+TATCATGACTGTTTTGGCCTTTGCGTTTTTGGTTCTGTATAAAATAGCTTCACGAATCAT
+TTCTATGTCTGGTGGTGCGATAAGGTTCTGATTTTCAGAACCTTTTTTTAAAGTTTACTA
+GAGTAGATTTCATTTTGAATAAACGTAAGATACTCCTCACTTTGACTGCCTTTCCTAAAT
+TTTTTCTGTCCTTCAAAATCTATATCAGGTATGAAATGTATTAACTGGCTATCTTGGTAA
+AGTGAAAGAACGGAATTTTGATTGAGCACCTTAGAGTCCATTAATTGATAAACTGATTCA
+ATACATGCACCTATAAGAACATCACACAATTGCACGCTTGGGCTTTCTTTCGAATCAATT
+TGATAGACTTTTTTAAGGTTTAGAGGGAATGAGATAGTTGCTATCTCGGAATGTTTAAAC
+TCTCCTTCCTTATCACAATTGATCAAAAAGTTAAGGCGTTCATTGTAAGTTAGCAGATTT
+TTAGAACGATCATGCTCAATTGCATACTCTCCAGAGGACATCATTTCCGTGCGAGAAATT
+AATGCATTTAAAATAGTAAATGAGGCATCAGTGCTAATTCCATCAGTCATGATGGCATCA
+ATGCAATCTGGGTGGTTAAATGCCAAAGGACCAAAAAACTCTTTTAACCTTTGCCAATCA
+AGCCTCCTTATTTTGCTTATTAGCAAACTCACTGAATCTAATGTTTTTTCTTTCATAGCA
+TTTTGAAACTGAAGCAGAACACTGATGAATCCCCTAATGATTTTTATCAAAATCATTAAG
+TTAAGGTAGATACACATCTTGTCATATGATCAAATGGT
+>NODE_25_length_15938_cov_42.5346':NODE_32_length_86_cov_81.3333';
+ACCATTTGATCATATGACAAGATGTGTATCTACCTTAACTTAATGATTTTGATAAAAATC
+ATTAGGGGATTCATCAGTGTTCTGCTTCAGTTTCAAAATGCTATGAAAGAAAAAACATTA
+GATTCAGTGAGTTTGCTAATAAGCAAAATAAGGAGGCTTGATTGGCAAAGGTTAAAAGAG
+TTTTTTGGTCCTTTGGCATTTAACCACCCAGATTGCATTGATGCCATCATGACTGATGGA
+ATTAGCACTGATGCCTCATTTACTATTTTAAATGCATTAATTTCTCGCACGGAAATGATG
+TCCTCTGGAGAGTATGCAATTGAGCATGATCGTTCTAAAAATCTGCTAACTTACAATGAA
+CGCCTTAACTTTTTGATCAATTGTGATAAGGAAGGAGAGTTTAAACATTCCGAGATAGCA
+ACTATCTCATTCCCTCTAAACCTTAAAAAAGTCTATCAAATTGATTCGAAAGAAAGCCCA
+AGCGTGCAATTGTGTGATGTTCTTATAGGTGCATGTATTGAATCAGTTTATCAATTAATG
+GACTCTAAGGTGCTCAATCAAAATTCCGTTCTTTCACTTTACCAAGATAGCCAGTTAATA
+CATTTCATACCTGATATAGATTTTGAAGGACAGAAAAAATTTAGGAAAGGCAGTCAAAGT
+GAGGAGTATCTTACGTTTATTCAAAATGAAATCTACTCTAGTAAACTTTAAAAAAAGGTT
+CTGAAAATCAGAACCTTATCGCACCACCAGACATAGAAATGATTCGTGAAGCTATTTTAT
+ACAGAACCAAAAACGCAAAGGCCAAAACAGTCATGATATCTAATACCATAGGCATTACCT
+CCACTAACGTATTCAAAACAGCAGTTCAGATTGCAGAAGTGGATTGTTTTCGTTCATCAA
+TATCTCCAAGAAAATAAATATGTACCTGATTATAGAAAATAAAAATCTCTCATTGTTTGA
+TTAACTGTGTAGAAGATAAAATAAATACCCAAAAGCAATAGTGGATAATGCTAACACCAC
+ACAATTAGCAATGTACCAGATCAATGTTTGGAACTTAAGCCGCCGGATCATTTCAGGCTC
+TTTACCGCTTGAAACTGAGCCTCTACCTTCACTGACTAACTTATCAGCATTTTTAAAATG
+CTGATAAGTTGAACCAGCACGAAAAGTAAGCCATGCCATACCTAACATTATGAATCCAAA
+TAAATAAAATGCTTTTTCTAAGTAAAAATCTACCGCTGATACAACATCCAGATTTTCCAT
+TTGGTAATTCTCAATATTGTTGGTGAGTTAAAGATTTTTTTGTTGGCTAACTGTCTGAAA
+GCCCTAATTATGGTCATTACAATCCAACCAATTAACAGGTTCCCCAAGAAACCGTGTCAA
+TGCTGCTTTAGCGTATTGTGGCTTAGTGTAATATCGAGGGAACCAGCCATCGTAATTTTG
+TGTTCCTTTGCGACGATATTCAGGCTCTACAGACAGTTTACATCCCTGGCCGTGAGGCGA
+GATGGTAAAGGTGACCCCAGTATTCGAATCAGTACTAAACAAGCTATTTTTCATTGACCC
+TTCTATGTCCCTCATGGCTACGCAGGGACACAGTACGTGATGTAAAATCATAATGCTAGG
+TTATCAGGCCACAGAAAATAGTTTTCTCCTTTTTTATATCGATTTGGCTTGGCTTCTGCC
+CCTGCCGCTATGCCAGCATCAGTCAATATGTATTTTCCTTCTACGTCCATGAGATATCCA
+GCTTCGATTAATTTTTTATATAGAGATAACAAATCAGTTTTATGATTTTTTGCTAGATTT
+GTCGAAGTGAGTTTTGAATTTGTATTTAAATCAGTAATCAATCCATTTTGATTTGTTAAT
+GGTTCTTCATGAAAGGCTGAAGTGAAGTCGGATGACTCTTTATTAGTTTTTTCACTTTCT
+TTTGAACCTGTTGTTTCTTTATCTGTTGTTAGTGGCTGAATGTTATCTGTGCTGATTCTG
+ATCAGTCGCTGAGCTTCATTTAACGATGAAGTGTATGCATCCTTCTCCTGCTCCTTAATA
+ATTAACACTCCAATTTCATGGTTATTAATCTGACTAAAATCATAAAGGTTTAGACTGCAC
+ACAATACATTGATTTTCATTGGCATATAATTTTGCATGGAGGTTTTTACAAAAACTAAGG
+CGTACAAAAGGCAGGTTTGTTAACCATTCATATTCTTTAGAGTTTAGTTCTGATTTCCCA
+TAAACTATTCTGATGTCAACTTTTAGTCTATTTTTATCTTCGATCAGCTCTTTAATGCGA
+TTACTAAGCTTAAGGTATGGGCTAATGAGAATTATCCTTTCCTCAGCTTCAGTGATTGTT
+TTTTCAAGTTGATAATTCAAACCAGTGGTGTTGAGTACTTGTACCATGTATACCTCATTT
+TAATTTTTAATGATGCCTTGAGAACGGCAAGATTTTTTATAACTATGCAACCTTGTTTTC
+AAAACCCAGCGTCCGAGGATTCTGAAGAACAAAGTCTCTGACGCCCGATATGCATGCCTT
+GATGATTATATCAAAGTGCGGCTGCGCCTCCGATACCAAATTTCCTGTATTATCCAGTAG
+CAATATGACCCCTAGCGATTTTACAAGCTGGTACTCAACTGTCGACCGCTCTAAAGCGAT
+CTGGAGCATGTAAATAGTTTCGCCGGATACATTCCCATCTATTCCAGTCACCGTTGCTGT
+GCAAGCAGCCTGCTGAGCTGGGGAATGAGGTGAATAATAGTCATACCAGTAATCGGCCAT
+CACCGTTTCTTTCCTCGGTTGCAGGTTTTTTACGGGCCATTTCACCCAGACGGAAGACAA
+GTTTTCAGAAACAATTGAATACCGTAATGCCTTTAGAGGGTCATCAAATTCACCACGGGA
+CCATGTCGCATCAAATTCTGACTGAAAGGTCAATGGGTCTATTACTGCAATAAAATCAAA
+CTGGTCTTTATTAATTTTAGAGGCTCGCTCATTCATAAAGAAAAGGCCAAGCCTGAAACC
+TTTATCACTTCTCCAGCTGGCACCGGCTGGCTGATAATCCGAATTGATAAATGGGCGGAG
+TTGCTGGTCTGTATGCAGAAAGATAAATGACGGTGCTAGGGTTTTATTCCCATTCTTGAT
+TGGATTAACATAGAGACGTTCGCCTGCGCTGAGCATTTCAATAATTGCCTTTGAAATAAC
+AACAGAAGCTGAAGGTATGCAGACGTTGCCGCCCTCCTCCATCGAATGCACCAAATCCCC
+ATCCGGGCCCGTAGTAACGTGTCGCAGACACGTTGGGCAGCGGTGAGTCTCTCCTGGTAA
+AATTGGCCACGAAAGATGTCCATCGCTATTAAGCGCAATTTTCAATAAAGGATGCTGTCT
+TGTCATCGCGGTCACCCCCTGCTTTTCGTCTTTTGAGGTTTCTGGTTTTGCTGGCGCCAC
+TCCCAGGGGGCAACGGGATTAGGATCTACCCAGAGGCCTTTAACTGCTTTCTGAGCTGAA
+GCTTCGAATTTCAGATAGTTTGGGACGATGGCATTACCGTCAAACCGGTATACCCATGCA
+TAGCCGCTGTCTACCATTGAGGCGTTTATGTCATAACCATCAAGCCAAATGGTTCCCAGC
+ATCCTGCCGTAAATATCAGGTCCGTGGTCTATTACCGTAATATTCTGTGCAGCAATCGCG
+GCGCTCAACGCTTGTTTAGACTTTTGTCCAAAGGCCTGCTTACTTTCGGGGGCATCAATA
+CCGTACAAGCGGATTTTGATGCTTGTATTCTGACCATCGAGCGCGGTGATTGTGTCCCCG
+TCGATAATTTTTACCACTTTCGCTTCAAATGACGATTGGGCAGCCAGAGTTGCCGCCGGG
+AAAAGGACGATTAATGTCGGCAAAAGTAACTTTTTCAACAGAGTCATACGTTCTCCCTGA
+ATTAGATGGTTCGTAGTAACAAATAAGTCGTGTGATTTGACGCGCTTATTGTACCAATTA
+GAAACTCGGCGATTTTCCGTTAACGGAGGCAATTTGAGTGGATTAAAAATTTTAATTCAG
+GAGATGAAAATAAAGGCCTTTAACAAAAAATTGAATTTTCACCGCGTGGTAGTCTGAGGT
+CCTAAATTAATCACATTTCATGGAGTAAGGATGTACAACGATAGAACTGAGCCTGCAATA
+ACAGCATTGCTTAATGATGAGACGCCTTCCTCTATCCATAAATTACTGGTGCAGGTTGCA
+AGTATCTATGACGTAAAAGATTTGGCTGCGCAACTTAATGCTGCAACCGGCAGCGACTGG
+TCGAGGGCATCACTTATTCGCCAGATCAAAGGTTCAGTTAATGAATGTCGAATAACCCAG
+GAAGAATATCATTATCTTCGATCGTTGCTCCCCTCACGCCCAGCAGACTATGACCAGAAA
+TTTTTCCGTTTTATTGACTTGTTTGCTGGGATCGGTGGCCTCCGGAGTGGTTTTGACGCC
+ATTGGCGGGAAATGCGTGTTTACAAGCGAATGGAATCAGTTCTCCCGCCGGACATACAGT
+GCAAACTGGTACTGTGACGAGACTGAGCACTATTTCAACTCAGATATCCGGGACATTACA
+CTCAGTAATCTTCCCGATGTTTCGGATGACCAGGCCTATGCTTCTATCGATGCATCCATC
+CCAGACCATGATGTTTTGCTCGCAGGTTTCCCATGCCAACCGTTCAGTATTGCCGGTGTC
+AGCAAAAAGAACTCTTTGGGCCGAAAACACGGCTTTGAATGCGACACCCAGGGGACCCTT
+TTTTTTGATGTCGCCCGGATCATCCGAGCCAAACAGCCTGCCATTTTCGTTCTTGAGAAC
+GTAAAAAATCTGAAGAGCCACGATAAGGGAAATACGTTCCGCATCATCATGAAAGCGCTT
+GATGAACTTGGCTACGATGTTGCCGACTGCGATGCTCACGGATCAAAGGACCCCAAAATA
+ATTGACGGTAAGAACTTCAGGCCTCAGCACCGGGAACGTATCGTGTTGGTTGGATTCAGG
+CGCGATCTGAAGCTCCATGATGGCTTTTCGTTAAGTGGTGTATCGGCTCTTTATCCTTCA
+CGACGGCCAACCCTTGGGGAGCTGCTGGACGCTGAGGTCGATAGCCGTTACATCCTTTCT
+CCAAAGCTCTGGGAGTACCTTTATAACTACGCTAAAAAGCACCAGGCAAAAGGTAATGGA
+TTTGGCTTCGGACTGGTAAATCCACTTGATAAATCAGTTGTTTGCAGAACACTCAGCGCA
+CGGTACTATCGTGATGGCTCTGAAATTTTGCTAGACCGTGGATGGGATCACAGCATAGGC
+GAAAAGGACTTTAATGATCCTGTAAATATGGCAAGGCGCCCGCGCCGTTTAACCCCGCGA
+GAATGTGCCCGCCTTATGGGATTCGAGCAACCGGGAAAAGTTACTTTTCGCATTCCAGTC
+TCTGATACCCAGGCCTATCGCCAGTTCGGCAATTCGGTCATCGTCGACGTATTTGCGGCC
+GTGGCCAGTTTGCTTCGAAGCCGTATTGAGATCGCCGTTGCGGCTCGTCTCAAGGGAGAG
+TTTGAAGCGGCATCATAGTAATTCTTCTGTGTGATTTTGCAGGTTAACGTAATGGTTTAT
+TTCACTAATATTGTAACTTTTACACAGAAAAAAACCTGGGCAGGGAGAGAAAGGCCTGCT
+TCAGTCAACTCCTTCATCAGGAGGTAATGATGACGTATTTTGATTCAGCAGAAGACCTCA
+CCATTTCAAAACAGAGAGCTCTGCAAGAGCTTGCAAAACATGGCGTCGTAGCCAGCGACA
+TAGACGTATTTTTTTCCGAGTTGGGTGAGAGGGAAGAGTACAACGCGCAAGAAGTATTGA
+TATGGCTAGGCTATTAGTATTTTTAAATTTCAGGAGGTCCCATGGGCCAGAAGTTTGCAG
+TTTTTATTGCTTACGATGACGAACCAAACACGAAACGATACTCGGCTGAATTTCAGACAC
+AGGATGAGTATGTAAAGGGATGGCAGTCGGCCCTGAAGAAAGCACACCACACGTCCGGGC
+AGAAATCTGTGATCAGCTGCGGATGTCGGGGAAAAGGCGCAAAGCGTCTCTACGTCCGCT
+CACTACCAAACAGTGATACGTTCATCCTGATTAAGGCTGCAAATACAGGCACTGAGCATG
+ATCCATCGTGTGTGTTTTTCGACCTTGATGCCAGGCATACAGGGTTAAAGGGTTATGCCA
+GCAATGTTGTACGCATCAACAATGAGGGGACCATGTCAATCCGCCTTGGAATAGGCATGA
+CGGAGAAAGATCCGCCGGAAAAGTCTGAGGTTCCTTCCCTGCCCCAAATCCAGCGACCTG
+AAGGTGGCCAGGCTTCAATGACCCTCTCCGGACTTCTGAGTTTGTTGTGGACTGAAGCCG
+GTCTTAATGTCTGGTATCCGAATATGGCCGGGAAGCGAAATGATTCGCTGGTTCGATACC
+GGATGTTGGAAGCCGCAAAGCAGATTAGATCGGGTAGAGCATGTATTGGCGACCATCTTT
+TTATCGGGGTGGCGGACTCTAAAAGCAAAGTGGCCAGTGAGCAGGTTCAACTGCTGTCGT
+CGGCGGAACTGAGCGACAAACGACTGCTGCTGCTATCAGTACTGCCGCGCTATGACGCAG
+AAAAGCATGAGAAGCCGCTGAAGTTTCTACCTATGCGTAACTTCGGCGGTATGCCCCTTA
+CCTTCTTTAACTCAGACGGGCACTGGGATAGCGTGAAGCGGCGATTCCCTCTGGAATATG
+CCGCCTGGAAAAATGGGGGCAAAGTTGTTGTTTTTGCTCTTACATCTCCCGTATCGGTGA
+CCAGTAGAGGTATCTCTGCACGAGCTCATCAGATAGTGCTTATGCTGGTGAGTGATAACT
+GGATACCTCTGGACTCCTCCTACGAAGCGATAGTGTCCCGTAAACTTGATGCCGAACACC
+GGCACTATGTTAAGCCTATGCGGTATGACGCCAGTGCGAGCGATGTTTTCCCAGATTTTT
+ATTTACTGGATACACGAAGTGATAAGCCGTTCCCGATGGAAGTTTTCGGGATGTCGACAC
+CTGCCTATCTTGCGCGAAAGGAACTTAAGAAGGCGTATTACAACCAGGAATATGGGGCCT
+ATGGATGGTGGCACTGGGATGCTACGGAGAAGACTGAATACCAGGAACTCCCTCATTTCC
+CGGAAGCTAGACGATAAAATTAACCCGAATCACAACCTTAAAATTGGGCTAAAAATGGCG
+TACATACTTTCGATGAGTGAGCAGGTTAAACTGAAGGCGTTTTTGGCGGCAGTACTCGAT
+GACTACAAACTGGGAGCTATTTCACAACAGCAAGCTGTTGGCGGGATCACTAGCCTGGTT
+GATGCTATTGAGATCAGTGATTCGGGGAAAATCAGCCTAATGCTGTCGGAAGGACGTAAA
+CTCCTGCGAACGGGATAAAGAGCCTGTGGACGCCAGGAATTTAAGTCTATTGCAAATTCC
+TGGCGGGAGCAGTTATGTCGTCTTTTTGTTTCGCGGTTTTGATGCCCCAGAGGATTTAGG
+TTTGATGGCAACTGCGCCGGTCATAGCTTCGGTAAGCTGCTTGATTGTTCCTCGTAAAGA
+CTCGGCAATGGTCTTTTCCGCATTGAGTGTCGCTTCCATGGAAATCATCTGATTCCTGAG
+CTGTTGAAGCTCTTCTGTCTGATCTGTTTGCACTTTTTTGGCAACCAGGCTCTCATCAGC
+TAAGCGTTGTGCTTCAGCTCGTAGTTGGTCATTCTCCCCTTTAGCTGTTGAGAGCTCCGA
+CCGCACGAGCGTCAGGGTCGTGTCCTTTTCGGCTAAAGATGAGCTCAATTCAGAGGAATG
+GGTCTGTACTGAGGAAAGGTCCTGTTCAAGCTGACTGACACTGACTTTTAAATCAGACAC
+GGTCCGTTGTAAGTGATCATTCTGGCTTTTGAGGGCTGTCAGCTCTACCTGCTGCGCTTT
+ATTCTCATCATTCAGCTGCTTCTGATACTCCTGCTGCGAGGCCAGTTCCTGTTTGCGCTC
+ACTCAGTTGCTGGTTCAGTGTCCCTACTGTCTGCTGTAAAAGCTGGATCTCGTTTTGGGC
+ATGCTGTAATTCACTTTGAGTTCCTGCCAGAGTTTCTTCTGCTTCCTGAAGTGAATCTTC
+TAATTTACTGGAGAGTTCACGCTGCTGCTCCAGCAGGTTAATCAGGTTAACTTTTTCGTT
+ATTCAGGACTGTAGCCTGTTCTTTCGACTGTGACAGTTCTTCCAGAATTTCAGCATTCCG
+CTGCCGTAACTGAGTAATTTCTGCCTTCGCAATTTTCACGCTATCACTCTGGATAGCCGT
+ATAGCTTAAGCGGAAGTACCAGGTGATAAACGCAGTAAAATCACTGAATGCATCTTTAAT
+CTGGTCAGGGATTTCAATCGCGCGTGCTTCCTCGGGCACCTCGTCCACGTATTGCTTGTA
+GGCCGCCAGCATCTCCTGAGCCCGGGCAAAAGACCCCCCCATTTTATCCCGCAGCCAGTG
+GGCTTTGAAAAACTGGTCGAGGTTTTCGGTGCTGATGCTCTTATCGAGGCAGATTTGTTC
+AATCTCGGTGAAATATTTAACCTTAGCTATTGACGAGTAAGGGGAATTCTTCAGTAACTC
+GGGGCTTAGAGGGGGCGTTTTTGAAGTCTCTTCACTTAAACTGGACGCAGTTTGTTCATC
+CCCGTTCATCAAATTTACATTGTCAGTCATCATTCTTATCCTTTGGCCGGGATCTGGTTG
+GCAAAATAAATGCTAATCAGGTCATTCAGTGCGTTATGCAGGCTTTCACACTCAACTGAG
+ATATGGACGTTACCATTTCCGAACAATCGGAACTTCCAGCCCTTCGGGTCGGTAATGTCA
+CCCGTGAAATCGGTTTTCCGTAAGACAGCAAGCCGATCGTACATGTTCATTCCACTGCCG
+ACAGGCGGTGTTGCTGCATTGGAGCAGATGCAAACGACATTCTCAAAGTCGTTTAAATAG
+AAGAGATTATCCTGAGAAAAGCCATTATATCTCATCATGTTCGAGTCGGGAAAAATGCCG
+CGTAGTACCAGTTTTTTTGGCATCACAAATTGCTAGGCATTAGTTTTATACCGGCGATCA
+AGCTGGCATAGCAGATCAACAAACCCTTCAGCAAGCGTAATGCTGCGCATGGCAACTGCC
+TGGCGCAATGTACTGCGGATTACGGTTAACGACGCAATTGGCGGAGCGTTCCGGAGAGAC
+TCACGGAACTCCGCCCGCTGGTTGTGATTCCAGAATCGGTCAATACCCGTTTCTTCAAAA
+AGATTGTTCCATGTCTTACGGTCTATTTGCTGTCGCCCTTCCTCGATGCTTGCGGCCAGG
+GACGCAGGAAGGCCAAAAGCATTAGGGGCCATAATTTTGCTGTTAAACAGTGAAAACCCG
+CAAATTGCTGAGGCTTCGGCAATCAGCGTCATGCCGTCCAGAAATTTTTGCATAGCGGCA
+TCACGACTACTGGCGAGTTGTTCGGTACGGGTACTCAACTTCAGTTCCGGCTGCGAATTC
+ATGCTCATTTCACGATCCTTTTCCCACTGTTTTGGCTGAGAGATTTTCACTGGCCTATCC
+ACCTCTCTAGTTAAAAAAATTCTCGTAGCGTCATTTATAGTAACGCCTTTACTAATGACT
+AAAGATGAAAAAGATTAGCACACAGATGTCGGGTGACCAACAACCCGCAACCCGTTAAGT
+GGCGATCGCATTCCCTGAATGCACAACCATTGAGCTATATGACTGATTAATAAGGTTTTT
+ATCCGCAATTACACTATGAGGGGGGCTATGTGTACGATGGGATTTACCCCGAATTAAATC
+CCATAGTACACAAAATGAACTAAATAAAGCCGAAAAACGTGACGGTGTCACATCTGGGGT
+GTTTATTTTGGTAACTAGTTATTAGTAAAGGCATGACTAAATGTATAATGGGGTAGTCGT
+TTACGTTTAGGGCTTCCTCTTTGTCGTTATGGCGGATGAGGGGCTGTTACGATAGTTAGA
+CAGTGATTACACACATTTGGCTGAGGGCTACAAAATGGCGGCGTCGCGAATTACACACCT
+AATAACGTCCTGTACCAAAGGTAAGCACAGCCAGTGCGGCTCCATGCCAGAACTGAGTAT
+CCGGTCTGGACAGACACCAGAAGAGGCAATGTCCAGCTGGGCAGCAACGATTAAACGGTC
+GCAAAGTGCTTCACCGGTACCGGCCCTGTCGCTCTATGCCGGTAATCACTGGTCAACGGC
+AAAAGAGATATTACGGACAACTGAGAACCTGGAGTTGTGGGTGATCTCGGCCGGGTTGGG
+TTTTTTGAATAGTCGTGACCTCGTGGACGCTTATGAAGCCACCTTTCATGATTTACCGTT
+CAGTCACCGACAATGGTGGCGGGAATTAACAAATACATTCGGGAAAGAAAGGACGGCGAA
+ATCTATTGAGACATTGATGGCAGCAAGACCTTTCGATGATTATGTTATCGCTGCCTCCCC
+CGTTTATATCGAGGCGACGGAGGATGATATCCTGGCAGGGGCAAGCAAATTAAATAATCA
+CATTGCCCAGTTGACGGTTGTAACGTCAGGGGAATATTCTGGACTACTTGAATCCTATTT
+AATTCGTAGCGAATCCCGTATGATGCGGCAACTATCAAGCAACATGGTATGTCTTAACAT
+CAAACTTGCTCAATATATTATTGGAAGTCGGCGCTATTCATGAACCGCACTGATGATTCC
+ATAACGCAACTATCTTCACTTTATGAACGGCTCGGAGCTGTGGCTCATGAACTGGAATAT
+TGTAAAATTCTGCTCCCTGAACACTCTGAACAACTGGATCTTGATGCCGCAGCAACATAT
+GCAATGATGCTCCGCATTGAACAGTGGGCAGCAAACGTTAAGAACGCATATAATACCAAC
+ACATACGACCCTTTCCATATTAACGAAAAGGACAAACAACTAAGAAATCAAGAGGAAGAA
+AATCAATATTAAAAGGTCTCTCCAGTAACCGAAAGTAATAATCGCATGAGACAGACGGCG
+ATTTTATCTAATCTTGCGGAGTTGGCACTACAGAGGAACTGGCAAGTGATAATGCATTTG
+TTTCCATACGCGGGGTGGTTAATGTCTTTAGGTACCAATGATTGATATCATGCGCCCAGA
+AAATCTTACGCGTCTAGCTGGCTCAAAATAATAAAAGAGTGTAATATCGCAAAGTATTCT
+ATTGATTTTATTTATTACTCTTAGTGAGGTCATATGTCCGAAGCACTCAAATCATTAAAC
+AACATTCGTACTCTTCGTGCGCAGGGCCGTGAACTGCCGTTAGAGATCCTTGAAGAACTG
+CTGGAAAAATTAAGCGTTGTTGTTGAAGAACGACGTCAGGAAGAATCTTCAAAAGAAGCT
+GAGCTGAAAGCGCGTCTGGAGAAGATTGAATCCCTGCGTCAATTAATGCTTGAAGATGGA
+ATTGACCCTGAAGAGTTACTGAGTTCTTTCTCTGCAAAGTCCGGAGCACCTAAAAAAGTT
+CGCGAACCGCGCCCTGCGAAATATAAATACACTGATGTTAATGGTGAAACGAAAACCTGG
+ACTGGCCAGGGGCGTACCCCTAAAGCACTGGCCGAACAACTTGAAGCCGGTAAAACACTG
+GATGATTTCCTCATCTAAGTTGAAATTAAAATCGCGAACAGCTCAGTTCAAAAGCCACTT
+TTCAGTGGCTTTTCTTATTAAGCCTATGTTTAGGAATATTCAAATAATCTAGGGTTTAAT
+GACAATTGTTTTGCCATCAGGTAGATAAACCCCTATTAAACGAAGGACAAAACCACGCCA
+ACCAGAATTTGCTTCCTTTATGCAGCGATACAGTTCGTTATTTTCACTTTTCAGTTTATT
+CCATTCAAGAAAAAGAGATCTCCGGATCTAACTCTGAGATGTGTTTCACTTCGTTGTTTA
+TGCGTACAGTATTGATACCATTCCCAGTCATAAAAAGTCACCGTAGGTTTGATAAACAGG
+TTGAACATTGACAAAACTACTTTGTAGTAAGCTTTATCAAATTCAATTCTAAATCAGTTC
+TAAGTTATTTGATGGCAGATATAACCGACAATTAGGAAAAAGGTGATGCCGACATATATC
+ATCGTTAATTGAAGCGTACATGGCATATCTTGTTCTTTCGGGATTTTTACTCTATTGCCT
+CTTATTATGCCTGCCAAGCAGTAAATTCCAATAGCCCATGGAGTTGTGATCGGCACCACA
+CCGAGAGGCACAAAACCCCCCCCACAGAACAGAAAGAGCAAAACCACTATAAATGATTCC
+TACAATCCATGCAGCAAGGCCAGCAGCCTTCGGAACAATACTTTTCAAGTTCATTTTCAT
+TCCTTCTTATTGAACTTCAGTCTAATTGGGCAGACTTTCAGAATGCCATTAGGCTAACGT
+AGCCTAATAATGTATGTTGCTGCTAACTGGCCGTTTTTCATAATTGTTGATTTTTTTATT
+TAGCGCATTCTTTATGACTGGATTGACATGACGGTTAAAAAATTTGTTCCAGTGATGTCG
+AAGGTGTTCAATATTGATAGGCATTTGCAGGCGGGAAAAATCAATTTGCTTGCCTTCCAG
+TTGTAGTAAGTCTTTATCGACGGAGAGCACATCCGGGCTGAAACGGGCTTTCATTGAATC
+AGGGTCGATCGAAAAGTGCCAATTGTCAAAGAGGGTATTGATGTCACTTCGCAGTAGAAT
+CCCGTTTGTCACATCCGGCTCACCACCAGCATGACGGGGTTTTATGTGCGCAGCCTCAGT
+TCTTTGTCTGCCTCGAACGCCGGTAAGAACACACGTACCGGCGCAGTTTTTCCGGACATC
+TTCAGAAAATAGTGCCAGGTCCGGGCTCGACATTGTGATTTGTTCCTGCCCCTCCTGATA
+AGTTCGGGAAGGAAAAGTTACTTTTATTAATGTTACTGCGGGGAGCGAGAGACAGGTAAC
+CCCTTGACCACTGAACTTCCCTCCGTTAAAAACCATCGGGATTGAATAAGTCATCCCCAC
+CAGGTCAGGATCACTTATTTCAACAATTTTTCTTCTACTGTTGTCAATTTGGTGGAACTG
+TATAAAACGGCCAGTGTAAATGTCAAAGGCTCCATCAGGACGTTCAACACACAAAACAAC
+ATTGCGGCTTATTCATTTTTGTGGTCATCTTGTATCTTGGCTATTTTCCCCAGGGCATCA
+CAAAACTGTTATCCGGGCGCTTCACTATAACTCGATCCTTTTTACGTTCAATCGTCCAGG
+TTTCCTGGCGACGGGACTGATTTGTCGCATCAACAACAGTGACCGCGACAGTCGCAGAGT
+GCTCCTCAATGAGGACGCAGCCGCCCTCAGACGTATTATTGCCGTTTACATCCGGGCAGT
+GGCTGCTCCCGAATATTAGTGCTTCCCTGCCGTGGTCATCCATCCGCCAGCCCGGACTCA
+TCACGATAGTCGGTTCCTTGAAAGGTCCATTCGTGTATTTCTGATACACTCCACTTTCCG
+CAGTCCCATTTGCCAGGTCGCAACCTGTCAGGCCCGCAGATAAAATAACAATGGTCGCTT
+TTAAATATCCCGAAAGGCAATTTTGCATTTGTTGTATCAACTCTGTTGGATTTCAATATA
+AAGGTGGCGTGCAGCCAGCCCCCATCAGTAAGTGGTGTCCATCCCGAAAACACTGCCATC
+GGTTATAGGCTGAATTTCCCATCAATCACTCGGCACCTATAAAGTCAGCCCAGCGAGCAG
+CCAGCCGGTCGGTATCCAGATCATACACCAACGGATTGAGCGTTTTTCCTTCAAACAGCT
+CTCCCGCCTCGATGCCCGGTTTAAAATGAACGGTGAGTGTTGAAGGGTCTATACCCATCA
+GATCCGCGTCAAACAACGCGTGCATTGTCGGCGTCAACAGGATGCCGTTCGAAGGGTTGT
+AGCGCGTCCCATGCTCGATATGAGCCGCCACCAGCACACCACCATTAACCCATCCAGTGA
+CTGCACACCGACCGGCGAAGTTCTCAATGAGCAGGGTTTTGAATTTATTCTGCGCTGCGC
+TGCTCCGTTCGGTCACAAAGCGTTCGCAAGGCTCACCCTGAATATTCACGTCAGGTTTTC
+GCTTCAGTTCGCTGGTGGCGCTCTCAGGGCGTTTTAACGGTGTCCGTGAATAAGCAAGAT
+TATAGGCAACGCCTGTGTTCAATTGTTCAATAACGGCCGGTGCATATCCATACGCTTCAA
+GCTTGCGGTAGGCAGCACGGTAGTCCTGCTGGGTTTTCACAGGAAAAATGTCGCCGCCGG
+TACCGTTGAATGCGATAAACCAGAAATGATCTTCGCCCGTTGCCAGATGTCTGCATCGCT
+TCAGGTGCCAGCCACCTTCCCTTGCCCAGCAAGTACGGTTGTTCCTGGCATTGGTCGTGT
+CATAGCCTTTTGATAAGAGCCAGCTATGAAAACTGGTTAGCCCCAGATCCTGTATATTCA
+GAGACGGGACACAGACTACCTGTAATGTATGGCGTGGACGAGGTTCTCTCACTTACTACT
+CCCGTTTAAGTGATATGCCAGCGAATACTTCCCGGCAATTGACAAACACCCAATAAGCTG
+CGGCACCATAATTCCTGCAACAATGCCAATCGGAATTTACTCTATTTAGGAGGGTTAAAA
+TTTCGATCCACAAAGTCAGCCCATTCCTTACGGGTCATCCCCCCACGGCTCTCAACTTCT
+TGCACCCACCGAGGGTTTTCACAGCTGGAGGCGATAGCAAACATGCTACTTTTATCCGCT
+GATAACGGAATGACACGCATATAGTGATCCCAAAACCAGATATTGAAGAAAAGAGACAAT
+AAAAGCAGAACACCAAGGATAATAATCATTACAGTCTCTATTCGGCTTGAATTTCTGTAA
+TTGAGGGTGAAAATAAAATGGGTTTCACAACTCATTTACCCCGTAAAGTGAATTAGCCGG
+TCAACGTGGTTTATGGGTTCGAACACTCCATGCTATTCACAGTTACAATTCTGGTATTTA
+ATGACGATGACAGATCCTTTGAAAGGCGAATGAAGCAGGTTCGAGAGCTGGACGTCACCT
+TATACGAAATGTAGGAGCTTCCGACATCATCTGGTTGAATGATGGTGTACCCCTTAGCAA
+GTGCGTCGGCATCATCATTCAGCTCTTTTAATTTTTGAGCAGAGGTTTTTATGCTGATTT
+CATCAACTGGTTTAAAAATGAAAAACTCTTTGCTGAGTAAGGAAGCAACAGCGTCATTTG
+CAGCCGCAAGGTCCATTCCACTGTTCTTTTTCACCTGTGGCAATTGCTGAACTTTTAGCA
+AAAGCATCTCTGTCAAAGCTGTACCTGCCTTATTCGCCAGTTCTGCACTGTCATCCTGTG
+ATATTCGCTGGCCCAATTCCTGCGAAAAAGATGTCAAGGGAATAAGCAGGAACAAGGTCG
+CCATCATTTTTGTCAACTTCATAAATTATCACCTGTCGTTTGTTTTGAATGCGGTGCATC
+TACGAAGGCGCCGCAGGCCTGGTGTAGAGCATCAGCATTCGTGTTCCAGTCCGCTATACG
+GTTACCTGCTCAATGAGACAGTCAACATAATCATCGTTCTTAATATCGGCATCCATATCG
+ATTTGTGCTCATCATTTCCGGTTGTTCTGTGTGGCCGTCAGGGTGTTAATATTTGCTTTT
+CTCATAAGACGGAAGGAGTCGGAAAGTGTAATGACCGGATGGCCTTCATTCCTTACGGCC
+GCAGAATCACCGGCAACAAATTTCATGGCCACGGCTACCTGGTAAGCCAGTCCCGATAGA
+GCGGTATCGAACTGCTGAGCCTCTGAGGCAAAGCGACAGGCATCCTCAATCGAGGCCCCC
+GTCAGTAACGCGTGAGCGATGAGTCTGCCGGTTTTTTCTGGGTTGTCGCGGGAGATATCC
+GAACTGACGGTACTGCCAATAAGGGGTCGTCTCAGAAAACGGAATCTATGGTCACTCCCG
+TTTTTGCAACACCGATTTTGACGACAAGTTGGCTTGCT
+>NODE_26_length_130_cov_84.9811:NODE_23_length_1411_cov_42.084,NODE_24_length_52213_cov_42.1417;
+CTGGCGATTAAGGGGGTTAAATGCCACGGGACACGACCAGCTTTCCTCCATGGTCTGGCG
+ATTAAGGGGGTTAAATTCCATGGGACACGCCCAGCTTTCCTCCATGGTCTGGCGATTAAG
+GGGGTTAAAT
+>NODE_26_length_130_cov_84.9811':NODE_23_length_1411_cov_42.084',NODE_6_length_50434_cov_42.3615';
+ATTTAACCCCCTTAATCGCCAGACCATGGAGGAAAGCTGGGCGTGTCCCATGGAATTTAA
+CCCCCTTAATCGCCAGACCATGGAGGAAAGCTGGTCGTGTCCCGTGGCATTTAACCCCCT
+TAATCGCCAG
+>NODE_27_length_78_cov_99:NODE_8_length_346_cov_41.0595',NODE_9_length_4537_cov_41.0029';
+GGTAAGCAGAGTTTTTGAAATGTAAGGCCTTTGAATAAGACAAAAGGCTGCCTCATCGCT
+AACTTTGCAACAGTGCCC
+>NODE_27_length_78_cov_99':NODE_44_length_820_cov_167.058;
+GGGCACTGTTGCAAAGTTAGCGATGAGGCAGCCTTTTGTCTTATTCAAAGGCCTTACATT
+TCAAAAACTCTGCTTACC
+>NODE_28_length_79_cov_78:NODE_8_length_346_cov_41.0595,NODE_9_length_4537_cov_41.0029;
+GGTAAGCAGAGTTTTTGAAATGTAAGGCCTTTGAATAAGACAAAAGGCTGCCTCATCGCT
+AACTTTGCAACAGTGCCGG
+>NODE_28_length_79_cov_78':NODE_44_length_820_cov_167.058;
+CCGGCACTGTTGCAAAGTTAGCGATGAGGCAGCCTTTTGTCTTATTCAAAGGCCTTACAT
+TTCAAAAACTCTGCTTACC
+>NODE_29_length_751_cov_85.3516:NODE_10_length_211_cov_46.2537',NODE_11_length_146_cov_38.8551';
+GCCTTTCCGTTTTACAGGTTCCTCAACAGGCCGGTGGGCCGTTAGTATCATCAATATCAG
+TATTCGCAAAACCAGATCAGTAATTCTTTAAACCGGTGTATTTCTGCCGTTATGCTACAT
+AAGTTTGCTGTCGTGCCGTTAGGGCCCAGGCTATTCTGGCCAGCTTGTTTGCCAGAGCAC
+AAGTGACGACAAAGTTGCTTTTCCGGCACAGTAAATCCCTGACCCAATCGGCCAATTTGC
+CAGACTGGTGTTCCAGTTTTTGTATGAATACCCTGGCACATTGAACCAACAAAGTTCGGA
+TCTTTTTATTACCTCGCTTACTAATTCCCAGCAATGTCGTCCTACCTCCCGTGCTGTACT
+GCCGAGGTACAAGCCCTGTTGCCGCCGCAAAGTCACGGCTGCTGGCGTACTGCTTCCCGT
+CGCCAATCTCAGTTGAAATAGTACTCGCTGTCAGTGTTCCGACGCAGGGAATGCTCAGCA
+AGCGCTGTCCAACCTCATCTTCGTCCAACTTTCGTTTCAACTGGGATTCCAAATCTTTAA
+TCTGCTCAACAAGATAGTGATAATGCTGTTGTAATTTCAGCAATAACTGGCTGAGGTAAA
+GAGGCAAACTATTATCCTCAAGAATGGTACTCAGTCGGCTAATAACGGCAGCTCCTCGGG
+GAACGCTAATGCCAAATTCCAGCAGAAAAGCATGCATTTGATTGGTTGTTTTTACCTTAT
+CCTGAACCAGGGATTCACGGACACGATGCAG
+>NODE_29_length_751_cov_85.3516':NODE_38_length_237_cov_132.244';
+CTGCATCGTGTCCGTGAATCCCTGGTTCAGGATAAGGTAAAAACAACCAATCAAATGCAT
+GCTTTTCTGCTGGAATTTGGCATTAGCGTTCCCCGAGGAGCTGCCGTTATTAGCCGACTG
+AGTACCATTCTTGAGGATAATAGTTTGCCTCTTTACCTCAGCCAGTTATTGCTGAAATTA
+CAACAGCATTATCACTATCTTGTTGAGCAGATTAAAGATTTGGAATCCCAGTTGAAACGA
+AAGTTGGACGAAGATGAGGTTGGACAGCGCTTGCTGAGCATTCCCTGCGTCGGAACACTG
+ACAGCGAGTACTATTTCAACTGAGATTGGCGACGGGAAGCAGTACGCCAGCAGCCGTGAC
+TTTGCGGCGGCAACAGGGCTTGTACCTCGGCAGTACAGCACGGGAGGTAGGACGACATTG
+CTGGGAATTAGTAAGCGAGGTAATAAAAAGATCCGAACTTTGTTGGTTCAATGTGCCAGG
+GTATTCATACAAAAACTGGAACACCAGTCTGGCAAATTGGCCGATTGGGTCAGGGATTTA
+CTGTGCCGGAAAAGCAACTTTGTCGTCACTTGTGCTCTGGCAAACAAGCTGGCCAGAATA
+GCCTGGGCCCTAACGGCACGACAGCAAACTTATGTAGCATAACGGCAGAAATACACCGGT
+TTAAAGAATTACTGATCTGGTTTTGCGAATACTGATATTGATGATACTAACGGCCCACCG
+GCCTGTTGAGGAACCTGTAAAACGGAAAGGC
+>NODE_30_length_81_cov_86:NODE_15_length_1977_cov_41.2532,NODE_15_length_1977_cov_41.2532';
+TTGAATGGGTTCATGTGCAGCTCCATCAGCAAAAGGGGATGATAAGTTTATCACCACCGA
+CTATTTGCAACAGTGCCATAT
+>NODE_30_length_81_cov_86':NODE_44_length_820_cov_167.058';
+ATATGGCACTGTTGCAAATAGTCGGTGGTGATAAACTTATCATCCCCTTTTGCTGATGGA
+GCTGCACATGAACCCATTCAA
+>NODE_31_length_78_cov_87:NODE_35_length_1394_cov_42.7001,NODE_36_length_2625_cov_42.3034;
+TTGAATGGGTTCATGTGCAGCTCCATCAGCAAAAGGGGATGATAAGTTTATCACCACCGA
+CTATTTGCAACAGTGCCC
+>NODE_31_length_78_cov_87':NODE_44_length_820_cov_167.058';
+GGGCACTGTTGCAAATAGTCGGTGGTGATAAACTTATCATCCCCTTTTGCTGATGGAGCT
+GCACATGAACCCATTCAA
+>NODE_32_length_86_cov_81.3333:NODE_21_length_1646_cov_41.9885',NODE_25_length_15938_cov_42.5346;
+ATAGATTCAAGCAAGCCAACTTGTCGTCAAAATCGGTGTTGCAAAAACGGGAGTGACCAT
+AGATTCCGTTTTCTGAGACGACCCCT
+>NODE_32_length_86_cov_81.3333':NODE_38_length_237_cov_132.244;
+AGGGGTCGTCTCAGAAAACGGAATCTATGGTCACTCCCGTTTTTGCAACACCGATTTTGA
+CGACAAGTTGGCTTGCTTGAATCTAT
+>NODE_33_length_106_cov_94.1379:NODE_34_length_1034_cov_43.0564',NODE_35_length_1394_cov_42.7001';
+TGTTGTGCAGCCAGCTCCTGACAGTTCAATATCAGAAGTGATCTGCACCAATCTCGACTA
+TGCTCAATACTCGTGTGCACCAAAGCGAGGTGAGCATGGCGACGGA
+>NODE_33_length_106_cov_94.1379':NODE_4_length_123_cov_119.957';
+TCCGTCGCCATGCTCACCTCGCTTTGGTGCACACGAGTATTGAGCATAGTCGAGATTGGT
+GCAGATCACTTCTGATATTGAACTGTCAGGAGCTGGCTGCACAACA
+>NODE_34_length_1034_cov_43.0564:NODE_33_length_106_cov_94.1379';
+TGTTGTGCAGCCAGCTCCTGACAGTTCAATATCAGAAGTGATCTGCACCAATCTCGACTA
+TGCTCAATACTCGTGTGGGCTCTGTTGCAAAAATCGTGAAGCTTGAGCATGCTTGGCGGA
+GATTGGACGGACGGAACGATGACGGATTTCAAGTGGCGCCATTTCCAGGGTGATGTGATC
+CTGTGGGCGGTGCGCTGGTATTGTCGCTATCCGATCAGCTATCGCGACCTTGAGGAAATG
+CTGGCGGAACGCGGCATTTCGGTCGACCATACGACGATCTATCGCTGGGTCCAGTGCTAC
+GCCCCGGAGATGGAGAAGCGGCTGCGCTGGTTCTGGCGGCGTGGCTTTGATCCGAGCTGG
+CGCCTGGATGAAACCTACGTCAAGGTGCGGGGCAAGTGGACCTACCTGTACCGGGCAGTC
+GACAAGCGGGGCGACACGATCGATTTCTACCTGTCGCCGACCCGCAGCGCCAAGGCAGCG
+AAGCGGTTCCTGGGCAAGGCCCTGCGAGGCCTGAAGCACTGGGAAAAGCCTGCCACGCTC
+AATACCGACAAAGCGCCGAGCTATGGTGCAGCGATCACCGAATTGAAGCGCGAAGGAAAG
+CTGGACCGGGAGACGGCCCACCGGCAGGTGAAGTATCTCAATAACGTGATCGAGGCCGAT
+CACGGAAAGCTCAAGATACTGATCAAGCCGGTGCGCGGTTTCAAATCGATCCCCACGGCC
+TATGCCACGATCAAGGGATTCGAAGTCATGCGAGCCCTGCGCAAAGGACAGGCTCGCCCC
+TGGTGCCTGCAGCCCGGCATCAGGGGCGAGGTGCGCCTTGTGGAGAGAGCTTTTGGCATT
+GGGCCCTCGGCGCTGACGGAGGCCATGGGCATGCTCAACCACCATTTCGCAGCAGCCGCC
+TGATCGGCGCAGAGCGACAGCCTACCTCTGACTGCCGCCAATCTTTGCAACAGAGCCTCC
+GTCGCCATGCTCACCTCGCTTTGGTGCACACGAGTATTGAGCATAGTCGAGATTGGTGCA
+GATCACTTCTGATA
+>NODE_34_length_1034_cov_43.0564':NODE_4_length_123_cov_119.957';
+TATCAGAAGTGATCTGCACCAATCTCGACTATGCTCAATACTCGTGTGCACCAAAGCGAG
+GTGAGCATGGCGACGGAGGCTCTGTTGCAAAGATTGGCGGCAGTCAGAGGTAGGCTGTCG
+CTCTGCGCCGATCAGGCGGCTGCTGCGAAATGGTGGTTGAGCATGCCCATGGCCTCCGTC
+AGCGCCGAGGGCCCAATGCCAAAAGCTCTCTCCACAAGGCGCACCTCGCCCCTGATGCCG
+GGCTGCAGGCACCAGGGGCGAGCCTGTCCTTTGCGCAGGGCTCGCATGACTTCGAATCCC
+TTGATCGTGGCATAGGCCGTGGGGATCGATTTGAAACCGCGCACCGGCTTGATCAGTATC
+TTGAGCTTTCCGTGATCGGCCTCGATCACGTTATTGAGATACTTCACCTGCCGGTGGGCC
+GTCTCCCGGTCCAGCTTTCCTTCGCGCTTCAATTCGGTGATCGCTGCACCATAGCTCGGC
+GCTTTGTCGGTATTGAGCGTGGCAGGCTTTTCCCAGTGCTTCAGGCCTCGCAGGGCCTTG
+CCCAGGAACCGCTTCGCTGCCTTGGCGCTGCGGGTCGGCGACAGGTAGAAATCGATCGTG
+TCGCCCCGCTTGTCGACTGCCCGGTACAGGTAGGTCCACTTGCCCCGCACCTTGACGTAG
+GTTTCATCCAGGCGCCAGCTCGGATCAAAGCCACGCCGCCAGAACCAGCGCAGCCGCTTC
+TCCATCTCCGGGGCGTAGCACTGGACCCAGCGATAGATCGTCGTATGGTCGACCGAAATG
+CCGCGTTCCGCCAGCATTTCCTCAAGGTCGCGATAGCTGATCGGATAGCGACAATACCAG
+CGCACCGCCCACAGGATCACATCACCCTGGAAATGGCGCCACTTGAAATCCGTCATCGTT
+CCGTCCGTCCAATCTCCGCCAAGCATGCTCAAGCTTCACGATTTTTGCAACAGAGCCCAC
+ACGAGTATTGAGCATAGTCGAGATTGGTGCAGATCACTTCTGATATTGAACTGTCAGGAG
+CTGGCTGCACAACA
+>NODE_35_length_1394_cov_42.7001:NODE_33_length_106_cov_94.1379';
+TGAATGGGTTCATGTGCAGCTCCATCAGCAAAAGGGGATGATAAGTTTATCACCACCGAC
+TATTTGCAACAGTGCCCATCGGCGTAGTAGTGGATGTGGTCGATGACAAAGCCGGTGCGG
+GTCAGCGTGCGCCGGAGGATCGGCAGAAAATCGACCAGGAACGAAGTAGCGCGTGTGACG
+ACGGCCGGTACGCCGACACGCGCCACGGCCTCGGCCCAGCGCGCGGCCGGCGGTTGGAGC
+AGGCCGTTGTGCACCGAACCGTGGTAGGTGCCGACCGCCAATGTGAGCCAGCGCTCTAGC
+TCGCGCAGCGTCAGGGCGGCCTTGTTTTCGGAATCGTAGTCGCCGCGCTGGTCAGGGTTG
+GAGAAGGTCGTTCCCGGCAGTTCGTCGTGAATCATCTGCATCGCCGTGCCGATGATCCGT
+TCCACGATGCCGCCATAGTGCGGCTGTCCCAGCGGGCGATAGTCCAGCCGGATGCCATGC
+TGCTCGCAACCCCGGCGCAGGGCCTCGCTCTTGAACTCGGCCGCGTTGTCTAGGTAGAGC
+AGCAAGGGCTTGCCGCTCATCTGCCAATCCATTTCCACGTTCAGTCCTTCCAGCCAAGGG
+CGCTTGTCGCAGGCGACATGCACGAGGCACAGGCCAACCGAAACGGCAGACGGCGCTTCC
+AGCGTGACGACCATGCCGAGCACGCAGCGGGTGAACACGTCGATGGCGAGGGTCAGGTAC
+GGGCGGCCAATAGGTTGCCGGTCGCGGTCATCGACCACGATCAGGTCGATGACCGTATGG
+TCTATCTGCACCTGCTCCAGCGGCGCGGTCACGGCAGGAGGCTCGCCGCCCACACCTTGT
+AGGTCACGAGCGGCATCCTGGCCTTCCCGCCGGCGGATGACCTTGCGCGGGTCAAGGCTA
+GCGATCCGTAAGGCCACGGTATTGCGCGCCGGCACTCGCAGTTTTTGAGCCTTGCACACC
+TGAGTGACTTCGCGGTGAAAGGCCGCTAGGCTGCGCTTCTGCTTGGTCAGGAACCGCTTT
+TGCAGTAGCTCGTGGATGACGCGCTCGACCGGTTCCGGCAAGCGCCCCTTACCTTTACCT
+CCACCGGACTGGCCGGGCACCAGATCCGTCACGAGGCCGCTGCCTTGCCGGGCACGCCGG
+ATCAGAACGTATACCTGGCGCCGAGACAAGCCCAGCGCCTGAGCCGCCATATCGGCCGCT
+TCGTGCCCGACCGTCTCCGACTGCGCCAACGGACTGATGATCTCCGCACGACGGCGCGCA
+CGCTCCCAAGCCTCATCAGGCAGAGTGGCCACGCCTTGTTCTGGAATCCGTGGGGTGTCC
+GTCGCCATGCTCACCTCGCTTTGGTGCACACGAGTATTGAGCATAGTCGAGATTGGTGCA
+GATCACTTCTGATA
+>NODE_35_length_1394_cov_42.7001':NODE_31_length_78_cov_87';
+TATCAGAAGTGATCTGCACCAATCTCGACTATGCTCAATACTCGTGTGCACCAAAGCGAG
+GTGAGCATGGCGACGGACACCCCACGGATTCCAGAACAAGGCGTGGCCACTCTGCCTGAT
+GAGGCTTGGGAGCGTGCGCGCCGTCGTGCGGAGATCATCAGTCCGTTGGCGCAGTCGGAG
+ACGGTCGGGCACGAAGCGGCCGATATGGCGGCTCAGGCGCTGGGCTTGTCTCGGCGCCAG
+GTATACGTTCTGATCCGGCGTGCCCGGCAAGGCAGCGGCCTCGTGACGGATCTGGTGCCC
+GGCCAGTCCGGTGGAGGTAAAGGTAAGGGGCGCTTGCCGGAACCGGTCGAGCGCGTCATC
+CACGAGCTACTGCAAAAGCGGTTCCTGACCAAGCAGAAGCGCAGCCTAGCGGCCTTTCAC
+CGCGAAGTCACTCAGGTGTGCAAGGCTCAAAAACTGCGAGTGCCGGCGCGCAATACCGTG
+GCCTTACGGATCGCTAGCCTTGACCCGCGCAAGGTCATCCGCCGGCGGGAAGGCCAGGAT
+GCCGCTCGTGACCTACAAGGTGTGGGCGGCGAGCCTCCTGCCGTGACCGCGCCGCTGGAG
+CAGGTGCAGATAGACCATACGGTCATCGACCTGATCGTGGTCGATGACCGCGACCGGCAA
+CCTATTGGCCGCCCGTACCTGACCCTCGCCATCGACGTGTTCACCCGCTGCGTGCTCGGC
+ATGGTCGTCACGCTGGAAGCGCCGTCTGCCGTTTCGGTTGGCCTGTGCCTCGTGCATGTC
+GCCTGCGACAAGCGCCCTTGGCTGGAAGGACTGAACGTGGAAATGGATTGGCAGATGAGC
+GGCAAGCCCTTGCTGCTCTACCTAGACAACGCGGCCGAGTTCAAGAGCGAGGCCCTGCGC
+CGGGGTTGCGAGCAGCATGGCATCCGGCTGGACTATCGCCCGCTGGGACAGCCGCACTAT
+GGCGGCATCGTGGAACGGATCATCGGCACGGCGATGCAGATGATTCACGACGAACTGCCG
+GGAACGACCTTCTCCAACCCTGACCAGCGCGGCGACTACGATTCCGAAAACAAGGCCGCC
+CTGACGCTGCGCGAGCTAGAGCGCTGGCTCACATTGGCGGTCGGCACCTACCACGGTTCG
+GTGCACAACGGCCTGCTCCAACCGCCGGCCGCGCGCTGGGCCGAGGCCGTGGCGCGTGTC
+GGCGTACCGGCCGTCGTCACACGCGCTACTTCGTTCCTGGTCGATTTTCTGCCGATCCTC
+CGGCGCACGCTGACCCGCACCGGCTTTGTCATCGACCACATCCACTACTACGCCGATGGG
+CACTGTTGCAAATAGTCGGTGGTGATAAACTTATCATCCCCTTTTGCTGATGGAGCTGCA
+CATGAACCCATTCA
+>NODE_36_length_2625_cov_42.3034:NODE_12_length_394_cov_88.6719';
+TGAATGGGTTCATGTGCAGCTCCATCAGCAAAAGGGGATGATAAGTTTATCACCACCGAC
+TATTTGCAACAGTGCCCGAGCGGGCGAGTGCCGAGGCGATCACCCGTGCTAACCGGCGCA
+TCTACGACGCCTTGGCCGAACCACTGGCGGACGCGCATCGCCGCCGCCTCGACGATCTGC
+TCAAGCGCCGGGACAACGGCAAGACGACCTGGTTGGCTTGGTTGCGCCAGTCTCCGGCCA
+AGCCAAATTCGCGGCATATGCTGGAACACATCGAACGCCTCAAGGCATGGCAGGCACTCG
+ATCTGCCTACCGGCATCGAGCGGCTGGTTCACCAGAACCGCCTGCTCAAGATTGCCCGCG
+AGGGCGGCCAGATGACACCCGCCGACCTGGCCAAATTCGAGCCGCAACGGCGCTACGCCA
+CTCTCGTGGCGCTGGCCACCGAGGGCATGGCCACCGTCACCGACGAAATCATCGACCTGC
+ACGACCGCATCCTGGGTAAGCTGTTTAACGCTGCCAAGAATAAGCATCAGCAGCAGTTCC
+AGGCGTCAGGCAAGGCCATCAACGCCAAGGTACGTCTGTACGGGCGCATCGGTCAGGCGC
+TGATCGACGCCAAGCAATCAGGCCGCGATGCGTTTGCCGCCATCGAGGCCGTCATGTCCT
+GGGATTCCTTTGCCGAGAGCGTCACCGAGGCGCAGAAGCTCGCGCAACCCGATGACTTCG
+ATTTCCTGCATCGCATCGGCGAGAGCTACGCCACCCTGCGCCGCTATGCACCGGAATTCC
+TTGCCGTGCTCAAGCTGCGGGCCGCGCCCGCCGCCAAAAACGTGCTTGATGCCATTGAGG
+TGCTGCGCGGCATGAACACCGACAACGCCCGCAAGCTGCCAGCCGATGCACCGACCGGCT
+TCATCAAGCCGCGCTGGCAGAAACTGGTGATGACCGACGCCGGCATCGACCGGCGCTACT
+ACGAACTGTGCGCGCTGTCCGAGTTGAAGAACTCCCTGCGCTCGGGCGACATCTGGGTGC
+AGGGTTCACGCCAGTTCAAGGACTTCGAGGACTACCTGGTACCGCCCGAGAAGTTCACCA
+GCCTCAAGCAGTCCAGCGAATTGCCGCTGGCCGTGGCCACCGACTGCGAACAATATCTGC
+ATGAGCGGCTGACGCTGCTGGAAGCACAACTTGCCACCGTCAACCGCATGGCGGCAGCCA
+ACGACCTGCCGGATGCCATCATCACCGAGTCGGGCTTGAAGATCACGCCGCTGGATGCGG
+CGGTGCCCGACACCGCGCAGGCGCTGATAGACCAGACAGCCATGGTCCTGCCGCACGTCA
+AGATCACCGAACTGCTGCTCGAAGTCGATGAGTGGACGGGCTTCACCCGGCACTTCACGC
+ACTTGAAATCGGGCGATCTGGCCAAGGACAAGAACCTGTTGTTGACCACGATCCTGGCCG
+ACGCGATCAACCTGGGCCTGACCAAGATGGCCGAGTCCTGCCCCGGCACGACCTACGCGA
+AGCTCGCTTGGCTGCAAGCCTGGCATACCCGCGACGAAACGTACTCGACAGCGTTGGCTG
+AACTGGTCAACGCTCAGTTTCGGCATCCCTTTGCCGGGCACTGGGGCGATGGCACCACAT
+CATCATCGGACGGACAGAATTTCCGAACCGCTAGCAAGGCAAAGAGCACGGGGCACATCA
+ACCCAAAATATGGCAGCAGCCCAGGACGGACTTTCTACACCCACATCTCCGACCAATACG
+CGCCATTCCACACCAAGGTGGTCAATGTCGGCCTGCGCGACTCAACCTACGTGCTCGACG
+GCCTGCTGTACCACGAATCCGACCTGCGGATCGAGGAGCACTACACCGACACGGCGGGCT
+TCACCGATCACGTCTTCGCCCTGATGCACCTCTTGGGCTTCCGCTTCGCGCCGCGCATCC
+GCGACCTGGGCGACACCAAGCTCTACATCCCGAAGGGCGATGCCGCCTATGACGCGCTCA
+AGCCGATGATCGGCGGCACGCTCAACATCAAGCACGTCCGCGCCCATTGGGACGAAATCC
+TGCGGCTGGCCACCTCGATCAAGCAGGGCACGGTGACGGCCTCGCTGATGCTCAGGAAAC
+TCGGCAGCTACCCGCGCCAGAACGGCTTGGCCGTCGCGCTGCGCGAGTTGGGCCGCATCG
+AGCGCACGCTGTTCATCCTCGACTGGCTGCAAAGCGTCGAGCTACGCCGCCGCGTGCATG
+CCGGGCTGAACAAGGGCGAGGCGCGCAATGCGCTGGCCCGTGCCGTGTTCTTCAACCGCC
+TTGGTGAAATCCGTGACCGCAGTTTCGAGCAGCAGCGCTACCGGGCCAGCGGCCTCAACC
+TGGTGACGGCGGCCATCGTGCTGTGGAACACGGTCTACCTGGAGCGTGCGGCGCATGCGT
+TGCGCGGCAATGGTCATGCCGTCGATGACTCGCTATTGCAGTACCTGTCGCCACTCGGCT
+GGGAGCACATCAACCTGACCGGTGATTACCTATGGCGCAGCAGCGCCAAGATCGGCGCGG
+GGAAGTTCAGGCCGCTACGGCCTCTGCAACCGGCTTAGCGTGCTTTATTTAATGAGATGG
+TCACTCCCTCCTTCCCGGTACTATGCTGAGGACAGGCTTTCATTC
+>NODE_36_length_2625_cov_42.3034':NODE_31_length_78_cov_87';
+GAATGAAAGCCTGTCCTCAGCATAGTACCGGGAAGGAGGGAGTGACCATCTCATTAAATA
+AAGCACGCTAAGCCGGTTGCAGAGGCCGTAGCGGCCTGAACTTCCCCGCGCCGATCTTGG
+CGCTGCTGCGCCATAGGTAATCACCGGTCAGGTTGATGTGCTCCCAGCCGAGTGGCGACA
+GGTACTGCAATAGCGAGTCATCGACGGCATGACCATTGCCGCGCAACGCATGCGCCGCAC
+GCTCCAGGTAGACCGTGTTCCACAGCACGATGGCCGCCGTCACCAGGTTGAGGCCGCTGG
+CCCGGTAGCGCTGCTGCTCGAAACTGCGGTCACGGATTTCACCAAGGCGGTTGAAGAACA
+CGGCACGGGCCAGCGCATTGCGCGCCTCGCCCTTGTTCAGCCCGGCATGCACGCGGCGGC
+GTAGCTCGACGCTTTGCAGCCAGTCGAGGATGAACAGCGTGCGCTCGATGCGGCCCAACT
+CGCGCAGCGCGACGGCCAAGCCGTTCTGGCGCGGGTAGCTGCCGAGTTTCCTGAGCATCA
+GCGAGGCCGTCACCGTGCCCTGCTTGATCGAGGTGGCCAGCCGCAGGATTTCGTCCCAAT
+GGGCGCGGACGTGCTTGATGTTGAGCGTGCCGCCGATCATCGGCTTGAGCGCGTCATAGG
+CGGCATCGCCCTTCGGGATGTAGAGCTTGGTGTCGCCCAGGTCGCGGATGCGCGGCGCGA
+AGCGGAAGCCCAAGAGGTGCATCAGGGCGAAGACGTGATCGGTGAAGCCCGCCGTGTCGG
+TGTAGTGCTCCTCGATCCGCAGGTCGGATTCGTGGTACAGCAGGCCGTCGAGCACGTAGG
+TTGAGTCGCGCAGGCCGACATTGACCACCTTGGTGTGGAATGGCGCGTATTGGTCGGAGA
+TGTGGGTGTAGAAAGTCCGTCCTGGGCTGCTGCCATATTTTGGGTTGATGTGCCCCGTGC
+TCTTTGCCTTGCTAGCGGTTCGGAAATTCTGTCCGTCCGATGATGATGTGGTGCCATCGC
+CCCAGTGCCCGGCAAAGGGATGCCGAAACTGAGCGTTGACCAGTTCAGCCAACGCTGTCG
+AGTACGTTTCGTCGCGGGTATGCCAGGCTTGCAGCCAAGCGAGCTTCGCGTAGGTCGTGC
+CGGGGCAGGACTCGGCCATCTTGGTCAGGCCCAGGTTGATCGCGTCGGCCAGGATCGTGG
+TCAACAACAGGTTCTTGTCCTTGGCCAGATCGCCCGATTTCAAGTGCGTGAAGTGCCGGG
+TGAAGCCCGTCCACTCATCGACTTCGAGCAGCAGTTCGGTGATCTTGACGTGCGGCAGGA
+CCATGGCTGTCTGGTCTATCAGCGCCTGCGCGGTGTCGGGCACCGCCGCATCCAGCGGCG
+TGATCTTCAAGCCCGACTCGGTGATGATGGCATCCGGCAGGTCGTTGGCTGCCGCCATGC
+GGTTGACGGTGGCAAGTTGTGCTTCCAGCAGCGTCAGCCGCTCATGCAGATATTGTTCGC
+AGTCGGTGGCCACGGCCAGCGGCAATTCGCTGGACTGCTTGAGGCTGGTGAACTTCTCGG
+GCGGTACCAGGTAGTCCTCGAAGTCCTTGAACTGGCGTGAACCCTGCACCCAGATGTCGC
+CCGAGCGCAGGGAGTTCTTCAACTCGGACAGCGCGCACAGTTCGTAGTAGCGCCGGTCGA
+TGCCGGCGTCGGTCATCACCAGTTTCTGCCAGCGCGGCTTGATGAAGCCGGTCGGTGCAT
+CGGCTGGCAGCTTGCGGGCGTTGTCGGTGTTCATGCCGCGCAGCACCTCAATGGCATCAA
+GCACGTTTTTGGCGGCGGGCGCGGCCCGCAGCTTGAGCACGGCAAGGAATTCCGGTGCAT
+AGCGGCGCAGGGTGGCGTAGCTCTCGCCGATGCGATGCAGGAAATCGAAGTCATCGGGTT
+GCGCGAGCTTCTGCGCCTCGGTGACGCTCTCGGCAAAGGAATCCCAGGACATGACGGCCT
+CGATGGCGGCAAACGCATCGCGGCCTGATTGCTTGGCGTCGATCAGCGCCTGACCGATGC
+GCCCGTACAGACGTACCTTGGCGTTGATGGCCTTGCCTGACGCCTGGAACTGCTGCTGAT
+GCTTATTCTTGGCAGCGTTAAACAGCTTACCCAGGATGCGGTCGTGCAGGTCGATGATTT
+CGTCGGTGACGGTGGCCATGCCCTCGGTGGCCAGCGCCACGAGAGTGGCGTAGCGCCGTT
+GCGGCTCGAATTTGGCCAGGTCGGCGGGTGTCATCTGGCCGCCCTCGCGGGCAATCTTGA
+GCAGGCGGTTCTGGTGAACCAGCCGCTCGATGCCGGTAGGCAGATCGAGTGCCTGCCATG
+CCTTGAGGCGTTCGATGTGTTCCAGCATATGCCGCGAATTTGGCTTGGCCGGAGACTGGC
+GCAACCAAGCCAACCAGGTCGTCTTGCCGTTGTCCCGGCGCTTGAGCAGATCGTCGAGGC
+GGCGGCGATGCGCGTCCGCCAGTGGTTCGGCCAAGGCGTCGTAGATGCGCCGGTTAGCAC
+GGGTGATCGCCTCGGCACTCGCCCGCTCGGGCACTGTTGCAAATAGTCGGTGGTGATAAA
+CTTATCATCCCCTTTTGCTGATGGAGCTGCACATGAACCCATTCA
+>NODE_37_length_78_cov_92:NODE_41_length_366_cov_169.284';
+AGGTAATGACTCCAACTTATTGATAGTGTTTTATGTTCAGATAATGCCCGATGACTTTGT
+CATGCAGCTCCACCGATT
+>NODE_37_length_78_cov_92':NODE_13_length_9382_cov_42.6014',NODE_19_length_1805_cov_40.386';
+AATCGGTGGAGCTGCATGACAAAGTCATCGGGCATTATCTGAACATAAAACACTATCAAT
+AAGTTGGAGTCATTACCT
+>NODE_38_length_237_cov_132.244:NODE_29_length_751_cov_85.3516,NODE_3_length_5869_cov_43.038';
+CTCAGAAAACGGAATCTATGGTCACTCCCGTTTTTGCAACACCGATTTTGACGACAAGTT
+GGCTTGCTTGAATCTATCCGGCGTCTGAATGGGATTTTATTCCCGCGCCTTGATGAGTTC
+CGCGCCTGATGAACCTCCAGAAAATATACGGCTTCAATGAGCCTTTCCGTTTTACAGGTT
+CCTCAACAGGCCGGTGGGCCGTTAGTATCATCAATATCAGTATTCGCAAAACCAGAT
+>NODE_38_length_237_cov_132.244':NODE_17_length_219_cov_42.2394',NODE_32_length_86_cov_81.3333;
+ATCTGGTTTTGCGAATACTGATATTGATGATACTAACGGCCCACCGGCCTGTTGAGGAAC
+CTGTAAAACGGAAAGGCTCATTGAAGCCGTATATTTTCTGGAGGTTCATCAGGCGCGGAA
+CTCATCAAGGCGCGGGAATAAAATCCCATTCAGACGCCGGATAGATTCAAGCAAGCCAAC
+TTGTCGTCAAAATCGGTGTTGCAAAAACGGGAGTGACCATAGATTCCGTTTTCTGAG
+>NODE_39_length_146_cov_169.507:NODE_14_length_85_cov_140.75',NODE_19_length_1805_cov_40.386;
+AGAGCAGAGATAGCGCTGATGTCCGGCGGTGCTTTTGCCGTTACGCACCACCCCGTCAGT
+AGCTGAACAGGAGGGACAGCTGATAGAAACAGAAGCCACTGGAGCACCTCAAAAACACCA
+TCATACACTAAATCAGTAAGTTGGCA
+>NODE_39_length_146_cov_169.507':NODE_43_length_220_cov_211.224';
+TGCCAACTTACTGATTTAGTGTATGATGGTGTTTTTGAGGTGCTCCAGTGGCTTCTGTTT
+CTATCAGCTGTCCCTCCTGTTCAGCTACTGACGGGGTGGTGCGTAACGGCAAAAGCACCG
+CCGGACATCAGCGCTATCTCTGCTCT
+>NODE_40_length_164_cov_128.862:NODE_41_length_366_cov_169.284;
+AGGCCGCAGTCGGTAACCTCGCGCATACAGCCGGGCAGTGACGTCATCGTCTGCGCGGAA
+ATGGACGAACAGTGGGGATACGTCGGGGCTAAATCGCGCCAGCGCTGGCTGTTTTACGCG
+TATGACAGGCTCCGGAAGACGGTTGTTGCGCACGTATTCGGTGA
+>NODE_40_length_164_cov_128.862':NODE_42_length_172_cov_160.495;
+TCACCGAATACGTGCGCAACAACCGTCTTCCGGAGCCTGTCATACGCGTAAAACAGCCAG
+CGCTGGCGCGATTTAGCCCCGACGTATCCCCACTGTTCGTCCATTTCCGCGCAGACGATG
+ACGTCACTGCCCGGCTGTATGCGCGAGGTTACCGACTGCGGCCT
+>NODE_41_length_366_cov_169.284:NODE_18_length_78_cov_102',NODE_37_length_78_cov_92';
+GCTAAATCGCGCCAGCGCTGGCTGTTTTACGCGTATGACAGGCTCCGGAAGACGGTTGTT
+GCGCACGTATTCGGTGAACGCACTATGGCGACGCTGGGGCGTCTTATGAGCCTGCTGTCA
+CCCTTTGACGTGGTGATATGGATGACGGATGGCTGGCCGCTGTATGAATCCCGCCTGAAG
+GGAAAGCTGCACGTAATCAGCAAGCGATATACGCAGCGAATTGAGCGGCATAACCTGAAT
+CTGAGGCAGCACCTGGCACGGCTGGGACGGAAGTCGCTGTCGTTCTCAAAATCGGTGGAG
+CTGCATGACAAAGTCATCGGGCATTATCTGAACATAAAACACTATCAATAAGTTGGAGTC
+ATTACC
+>NODE_41_length_366_cov_169.284':NODE_40_length_164_cov_128.862',NODE_5_length_226_cov_46.5369;
+GGTAATGACTCCAACTTATTGATAGTGTTTTATGTTCAGATAATGCCCGATGACTTTGTC
+ATGCAGCTCCACCGATTTTGAGAACGACAGCGACTTCCGTCCCAGCCGTGCCAGGTGCTG
+CCTCAGATTCAGGTTATGCCGCTCAATTCGCTGCGTATATCGCTTGCTGATTACGTGCAG
+CTTTCCCTTCAGGCGGGATTCATACAGCGGCCAGCCATCCGTCATCCATATCACCACGTC
+AAAGGGTGACAGCAGGCTCATAAGACGCCCCAGCGTCGCCATAGTGCGTTCACCGAATAC
+GTGCGCAACAACCGTCTTCCGGAGCCTGTCATACGCGTAAAACAGCCAGCGCTGGCGCGA
+TTTAGC
+>NODE_42_length_172_cov_160.495:NODE_43_length_220_cov_211.224;
+CCCCACTGTTCGTCCATTTCCGCGCAGACGATGACGTCACTGCCCGGCTGTATGCGCGAG
+GTTACCGACTGCGGCCTGAGTTTTTTAAATGGCGGAAAATCGTGTTGAGGCCAACGCCCA
+TAATGCGGGCGGTTGCCCGGCATCCAACGCCATTCATGGCCATATCAATGAT
+>NODE_42_length_172_cov_160.495':NODE_2_length_9792_cov_41.771',NODE_40_length_164_cov_128.862;
+ATCATTGATATGGCCATGAATGGCGTTGGATGCCGGGCAACCGCCCGCATTATGGGCGTT
+GGCCTCAACACGATTTTCCGCCATTTAAAAAACTCAGGCCGCAGTCGGTAACCTCGCGCA
+TACAGCCGGGCAGTGACGTCATCGTCTGCGCGGAAATGGACGAACAGTGGGG
+>NODE_43_length_220_cov_211.224:NODE_39_length_146_cov_169.507,NODE_6_length_50434_cov_42.3615;
+AAAATCGTGTTGAGGCCAACGCCCATAATGCGGGCGGTTGCCCGGCATCCAACGCCATTC
+ATGGCCATATCAATGATTTTCTGGTGCGTACCGGGTTGAGAAGCGGTGTAAGTGAACTGC
+AGTTGCCATGTTTTACGGCAGTGAGAGCAGAGATAGCGCTGATGTCCGGCGGTGCTTTTG
+CCGTTACGCACCACCCCGTCAGTAGCTGAACAGGAGGGAC
+>NODE_43_length_220_cov_211.224':NODE_42_length_172_cov_160.495',NODE_5_length_226_cov_46.5369';
+GTCCCTCCTGTTCAGCTACTGACGGGGTGGTGCGTAACGGCAAAAGCACCGCCGGACATC
+AGCGCTATCTCTGCTCTCACTGCCGTAAAACATGGCAACTGCAGTTCACTTACACCGCTT
+CTCAACCCGGTACGCACCAGAAAATCATTGATATGGCCATGAATGGCGTTGGATGCCGGG
+CAACCGCCCGCATTATGGGCGTTGGCCTCAACACGATTTT
+>NODE_44_length_820_cov_167.058:NODE_30_length_81_cov_86,NODE_31_length_78_cov_87;
+GGCACTGTTGCAAAGTTAGCGATGAGGCAGCCTTTTGTCTTATTCAAAGGCCTTACATTT
+CAAAAACTCTGCTTACCAGGCGCATTTCGCCCAGGGGATCACCATAATAAAATGCTGAGG
+CCTGGCCTTTGCGTAGTGCACGCATCACCTCAATACCTTTGATGGTGGCGTAAGCCGTCT
+TCATGGATTTAAATCCCAGCGTGGCGCCGATTATCCGTTTCAGTTTGCCATGATCGCATT
+CAATCACGTTGTTCCGGTACTTAATCTGTCGGTGTTCAACGTCAGACGGGCACCGGCCTT
+CGCGTTTGAGCAGAGCAAGCGCGCGACCATAGGCGGGCGCTTTATCCGTGTTGATGAATC
+GCGGGATCTGCCACTTCTTCACGTTGTTGAGGATTTTACCCAGAAACCGGTATGCAGCTT
+TGCTGTTACGACGGGAGGAGAGATAAAAATCGACAGTGCGGCCCCGGCTGTCAACGGCCC
+GGTACAGATACGCCCAGCGGCCATTGACCTTCACGTAGGTTTCATCCATGTGCCACGGGC
+AAAGATCGGAAGGGTTACGCCAGTACCAGCGCAGCCGTTTTTCCATTTCAGGCGCATAAC
+GCTGAACCCAGCGGTAAATCGTGGAGTGATCGACATTCACTCCGCGTTCAGCCAGCATCT
+CCTGCAGCTCACGGTAACTGATGCCGTATTTGCAGTACCAGCGTACGGCCCACAGAATGA
+TGTCACGCTGAAAATGCCGGCCTTTGAATGGGTTCATGTGCAGCTCCATCAGCAAAAGGG
+GATGATAAGTTTATCACCACCGACTATTTGCAACAGTGCC
+>NODE_44_length_820_cov_167.058':NODE_27_length_78_cov_99,NODE_28_length_79_cov_78;
+GGCACTGTTGCAAATAGTCGGTGGTGATAAACTTATCATCCCCTTTTGCTGATGGAGCTG
+CACATGAACCCATTCAAAGGCCGGCATTTTCAGCGTGACATCATTCTGTGGGCCGTACGC
+TGGTACTGCAAATACGGCATCAGTTACCGTGAGCTGCAGGAGATGCTGGCTGAACGCGGA
+GTGAATGTCGATCACTCCACGATTTACCGCTGGGTTCAGCGTTATGCGCCTGAAATGGAA
+AAACGGCTGCGCTGGTACTGGCGTAACCCTTCCGATCTTTGCCCGTGGCACATGGATGAA
+ACCTACGTGAAGGTCAATGGCCGCTGGGCGTATCTGTACCGGGCCGTTGACAGCCGGGGC
+CGCACTGTCGATTTTTATCTCTCCTCCCGTCGTAACAGCAAAGCTGCATACCGGTTTCTG
+GGTAAAATCCTCAACAACGTGAAGAAGTGGCAGATCCCGCGATTCATCAACACGGATAAA
+GCGCCCGCCTATGGTCGCGCGCTTGCTCTGCTCAAACGCGAAGGCCGGTGCCCGTCTGAC
+GTTGAACACCGACAGATTAAGTACCGGAACAACGTGATTGAATGCGATCATGGCAAACTG
+AAACGGATAATCGGCGCCACGCTGGGATTTAAATCCATGAAGACGGCTTACGCCACCATC
+AAAGGTATTGAGGTGATGCGTGCACTACGCAAAGGCCAGGCCTCAGCATTTTATTATGGT
+GATCCCCTGGGCGAAATGCGCCTGGTAAGCAGAGTTTTTGAAATGTAAGGCCTTTGAATA
+AGACAAAAGGCTGCCTCATCGCTAACTTTGCAACAGTGCC
diff --git a/tests/test_plasmids.gfa b/tests/test_plasmids.gfa
new file mode 100644
index 0000000..ae42cfd
--- /dev/null
+++ b/tests/test_plasmids.gfa
@@ -0,0 +1,21 @@
+S 232 CCTTATACGAAGCCCAGGTTAATCCTGGGCTTTTTGTTGAATCTGATCATTGGTAGCAAACAGATCAGGATTGGTAATTTTGATGTTTTCCTGACAACTCCTGCAAAGCATCAGCCCAGCAAAAAGTTGTACATGTTCCGTTGATTCACAGAAGGCACATGGCTTAGGAAAAGAGATGATATTGGCTGAATTGACTAATTCTGTTGACATAAGAAGTAACCTTGGATTGTACATATTTATTTTTAATAAATTTCAATACTTTATACCTAATTTAGCCACTAAAATTTGTACATTATTGTATAATCCATGTGTACATATTATTTTTTATAATTTTCATTCACTTAGACCCAAAATAGTATTTATTTTTGTACAACACCATGTACAGAACAATAATCATATAAATCAAATTTTTAGCATAAAAAAGTCCATTAATTTTGTACACAATTCTGAAACTTAAAAATCTAAACTTTCATCAATTTTTTTCAT [...]
+S 277 TGAAACTTAAAAATCTAAACTTTCATCAATTTTTTTCATAATTTCAATAAATTAACCTTAATTTTAAGATATATTCTGAAATTTGGTTTGAAAGCTGTTTTTACATTATATTTCAATACTTTAAATCAAAAAATTGGATATTTTTTGAAAAACTCAATGAAAGTTTATTTTTTATTTAAAAACAACTAGTTATATTAGTTTTTATCCATTTTTTTGAAACAGTTTCTATATGATAAAAAAACCTATAAAAACCATATCTAGCAAAGGTTTGAGGGTTATCATCTTTAGATGCGTGGTGTGTGACAAAAAAATCCCGGCATGTGCCGGATTCTGGATTAGAAAATTGGCTAAAGTGACGTAGGACTGGTGCTTGGTTTTACATGGAAAAAAGTATTTATTTTCTGGTTTATAAAAACGTAAAAAGATCAGTTTTTGTTCATTCATCCAGGTTAAAAATTTCAACCTAAAACTTTAATTATGAAAAGC [...]
+S 280 GCCCTTGGTTTTCGCTTCGCTCAAACTCTATTGAACTTCGCTTTCGCTCAGTTCGTCGGGGCAATTTTTTGGTTAATACTTACGTGATTTTAAGAAAAAGCAAAAACAACTCGGAATTCGCTTCGCTCATAAAACTTTTTTACTCGCTACGCTCGGTCTAGGAACAAATTTCTGCATAAAACTTACGCTTTCTTAGGCTAAAAAGCCCCAAAAACTGTTTTTCAGAAAGGCTGAGAGGCAAATTTTATAAGTTCGCTCGTAGACACTCGCTCTATGAATCTATCTAGAATCAAAATCCCTCTTTATTTCGCGCTCATTTGCGTTTTTTGAGCTGTTTTCTGTTTTTCACTATAAGACCTATGTTTTTTACTTAAAGGCTCTTAAATCGCATTTGAATGCTTTCTGTGAAAATTTCCATAATTAAAATTTTAGTTTGAAATTTTTAATTTGGATGAACGGACAAAAAATGATTTTTTTACGTTTTTC [...]
+S 282 AGAAGCCACGCTTTTTAGGCTCTGGTTCAACATGCTCTGGAACAGGAATGCGCTTATTCTCTGGAGTAGTCAATCCGTCATGTTTAGGATCATCAATATTAGGTTCTGGCTGTACTTGAGCTACATTCGCTTGCGACTGTTCTTGATCGGTAAACGTAGTCATATTGGCTTTTGGTGCTTCTAGTAAGCGCTGCATGGCCTCGATCTGATCTTGATAAAACGATTCACGTTCTAGTGATTGATTTTCTCTAAACAGTGCTTGATTTAACTGTTTTTCCAGTATGTCAACTTGACGTTTTAATAGGTCAACTTCTGTCAAGTTTTGACTGTTAATTGATTGACTTTGATTGACATTAGTATCTTTCTTTTGTGGTTCCCCAAAAACTCTTATGGCTTCTGCGAAGTCAATTAATCCATCAGATCCTTTAGATAAATTTCCTTTGTTTATATGGGCATATATGGCTTGTCGTGAATATCCGTAAAGCT [...]
+S 283 AGAAGCCACGCTTTTTAGGCTCTGGTTCAACATGCTCTGGAACAGGAATGCGCTTATTCTCTGGAGTAGTCAATCCGTCATCTTTAGGTGGAACAACTATCACCTGCTCCTTCATTTCTACAATGGGAGCTGATTGAGGGAGTTCGGGTTCACTAGGCTCTTGGATCTCAGGTTTAGGTGCTTCCAGTAGACGTTGCATTGTCTCAATTTGATTTTGATAAAAGGATTCACGCTCTTTTGCATCATCAAGCTGATTTTGCAGCATGTTTATCTGTTGTCTAAGTAGTAAAACTTCTGTCGATATTGGACTGTCTATTTTTACAGATTCTTTTACATCCTGTTTTTTTGAAGGTTCACCAAAAACACGGATAGCCTCGGCTAGATCAATTTTATTATCAGAATTTTTACTTAAAATTCCTTTCTTTATGTTGTTGTAAATCGTTTGTCTATTGATATTGTAAAGCTTAGAAAGCTCAAGAACTGTAA [...]
+S 289 CACGTTCCACGCTTATTTATTGAGCAATGTTCCACGGTTTTATTTAGCCTAAGTTAACCATATGGAAGAAAAAAACGACTCCAGAAGCCACGCTTTTTAGGCTCTGGTTCAACATGCTCTGGAACAGGAATGCGCTTATTCTCTGGAGTAGTCAATCCGTCAT LN:i:163 RC:i:14624
+S 297 AAAATTACCAATCCTGATCTGTTTGCTACCAATGATCAGATTCAACAAAAAGCCCAGGATTAACCTGGGCTTCGTATAAGGTGTATTATGTTAATTTTAGAAATTATTAAATGATTCCAAGATTTTCTAGCGACTTATAAGTAATTTCATTACGAATAGAACCAGACATTCCTTCTTTCATTTCTAAGTTGAGCGAAAAGGGGATTTTTTTTCCATTAGCTTGCTCCACCCAACCAGTCAACCAACCTACCTGTGGAGTAACATCCATTCCCCATCCACTTTTTGCATAAATCTTACTACCATTTACTTCTTTAATTAGAAGCATTTTTTTAACTTCTTCTTGAGTTTCTAATTTAAAAGGTAATCGGTTATGTGCAAGGTCATCGGCAAAATTAACTTCTTGTACTGGTGTAATTTTAAGGGGGCCAACTAACCAAAAATTATCGACCTGTGTTCCAATATTTGTATTTCCAAAATTAACCCGCT [...]
+S 333 AAAATTACCAATCCTGATCTGTTTGCTACCAATGATCAGATTCAACAAAAAGCCCAGGATTAACCTGGGCTTCGTATAAGGCGTATTATGTTAATTTTAATGGAACTTTATAATTAGACGTTGTTGTTGATATATAGCGAATGCCATCATGGTGGGCACTATATTTTATGTAGATTGAATACCCACAATCTAAATTACACCATTTTTCAGAGTACAGACTTTCTCTTACATCATCTGGGCTTCCCAATAGATCATGAATTTCAACCTTAGACATGTCAAAATTAAGTCCTTTAGGTAGAAGCTCTCTATATTTATTAAATCCTTCAACATTTTGATTATAAAAAAATATTGTTTGAAAAAATAAGTTTTTACCTAACATTGCTGTATTACTAAGATGATCTAAGCAACTAGCTTCATCTCGAAAAAGTAAACAAATACCTTTTTCTTCATTAGCTATATATAAAGTATCTTCATCTAAAGGTTCAT [...]
+S 6 GAAAAATTGCCCTTGGTTTTCGCTTCGCTCAAACTCTATTGAACTTCGCTTTCGCTCAGTTCGTCGGGGCAATTTTTTGGTTAATACTT LN:i:89 RC:i:9779
+L 6 + 277 - 81M
+L 6 + 280 + 81M
+L 232 + 277 + 81M
+L 280 + 232 - 81M
+L 282 + 6 + 81M
+L 283 + 6 + 81M
+L 289 + 282 + 81M
+L 289 + 283 + 81M
+L 297 - 232 + 81M
+L 297 + 289 + 81M
+L 333 - 232 + 81M
+L 333 + 289 + 81M
diff --git a/tests/test_plasmids_separate_sequences.fasta b/tests/test_plasmids_separate_sequences.fasta
new file mode 100644
index 0000000..b9ca4d9
--- /dev/null
+++ b/tests/test_plasmids_separate_sequences.fasta
@@ -0,0 +1,18 @@
+>232
+CCTTATACGAAGCCCAGGTTAATCCTGGGCTTTTTGTTGAATCTGATCATTGGTAGCAAACAGATCAGGATTGGTAATTTTGATGTTTTCCTGACAACTCCTGCAAAGCATCAGCCCAGCAAAAAGTTGTACATGTTCCGTTGATTCACAGAAGGCACATGGCTTAGGAAAAGAGATGATATTGGCTGAATTGACTAATTCTGTTGACATAAGAAGTAACCTTGGATTGTACATATTTATTTTTAATAAATTTCAATACTTTATACCTAATTTAGCCACTAAAATTTGTACATTATTGTATAATCCATGTGTACATATTATTTTTTATAATTTTCATTCACTTAGACCCAAAATAGTATTTATTTTTGTACAACACCATGTACAGAACAATAATCATATAAATCAAATTTTTAGCATAAAAAAGTCCATTAATTTTGTACACAATTCTGAAACTTAAAAATCTAAACTTTCATCAATTTTTTTCATAATTTC [...]
+>277 extra text
+TGAAACTTAAAAATCTAAACTTTCATCAATTTTTTTCATAATTTCAATAAATTAACCTTAATTTTAAGATATATTCTGAAATTTGGTTTGAAAGCTGTTTTTACATTATATTTCAATACTTTAAATCAAAAAATTGGATATTTTTTGAAAAACTCAATGAAAGTTTATTTTTTATTTAAAAACAACTAGTTATATTAGTTTTTATCCATTTTTTTGAAACAGTTTCTATATGATAAAAAAACCTATAAAAACCATATCTAGCAAAGGTTTGAGGGTTATCATCTTTAGATGCGTGGTGTGTGACAAAAAAATCCCGGCATGTGCCGGATTCTGGATTAGAAAATTGGCTAAAGTGACGTAGGACTGGTGCTTGGTTTTACATGGAAAAAAGTATTTATTTTCTGGTTTATAAAAACGTAAAAAGATCAGTTTTTGTTCATTCATCCAGGTTAAAAATTTCAACCTAAAACTTTAATTATGAAAAGCTTCACA [...]
+>280 lots and lots of extra text
+GCCCTTGGTTTTCGCTTCGCTCAAACTCTATTGAACTTCGCTTTCGCTCAGTTCGTCGGGGCAATTTTTTGGTTAATACTTACGTGATTTTAAGAAAAAGCAAAAACAACTCGGAATTCGCTTCGCTCATAAAACTTTTTTACTCGCTACGCTCGGTCTAGGAACAAATTTCTGCATAAAACTTACGCTTTCTTAGGCTAAAAAGCCCCAAAAACTGTTTTTCAGAAAGGCTGAGAGGCAAATTTTATAAGTTCGCTCGTAGACACTCGCTCTATGAATCTATCTAGAATCAAAATCCCTCTTTATTTCGCGCTCATTTGCGTTTTTTGAGCTGTTTTCTGTTTTTCACTATAAGACCTATGTTTTTTACTTAAAGGCTCTTAAATCGCATTTGAATGCTTTCTGTGAAAATTTCCATAATTAAAATTTTAGTTTGAAATTTTTAATTTGGATGAACGGACAAAAAATGATTTTTTTACGTTTTTCTAAACC [...]
+>282
+AGAAGCCACGCTTTTTAGGCTCTGGTTCAACATGCTCTGGAACAGGAATGCGCTTATTCTCTGGAGTAGTCAATCCGTCATGTTTAGGATCATCAATATTAGGTTCTGGCTGTACTTGAGCTACATTCGCTTGCGACTGTTCTTGATCGGTAAACGTAGTCATATTGGCTTTTGGTGCTTCTAGTAAGCGCTGCATGGCCTCGATCTGATCTTGATAAAACGATTCACGTTCTAGTGATTGATTTTCTCTAAACAGTGCTTGATTTAACTGTTTTTCCAGTATGTCAACTTGACGTTTTAATAGGTCAACTTCTGTCAAGTTTTGACTGTTAATTGATTGACTTTGATTGACATTAGTATCTTTCTTTTGTGGTTCCCCAAAAACTCTTATGGCTTCTGCGAAGTCAATTAATCCATCAGATCCTTTAGATAAATTTCCTTTGTTTATATGGGCATATATGGCTTGTCGTGAATATCCGTAAAGCTTAGCCA [...]
+>283
+AGAAGCCACGCTTTTTAGGCTCTGGTTCAACATGCTCTGGAACAGGAATGCGCTTATTCTCTGGAGTAGTCAATCCGTCATCTTTAGGTGGAACAACTATCACCTGCTCCTTCATTTCTACAATGGGAGCTGATTGAGGGAGTTCGGGTTCACTAGGCTCTTGGATCTCAGGTTTAGGTGCTTCCAGTAGACGTTGCATTGTCTCAATTTGATTTTGATAAAAGGATTCACGCTCTTTTGCATCATCAAGCTGATTTTGCAGCATGTTTATCTGTTGTCTAAGTAGTAAAACTTCTGTCGATATTGGACTGTCTATTTTTACAGATTCTTTTACATCCTGTTTTTTTGAAGGTTCACCAAAAACACGGATAGCCTCGGCTAGATCAATTTTATTATCAGAATTTTTACTTAAAATTCCTTTCTTTATGTTGTTGTAAATCGTTTGTCTATTGATATTGTAAAGCTTAGAAAGCTCAAGAACTGTAAGGCTTT [...]
+>289
+CACGTTCCACGCTTATTTATTGAGCAATGTTCCACGGTTTTATTTAGCCTAAGTTAACCATATGGAAGAAAAAAACGACTCCAGAAGCCACGCTTTTTAGGCTCTGGTTCAACATGCTCTGGAACAGGAATGCGCTTATTCTCTGGAGTAGTCAATCCGTCAT
+>297
+AAAATTACCAATCCTGATCTGTTTGCTACCAATGATCAGATTCAACAAAAAGCCCAGGATTAACCTGGGCTTCGTATAAGGTGTATTATGTTAATTTTAGAAATTATTAAATGATTCCAAGATTTTCTAGCGACTTATAAGTAATTTCATTACGAATAGAACCAGACATTCCTTCTTTCATTTCTAAGTTGAGCGAAAAGGGGATTTTTTTTCCATTAGCTTGCTCCACCCAACCAGTCAACCAACCTACCTGTGGAGTAACATCCATTCCCCATCCACTTTTTGCATAAATCTTACTACCATTTACTTCTTTAATTAGAAGCATTTTTTTAACTTCTTCTTGAGTTTCTAATTTAAAAGGTAATCGGTTATGTGCAAGGTCATCGGCAAAATTAACTTCTTGTACTGGTGTAATTTTAAGGGGGCCAACTAACCAAAAATTATCGACCTGTGTTCCAATATTTGTATTTCCAAAATTAACCCGCTTTACTT [...]
+>333
+AAAATTACCAATCCTGATCTGTTTGCTACCAATGATCAGATTCAACAAAAAGCCCAGGATTAACCTGGGCTTCGTATAAGGCGTATTATGTTAATTTTAATGGAACTTTATAATTAGACGTTGTTGTTGATATATAGCGAATGCCATCATGGTGGGCACTATATTTTATGTAGATTGAATACCCACAATCTAAATTACACCATTTTTCAGAGTACAGACTTTCTCTTACATCATCTGGGCTTCCCAATAGATCATGAATTTCAACCTTAGACATGTCAAAATTAAGTCCTTTAGGTAGAAGCTCTCTATATTTATTAAATCCTTCAACATTTTGATTATAAAAAAATATTGTTTGAAAAAATAAGTTTTTACCTAACATTGCTGTATTACTAAGATGATCTAAGCAACTAGCTTCATCTCGAAAAAGTAAACAAATACCTTTTTCTTCATTAGCTATATATAAAGTATCTTCATCTAAAGGTTCATTATCCT [...]
+>6
+GAAAAATTGCCCTTGGTTTTCGCTTCGCTCAAACTCTATTGAACTTCGCTTTCGCTCAGTTCGTCGGGGCAATTTTTTGGTTAATACTT
diff --git a/tests/test_plasmids_separate_sequences.gfa b/tests/test_plasmids_separate_sequences.gfa
new file mode 100644
index 0000000..52af25e
--- /dev/null
+++ b/tests/test_plasmids_separate_sequences.gfa
@@ -0,0 +1,21 @@
+S 232 * LN:i:528 KC:i:51170
+S 277 * LN:i:893 KC:i:50561
+S 280 * LN:i:895 KC:i:37634
+S 282 * LN:i:1819 KC:i:106341
+S 283 * LN:i:1854 KC:i:82138
+S 289 * LN:i:163 KC:i:14624
+S 297 * LN:i:4149 KC:i:248525
+S 333 * LN:i:4399 KC:i:191002
+S 6 * LN:i:89 KC:i:9779
+L 6 + 277 - 81M
+L 6 + 280 + 81M
+L 232 + 277 + 81M
+L 280 + 232 - 81M
+L 282 + 6 + 81M
+L 283 + 6 + 81M
+L 289 + 282 + 81M
+L 289 + 283 + 81M
+L 297 - 232 + 81M
+L 297 + 289 + 81M
+L 333 - 232 + 81M
+L 333 + 289 + 81M
diff --git a/tests/test_queries1.fasta b/tests/test_queries1.fasta
new file mode 100644
index 0000000..08b9aa2
--- /dev/null
+++ b/tests/test_queries1.fasta
@@ -0,0 +1,8 @@
+>test_query_exact
+CTCGCACTTGGGGAATCGCGCAGACCTCACCCGGTTTGCAGGCTTGCGCCGGGCGGTAGATGCGCCGCCAGGCGAAAAACAGCGCGACCAGCGCTGCGCC
+>test_query_one_mismatch
+CTCGCACTTGGGGAATCGCGCAGACCTCACCCGGTTTGCAGGCTTGCGCCGAGCGGTAGATGCGCCGCCAGGCGAAAAACAGCGCGACCAGCGCTGCGCC
+>test_query_one_insertion
+CTCGCACTTGGGGAATCGCGCAGACCTCACCCGGTTTGCAGGCTTGCGCCGGAGCGGTAGATGCGCCGCCAGGCGAAAAACAGCGCGACCAGCGCTGCGCC
+>test_query_one_deletion
+CTCGCACTTGGGGAATCGCGCAGACCTCACCCGGTTTGCAGGCTTGCGCCGGCGGTAGATGCGCCGCCAGGCGAAAAACAGCGCGACCAGCGCTGCGCC
\ No newline at end of file
diff --git a/tests/test_queries2.fasta b/tests/test_queries2.fasta
new file mode 100644
index 0000000..4b90f06
--- /dev/null
+++ b/tests/test_queries2.fasta
@@ -0,0 +1,267 @@
+>CCF76911 pep:novel plasmid:GCA_000210855.2:pRSF1010_SL1344:27:842:-1 gene:SL1344_P3_0001 transcript:CCF76911 description:"dihydropteroate synthase type-2 (dihydropteroate synthase type ii) (dhps) (dihydropteroate pyrophosphorylase type ii)"
+MNKSLIIFGIVNITSDSFSDGGRYLAPDAAIAQARKLMAEGADVIDLGPASSNPDAAPVS
+SDTEIARIAPVLDALKADGIPVSLDSYQPATQAYALSRGVAYLNDIRGFPDAAFYPQLAK
+SSAKLVVMHSVQDGQADRREAPAGDIMDHIAAFFDARIAALTGAGIKRNRLVLDPGMGFF
+LGAAPETSLSVLARFDELRLRFDLPVLLSVSRKSFLRALTGRGPGDVGAATLAAELAAAA
+GGADFIRTHEPRPLRDGLAVLAALKETARIR
+>CCF76912 pep:novel plasmid:GCA_000210855.2:pRSF1010_SL1344:851:1075:-1 gene:SL1344_P3_0002 transcript:CCF76912 description:"conserved hypothetical protein"
+YHEKYHAQKRLNNILKNCLLSAAAQLHRPLSWLCFQMYALLLLQLMDHRKQVTRLGIPFR
+PEHPYDTHARLLLL
+>CCF76913 pep:novel plasmid:GCA_000210855.2:pRSF1010_SL1344:1150:1998:-1 gene:SL1344_P3_0003 transcript:CCF76913 description:"replication protein c"
+MKPKNKHSLSHVRHDPAHCLAPGLFRALKRGERKRSKLDVTYDYGDGKRIEFSGPEPLGA
+DDLRILQGLVAMAGPNGLVLGPEPKTEGGRQLRLFLEPKWEAVTADAMVVKGSYRALAKE
+IGAEVDSGGALKHIQDCIERLWKVSIIAQNGRKRQGFRLLSEYASDEADGRLYVALNPLI
+AQAVMGGGQHVRISMDEVRALDSETARLLHQRLCGWIDPGKTGKASIDTLCGYVWPSEAS
+GSTMRKRRQRVREALPELVALGWTVTEFAAGKYDITRPKAAG
+>CCF76914 pep:novel plasmid:GCA_000210855.2:pRSF1010_SL1344:1988:2827:-1 gene:SL1344_P3_0004 transcript:CCF76914 description:"regulatory protein"
+MATHKPINILEAFAAAPPPLDYVLPNMVAGTVGALVSPGGAGKSMLALQLAAQIAGGPDL
+LEVGELPTGPVIYLPAEDPPTAIHHRLHALGAHLSAEERQAVADGLLIQPLIGSLPNIMA
+PEWFDGLKRAAEGRRLMVLDTLRRFHIEEENASGPMAQVIGRMEAIAADTGCSIVFLHHA
+SKGAAMMGAGDQQQASRGSSVLVDNIRWQSYLSSMTSAEAEEWGVDDDQRRFFVRFGVSK
+ANYGAPFADRWFRRHDGGVLKPAVLERQRKSKGVPRGEA
+>CCF76915 pep:novel plasmid:GCA_000210855.2:pRSF1010_SL1344:2857:3063:-1 gene:SL1344_P3_0005 transcript:CCF76915 description:"repressor protein"
+MKDQKDKQTGDLLASPDAVRQARYAERMKAKGMRQRKFWLTDDEYEALRECLEELRAAQG
+GGSDPASA
+>CCF76916 pep:novel plasmid:GCA_000210855.2:pRSF1010_SL1344:3065:3277:-1 gene:SL1344_P3_0006 transcript:CCF76916 description:"conserved hypothetical protein"
+MEYEKSASGSVYLIKSDKGYWLPGGFGYTSNKAEAGRFSVADMASLNLDGCTLSLFREDK
+PFGPGKFLGD
+>CCF76917 pep:novel plasmid:GCA_000210855.2:pRSF1010_SL1344:3338:5467:-1 gene:SL1344_P3_0008 transcript:CCF76917 description:"mobilization protein"
+MAIYHLTAKTGSRSGGQSARAKADYIQREGKYARDMDEVLHAESGHMPEFVERPADYWDA
+ADLYERANGRLFKEVEFALPVELTLDQQKALASEFAQHLTGAERLPYTLAIHAGGGENPH
+CHLMISERINDGIERPAAQWFKRYNGKTPEKGGAQKTEALKPKAWLEQTREAWADHANRA
+LERAGHDARIDHRTLEAQGIERLPGVHLGPNVVEMEGRGIRTDRADVALNIDTANAQIID
+LQEYREAIDHERNRQSEEIQRHQRVSGADRTAGPEHGDTGRRSPAGHEPDPAGQRGAGGG
+VAESPAPDRGGMGGAGQRVAGGSRRGEQRRAERPERVAGVALEAMANRDAGFHDAYGGAA
+DRIVALARPDATDNRGRLDLAALGGPMKNDRTLQAIGRQLKAMGCERFDIGVRDATTGQM
+MNREWSAAEVLQNTPWLKRMNAQGNDVYIRPAEQERHGLVLVDDLSEFDLDDMKAEGREP
+ALVVETSPKNYQAWVKVADAAGGELRGQIARTLASEYDADPASADSRHYGRLAGFTNRKD
+KHTTRAGYQPWVLLRESKGKTATAGPALVQQAGQQIEQAQRQQEKARRLASLELPERQLS
+RHRRTALDEYRSEMAGLVKRFGDDLSKCDFIAAQKLASRGRSAEEIGKAMAEASPALAER
+KPGHEADYIERTVSKVMGLPSVQLARAELARAPAPRQRGMDRGGPDFSM
+>CCF76918 pep:novel plasmid:GCA_000210855.2:pRSF1010_SL1344:4306:4719:-1 gene:SL1344_P3_0009 transcript:CCF76918 description:"mobilization protein"
+MNAIDRVKKSRGINELAEQIEPLAQSMATLADEARQVMSQTQQASEAQAAEWLKAQRQTG
+AAWVELAKELREVAAEVSSAAQSARSASRGWHWKLWLTVMLASMMPTVVLLIASLLLLDL
+TPLTTEDGSIWLRLVAR
+>CCF76919 pep:novel plasmid:GCA_000210855.2:pRSF1010_SL1344:5666:5950:1 gene:SL1344_P3_0011 transcript:CCF76919 description:"mobilization protein c"
+MVKGSNKAADRLAKLEEQRARINAEIQRVRAREQQQERKNETRRKVLVGAMILAKVNSSE
+WPEDRLMAAMDAYLERDHDRALFGLPPRQKDEPG
+>CCF76920 pep:novel plasmid:GCA_000210855.2:pRSF1010_SL1344:6504:7043:1 gene:SL1344_P3_0012 transcript:CCF76920 description:"putative transposase/recombinase"
+MPHVAARTASRDRDTGRYQSHRPEQTLLYQIVDEYYPAFAALMAEQGKELPGYVQREFEE
+FLQCGRLEHGFLRVRCESCHAEHLVAFSCKRRGFCPSCGARRMAESAALLVDEVLPEQPM
+RQWVLSFPFQLRFLFGVVCGKGRNPTLRLWPAIFSGEIDVFPGDRRSRLISSMTSVAPA
+>CCF76921 pep:novel plasmid:GCA_000210855.2:pRSF1010_SL1344:7015:7860:-1 gene:SL1344_P3_0013 transcript:CCF76921 description:"streptomycin 3''-kinase"
+MGLMFMPPVFPAHWHVSQPVLIADTFSSLVWKVSLPDGTPAIVKGLKPIEDIADELRGAD
+YLVWRNGRGAVRLLGRENNLMLLEYAGERMLSHIVAEHGDYQATEIAAELMAKLYAASEE
+PLPSALLPIRDRFAALFQRARDDQNAGCQTDYVHAAIIADQMMSNASELRGLHGDLHHEN
+IMFSSRGWLVIDPVGLVGEVGFGAANMFYDPADRDDLCLDPRRIAQMADAFSRALDVDPR
+RLLDQAYAYGCLSAAWNADGEEEQRDLAIAAAIKQVRQTSY
+>CCF76922 pep:novel plasmid:GCA_000210855.2:pRSF1010_SL1344:7851:8654:-1 gene:SL1344_P3_0014 transcript:CCF76922 description:"aminoglycoside phosphotransferase"
+MNRTNIFFGESHSDWLPVRGGESGDFVFRRGDGHAFAKIAPASRRGELAGERDRLIWLKG
+RGVACPEVINWQEEQEGACLVITAIPGVPAADLSGADLLKAWPSMGQQLGAVHSLSVDQC
+PFERRLSRMFGRAVDVVSRNAVNPDFLPDEDKSTPQLDLLARVERELPVRLDQERTDMVV
+CHGDPCMPNFMVDPKTLQCTGLIDLGRLGTADRYADLALMIANAEENWAAPDEAERAFAV
+LFNVLGIEAPDRERLAFYLRLDPLTWG
+>CCF76810 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:378:467:1 gene:SL1344_P2_0001 transcript:CCF76810 description:"regulator of repZ translation"
+MKPYQRFNPVQCINTRHNRSAISDSLWQV
+>CCF76811 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:455:1486:1 gene:SL1344_P2_0002 transcript:CCF76811 description:"replication initiation protein"
+MAGLKNTPYNAVHWSQLAPEEQIRFWEDYEAGRATTFLVEPERKRTKRRRGEHSTKPKCE
+NPSWYRPERYKALSGQLGHAYNRLVKKDPVTGEQSLRMHMSLHPFYVQKRTYVGRKYAFR
+PEKQRLLDAVWPVLVSFSDAGTHTVGMSVSRLAREISPKDSKGKVIPELEVTVSRLSRLL
+AEQVRFGVLGVSEETLWDRETRQRLPRYVWITPAGWQMLGVDMVKLHEQQQKRLRESEIR
+QQLIREGVLREDEDISVHAARKRWYLQRSQDALKHRRAKAAASKRARRLKKLPADQQIHE
+MAEYLRKRLPPDEAYFCSDDHLKRMAIRELRQLELTLAAPPPH
+>CCF76812 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:2395:2664:1 gene:SL1344_P2_0003 transcript:CCF76812 description:"conserved hypothetical plasmid protein"
+MAQVNMSLRIDAELKDAFMAAAKSMDRNGSQLIRDFMRQTVERQHNTWFRDQVAAGRQQL
+EHGDVLPHDMVESSAAAWRDEMSRKVAGK
+>CCF76813 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:2661:2942:1 gene:SL1344_P2_0004 transcript:CCF76813 description:"putative plasmid stabilisation protein"
+MMEIFWTMLASQDRKRIREYIAEQNLMAAIELDERIGYSASSLAGQPYKGRNGRVEGTRE
+LVIHPHFVLVYEVDSQWGKVYILRVLHTAQKWP
+>CCF76814 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:2982:3830:1 gene:SL1344_P2_0005 transcript:CCF76814 description:"conserved hypothetical plasmid protein"
+MNNDELATRRAQAIAEDRCFSKGRLRDEFRMKPAPGAEPVKWYKNTYGGRFAVYRIADCV
+PMREKRPLTSKQQLAGQRLSVLSRLNSTSGRMARQAYDWLSLAPLFLDTETTGLDNTAEA
+LEIGLTDAAGQVVFETRLKPTVAIGAQAAAVHGISEQALCGAPSWTDVARQLRHAIGDRP
+VIIFNARFDIRILKQTAAAHSDPADWLEELTVYCAMELAAGYYGATNRYGTISLACAASQ
+AGLTWEGQAHSAIADARMTAGVVNAIAAYHLELLQEQARLKI
+>CCF76815 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:3971:4420:1 gene:SL1344_P2_0006 transcript:CCF76815 description:"conserved hypothetical plasmid protein"
+MRLFLGGRCYTAEKLEKDYLAEVANYSNDRWEAPQRASRLAASVKRYKTSEMLRFIFATI
+AYDPDPDLTPLTVRRLCKALFGRTGSQWLVVEVFGEKGRQHRSADSNPEMVEKMAARYRH
+AAELHWSATLAEIERVKRLYQTKIKKSKK
+>CCF76816 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:4555:4788:1 gene:SL1344_P2_0007 transcript:CCF76816 description:"putative membrane protein"
+MSSRNSVHDFIMLLPALLLVGWLVLVIILMFRDDKCDKTYREGSFPEFICLHSDRSSLRE
+TDSERLIVKYTEIKSQK
+>CCF76817 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:4897:5166:-1 gene:SL1344_P2_0008 transcript:CCF76817 description:"conserved hypothetical plasmid protein"
+MMITGNGINTVTVNGKVKHITELDDITLCLEWTKLREENNRLYEINNQANRGWRGFILRL
+IGVNLPDKRTEFTQRLLLTRKISGSVMKK
+>CCF76818 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:5163:5657:-1 gene:SL1344_P2_0009 transcript:CCF76818 description:"putative membrane protein"
+MCDSEAEKILFILNKHERAYRRLIPVYIFLAIVLWILPILLIVYLYFCIVDNEFLRIGFC
+IAWTAYYFLSLFKYFVKYFFPLDREDLLKLMELAKDSPDAKQELLERLLSGKRMTGRDEM
+DIKRILKTKEALDNIRNFIDKQQLTNSDTPKKSTVPNEDKKGIR
+>CCF76819 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:5713:6315:-1 gene:SL1344_P2_0010 transcript:CCF76819 description:"conserved hypothetical plasmid protein"
+MGKNQEERKTPVIVVKKRRTFSLPSLSEKTDIIAPVFTEQTAESAPAGINSSAVETHIPE
+APARKKKKKRHRFPRPSHWTREYTHECVEKIKALFPHLRAEGGGFIPLKIGINNDISAFL
+AEHPETELTMDEWLCAVSCITSRRVYLQRTAVAGVPRYGLDGHPKGQVSDSEAQSAGRRL
+ATLEQKWLRMQAQQENISGQ
+>CCF76820 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:6669:8015:1 gene:SL1344_P2_0011 transcript:CCF76820 description:"conserved hypothetical plasmid protein"
+MPMILVKKNPRGKVIRELSSEEETAVKTVCGLKKPATMALHNLANDILREMREYDAWLQC
+DCIPGDSPAMNFAALKNNTGTLYLSSFNHEHAPECPMYRQLSGNEEETSSGASRHPVSTR
+INYRNFLPPDDSNSVIRLQARSAYHNGESSSVRKKRPRLARLLLSLIDDAGLNKLDSLAN
+PRIRTNYRECLDAIRQVTLQQEYIRGRSLSEIIHFRPGMSERSQERLMETLENSERHWPA
+RRKHMFFQIFMAQHICRDAVEIHWANGNIQVIRPVRGISINGEAQGGIRPPYWVILAFCR
+SADGRIICSEGYAHALYQLTCPVPVDSKLERNTLTALLNVASWLKRKPGTPELSLERPLF
+DTEVYVNGEKKYVLPDFIVTARAPDGKTARVVIETMGYEDSDYCARKSRQHTGMKQIGVL
+HTDPPKWLDNDHPPFEKHMYGVFMHLRY
+>CCF76821 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:8294:10174:1 gene:SL1344_P2_0012 transcript:CCF76821 description:"colicin Ib protein"
+MSDPVRITNPGAESLGYDSDGHEIMAVDIYVNPPRVDVFHGTPPAWSSFGNKTIWGGNEW
+VDDSPTRSDIEKRDKEITAYKNTLSVQQKENENKRTEAGKRLSAAIAAREKDENTLKTLR
+AGNADVADITRQEFRLLQAELREYGFRTEIAGYDALRLHTESRMLFADADSLRISPREAR
+SLIEQAEKRQKDAQNADKKAADMLAEYERRKGILDTRLSELEKNGGAALAVLDAQQARLL
+GQQTRNDRAISEARNKLSSVTESLKTARNALTRAEQQLTQQKNTPDGKTIVSPEKFPGRS
+STNHSIVVSGDPRFAGTIKITTSAVIDNRANLNYLLTHSGLDYKRNILNDRNPVVTEDVE
+GDKKIYNAEVAEWDKLRQRLLDARNKITSAESAVNSARNNVSARTNEQKHANDALNALLK
+EKENIRSQLADINQKIAEEKRKRDEINMIKDAIKLTSDFYRTIYDEFGKQASELAKELAS
+VSQGKQIKSVDDALNAFDKFRNNLNKKYSIQDRMAISKALEAINQVHMAENFKLFSKAFG
+FTGKVIDRYDVAVELQKAVKTDNWRPFFVKLESLAAGRAASAVTAWTFSVMLGTPVGILG
+FAIIMAAVSAFVNDKFIEQVNKLIGI
+>CCF76822 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:10192:10539:-1 gene:SL1344_P2_0013 transcript:CCF76822 description:"immunity protein for colicin Ib"
+MKLDISVKYLLKSLIPSLIILTVFYLGWKDSQENARMFYAFIGCIISAITFPFSMRIIQK
+MVIRFTGKEFWQKDFFTNPVGGSLTAIFELFCFVISVPVVAIYLIFIFCKALSGK
+>CCF76825 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:12400:12852:1 gene:SL1344_P2_0016 transcript:CCF76825 description:"conserved hypothetical plasmid protein"
+MTVPARKRKKESPMFFIENEGQAVAGTDYWQSVQAQAGYVYLSWNAGAARLLVPDAAKHL
+LREMRGAEYVIISKGALHGRDALELVFEDGSDAPFVIHMLSEQCDRLLPENNQGGGFVVT
+VWTRGGNQLRYPGKYRVVENLPDVSPWSEH
+>CCF76826 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:12854:13639:1 gene:SL1344_P2_0017 transcript:CCF76826 description:"resolvase"
+MQHLPAPIHHARDAAQLPVAIDYPAALALRQMSMVHDELPKYLLAPEVSALLHYVPDLRR
+KMLLATLWNTGARINEALALTRGDFSLAPPYPFVQLATLKQRTEKAARTAGRMPAGQQTH
+RLVPLSDAWYVSQLQTMVATLKIPMERRNKRTGRTEKARIWEVTDRTVRTWIGEAVAAAA
+ADGVTFSVPVTPHTFRHSYAMHMLYAGIPLKVLQSLMGHKSISSTEVYTKVFALDVAARH
+RVQFAMPEADAVALIKQLERR
+>CCF76827 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:13893:14096:1 gene:SL1344_P2_0018 transcript:CCF76827 description:"hypothetical plasmid protein"
+MIFQHDSSNKIDCSYHAVHIRPSALFMLCYLQSCGNLASSVDAILNEVSFIVNVTQVFGC
+QFQHSAK
+>CCF76828 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:14223:14855:1 gene:SL1344_P2_0019 transcript:CCF76828 description:"plasmid partition protein"
+MAWIVGFISQKGGVGKSTKARALAREASACGIKTKLADLDLEQATSAEWHRRRLSAGLSP
+VASVEVFSTAKQAIESAGDFDLLILDGPARASKGTSEIAKVADLIVQPTGASLDDLVPAI
+KVFNALVKEGIPRSKLVFALSRVGTEAEELDARAYISEAGYETLSGCLFEKPAYRKAMNS
+GLAVTETRYKGLNERADELIQALIDKIGEE
+>CCF76829 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:14855:15229:1 gene:SL1344_P2_0020 transcript:CCF76829 description:"conserved hypothetical protein"
+MADASKLRTKRTRSGLGVPPGPDEVATSLNAPEIAPAVAATDVQRQQADSSPVHHEPVVT
+QTVTEVYTRRDGRSARKTNRTLAFATRVTPAFDQEIRDIAEREGLKLVEVLEKAVEAYKE
+KQGY
+>CCF76830 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:15468:16442:1 gene:SL1344_P2_0021 transcript:CCF76830 description:"plasmid stability protein"
+MRIFCDDGSTNVKLAWFEGKTLKSAVSVNSFRHNWKVEGLGSSRTYNYLLDGRKYTYDPV
+SEDAISTTHIEYQYSDTNVLAVHHALLNSGIEPQEIDLTVTLPISEFYTADCQKNTLNIE
+RKIRNLMREVTLNKGGTFTIKSVEVMPESLPAVFTRLVADNVGQYEKSLVIDLGGTTLDV
+GVIVGQFEDVSAVHGNPDIGVSMVTKATLTALKMASSDTSPMIADELIKNRNNLDFVGQV
+VNEVSKLNLVLDTIDTAINKLGELVVDDLLQYRNVNRVYIVGGGAALIADAVRKAWNHLG
+EKVVLMDEPQTALVQAIARFKAEE
+>CCF76831 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:16446:16838:1 gene:SL1344_P2_0022 transcript:CCF76831 description:"plasmid stability protein"
+MYEGEERKKLSLYLHPEDSADCLALAEIETVPRKKRGELYRQALITGLIMHQLDERIPAV
+LTALFTRELNADEVISQIARITGWKPSSGDLKEVLKALGGLQSTVSPEHSQDDGEQARLK
+AARVKMQNLI
+>CCF76833 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:17236:17481:1 gene:SL1344_P2_0024 transcript:CCF76833 description:"conserved hypothetical plasmid protein"
+MLCPAYPQHFVHGSVDKIPGYPGRAGTLTGLHPMQVCRCRRPPHPVTFRRSSSTRCGFGA
+APAFVCGRPVTGAARPDGGRM
+>CCF76834 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:17495:18421:1 gene:SL1344_P2_0025 transcript:CCF76834 description:"conserved hypothetical plasmid protein"
+MPNWCSNRMHFSGEPAQIAEIKRLASGAVTPFYRRATNEGIQLFLAGSAGLLQTTEDVWF
+EPCPGLTAAGRGVVSPENIAFTRWLTHLQNGVLLDEQNCLMLHELWLQSGTGQRRWEGLP
+DDVRDTITALFTAKRGDWCGFWSNEDVSVWWNRLCDNVLPEKTMPFDLLTVLPTRLDVEV
+NGFNGGVLNGVPSAYHWYTEQYGVKWPCGYDLNISSQGDNFIQVDFDTPWCQPESDVIAE
+LSRRFSCTLEHWYAEQGCDFCGWQLYERGELVDVLWGELEWSSPTDDDELPEVTGPAWIV
+DKVAHYGG
+>CCF76836 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:18806:19489:1 gene:SL1344_P2_0027 transcript:CCF76836 description:"putative DNA methylase"
+MSRFVLGNCIDVMARIPDNAIDFILTDPPYLVGFRDRSGRTIAGDKTDEWLQPACNEMFR
+VLKKDALMVSFYGWNRVDRFMAAWKNAGFSVVGHLVFTKNYTSKAAYVGYRHECAYILAK
+GRPRLPQNPLPDVLGWKYSGNRHHPTEKPVTSLQPLIENFTHPNAIVLDPFAGSGSTCVA
+ALQSGRRYIGIELLEQYHRAGQQRLAAVQRAMQQGAANDDWFMPEAA
+>CCF76837 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:19490:19711:1 gene:SL1344_P2_0028 transcript:CCF76837 description:"conserved hypothetical plasmid protein"
+MNYAGHEKLRAEVAEVANAMCDLRTTMNEMEQRYSFNADTLPERLVRQTLFRANRLLMEA
+YTEILELEACFKD
+>CCF76838 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:19725:20159:1 gene:SL1344_P2_0029 transcript:CCF76838 description:"conserved hypothetical plasmid protein"
+MYGTCETLCRELAVKYPGDMPLMLVIWSPEEIQALADGMDISLSDHEIRTVLARLEDIPE
+DQRTESGISSGVAMEIINNVSENRQVTVPAELLASLIQTAEQALWKREWAARDHGLAVPE
+CVTRRQAVINQARTLLKNNRHEND
+>CCF76839 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:20205:20981:1 gene:SL1344_P2_0030 transcript:CCF76839 description:"conserved hypothetical plasmid protein"
+MNENTTLNALICRHARNLLLAQGWPEETDVDQRNPNHPGWISIYVLLDAPRLATLLINRH
+GGALPPLLASAIHKLTGTGAELVLSGSQWQSLPVLPADGTQVSFPYAGEWLAEDEIRAVL
+DAVRDAVRCVSYQVAEDTRRIRAALTTTGQTLLTRQTRRFRLVVKESDHPCWLDEDDENL
+PVVLDAILNRGARFSAVEMYLVSDCIEHILSSWLAWDVLRIPDEPPRRWFDRGVLREVVR
+EARNEIRSMADALAKIRK
+>CCF76840 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:20956:21426:1 gene:SL1344_P2_0031 transcript:CCF76840 description:"conserved hypothetical plasmid protein"
+MPWQKSGNDDTGGVNPRLFPAGPRTEHKGRRRRLRFTRPCRAWPCGFSVMWPPCRVRAVP
+CLHLSRAGRDARVRFAAAVTRSLLPVCRDFPVVHPLRFRGLTLQLPPAVCVRLRLPLRPV
+HPHLIARLLWRHGTARCRGICEQRRKTSCNMRNLSL
+>CCF76841 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:21399:21824:1 gene:SL1344_P2_0032 transcript:CCF76841 description:"conserved hypothetical plasmid protein"
+MQYAKPVTLNVEECDRLSFLPYLFGQDFLYAEASVYALAKQMMPEYEGGFWHFIRLPDGG
+GYMMPDGDRFHMVNGANWFDRTVSADAAGIILTSLVINRQLWLYHDSGDAGLTQLYRMRD
+AQLWRHIEFHPECNAIYAALD
+>CCF76842 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:21871:22293:1 gene:SL1344_P2_0033 transcript:CCF76842 description:"conserved hypothetical plasmid protein"
+MYCTVKEIIRDVLDTDVPDSECVFAVVLTRGDVRHIAQDWSLTDDELETVMQRLDDAFEY
+GADVSVVHGVVRELMEEKRASRQVTVPAVMLEKVLALAGSEMKRLYAVGSENGGDGDAFV
+REEREAMDVVLQALDGEHMS
+>CCF76844 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:23250:23777:1 gene:SL1344_P2_0035 transcript:CCF76844 description:"single-stranded DNA binding protein"
+MSARGINKVILVGRLGNDPEVRYIPNGGAVANLQVATSESWRDKQTGEMREQTEWHRVVL
+FGKLAEVAGEYLRKGAQVYIEGQLRTRSWEDNGITRYVTEILVKTTGTVQMLGRAPQQNA
+QAQPKPQQNGQPQSADATKKGGAKTKGRGRKAAQPEPQPQPPEGEDYGFSDDIPF
+>CCF76845 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:24121:26085:1 gene:SL1344_P2_0036 transcript:CCF76845 description:"ParB-like partition protein"
+MIMPVTKCEPETTRKASRKSVKTQETVLSALLAQTEEVSVPLASLIKSPLNVRTVPYSAE
+SVSELAESIKGVGLLQNLVVHTLPGDRYGVAAGGRRLAALNMLAERGIIPADWPVRVKVI
+PQELATAASMTENGHRRDMHPAEQIAGFRAMAQEGKTPAQIGDLLGYSPRHVQRMLKLAD
+LAPVILDALAEDRITTEHCQALALENDTARQVQVFEAACQSGWGGKPDVQTIRRLVTESE
+VAVAGNTKFRFVGADAFSPDELRTDLFSDDEGGYVDCVALDAALLEKLQAVAEHLREAEG
+WEWCAGRMEPVGECREDAGTYRSLPEPEAVLTEAEEERLNELMTRYDALENQCEESDLLE
+AEMKLMRCMAKVRAWTPEMRSGSGVVVSWCYGNVCVQRGVQLRSEDDVADDADRTEQVQE
+KASVEEISLPLLTKMSSERTLAVQAALMQQPDKSLALLAWTLCLNVFGSGAYSKPAQISL
+ECEHYSLTSDAPSGKEGAAFMALMAEKARLAALLPEGWSRDMTTFLSLSQEVLLSLLSFC
+TACSLNGVQTRECGHTSRSPLDSLESAIGFHMRDWWQPTKANFFGHLKKPQIIAALNEAG
+LSGAARDAEKMKKGDAAEHAEHHMKDNRWVPGWMCAPHPQTDATERTDNLADAA
+>CCF76846 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:26140:26574:1 gene:SL1344_P2_0037 transcript:CCF76846 description:"plasmid SOS inhibition protein"
+MKTELTLNALQSMNAQEYEDIRAAGSDMRRNLTHEVMREVDAPANWMMNGEYGSEFGGFF
+PVQVRFTPAHERFHLALCSPGDVSQLWMLVLVNCGGQPFAVVQVQHIFTPVAISHTLALA
+ATLDAQGYSVNDIIHILMAEGGQA
+>CCF76847 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:26625:27290:1 gene:SL1344_P2_0038 transcript:CCF76847 description:"plasmid SOS inhibition protein"
+MQAVAVTEQRRRQGRTLSAWPYASAFFRCLNGSRRISLTDLRFFAPALTKEEFHGNRLLW
+LAAVDKLIESFGEVCVLPLPSDAGHRLFPSVPFREGERRRQKTTLTEQKYSRQREREAER
+RELEYQTCFAQAQIDLAFHTPSTVGSWLSRWSGVVEEHDLETIFWGWCGRFPSLSSFDRF
+FWQEEPLWRLIFEAGEAGRGAPVQVRALEQWMIPNKLENAI
+>CCF76848 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:27290:27883:1 gene:SL1344_P2_0039 transcript:CCF76848 description:"conserved hypothetical plasmid protein"
+MKSDEQYQVPVWMRPLLPLLCNTGGNDPEELLNDTETTASANIVRYVLIVAVRSQIDLLQ
+LLYRKGLLRTEIPGGFSPEEAQELLDNLVRSHISKALSGERMAARDRNADLTWIRQQLVD
+AAWFVRATLEAHGMGVGNESPSAPPETMPDIQTRELVMLIKRLASSLKAVKPDSSVVREA
+QDWLCDRKLVDITDILR
+>CCF76849 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:27955:28425:1 gene:SL1344_P2_0040 transcript:CCF76849 description:"conserved hypothetical plasmid protein"
+MRRVLCTRRNKEVAGGSAFTRPCGAWPCGFSALWPQRRVRAVPCLHLSRAGRDARVRFAA
+AVTRSLLPVCRDFPVVHPLRFRGLTLQLPPAVCVRLRLPLRPVHPRLIARLLWRHGTARC
+RRTCDYGGFGNVCCCTCCIRWNLAQIQLWKHRRTLV
+>CCF76850 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:28331:28846:1 gene:SL1344_P2_0041 transcript:CCF76850 description:"anti-restriction protein"
+MEDSGMSVVAPAVYVGTWHKYNCGSIAGRWFDLTTFDDERDFFAACRALHQDEADPELMF
+QDYEGFPGNMASECHINWAWVEGFRQARDEGCEEAYRLWVEDTGETDFDTFRDAWWGEAD
+SEEAFAVEFASDTGLLADVPETVALYFDYEAYARDLFLDSFTFIDGHVFRR
+>CCF76851 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:29575:30009:1 gene:SL1344_P2_0042 transcript:CCF76851 description:"conserved hypothetical plasmid protein"
+MTVSSTISVFCRDGVFRTVYCHLHGEPTWNGRILHTHYATGQQAEALVEHGDIRCLGPRC
+DKPAGHTLQNPVDGVTAYYGRDSGFRMDSEAREYRSFREAIATESTEEVRFHYVFIDGYW
+KVMYRTPEGWKMKSLALALRRCPK
+>CCF76852 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:30103:30369:1 gene:SL1344_P2_0043 transcript:CCF76852 description:"conserved hypothetical plasmid protein"
+MRPSIIFATAEYVKRLREECLRENKPLHRHTRFRRQELAQDEINPDVLAMSGHIARRCSE
+RKRVRIPAMKVSEWGHLLRALEIERVCH
+>CCF76853 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:30311:31360:1 gene:SL1344_P2_0044 transcript:CCF76853 description:"putative transposase"
+KSANGVTCSARLKLSGSATDYPLPSACAGGRIRSDISPGGTVSKKKTTTTPTPHDAAFRS
+FLANPDVARDFLELHLPAEYRQLCDLSTLKLEPATFVEPDLHQYASDILWSVKTTGGEDG
+YVYTLIEHQSTENLYMPFRMLRYSVAAMQRHLEQHKTLPLVIPVLFYHGERSPYPYSMNW
+LDCFENPALAAKIYTKPFPLVDITVVDDNEIMNHRRMAALTLLMKHIRHRDMMELLDKLP
+QVMVEISDEQVRVLIHYIVNAGDSVSPEFMRALAERLPQHEDKLMTIAERLEQKGRQEGR
+MEGRMEGRMEGALEKALAIACQLQKMGMTPEQIKQATGLSDDELKKITH
+>CCF76854 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:32007:32342:1 gene:SL1344_P2_0045 transcript:CCF76854 description:"conserved hypothetical plasmid protein"
+MRFSLFSPVREWCASDHHMPLLCRRFSSVAPYAALPAHLTVCKATAPDGAAVSACLPPHC
+GLFSADGLSGGTYMTTSRFSRPGERCTSHKSFCRRRQKLLRLPPDNCPVTW
+>CCF76855 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:32467:33315:1 gene:SL1344_P2_0047 transcript:CCF76855 description:"conserved hypothetical plasmid protein"
+MNQTLPTADLNTAGTTDVIPSVAIDRIIAQRNEGIALFMQAMECLATARKILLDASGDIF
+LYGFEDCVTDSVRCMDKPEEAKKNITRLADRKIWDRLMTDTGMYTFMSSCQRDEWNSQLM
+SDTCPEITLDNVLATFRHLNASKMQTFEQGLIDVYRKLSWDYRTNNPCRLGKKIIIENLL
+YRWSNGRVTLDCSGREALDDLVRPFYLLEGRNVPDFRNSIGAQYGEFLGNGDNVGKLLEG
+EYFTVRGYQKGTVHIVFKRSDLVEKLNDIIARHYPGALPPRV
+>CCF76856 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:33401:33736:-1 gene:SL1344_P2_0047A transcript:CCF76856 description:"conserved hypothetical plasmid protein"
+MASKKFYSDDDIQLAKAALSELPDLTAQRKTLRDFLDAIRDDIIVLVRTKGYTLADVRDT
+LKNAGYEVGEKALRDIIREAESKKPSRRSSSKTAPKKTDSGRKDGIDMNNN
+>CCF76857 pep:novel plasmid:GCA_000210855.2:pCol1B9_SL1344:33969:34301:1 gene:SL1344_P2_0048 transcript:CCF76857 description:"relaxosome component"
+MSDKRQRSGSERRQKTILRAVRFSPDEDETICKNAEDSGLTVSAYIRNAALNKRINSRTD
+DAFLKELMRLGRMQKHLFVQGKRTGDKEYAEVLVAITELTNTLRKQLMEG
diff --git a/tests/test_query_paths.fasta b/tests/test_query_paths.fasta
new file mode 100644
index 0000000..24d1204
--- /dev/null
+++ b/tests/test_query_paths.fasta
@@ -0,0 +1,14 @@
+>query1 perfect match from 1+ to 4+
+CCAATGAAAAAGCTATGCACTTTGTACAGGGTGCCATCGGGTTTCTGAACTCTCAGATAGTGGGGATCCCGGGAAAGGGCCTATATTTGCGGTCCAACTTAGGCGTAAACCTCGATGCTACCTACTCAGACCCACCCCGCGCGGGGTAAATATGGCACTCATCCCAGCTGGTTCTTGGCGTTCTACGCAGCCACATGTTCATTAACAGTTGTCTGGTAGCACAAAAGTATTACCATGGTCCTAGAAGCCCGGCAGAGTTAGTTCGAACCTAATGCCACAAATGAGACAGGACGCCAATGGGTACCGGACATTAGGTCGAGCTCAGTTCGGTAACGGAGAGACCCTGCGGCGTACTTAATTATGCATATGAAACGCGCCCAAGTGACGCCAGGCAAGTCTCAGCAGGTTCCCGTGTTAGCTCGAGGGTAAACATACAAGCCGATTGAACATGGGTTGGGGGCTTCAAATCGTCGAGGACCCCACAGTACCTCG [...]
+>query2 same as query 1 but with 20 mismatches (2%)
+CCAATGAAAAAGCTATGCACATTGTACAGGGTGCCATCGGCTTTCTGAACTCTCAGATATTGGGGATCCCGGGAAAGGGCCTATTTTTGCGGTCCAACTTAGGCGTAAACCTCGATGCTACCTACTCAGACCCACCCCGCGCGGGGTAAATATGGCACTCATCCCAGCTGGTTCTTGGCGTTCTACGCAGCCACATGTTCATTAACAGTTGTCTGGTAGCACAAAAGTATTACCATGGTCCTAGAAGCACGGCAGAGTTAGTTCGAACCTAATGCCACAAATGAGACAGGACGCCACTGGGTACCGGACATTAGGTCGAGCTCAGTTCGGTAACGGAGAGACCCTGCGGCGTATTTAATTATGCATATGAAACGCGCCCAAGTGACGCCAGGCAGGTCTCAGCAGGTTCCCGTGTTAGCTCGAGGCTAAACATACAAGCCGATTGATCATGGGTTGGGGGCTTCAAATCGTCGAGGACCCCACAGTACCTCG [...]
+>query3 same as query 1 but with 20 insertions
+CCAATGAAAAAGCTATGCACTTTGTACAGGGTGCCATCGGGATTTCTGAACTCTCAGATAGTGGGGATCCCGGGAAAGGGCCTATATTTGCGGTCCAACTTAGGCGTAAAACCTCGATCGCTACCTACTCAGACCCACCCCGCGCGGGGTAAATGATGGCACTCATCCCTAGCTGGTTCTTGGCGTTCTACGCAGCCACATGGTTCATTAACAGTTGTCTGGTAGCACAAAAGTATTACCATGGTCCTAGAAGCCCTGGCAGAGTTAGTTCGAACCTAATGCCACAAATGAGACAGGACGCCAATGGGTACCGGACATTAGGTCGAGCTCAGTTCGGTAACGGCAGAGACCCTGCGGCGTACTTAATTATGCAATATGAAACGCGCCCAAGTGACGCTCAGGCAAGTCTCAGCAGGTTCCCGTGTTAGCTCGAGGGTAAACATACAAGCCGATTGAACATGGGTTGGGGGCTTCAAATCGTCGAGGACCCCA [...]
+>query4 same as query 1 but with 20 deletions
+CCAATGAAAAAGCTATGCACTTGTACAGGGTGCCATCGGGTTTCTGAACTCTCAGATAGTGGGGATCCCGGGAAAGGGCCTATATTTGCGGTCCAACTTAGGCGTAAACCTCATGCTACCTACTCAGACCCACCCCGCGCGGGGTAAATATGGCACCATCCCAGCTGGTTCTTGGCGTTCTACGCAGCCACATGTTCATTAACAGTTGTCTGGTAGCACAAAAGTATTACCATGGTCCTAGAAGCCCGGCAGAGTTAGTTCGACCTAATGCCACAAATGAGACAGGACCCAATGGGTACCGGACATTAGGTCGAGCTCAGTTCGTAACGGAGAGACCCTGCGGCGACTTAATTATGCATATGAAACGCGCCCAAGTGACGCCAGGCAAGTCTCAGCAGGTTCCCGTGTTAGCTCGAGGTAAACATACAAGCCGATTGAACATGGTTGGGGGCTTCAAATCGTCGAGGACCCCACGTACCTCGGAGACCAAGA [...]
+>query5 perfect match from 1+ to 4+ to 6+ to 7+
+CCAATGAAAAAGCTATGCACTTTGTACAGGGTGCCATCGGGTTTCTGAACTCTCAGATAGTGGGGATCCCGGGAAAGGGCCTATATTTGCGGTCCAACTTAGGCGTAAACCTCGATGCTACCTACTCAGACCCACCCCGCGCGGGGTAAATATGGCACTCATCCCAGCTGGTTCTTGGCGTTCTACGCAGCCACATGTTCATTAACAGTTGTCTGGTAGCACAAAAGTATTACCATGGTCCTAGAAGCCCGGCAGAGTTAGTTCGAACCTAATGCCACAAATGAGACAGGACGCCAATGGGTACCGGACATTAGGTCGAGCTCAGTTCGGTAACGGAGAGACCCTGCGGCGTACTTAATTATGCATATGAAACGCGCCCAAGTGACGCCAGGCAAGTCTCAGCAGGTTCCCGTGTTAGCTCGAGGGTAAACATACAAGCCGATTGAACATGGGTTGGGGGCTTCAAATCGTCGAGGACCCCACAGTACCTCG [...]
+>query6 matches 1000 bp of node 1+ with 1000 bp inserted in middle (500, 1000, 500)
+AGGTATCCTGAGCACGGTTGCGCGTCCGTATCAAGCTCCTCTTTATAGGCCCCGGTTTCTGTTGGTCGTAGAGCGCAGAACGGGTTGGGGGGATGTACGACAATATCGCTTAGTCACCTTTGGGCCACGGTCCGCTACCTTACAGGAATTGAGACCGTCCTTTAATTTCCCTTGCATATATGTTGCGTTTCTTCGACCTTTTAACCGCTCCCTTAGGAGAAAGACAGATAGCTTCTTACCCGTACTCCACCGTTGGCAGCACGATCGCATGTCCCACGTGAACCATTGGTAAACCCTGTGGCCTGTGAGCGACAAAAGCTTTAATGGGAAATTCGCGCCCATAACTTGGTCCGAATACGGGTCCTAGCAACGTTCGTCTGAGTTTGATCTATATAATACGGGCGGTATGTCTGCTTTGATCAACCTCCAATAGCTCGTATGATAGTGCACCCGCTGGTGATCACTCAATGATCTGGGCTCCCCGTTGCAACT [...]
+>query7 matches the end of 2+ and the start of 8+ (has a 2000 bp insert)
+TAACGCTCATCAGCTAACGAAAGAGTTAGAGGCTCGCTAAATCGCACTGTCGGGGTCCCTTGGGTATTTTACACTAGCGTCAGGTAGGCTAGCATGTGTCTTTCCTTCCAGGGGTATGCGGGTGCGTGGACAAATGAGCAGCATACGTATTTACTCGGCGTGCTTGGTCTCTCGTATTTCTCCTGGAGATCAAGGAAATGTTTCATGTCCAAGCGAAAAGCCGCTCTACGGAATGGATCTACGTTACTGCCTGCATAAGGAGACCGGTGTAGCCAAGGACGAAAGCGACCCTAGGTTCTAACCGTCGACTTTGGCGGAAAGGTTTCACTCAGGAAGCAGACACTGATTGACACGGTTTAGCAGAACGTTTGAGGACTAGGTCAAATTGAGTGGTTTAATATCGGCATGTCTGGCTTTAAAATTCAGTATAGTGCGCTGATCGGAGACGAATTAAAAACACGAGTTCCCAAAACCAGGCGGGCTCGCCACGTC [...]
diff --git a/tests/test_query_paths.gfa b/tests/test_query_paths.gfa
new file mode 100644
index 0000000..a53541a
--- /dev/null
+++ b/tests/test_query_paths.gfa
@@ -0,0 +1,15 @@
+S 1 GAGCCGAGGGGTAACCACGATGCCGCTAAGAACCTCTCGGTCGACGCAAGCGATTACACTCCTGTCACATCATAATCGTTTGCTATTCAGGGGTTGACCAACACCGGAAAACTTTTCACTTGAAGTATTGTATACGACAGGGTGCGTGTACCTACCAAACCTGTTTAAACTAAGTTCAGACTAGTTGGAAGTGTGTCTAGATCTTAGTTTTCGTCACTAGAGGGCCCACGCTTTATTTTTATGATCCATTGATCTCCCAGACGCTGCAAGATTTGCAACCAGGCAGACTTGGCGGTAGGTCCTAGTGCAGCGGGACTTTTTTTCTATAGTCCTTGAGAGGAGGAGTCGTCAGTCCAGATACCTTTGATGTCCTGATTGGAAGGACCGTTGGCCCCCCACCCTTAGGCAGTGTACTCAGTTCCATAAACGAGCTATTAGATATGAGGTCCGTAGATTGAAAAGGGTGACGGAATTCGCCCGAACGGGAA [...]
+S 2 GGTCCCCCCGAGCGGTGCAACCGATTAGGACCATGTAGAACATTAGTTATAAGTCTTCTTTTAAACACAATCTTCCTGCTCAGTGGTACATGGTTATCGTTATTGCTAGCCAGCCTGATAAGTAACACCACCACTGCGACCCTAATGCGCCCTTTCCACGAACACAGGGCTGTCCGATCCTATATTACGACTCCGGGAAGGGGTTCGCAAGTCGCACCCTAAACGATGTTGAAGGCTCAGGATGTACACGCACTAGTACAATACATACGTGTTCCGGCTCTTATCCTGCATCGGAAGCTCAATCATGCATCGCACCAGCGTGTTCGTGTCATCTAGGAGGGGCGCGTAGGATAAATAATTCAATTAAGATATCGTTATGCTAGTATACGCCTACCCGTCACCGGCCAACAGTGTGCAGATGGCGCCACGAGTTACTGGCCCTGATTTCTCCGCTTCTAATACCGCACACTGGGCAATACGAGCTCAAG [...]
+S 3 CTGGTACATTATGTGAACAATGTTCTGAAGAAAATTTGTGAAAGAAGGACGGGTCATCGCCTACTATTAGCAACAACGGTCGGCCACACCTTCCATTGTCGTGGCCACGCTCGGATTACACGGCAGAGGTGCTTGTGTTCCGACAGGCTAGCATATTATCCTAAGGCGTTACCCCAATCGTTTACCGTCGGATTTGCTATAGCCCCTGAACGCTACATGTACGAAACCATGTTATGTATGCACTAGGTCAACAATAGGACATAGCCTTGTAGTTAACACGTAGCCCGGTCGTATAAGTACAGTAGACCCTTCGCCGGCATCCTATTTATTAAGTTATTTCTACAGCAAAACGATCATATGCAGATCCGCAGTGGGCGGTAGACACACGTCCACCCGGCTGCTCTGTAACAGGGACTAAAGAGGTGATGATTATCGTGTGTGCCCCGTTATGGTCGTGTTCGATCAGAGCGCCCTTGCGAGCAGTCGTA [...]
+S 4 GACTAGCCGCTGGTAAACACACCATGACCCCGGCTCTCCATTGATGCCACGGCGATTGTTGGAGAGCCAGCAGCGACTGCAAACATCAGATCAGAGTAATACTAGCATGCGATAAGTCCCTAACTGACTATGGCCTTCTGTAGAGTCAACTTCACCACATATGCTGTCTCTGGCACGTGGATGGTTTAGAGGAATCAGATTCAAGTCTGGTTAACCATCAAACAGGTCTTGAGTCTAAAATTGTCGTCTCCTGCGTACGAGATGGAAATACTAGGTAACTACAGGGACTCCGACGTTATGTACGTTGCTCCGTCAGAGGCGCCATTCAGGATCACGTTACCGCGAAAAAAAGGGACCAGGAGCTCTTCTCCCCTGCGGTCACGTCTATAGAAATTACACCATTAACCCTCCTGAGAACCGGGAGGCGGGAATCCGTCACGTATGAGAAGGTATTTGCCCGATAATCAATACCCCAGGCTTCTAACTTT [...]
+S 5 TCTTATAAATTCTTTTTTCGTGGGGAGCAGCGGATCTTAATGGATGGCGCCAGCTGGTATGGAAGCTAATAGCGCCGGTGAGAGGGTAATCAGCCGTCTCCACCAACACAACGCTATCGGGTCATATTATAAGATTCCGCAATGGGACTACTTATAGGTTGCCTTAACGATATCCGCAACTTGCGATGTGCCTGCTATGCTTAAATACATACCTCGCCCAGTAGCTTTCCAATATGGGAACATCAATTGTACATCGGGCCGGGATAATCATGTCGTCACGGAACTTACTGTAAGAGTAATAATTCAAAAGAGATGTCGGTTTGCTAGTTCACGTAAAGGTGCCTCGCGCCACCTCTAAGTAAGTGAGCCGTCGAGACATTATCCCTGATTTTCTCACTACTATTAGTACTCACGGCGCAATACCACCACAGCCTTGTCTCGCCAGAATGCCGGTCAGCATATGGAAGAGCTCAAGGCAGGTCAATTCG [...]
+S 6 TCGCCTAGAATTACCTACCGGCGTCCACCATACCTTCGATATTCGCGCCCACTCTCCCATTAGTCGGCACAAGTGGATGTGTTGCGATTGCCCGCTAAGATATTCTAAGGCGTAACGCAGATGAATATTCTACAGAGTTGCCGTACGCGTTGAACACTTCACGGATGATAGGAATTTGCGTATAGAGCGGGTCATTGAAGGGTTATACACTCGTAGTTAACAACGGGCCCGGCTCTATCAGAACACGAGTGCCTTGAATAACATACTCATCACTAAACTTTCTCAACAGTCAATCGAGCAAGTCCATTACCAAGGAGTGCGATGCAGTTTTATTCTCTCGCCAGCACTGTAATAGGCACTAAAAGAGTGATGATAATCATGAGTGCTGAGCTAAGACGGCGTCGGTACATAGCGGTCTTACGGTCAGTCGTAATTCCTCACGAGTCCCGTCCAGTTGAGCGTATCACTCCCAATGTACAAGCAACCCG [...]
+S 7 TTTAAAACGACTACCAAATCCGCATGTTAGGGGATTTCTTATTAATTCTTTTATCGTGAGGAACAGCGGATCTTAATGGATGGCCGCAGGTGGTATGGAAGCTAATAGCGCGGGTGAGAGGGTAATCAGCCGTGTTCACCTACACAACGCTAACGGGCGATTCTATAAGATTCCGCATTGCGTCTACTTATAAGATGTCTCAACGGTATCCGCAACTTGTGAAGTGCCTACTATCCTTAAACGCATATCTCGCCCAGTAGCTTCCCAATATGTGAGCATCAATTGTTGTCCGGGCCGAGATAGTCATGTGCTCACGGAACTTACTGTATGAGTAGTGATTTGAAAGAGTTGTCAGTTTGCTGGTTCAGGTAAAGGTTCCTCACGCTACCTCAAAGTAAGAGAGCGGTCGTGACATTATCCGTGATTTTCTCACTACTATTAGTACTCACGACTCGATTCTGCCGCAGCCATGTTTCGCCAGAATGCCA [...]
+S 8 GCATGGAGGCAAACGCAGAACAATGGTTACTATTTCGATACGTGAAACATGTCCCACGGTAGCCCAAAGACTTAAGAGTCTATCACCCCTAGGGCCCTTTCCCGGATATAAACGCCAGGTTGAATCCGCATTTGGAGCTACGATGGATGAGTCTGGGTGGAGCGCGCCCCATTTATACCGTGAGTAGGGTCGACCAAGAACCGCAAGATGCGTCGGTGTACAAATAATTGTCAACAGACCGTCGTGTTTTGAAAATGGTACCAGCATCTTCGGGCGGTCTCAATCAAGCATGGATTACGGTGTTTACTCTGTCCTGCGGTTACCCATGGCCTGTAATCCAGCTCGAGTCAAGCCATTGCCTCTCTGGGACGCCGCATGAACTAATACGTATACTTTGCACGGGTTCACTGCGGTCCGTTCAGAGTCGACCAAGGACACAATCGAGCTCCCATCTGTATGCTCGACTAACTTGTACCCAACCCCCGGAG [...]
+L 1 + 4 + 0M
+L 2 + 4 + 0M
+L 1 + 3 + 0M
+L 4 + 5 + 0M
+L 4 + 6 + 0M
+L 6 + 7 + 0M
+L 6 + 8 + 0M
diff --git a/ui/aboutdialog.cpp b/ui/aboutdialog.cpp
new file mode 100644
index 0000000..a9d3e56
--- /dev/null
+++ b/ui/aboutdialog.cpp
@@ -0,0 +1,48 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage.
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "aboutdialog.h"
+#include "ui_aboutdialog.h"
+#include <QApplication>
+
+AboutDialog::AboutDialog(QWidget *parent) :
+ QDialog(parent, Qt::WindowTitleHint | Qt::WindowCloseButtonHint),
+ ui(new Ui::AboutDialog)
+{
+ ui->setupUi(this);
+
+ QPixmap icon = *(ui->iconLabel->pixmap());
+ icon.setDevicePixelRatio(devicePixelRatio());
+ ui->iconLabel->setPixmap(icon);
+
+ //Make the word 'Bandage' a larger font size.
+ QFont font;
+ font.setPointSize(font.pointSize() * 2);
+ ui->titleLabel->setFont(font);
+
+ QString versionCopyrightText = "<html><head/><body><p>Version: " + QApplication::applicationVersion() + "</p><p>Copyright 2016 Ryan Wick</p><p><a href=\"http://rrwick.github.io/Bandage/\"><span style=\" text-decoration: underline; color:#0000ff;\">http://rrwick.github.io/Bandage/</span></a></p></body></html>";
+ ui->versionCopyrightLabel->setText(versionCopyrightText);
+
+ layout()->setSizeConstraint(QLayout::SetFixedSize);
+}
+
+
+AboutDialog::~AboutDialog()
+{
+ delete ui;
+}
diff --git a/ui/aboutdialog.h b/ui/aboutdialog.h
new file mode 100644
index 0000000..0ede33c
--- /dev/null
+++ b/ui/aboutdialog.h
@@ -0,0 +1,42 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage.
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef ABOUTDIALOG_H
+#define ABOUTDIALOG_H
+
+#include <QDialog>
+
+
+namespace Ui {
+class AboutDialog;
+}
+
+class AboutDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit AboutDialog(QWidget *parent = 0);
+ ~AboutDialog();
+
+private:
+ Ui::AboutDialog *ui;
+};
+
+
+#endif // ABOUTDIALOG_H
diff --git a/ui/aboutdialog.ui b/ui/aboutdialog.ui
new file mode 100644
index 0000000..40123f5
--- /dev/null
+++ b/ui/aboutdialog.ui
@@ -0,0 +1,215 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>AboutDialog</class>
+ <widget class="QDialog" name="AboutDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>527</width>
+ <height>510</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>About Bandage</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="spacing">
+ <number>12</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QLabel" name="iconLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>128</horstretch>
+ <verstretch>128</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>185</width>
+ <height>173</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>128</width>
+ <height>128</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="pixmap">
+ <pixmap resource="../images/images.qrc">:/icons/icon.png</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QLabel" name="titleLabel">
+ <property name="text">
+ <string>Bandage</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="versionCopyrightLabel">
+ <property name="minimumSize">
+ <size>
+ <width>300</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>300</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="text">
+ <string><html><head/><body><p>Version: xxx</p><p>Copyright 2016 Ryan Wick</p><p><a href="http://rrwick.github.io/Bandage/"><span style=" text-decoration: underline; color:#0000ff;">http://rrwick.github.io/Bandage/</span></a></p></body></html></string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ <property name="openExternalLinks">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="aboutLabel">
+ <property name="minimumSize">
+ <size>
+ <width>300</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>300</width>
+ <height>16777215</height>
+ </size>
+ </property>
+ <property name="text">
+ <string><html><head/><body><p>Bandage is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.</p><p></p><p>Bandage is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A P [...]
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ <property name="openExternalLinks">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Close</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources>
+ <include location="../images/images.qrc"/>
+ </resources>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>AboutDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>AboutDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/ui/blasthitfiltersdialog.cpp b/ui/blasthitfiltersdialog.cpp
new file mode 100644
index 0000000..d219c4e
--- /dev/null
+++ b/ui/blasthitfiltersdialog.cpp
@@ -0,0 +1,151 @@
+#include "blasthitfiltersdialog.h"
+#include "ui_blasthitfiltersdialog.h"
+
+#include "../program/globals.h"
+#include "../program/settings.h"
+
+BlastHitFiltersDialog::BlastHitFiltersDialog(QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::BlastHitFiltersDialog)
+{
+ ui->setupUi(this);
+
+ setInfoTexts();
+
+ connect(ui->alignmentLengthCheckBox, SIGNAL(toggled(bool)), this, SLOT(checkBoxesChanged()));
+ connect(ui->queryCoverageCheckBox, SIGNAL(toggled(bool)), this, SLOT(checkBoxesChanged()));
+ connect(ui->identityCheckBox, SIGNAL(toggled(bool)), this, SLOT(checkBoxesChanged()));
+ connect(ui->eValueCheckBox, SIGNAL(toggled(bool)), this, SLOT(checkBoxesChanged()));
+ connect(ui->bitScoreCheckBox, SIGNAL(toggled(bool)), this, SLOT(checkBoxesChanged()));
+}
+
+BlastHitFiltersDialog::~BlastHitFiltersDialog()
+{
+ delete ui;
+}
+
+
+void BlastHitFiltersDialog::checkBoxesChanged()
+{
+ ui->alignmentLengthSpinBox->setEnabled(ui->alignmentLengthCheckBox->isChecked());
+
+ ui->queryCoverageSpinBox->setEnabled(ui->queryCoverageCheckBox->isChecked());
+
+ ui->identitySpinBox->setEnabled(ui->identityCheckBox->isChecked());
+
+ ui->eValueCoefficientSpinBox->setEnabled(ui->eValueCheckBox->isChecked());
+ ui->eValueExponentSpinBox->setEnabled(ui->eValueCheckBox->isChecked());
+
+ ui->bitScoreSpinBox->setEnabled(ui->bitScoreCheckBox->isChecked());
+}
+
+
+void setSpinBoxValMinAndMax(QSpinBox * spinBox, IntSetting setting)
+{
+ spinBox->setValue(setting.val);
+ spinBox->setMinimum(setting.min);
+ spinBox->setMaximum(setting.max);
+}
+
+void setSpinBoxValMinAndMax(QDoubleSpinBox * spinBox, FloatSetting setting)
+{
+ spinBox->setValue(setting.val);
+ spinBox->setMinimum(setting.min);
+ spinBox->setMaximum(setting.max);
+}
+
+void BlastHitFiltersDialog::setWidgetsFromSettings()
+{
+ ui->alignmentLengthCheckBox->setChecked(g_settings->blastAlignmentLengthFilter.on);
+ ui->queryCoverageCheckBox->setChecked(g_settings->blastQueryCoverageFilter.on);
+ ui->identityCheckBox->setChecked(g_settings->blastIdentityFilter.on);
+ ui->eValueCheckBox->setChecked(g_settings->blastEValueFilter.on);
+ ui->bitScoreCheckBox->setChecked(g_settings->blastBitScoreFilter.on);
+
+ setSpinBoxValMinAndMax(ui->alignmentLengthSpinBox, g_settings->blastAlignmentLengthFilter);
+ setSpinBoxValMinAndMax(ui->queryCoverageSpinBox, g_settings->blastQueryCoverageFilter);
+ setSpinBoxValMinAndMax(ui->identitySpinBox, g_settings->blastIdentityFilter);
+ setSpinBoxValMinAndMax(ui->bitScoreSpinBox, g_settings->blastBitScoreFilter);
+
+ ui->eValueCoefficientSpinBox->setValue(g_settings->blastEValueFilter.val.getCoefficient());
+ ui->eValueExponentSpinBox->setValue(g_settings->blastEValueFilter.val.getExponent());
+
+ checkBoxesChanged();
+}
+
+
+void BlastHitFiltersDialog::setSettingsFromWidgets()
+{
+ g_settings->blastAlignmentLengthFilter.on = ui->alignmentLengthCheckBox->isChecked();
+ g_settings->blastQueryCoverageFilter.on = ui->queryCoverageCheckBox->isChecked();
+ g_settings->blastIdentityFilter.on = ui->identityCheckBox->isChecked();
+ g_settings->blastEValueFilter.on = ui->eValueCheckBox->isChecked();
+ g_settings->blastBitScoreFilter.on = ui->bitScoreCheckBox->isChecked();
+
+ g_settings->blastAlignmentLengthFilter.val = ui->alignmentLengthSpinBox->value();
+ g_settings->blastQueryCoverageFilter.val = ui->queryCoverageSpinBox->value();
+ g_settings->blastIdentityFilter.val = ui->identitySpinBox->value();
+ g_settings->blastEValueFilter.val = SciNot(ui->eValueCoefficientSpinBox->value(), ui->eValueExponentSpinBox->value());
+ g_settings->blastBitScoreFilter.val = ui->bitScoreSpinBox->value();
+}
+
+
+QString BlastHitFiltersDialog::getFilterText()
+{
+ QString filterText;
+ if (g_settings->blastAlignmentLengthFilter.on)
+ {
+ if (filterText.length() > 0)
+ filterText += ", ";
+ filterText += "alignment length: " + QString::number(g_settings->blastAlignmentLengthFilter);
+ }
+ if (g_settings->blastQueryCoverageFilter.on)
+ {
+ if (filterText.length() > 0)
+ filterText += ", ";
+ filterText += "query coverage: " + QString::number(g_settings->blastQueryCoverageFilter) + "%";
+ }
+ if (g_settings->blastIdentityFilter.on)
+ {
+ if (filterText.length() > 0)
+ filterText += ", ";
+ filterText += "identity: " + QString::number(g_settings->blastIdentityFilter) + "%";
+ }
+ if (g_settings->blastEValueFilter.on)
+ {
+ if (filterText.length() > 0)
+ filterText += ", ";
+ filterText += "e-value: " + g_settings->blastEValueFilter.val.asString(true);
+ }
+ if (g_settings->blastBitScoreFilter.on)
+ {
+ if (filterText.length() > 0)
+ filterText += ", ";
+ filterText += "bit score: " + QString::number(g_settings->blastBitScoreFilter);
+ }
+
+ if (filterText == "")
+ filterText = "none";
+
+ return filterText;
+}
+
+
+void BlastHitFiltersDialog::setInfoTexts()
+{
+ ui->alignmentLengthInfoText->setInfoText("This filter will exclude any BLAST hits with an alignment length shorter than the "
+ "specified value. I.e. only hits with an alignment length greater than or equal to "
+ "the value will be included in BLAST results.");
+ ui->queryCoverageInfoText->setInfoText("This filter will exclude any BLAST hits with a query coverage less than the "
+ "specified value. I.e. only hits with a query coverage greater than or equal to "
+ "the value will be included in BLAST results.");
+ ui->identityInfoText->setInfoText("This filter will exclude any BLAST hits with an identity less than the "
+ "specified value. I.e. only hits with an identity greater than or equal to "
+ "the value will be included in BLAST results.");
+ ui->eValueInfoText->setInfoText("This filter will exclude any BLAST hits with an e-value greater than the "
+ "specified value. I.e. only hits with an e-value less than or equal to "
+ "the value will be included in BLAST results.");
+ ui->bitScoreInfoText->setInfoText("This filter will exclude any BLAST hits with a bit score length less than the "
+ "specified value. I.e. only hits with a bit score greater than or equal to "
+ "the value will be included in BLAST results.");
+}
diff --git a/ui/blasthitfiltersdialog.h b/ui/blasthitfiltersdialog.h
new file mode 100644
index 0000000..ab22603
--- /dev/null
+++ b/ui/blasthitfiltersdialog.h
@@ -0,0 +1,32 @@
+#ifndef BLASTHITFILTERSDIALOG_H
+#define BLASTHITFILTERSDIALOG_H
+
+#include <QDialog>
+
+namespace Ui {
+class BlastHitFiltersDialog;
+}
+
+class BlastHitFiltersDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit BlastHitFiltersDialog(QWidget *parent = 0);
+ ~BlastHitFiltersDialog();
+
+ void setWidgetsFromSettings();
+ void setSettingsFromWidgets();
+
+ static QString getFilterText();
+
+private:
+ Ui::BlastHitFiltersDialog *ui;
+
+ void setInfoTexts();
+
+private slots:
+ void checkBoxesChanged();
+};
+
+#endif // BLASTHITFILTERSDIALOG_H
diff --git a/ui/blasthitfiltersdialog.ui b/ui/blasthitfiltersdialog.ui
new file mode 100644
index 0000000..3f977bf
--- /dev/null
+++ b/ui/blasthitfiltersdialog.ui
@@ -0,0 +1,357 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>BlastHitFiltersDialog</class>
+ <widget class="QDialog" name="BlastHitFiltersDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>334</width>
+ <height>323</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>BLAST hit filters</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="5" column="1">
+ <widget class="InfoTextWidget" name="eValueInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="InfoTextWidget" name="alignmentLengthInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="InfoTextWidget" name="queryCoverageInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="3">
+ <widget class="QWidget" name="widget" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QDoubleSpinBox" name="eValueCoefficientSpinBox">
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="maximum">
+ <double>9.990000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QSpinBox" name="eValueExponentSpinBox">
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="prefix">
+ <string>e</string>
+ </property>
+ <property name="minimum">
+ <number>-999</number>
+ </property>
+ <property name="maximum">
+ <number>1</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="InfoTextWidget" name="identityInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="1">
+ <widget class="InfoTextWidget" name="bitScoreInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="4" column="3">
+ <widget class="QDoubleSpinBox" name="identitySpinBox">
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="suffix">
+ <string>%</string>
+ </property>
+ <property name="maximum">
+ <double>100.000000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="2">
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="2">
+ <spacer name="verticalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="6" column="2">
+ <widget class="QCheckBox" name="bitScoreCheckBox">
+ <property name="text">
+ <string>Bit score:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3">
+ <widget class="QSpinBox" name="alignmentLengthSpinBox">
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="maximum">
+ <number>1000000</number>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="4">
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="3" column="3">
+ <widget class="QDoubleSpinBox" name="queryCoverageSpinBox">
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="suffix">
+ <string>%</string>
+ </property>
+ <property name="maximum">
+ <double>100.000000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2">
+ <widget class="QCheckBox" name="queryCoverageCheckBox">
+ <property name="text">
+ <string>Query coverage:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="2">
+ <widget class="QCheckBox" name="eValueCheckBox">
+ <property name="text">
+ <string>E-value:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QCheckBox" name="alignmentLengthCheckBox">
+ <property name="text">
+ <string>Alignment length:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="9" column="0" colspan="5">
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="2">
+ <widget class="QCheckBox" name="identityCheckBox">
+ <property name="text">
+ <string>Identity:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" colspan="5">
+ <widget class="QLabel" name="filterDescriptionLabel">
+ <property name="text">
+ <string>Turn on one or more of these filters to exclude BLAST hits which fail to meet the defined threshold. To see the effects of changing these filters, it is necessary to rerun the BLAST search.</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="3">
+ <widget class="QDoubleSpinBox" name="bitScoreSpinBox">
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="decimals">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <double>1000000.000000000000000</double>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>InfoTextWidget</class>
+ <extends>QWidget</extends>
+ <header>infotextwidget.h</header>
+ <container>1</container>
+ </customwidget>
+ </customwidgets>
+ <tabstops>
+ <tabstop>alignmentLengthCheckBox</tabstop>
+ <tabstop>alignmentLengthSpinBox</tabstop>
+ <tabstop>queryCoverageCheckBox</tabstop>
+ <tabstop>queryCoverageSpinBox</tabstop>
+ <tabstop>identityCheckBox</tabstop>
+ <tabstop>identitySpinBox</tabstop>
+ <tabstop>eValueCheckBox</tabstop>
+ <tabstop>eValueCoefficientSpinBox</tabstop>
+ <tabstop>eValueExponentSpinBox</tabstop>
+ <tabstop>bitScoreCheckBox</tabstop>
+ </tabstops>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>BlastHitFiltersDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>BlastHitFiltersDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/ui/blastsearchdialog.cpp b/ui/blastsearchdialog.cpp
new file mode 100644
index 0000000..e8ef411
--- /dev/null
+++ b/ui/blastsearchdialog.cpp
@@ -0,0 +1,1052 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "blastsearchdialog.h"
+#include "ui_blastsearchdialog.h"
+
+#include <QFileDialog>
+#include <QFile>
+#include <QTextStream>
+#include <QString>
+#include "../blast/blasthit.h"
+#include "../blast/blastquery.h"
+#include <QStandardItemModel>
+#include "../program/globals.h"
+#include "../program/settings.h"
+#include "../program/memory.h"
+#include "../graph/debruijnnode.h"
+#include <QMessageBox>
+#include <QDir>
+#include "enteroneblastquerydialog.h"
+#include "../graph/assemblygraph.h"
+#include "../blast/blastsearch.h"
+#include <QProcessEnvironment>
+#include <QMessageBox>
+#include <QThread>
+#include "../blast/buildblastdatabaseworker.h"
+#include "../blast/runblastsearchworker.h"
+#include "myprogressdialog.h"
+#include "colourbutton.h"
+#include <QSet>
+#include "tablewidgetitemname.h"
+#include "tablewidgetitemint.h"
+#include "tablewidgetitemdouble.h"
+#include "tablewidgetitemshown.h"
+#include <QCheckBox>
+#include "querypathspushbutton.h"
+#include "querypathsdialog.h"
+#include "blasthitfiltersdialog.h"
+
+BlastSearchDialog::BlastSearchDialog(QWidget *parent, QString autoQuery) :
+ QDialog(parent),
+ ui(new Ui::BlastSearchDialog),
+ m_makeblastdbCommand("makeblastdb"), m_blastnCommand("blastn"),
+ m_tblastnCommand("tblastn"), m_queryPathsDialog(0)
+{
+ ui->setupUi(this);
+
+ setWindowFlags(windowFlags() | Qt::Tool);
+
+ ui->blastHitsTableWidget->m_smallFirstColumn = true;
+ ui->blastQueriesTableWidget->m_smallFirstColumn = true;
+ ui->blastQueriesTableWidget->m_smallSecondColumn = true;
+
+ setFilterText();
+
+ //Load any previous parameters the user might have entered when previously using this dialog.
+ ui->parametersLineEdit->setText(g_settings->blastSearchParameters);
+
+ //If the dialog is given an autoQuery parameter, then it will
+ //carry out the entire process on its own.
+ if (autoQuery != "")
+ {
+ buildBlastDatabase(false);
+ clearAllQueries();
+ loadBlastQueriesFromFastaFile(autoQuery);
+ runBlastSearches(false);
+ QMetaObject::invokeMethod(this, "close", Qt::QueuedConnection);
+ return;
+ }
+
+ //Prepare the query and hits tables
+ ui->blastHitsTableWidget->setHorizontalHeaderLabels(QStringList() << "" << "Query\nname" << "Node\nname" <<
+ "Percent\nidentity" << "Alignment\nlength" << "Query\ncover" << "Mis-\nmatches" <<
+ "Gap\nopens" << "Query\nstart" << "Query\nend" << "Node\nstart" <<
+ "Node\nend" <<"E-\nvalue" << "Bit\nscore");
+ QFont font = ui->blastQueriesTableWidget->horizontalHeader()->font();
+ font.setBold(true);
+ ui->blastQueriesTableWidget->horizontalHeader()->setFont(font);
+ ui->blastHitsTableWidget->horizontalHeader()->setFont(font);
+
+
+ //If a BLAST database already exists, move to step 2.
+ QFile databaseFile(g_blastSearch->m_tempDirectory + "all_nodes.fasta");
+ if (databaseFile.exists())
+ setUiStep(BLAST_DB_BUILT_BUT_NO_QUERIES);
+
+ //If there isn't a BLAST database, clear the entire temporary directory
+ //and move to step 1.
+ else
+ {
+ g_blastSearch->emptyTempDirectory();
+ setUiStep(BLAST_DB_NOT_YET_BUILT);
+ }
+
+ //If queries already exist, display them and move to step 3.
+ if (g_blastSearch->m_blastQueries.m_queries.size() > 0)
+ {
+ fillQueriesTable();
+ setUiStep(READY_FOR_BLAST_SEARCH);
+ }
+
+ //If results already exist, display them and move to step 4.
+ if (g_blastSearch->m_allHits.size() > 0)
+ {
+ fillHitsTable();
+ setUiStep(BLAST_SEARCH_COMPLETE);
+ }
+
+ //Call this function to disable rows in either table that are for queries
+ //the user has hidden.
+ queryShownChanged();
+
+ setInfoTexts();
+
+ connect(ui->buildBlastDatabaseButton, SIGNAL(clicked()), this, SLOT(buildBlastDatabaseInThread()));
+ connect(ui->loadQueriesFromFastaButton, SIGNAL(clicked()), this, SLOT(loadBlastQueriesFromFastaFileButtonClicked()));
+ connect(ui->enterQueryManuallyButton, SIGNAL(clicked()), this, SLOT(enterQueryManually()));
+ connect(ui->clearAllQueriesButton, SIGNAL(clicked()), this, SLOT(clearAllQueries()));
+ connect(ui->clearSelectedQueriesButton, SIGNAL(clicked(bool)), this, SLOT(clearSelectedQueries()));
+ connect(ui->runBlastSearchButton, SIGNAL(clicked()), this, SLOT(runBlastSearchesInThread()));
+ connect(ui->blastQueriesTableWidget, SIGNAL(cellChanged(int,int)), this, SLOT(queryCellChanged(int,int)));
+ connect(ui->blastQueriesTableWidget, SIGNAL(itemSelectionChanged()), this, SLOT(queryTableSelectionChanged()));
+ connect(ui->blastFiltersButton, SIGNAL(clicked(bool)), this, SLOT(openFiltersDialog()));
+}
+
+BlastSearchDialog::~BlastSearchDialog()
+{
+ delete ui;
+ deleteQueryPathsDialog();
+}
+
+
+
+void BlastSearchDialog::afterWindowShow()
+{
+ ui->blastQueriesTableWidget->resizeColumns();
+ ui->blastHitsTableWidget->resizeColumns();
+}
+
+void BlastSearchDialog::clearBlastHits()
+{
+ g_blastSearch->clearBlastHits();
+ deleteQueryPathsDialog();
+ ui->blastHitsTableWidget->clearContents();
+ while (ui->blastHitsTableWidget->rowCount() > 0)
+ ui->blastHitsTableWidget->removeRow(0);
+}
+
+void BlastSearchDialog::fillTablesAfterBlastSearch()
+{
+ if (g_blastSearch->m_allHits.empty())
+ QMessageBox::information(this, "No hits", "No BLAST hits were found for the given queries and parameters.");
+
+ fillQueriesTable();
+ fillHitsTable();
+}
+
+
+void BlastSearchDialog::fillQueriesTable()
+{
+ //Turn off table widget signals for this function so the
+ //queryCellChanged slot doesn't get called.
+ ui->blastQueriesTableWidget->blockSignals(true);
+ ui->blastQueriesTableWidget->setSortingEnabled(false);
+
+ ui->blastQueriesTableWidget->clearContents();
+
+ int queryCount = int(g_blastSearch->m_blastQueries.m_queries.size());
+ if (queryCount == 0)
+ return;
+
+ ui->blastQueriesTableWidget->setRowCount(queryCount);
+
+ for (int i = 0; i < queryCount; ++i)
+ makeQueryRow(i);
+
+ ui->blastQueriesTableWidget->resizeColumns();
+ ui->blastQueriesTableWidget->setSortingEnabled(true);
+
+ ui->blastQueriesTableWidget->setSortingEnabled(true);
+ ui->blastQueriesTableWidget->blockSignals(false);
+}
+
+void BlastSearchDialog::makeQueryRow(int row)
+{
+ if (row >= int(g_blastSearch->m_blastQueries.m_queries.size()))
+ return;
+
+ BlastQuery * query = g_blastSearch->m_blastQueries.m_queries[row];
+
+ TableWidgetItemName * name = new TableWidgetItemName(query);
+ name->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable);
+
+ QTableWidgetItem * type = new QTableWidgetItem(query->getTypeString());
+ type->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+
+ int queryLength = query->getLength();
+ TableWidgetItemInt * length = new TableWidgetItemInt(formatIntForDisplay(queryLength), queryLength);
+ length->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+
+ //If the search hasn't yet been run, some of the columns will just have
+ //a dash.
+ TableWidgetItemInt * hits;
+ TableWidgetItemDouble * percent;
+ QTableWidgetItem * paths;
+
+ QueryPathsPushButton * pathsButton = 0;
+ if (query->wasSearchedFor())
+ {
+ int hitCount = query->hitCount();
+ hits = new TableWidgetItemInt(formatIntForDisplay(hitCount), hitCount);
+ percent = new TableWidgetItemDouble(formatDoubleForDisplay(100.0 * query->fractionCoveredByHits(), 2) + "%", query->fractionCoveredByHits());
+
+ //The path count isn't displayed in the TableWidgetItem because it will
+ //be shown in a button which will bring up a separate dialog showing a
+ //table of the paths.
+ int pathCount = query->getPathCount();
+ paths = new TableWidgetItemInt("", pathCount);
+ paths->setFlags(Qt::ItemIsEnabled);
+ pathsButton = new QueryPathsPushButton(pathCount, query);
+ connect(pathsButton, SIGNAL(showPathsDialog(BlastQuery*)), this, SLOT(showPathsDialog(BlastQuery*)));
+ }
+ else
+ {
+ hits = new TableWidgetItemInt("-", 0);
+ percent = new TableWidgetItemDouble("-", 0.0);
+ paths = new QTableWidgetItem("-");
+ }
+
+ hits->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+ percent->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+ paths->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+
+ QTableWidgetItem * colour = new QTableWidgetItem(query->getColour().name());
+ ColourButton * colourButton = new ColourButton();
+ colourButton->setColour(query->getColour());
+ connect(colourButton, SIGNAL(colourChosen(QColor)), query, SLOT(setColour(QColor)));
+ connect(colourButton, SIGNAL(colourChosen(QColor)), this, SLOT(fillHitsTable()));
+
+ QWidget * showCheckBoxWidget = new QWidget;
+ QCheckBox * showCheckBox = new QCheckBox();
+ QHBoxLayout * layout = new QHBoxLayout(showCheckBoxWidget);
+ layout->addWidget(showCheckBox);
+ layout->setAlignment(Qt::AlignCenter);
+ layout->setContentsMargins(0, 0, 0, 0);
+ showCheckBoxWidget->setLayout(layout);
+ bool queryShown = query->isShown();
+ showCheckBox->setChecked(queryShown);
+ QTableWidgetItem * show = new TableWidgetItemShown(queryShown);
+ show->setFlags(Qt::ItemIsEnabled);
+ connect(showCheckBox, SIGNAL(toggled(bool)), query, SLOT(setShown(bool)));
+ connect(showCheckBox, SIGNAL(toggled(bool)), this, SLOT(queryShownChanged()));
+
+ ui->blastQueriesTableWidget->setCellWidget(row, 0, colourButton);
+ ui->blastQueriesTableWidget->setCellWidget(row, 1, showCheckBoxWidget);
+ ui->blastQueriesTableWidget->setItem(row, 0, colour);
+ ui->blastQueriesTableWidget->setItem(row, 1, show);
+ ui->blastQueriesTableWidget->setItem(row, 2, name);
+ ui->blastQueriesTableWidget->setItem(row, 3, type);
+ ui->blastQueriesTableWidget->setItem(row, 4, length);
+ ui->blastQueriesTableWidget->setItem(row, 5, hits);
+ ui->blastQueriesTableWidget->setItem(row, 6, percent);
+ ui->blastQueriesTableWidget->setItem(row, 7, paths);
+ if (pathsButton != 0)
+ ui->blastQueriesTableWidget->setCellWidget(row, 7, pathsButton);
+}
+
+
+void BlastSearchDialog::fillHitsTable()
+{
+ ui->blastHitsTableWidget->clearContents();
+ ui->blastHitsTableWidget->setSortingEnabled(false);
+
+ int hitCount = g_blastSearch->m_allHits.size();
+ ui->blastHitsTableWidget->setRowCount(hitCount);
+
+ if (hitCount == 0)
+ return;
+
+ for (int i = 0; i < hitCount; ++i)
+ {
+ BlastHit * hit = g_blastSearch->m_allHits[i].data();
+ BlastQuery * hitQuery = hit->m_query;
+
+ QTableWidgetItem * queryColour = new QTableWidgetItem(hitQuery->getColour().name());
+ queryColour->setFlags(Qt::ItemIsEnabled);
+ queryColour->setBackground(hitQuery->getColour());
+
+ QTableWidgetItem * queryName = new QTableWidgetItem(hitQuery->getName());
+ queryName->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+
+ QTableWidgetItem * nodeName = new QTableWidgetItem(hit->m_node->getName());
+ nodeName->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+
+ TableWidgetItemDouble * percentIdentity = new TableWidgetItemDouble(formatDoubleForDisplay(hit->m_percentIdentity, 2) + "%", hit->m_percentIdentity);
+ percentIdentity->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+
+ TableWidgetItemInt * alignmentLength = new TableWidgetItemInt(formatIntForDisplay(hit->m_alignmentLength), hit->m_alignmentLength);
+ alignmentLength->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+
+ double queryCoverPercent = 100.0 * hit->getQueryCoverageFraction();
+ TableWidgetItemDouble * queryCover = new TableWidgetItemDouble(formatDoubleForDisplay(queryCoverPercent, 2) + "%", queryCoverPercent);
+ queryCover->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+
+ TableWidgetItemInt * numberMismatches = new TableWidgetItemInt(formatIntForDisplay(hit->m_numberMismatches), hit->m_numberMismatches);
+ numberMismatches->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+
+ TableWidgetItemInt * numberGapOpens = new TableWidgetItemInt(formatIntForDisplay(hit->m_numberGapOpens), hit->m_numberGapOpens);
+ numberGapOpens->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+
+ TableWidgetItemInt * queryStart = new TableWidgetItemInt(formatIntForDisplay(hit->m_queryStart), hit->m_queryStart);
+ queryStart->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+
+ TableWidgetItemInt * queryEnd = new TableWidgetItemInt(formatIntForDisplay(hit->m_queryEnd), hit->m_queryEnd);
+ queryEnd->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+
+ TableWidgetItemInt * nodeStart = new TableWidgetItemInt(formatIntForDisplay(hit->m_nodeStart), hit->m_nodeStart);
+ nodeStart->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+
+ TableWidgetItemInt * nodeEnd = new TableWidgetItemInt(formatIntForDisplay(hit->m_nodeEnd), hit->m_nodeEnd);
+ nodeEnd->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+
+ TableWidgetItemDouble * eValue = new TableWidgetItemDouble(hit->m_eValue.asString(false), hit->m_eValue.toDouble());
+ eValue->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+
+ TableWidgetItemDouble * bitScore = new TableWidgetItemDouble(QString::number(hit->m_bitScore), hit->m_bitScore);
+ bitScore->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+
+ ui->blastHitsTableWidget->setItem(i, 0, queryColour);
+ ui->blastHitsTableWidget->setItem(i, 1, queryName);
+ ui->blastHitsTableWidget->setItem(i, 2, nodeName);
+ ui->blastHitsTableWidget->setItem(i, 3, percentIdentity);
+ ui->blastHitsTableWidget->setItem(i, 4, alignmentLength);
+ ui->blastHitsTableWidget->setItem(i, 5, queryCover);
+ ui->blastHitsTableWidget->setItem(i, 6, numberMismatches);
+ ui->blastHitsTableWidget->setItem(i, 7, numberGapOpens);
+ ui->blastHitsTableWidget->setItem(i, 8, queryStart);
+ ui->blastHitsTableWidget->setItem(i, 9, queryEnd);
+ ui->blastHitsTableWidget->setItem(i, 10, nodeStart);
+ ui->blastHitsTableWidget->setItem(i, 11, nodeEnd);
+ ui->blastHitsTableWidget->setItem(i, 12, eValue);
+ ui->blastHitsTableWidget->setItem(i, 13, bitScore);
+ }
+
+ ui->blastHitsTableWidget->resizeColumns();
+ ui->blastHitsTableWidget->setEnabled(true);
+ ui->blastHitsTableWidget->setSortingEnabled(true);
+}
+
+void BlastSearchDialog::buildBlastDatabaseInThread()
+{
+ buildBlastDatabase(true);
+}
+
+void BlastSearchDialog::buildBlastDatabase(bool separateThread)
+{
+ setUiStep(BLAST_DB_BUILD_IN_PROGRESS);
+
+ if (!g_blastSearch->findProgram("makeblastdb", &m_makeblastdbCommand))
+ {
+ QMessageBox::warning(this, "Error", "The program makeblastdb was not found. Please install NCBI BLAST to use this feature.");
+ setUiStep(BLAST_DB_NOT_YET_BUILT);
+ return;
+ }
+
+ QApplication::processEvents();
+
+ MyProgressDialog * progress = new MyProgressDialog(this, "Building BLAST database...", separateThread, "Cancel build", "Cancelling build...",
+ "Clicking this button will stop the BLAST database from being "
+ "built.");
+ progress->setWindowModality(Qt::WindowModal);
+ progress->show();
+
+ if (separateThread)
+ {
+ m_buildBlastDatabaseThread = new QThread;
+ BuildBlastDatabaseWorker * buildBlastDatabaseWorker = new BuildBlastDatabaseWorker(m_makeblastdbCommand);
+ buildBlastDatabaseWorker->moveToThread(m_buildBlastDatabaseThread);
+
+ connect(progress, SIGNAL(halt()), this, SLOT(buildBlastDatabaseCancelled()));
+ connect(m_buildBlastDatabaseThread, SIGNAL(started()), buildBlastDatabaseWorker, SLOT(buildBlastDatabase()));
+ connect(buildBlastDatabaseWorker, SIGNAL(finishedBuild(QString)), m_buildBlastDatabaseThread, SLOT(quit()));
+ connect(buildBlastDatabaseWorker, SIGNAL(finishedBuild(QString)), buildBlastDatabaseWorker, SLOT(deleteLater()));
+ connect(buildBlastDatabaseWorker, SIGNAL(finishedBuild(QString)), this, SLOT(blastDatabaseBuildFinished(QString)));
+ connect(m_buildBlastDatabaseThread, SIGNAL(finished()), m_buildBlastDatabaseThread, SLOT(deleteLater()));
+ connect(m_buildBlastDatabaseThread, SIGNAL(finished()), progress, SLOT(deleteLater()));
+
+ m_buildBlastDatabaseThread->start();
+ }
+ else
+ {
+ BuildBlastDatabaseWorker buildBlastDatabaseWorker(m_makeblastdbCommand);
+ buildBlastDatabaseWorker.buildBlastDatabase();
+ progress->close();
+ delete progress;
+ blastDatabaseBuildFinished(buildBlastDatabaseWorker.m_error);
+ }
+}
+
+
+
+void BlastSearchDialog::blastDatabaseBuildFinished(QString error)
+{
+ if (error != "")
+ {
+ QMessageBox::warning(this, "Error", error);
+ setUiStep(BLAST_DB_NOT_YET_BUILT);
+ }
+ else
+ setUiStep(BLAST_DB_BUILT_BUT_NO_QUERIES);
+}
+
+
+void BlastSearchDialog::buildBlastDatabaseCancelled()
+{
+ g_blastSearch->m_cancelBuildBlastDatabase = true;
+ if (g_blastSearch->m_makeblastdb != 0)
+ g_blastSearch->m_makeblastdb->kill();
+}
+
+void BlastSearchDialog::loadBlastQueriesFromFastaFileButtonClicked()
+{
+ QStringList fullFileNames = QFileDialog::getOpenFileNames(this, "Load queries FASTA", g_memory->rememberedPath);
+
+ if (fullFileNames.size() > 0) //User did not hit cancel
+ {
+ for (int i = 0; i < fullFileNames.size(); ++i)
+ loadBlastQueriesFromFastaFile(fullFileNames.at(i));
+ }
+}
+
+void BlastSearchDialog::loadBlastQueriesFromFastaFile(QString fullFileName)
+{
+ MyProgressDialog * progress = new MyProgressDialog(this, "Loading queries...", false);
+ progress->setWindowModality(Qt::WindowModal);
+ progress->show();
+
+ int queriesLoaded = g_blastSearch->loadBlastQueriesFromFastaFile(fullFileName);
+ if (queriesLoaded > 0)
+ {
+ clearBlastHits();
+ fillQueriesTable();
+ g_memory->rememberedPath = QFileInfo(fullFileName).absolutePath();
+ setUiStep(READY_FOR_BLAST_SEARCH);
+ }
+
+ progress->close();
+ delete progress;
+
+ if (queriesLoaded == 0)
+ QMessageBox::information(this, "No queries loaded", "No queries could be loaded from the specified file.");
+}
+
+
+
+void BlastSearchDialog::enterQueryManually()
+{
+ EnterOneBlastQueryDialog enterOneBlastQueryDialog(this);
+
+ if (enterOneBlastQueryDialog.exec())
+ {
+ QString queryName = g_blastSearch->cleanQueryName(enterOneBlastQueryDialog.getName());
+ g_blastSearch->m_blastQueries.addQuery(new BlastQuery(queryName,
+ enterOneBlastQueryDialog.getSequence()));
+ clearBlastHits();
+ fillQueriesTable();
+
+ setUiStep(READY_FOR_BLAST_SEARCH);
+ }
+}
+
+
+
+void BlastSearchDialog::clearAllQueries()
+{
+ g_blastSearch->m_blastQueries.clearAllQueries();
+ ui->blastQueriesTableWidget->clearContents();
+ ui->clearAllQueriesButton->setEnabled(false);
+
+ while (ui->blastQueriesTableWidget->rowCount() > 0)
+ ui->blastQueriesTableWidget->removeRow(0);
+
+ clearBlastHits();
+ setUiStep(BLAST_DB_BUILT_BUT_NO_QUERIES);
+ emit blastChanged();
+}
+
+
+void BlastSearchDialog::clearSelectedQueries()
+{
+ //Use the table selection to figure out which queries are to be removed.
+ //The table cell containing the query name also has a pointer to the
+ //actual query, and that's what we use.
+ std::vector<BlastQuery *> queriesToRemove;
+ QItemSelectionModel * select = ui->blastQueriesTableWidget->selectionModel();
+ QModelIndexList selection = select->selectedIndexes();
+ QSet<int> rowsWithSelectionSet;
+ for (int i = 0; i < selection.size(); ++i)
+ rowsWithSelectionSet.insert(selection[i].row());
+ for (QSet<int>::const_iterator i = rowsWithSelectionSet.constBegin(); i != rowsWithSelectionSet.constEnd(); ++i)
+ {
+ int row = *i;
+ QTableWidgetItem * tableWidgetItem = ui->blastQueriesTableWidget->item(row, 2);
+ TableWidgetItemName * queryNameItem = dynamic_cast<TableWidgetItemName *>(tableWidgetItem);
+ if (queryNameItem == 0)
+ continue;
+ BlastQuery * query = queryNameItem->getQuery();
+ queriesToRemove.push_back(query);
+ }
+
+ if (queriesToRemove.size() == g_blastSearch->m_blastQueries.m_queries.size())
+ {
+ clearAllQueries();
+ return;
+ }
+
+ g_blastSearch->clearSomeQueries(queriesToRemove);
+
+ fillQueriesTable();
+ fillHitsTable();
+ emit blastChanged();
+}
+
+void BlastSearchDialog::runBlastSearchesInThread()
+{
+ runBlastSearches(true);
+}
+
+
+void BlastSearchDialog::runBlastSearches(bool separateThread)
+{
+ setUiStep(BLAST_SEARCH_IN_PROGRESS);
+
+ if (!g_blastSearch->findProgram("blastn", &m_blastnCommand))
+ {
+ QMessageBox::warning(this, "Error", "The program blastn was not found. Please install NCBI BLAST to use this feature.");
+ setUiStep(READY_FOR_BLAST_SEARCH);
+ return;
+ }
+ if (!g_blastSearch->findProgram("tblastn", &m_tblastnCommand))
+ {
+ QMessageBox::warning(this, "Error", "The program tblastn was not found. Please install NCBI BLAST to use this feature.");
+ setUiStep(READY_FOR_BLAST_SEARCH);
+ return;
+ }
+
+ clearBlastHits();
+
+ MyProgressDialog * progress = new MyProgressDialog(this, "Running BLAST search...", separateThread, "Cancel search", "Cancelling search...",
+ "Clicking this button will stop the BLAST search.");
+ progress->setWindowModality(Qt::WindowModal);
+ progress->show();
+
+ if (separateThread)
+ {
+ m_blastSearchThread = new QThread;
+ RunBlastSearchWorker * runBlastSearchWorker = new RunBlastSearchWorker(m_blastnCommand, m_tblastnCommand, ui->parametersLineEdit->text().simplified());
+ runBlastSearchWorker->moveToThread(m_blastSearchThread);
+
+ connect(progress, SIGNAL(halt()), this, SLOT(runBlastSearchCancelled()));
+ connect(m_blastSearchThread, SIGNAL(started()), runBlastSearchWorker, SLOT(runBlastSearch()));
+ connect(runBlastSearchWorker, SIGNAL(finishedSearch(QString)), m_blastSearchThread, SLOT(quit()));
+ connect(runBlastSearchWorker, SIGNAL(finishedSearch(QString)), runBlastSearchWorker, SLOT(deleteLater()));
+ connect(runBlastSearchWorker, SIGNAL(finishedSearch(QString)), this, SLOT(runBlastSearchFinished(QString)));
+ connect(m_blastSearchThread, SIGNAL(finished()), m_blastSearchThread, SLOT(deleteLater()));
+ connect(m_blastSearchThread, SIGNAL(finished()), progress, SLOT(deleteLater()));
+
+ m_blastSearchThread->start();
+ }
+ else
+ {
+ RunBlastSearchWorker runBlastSearchWorker(m_blastnCommand, m_tblastnCommand, ui->parametersLineEdit->text().simplified());;
+ runBlastSearchWorker.runBlastSearch();
+ progress->close();
+ delete progress;
+ runBlastSearchFinished(runBlastSearchWorker.m_error);
+ }
+}
+
+
+
+void BlastSearchDialog::runBlastSearchFinished(QString error)
+{
+ if (error != "")
+ {
+ QMessageBox::warning(this, "Error", error);
+ setUiStep(READY_FOR_BLAST_SEARCH);
+ }
+ else
+ {
+ fillTablesAfterBlastSearch();
+ g_settings->blastSearchParameters = ui->parametersLineEdit->text().simplified();
+ setUiStep(BLAST_SEARCH_COMPLETE);
+ }
+
+ emit blastChanged();
+}
+
+
+void BlastSearchDialog::runBlastSearchCancelled()
+{
+ g_blastSearch->m_cancelRunBlastSearch = true;
+ if (g_blastSearch->m_blast != 0)
+ g_blastSearch->m_blast->kill();
+}
+
+
+
+void BlastSearchDialog::queryCellChanged(int row, int column)
+{
+ //Suspend signals for this function, as it is might change
+ //the cell value again if the new name isn't unique.
+ ui->blastQueriesTableWidget->blockSignals(true);
+
+ //If a query name was changed, then we adjust that query name elsewhere.
+ if (column == 2)
+ {
+ QString newName = ui->blastQueriesTableWidget->item(row, column)->text();
+ BlastQuery * query = g_blastSearch->m_blastQueries.m_queries[row];
+
+ if (newName != query->getName())
+ {
+ QString uniqueName = g_blastSearch->m_blastQueries.renameQuery(query, newName);
+
+ //It's possible that the user gave the query a non-unique name, in which
+ //case we now have to adjust it.
+ if (uniqueName != newName)
+ ui->blastQueriesTableWidget->item(row, column)->setText(uniqueName);
+
+ //Resize the query table columns, as the name new might take up more or less space.
+ ui->blastQueriesTableWidget->resizeColumns();
+
+ //Rebuild the hits table, if necessary, to show the new name.
+ if (query->hasHits())
+ fillHitsTable();
+
+ emit blastChanged();
+ }
+ }
+
+ ui->blastQueriesTableWidget->blockSignals(false);
+}
+
+
+void BlastSearchDialog::queryTableSelectionChanged()
+{
+ //If there are any selected items, then the 'Clear selected' button
+ //should be enabled.
+ QItemSelectionModel * select = ui->blastQueriesTableWidget->selectionModel();
+ bool hasSelection = select->hasSelection();
+
+ ui->clearSelectedQueriesButton->setEnabled(hasSelection);
+}
+
+
+
+void BlastSearchDialog::setUiStep(BlastUiState blastUiState)
+{
+ QPixmap tick(":/icons/tick-128.png");
+ tick.setDevicePixelRatio(devicePixelRatio()); //This is a workaround for a Qt bug. Can possibly remove in the future. https://bugreports.qt.io/browse/QTBUG-46846
+
+ switch (blastUiState)
+ {
+ case BLAST_DB_NOT_YET_BUILT:
+ ui->step1Label->setEnabled(true);
+ ui->buildBlastDatabaseButton->setEnabled(true);
+ ui->step2Label->setEnabled(false);
+ ui->loadQueriesFromFastaButton->setEnabled(false);
+ ui->enterQueryManuallyButton->setEnabled(false);
+ ui->blastQueriesTableWidget->setEnabled(false);
+ ui->blastQueriesTableInfoText->setEnabled(false);
+ ui->step3Label->setEnabled(false);
+ ui->parametersLabel->setEnabled(false);
+ ui->parametersLineEdit->setEnabled(false);
+ ui->runBlastSearchButton->setEnabled(false);
+ ui->clearAllQueriesButton->setEnabled(false);
+ ui->clearSelectedQueriesButton->setEnabled(false);
+ ui->hitsLabel->setEnabled(false);
+ ui->step1TickLabel->setPixmap(QPixmap());
+ ui->step2TickLabel->setPixmap(QPixmap());
+ ui->step3TickLabel->setPixmap(QPixmap());
+ ui->buildBlastDatabaseInfoText->setEnabled(true);
+ ui->loadQueriesFromFastaInfoText->setEnabled(false);
+ ui->enterQueryManuallyInfoText->setEnabled(false);
+ ui->clearAllQueriesInfoText->setEnabled(false);
+ ui->clearSelectedQueriesInfoText->setEnabled(false);
+ ui->blastHitsTableWidget->setEnabled(false);
+ ui->blastSearchWidget->setEnabled(false);
+ ui->blastHitsTableInfoText->setEnabled(false);
+ break;
+
+ case BLAST_DB_BUILD_IN_PROGRESS:
+ ui->step1Label->setEnabled(true);
+ ui->buildBlastDatabaseButton->setEnabled(false);
+ ui->step2Label->setEnabled(false);
+ ui->loadQueriesFromFastaButton->setEnabled(false);
+ ui->enterQueryManuallyButton->setEnabled(false);
+ ui->blastQueriesTableWidget->setEnabled(false);
+ ui->blastQueriesTableInfoText->setEnabled(false);
+ ui->step3Label->setEnabled(false);
+ ui->parametersLabel->setEnabled(false);
+ ui->parametersLineEdit->setEnabled(false);
+ ui->runBlastSearchButton->setEnabled(false);
+ ui->clearAllQueriesButton->setEnabled(false);
+ ui->clearSelectedQueriesButton->setEnabled(false);
+ ui->hitsLabel->setEnabled(false);
+ ui->step1TickLabel->setPixmap(QPixmap());
+ ui->step2TickLabel->setPixmap(QPixmap());
+ ui->step3TickLabel->setPixmap(QPixmap());
+ ui->buildBlastDatabaseInfoText->setEnabled(false);
+ ui->loadQueriesFromFastaInfoText->setEnabled(false);
+ ui->enterQueryManuallyInfoText->setEnabled(false);
+ ui->clearAllQueriesInfoText->setEnabled(false);
+ ui->clearSelectedQueriesInfoText->setEnabled(false);
+ ui->blastHitsTableWidget->setEnabled(false);
+ ui->blastSearchWidget->setEnabled(false);
+ ui->blastHitsTableInfoText->setEnabled(false);
+ break;
+
+ case BLAST_DB_BUILT_BUT_NO_QUERIES:
+ ui->step1Label->setEnabled(true);
+ ui->buildBlastDatabaseButton->setEnabled(false);
+ ui->step2Label->setEnabled(true);
+ ui->loadQueriesFromFastaButton->setEnabled(true);
+ ui->enterQueryManuallyButton->setEnabled(true);
+ ui->blastQueriesTableWidget->setEnabled(true);
+ ui->blastQueriesTableInfoText->setEnabled(true);
+ ui->step3Label->setEnabled(false);
+ ui->parametersLabel->setEnabled(false);
+ ui->parametersLineEdit->setEnabled(false);
+ ui->runBlastSearchButton->setEnabled(false);
+ ui->clearAllQueriesButton->setEnabled(false);
+ ui->clearAllQueriesButton->setEnabled(false);
+ ui->hitsLabel->setEnabled(false);
+ ui->step1TickLabel->setPixmap(tick);
+ ui->step2TickLabel->setPixmap(QPixmap());
+ ui->step3TickLabel->setPixmap(QPixmap());
+ ui->buildBlastDatabaseInfoText->setEnabled(true);
+ ui->loadQueriesFromFastaInfoText->setEnabled(true);
+ ui->enterQueryManuallyInfoText->setEnabled(true);
+ ui->clearSelectedQueriesInfoText->setEnabled(false);
+ ui->clearSelectedQueriesInfoText->setEnabled(false);
+ ui->blastHitsTableWidget->setEnabled(false);
+ ui->blastSearchWidget->setEnabled(false);
+ ui->blastHitsTableInfoText->setEnabled(false);
+ break;
+
+ case READY_FOR_BLAST_SEARCH:
+ ui->step1Label->setEnabled(true);
+ ui->buildBlastDatabaseButton->setEnabled(false);
+ ui->step2Label->setEnabled(true);
+ ui->loadQueriesFromFastaButton->setEnabled(true);
+ ui->enterQueryManuallyButton->setEnabled(true);
+ ui->blastQueriesTableWidget->setEnabled(true);
+ ui->blastQueriesTableInfoText->setEnabled(true);
+ ui->step3Label->setEnabled(true);
+ ui->parametersLabel->setEnabled(true);
+ ui->parametersLineEdit->setEnabled(true);
+ ui->runBlastSearchButton->setEnabled(true);
+ ui->clearAllQueriesButton->setEnabled(true);
+ queryTableSelectionChanged();
+ ui->hitsLabel->setEnabled(false);
+ ui->step1TickLabel->setPixmap(tick);
+ ui->step2TickLabel->setPixmap(tick);
+ ui->step3TickLabel->setPixmap(QPixmap());
+ ui->buildBlastDatabaseInfoText->setEnabled(true);
+ ui->loadQueriesFromFastaInfoText->setEnabled(true);
+ ui->enterQueryManuallyInfoText->setEnabled(true);
+ ui->clearAllQueriesInfoText->setEnabled(true);
+ ui->clearSelectedQueriesInfoText->setEnabled(true);
+ ui->blastHitsTableWidget->setEnabled(false);
+ ui->blastSearchWidget->setEnabled(true);
+ ui->blastHitsTableInfoText->setEnabled(false);
+ break;
+
+ case BLAST_SEARCH_IN_PROGRESS:
+ ui->step1Label->setEnabled(true);
+ ui->buildBlastDatabaseButton->setEnabled(false);
+ ui->step2Label->setEnabled(true);
+ ui->loadQueriesFromFastaButton->setEnabled(true);
+ ui->enterQueryManuallyButton->setEnabled(true);
+ ui->blastQueriesTableWidget->setEnabled(true);
+ ui->blastQueriesTableInfoText->setEnabled(true);
+ ui->step3Label->setEnabled(true);
+ ui->parametersLabel->setEnabled(true);
+ ui->parametersLineEdit->setEnabled(true);
+ ui->runBlastSearchButton->setEnabled(false);
+ ui->clearAllQueriesButton->setEnabled(true);
+ queryTableSelectionChanged();
+ ui->hitsLabel->setEnabled(false);
+ ui->step1TickLabel->setPixmap(tick);
+ ui->step2TickLabel->setPixmap(tick);
+ ui->step3TickLabel->setPixmap(QPixmap());
+ ui->buildBlastDatabaseInfoText->setEnabled(true);
+ ui->loadQueriesFromFastaInfoText->setEnabled(true);
+ ui->enterQueryManuallyInfoText->setEnabled(true);
+ ui->clearAllQueriesInfoText->setEnabled(true);
+ ui->clearSelectedQueriesInfoText->setEnabled(true);
+ ui->blastHitsTableWidget->setEnabled(false);
+ ui->blastSearchWidget->setEnabled(true);
+ ui->blastHitsTableInfoText->setEnabled(false);
+ break;
+
+ case BLAST_SEARCH_COMPLETE:
+ ui->step1Label->setEnabled(true);
+ ui->buildBlastDatabaseButton->setEnabled(false);
+ ui->step2Label->setEnabled(true);
+ ui->loadQueriesFromFastaButton->setEnabled(true);
+ ui->enterQueryManuallyButton->setEnabled(true);
+ ui->blastQueriesTableWidget->setEnabled(true);
+ ui->blastQueriesTableInfoText->setEnabled(true);
+ ui->step3Label->setEnabled(true);
+ ui->parametersLabel->setEnabled(true);
+ ui->parametersLineEdit->setEnabled(true);
+ ui->runBlastSearchButton->setEnabled(true);
+ ui->clearAllQueriesButton->setEnabled(true);
+ queryTableSelectionChanged();
+ ui->hitsLabel->setEnabled(true);
+ ui->step1TickLabel->setPixmap(tick);
+ ui->step2TickLabel->setPixmap(tick);
+ ui->step3TickLabel->setPixmap(tick);
+ ui->buildBlastDatabaseInfoText->setEnabled(true);
+ ui->loadQueriesFromFastaInfoText->setEnabled(true);
+ ui->enterQueryManuallyInfoText->setEnabled(true);
+ ui->clearAllQueriesInfoText->setEnabled(true);
+ ui->clearSelectedQueriesInfoText->setEnabled(true);
+ ui->blastHitsTableWidget->setEnabled(true);
+ ui->blastSearchWidget->setEnabled(true);
+ ui->blastHitsTableInfoText->setEnabled(true);
+ break;
+ }
+}
+
+
+
+void BlastSearchDialog::setInfoTexts()
+{
+ QString settingsDialogTitle = "settings";
+#ifdef Q_OS_MAC
+ settingsDialogTitle = "preferences";
+#endif
+
+ ui->buildBlastDatabaseInfoText->setInfoText("This step runs makeblastdb on the contig sequences, "
+ "preparing them for a BLAST search.<br><br>"
+ "The database files generated are temporary and will "
+ "be deleted when Bandage is closed.");
+
+ ui->loadQueriesFromFastaInfoText->setInfoText("Click this button to load a FASTA file. Each "
+ "sequence in the FASTA file will be a separate "
+ "query.");
+
+ ui->enterQueryManuallyInfoText->setInfoText("Click this button to type or paste a single query sequence.");
+
+ ui->parametersInfoText->setInfoText("You may add additional blastn/tblastn parameters here, exactly as they "
+ "would be typed at the command line.");
+
+ ui->startBlastSearchInfoText->setInfoText("Click this to conduct search for the above "
+ "queries on the graph nodes.<br><br>"
+ "If no parameters were added above, this will run:<br>"
+ "blastn -query queries.fasta -db all_nodes.fasta -outfmt 6<br><br>"
+ "If, for example, '-evalue 0.01' was entered in the above "
+ "parameters field, then this will run:<br>"
+ "blastn -query queries.fasta -db all_nodes.fasta -outfmt 6 -evalue 0.01<br><br>"
+ "For protein queries, tblastn will be used instead of blastn.");
+
+ ui->clearSelectedQueriesInfoText->setInfoText("Click this button to remove any selected queries in the below list.");
+
+ ui->clearAllQueriesInfoText->setInfoText("Click this button to remove all queries in the below list.");
+
+ ui->blastQueriesTableInfoText->setInfoText("The BLAST queries are displayed in this table. Before a BLAST search "
+ "is run, some information about the queries is not yet available and "
+ "will show a dash.<br><br>"
+ "<b>Colour</b>: Each query is automatically assigned a colour which is used for the "
+ "'Blast hits (solid)' graph colour scheme. This colour can be changed by "
+ "clicking in the table cell.<br><br>"
+ "<b>Show</b>: if this box is ticked, the query's hits will be able to be viewed "
+ "on the graph. If this box is not ticked, the query's hits will be hidden "
+ "on the graph.<br><br>"
+ "<b>Query name</b>: If a query is loaded from a FASTA file, its name is the sequence "
+ "ID (the text between the '>' and the first space in the description line). "
+ "Query names are editable by double clicking in their table cell.<br><br>"
+ "<b>Type</b>: This is either 'nucl' for nucleotide sequences or 'prot' for protein "
+ "sequences. Nucleotide sequences will be searched for using blastn, while "
+ "protein sequences will be search for with tblastn. Both types can be used "
+ "simultaneously.<br><br>"
+ "<b>Length</b>: This is the length of the query, in bases (for nucleotide queries) "
+ "or amino acids (for protein queries).<br><br>"
+ "<b>Hits</b>: This is the number of BLAST hits acquired for the query.<br><br>"
+ "<b>Query cover</b>: This is the total fraction of the query captured by all of "
+ "the BLAST hits. However, the hits may not be proximal to each other. For "
+ "example, if the first half a query was found in one part of the graph and "
+ "the second half in a different part, this value would be 100%. This value "
+ "is equivalent to the 'qcovs' output option in BLAST.<br><br>"
+ "<b>Paths</b>: These are the number of possible paths through the graph which "
+ "represent the entire query. If there is at least one path, you can click on "
+ "this button to view a table of the paths' properties.");
+
+ ui->blastHitsTableInfoText->setInfoText("The BLAST hits are displayed in this table after a BLAST search is run.<br><br>"
+ "<b>Query name</b>: This is the name of the BLAST query for the hit.<br><br>"
+ "<b>Node name</b>: This is the name of the graph node that the query matched.<br><br>"
+ "<b>Percent identity</b>: This is the sequence similarity over the length of the hit. "
+ "100% identity means that the query and node are identical over the length of the hit.<br><br>"
+ "<b>Alignment length</b>: This is the length of the alignment as measured against the "
+ "node. It is equal to node end minus node start plus one.<br><br>"
+ "<b>Query cover</b>: This is the fraction of the query covered by the hit. It is "
+ "equivalent to the 'qcovhsp' output option in BLAST.<br><br>"
+ "<b>Mismatches</b>: This is the number of locations (bases for nucleotide sequence, "
+ "amino acids for protein sequences) where the query and node sequences differ.<br><br>"
+ "<b>Gap opens</b>: This is the number of gaps in the alignment due to either insertions "
+ "or deletions.<br><br>"
+ "<b>Query start</b>: This is the position where the alignment starts relative to the query.<br><br>"
+ "<b>Query end</b>: This is the position where the alignment ends relative to the query.<br><br>"
+ "<b>Node start</b>: This is the position where the alignment starts relative to the node sequence.<br><br>"
+ "<b>Node end</b>: This is the position where the alignment ends relative to the node sequence.<br><br>"
+ "<b>E-value</b>: This is the BLAST-calculated expect value.<br><br>"
+ "<b>Bit score</b>: This is the BLAST-calculated bit score.");
+
+ ui->blastHitFiltersInfoText->setInfoText("Click the 'Set filters' button to open a dialog where you can set one or more BLAST hit "
+ "filters.<br><br>"
+ "These let you exclude BLAST hits using a threshold for alignment length, query coverage, "
+ "identity, e-value or bit score.");
+}
+
+
+
+//This function is called whenever a user changed the 'Show' tick box for a
+//query. It does three things:
+// 1) Updates the 'shown' status of the TableWidgetItem so the table can be
+// sorted by that column.
+// 2) Colours the QTableWidgetItems in the query table to match the query's
+// 'shown' status.
+// 3) Colours the QTableWidgetItems in the hits table to match the hit's query's
+// 'shown' status.
+void BlastSearchDialog::queryShownChanged()
+{
+ ui->blastQueriesTableWidget->blockSignals(true);
+
+ QTableWidgetItem tempItem;
+ QColor shownColour = tempItem.foreground().color();
+ QColor hiddenColour = QColor(150, 150, 150);
+
+ for (int i = 0; i < ui->blastQueriesTableWidget->rowCount(); ++i)
+ {
+ QString queryName = ui->blastQueriesTableWidget->item(i, 2)->text();
+ BlastQuery * query = g_blastSearch->m_blastQueries.getQueryFromName(queryName);
+ if (query == 0)
+ continue;
+
+ QTableWidgetItem * item = ui->blastQueriesTableWidget->item(i, 1);
+ TableWidgetItemShown * shownItem = dynamic_cast<TableWidgetItemShown *>(item);
+
+ if (shownItem == 0)
+ continue;
+ shownItem->m_shown = query->isShown();
+
+ QColor colour = shownColour;
+ if (query->isHidden())
+ colour = hiddenColour;
+ ui->blastQueriesTableWidget->item(i, 2)->setForeground(colour);
+ ui->blastQueriesTableWidget->item(i, 3)->setForeground(colour);
+ ui->blastQueriesTableWidget->item(i, 4)->setForeground(colour);
+ ui->blastQueriesTableWidget->item(i, 5)->setForeground(colour);
+ ui->blastQueriesTableWidget->item(i, 6)->setForeground(colour);
+ ui->blastQueriesTableWidget->item(i, 7)->setForeground(colour);
+ }
+
+ for (int i = 0; i < ui->blastHitsTableWidget->rowCount(); ++i)
+ {
+ QString queryName = ui->blastHitsTableWidget->item(i, 1)->text();
+ BlastQuery * query = g_blastSearch->m_blastQueries.getQueryFromName(queryName);
+ if (query == 0)
+ continue;
+
+ QColor colour = shownColour;
+ if (query->isHidden())
+ colour = hiddenColour;
+
+ ui->blastHitsTableWidget->item(i, 1)->setForeground(colour);
+ ui->blastHitsTableWidget->item(i, 2)->setForeground(colour);
+ ui->blastHitsTableWidget->item(i, 3)->setForeground(colour);
+ ui->blastHitsTableWidget->item(i, 4)->setForeground(colour);
+ ui->blastHitsTableWidget->item(i, 5)->setForeground(colour);
+ ui->blastHitsTableWidget->item(i, 6)->setForeground(colour);
+ ui->blastHitsTableWidget->item(i, 7)->setForeground(colour);
+ ui->blastHitsTableWidget->item(i, 8)->setForeground(colour);
+ ui->blastHitsTableWidget->item(i, 9)->setForeground(colour);
+ ui->blastHitsTableWidget->item(i, 10)->setForeground(colour);
+ ui->blastHitsTableWidget->item(i, 11)->setForeground(colour);
+ ui->blastHitsTableWidget->item(i, 12)->setForeground(colour);
+ }
+
+ ui->blastQueriesTableWidget->blockSignals(false);
+ emit blastChanged();
+}
+
+
+
+void BlastSearchDialog::showPathsDialog(BlastQuery * query)
+{
+ deleteQueryPathsDialog();
+
+ m_queryPathsDialog = new QueryPathsDialog(this, query);
+
+ connect(m_queryPathsDialog, SIGNAL(selectionChanged()), this, SLOT(queryPathSelectionChangedSlot()));
+
+ m_queryPathsDialog->show();
+}
+
+void BlastSearchDialog::deleteQueryPathsDialog()
+{
+ if (m_queryPathsDialog != 0)
+ delete m_queryPathsDialog;
+ m_queryPathsDialog = 0;
+}
+
+void BlastSearchDialog::queryPathSelectionChangedSlot()
+{
+ emit queryPathSelectionChanged();
+}
+
+
+void BlastSearchDialog::openFiltersDialog()
+{
+ BlastHitFiltersDialog filtersDialog(this);
+ filtersDialog.setWidgetsFromSettings();
+
+ if (filtersDialog.exec()) //The user clicked OK
+ {
+ filtersDialog.setSettingsFromWidgets();
+ setFilterText();
+ }
+}
+
+void BlastSearchDialog::setFilterText()
+{
+ ui->blastHitFiltersLabel->setText("Current filters: " + BlastHitFiltersDialog::getFilterText());
+}
diff --git a/ui/blastsearchdialog.h b/ui/blastsearchdialog.h
new file mode 100644
index 0000000..60c913d
--- /dev/null
+++ b/ui/blastsearchdialog.h
@@ -0,0 +1,92 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef BLASTSEARCHDIALOG_H
+#define BLASTSEARCHDIALOG_H
+
+#include <QDialog>
+#include <QMap>
+#include <QThread>
+#include <QProcess>
+#include "../program/globals.h"
+
+class DeBruijnNode;
+class BlastQuery;
+class QueryPathsDialog;
+
+namespace Ui {
+class BlastSearchDialog;
+}
+
+class BlastSearchDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit BlastSearchDialog(QWidget *parent = 0, QString autoQuery = "");
+ ~BlastSearchDialog();
+
+private:
+ Ui::BlastSearchDialog *ui;
+ QMap<long long, DeBruijnNode*> * m_deBruijnGraphNodes;
+ QString m_makeblastdbCommand;
+ QString m_blastnCommand;
+ QString m_tblastnCommand;
+ QThread * m_buildBlastDatabaseThread;
+ QThread * m_blastSearchThread;
+ QueryPathsDialog * m_queryPathsDialog;
+
+ void setUiStep(BlastUiState blastUiState);
+ void clearBlastHits();
+ void setInfoTexts();
+ void loadBlastQueriesFromFastaFile(QString fullFileName);
+ void buildBlastDatabase(bool separateThread);
+ void runBlastSearches(bool separateThread);
+ void makeQueryRow(int row);
+ void deleteQueryPathsDialog();
+ void setFilterText();
+
+private slots:
+ void afterWindowShow();
+ void buildBlastDatabaseInThread();
+ void loadBlastQueriesFromFastaFileButtonClicked();
+ void enterQueryManually();
+ void clearAllQueries();
+ void clearSelectedQueries();
+ void runBlastSearchesInThread();
+ void fillTablesAfterBlastSearch();
+ void fillQueriesTable();
+ void fillHitsTable();
+ void blastDatabaseBuildFinished(QString error);
+ void runBlastSearchFinished(QString error);
+ void buildBlastDatabaseCancelled();
+ void runBlastSearchCancelled();
+ void queryCellChanged(int row, int column);
+ void queryTableSelectionChanged();
+ void queryShownChanged();
+ void showPathsDialog(BlastQuery * query);
+ void queryPathSelectionChangedSlot();
+ void openFiltersDialog();
+
+signals:
+ void blastChanged();
+ void queryPathSelectionChanged();
+};
+
+
+#endif // BLASTSEARCHDIALOG_H
diff --git a/ui/blastsearchdialog.ui b/ui/blastsearchdialog.ui
new file mode 100644
index 0000000..4917ff5
--- /dev/null
+++ b/ui/blastsearchdialog.ui
@@ -0,0 +1,807 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>BlastSearchDialog</class>
+ <widget class="QDialog" name="BlastSearchDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>1222</width>
+ <height>753</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>BLAST search</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_2" columnstretch="0,0,0">
+ <item row="3" column="1">
+ <widget class="QLabel" name="step2Label">
+ <property name="text">
+ <string><html><head/><body><p><span style=" font-weight:600;">Step 2: </span>enter BLAST queries</p></body></html></string>
+ </property>
+ </widget>
+ </item>
+ <item row="12" column="2" rowspan="2">
+ <widget class="QWidget" name="blastHitsWidget" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout_7">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="InfoTextWidget" name="blastHitsTableInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="MyTableWidget" name="blastHitsTableWidget">
+ <column>
+ <property name="text">
+ <string/>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Query name</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Node name</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Percent identity</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Alignment length</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Query cover</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Mismatches</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Gap opens</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Query start</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Query end</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Node start</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Node end</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>E-value</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Bit score</string>
+ </property>
+ </column>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QWidget" name="buildBlastDatabaseWidget" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="InfoTextWidget" name="buildBlastDatabaseInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="buildBlastDatabaseButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Build BLAST database</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="3" column="2">
+ <widget class="QWidget" name="blastQueriesWidget1" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="InfoTextWidget" name="loadQueriesFromFastaInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="loadQueriesFromFastaButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Load from FASTA file</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_7">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="InfoTextWidget" name="enterQueryManuallyInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="enterQueryManuallyButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Enter manually</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_9">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="InfoTextWidget" name="clearSelectedQueriesInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="clearSelectedQueriesButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Clear selected</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_8">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="InfoTextWidget" name="clearAllQueriesInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="clearAllQueriesButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Clear all</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="step2TickLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="step1Label">
+ <property name="font">
+ <font>
+ <weight>50</weight>
+ <bold>false</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string><html><head/><body><p><span style=" font-weight:600;">Step 1: </span>build BLAST database</p></body></html></string>
+ </property>
+ </widget>
+ </item>
+ <item row="18" column="2">
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Close</set>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="0">
+ <widget class="QLabel" name="step3TickLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="3">
+ <widget class="Line" name="line_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="17" column="2">
+ <widget class="Line" name="line">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="0" colspan="3">
+ <widget class="Line" name="line_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="1">
+ <widget class="QLabel" name="step3Label">
+ <property name="text">
+ <string><html><head/><body><p><span style=" font-weight:600;">Step 3:</span> run BLAST search</p></body></html></string>
+ </property>
+ </widget>
+ </item>
+ <item row="11" column="0" colspan="3">
+ <widget class="Line" name="line_4">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="12" column="1">
+ <widget class="QLabel" name="hitsLabel">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Hits:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="step1TickLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="13" column="1">
+ <spacer name="verticalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="4" column="2">
+ <widget class="QWidget" name="blastQueriesWidget2" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="InfoTextWidget" name="blastQueriesTableInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="MyTableWidget" name="blastQueriesTableWidget">
+ <column>
+ <property name="text">
+ <string/>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Show</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Query name</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Type</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Length</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Hits</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Query cover</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Paths</string>
+ </property>
+ </column>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="9" column="1">
+ <spacer name="verticalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Preferred</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="8" column="2" rowspan="2">
+ <widget class="QWidget" name="blastSearchWidget" native="true">
+ <layout class="QGridLayout" name="gridLayout">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item row="1" column="0">
+ <widget class="InfoTextWidget" name="blastHitFiltersInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="InfoTextWidget" name="parametersInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QPushButton" name="blastFiltersButton">
+ <property name="text">
+ <string>Set BLAST hit filters</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QLabel" name="blastHitFiltersLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Current filters: none</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="parametersLabel">
+ <property name="text">
+ <string>Command line parameters:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" colspan="2">
+ <widget class="QLineEdit" name="parametersLineEdit"/>
+ </item>
+ <item row="2" column="0">
+ <widget class="InfoTextWidget" name="startBlastSearchInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" colspan="3">
+ <widget class="QPushButton" name="runBlastSearchButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Run BLAST search</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>InfoTextWidget</class>
+ <extends>QWidget</extends>
+ <header>infotextwidget.h</header>
+ <container>1</container>
+ </customwidget>
+ <customwidget>
+ <class>MyTableWidget</class>
+ <extends>QTableWidget</extends>
+ <header>mytablewidget.h</header>
+ </customwidget>
+ </customwidgets>
+ <tabstops>
+ <tabstop>buildBlastDatabaseButton</tabstop>
+ <tabstop>loadQueriesFromFastaButton</tabstop>
+ <tabstop>enterQueryManuallyButton</tabstop>
+ <tabstop>clearSelectedQueriesButton</tabstop>
+ <tabstop>clearAllQueriesButton</tabstop>
+ <tabstop>blastQueriesTableWidget</tabstop>
+ <tabstop>parametersLineEdit</tabstop>
+ <tabstop>blastFiltersButton</tabstop>
+ <tabstop>runBlastSearchButton</tabstop>
+ <tabstop>blastHitsTableWidget</tabstop>
+ </tabstops>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>BlastSearchDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>603</x>
+ <y>748</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>BlastSearchDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>535</x>
+ <y>748</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/ui/changenodedepthdialog.cpp b/ui/changenodedepthdialog.cpp
new file mode 100644
index 0000000..35325b5
--- /dev/null
+++ b/ui/changenodedepthdialog.cpp
@@ -0,0 +1,61 @@
+#include "changenodedepthdialog.h"
+#include "ui_changenodedepthdialog.h"
+
+
+#include "../program/globals.h"
+#include "../graph/debruijnnode.h"
+
+ChangeNodeDepthDialog::ChangeNodeDepthDialog(QWidget * parent,
+ std::vector<DeBruijnNode *> * nodes,
+ double oldDepth) :
+ QDialog(parent),
+ ui(new Ui::ChangeNodeDepthDialog)
+{
+ ui->setupUi(this);
+
+ ui->currentDepthLabel2->setText(formatDoubleForDisplay(oldDepth, 1));
+ ui->newDepthSpinBox->setValue(oldDepth);
+
+ //Display the node names. If there are lots of nodes (more than 10), just
+ //display the first 10 and then an ellipsis.
+ QString nodeNames;
+ int numNodeNames = int(nodes->size());
+ if (numNodeNames > 10)
+ numNodeNames = 10;
+ for (int i = 0; i < numNodeNames; ++i)
+ {
+ nodeNames += (*nodes)[i]->getNameWithoutSign();
+ if (i < numNodeNames - 1)
+ nodeNames += ", ";
+ }
+ if (int(nodes->size()) > numNodeNames)
+ nodeNames += "...";
+
+ //Set the dialog text to be either singular or plural as appropriate.
+ if (nodes->size() == 1)
+ {
+ ui->nodeNameLabel1->setText("Node:");
+ ui->currentDepthLabel1->setText("Current depth:");
+ ui->infoLabel->setText("Enter a new depth. Both the node and its reverse complement will have their depth set to the new value.");
+ }
+ else
+ {
+ ui->nodeNameLabel1->setText("Nodes (" + formatIntForDisplay(int(nodes->size())) + "):");
+ ui->currentDepthLabel1->setText("Current mean depth:");
+ ui->infoLabel->setText("Enter a new depth. The nodes and their reverse complements will have their depths set to the new value.");
+ }
+
+ ui->nodeNameLabel2->setText(nodeNames);
+
+ ui->newDepthSpinBox->setFocus();
+}
+
+ChangeNodeDepthDialog::~ChangeNodeDepthDialog()
+{
+ delete ui;
+}
+
+double ChangeNodeDepthDialog::getNewDepth() const
+{
+ return ui->newDepthSpinBox->value();
+}
diff --git a/ui/changenodedepthdialog.h b/ui/changenodedepthdialog.h
new file mode 100644
index 0000000..0e77957
--- /dev/null
+++ b/ui/changenodedepthdialog.h
@@ -0,0 +1,28 @@
+#ifndef CHANGENODEDEPTHDIALOG_H
+#define CHANGENODEDEPTHDIALOG_H
+
+#include <QDialog>
+
+class DeBruijnNode;
+
+namespace Ui {
+class ChangeNodeDepthDialog;
+}
+
+class ChangeNodeDepthDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit ChangeNodeDepthDialog(QWidget * parent,
+ std::vector<DeBruijnNode *> *nodes,
+ double oldDepth);
+ ~ChangeNodeDepthDialog();
+
+ double getNewDepth() const;
+
+private:
+ Ui::ChangeNodeDepthDialog *ui;
+};
+
+#endif // CHANGENODEDEPTHDIALOG_H
diff --git a/ui/changenodedepthdialog.ui b/ui/changenodedepthdialog.ui
new file mode 100644
index 0000000..ef4312e
--- /dev/null
+++ b/ui/changenodedepthdialog.ui
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ChangeNodeDepthDialog</class>
+ <widget class="QDialog" name="ChangeNodeDepthDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>367</width>
+ <height>235</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Change depth</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0" colspan="2">
+ <widget class="QLabel" name="infoLabel">
+ <property name="text">
+ <string>Enter a new depth. Both the node and its reverse complement will be have their depth set to the new value.</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2">
+ <spacer name="verticalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>263</width>
+ <height>8</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="nodeNameLabel1">
+ <property name="text">
+ <string>Node:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="currentDepthLabel1">
+ <property name="text">
+ <string>Current depth:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QLabel" name="currentDepthLabel2">
+ <property name="text">
+ <string>old_depth</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="newDepthLabel">
+ <property name="text">
+ <string>New depth:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="QDoubleSpinBox" name="newDepthSpinBox">
+ <property name="decimals">
+ <number>1</number>
+ </property>
+ <property name="minimum">
+ <double>0.100000000000000</double>
+ </property>
+ <property name="maximum">
+ <double>1000000.000000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0" colspan="2">
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>263</width>
+ <height>9</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="6" column="0" colspan="2">
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="nodeNameLabel2">
+ <property name="text">
+ <string>node_names</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>ChangeNodeDepthDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>ChangeNodeDepthDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/ui/changenodenamedialog.cpp b/ui/changenodenamedialog.cpp
new file mode 100644
index 0000000..e90e3ea
--- /dev/null
+++ b/ui/changenodenamedialog.cpp
@@ -0,0 +1,101 @@
+#include "changenodenamedialog.h"
+#include "ui_changenodenamedialog.h"
+
+#include "../program/globals.h"
+#include "../graph/assemblygraph.h"
+#include <QPushButton>
+
+ChangeNodeNameDialog::ChangeNodeNameDialog(QWidget * parent, QString oldName) :
+ QDialog(parent),
+ ui(new Ui::ChangeNodeNameDialog),
+ m_oldName(oldName)
+{
+ ui->setupUi(this);
+
+ ui->currentNodeNameLabel2->setText(m_oldName);
+ checkNodeNameValidity();
+ ui->newNodeNameLineEdit->setFocus();
+
+ connect(ui->newNodeNameLineEdit, SIGNAL(textChanged(QString)), this, SLOT(checkNodeNameValidity()));
+}
+
+ChangeNodeNameDialog::~ChangeNodeNameDialog()
+{
+ delete ui;
+}
+
+
+QString ChangeNodeNameDialog::getNewName() const
+{
+ return ui->newNodeNameLineEdit->text();
+}
+
+
+void ChangeNodeNameDialog::checkNodeNameValidity()
+{
+ QString potentialName = ui->newNodeNameLineEdit->text();
+
+ //If the new name is blank, don't allow an accept but no need to show an
+ //error.
+ if (potentialName.length() == 0)
+ {
+ ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
+ ui->errorLabel->setText("");
+ return;
+ }
+
+ if (potentialName == m_oldName)
+ {
+ ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
+ ui->errorLabel->setText("Same as current");
+ return;
+ }
+
+ NodeNameStatus nodeNameStatus = g_assemblyGraph->checkNodeNameValidity(potentialName);
+
+ if (nodeNameStatus == NODE_NAME_OKAY)
+ {
+ ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(true);
+ ui->errorLabel->setText("");
+ return;
+ }
+
+ else if (nodeNameStatus == NODE_NAME_TAKEN)
+ {
+ ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
+ ui->errorLabel->setText("Name already used");
+ return;
+ }
+
+ else if (nodeNameStatus == NODE_NAME_CONTAINS_TAB)
+ {
+ ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
+ ui->errorLabel->setText("Tab not allowed");
+ return;
+ }
+
+ else if (nodeNameStatus == NODE_NAME_CONTAINS_NEWLINE)
+ {
+ ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
+ ui->errorLabel->setText("Newline not allowed");
+ return;
+ }
+
+ else if (nodeNameStatus == NODE_NAME_CONTAINS_COMMA)
+ {
+ ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
+ ui->errorLabel->setText("Comma not allowed");
+ return;
+ }
+
+ else if (nodeNameStatus == NODE_NAME_CONTAINS_SPACE)
+ {
+ ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
+ ui->errorLabel->setText("Space not allowed");
+ return;
+ }
+
+ //Catch any other error cases (shouldn't happen, but just in case)
+ ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
+ ui->errorLabel->setText("");
+}
diff --git a/ui/changenodenamedialog.h b/ui/changenodenamedialog.h
new file mode 100644
index 0000000..0af39c3
--- /dev/null
+++ b/ui/changenodenamedialog.h
@@ -0,0 +1,28 @@
+#ifndef CHANGENODENAMEDIALOG_H
+#define CHANGENODENAMEDIALOG_H
+
+#include <QDialog>
+
+namespace Ui {
+class ChangeNodeNameDialog;
+}
+
+class ChangeNodeNameDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit ChangeNodeNameDialog(QWidget * parent, QString oldName);
+ ~ChangeNodeNameDialog();
+
+ QString getNewName() const;
+
+private:
+ Ui::ChangeNodeNameDialog *ui;
+ QString m_oldName;
+
+private slots:
+ void checkNodeNameValidity();
+};
+
+#endif // CHANGENODENAMEDIALOG_H
diff --git a/ui/changenodenamedialog.ui b/ui/changenodenamedialog.ui
new file mode 100644
index 0000000..5330786
--- /dev/null
+++ b/ui/changenodenamedialog.ui
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>ChangeNodeNameDialog</class>
+ <widget class="QDialog" name="ChangeNodeNameDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>418</width>
+ <height>249</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Change node name</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="6" column="0" colspan="2">
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="currentNodeNameLabel2">
+ <property name="text">
+ <string>old_name</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="currentNodeNameLabel1">
+ <property name="text">
+ <string>Current node name:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="newNodeNameLabel">
+ <property name="text">
+ <string>New node name:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0">
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="0">
+ <spacer name="verticalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="3" column="1">
+ <widget class="QLineEdit" name="newNodeNameLineEdit"/>
+ </item>
+ <item row="0" column="0" colspan="2">
+ <widget class="QLabel" name="label_4">
+ <property name="text">
+ <string>Enter a new name for the node. Both the node and its reverse complement will be renamed. A '+' will be appended to the name of the positive node and a '-' will be appended to the name of the negative node.</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="QLabel" name="errorLabel">
+ <property name="text">
+ <string>error</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <tabstops>
+ <tabstop>newNodeNameLineEdit</tabstop>
+ </tabstops>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>ChangeNodeNameDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>ChangeNodeNameDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/ui/colourbutton.cpp b/ui/colourbutton.cpp
new file mode 100644
index 0000000..220e2a2
--- /dev/null
+++ b/ui/colourbutton.cpp
@@ -0,0 +1,47 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "colourbutton.h"
+#include <QColorDialog>
+
+ColourButton::ColourButton(QWidget * parent) :
+ QPushButton(parent)
+{
+ connect(this, SIGNAL(clicked(bool)), this, SLOT(chooseColour()));
+}
+
+
+void ColourButton::setColour(QColor newColour)
+{
+ m_colour = newColour;
+
+ const QString COLOR_STYLE("QPushButton { background-color : %1 }");
+ setStyleSheet(COLOR_STYLE.arg(m_colour.name()));
+}
+
+
+
+void ColourButton::chooseColour()
+{
+ QColor chosenColour = QColorDialog::getColor(m_colour, this, m_name, QColorDialog::ShowAlphaChannel);
+ if (chosenColour.isValid())
+ {
+ setColour(chosenColour);
+ emit colourChosen(chosenColour);
+ }
+}
diff --git a/ui/colourbutton.h b/ui/colourbutton.h
new file mode 100644
index 0000000..c521129
--- /dev/null
+++ b/ui/colourbutton.h
@@ -0,0 +1,45 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef COLOURBUTTON_H
+#define COLOURBUTTON_H
+
+#include <QPushButton>
+#include <QColor>
+#include <QString>
+
+class ColourButton : public QPushButton
+{
+ Q_OBJECT
+
+public:
+ ColourButton(QWidget * parent = 0);
+
+ QColor m_colour;
+ QString m_name;
+
+ void setColour(QColor newColour);
+
+signals:
+ void colourChosen(QColor colour);
+
+public slots:
+ void chooseColour();
+};
+
+#endif // COLOURBUTTON_H
diff --git a/ui/enteroneblastquerydialog.cpp b/ui/enteroneblastquerydialog.cpp
new file mode 100644
index 0000000..2877f23
--- /dev/null
+++ b/ui/enteroneblastquerydialog.cpp
@@ -0,0 +1,57 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "enteroneblastquerydialog.h"
+#include "ui_enteroneblastquerydialog.h"
+#include "../program/settings.h"
+#include "../program/globals.h"
+#include <QDialogButtonBox>
+#include <QPushButton>
+
+EnterOneBlastQueryDialog::EnterOneBlastQueryDialog(QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::EnterOneBlastQueryDialog)
+{
+ ui->setupUi(this);
+ ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
+ connect(ui->sequenceTextEdit, SIGNAL(textChanged()), this, SLOT(sequenceChanged()));
+}
+
+EnterOneBlastQueryDialog::~EnterOneBlastQueryDialog()
+{
+ delete ui;
+}
+
+QString EnterOneBlastQueryDialog::getName()
+{
+ QString name = ui->nameLineEdit->text().simplified();
+ if (name == "")
+ name = g_settings->unnamedQueryDefaultName;
+ return name;
+}
+
+QString EnterOneBlastQueryDialog::getSequence()
+{
+ return ui->sequenceTextEdit->toPlainText().simplified().replace(" ", "");
+}
+
+void EnterOneBlastQueryDialog::sequenceChanged()
+{
+ bool someText = !ui->sequenceTextEdit->toPlainText().isEmpty();
+ ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(someText);
+}
diff --git a/ui/enteroneblastquerydialog.h b/ui/enteroneblastquerydialog.h
new file mode 100644
index 0000000..5c05025
--- /dev/null
+++ b/ui/enteroneblastquerydialog.h
@@ -0,0 +1,47 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef ENTERONEBLASTQUERYDIALOG_H
+#define ENTERONEBLASTQUERYDIALOG_H
+
+#include <QDialog>
+#include <QString>
+
+namespace Ui {
+class EnterOneBlastQueryDialog;
+}
+
+class EnterOneBlastQueryDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit EnterOneBlastQueryDialog(QWidget *parent = 0);
+ ~EnterOneBlastQueryDialog();
+
+ QString getName();
+ QString getSequence();
+
+private:
+ Ui::EnterOneBlastQueryDialog *ui;
+
+private slots:
+ void sequenceChanged();
+};
+
+#endif // ENTERONEBLASTQUERYDIALOG_H
diff --git a/ui/enteroneblastquerydialog.ui b/ui/enteroneblastquerydialog.ui
new file mode 100644
index 0000000..0e2386e
--- /dev/null
+++ b/ui/enteroneblastquerydialog.ui
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>EnterOneBlastQueryDialog</class>
+ <widget class="QDialog" name="EnterOneBlastQueryDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>300</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Enter BLAST query</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Name (optional):</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="nameLineEdit"/>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Sequence:</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2">
+ <widget class="Line" name="line">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" colspan="2">
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QPlainTextEdit" name="sequenceTextEdit"/>
+ </item>
+ </layout>
+ </widget>
+ <tabstops>
+ <tabstop>nameLineEdit</tabstop>
+ <tabstop>sequenceTextEdit</tabstop>
+ </tabstops>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>EnterOneBlastQueryDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>EnterOneBlastQueryDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/ui/graphicsviewzoom.cpp b/ui/graphicsviewzoom.cpp
new file mode 100644
index 0000000..a905b86
--- /dev/null
+++ b/ui/graphicsviewzoom.cpp
@@ -0,0 +1,117 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "graphicsviewzoom.h"
+#include <QMouseEvent>
+#include <QApplication>
+#include <QScrollBar>
+#include <qmath.h>
+#include "../program/settings.h"
+#include "mygraphicsview.h"
+
+GraphicsViewZoom::GraphicsViewZoom(MyGraphicsView * view) :
+ QObject(view), m_view(view)
+{
+ g_absoluteZoom = 1.0;
+ m_view->viewport()->installEventFilter(this);
+ m_view->setMouseTracking(true);
+ m_modifiers = Qt::ControlModifier;
+ m_zoomFactorBase = g_settings->zoomFactor;
+}
+
+void GraphicsViewZoom::gentleZoom(double factor, ZoomSource zoomSource)
+{
+
+ if (g_absoluteZoom * factor >= g_settings->maxZoom)
+ factor = g_settings->maxZoom / g_absoluteZoom;
+ if (g_absoluteZoom * factor <= g_settings->minZoom)
+ factor = g_settings->minZoom / g_absoluteZoom;
+
+ g_absoluteZoom *= factor;
+ m_view->scale(factor, factor);
+
+ if (zoomSource == MOUSE_WHEEL)
+ {
+ m_view->centerOn(targetScenePos);
+
+
+ QPointF deltaViewportPos = targetViewportPos - QPointF(m_view->viewport()->width() / 2.0,
+ m_view->viewport()->height() / 2.0);
+ QPointF viewport_center = m_view->mapFromScene(targetScenePos) - deltaViewportPos;
+ m_view->centerOn(m_view->mapToScene(viewport_center.toPoint()));
+ }
+
+ if (zoomSource != SPIN_BOX)
+ emit zoomed();
+}
+
+void GraphicsViewZoom::setModifiers(Qt::KeyboardModifiers modifiers)
+{
+ m_modifiers = modifiers;
+}
+
+void GraphicsViewZoom::setZoomFactorBase(double value)
+{
+ m_zoomFactorBase = value;
+}
+
+bool GraphicsViewZoom::eventFilter(QObject *object, QEvent *event)
+{
+ if (event->type() == QEvent::MouseMove)
+ {
+ QMouseEvent * mouseEvent = static_cast<QMouseEvent*>(event);
+ QPointF delta = targetViewportPos - mouseEvent->pos();
+ if (qAbs(delta.x()) > 5 || qAbs(delta.y()) > 5)
+ {
+ targetViewportPos = mouseEvent->pos();
+ targetScenePos = m_view->mapToScene(mouseEvent->pos());
+ }
+ }
+ else if (event->type() == QEvent::Wheel)
+ {
+ QWheelEvent * wheelEvent = static_cast<QWheelEvent*>(event);
+ if (QApplication::keyboardModifiers() == m_modifiers)
+ {
+ if (wheelEvent->orientation() == Qt::Vertical)
+ {
+ double angle = wheelEvent->angleDelta().y();
+ double factor = qPow(m_zoomFactorBase, angle);
+ gentleZoom(factor, MOUSE_WHEEL);
+ return true;
+ }
+ }
+ }
+ else if (event->type() == QEvent::NativeGesture)
+ {
+ QNativeGestureEvent * gestureEvent = static_cast<QNativeGestureEvent *>(event);
+ if (gestureEvent->gestureType() == Qt::ZoomNativeGesture)
+ {
+ double factor = 1.0 + gestureEvent->value();
+ gentleZoom(factor, GESTURE);
+ return true;
+ }
+ else if (gestureEvent->gestureType() == Qt::RotateNativeGesture)
+ {
+ double angle = gestureEvent->value();
+ m_view->changeRotation(angle);
+ }
+ }
+
+ Q_UNUSED(object)
+ return false;
+}
diff --git a/ui/graphicsviewzoom.h b/ui/graphicsviewzoom.h
new file mode 100644
index 0000000..f5f9ed2
--- /dev/null
+++ b/ui/graphicsviewzoom.h
@@ -0,0 +1,82 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef GRAPHICS_VIEW_ZOOM_H
+#define GRAPHICS_VIEW_ZOOM_H
+
+#include <QObject>
+#include <QGraphicsView>
+#include "../program/globals.h"
+
+// This class is a modified version of:
+// http://stackoverflow.com/questions/19113532/qgraphicsview-zooming-in-and-out-under-mouse-position-using-mouse-wheel
+
+/*!
+ * This class adds ability to zoom QGraphicsView using mouse wheel. The point under cursor
+ * remains motionless while it's possible.
+ *
+ * Note that it becomes not possible when the scene's
+ * size is not large enough comparing to the viewport size. QGraphicsView centers the picture
+ * when it's smaller than the view. And QGraphicsView's scrolls boundaries don't allow to
+ * put any picture point at any viewport position.
+ *
+ * When the user starts scrolling, this class remembers original scene position and
+ * keeps it until scrolling is completed. It's better than getting original scene position at
+ * each scrolling step because that approach leads to position errors due to before-mentioned
+ * positioning restrictions.
+ *
+ * When zoomed using scroll, this class emits zoomed() signal.
+ *
+ * Usage:
+ *
+ * new GraphicsViewZoom(view);
+ *
+ * The object will be deleted automatically when the view is deleted.
+ *
+ * You can set keyboard modifiers used for zooming using set_modified(). Zooming will be
+ * performed only on exact match of modifiers combination. The default modifier is Ctrl.
+ *
+ * You can change zoom velocity by calling setZoomFactorBase().
+ * Zoom coefficient is calculated as zoom_factor_base^angle_delta
+ * (see QWheelEvent::angleDelta).
+ * The default zoom factor base is 1.0015.
+ */
+
+class MyGraphicsView;
+
+class GraphicsViewZoom : public QObject
+{
+ Q_OBJECT
+public:
+ GraphicsViewZoom(MyGraphicsView * view);
+ void gentleZoom(double factor, ZoomSource zoomSource);
+ void setModifiers(Qt::KeyboardModifiers modifiers);
+ void setZoomFactorBase(double value);
+ double m_zoomFactorBase;
+
+private:
+ MyGraphicsView * m_view;
+ Qt::KeyboardModifiers m_modifiers;
+ QPointF targetScenePos, targetViewportPos;
+ bool eventFilter(QObject * object, QEvent * event);
+
+signals:
+ void zoomed();
+};
+
+#endif // GRAPHICS_VIEW_ZOOM_H
diff --git a/ui/graphinfodialog.cpp b/ui/graphinfodialog.cpp
new file mode 100644
index 0000000..a33e075
--- /dev/null
+++ b/ui/graphinfodialog.cpp
@@ -0,0 +1,182 @@
+#include "graphinfodialog.h"
+#include "ui_graphinfodialog.h"
+
+#include "../program/globals.h"
+#include "../graph/assemblygraph.h"
+#include <QPair>
+
+GraphInfoDialog::GraphInfoDialog(QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::GraphInfoDialog)
+{
+ ui->setupUi(this);
+
+ setLabels();
+ setInfoTexts();
+}
+
+
+GraphInfoDialog::~GraphInfoDialog()
+{
+ delete ui;
+}
+
+
+
+void GraphInfoDialog::setLabels()
+{
+ ui->filenameLabel->setText(g_assemblyGraph->m_filename);
+
+ int nodeCount = g_assemblyGraph->m_nodeCount;
+
+ ui->nodeCountLabel->setText(formatIntForDisplay(nodeCount));
+ ui->edgeCountLabel->setText(formatIntForDisplay(g_assemblyGraph->m_edgeCount));
+
+ if (g_assemblyGraph->m_edgeCount == 0)
+ ui->edgeOverlapRangeLabel->setText("n/a");
+ else
+ {
+ QPair<int, int> overlapRange = g_assemblyGraph->getOverlapRange();
+ int smallestOverlap = overlapRange.first;
+ int largestOverlap = overlapRange.second;
+ if (smallestOverlap == largestOverlap)
+ ui->edgeOverlapRangeLabel->setText(formatIntForDisplay(smallestOverlap) + " bp");
+ else
+ ui->edgeOverlapRangeLabel->setText(formatIntForDisplay(smallestOverlap) + " to " + formatIntForDisplay(largestOverlap) + " bp");
+ }
+
+ ui->totalLengthLabel->setText(formatIntForDisplay(g_assemblyGraph->m_totalLength) + " bp");
+ ui->totalLengthNoOverlapsLabel->setText(formatIntForDisplay(g_assemblyGraph->getTotalLengthMinusEdgeOverlaps()) + " bp");
+
+ int deadEnds = g_assemblyGraph->getDeadEndCount();
+ double percentageDeadEnds = 100.0 * double(deadEnds) / (2 * nodeCount);
+
+ ui->deadEndsLabel->setText(formatIntForDisplay(deadEnds));
+ ui->percentageDeadEndsLabel->setText(formatDoubleForDisplay(percentageDeadEnds, 2) + "%");
+
+
+ int componentCount = 0;
+ int largestComponentLength = 0;
+ g_assemblyGraph->getGraphComponentCountAndLargestComponentSize(&componentCount, &largestComponentLength);
+ QString percentageLargestComponent;
+ if (g_assemblyGraph->m_totalLength > 0)
+ percentageLargestComponent = formatDoubleForDisplay(100.0 * double(largestComponentLength) / g_assemblyGraph->m_totalLength, 2);
+ else
+ percentageLargestComponent = "n/a";
+
+ long long totalLengthOrphanedNodes = g_assemblyGraph->getTotalLengthOrphanedNodes();
+ QString percentageOrphaned;
+ if (g_assemblyGraph->m_totalLength > 0)
+ percentageOrphaned = formatDoubleForDisplay(100.0 * double(totalLengthOrphanedNodes) / g_assemblyGraph->m_totalLength, 2);
+ else
+ percentageOrphaned = "n/a";
+
+ ui->connectedComponentsLabel->setText(formatIntForDisplay(componentCount));
+ ui->largestComponentLabel->setText(formatIntForDisplay(largestComponentLength) + " bp (" + percentageLargestComponent + "%)");
+ ui->orphanedLengthLabel->setText(formatIntForDisplay(totalLengthOrphanedNodes) + " bp (" + percentageOrphaned + "%)");
+
+ int n50 = 0;
+ int shortestNode = 0;
+ int firstQuartile = 0;
+ int median = 0;
+ int thirdQuartile = 0;
+ int longestNode = 0;
+ g_assemblyGraph->getNodeStats(&n50, &shortestNode, &firstQuartile, &median, &thirdQuartile, &longestNode);
+
+ ui->n50Label->setText(formatIntForDisplay(n50) + " bp");
+ ui->shortestNodeLabel->setText(formatIntForDisplay(shortestNode) + " bp");
+ ui->lowerQuartileNodeLabel->setText(formatIntForDisplay(firstQuartile) + " bp");
+ ui->medianNodeLabel->setText(formatIntForDisplay(median) + " bp");
+ ui->upperQuartileNodeLabel->setText(formatIntForDisplay(thirdQuartile) + " bp");
+ ui->longestNodeLabel->setText(formatIntForDisplay(longestNode) + " bp");
+
+ double medianDepthByBase = g_assemblyGraph->getMedianDepthByBase();
+ long long estimatedSequenceLength = g_assemblyGraph->getEstimatedSequenceLength(medianDepthByBase);
+
+ ui->medianDepthLabel->setText(formatDepthForDisplay(medianDepthByBase));
+ if (medianDepthByBase == 0.0)
+ ui->estimatedSequenceLengthLabel->setText("unavailable");
+ else
+ ui->estimatedSequenceLengthLabel->setText(formatIntForDisplay(estimatedSequenceLength) + " bp");
+}
+
+
+
+
+
+void GraphInfoDialog::setInfoTexts()
+{
+ ui->nodeCountInfoText->setInfoText("The number of positive nodes in the graph.<br><br>"
+ "Since only positive nodes are counted, each complementary node pair counts "
+ "as one.");
+ ui->edgeCountInfoText->setInfoText("The number of positive edges in the graph.<br><br>"
+ "Since only positive edges are counted, each complementary edge pair counts "
+ "as one.");
+ ui->edgeOverlapRangeInfoText->setInfoText("The sequence overlap size for edges in the graph<br><br>"
+ "For most graphs, this will either be zero or a single value, but it is "
+ "also possible for a graph to have edges with different overlaps, "
+ "in which case this will show the range.");
+ ui->totalLengthInfoText->setInfoText("The total length of all sequences in positive nodes.<br><br>"
+ "This value is a simple sum of node sequence lengths and does not take "
+ "node overlaps into account.");
+ ui->totalLengthNoOverlapsInfoText->setInfoText("The total length of all sequences in positive nodes, with the edge "
+ "overlaps removed.<br><br>"
+ "This value is the above 'Total length' minus the total overlaps in "
+ "positive edges. If the edges in the graph do not contain "
+ "overlaps, then this value will be the same as 'Total length'.");
+ ui->deadEndsInfoText->setInfoText("The number of dead ends (node ends without any connected edges) in all positive "
+ "nodes.<br><br>"
+ "This value will range from 0 (in a graph where all nodes have connected edges "
+ "on both ends) to two times the node count (in a graph without any edges).");
+ ui->percentageDeadEndsInfoText->setInfoText("The fraction of possible dead ends in the graph.<br><br>"
+ "This value is equal to 'Dead ends' divided by twice the node count. "
+ "It ranges from 0% (in a graph where all nodes have connected edges "
+ "on both ends) to 100% (in a graph without any edges).");
+ ui->connectedComponentsInfoText->setInfoText("The number of separate connected components in the graph. A "
+ "connected component is a subgraph which is connected by edges to "
+ "other nodes in the subgraph but disconnected from the rest of the "
+ "graph.");
+ ui->largestComponentInfoText->setInfoText("The total length of nodes in the largest connected component in the "
+ "graph (and the proportion of the total length in this component).");
+ ui->orphanedLengthInfoText->setInfoText("The total length of all nodes which have no edges, i.e. a dead end on "
+ "both sides (and the proportion of the total length in orphaned nodes).");
+ ui->n50InfoText->setInfoText("The N50 node length.<br><br>"
+ "The sum of lengths for nodes this size and larger is at least 50% of the total "
+ "length.");
+ ui->shortestNodeInfoText->setInfoText("The length of the shortest node in the graph.");
+ ui->lowerQuartileNodeInfoText->setInfoText("The first quartile node length in the graph.<br><br>"
+ "One quarter of the nodes are shorter than this length and three quarters "
+ "are longer.");
+ ui->medianNodeInfoText->setInfoText("The median node length in the graph.<br><br>"
+ "Half of the nodes are shorter than this length and half are longer.");
+ ui->upperQuartileNodeInfoText->setInfoText("The third quartile node length in the graph.<br><br>"
+ "Three quarters of the nodes are shorter than this length and one quarter "
+ "are longer.");
+ ui->longestNodeInfoText->setInfoText("The length of the longest node in the graph.");
+ ui->medianDepthInfoText->setInfoText("The median depth of the graph nodes, by base.<br><br>"
+ "For most assemblies (assuming the majority of sequences are not repeats) "
+ "this value will indicate the approximate depth of nodes for "
+ "sequences that occur once.<br><br>"
+ "E.g. if this value is 14.5x, then:<ul>"
+ "<li>a node with depth 14.2x probably represents a sequence which "
+ "occurs once</li>"
+ "<li>a node with depth 29.3x probably represents a sequence which "
+ "occurs twice</li>"
+ "<li>a node with depth 43.4x probably represents a sequence which "
+ "occurs twice</li>"
+ "<li>etc.</li></ul>");
+ ui->estimatedSequenceLengthInfoText->setInfoText("An estimate of the underlying sequence length, accounting for "
+ "repeated sequences.<br><br>"
+ "Repeated sequences can result in the graph's total length being "
+ "less than the total length of the underlying sequence. This is "
+ "because a sequence which occurs multiple times may assemble into "
+ "a single node.<br><br>"
+ "To account for this, Bandage estimates sequence length by using "
+ "median depth to assign a copy number count to each node. "
+ "The node lengths are then multipled by this copy number and "
+ "totalled (with any overlap sequences removed).<br><br>"
+ "Note that this value represents an estimate of the number of "
+ "base pairs per cell. So if a bacterial cell contained 20 copies "
+ "of a 10 kb plasmid, then that plasmid would contribute 200 kb to "
+ "this value.");
+}
diff --git a/ui/graphinfodialog.h b/ui/graphinfodialog.h
new file mode 100644
index 0000000..f70fbcf
--- /dev/null
+++ b/ui/graphinfodialog.h
@@ -0,0 +1,25 @@
+#ifndef GRAPHINFODIALOG_H
+#define GRAPHINFODIALOG_H
+
+#include <QDialog>
+
+namespace Ui {
+class GraphInfoDialog;
+}
+
+class GraphInfoDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit GraphInfoDialog(QWidget *parent = 0);
+ ~GraphInfoDialog();
+
+private:
+ Ui::GraphInfoDialog *ui;
+
+ void setLabels();
+ void setInfoTexts();
+};
+
+#endif // GRAPHINFODIALOG_H
diff --git a/ui/graphinfodialog.ui b/ui/graphinfodialog.ui
new file mode 100644
index 0000000..d418be9
--- /dev/null
+++ b/ui/graphinfodialog.ui
@@ -0,0 +1,1002 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>GraphInfoDialog</class>
+ <widget class="QDialog" name="GraphInfoDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>527</width>
+ <height>468</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Graph information</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item row="0" column="0" colspan="2">
+ <widget class="QWidget" name="widget_3" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QLabel" name="label_20">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>File name:</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="filenameLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>filename</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2">
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Close</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QWidget" name="widget" native="true">
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="3" column="2">
+ <widget class="QLabel" name="edgeCountLabel">
+ <property name="text">
+ <string>0</string>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" colspan="3">
+ <widget class="QLabel" name="label_13">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Graph size</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="2">
+ <widget class="QLabel" name="totalLengthNoOverlapsLabel">
+ <property name="text">
+ <string>0</string>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item row="13" column="1">
+ <widget class="QLabel" name="label_10">
+ <property name="text">
+ <string>Largest component:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QLabel" name="nodeCountLabel">
+ <property name="text">
+ <string>0</string>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Node count:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="12" column="0">
+ <widget class="InfoTextWidget" name="connectedComponentsInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="11" column="2">
+ <widget class="QLabel" name="percentageDeadEndsLabel">
+ <property name="text">
+ <string>0</string>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item row="15" column="1" colspan="2">
+ <spacer name="verticalSpacer_5">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="5" column="0">
+ <widget class="InfoTextWidget" name="totalLengthInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="10" column="2">
+ <widget class="QLabel" name="deadEndsLabel">
+ <property name="text">
+ <string>0</string>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Edge count:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>Total length:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="13" column="2">
+ <widget class="QLabel" name="largestComponentLabel">
+ <property name="text">
+ <string>0</string>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item row="13" column="0">
+ <widget class="InfoTextWidget" name="largestComponentInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="9" column="0" colspan="3">
+ <widget class="Line" name="line_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="10" column="1">
+ <widget class="QLabel" name="label_7">
+ <property name="text">
+ <string>Dead ends:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="12" column="1">
+ <widget class="QLabel" name="label_9">
+ <property name="text">
+ <string>Connected components:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="InfoTextWidget" name="edgeCountInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="11" column="0">
+ <widget class="InfoTextWidget" name="percentageDeadEndsInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="12" column="2">
+ <widget class="QLabel" name="connectedComponentsLabel">
+ <property name="text">
+ <string>0</string>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="1">
+ <widget class="QLabel" name="label_30">
+ <property name="text">
+ <string>Total length (no overlaps):</string>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="1" colspan="2">
+ <spacer name="verticalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="10" column="0">
+ <widget class="InfoTextWidget" name="deadEndsInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0">
+ <widget class="InfoTextWidget" name="totalLengthNoOverlapsInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="2">
+ <widget class="QLabel" name="totalLengthLabel">
+ <property name="text">
+ <string>0</string>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="0" colspan="3">
+ <widget class="QLabel" name="label_14">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Graph connectivity</string>
+ </property>
+ </widget>
+ </item>
+ <item row="11" column="1">
+ <widget class="QLabel" name="label_8">
+ <property name="text">
+ <string>Percentage dead ends:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="3">
+ <widget class="Line" name="line">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="InfoTextWidget" name="nodeCountInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="2">
+ <widget class="QLabel" name="edgeOverlapRangeLabel">
+ <property name="text">
+ <string>0</string>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="InfoTextWidget" name="edgeOverlapRangeInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="QLabel" name="label_4">
+ <property name="text">
+ <string>Edge overlaps:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="14" column="1">
+ <widget class="QLabel" name="label_21">
+ <property name="text">
+ <string>Total length orphaned nodes:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="14" column="2">
+ <widget class="QLabel" name="orphanedLengthLabel">
+ <property name="text">
+ <string>0</string>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item row="14" column="0">
+ <widget class="InfoTextWidget" name="orphanedLengthInfoText" native="true">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QWidget" name="widget_2" native="true">
+ <layout class="QGridLayout" name="gridLayout_3">
+ <item row="6" column="3">
+ <widget class="QLabel" name="upperQuartileNodeLabel">
+ <property name="text">
+ <string>0</string>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QLabel" name="label_11">
+ <property name="text">
+ <string>N50:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="2" colspan="2">
+ <spacer name="verticalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="11" column="3">
+ <widget class="QLabel" name="medianDepthLabel">
+ <property name="text">
+ <string>0</string>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="2">
+ <widget class="QLabel" name="label_18">
+ <property name="text">
+ <string>Upper quartile node:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="3">
+ <widget class="QLabel" name="medianNodeLabel">
+ <property name="text">
+ <string>0</string>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="2">
+ <widget class="QLabel" name="label_16">
+ <property name="text">
+ <string>Lower quartile node:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3">
+ <widget class="QLabel" name="n50Label">
+ <property name="text">
+ <string>0</string>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item row="13" column="2">
+ <spacer name="verticalSpacer_6">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="1">
+ <widget class="InfoTextWidget" name="n50InfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="InfoTextWidget" name="shortestNodeInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="InfoTextWidget" name="lowerQuartileNodeInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1">
+ <widget class="InfoTextWidget" name="medianNodeInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="1">
+ <widget class="InfoTextWidget" name="upperQuartileNodeInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="1">
+ <widget class="InfoTextWidget" name="longestNodeInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="10" column="1" colspan="3">
+ <widget class="Line" name="line_4">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="11" column="1">
+ <widget class="InfoTextWidget" name="medianDepthInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="12" column="1">
+ <widget class="InfoTextWidget" name="estimatedSequenceLengthInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" colspan="3">
+ <widget class="Line" name="line_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="9" column="1" colspan="2">
+ <widget class="QLabel" name="label_32">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Depth</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" colspan="2">
+ <widget class="QLabel" name="label_15">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Node sizes</string>
+ </property>
+ </widget>
+ </item>
+ <item row="12" column="3">
+ <widget class="QLabel" name="estimatedSequenceLengthLabel">
+ <property name="text">
+ <string>0</string>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item row="12" column="2">
+ <widget class="QLabel" name="label_34">
+ <property name="text">
+ <string>Estimated sequence length:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="3">
+ <widget class="QLabel" name="lowerQuartileNodeLabel">
+ <property name="text">
+ <string>0</string>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="3">
+ <widget class="QLabel" name="longestNodeLabel">
+ <property name="text">
+ <string>0</string>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="2">
+ <widget class="QLabel" name="label_17">
+ <property name="text">
+ <string>Median node:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="3">
+ <widget class="QLabel" name="shortestNodeLabel">
+ <property name="text">
+ <string>0</string>
+ </property>
+ <property name="textInteractionFlags">
+ <set>Qt::LinksAccessibleByMouse|Qt::TextSelectableByKeyboard|Qt::TextSelectableByMouse</set>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="2">
+ <widget class="QLabel" name="label_19">
+ <property name="text">
+ <string>Longest node:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="11" column="2">
+ <widget class="QLabel" name="label_33">
+ <property name="text">
+ <string>Median depth:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2">
+ <widget class="QLabel" name="label_12">
+ <property name="text">
+ <string>Shortest node:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="9" column="0">
+ <spacer name="horizontalSpacer_5">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>30</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>InfoTextWidget</class>
+ <extends>QWidget</extends>
+ <header>infotextwidget.h</header>
+ <container>1</container>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>GraphInfoDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>GraphInfoDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/ui/infotextwidget.cpp b/ui/infotextwidget.cpp
new file mode 100644
index 0000000..b497471
--- /dev/null
+++ b/ui/infotextwidget.cpp
@@ -0,0 +1,76 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Grovolve.
+
+//Grovolve is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Grovolve is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Grovolve. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "infotextwidget.h"
+#include <QPainter>
+#include <QToolTip>
+#include <QMouseEvent>
+
+
+InfoTextWidget::InfoTextWidget(QWidget * parent) :
+ QWidget(parent)
+{
+ setFixedSize(16, 16);
+ setMouseTracking(true);
+}
+
+InfoTextWidget::InfoTextWidget(QWidget * parent, QString infoText) :
+ QWidget(parent)
+{
+ setFixedSize(16, 16);
+ setMouseTracking(true);
+ setInfoText(infoText);
+}
+
+void InfoTextWidget::setInfoText(QString infoText)
+{
+ //Convert text to a rich text format, which will let QToolTip wrap the text.
+ m_infoText = "<html>" + infoText + "</html>";
+}
+
+
+void InfoTextWidget::paintEvent(QPaintEvent * /*event*/)
+{
+ QPainter painter(this);
+
+ QPixmap infoIcon;
+ if (isEnabled())
+ infoIcon = QPixmap(":/icons/information-256.png");
+ else
+ infoIcon = QPixmap(":/icons/information-256-inactive.png");
+
+ //This scaling using the device pixel ratio was necessary to make the labels look right on a MacBook retina display.
+ double scaledWidth = width() * devicePixelRatio();
+ double scaledHeight = height() * devicePixelRatio();
+ double scaledSize = std::min(scaledWidth, scaledHeight);
+
+ QPixmap scaledInfoIcon = infoIcon.scaled(scaledSize, scaledSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
+
+ scaledInfoIcon.setDevicePixelRatio(devicePixelRatio());
+
+ double topLeftX = scaledWidth / 2.0 - scaledSize / 2.0;
+ double topLeftY = scaledHeight / 2.0 - scaledSize / 2.0;
+
+ painter.drawPixmap(topLeftX, topLeftY, scaledInfoIcon);
+}
+
+
+void InfoTextWidget::mousePressEvent(QMouseEvent * event)
+{
+ QToolTip::showText(event->globalPos(), m_infoText);
+}
diff --git a/ui/infotextwidget.h b/ui/infotextwidget.h
new file mode 100644
index 0000000..ad44884
--- /dev/null
+++ b/ui/infotextwidget.h
@@ -0,0 +1,42 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage.
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef INFOTEXTWIDGET_H
+#define INFOTEXTWIDGET_H
+
+#include <QWidget>
+#include <QString>
+
+class InfoTextWidget : public QWidget
+{
+ Q_OBJECT
+public:
+ explicit InfoTextWidget(QWidget * parent);
+ explicit InfoTextWidget(QWidget * parent, QString infoText);
+
+ void setInfoText(QString infoText);
+
+protected:
+ void paintEvent(QPaintEvent *);
+ void mousePressEvent(QMouseEvent * event);
+
+private:
+ QString m_infoText;
+};
+
+#endif // INFOTEXTWIDGET_H
diff --git a/ui/mainwindow.cpp b/ui/mainwindow.cpp
new file mode 100644
index 0000000..28a603b
--- /dev/null
+++ b/ui/mainwindow.cpp
@@ -0,0 +1,2502 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "mainwindow.h"
+#include "ui_mainwindow.h"
+#include <QFileDialog>
+#include <QLatin1String>
+#include <QTextStream>
+#include <QLocale>
+#include <QRegExp>
+#include "../ogdf/energybased/FMMMLayout.h"
+#include <math.h>
+#include "../program/settings.h"
+#include <QClipboard>
+#include <QTransform>
+#include <QFontDialog>
+#include <QColorDialog>
+#include <algorithm>
+#include <QFile>
+#include <QTextStream>
+#include <QScrollBar>
+#include "settingsdialog.h"
+#include <stdlib.h>
+#include <time.h>
+#include <QProgressDialog>
+#include <QThread>
+#include "../program/graphlayoutworker.h"
+#include <QRegExp>
+#include <QMessageBox>
+#include <QInputDialog>
+#include <QShortcut>
+#include "aboutdialog.h"
+#include <QMainWindow>
+#include "blastsearchdialog.h"
+#include "../graph/assemblygraph.h"
+#include "mygraphicsview.h"
+#include "graphicsviewzoom.h"
+#include "mygraphicsscene.h"
+#include "../blast/blastsearch.h"
+#include "../graph/debruijnnode.h"
+#include "../graph/debruijnedge.h"
+#include "../graph/graphicsitemnode.h"
+#include "../graph/graphicsitemedge.h"
+#include "myprogressdialog.h"
+#include <limits>
+#include <QDesktopServices>
+#include <QSvgGenerator>
+#include "../graph/path.h"
+#include "pathspecifydialog.h"
+#include "../program/memory.h"
+#include "changenodenamedialog.h"
+#include "changenodedepthdialog.h"
+#include <limits>
+#include "graphinfodialog.h"
+
+MainWindow::MainWindow(QString fileToLoadOnStartup, bool drawGraphAfterLoad) :
+ QMainWindow(0),
+ ui(new Ui::MainWindow), m_layoutThread(0), m_imageFilter("PNG (*.png)"),
+ m_fileToLoadOnStartup(fileToLoadOnStartup), m_drawGraphAfterLoad(drawGraphAfterLoad),
+ m_uiState(NO_GRAPH_LOADED), m_blastSearchDialog(0), m_alreadyShown(false)
+{
+ ui->setupUi(this);
+
+ QApplication::setWindowIcon(QIcon(QPixmap(":/icons/icon.png")));
+ ui->graphicsViewWidget->layout()->addWidget(g_graphicsView);
+
+ srand(time(NULL));
+
+ //Make a temp directory to hold the BLAST files.
+ //Since Bandage is running in GUI mode, we make it in the system's
+ //temp area - out of the way for the user.
+ g_blastSearch->m_tempDirectory = QDir::tempPath() + "/bandage_temp-" + QString::number(QApplication::applicationPid()) + "/";
+ if (!QDir().mkdir(g_blastSearch->m_tempDirectory))
+ {
+ QMessageBox::warning(this, "Error", "A temporary directory could not be created. BLAST search functionality will not be available");
+ return;
+ }
+ else
+ g_blastSearch->m_blastQueries.createTempQueryFiles();
+
+ m_previousZoomSpinBoxValue = ui->zoomSpinBox->value();
+ ui->zoomSpinBox->setMinimum(g_settings->minZoom * 100.0);
+ ui->zoomSpinBox->setMaximum(g_settings->maxZoom * 100.0);
+
+ //The normal height of the QPlainTextEdit objects is a bit much,
+ //so fix them at a smaller height.
+ ui->selectedNodesTextEdit->setFixedHeight(ui->selectedNodesTextEdit->sizeHint().height() / 2.5);
+ ui->selectedEdgesTextEdit->setFixedHeight(ui->selectedEdgesTextEdit->sizeHint().height() / 2.5);
+
+ setUiState(NO_GRAPH_LOADED);
+
+ m_graphicsViewZoom = new GraphicsViewZoom(g_graphicsView);
+ g_graphicsView->m_zoom = m_graphicsViewZoom;
+
+ m_scene = new MyGraphicsScene(this);
+ g_graphicsView->setScene(m_scene);
+
+ setInfoTexts();
+
+ //Nothing is selected yet, so this will hide the appropriate labels.
+ selectionChanged();
+
+ //The user may have specified settings on the command line, so it is now
+ //necessary to update the UI to match these settings.
+ setWidgetsFromSettings();
+ setTextDisplaySettings();
+
+ graphScopeChanged();
+ switchColourScheme();
+
+ //If this is a Mac, change the 'Delete' shortcuts to 'Backspace' instead.
+#ifdef Q_OS_MAC
+ ui->actionHide_selected_nodes->setShortcut(Qt::Key_Backspace);
+ ui->actionRemove_selection_from_graph->setShortcut(Qt::SHIFT + Qt::Key_Backspace);
+#endif
+
+ connect(ui->drawGraphButton, SIGNAL(clicked()), this, SLOT(drawGraph()));
+ connect(ui->actionLoad_graph, SIGNAL(triggered()), this, SLOT(loadGraph()));
+ connect(ui->actionLoad_CSV, SIGNAL(triggered(bool)), this, SLOT(loadCSV()));
+ connect(ui->actionExit, SIGNAL(triggered()), this, SLOT(close()));
+ connect(ui->graphScopeComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(graphScopeChanged()));
+ connect(ui->zoomSpinBox, SIGNAL(valueChanged(double)), this, SLOT(zoomSpinBoxChanged()));
+ connect(m_graphicsViewZoom, SIGNAL(zoomed()), this, SLOT(zoomedWithMouseWheel()));
+ connect(ui->actionCopy_selected_node_sequences_to_clipboard, SIGNAL(triggered()), this, SLOT(copySelectedSequencesToClipboardActionTriggered()));
+ connect(ui->actionSave_selected_node_sequences_to_FASTA, SIGNAL(triggered()), this, SLOT(saveSelectedSequencesToFileActionTriggered()));
+ connect(ui->actionCopy_selected_node_path_to_clipboard, SIGNAL(triggered(bool)), this, SLOT(copySelectedPathToClipboard()));
+ connect(ui->actionSave_selected_node_path_to_FASTA, SIGNAL(triggered(bool)), this, SLOT(saveSelectedPathToFile()));
+ connect(ui->coloursComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(switchColourScheme()));
+ connect(ui->actionSave_image_current_view, SIGNAL(triggered()), this, SLOT(saveImageCurrentView()));
+ connect(ui->actionSave_image_entire_scene, SIGNAL(triggered()), this, SLOT(saveImageEntireScene()));
+ connect(ui->nodeCustomLabelsCheckBox, SIGNAL(toggled(bool)), this, SLOT(setTextDisplaySettings()));
+ connect(ui->nodeNamesCheckBox, SIGNAL(toggled(bool)), this, SLOT(setTextDisplaySettings()));
+ connect(ui->nodeLengthsCheckBox, SIGNAL(toggled(bool)), this, SLOT(setTextDisplaySettings()));
+ connect(ui->nodeDepthCheckBox, SIGNAL(toggled(bool)), this, SLOT(setTextDisplaySettings()));
+ connect(ui->csvCheckBox, SIGNAL(toggled(bool)), this, SLOT(setTextDisplaySettings()));
+ connect(ui->csvComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(setTextDisplaySettings()));
+ connect(ui->blastHitsCheckBox, SIGNAL(toggled(bool)), this, SLOT(setTextDisplaySettings()));
+ connect(ui->textOutlineCheckBox, SIGNAL(toggled(bool)), this, SLOT(setTextDisplaySettings()));
+ connect(ui->fontButton, SIGNAL(clicked()), this, SLOT(fontButtonPressed()));
+ connect(ui->setNodeCustomColourButton, SIGNAL(clicked()), this, SLOT(setNodeCustomColour()));
+ connect(ui->setNodeCustomLabelButton, SIGNAL(clicked()), this, SLOT(setNodeCustomLabel()));
+ connect(ui->actionSettings, SIGNAL(triggered()), this, SLOT(openSettingsDialog()));
+ connect(ui->selectNodesButton, SIGNAL(clicked()), this, SLOT(selectUserSpecifiedNodes()));
+ connect(ui->selectionSearchNodesLineEdit, SIGNAL(returnPressed()), this, SLOT(selectUserSpecifiedNodes()));
+ connect(ui->actionAbout, SIGNAL(triggered()), this, SLOT(openAboutDialog()));
+ connect(ui->blastSearchButton, SIGNAL(clicked()), this, SLOT(openBlastSearchDialog()));
+ connect(ui->blastQueryComboBox, SIGNAL(currentIndexChanged(int)), this, SLOT(blastQueryChanged()));
+ connect(ui->actionControls_panel, SIGNAL(toggled(bool)), this, SLOT(showHidePanels()));
+ connect(ui->actionSelection_panel, SIGNAL(toggled(bool)), this, SLOT(showHidePanels()));
+ connect(ui->contiguityButton, SIGNAL(clicked()), this, SLOT(determineContiguityFromSelectedNode()));
+ connect(ui->actionBring_selected_nodes_to_front, SIGNAL(triggered()), this, SLOT(bringSelectedNodesToFront()));
+ connect(ui->actionSelect_nodes_with_BLAST_hits, SIGNAL(triggered()), this, SLOT(selectNodesWithBlastHits()));
+ connect(ui->actionSelect_all, SIGNAL(triggered()), this, SLOT(selectAll()));
+ connect(ui->actionSelect_none, SIGNAL(triggered()), this, SLOT(selectNone()));
+ connect(ui->actionInvert_selection, SIGNAL(triggered()), this, SLOT(invertSelection()));
+ connect(ui->actionZoom_to_selection, SIGNAL(triggered()), this, SLOT(zoomToSelection()));
+ connect(ui->actionSelect_contiguous_nodes, SIGNAL(triggered()), this, SLOT(selectContiguous()));
+ connect(ui->actionSelect_possibly_contiguous_nodes, SIGNAL(triggered()), this, SLOT(selectMaybeContiguous()));
+ connect(ui->actionSelect_not_contiguous_nodes, SIGNAL(triggered()), this, SLOT(selectNotContiguous()));
+ connect(ui->actionBandage_online_help, SIGNAL(triggered()), this, SLOT(openBandageUrl()));
+ connect(ui->nodeDistanceSpinBox, SIGNAL(valueChanged(int)), this, SLOT(nodeDistanceChanged()));
+ connect(ui->minDepthSpinBox, SIGNAL(valueChanged(double)), this, SLOT(depthRangeChanged()));
+ connect(ui->maxDepthSpinBox, SIGNAL(valueChanged(double)), this, SLOT(depthRangeChanged()));
+ connect(ui->startingNodesExactMatchRadioButton, SIGNAL(toggled(bool)), this, SLOT(startingNodesExactMatchChanged()));
+ connect(ui->actionSpecify_exact_path_for_copy_save, SIGNAL(triggered()), this, SLOT(openPathSpecifyDialog()));
+ connect(ui->nodeWidthSpinBox, SIGNAL(valueChanged(double)), this, SLOT(nodeWidthChanged()));
+ connect(g_graphicsView, SIGNAL(copySelectedSequencesToClipboard()), this, SLOT(copySelectedSequencesToClipboard()));
+ connect(g_graphicsView, SIGNAL(saveSelectedSequencesToFile()), this, SLOT(saveSelectedSequencesToFile()));
+ connect(ui->actionSave_entire_graph_to_FASTA, SIGNAL(triggered(bool)), this, SLOT(saveEntireGraphToFasta()));
+ connect(ui->actionSave_entire_graph_to_FASTA_only_positive_nodes, SIGNAL(triggered(bool)), this, SLOT(saveEntireGraphToFastaOnlyPositiveNodes()));
+ connect(ui->actionSave_entire_graph_to_GFA, SIGNAL(triggered(bool)), this, SLOT(saveEntireGraphToGfa()));
+ connect(ui->actionSave_visible_graph_to_GFA, SIGNAL(triggered(bool)), this, SLOT(saveVisibleGraphToGfa()));
+ connect(ui->actionWeb_BLAST_selected_nodes, SIGNAL(triggered(bool)), this, SLOT(webBlastSelectedNodes()));
+ connect(ui->actionHide_selected_nodes, SIGNAL(triggered(bool)), this, SLOT(hideNodes()));
+ connect(ui->actionRemove_selection_from_graph, SIGNAL(triggered(bool)), this, SLOT(removeSelection()));
+ connect(ui->actionDuplicate_selected_nodes, SIGNAL(triggered(bool)), this, SLOT(duplicateSelectedNodes()));
+ connect(ui->actionMerge_selected_nodes, SIGNAL(triggered(bool)), this, SLOT(mergeSelectedNodes()));
+ connect(ui->actionMerge_all_possible_nodes, SIGNAL(triggered(bool)), this, SLOT(mergeAllPossible()));
+ connect(ui->actionChange_node_name, SIGNAL(triggered(bool)), this, SLOT(changeNodeName()));
+ connect(ui->actionChange_node_depth, SIGNAL(triggered(bool)), this, SLOT(changeNodeDepth()));
+ connect(ui->moreInfoButton, SIGNAL(clicked(bool)), this, SLOT(openGraphInfoDialog()));
+
+ connect(this, SIGNAL(windowLoaded()), this, SLOT(afterMainWindowShow()), Qt::ConnectionType(Qt::QueuedConnection | Qt::UniqueConnection));
+}
+
+
+//This function runs after the MainWindow has been shown. This code is not
+//included in the contructor because it can perform a BLAST search, which
+//will fill the BLAST query combo box and screw up widget sizes.
+void MainWindow::afterMainWindowShow()
+{
+ if (m_alreadyShown)
+ return;
+
+ //If the user passed a filename as a command line argument, try to open it now.
+ if (m_fileToLoadOnStartup != "")
+ loadGraph(m_fileToLoadOnStartup);
+
+ //If a BLAST query filename is present, do the BLAST search now automatically.
+ if (g_settings->blastQueryFilename != "")
+ {
+ BlastSearchDialog blastSearchDialog(this, g_settings->blastQueryFilename);
+ setupBlastQueryComboBox();
+ }
+
+ //If the draw option was used and the graph appears to have loaded (i.e. there
+ //is at least one node), then draw the graph.
+ if (m_fileToLoadOnStartup != "" && m_drawGraphAfterLoad && g_assemblyGraph->m_deBruijnGraphNodes.size() > 0)
+ drawGraph();
+
+ m_alreadyShown = true;
+}
+
+MainWindow::~MainWindow()
+{
+ cleanUp();
+ delete m_graphicsViewZoom;
+ delete ui;
+
+ if (g_blastSearch->m_tempDirectory != "" &&
+ QDir(g_blastSearch->m_tempDirectory).exists() &&
+ QDir(g_blastSearch->m_tempDirectory).dirName().contains("bandage_temp"))
+ QDir(g_blastSearch->m_tempDirectory).removeRecursively();
+}
+
+
+
+void MainWindow::cleanUp()
+{
+ ui->blastQueryComboBox->clear();
+ ui->blastQueryComboBox->addItem("none");
+
+ g_blastSearch->cleanUp();
+ g_assemblyGraph->cleanUp();
+ setWindowTitle("Bandage");
+
+ g_memory->userSpecifiedPath = Path();
+ g_memory->userSpecifiedPathString = "";
+ g_memory->userSpecifiedPathCircular = false;
+
+ if (m_blastSearchDialog != 0)
+ {
+ delete m_blastSearchDialog;
+ m_blastSearchDialog = 0;
+ }
+
+ ui->csvComboBox->clear();
+ ui->csvComboBox->setEnabled(false);
+ g_settings->displayNodeCsvDataCol = 0;
+}
+
+void MainWindow::loadCSV(QString fullFileName)
+{
+ QString selectedFilter = "Comma separated value (*.csv)";
+ if (fullFileName == "")
+ {
+ fullFileName = QFileDialog::getOpenFileName(this, "Load CSV", g_memory->rememberedPath,
+ "Comma separated value (*.csv)",
+ &selectedFilter);
+ }
+
+ if (fullFileName == "")
+ return; // user clicked on cancel
+
+ QString errormsg;
+ QStringList columns;
+
+ try
+ {
+ MyProgressDialog progress(this, "Loading CSV...", false);
+ progress.setWindowModality(Qt::WindowModal);
+ progress.show();
+
+ bool coloursLoaded = false;
+ bool success = g_assemblyGraph->loadCSV(fullFileName, &columns, &errormsg, &coloursLoaded);
+
+ if (success)
+ {
+ ui->csvCheckBox->setChecked(true);
+ ui->csvComboBox->setEnabled(true);
+ ui->csvComboBox->clear();
+ ui->csvComboBox->addItems(columns);
+ g_settings->displayNodeCsvDataCol = 0;
+ if (coloursLoaded)
+ {
+ if (ui->coloursComboBox->currentIndex() != 6)
+ ui->coloursComboBox->setCurrentIndex(6);
+ else
+ switchColourScheme();
+ }
+ }
+ }
+
+ catch (...)
+ {
+ QString errorTitle = "Error loading CSV";
+ QString errorMessage = "There was an error when attempting to load:\n"
+ + fullFileName + "\n\n"
+ "Please verify that this file has the correct format.";
+ QMessageBox::warning(this, errorTitle, errorMessage);
+ }
+}
+
+
+void MainWindow::loadGraph(QString fullFileName)
+{
+ QString selectedFilter = "Any supported graph (*)";
+ if (fullFileName == "")
+ fullFileName = QFileDialog::getOpenFileName(this, "Load graph", g_memory->rememberedPath,
+ "Any supported graph (*);;LastGraph (*LastGraph*);;FASTG (*.fastg);;GFA (*.gfa);;Trinity.fasta (*.fasta);;ASQG (*.asqg);;Plain FASTA (*.fasta)",
+ &selectedFilter);
+
+ if (fullFileName != "") //User did not hit cancel
+ {
+ GraphFileType detectedFileType = g_assemblyGraph->getGraphFileTypeFromFile(fullFileName);
+
+ GraphFileType selectedFileType = ANY_FILE_TYPE;
+ if (selectedFilter == "LastGraph (*LastGraph*)")
+ selectedFileType = LAST_GRAPH;
+ else if (selectedFilter == "FASTG (*.fastg)")
+ selectedFileType = FASTG;
+ else if (selectedFilter == "GFA (*.gfa)")
+ selectedFileType = GFA;
+ else if (selectedFilter == "Trinity.fasta (*.fasta)")
+ selectedFileType = TRINITY;
+ else if (selectedFilter == "ASQG (*.asqg)")
+ selectedFileType = ASQG;
+ else if (selectedFilter == "Plain FASTA (*.fasta)")
+ selectedFileType = PLAIN_FASTA;
+
+ if (selectedFileType == ANY_FILE_TYPE)
+ {
+ //If the user chose any file type but it can't be determined, show an error and quit.
+ if (detectedFileType == UNKNOWN_FILE_TYPE)
+ {
+ QMessageBox::warning(this, "Graph format not recognised", "Cannot load file. The selected file's format was not recognised as any supported graph type.");
+ return;
+ }
+
+ //If the user chose any file type and it can be determined, then use that type.
+ else
+ selectedFileType = detectedFileType;
+ }
+
+ //If there is a discrepancy between the selected and detected file types, make sure the
+ //user wants to continue.
+ if (selectedFileType != detectedFileType)
+ {
+ QString graphFileTypeString = convertGraphFileTypeToString(selectedFileType);
+ QMessageBox::StandardButton reply;
+ reply = QMessageBox::question(this, graphFileTypeString + " file?",
+ "This file does not appear to be a " + graphFileTypeString + " file."
+ "\nDo you want to load it as a " + graphFileTypeString + " file anyway?",
+ QMessageBox::Yes|QMessageBox::No);
+ if (reply == QMessageBox::No)
+ return;
+ }
+
+ loadGraph2(selectedFileType, fullFileName);
+ }
+}
+
+
+void MainWindow::loadGraph2(GraphFileType graphFileType, QString fullFileName)
+{
+ resetScene();
+ cleanUp();
+ ui->selectionSearchNodesLineEdit->clear();
+
+ bool customColours = false, customLabels = false;
+
+ try
+ {
+ MyProgressDialog progress(this, "Loading " + convertGraphFileTypeToString(graphFileType) + " file...", false);
+ progress.setWindowModality(Qt::WindowModal);
+ progress.show();
+
+ if (graphFileType == LAST_GRAPH)
+ g_assemblyGraph->buildDeBruijnGraphFromLastGraph(fullFileName);
+ else if (graphFileType == FASTG)
+ g_assemblyGraph->buildDeBruijnGraphFromFastg(fullFileName);
+ else if (graphFileType == GFA)
+ {
+ bool unsupportedCigar = false;
+ QString bandageOptionsError;
+ g_assemblyGraph->buildDeBruijnGraphFromGfa(fullFileName, &unsupportedCigar, &customLabels, &customColours,
+ &bandageOptionsError);
+ if (unsupportedCigar)
+ QMessageBox::warning(this, "Unsupported CIGAR", "This GFA file contains "
+ "links with complex CIGAR strings (containing "
+ "operators other than M).\n\n"
+ "Bandage does not support edge overlaps that are not "
+ "perfect, so the behaviour of such edges in this graph "
+ "is undefined.");
+ if (bandageOptionsError.length() > 0)
+ QMessageBox::warning(this, "Bad Bandage options", "This GFA file contains Bandage options but they "
+ "were not used because of this error:\n\n" + bandageOptionsError);
+
+ }
+ else if (graphFileType == TRINITY)
+ g_assemblyGraph->buildDeBruijnGraphFromTrinityFasta(fullFileName);
+ else if (graphFileType == ASQG)
+ {
+ int badEdgeCount = g_assemblyGraph->buildDeBruijnGraphFromAsqg(fullFileName);
+ if (badEdgeCount > 0)
+ QMessageBox::warning(this, "Edges not loaded", "Bandage could not load " +
+ QString::number(badEdgeCount) + " edges in this file "
+ "because they have an abnormal overlap.\n\nBandage can "
+ "only handle edges with an exact overlap at the "
+ "start/end of node sequences.");
+ }
+ else if (graphFileType == PLAIN_FASTA)
+ g_assemblyGraph->buildDeBruijnGraphFromPlainFasta(fullFileName);
+
+ setUiState(GRAPH_LOADED);
+ setWindowTitle("Bandage - " + fullFileName);
+
+ g_assemblyGraph->determineGraphInfo();
+ displayGraphDetails();
+ g_memory->rememberedPath = QFileInfo(fullFileName).absolutePath();
+ g_memory->clearGraphSpecificMemory();
+
+ // If the graph has custom colours, automatically switch the colour scheme to custom colours.
+ if (customColours) {
+ if (ui->coloursComboBox->currentIndex() != 6)
+ ui->coloursComboBox->setCurrentIndex(6);
+ else
+ switchColourScheme();
+ }
+
+ // If the graph doesn't have custom colours, but the colour scheme is on 'Custom', automatically switch it back
+ // to the default of 'Random colours'.
+ if (!customColours && ui->coloursComboBox->currentIndex() == 6)
+ ui->coloursComboBox->setCurrentIndex(0);
+ }
+
+ catch (...)
+ {
+ QString errorTitle = "Error loading " + convertGraphFileTypeToString(graphFileType);
+ QString errorMessage = "There was an error when attempting to load:\n"
+ + fullFileName + "\n\n"
+ "Please verify that this file has the correct format.";
+ QMessageBox::warning(this, errorTitle, errorMessage);
+ resetScene();
+ cleanUp();
+ clearGraphDetails();
+ setUiState(NO_GRAPH_LOADED);
+ }
+}
+
+
+
+void MainWindow::displayGraphDetails()
+{
+ ui->nodeCountLabel->setText(formatIntForDisplay(g_assemblyGraph->m_nodeCount));
+ ui->edgeCountLabel->setText(formatIntForDisplay(g_assemblyGraph->m_edgeCount));
+ ui->totalLengthLabel->setText(formatIntForDisplay(g_assemblyGraph->m_totalLength));
+}
+void MainWindow::clearGraphDetails()
+{
+ ui->nodeCountLabel->setText("0");
+ ui->edgeCountLabel->setText("0");
+ ui->totalLengthLabel->setText("0");
+}
+
+
+void MainWindow::selectionChanged()
+{
+ std::vector<DeBruijnNode *> selectedNodes = m_scene->getSelectedNodes();
+ std::vector<DeBruijnEdge *> selectedEdges = m_scene->getSelectedEdges();
+
+ if (selectedNodes.size() == 0)
+ {
+ ui->selectedNodesTextEdit->setPlainText("");
+ setSelectedNodesWidgetsVisibility(false);
+ }
+
+ else //One or more nodes selected
+ {
+ setSelectedNodesWidgetsVisibility(true);
+
+ int selectedNodeCount;
+ QString selectedNodeCountText;
+ QString selectedNodeListText;
+ QString selectedNodeLengthText;
+ QString selectedNodeDepthText;
+
+ getSelectedNodeInfo(selectedNodeCount, selectedNodeCountText, selectedNodeListText, selectedNodeLengthText, selectedNodeDepthText);
+
+ if (selectedNodeCount == 1)
+ {
+ ui->selectedNodesTitleLabel->setText("Selected node");
+ ui->selectedNodesLengthLabel->setText("Length: " + selectedNodeLengthText);
+ ui->selectedNodesDepthLabel->setText("Depth: " + selectedNodeDepthText);
+ }
+ else
+ {
+ ui->selectedNodesTitleLabel->setText("Selected nodes (" + selectedNodeCountText + ")");
+ ui->selectedNodesLengthLabel->setText("Total length: " + selectedNodeLengthText);
+ ui->selectedNodesDepthLabel->setText("Mean depth: " + selectedNodeDepthText);
+ }
+
+ ui->selectedNodesTextEdit->setPlainText(selectedNodeListText);
+ }
+
+
+ if (selectedEdges.size() == 0)
+ {
+ ui->selectedEdgesTextEdit->setPlainText("");
+ setSelectedEdgesWidgetsVisibility(false);
+ }
+
+ else //One or more edges selected
+ {
+ setSelectedEdgesWidgetsVisibility(true);
+ if (selectedEdges.size() == 1)
+ ui->selectedEdgesTitleLabel->setText("Selected edge");
+ else
+ ui->selectedEdgesTitleLabel->setText("Selected edges (" + formatIntForDisplay(int(selectedEdges.size())) + ")");
+
+ ui->selectedEdgesTextEdit->setPlainText(getSelectedEdgeListText());
+ }
+}
+
+
+void MainWindow::getSelectedNodeInfo(int & selectedNodeCount, QString & selectedNodeCountText, QString & selectedNodeListText, QString & selectedNodeLengthText, QString & selectedNodeDepthText)
+{
+ std::vector<DeBruijnNode *> selectedNodes = m_scene->getSelectedNodes();
+
+ selectedNodeCount = int(selectedNodes.size());
+ selectedNodeCountText = formatIntForDisplay(selectedNodeCount);
+
+ long long totalLength = 0;
+
+ for (int i = 0; i < selectedNodeCount; ++i)
+ {
+ QString nodeName = selectedNodes[i]->getName();
+
+ //If we are in single mode, don't include +/i in the node name
+ if (!g_settings->doubleMode)
+ nodeName.chop(1);
+
+ selectedNodeListText += nodeName;
+ if (i != int(selectedNodes.size()) - 1)
+ selectedNodeListText += ", ";
+
+ totalLength += selectedNodes[i]->getLength();
+ }
+
+ selectedNodeLengthText = formatIntForDisplay(totalLength) + " bp";
+ selectedNodeDepthText = formatDepthForDisplay(g_assemblyGraph->getMeanDepth(selectedNodes));
+}
+
+
+
+
+QString MainWindow::getSelectedEdgeListText()
+{
+ std::vector<DeBruijnEdge *> selectedEdges = m_scene->getSelectedEdges();
+
+ std::sort(selectedEdges.begin(), selectedEdges.end(), DeBruijnEdge::compareEdgePointers);
+
+ QString edgeText;
+ for (size_t i = 0; i < selectedEdges.size(); ++i)
+ {
+ edgeText += selectedEdges[i]->getStartingNode()->getName();
+ edgeText += " to ";
+ edgeText += selectedEdges[i]->getEndingNode()->getName();
+ if (i != selectedEdges.size() - 1)
+ edgeText += ", ";
+ }
+
+ return edgeText;
+}
+
+
+
+//This function shows/hides UI elements depending on which
+//graph scope is currently selected. It also reorganises
+//the widgets in the layout to prevent gaps when widgets
+//are hidden.
+void MainWindow::graphScopeChanged()
+{
+ switch (ui->graphScopeComboBox->currentIndex())
+ {
+ case 0:
+ g_settings->graphScope = WHOLE_GRAPH;
+
+ setStartingNodesWidgetVisibility(false);
+ setNodeDistanceWidgetVisibility(false);
+ setDepthRangeWidgetVisibility(false);
+
+ ui->graphDrawingGridLayout->addWidget(ui->nodeStyleInfoText, 1, 0, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->nodeStyleLabel, 1, 1, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->nodeStyleWidget, 1, 2, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->drawGraphInfoText, 2, 0, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->drawGraphButton, 2, 1, 1, 2);
+
+ break;
+
+ case 1:
+ g_settings->graphScope = AROUND_NODE;
+
+ setStartingNodesWidgetVisibility(true);
+ setNodeDistanceWidgetVisibility(true);
+ setDepthRangeWidgetVisibility(false);
+
+ ui->nodeDistanceInfoText->setInfoText("Nodes will be drawn if they are specified in the above list or are "
+ "within this many steps of those nodes.<br><br>"
+ "A value of 0 will result in only the specified nodes being drawn. "
+ "A large value will result in large sections of the graph around "
+ "the specified nodes being drawn.");
+
+ ui->graphDrawingGridLayout->addWidget(ui->startingNodesInfoText, 1, 0, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->startingNodesLabel, 1, 1, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->startingNodesLineEdit, 1, 2, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->startingNodesMatchTypeInfoText, 2, 0, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->startingNodesMatchTypeLabel, 2, 1, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->startingNodesMatchTypeWidget, 2, 2, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->nodeDistanceInfoText, 3, 0, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->nodeDistanceLabel, 3, 1, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->nodeDistanceSpinBox, 3, 2, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->nodeStyleInfoText, 4, 0, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->nodeStyleLabel, 4, 1, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->nodeStyleWidget, 4, 2, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->drawGraphInfoText, 5, 0, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->drawGraphButton, 5, 1, 1, 2);
+
+ break;
+
+ case 2:
+ g_settings->graphScope = AROUND_BLAST_HITS;
+
+ setStartingNodesWidgetVisibility(false);
+ setNodeDistanceWidgetVisibility(true);
+ setDepthRangeWidgetVisibility(false);
+
+ ui->nodeDistanceInfoText->setInfoText("Nodes will be drawn if they contain a BLAST hit or are within this "
+ "many steps of nodes with a BLAST hit.<br><br>"
+ "A value of 0 will result in only nodes with BLAST hits being drawn. "
+ "A large value will result in large sections of the graph around "
+ "nodes with BLAST hits being drawn.");
+
+ ui->graphDrawingGridLayout->addWidget(ui->nodeDistanceInfoText, 1, 0, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->nodeDistanceLabel, 1, 1, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->nodeDistanceSpinBox, 1, 2, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->nodeStyleInfoText, 2, 0, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->nodeStyleLabel, 2, 1, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->nodeStyleWidget, 2, 2, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->drawGraphInfoText, 3, 0, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->drawGraphButton, 3, 1, 1, 2);
+
+ break;
+
+ case 3:
+ g_settings->graphScope = DEPTH_RANGE;
+
+ setStartingNodesWidgetVisibility(false);
+ setNodeDistanceWidgetVisibility(false);
+ setDepthRangeWidgetVisibility(true);
+
+ ui->graphDrawingGridLayout->addWidget(ui->minDepthInfoText, 1, 0, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->minDepthLabel, 1, 1, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->minDepthSpinBox, 1, 2, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->maxDepthInfoText, 2, 0, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->maxDepthLabel, 2, 1, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->maxDepthSpinBox, 2, 2, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->nodeStyleInfoText, 3, 0, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->nodeStyleLabel, 3, 1, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->nodeStyleWidget, 3, 2, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->drawGraphInfoText, 4, 0, 1, 1);
+ ui->graphDrawingGridLayout->addWidget(ui->drawGraphButton, 4, 1, 1, 2);
+
+ break;
+ }
+}
+
+
+void MainWindow::setStartingNodesWidgetVisibility(bool visible)
+{
+ ui->startingNodesInfoText->setVisible(visible);
+ ui->startingNodesLabel->setVisible(visible);
+ ui->startingNodesLineEdit->setVisible(visible);
+ ui->startingNodesMatchTypeInfoText->setVisible(visible);
+ ui->startingNodesMatchTypeLabel->setVisible(visible);
+ ui->startingNodesExactMatchRadioButton->setVisible(visible);
+ ui->startingNodesPartialMatchRadioButton->setVisible(visible);
+}
+void MainWindow::setNodeDistanceWidgetVisibility(bool visible)
+{
+ ui->nodeDistanceInfoText->setVisible(visible);
+ ui->nodeDistanceLabel->setVisible(visible);
+ ui->nodeDistanceSpinBox->setVisible(visible);
+}
+void MainWindow::setDepthRangeWidgetVisibility(bool visible)
+{
+ ui->minDepthInfoText->setVisible(visible);
+ ui->minDepthLabel->setVisible(visible);
+ ui->minDepthSpinBox->setVisible(visible);
+ ui->maxDepthInfoText->setVisible(visible);
+ ui->maxDepthLabel->setVisible(visible);
+ ui->maxDepthSpinBox->setVisible(visible);
+}
+
+
+void MainWindow::drawGraph()
+{
+ QString errorTitle;
+ QString errorMessage;
+ std::vector<DeBruijnNode *> startingNodes = g_assemblyGraph->getStartingNodes(&errorTitle, &errorMessage,
+ ui->doubleNodesRadioButton->isChecked(),
+ ui->startingNodesLineEdit->text(),
+ ui->blastQueryComboBox->currentText());
+
+ if (errorMessage != "")
+ {
+ QMessageBox::information(this, errorTitle, errorMessage);
+ return;
+ }
+
+ resetScene();
+ g_assemblyGraph->buildOgdfGraphFromNodesAndEdges(startingNodes, g_settings->nodeDistance);
+ layoutGraph();
+}
+
+
+void MainWindow::graphLayoutFinished()
+{
+ delete m_fmmm;
+ m_layoutThread = 0;
+ g_assemblyGraph->addGraphicsItemsToScene(m_scene);
+ m_scene->setSceneRectangle();
+ zoomToFitScene();
+ selectionChanged();
+
+ setUiState(GRAPH_DRAWN);
+
+ //Move the focus to the view so the user can use keyboard controls to navigate.
+ g_graphicsView->setFocus();
+}
+
+
+void MainWindow::graphLayoutCancelled()
+{
+ m_fmmm->fixedIterations(0);
+ m_fmmm->fineTuningIterations(0);
+ m_fmmm->threshold(std::numeric_limits<double>::max());
+}
+
+
+void MainWindow::resetScene()
+{
+ m_scene->blockSignals(true);
+
+ g_assemblyGraph->resetEdges();
+ g_assemblyGraph->m_contiguitySearchDone = false;
+
+ g_graphicsView->setScene(0);
+ delete m_scene;
+ m_scene = new MyGraphicsScene(this);
+
+ g_graphicsView->setScene(m_scene);
+ connect(m_scene, SIGNAL(selectionChanged()), this, SLOT(selectionChanged()));
+ selectionChanged();
+
+ g_graphicsView->undoRotation();
+}
+
+
+std::vector<DeBruijnNode *> MainWindow::getNodesFromLineEdit(QLineEdit * lineEdit, bool exactMatch, std::vector<QString> * nodesNotInGraph)
+{
+ return g_assemblyGraph->getNodesFromString(lineEdit->text(), exactMatch, nodesNotInGraph);
+}
+
+
+
+
+void MainWindow::layoutGraph()
+{
+ //The actual layout is done in a different thread so the UI will stay responsive.
+ MyProgressDialog * progress = new MyProgressDialog(this, "Laying out graph...", true, "Cancel layout", "Cancelling layout...",
+ "Clicking this button will halt the graph layout and display "
+ "the graph in its current, incomplete state.<br><br>"
+ "Layout can take a long time for very large graphs. There are "
+ "three strategies to reduce the amount of time required:<ul>"
+ "<li>Change the scope of the graph from 'Entire graph' to either "
+ "'Around nodes' or 'Around BLAST hits'. This will reduce the "
+ "number of nodes that are drawn to the screen.</li>"
+ "<li>Increase the 'Base pairs per segment' setting. This will "
+ "result in shorter contigs which take less time to lay out.</li>"
+ "<li>Reduce the 'Graph layout iterations' setting.</li></ul>");
+ progress->setWindowModality(Qt::WindowModal);
+ progress->show();
+
+ m_fmmm = new ogdf::FMMMLayout();
+
+ m_layoutThread = new QThread;
+ double aspectRatio = double(g_graphicsView->width()) / g_graphicsView->height();
+ GraphLayoutWorker * graphLayoutWorker = new GraphLayoutWorker(m_fmmm, g_assemblyGraph->m_graphAttributes,
+ g_assemblyGraph->m_edgeArray,
+ g_settings->graphLayoutQuality,
+ g_assemblyGraph->useLinearLayout(),
+ g_settings->componentSeparation, aspectRatio);
+ graphLayoutWorker->moveToThread(m_layoutThread);
+
+ connect(progress, SIGNAL(halt()), this, SLOT(graphLayoutCancelled()));
+ connect(m_layoutThread, SIGNAL(started()), graphLayoutWorker, SLOT(layoutGraph()));
+ connect(graphLayoutWorker, SIGNAL(finishedLayout()), m_layoutThread, SLOT(quit()));
+ connect(graphLayoutWorker, SIGNAL(finishedLayout()), graphLayoutWorker, SLOT(deleteLater()));
+ connect(graphLayoutWorker, SIGNAL(finishedLayout()), this, SLOT(graphLayoutFinished()));
+ connect(m_layoutThread, SIGNAL(finished()), m_layoutThread, SLOT(deleteLater()));
+ connect(m_layoutThread, SIGNAL(finished()), progress, SLOT(deleteLater()));
+ m_layoutThread->start();
+}
+
+
+
+
+void MainWindow::zoomSpinBoxChanged()
+{
+ double newValue = ui->zoomSpinBox->value();
+ double zoomFactor = newValue / m_previousZoomSpinBoxValue;
+ setZoomSpinBoxStep();
+
+ m_graphicsViewZoom->gentleZoom(zoomFactor, SPIN_BOX);
+
+ m_previousZoomSpinBoxValue = newValue;
+}
+
+void MainWindow::setZoomSpinBoxStep()
+{
+ double newSingleStep = ui->zoomSpinBox->value() * (g_settings->zoomFactor - 1.0) * 100.0;
+
+ //Round up to nearest 0.1
+ newSingleStep = int((newSingleStep + 0.1) * 10.0) / 10.0;
+
+ ui->zoomSpinBox->setSingleStep(newSingleStep);
+}
+
+
+void MainWindow::zoomedWithMouseWheel()
+{
+ ui->zoomSpinBox->blockSignals(true);
+ double newSpinBoxValue = g_absoluteZoom * 100.0;
+ ui->zoomSpinBox->setValue(newSpinBoxValue);
+ setZoomSpinBoxStep();
+ m_previousZoomSpinBoxValue = newSpinBoxValue;
+ ui->zoomSpinBox->blockSignals(false);
+}
+
+
+
+void MainWindow::zoomToFitScene()
+{
+ zoomToFitRect(m_scene->sceneRect());
+}
+
+
+void MainWindow::zoomToFitRect(QRectF rect)
+{
+ double startingZoom = g_graphicsView->transform().m11();
+ g_graphicsView->fitInView(rect, Qt::KeepAspectRatio);
+ double endingZoom = g_graphicsView->transform().m11();
+ double zoomFactor = endingZoom / startingZoom;
+ g_absoluteZoom *= zoomFactor;
+ double newSpinBoxValue = ui->zoomSpinBox->value() * zoomFactor;
+
+ double minZoom = std::max(g_settings->minZoom, g_settings->minZoomOnGraphDraw);
+
+ //Limit the zoom to the minimum and maximum
+ if (g_absoluteZoom < minZoom)
+ {
+ double newZoomFactor = minZoom / g_absoluteZoom;
+ m_graphicsViewZoom->gentleZoom(newZoomFactor, SPIN_BOX);
+ g_absoluteZoom *= newZoomFactor;
+ g_absoluteZoom = minZoom;
+ newSpinBoxValue = minZoom * 100.0;
+ }
+ if (g_absoluteZoom > g_settings->maxAutomaticZoom)
+ {
+ double newZoomFactor = g_settings->maxAutomaticZoom / g_absoluteZoom;
+ m_graphicsViewZoom->gentleZoom(newZoomFactor, SPIN_BOX);
+ g_absoluteZoom *= newZoomFactor;
+ g_absoluteZoom = g_settings->maxAutomaticZoom;
+ newSpinBoxValue = g_settings->maxAutomaticZoom * 100.0;
+ }
+
+ ui->zoomSpinBox->blockSignals(true);
+ ui->zoomSpinBox->setValue(newSpinBoxValue);
+ m_previousZoomSpinBoxValue = newSpinBoxValue;
+ ui->zoomSpinBox->blockSignals(false);
+}
+
+
+
+//This function copies selected sequences to clipboard, if any sequences are
+//selected. If there aren't, then it will prompt the user.
+void MainWindow::copySelectedSequencesToClipboardActionTriggered()
+{
+ std::vector<DeBruijnNode *> selectedNodes = m_scene->getSelectedNodes();
+ if (selectedNodes.size() == 0)
+ QMessageBox::information(this, "Copy sequences to clipboard", "No nodes are selected.\n\n"
+ "You must first select nodes in the graph before you can copy their sequences to the clipboard.");
+ else
+ copySelectedSequencesToClipboard();
+}
+
+
+//This function copies selected sequences to clipboard, if any sequences are
+//selected.
+void MainWindow::copySelectedSequencesToClipboard()
+{
+ std::vector<DeBruijnNode *> selectedNodes = m_scene->getSelectedNodes();
+ if (selectedNodes.size() == 0)
+ return;
+
+ QClipboard * clipboard = QApplication::clipboard();
+ QString clipboardText;
+
+ for (size_t i = 0; i < selectedNodes.size(); ++i)
+ {
+ clipboardText += selectedNodes[i]->getSequence();
+ if (i != selectedNodes.size() - 1)
+ clipboardText += "\n";
+ }
+
+ clipboard->setText(clipboardText);
+}
+
+
+//This function saves selected sequences to file, with a save file prompt, if
+//any sequences are selected. If there aren't, then it will prompt the user.
+void MainWindow::saveSelectedSequencesToFileActionTriggered()
+{
+ std::vector<DeBruijnNode *> selectedNodes = m_scene->getSelectedNodes();
+ if (selectedNodes.size() == 0)
+ QMessageBox::information(this, "Save sequences to FASTA", "No nodes are selected.\n\n"
+ "You must first select nodes in the graph before you can save their sequences to a FASTA file.");
+ else
+ saveSelectedSequencesToFile();
+}
+
+
+//This function saves selected sequences to file, with a save file prompt, if
+//any sequences are selected.
+void MainWindow::saveSelectedSequencesToFile()
+{
+ std::vector<DeBruijnNode *> selectedNodes = m_scene->getSelectedNodes();
+ if (selectedNodes.size() == 0)
+ return;
+
+ QString defaultFileNameAndPath = g_memory->rememberedPath + "/selected_sequences.fasta";
+
+ QString fullFileName = QFileDialog::getSaveFileName(this, "Save node sequences", defaultFileNameAndPath, "FASTA (*.fasta)");
+
+ if (fullFileName != "") //User did not hit cancel
+ {
+ QFile file(fullFileName);
+ file.open(QIODevice::WriteOnly | QIODevice::Text);
+ QTextStream out(&file);
+
+ for (size_t i = 0; i < selectedNodes.size(); ++i)
+ out << selectedNodes[i]->getFasta(true);
+
+ g_memory->rememberedPath = QFileInfo(fullFileName).absolutePath();
+ }
+}
+
+void MainWindow::copySelectedPathToClipboard()
+{
+ std::vector<DeBruijnNode *> selectedNodes = m_scene->getSelectedNodes();
+ if (selectedNodes.size() == 0)
+ {
+ QMessageBox::information(this, "Copy path sequence to clipboard", "No nodes are selected.\n\n"
+ "You must first select nodes in the graph which define a unambiguous "
+ "path before you can copy their path sequence to the clipboard.");
+ return;
+ }
+
+ Path nodePath = Path::makeFromUnorderedNodes(selectedNodes, g_settings->doubleMode);
+ if (nodePath.isEmpty())
+ {
+ QMessageBox::information(this, "Copy path sequence to clipboard", "Invalid path.\n\n"
+ "To use copy a path sequence to the clipboard, the nodes must follow "
+ "an unambiguous path through the graph.\n\n"
+ "Complex paths can be defined using the '" + ui->actionSpecify_exact_path_for_copy_save->text() +
+ "' tool.");
+ return;
+ }
+
+ QClipboard * clipboard = QApplication::clipboard();
+ clipboard->setText(nodePath.getPathSequence());
+}
+
+
+
+void MainWindow::saveSelectedPathToFile()
+{
+ std::vector<DeBruijnNode *> selectedNodes = m_scene->getSelectedNodes();
+ if (selectedNodes.size() == 0)
+ {
+ QMessageBox::information(this, "Save path sequence to FASTA", "No nodes are selected.\n\n"
+ "You must first select nodes in the graph which define a unambiguous "
+ "path before you can save their path sequence to a FASTA file.");
+ return;
+ }
+ Path nodePath = Path::makeFromUnorderedNodes(selectedNodes, g_settings->doubleMode);
+ if (nodePath.isEmpty())
+ {
+ QMessageBox::information(this, "Save path sequence to FASTA", "Invalid path.\n\n"
+ "To use copy a path sequence to the clipboard, the nodes must follow "
+ "an unambiguous path through the graph.\n\n"
+ "Complex paths can be defined using the '" + ui->actionSpecify_exact_path_for_copy_save->text() +
+ "' tool.");
+ return;
+ }
+
+ QString defaultFileNameAndPath = g_memory->rememberedPath + "/path_sequence.fasta";
+
+ QString fullFileName = QFileDialog::getSaveFileName(this, "Save path sequence", defaultFileNameAndPath, "FASTA (*.fasta)");
+
+ if (fullFileName != "") //User did not hit cancel
+ {
+ QFile file(fullFileName);
+ file.open(QIODevice::WriteOnly | QIODevice::Text);
+ QTextStream out(&file);
+ out << nodePath.getFasta();
+ g_memory->rememberedPath = QFileInfo(fullFileName).absolutePath();
+ }
+}
+
+
+
+
+void MainWindow::switchColourScheme()
+{
+ switch (ui->coloursComboBox->currentIndex())
+ {
+ case 0:
+ g_settings->nodeColourScheme = RANDOM_COLOURS;
+ ui->contiguityButton->setVisible(false);
+ ui->contiguityInfoText->setVisible(false);
+ break;
+ case 1:
+ g_settings->nodeColourScheme = UNIFORM_COLOURS;
+ ui->contiguityButton->setVisible(false);
+ ui->contiguityInfoText->setVisible(false);
+ break;
+ case 2:
+ g_settings->nodeColourScheme = DEPTH_COLOUR;
+ ui->contiguityButton->setVisible(false);
+ ui->contiguityInfoText->setVisible(false);
+ break;
+ case 3:
+ g_settings->nodeColourScheme = BLAST_HITS_SOLID_COLOUR;
+ ui->contiguityButton->setVisible(false);
+ ui->contiguityInfoText->setVisible(false);
+ break;
+ case 4:
+ g_settings->nodeColourScheme = BLAST_HITS_RAINBOW_COLOUR;
+ ui->contiguityButton->setVisible(false);
+ ui->contiguityInfoText->setVisible(false);
+ break;
+ case 5:
+ g_settings->nodeColourScheme = CONTIGUITY_COLOUR;
+ ui->contiguityButton->setVisible(true);
+ ui->contiguityInfoText->setVisible(true);
+ break;
+ case 6:
+ g_settings->nodeColourScheme = CUSTOM_COLOURS;
+ ui->contiguityButton->setVisible(false);
+ ui->contiguityInfoText->setVisible(false);
+ break;
+ }
+
+ g_assemblyGraph->resetAllNodeColours();
+ g_graphicsView->viewport()->update();
+}
+
+
+
+void MainWindow::determineContiguityFromSelectedNode()
+{
+ g_assemblyGraph->resetNodeContiguityStatus();
+
+ std::vector<DeBruijnNode *> selectedNodes = m_scene->getSelectedNodes();
+ if (selectedNodes.size() > 0)
+ {
+ MyProgressDialog progress(this, "Determining contiguity...", false);
+ progress.setWindowModality(Qt::WindowModal);
+ progress.show();
+
+ for (size_t i = 0; i < selectedNodes.size(); ++i)
+ (selectedNodes[i])->determineContiguity();
+
+ g_assemblyGraph->m_contiguitySearchDone = true;
+ g_assemblyGraph->resetAllNodeColours();
+ g_graphicsView->viewport()->update();
+ }
+ else
+ QMessageBox::information(this, "No nodes selected", "Please select one or more nodes for which "
+ "contiguity is to be determined.");
+}
+
+
+QString MainWindow::getDefaultImageFileName()
+{
+ QString fileNameAndPath = g_memory->rememberedPath + "/graph";
+
+ if (m_imageFilter == "PNG (*.png)")
+ fileNameAndPath += ".png";
+ else if (m_imageFilter == "JPEG (*.jpg)")
+ fileNameAndPath += ".jpg";
+ else if (m_imageFilter == "SVG (*.svg)")
+ fileNameAndPath += ".svg";
+ else
+ fileNameAndPath += ".png";
+
+ return fileNameAndPath;
+}
+
+
+void MainWindow::saveImageCurrentView()
+{
+ if (!checkForImageSave())
+ return;
+
+ QString defaultFileNameAndPath = getDefaultImageFileName();
+
+ QString selectedFilter = m_imageFilter;
+ QString fullFileName = QFileDialog::getSaveFileName(this, "Save graph image (current view)",
+ defaultFileNameAndPath,
+ "PNG (*.png);;JPEG (*.jpg);;SVG (*.svg)",
+ &selectedFilter);
+
+ bool pixelImage = true;
+ if (selectedFilter == "PNG (*.png)" || selectedFilter == "JPEG (*.jpg)")
+ pixelImage = true;
+ else if (selectedFilter == "SVG (*.svg)")
+ pixelImage = false;
+
+ if (fullFileName != "") //User did not hit cancel
+ {
+ m_imageFilter = selectedFilter;
+
+ QPainter painter;
+ if (pixelImage)
+ {
+ QImage image(g_graphicsView->viewport()->rect().size(), QImage::Format_ARGB32);
+ image.fill(Qt::white);
+ painter.begin(&image);
+ painter.setRenderHint(QPainter::Antialiasing);
+ painter.setRenderHint(QPainter::TextAntialiasing);
+ g_graphicsView->render(&painter);
+ image.save(fullFileName);
+ g_memory->rememberedPath = QFileInfo(fullFileName).absolutePath();
+ painter.end();
+ }
+ else //SVG
+ {
+ QSvgGenerator generator;
+ generator.setFileName(fullFileName);
+ QSize size = g_graphicsView->viewport()->rect().size();
+ generator.setSize(size);
+ generator.setViewBox(QRect(0, 0, size.width(), size.height()));
+ painter.begin(&generator);
+ painter.fillRect(0, 0, size.width(), size.height(), Qt::white);
+ painter.setRenderHint(QPainter::Antialiasing);
+ painter.setRenderHint(QPainter::TextAntialiasing);
+ g_graphicsView->render(&painter);
+ painter.end();
+ }
+ }
+}
+
+void MainWindow::saveImageEntireScene()
+{
+ if (!checkForImageSave())
+ return;
+
+ QString defaultFileNameAndPath = getDefaultImageFileName();
+
+ QString selectedFilter = m_imageFilter;
+ QString fullFileName = QFileDialog::getSaveFileName(this,
+ "Save graph image (entire scene)",
+ defaultFileNameAndPath,
+ "PNG (*.png);;JPEG (*.jpg);;SVG (*.svg)",
+ &selectedFilter);
+
+ bool pixelImage = true;
+ if (selectedFilter == "PNG (*.png)" || selectedFilter == "JPEG (*.jpg)")
+ pixelImage = true;
+ else if (selectedFilter == "SVG (*.svg)")
+ pixelImage = false;
+
+ if (fullFileName != "") //User did not hit cancel
+ {
+ //The positionTextNodeCentre setting must be used for the entire scene
+ //or else only the labels in the current viewport will be shown.
+ bool positionTextNodeCentreSettingBefore = g_settings->positionTextNodeCentre;
+ g_settings->positionTextNodeCentre = true;
+
+ //Temporarily undo any rotation so labels appear upright.
+ double rotationBefore = g_graphicsView->getRotation();
+ g_graphicsView->undoRotation();
+
+ m_imageFilter = selectedFilter;
+
+ QPainter painter;
+ if (pixelImage)
+ {
+ QSize imageSize = g_absoluteZoom * m_scene->sceneRect().size().toSize();
+
+ if (imageSize.width() > 32767 || imageSize.height() > 32767)
+ {
+ QString error = "Images can not be taller or wider than 32767 pixels, but at the "
+ "current zoom level, the image to be saved would be ";
+ error += QString::number(imageSize.width()) + "x" + QString::number(imageSize.height()) + " pixels.\n\n";
+ error += "Please reduce the zoom level before saving the entire scene to image or use the SVG format.";
+
+ QMessageBox::information(this, "Image too large", error);
+ return;
+ }
+
+ if (imageSize.width() * imageSize.height() > 50000000) //50 megapixels is used as an arbitrary large image cutoff
+ {
+ QString warning = "At the current zoom level, the image will be ";
+ warning += QString::number(imageSize.width()) + "x" + QString::number(imageSize.height()) + " pixels. ";
+ warning += "An image of this large size may take significant time and space to save.\n\n"
+ "The image size can be reduced by decreasing the zoom level or using the SVG format.\n\n"
+ "Do you want to continue saving the image?";
+ QMessageBox::StandardButton response = QMessageBox::question(this, "Large image", warning);
+ if (response == QMessageBox::No || response == QMessageBox::Cancel)
+ return;
+ }
+
+ QImage image(imageSize, QImage::Format_ARGB32);
+ image.fill(Qt::white);
+ painter.begin(&image);
+ painter.setRenderHint(QPainter::Antialiasing);
+ painter.setRenderHint(QPainter::TextAntialiasing);
+ m_scene->setSceneRectangle();
+ m_scene->render(&painter);
+ image.save(fullFileName);
+ g_memory->rememberedPath = QFileInfo(fullFileName).absolutePath();
+ painter.end();
+ }
+ else //SVG
+ {
+ QSvgGenerator generator;
+ generator.setFileName(fullFileName);
+ QSize size = g_absoluteZoom * m_scene->sceneRect().size().toSize();
+ generator.setSize(size);
+ generator.setViewBox(QRect(0, 0, size.width(), size.height()));
+ painter.begin(&generator);
+ painter.fillRect(0, 0, size.width(), size.height(), Qt::white);
+ painter.setRenderHint(QPainter::Antialiasing);
+ painter.setRenderHint(QPainter::TextAntialiasing);
+ m_scene->setSceneRectangle();
+ m_scene->render(&painter);
+ painter.end();
+ }
+
+ g_settings->positionTextNodeCentre = positionTextNodeCentreSettingBefore;
+ g_graphicsView->setRotation(rotationBefore);
+ }
+}
+
+
+
+//This function makes sure that a graph is loaded and drawn so that an image can be saved.
+//It returns true if everything is fine. If things aren't ready, it displays a message
+//to the user and returns false.
+bool MainWindow::checkForImageSave()
+{
+ if (m_uiState == NO_GRAPH_LOADED)
+ {
+ QMessageBox::information(this, "No image to save", "You must first load and then draw a graph before you can save an image to file.");
+ return false;
+ }
+ if (m_uiState == GRAPH_LOADED)
+ {
+ QMessageBox::information(this, "No image to save", "You must first draw the graph before you can save an image to file.");
+ return false;
+ }
+ return true;
+}
+
+
+void MainWindow::setTextDisplaySettings()
+{
+ g_settings->displayNodeCustomLabels = ui->nodeCustomLabelsCheckBox->isChecked();
+ g_settings->displayNodeNames = ui->nodeNamesCheckBox->isChecked();
+ g_settings->displayNodeLengths = ui->nodeLengthsCheckBox->isChecked();
+ g_settings->displayNodeDepth = ui->nodeDepthCheckBox->isChecked();
+ g_settings->displayBlastHits = ui->blastHitsCheckBox->isChecked();
+ g_settings->displayNodeCsvData = ui->csvCheckBox->isChecked();
+ g_settings->displayNodeCsvDataCol = ui->csvComboBox->currentIndex();
+ g_settings->textOutline = ui->textOutlineCheckBox->isChecked();
+
+ g_graphicsView->viewport()->update();
+}
+
+
+void MainWindow::fontButtonPressed()
+{
+ bool ok;
+ g_settings->labelFont = QFontDialog::getFont(&ok, g_settings->labelFont, this);
+ if (ok)
+ g_graphicsView->viewport()->update();
+}
+
+
+
+void MainWindow::setNodeCustomColour()
+{
+ std::vector<DeBruijnNode *> selectedNodes = m_scene->getSelectedNodes();
+ if (selectedNodes.size() == 0)
+ return;
+
+ QString dialogTitle = "Select custom colour for selected node";
+ if (selectedNodes.size() > 1)
+ dialogTitle += "s";
+
+ QColor newColour = QColorDialog::getColor(selectedNodes[0]->getCustomColourForDisplay(), this, dialogTitle);
+ if (newColour.isValid())
+ {
+ //If we are in single mode, apply the custom colour to both nodes in
+ //each complementary pair.
+ if (!g_settings->doubleMode)
+ selectedNodes = addComplementaryNodes(selectedNodes);
+
+ //If the colouring scheme is not currently custom, change it to custom now
+ if (g_settings->nodeColourScheme != CUSTOM_COLOURS)
+ setNodeColourSchemeComboBox(CUSTOM_COLOURS);
+
+ for (size_t i = 0; i < selectedNodes.size(); ++i)
+ {
+ selectedNodes[i]->setCustomColour(newColour);
+ if (selectedNodes[i]->getGraphicsItemNode() != 0)
+ selectedNodes[i]->getGraphicsItemNode()->setNodeColour();
+
+ }
+ g_graphicsView->viewport()->update();
+ }
+}
+
+void MainWindow::setNodeCustomLabel()
+{
+ std::vector<DeBruijnNode *> selectedNodes = m_scene->getSelectedNodes();
+ if (selectedNodes.size() == 0)
+ return;
+
+ QString dialogMessage = "Type a custom label for selected node";
+ if (selectedNodes.size() > 1)
+ dialogMessage += "s";
+ dialogMessage += ":";
+
+ bool ok;
+ QString newLabel = QInputDialog::getText(this, "Custom label", dialogMessage, QLineEdit::Normal,
+ selectedNodes[0]->getCustomLabel(), &ok);
+
+ if (ok)
+ {
+ //If the custom label option isn't currently on, turn it on now.
+ ui->nodeCustomLabelsCheckBox->setChecked(true);
+
+ for (size_t i = 0; i < selectedNodes.size(); ++i)
+ selectedNodes[i]->setCustomLabel(newLabel);
+ }
+}
+
+
+//Takes a vector of nodes and returns a vector of the same nodes, along with
+//their complements. Does not check for duplicates.
+std::vector<DeBruijnNode *> MainWindow::addComplementaryNodes(std::vector<DeBruijnNode *> nodes)
+{
+ std::vector<DeBruijnNode *> complementaryNodes;
+ for (size_t i = 0; i < nodes.size(); ++i)
+ complementaryNodes.push_back(nodes[i]->getReverseComplement());
+ nodes.insert(nodes.end(), complementaryNodes.begin(), complementaryNodes.end());
+ return nodes;
+}
+
+
+void MainWindow::openSettingsDialog()
+{
+ SettingsDialog settingsDialog(this);
+ settingsDialog.setWidgetsFromSettings();
+
+ if (settingsDialog.exec()) //The user clicked OK
+ {
+ Settings settingsBefore = *g_settings;
+
+ settingsDialog.setSettingsFromWidgets();
+
+ //If the settings affecting node width was changed, reset the width on
+ //each GraphicsItemNode.
+ if (settingsBefore.depthEffectOnWidth != g_settings->depthEffectOnWidth ||
+ settingsBefore.depthPower != g_settings->depthPower)
+ g_assemblyGraph->recalculateAllNodeWidths();
+
+ //If any of the colours changed, reset the node colours now.
+ if (settingsBefore.uniformPositiveNodeColour != g_settings->uniformPositiveNodeColour ||
+ settingsBefore.uniformNegativeNodeColour != g_settings->uniformNegativeNodeColour ||
+ settingsBefore.uniformNodeSpecialColour != g_settings->uniformNodeSpecialColour ||
+ settingsBefore.autoDepthValue != g_settings->autoDepthValue ||
+ settingsBefore.lowDepthColour != g_settings->lowDepthColour ||
+ settingsBefore.highDepthColour != g_settings->highDepthColour ||
+ settingsBefore.lowDepthValue != g_settings->lowDepthValue ||
+ settingsBefore.highDepthValue != g_settings->highDepthValue ||
+ settingsBefore.noBlastHitsColour != g_settings->noBlastHitsColour ||
+ settingsBefore.contiguousStrandSpecificColour != g_settings->contiguousStrandSpecificColour ||
+ settingsBefore.contiguousEitherStrandColour != g_settings->contiguousEitherStrandColour ||
+ settingsBefore.notContiguousColour != g_settings->notContiguousColour ||
+ settingsBefore.maybeContiguousColour != g_settings->maybeContiguousColour ||
+ settingsBefore.contiguityStartingColour != g_settings->contiguityStartingColour ||
+ settingsBefore.randomColourPositiveOpacity != g_settings->randomColourPositiveOpacity ||
+ settingsBefore.randomColourNegativeOpacity != g_settings->randomColourNegativeOpacity ||
+ settingsBefore.randomColourPositiveSaturation != g_settings->randomColourPositiveSaturation ||
+ settingsBefore.randomColourNegativeSaturation != g_settings->randomColourNegativeSaturation ||
+ settingsBefore.randomColourPositiveLightness != g_settings->randomColourPositiveLightness ||
+ settingsBefore.randomColourNegativeLightness != g_settings->randomColourNegativeLightness)
+ {
+ g_assemblyGraph->resetAllNodeColours();
+ }
+
+ g_graphicsView->setAntialiasing(g_settings->antialiasing);
+ g_graphicsView->viewport()->update();
+ }
+}
+
+void MainWindow::selectUserSpecifiedNodes()
+{
+ if (g_assemblyGraph->checkIfStringHasNodes(ui->selectionSearchNodesLineEdit->text()))
+ {
+ QMessageBox::information(this, "No starting nodes",
+ "Please enter at least one node when drawing the graph using the 'Around node(s)' scope. "
+ "Separate multiple nodes with commas.");
+ return;
+ }
+
+ if (ui->selectionSearchNodesLineEdit->text().length() == 0)
+ {
+ QMessageBox::information(this, "No nodes given", "Please enter the numbers of the nodes to find, separated by commas.");
+ return;
+ }
+
+ m_scene->blockSignals(true);
+ m_scene->clearSelection();
+ std::vector<QString> nodesNotInGraph;
+ std::vector<DeBruijnNode *> nodesToSelect = getNodesFromLineEdit(ui->selectionSearchNodesLineEdit,
+ ui->selectionSearchNodesExactMatchRadioButton->isChecked(),
+ &nodesNotInGraph);
+
+ //Select each node that actually has a GraphicsItemNode, and build a bounding
+ //rectangle so the viewport can focus on the selected node.
+ std::vector<QString> nodesNotFound;
+ int foundNodes = 0;
+ for (size_t i = 0; i < nodesToSelect.size(); ++i)
+ {
+ GraphicsItemNode * graphicsItemNode = nodesToSelect[i]->getGraphicsItemNode();
+
+ //If the GraphicsItemNode isn't found, try the reverse complement. This
+ //is only done for single node mode.
+ if (graphicsItemNode == 0 && !g_settings->doubleMode)
+ graphicsItemNode = nodesToSelect[i]->getReverseComplement()->getGraphicsItemNode();
+
+ if (graphicsItemNode != 0)
+ {
+ graphicsItemNode->setSelected(true);
+ ++foundNodes;
+ }
+ else
+ nodesNotFound.push_back(nodesToSelect[i]->getName());
+ }
+
+ if (foundNodes > 0)
+ zoomToSelection();
+
+ if (nodesNotInGraph.size() > 0 || nodesNotFound.size() > 0)
+ {
+ QString errorMessage;
+ if (nodesNotInGraph.size() > 0)
+ {
+ errorMessage += g_assemblyGraph->generateNodesNotFoundErrorMessage(nodesNotInGraph,
+ ui->selectionSearchNodesExactMatchRadioButton->isChecked());
+ }
+ if (nodesNotFound.size() > 0)
+ {
+ if (errorMessage.length() > 0)
+ errorMessage += "\n";
+ errorMessage += "The following nodes are in the graph but not currently displayed:\n";
+ for (size_t i = 0; i < nodesNotFound.size(); ++i)
+ {
+ errorMessage += nodesNotFound[i];
+ if (i != nodesNotFound.size() - 1)
+ errorMessage += ", ";
+ }
+ errorMessage += "\n\nRedraw the graph with an increased scope to see these nodes.\n";
+ }
+ QMessageBox::information(this, "Nodes not found", errorMessage);
+ }
+
+ m_scene->blockSignals(false);
+ g_graphicsView->viewport()->update();
+ selectionChanged();
+}
+
+
+void MainWindow::openAboutDialog()
+{
+ AboutDialog aboutDialog(this);
+ aboutDialog.exec();
+}
+
+
+void MainWindow::openBlastSearchDialog()
+{
+ //If a BLAST search dialog does not current exist, make it.
+ if (m_blastSearchDialog == 0)
+ {
+ m_blastSearchDialog = new BlastSearchDialog(this);
+ connect(m_blastSearchDialog, SIGNAL(blastChanged()), this, SLOT(blastChanged()));
+ connect(m_blastSearchDialog, SIGNAL(queryPathSelectionChanged()), g_graphicsView->viewport(), SLOT(update()));
+ }
+
+ m_blastSearchDialog->show();
+}
+
+
+//This function is called whenever the user does something in the
+//BlastSearchDialog that should be reflected here in MainWindow.
+void MainWindow::blastChanged()
+{
+ QString blastQueryText = ui->blastQueryComboBox->currentText();
+ BlastQuery * queryBefore = g_blastSearch->m_blastQueries.getQueryFromName(blastQueryText);
+
+ //If we didn't find a currently selected query but it isn't "none" or "all",
+ //then maybe the user changed the name of the currently selected query, and
+ //that's why we didn't find it. In that case, try to find it using the
+ //index.
+ if (queryBefore == 0 && blastQueryText != "none" && blastQueryText != "all")
+ {
+ int blastQueryIndex = ui->blastQueryComboBox->currentIndex();
+ if (ui->blastQueryComboBox->count() > 1)
+ --blastQueryIndex;
+ if (blastQueryIndex < g_blastSearch->m_blastQueries.getQueryCount())
+ queryBefore = g_blastSearch->m_blastQueries.m_queries[blastQueryIndex];
+ }
+
+ //Rebuild the query combo box, in case the user changed the queries or
+ //their names.
+ setupBlastQueryComboBox();
+
+ //Look to see if the query selected before is still present. If so,
+ //set the combo box to have that query selected. If not (or if no
+ //query was previously selected), leave the combo box a index 0.
+ if (queryBefore != 0 && g_blastSearch->m_blastQueries.isQueryPresent(queryBefore))
+ {
+ int indexOfQuery = ui->blastQueryComboBox->findText(queryBefore->getName());
+ if (indexOfQuery != -1)
+ ui->blastQueryComboBox->setCurrentIndex(indexOfQuery);
+ }
+
+ if (g_blastSearch->m_blastQueries.getQueryCount() > 0)
+ {
+ //If the colouring scheme is not currently BLAST hits, change it to BLAST hits now
+ if (g_settings->nodeColourScheme != BLAST_HITS_RAINBOW_COLOUR &&
+ g_settings->nodeColourScheme != BLAST_HITS_SOLID_COLOUR)
+ {
+ //If there is only one query, use BLAST rainbow. Otherwise, use
+ //BLAST solid.
+ if (g_blastSearch->m_blastQueries.getQueryCount() == 1)
+ setNodeColourSchemeComboBox(BLAST_HITS_RAINBOW_COLOUR);
+ else
+ setNodeColourSchemeComboBox(BLAST_HITS_SOLID_COLOUR);
+ }
+ }
+
+ g_blastSearch->blastQueryChanged(ui->blastQueryComboBox->currentText());
+ g_graphicsView->viewport()->update();
+}
+
+
+void MainWindow::setupBlastQueryComboBox()
+{
+ ui->blastQueryComboBox->clear();
+ QStringList comboBoxItems;
+ for (size_t i = 0; i < g_blastSearch->m_blastQueries.m_queries.size(); ++i)
+ {
+ if (g_blastSearch->m_blastQueries.m_queries[i]->hasHits())
+ comboBoxItems.push_back(g_blastSearch->m_blastQueries.m_queries[i]->getName());
+ }
+
+ if (comboBoxItems.size() > 1)
+ comboBoxItems.push_front("all");
+
+ if (comboBoxItems.size() > 0)
+ {
+ ui->blastQueryComboBox->addItems(comboBoxItems);
+ ui->blastQueryComboBox->setEnabled(true);
+ }
+ else
+ {
+ ui->blastQueryComboBox->addItem("none");
+ ui->blastQueryComboBox->setEnabled(false);
+ }
+}
+
+
+void MainWindow::blastQueryChanged()
+{
+ g_blastSearch->blastQueryChanged(ui->blastQueryComboBox->currentText());
+ g_graphicsView->viewport()->update();
+}
+
+
+void MainWindow::setInfoTexts()
+{
+ QString control = "Ctrl";
+ QString settingsDialogTitle = "settings";
+#ifdef Q_OS_MAC
+ QString command(QChar(0x2318));
+ control = command;
+ settingsDialogTitle = "preferences";
+#endif
+
+ ui->graphInformationInfoText->setInfoText("Node codes, edge count and total length are calculated using single "
+ "nodes, not double nodes.<br><br>"
+ "For example, node 5+ and node 5- would only be counted once.");
+ ui->graphScopeInfoText->setInfoText("This controls how much of the assembly graph will be drawn:<ul>"
+ "<li>'Entire graph': all nodes in the graph will be drawn. This is "
+ "appropriate for smaller graphs, but large graphs may take "
+ "longer and use large amounts of memory to draw in their entirety.</li>"
+ "<li>'Around nodes': you can specify nodes and a distance to "
+ "limit the drawing to a smaller region of the graph.</li>"
+ "<li>'Around BLAST hits': if you have conducted a BLAST search "
+ "on this graph, this option will draw the region(s) of the graph "
+ "around nodes that contain hits.</li></ul>");
+ ui->startingNodesInfoText->setInfoText("Enter a comma-delimited list of node names here. This will "
+ "define which regions of the graph will be drawn.<br><br>"
+ "When in double mode, you can include '+' or '-' at the end "
+ "of the node name to specify which strand to draw. If you do "
+ "not include '+' or '-', then nodes for both strands will be drawn.");
+ ui->startingNodesMatchTypeInfoText->setInfoText("When 'Exact' match is used, the graph will only be drawn around nodes "
+ "that exactly match your above input.<br><br>"
+ "When 'Partial' match is used, the graph will be drawn around "
+ "nodes where any part of their name matches your above input.");
+ ui->selectionSearchNodesMatchTypeInfoText->setInfoText("When 'Exact' match is used, nodes will only be selected if "
+ "their name exactly matches your input above.<br><br>"
+ "When 'Partial' match is used, nodes will be selected if any "
+ "part of their name matches your input above.");
+ ui->nodeStyleInfoText->setInfoText("'Single' mode will only one node for each positive/negative pair. "
+ "This produces a simpler graph visualisation, but "
+ "strand-specific sequences and directionality will be less clear.<br><br>"
+ "'Double' mode will draw both nodes and their complement nodes. The nodes "
+ "will show directionality with an arrow head. They will initially be "
+ "drawn on top of each other, but can be manually moved to separate them.");
+ ui->drawGraphInfoText->setInfoText("Clicking this button will conduct the graph layout and draw the graph to "
+ "the screen. This process is fast for small graphs but can be "
+ "resource-intensive for large graphs.<br><br>"
+ "The layout algorithm uses a random seed, so each time this button is "
+ "clicked you will give different layouts of the same graph.");
+ ui->zoomInfoText->setInfoText("This value controls how large the graph appears in Bandage. The zoom level "
+ "can also be changed by:<ul>"
+ "<li>Holding the " + control + " key and using the mouse wheel over the graph.</li>"
+ "<li>Clicking on the graph display and then using the '+' and '-' keys.</li></ul>");
+ ui->nodeWidthInfoText->setInfoText("This is the average width for each node. The exact width for each node is "
+ "also influenced by the node's depth. The effect of depth on width "
+ "can be adjusted in Bandage " + settingsDialogTitle + ".");
+ ui->nodeColourInfoText->setInfoText("This controls the colour of the nodes in the graph:<ul>"
+ "<li>'Random colours': Nodes will be coloured randomly. Each time this is "
+ "selected, new random colours will be chosen. Negative nodes (visible "
+ "in 'Double' mode) will be a darker shade of their complement positive "
+ "nodes.</li>"
+ "<li>'Uniform colour': For graphs drawn with the 'Entire graph' scope, all "
+ "nodes will be the same colour. For graphs drawn with the 'Around nodes' "
+ "scope, your specified nodes will be drawn in a separate colour. For "
+ "graphs drawn with the 'Around BLAST hits' scope, nodes with BLAST hits "
+ "will be drawn in a separate colour.</li>"
+ "<li>'Colour by depth': Node colours will be defined by their "
+ "depth. The details of this relationship are configurable in "
+ "Bandage " + settingsDialogTitle + ".</li>"
+ "<li>'BLAST hits (rainbow)': Nodes will be drawn in a light grey colour "
+ "and BLAST hits for the currently selected query will be drawn using a "
+ "rainbow. Red indicates the start of the query sequence and violet "
+ "indicates the end.</li>"
+ "<li>'BLAST hits (solid)': Nodes will be drawn in a light grey colour "
+ "and BLAST hits for the currently selected query will be drawn using "
+ "the query's colour. Query colours can be specified in the 'Create/view"
+ "BLAST search' window.</li>"
+ "<li>'Colour by contiguity': This option will display a 'Determine "
+ "contiguity button. When pressed, the nodes will be coloured based "
+ "on their contiguity with the selected node(s).</li>"
+ "<li>'Custom colours': Nodes will be coloured using colours of your "
+ "choice. Select one or more nodes and then click the 'Set colour' button "
+ "to define their colour.</li></ul>"
+ "See the 'Colours' section of the Bandage " + settingsDialogTitle + " "
+ "to control various colouring options.");
+ ui->contiguityInfoText->setInfoText("Select one or more nodes and then click this button. Bandage will "
+ "then colour which other nodes in the graph are likely to be contiguous "
+ "with your selected node(s).");
+ ui->nodeLabelsInfoText->setInfoText("Tick any of the node labelling options to display those labels over "
+ "nodes in the graph.<br><br>"
+ "'Name', 'Length' and 'Depth' labels are created automatically. "
+ "'Custom' labels must be assigned by clicking the 'Set "
+ "label' button when one or more nodes are selected.<br><br>"
+ "When 'BLAST hits' labels are shown, they are displayed over any "
+ "BLAST hits present in the node.<br><br>"
+ "The 'CSV data' option allows you to import custom labels. To use this, "
+ "you must first load a CSV file (using the 'Load CSV label data' item in "
+ "the 'File' menu) which contains the node names in the first column and "
+ "custom labels in subsequent columns. The CSV file must also contain a "
+ "header row.");
+ ui->nodeFontInfoText->setInfoText("Click the 'Font' button to choose the font used for node labels. The "
+ "colour of the font is configurable in Bandage's " + settingsDialogTitle + ".<br><br>"
+ "Ticking 'Text outline' will surround the text with a white outline. "
+ "This can help to make text more readable, but will obscure more of the "
+ "underlying graph. The thickness of the text outline is configurable in "
+ "Bandage's " + settingsDialogTitle + ".");
+ ui->blastSearchInfoText->setInfoText("Click this button to open a dialog where a BLAST search for one "
+ "or more queries can be carried out on the graph's nodes.<br><br>"
+ "After a BLAST search is complete, it will be possible to use the "
+ "'Around BLAST hits' graph scope and the 'BLAST "
+ "hits' colour modes.");
+ ui->blastQueryInfoText->setInfoText("After a BLAST search is completed, you can select a query here for use "
+ "with the 'Around BLAST hits' graph scope and the 'BLAST "
+ "hits' colour modes.");
+ ui->selectionSearchInfoText->setInfoText("Type a comma-delimited list of one or mode node numbers and then click "
+ "the 'Find node(s)' button to search for nodes in the graph. "
+ "If the search is successful, the view will zoom to the found nodes "
+ "and they will be selected.");
+ ui->setColourAndLabelInfoText->setInfoText("Custom colours and labels can be applied to selected nodes using "
+ "these buttons. They will only be visible when the colouring "
+ "mode is set to 'Custom colours' and the 'Custom' label option "
+ "is ticked.");
+ ui->minDepthInfoText->setInfoText("This is the lower bound for the depth range. Nodes with a read "
+ "depth less than this value will not be drawn.");
+ ui->maxDepthInfoText->setInfoText("This is the uper bound for the depth range. Nodes with a read "
+ "depth greater than this value will not be drawn.");
+}
+
+
+
+void MainWindow::setUiState(UiState uiState)
+{
+ m_uiState = uiState;
+
+ switch (uiState)
+ {
+ case NO_GRAPH_LOADED:
+ ui->graphDetailsWidget->setEnabled(false);
+ ui->graphDrawingWidget->setEnabled(false);
+ ui->graphDisplayWidget->setEnabled(false);
+ ui->nodeLabelsWidget->setEnabled(false);
+ ui->blastSearchWidget->setEnabled(false);
+ ui->selectionScrollAreaWidgetContents->setEnabled(false);
+ ui->actionLoad_CSV->setEnabled(false);
+ break;
+ case GRAPH_LOADED:
+ ui->graphDetailsWidget->setEnabled(true);
+ ui->graphDrawingWidget->setEnabled(true);
+ ui->graphDisplayWidget->setEnabled(false);
+ ui->nodeLabelsWidget->setEnabled(false);
+ ui->blastSearchWidget->setEnabled(true);
+ ui->selectionScrollAreaWidgetContents->setEnabled(false);
+ ui->actionLoad_CSV->setEnabled(true);
+ break;
+ case GRAPH_DRAWN:
+ ui->graphDetailsWidget->setEnabled(true);
+ ui->graphDrawingWidget->setEnabled(true);
+ ui->graphDisplayWidget->setEnabled(true);
+ ui->nodeLabelsWidget->setEnabled(true);
+ ui->blastSearchWidget->setEnabled(true);
+ ui->selectionScrollAreaWidgetContents->setEnabled(true);
+ ui->actionZoom_to_selection->setEnabled(true);
+ ui->actionLoad_CSV->setEnabled(true);
+ break;
+ }
+}
+
+
+void MainWindow::showHidePanels()
+{
+ ui->controlsScrollArea->setVisible(ui->actionControls_panel->isChecked());
+ ui->selectionScrollArea->setVisible(ui->actionSelection_panel->isChecked());
+}
+
+
+void MainWindow::bringSelectedNodesToFront()
+{
+ m_scene->blockSignals(true);
+
+ std::vector<DeBruijnNode *> selectedNodes = m_scene->getSelectedNodes();
+ if (selectedNodes.size() == 0)
+ {
+ QMessageBox::information(this, "No nodes selected", "You must first select nodes in the graph before using "
+ "the 'Bring selected nodes to front' function.");
+ return;
+ }
+
+ double topZ = m_scene->getTopZValue();
+ double newZ = topZ + 1.0;
+
+ for (size_t i = 0; i < selectedNodes.size(); ++i)
+ {
+ GraphicsItemNode * graphicsItemNode = selectedNodes[i]->getGraphicsItemNode();
+
+ if (graphicsItemNode == 0)
+ continue;
+
+ graphicsItemNode->setZValue(newZ);
+ }
+ m_scene->blockSignals(false);
+ g_graphicsView->viewport()->update();
+}
+
+
+void MainWindow::selectNodesWithBlastHits()
+{
+ if (ui->blastQueryComboBox->currentText() == "none")
+ {
+ QMessageBox::information(this, "No BLAST hits",
+ "To select nodes with BLAST hits, you must first conduct a BLAST search.");
+ return;
+ }
+
+ m_scene->blockSignals(true);
+ m_scene->clearSelection();
+
+ bool atLeastOneNodeHasBlastHits = false;
+ bool atLeastOneNodeSelected = false;
+
+ QMapIterator<QString, DeBruijnNode*> i(g_assemblyGraph->m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ DeBruijnNode * node = i.value();
+
+ bool nodeHasBlastHits;
+
+ //If we're in double mode, only select a node if it has a BLAST hit itself.
+ if (g_settings->doubleMode)
+ nodeHasBlastHits = node->thisNodeHasBlastHits();
+
+ //In single mode, select a node if it or its reverse complement has a BLAST hit.
+ else
+ nodeHasBlastHits = node->thisNodeOrReverseComplementHasBlastHits();
+
+ if (nodeHasBlastHits)
+ atLeastOneNodeHasBlastHits = true;
+
+ GraphicsItemNode * graphicsItemNode = node->getGraphicsItemNode();
+
+ if (graphicsItemNode == 0)
+ continue;
+
+ if (nodeHasBlastHits)
+ {
+ graphicsItemNode->setSelected(true);
+ atLeastOneNodeSelected = true;
+ }
+ }
+ m_scene->blockSignals(false);
+ g_graphicsView->viewport()->update();
+ selectionChanged();
+
+ if (!atLeastOneNodeHasBlastHits)
+ {
+ QMessageBox::information(this, "No BLAST hits",
+ "To select nodes with BLAST hits, you must first conduct a BLAST search.");
+ return;
+ }
+
+ if (!atLeastOneNodeSelected)
+ QMessageBox::information(this, "No BLAST hits in visible nodes",
+ "No nodes with BLAST hits are currently visible, so there is nothing to select. "
+ "Adjust the graph scope to make the nodes with BLAST hits visible.");
+ else
+ zoomToSelection();
+}
+
+
+void MainWindow::selectAll()
+{
+ m_scene->blockSignals(true);
+ QList<QGraphicsItem *> allItems = m_scene->items();
+ for (int i = 0; i < allItems.size(); ++i)
+ {
+ QGraphicsItem * item = allItems[i];
+ item->setSelected(true);
+ }
+ m_scene->blockSignals(false);
+ g_graphicsView->viewport()->update();
+ selectionChanged();
+}
+
+
+void MainWindow::selectNone()
+{
+ m_scene->blockSignals(true);
+ QList<QGraphicsItem *> allItems = m_scene->items();
+ for (int i = 0; i < allItems.size(); ++i)
+ {
+ QGraphicsItem * item = allItems[i];
+ item->setSelected(false);
+ }
+ m_scene->blockSignals(false);
+ g_graphicsView->viewport()->update();
+ selectionChanged();
+}
+
+void MainWindow::invertSelection()
+{
+ m_scene->blockSignals(true);
+ QList<QGraphicsItem *> allItems = m_scene->items();
+ for (int i = 0; i < allItems.size(); ++i)
+ {
+ QGraphicsItem * item = allItems[i];
+ item->setSelected(!item->isSelected());
+ }
+ m_scene->blockSignals(false);
+ g_graphicsView->viewport()->update();
+ selectionChanged();
+}
+
+
+
+void MainWindow::zoomToSelection()
+{
+ QList<QGraphicsItem *> selection = m_scene->selectedItems();
+ if (selection.size() == 0)
+ {
+ QMessageBox::information(this, "No nodes selected", "You must first select nodes in the graph before using "
+ "the 'Zoom to fit selection' function.");
+ return;
+ }
+
+ QRectF boundingBox;
+ for (int i = 0; i < selection.size(); ++i)
+ {
+ QGraphicsItem * selectedItem = selection[i];
+ boundingBox = boundingBox | selectedItem->boundingRect();
+ }
+
+ zoomToFitRect(boundingBox);
+}
+
+
+
+void MainWindow::selectContiguous()
+{
+ selectBasedOnContiguity(CONTIGUOUS_EITHER_STRAND);
+}
+
+void MainWindow::selectMaybeContiguous()
+{
+ selectBasedOnContiguity(MAYBE_CONTIGUOUS);
+}
+
+void MainWindow::selectNotContiguous()
+{
+ selectBasedOnContiguity(NOT_CONTIGUOUS);
+}
+
+
+
+void MainWindow::selectBasedOnContiguity(ContiguityStatus targetContiguityStatus)
+{
+ if (!g_assemblyGraph->m_contiguitySearchDone)
+ {
+ QMessageBox::information(this, "Contiguity determination not done",
+ "To select nodes by their contiguity status, while in 'Colour "
+ "by contiguity' mode, you must select a node and then click "
+ "'Determine contiguity'.");
+ return;
+ }
+
+ m_scene->blockSignals(true);
+ m_scene->clearSelection();
+
+ QMapIterator<QString, DeBruijnNode*> i(g_assemblyGraph->m_deBruijnGraphNodes);
+ while (i.hasNext())
+ {
+ i.next();
+ DeBruijnNode * node = i.value();
+ GraphicsItemNode * graphicsItemNode = node->getGraphicsItemNode();
+
+ if (graphicsItemNode == 0)
+ continue;
+
+ //For single nodes, choose the greatest contiguity status of this
+ //node and its complement.
+ ContiguityStatus nodeContiguityStatus = node->getContiguityStatus();
+ if (!g_settings->doubleMode)
+ {
+ ContiguityStatus twinContiguityStatus = node->getReverseComplement()->getContiguityStatus();
+ if (twinContiguityStatus < nodeContiguityStatus)
+ nodeContiguityStatus = twinContiguityStatus;
+ }
+
+ if (targetContiguityStatus == CONTIGUOUS_EITHER_STRAND &&
+ (nodeContiguityStatus == CONTIGUOUS_STRAND_SPECIFIC || nodeContiguityStatus == CONTIGUOUS_EITHER_STRAND))
+ graphicsItemNode->setSelected(true);
+ else if (targetContiguityStatus == MAYBE_CONTIGUOUS &&
+ nodeContiguityStatus == MAYBE_CONTIGUOUS)
+ graphicsItemNode->setSelected(true);
+ else if (targetContiguityStatus == NOT_CONTIGUOUS &&
+ nodeContiguityStatus == NOT_CONTIGUOUS)
+ graphicsItemNode->setSelected(true);
+ }
+
+ m_scene->blockSignals(false);
+ g_graphicsView->viewport()->update();
+ selectionChanged();
+ zoomToSelection();
+}
+
+
+
+void MainWindow::openBandageUrl()
+{
+ QDesktopServices::openUrl(QUrl("https://github.com/rrwick/Bandage/wiki"));
+}
+
+
+
+
+
+
+
+void MainWindow::setWidgetsFromSettings()
+{
+ ui->singleNodesRadioButton->setChecked(!g_settings->doubleMode);
+ ui->doubleNodesRadioButton->setChecked(g_settings->doubleMode);
+
+ ui->nodeWidthSpinBox->setValue(g_settings->averageNodeWidth);
+
+ ui->nodeNamesCheckBox->setChecked(g_settings->displayNodeNames);
+ ui->nodeLengthsCheckBox->setChecked(g_settings->displayNodeLengths);
+ ui->nodeDepthCheckBox->setChecked(g_settings->displayNodeDepth);
+ ui->blastHitsCheckBox->setChecked(g_settings->displayBlastHits);
+ ui->textOutlineCheckBox->setChecked(g_settings->textOutline);
+
+ ui->startingNodesExactMatchRadioButton->setChecked(g_settings->startingNodesExactMatch);
+ ui->startingNodesPartialMatchRadioButton->setChecked(!g_settings->startingNodesExactMatch);
+
+ setNodeColourSchemeComboBox(g_settings->nodeColourScheme);
+
+ setGraphScopeComboBox(g_settings->graphScope);
+ ui->nodeDistanceSpinBox->setValue(g_settings->nodeDistance);
+ ui->startingNodesLineEdit->setText(g_settings->startingNodes);
+
+ ui->minDepthSpinBox->setValue(g_settings->minDepthRange);
+ ui->maxDepthSpinBox->setValue(g_settings->maxDepthRange);
+}
+
+
+
+void MainWindow::setNodeColourSchemeComboBox(NodeColourScheme nodeColourScheme)
+{
+ switch (nodeColourScheme)
+ {
+ case RANDOM_COLOURS: ui->coloursComboBox->setCurrentIndex(0); break;
+ case UNIFORM_COLOURS: ui->coloursComboBox->setCurrentIndex(1); break;
+ case DEPTH_COLOUR: ui->coloursComboBox->setCurrentIndex(2); break;
+ case BLAST_HITS_SOLID_COLOUR: ui->coloursComboBox->setCurrentIndex(3); break;
+ case BLAST_HITS_RAINBOW_COLOUR: ui->coloursComboBox->setCurrentIndex(4); break;
+ case CONTIGUITY_COLOUR: ui->coloursComboBox->setCurrentIndex(5); break;
+ case CUSTOM_COLOURS: ui->coloursComboBox->setCurrentIndex(6); break;
+ }
+}
+
+void MainWindow::setGraphScopeComboBox(GraphScope graphScope)
+{
+ switch (graphScope)
+ {
+ case WHOLE_GRAPH: ui->graphScopeComboBox->setCurrentIndex(0); break;
+ case AROUND_NODE: ui->graphScopeComboBox->setCurrentIndex(1); break;
+ case AROUND_BLAST_HITS: ui->graphScopeComboBox->setCurrentIndex(2); break;
+ case DEPTH_RANGE: ui->graphScopeComboBox->setCurrentIndex(3); break;
+ }
+}
+
+void MainWindow::nodeDistanceChanged()
+{
+ g_settings->nodeDistance = ui->nodeDistanceSpinBox->value();
+}
+
+void MainWindow::depthRangeChanged()
+{
+ g_settings->minDepthRange = ui->minDepthSpinBox->value();
+ g_settings->maxDepthRange = ui->maxDepthSpinBox->value();
+}
+
+void MainWindow::showEvent(QShowEvent *ev)
+{
+ QMainWindow::showEvent(ev);
+ emit windowLoaded();
+}
+
+
+void MainWindow::startingNodesExactMatchChanged()
+{
+ g_settings->startingNodesExactMatch = ui->startingNodesExactMatchRadioButton->isChecked();
+}
+
+
+void MainWindow::openPathSpecifyDialog()
+{
+ //Don't open a second dialog if one's already up.
+ if (g_memory->pathDialogIsVisible)
+ return;
+
+ PathSpecifyDialog * pathSpecifyDialog = new PathSpecifyDialog(this);
+ connect(g_graphicsView, SIGNAL(doubleClickedNode(DeBruijnNode*)), pathSpecifyDialog, SLOT(addNodeName(DeBruijnNode*)));
+ pathSpecifyDialog->show();
+}
+
+
+QString MainWindow::convertGraphFileTypeToString(GraphFileType graphFileType)
+{
+ QString graphFileTypeString;
+ switch (graphFileType)
+ {
+ case LAST_GRAPH: graphFileTypeString = "LastGraph"; break;
+ case FASTG: graphFileTypeString = "FASTG"; break;
+ case GFA: graphFileTypeString = "GFA"; break;
+ case TRINITY: graphFileTypeString = "Trinity.fasta"; break;
+ case ASQG: graphFileTypeString = "ASQG"; break;
+ case PLAIN_FASTA: graphFileTypeString = "FASTA"; break;
+ case ANY_FILE_TYPE: graphFileTypeString = "any"; break;
+ case UNKNOWN_FILE_TYPE: graphFileTypeString = "unknown"; break;
+ }
+ return graphFileTypeString;
+}
+
+
+void MainWindow::setSelectedNodesWidgetsVisibility(bool visible)
+{
+ ui->selectedNodesTitleLabel->setVisible(visible);
+ ui->selectedNodesLine1->setVisible(visible);
+ ui->selectedNodesLine2->setVisible(visible);
+ ui->selectedNodesTextEdit->setVisible(visible);
+ ui->selectedNodesModificationWidget->setVisible(visible);
+ ui->selectedNodesLengthLabel->setVisible(visible);
+ ui->selectedNodesDepthLabel->setVisible(visible);
+ ui->selectedNodesSpacerWidget->setVisible(visible);
+}
+
+void MainWindow::setSelectedEdgesWidgetsVisibility(bool visible)
+{
+ ui->selectedEdgesTitleLabel->setVisible(visible);
+ ui->selectedEdgesTextEdit->setVisible(visible);
+ ui->selectedEdgesLine->setVisible(visible);
+ ui->selectedEdgesSpacerWidget->setVisible(visible);
+}
+
+
+void MainWindow::nodeWidthChanged()
+{
+ g_settings->averageNodeWidth = ui->nodeWidthSpinBox->value();
+ g_assemblyGraph->recalculateAllNodeWidths();
+ g_graphicsView->viewport()->update();
+}
+
+
+void MainWindow::saveEntireGraphToFasta()
+{
+ QString defaultFileNameAndPath = g_memory->rememberedPath + "/all_graph_nodes.fasta";
+ QString fullFileName = QFileDialog::getSaveFileName(this, "Save entire graph", defaultFileNameAndPath, "FASTA (*.fasta)");
+
+ if (fullFileName != "") //User did not hit cancel
+ {
+ g_memory->rememberedPath = QFileInfo(fullFileName).absolutePath();
+ g_assemblyGraph->saveEntireGraphToFasta(fullFileName);
+ }
+}
+
+void MainWindow::saveEntireGraphToFastaOnlyPositiveNodes()
+{
+ QString defaultFileNameAndPath = g_memory->rememberedPath + "/all_positive_graph_nodes.fasta";
+ QString fullFileName = QFileDialog::getSaveFileName(this, "Save entire graph (only positive nodes)", defaultFileNameAndPath, "FASTA (*.fasta)");
+
+ if (fullFileName != "") //User did not hit cancel
+ {
+ g_memory->rememberedPath = QFileInfo(fullFileName).absolutePath();
+ g_assemblyGraph->saveEntireGraphToFastaOnlyPositiveNodes(fullFileName);
+ }
+}
+
+
+void MainWindow::saveEntireGraphToGfa()
+{
+ QString defaultFileNameAndPath = g_memory->rememberedPath + "/graph.gfa";
+ QString fullFileName = QFileDialog::getSaveFileName(this, "Save entire graph", defaultFileNameAndPath, "GFA (*.gfa)");
+
+ if (fullFileName != "") //User did not hit cancel
+ {
+ g_memory->rememberedPath = QFileInfo(fullFileName).absolutePath();
+ bool success = g_assemblyGraph->saveEntireGraphToGfa(fullFileName);
+ if (!success)
+ QMessageBox::warning(this, "Error saving file", "Bandage was unable to save the graph file.");
+ }
+}
+
+void MainWindow::saveVisibleGraphToGfa()
+{
+ QString defaultFileNameAndPath = g_memory->rememberedPath + "/graph.gfa";
+ QString fullFileName = QFileDialog::getSaveFileName(this, "Save visible graph", defaultFileNameAndPath, "GFA (*.gfa)");
+
+ if (fullFileName != "") //User did not hit cancel
+ {
+ g_memory->rememberedPath = QFileInfo(fullFileName).absolutePath();
+ bool success = g_assemblyGraph->saveVisibleGraphToGfa(fullFileName);
+ if (!success)
+ QMessageBox::warning(this, "Error saving file", "Bandage was unable to save the graph file.");
+ }
+}
+
+
+void MainWindow::webBlastSelectedNodes()
+{
+ std::vector<DeBruijnNode *> selectedNodes = m_scene->getSelectedNodes();
+ if (selectedNodes.size() == 0)
+ {
+ QMessageBox::information(this, "Web BLAST selected nodes", "No nodes are selected.\n\n"
+ "You must first select nodes in the graph before you can can use web BLAST.");
+ return;
+ }
+
+ QByteArray selectedNodesFasta;
+ for (size_t i = 0; i < selectedNodes.size(); ++i)
+ selectedNodesFasta += selectedNodes[i]->getFasta(true, false);
+ selectedNodesFasta.chop(1); //remove last newline
+
+ QByteArray urlSafeFasta = makeStringUrlSafe(selectedNodesFasta);
+ QByteArray url = "http://blast.ncbi.nlm.nih.gov/Blast.cgi?PROGRAM=blastn&PAGE_TYPE=BlastSearch&LINK_LOC=blasthome&QUERY=" + urlSafeFasta;
+
+ if (url.length() < 8190)
+ QDesktopServices::openUrl(QUrl(url));
+
+ else
+ {
+ QMessageBox::information(this, "Long sequences", "The selected node sequences are too long to pass to the BLAST web "
+ "interface via the URL. Bandage has put them in your clipboard so "
+ "you can paste them in.");
+ QClipboard * clipboard = QApplication::clipboard();
+ clipboard->setText(selectedNodesFasta);
+
+ QByteArray url = "http://blast.ncbi.nlm.nih.gov/Blast.cgi?PROGRAM=blastn&PAGE_TYPE=BlastSearch&LINK_LOC=blasthome";
+ QDesktopServices::openUrl(QUrl(url));
+ }
+}
+
+//http://www.ncbi.nlm.nih.gov/staff/tao/URLAPI/new/node101.html#sub:Escape-of-Unsafe
+QByteArray MainWindow::makeStringUrlSafe(QByteArray s)
+{
+ s.replace("%", "%25");
+ s.replace(">", "%3E");
+ s.replace("[", "%5B");
+ s.replace("]", "%5D");
+ s.replace("\n", "%0D%0A");
+ s.replace("|", "%7C");
+ s.replace("@", "%40");
+ s.replace("#", "%23");
+ s.replace("+", "%2B");
+ s.replace(" ", "+");
+ s.replace("\t", "+");
+
+ return s;
+}
+
+
+//This function removes nodes from the visualisation, but leaves them in the
+//actual graph.
+void MainWindow::hideNodes()
+{
+ std::vector<DeBruijnNode *> selectedNodes = m_scene->getSelectedNodes();
+ g_assemblyGraph->removeGraphicsItemNodes(&selectedNodes, !g_settings->doubleMode, m_scene);
+}
+
+
+//This function removes selected nodes/edges from the graph.
+void MainWindow::removeSelection()
+{
+ std::vector<DeBruijnEdge *> selectedEdges = m_scene->getSelectedEdges();
+ std::vector<DeBruijnNode *> selectedNodes = m_scene->getSelectedNodes();
+
+ g_assemblyGraph->removeGraphicsItemEdges(&selectedEdges, true, m_scene);
+ g_assemblyGraph->removeGraphicsItemNodes(&selectedNodes, true, m_scene);
+
+ g_assemblyGraph->deleteEdges(&selectedEdges);
+ g_assemblyGraph->deleteNodes(&selectedNodes);
+
+ g_assemblyGraph->determineGraphInfo();
+ displayGraphDetails();
+
+ //Now that the graph has changed, we have to reset BLAST and contiguity
+ //stuff, as they may no longer apply.
+ cleanUpAllBlast();
+ g_assemblyGraph->resetNodeContiguityStatus();
+}
+
+
+
+void MainWindow::duplicateSelectedNodes()
+{
+ std::vector<DeBruijnNode *> selectedNodes = m_scene->getSelectedNodes();
+ if (selectedNodes.size() == 0)
+ {
+ QMessageBox::information(this, "No nodes selected", "You must first select one or more nodes before using the 'Duplicate selected nodes' function.");
+ return;
+ }
+
+ //Nodes are always duplicated in pairs (both positive and negative), so we
+ //want to compile a list of only positive nodes.
+ QList<DeBruijnNode *> nodesToDuplicate;
+ for (size_t i = 0; i < selectedNodes.size(); ++i)
+ {
+ DeBruijnNode * node = selectedNodes[i];
+ if (node->isNegativeNode())
+ node = node->getReverseComplement();
+ if (!nodesToDuplicate.contains(node))
+ nodesToDuplicate.push_back(node);
+ }
+
+ for (int i = 0; i < nodesToDuplicate.size(); ++i)
+ g_assemblyGraph->duplicateNodePair(nodesToDuplicate[i], m_scene);
+
+ g_assemblyGraph->determineGraphInfo();
+ displayGraphDetails();
+
+ //Now that the graph has changed, we have to reset BLAST and contiguity
+ //stuff, as they may no longer apply.
+ cleanUpAllBlast();
+ g_assemblyGraph->resetNodeContiguityStatus();
+}
+
+void MainWindow::mergeSelectedNodes()
+{
+ std::vector<DeBruijnNode *> selectedNodes = m_scene->getSelectedNodes();
+ if (selectedNodes.size() < 2)
+ {
+ QMessageBox::information(this, "Not enough nodes selected", "You must first select two or more nodes before using the 'Merge selected nodes' function.");
+ return;
+ }
+
+ //Nodes are always merged in pairs (both positive and negative), so we
+ //want to compile a list of only positive nodes.
+ QList<DeBruijnNode *> nodesToMerge;
+ for (size_t i = 0; i < selectedNodes.size(); ++i)
+ {
+ DeBruijnNode * node = selectedNodes[i];
+ if (node->isNegativeNode())
+ node = node->getReverseComplement();
+ if (!nodesToMerge.contains(node))
+ nodesToMerge.push_back(node);
+ }
+
+ if (nodesToMerge.size() < 2)
+ {
+ QMessageBox::information(this, "Not enough nodes selected", "You must first select two or more nodes before using the 'Merge selected nodes' function. "
+ "Note that two complementary nodes only count as a single node regarding a merge.");
+ return;
+ }
+
+ bool success = g_assemblyGraph->mergeNodes(nodesToMerge, m_scene, true);
+
+ if (!success)
+ {
+ QMessageBox::information(this, "Nodes cannot be merged", "You can only merge nodes that are in a single, unbranching path with no extra edges.");
+ return;
+ }
+
+ g_assemblyGraph->determineGraphInfo();
+ displayGraphDetails();
+
+ //Now that the graph has changed, we have to reset BLAST and contiguity
+ //stuff, as they may no longer apply.
+ cleanUpAllBlast();
+ g_assemblyGraph->resetNodeContiguityStatus();
+}
+
+void MainWindow::mergeAllPossible()
+{
+ int merges;
+ {
+ MyProgressDialog progress(this, "Merging nodes", true, "Cancel merge", "Cancelling merge...",
+ "Clicking this button will stop the merging process. Merges that have already completed will remain "
+ "merged but no further merging will take place.");
+
+ progress.setWindowModality(Qt::WindowModal);
+ progress.setMaxValue(100);
+ progress.show();
+
+ connect(g_assemblyGraph.data(), SIGNAL(setMergeTotalCount(int)), &progress, SLOT(setMaxValue(int)));
+ connect(g_assemblyGraph.data(), SIGNAL(setMergeCompletedCount(int)), &progress, SLOT(setValue(int)));
+
+
+ g_graphicsView->viewport()->setUpdatesEnabled(false);
+ merges = g_assemblyGraph->mergeAllPossible(m_scene, &progress);
+ g_graphicsView->viewport()->setUpdatesEnabled(true);
+ }
+
+ if (merges > 0)
+ {
+ g_assemblyGraph->determineGraphInfo();
+ displayGraphDetails();
+
+ //Now that the graph has changed, we have to reset BLAST and contiguity
+ //stuff, as they may no longer apply.
+ cleanUpAllBlast();
+ g_assemblyGraph->resetNodeContiguityStatus();
+ }
+ else
+ QMessageBox::information(this, "No possible merges", "The graph contains no nodes that can be merged.");
+}
+
+
+void MainWindow::cleanUpAllBlast()
+{
+ g_blastSearch->cleanUp();
+ g_assemblyGraph->clearAllBlastHitPointers();
+ ui->blastQueryComboBox->clear();
+
+ if (m_blastSearchDialog != 0)
+ {
+ delete m_blastSearchDialog;
+ m_blastSearchDialog = 0;
+ }
+}
+
+
+
+void MainWindow::changeNodeName()
+{
+ DeBruijnNode * selectedNode = m_scene->getOnePositiveSelectedNode();
+ if (selectedNode == 0)
+ {
+ QMessageBox::information(this, "Improper selection", "You must select exactly one node in the graph before using this function.");
+ return;
+ }
+
+ QString oldName = selectedNode->getNameWithoutSign();
+ ChangeNodeNameDialog changeNodeNameDialog(this, oldName);
+
+ if (changeNodeNameDialog.exec()) //The user clicked OK
+ {
+ g_assemblyGraph->changeNodeName(oldName, changeNodeNameDialog.getNewName());
+ selectionChanged();
+ cleanUpAllBlast();
+ }
+}
+
+void MainWindow::changeNodeDepth()
+{
+ std::vector<DeBruijnNode *> selectedNodes = m_scene->getSelectedPositiveNodes();
+ if (selectedNodes.size() == 0)
+ {
+ QMessageBox::information(this, "Improper selection", "You must select at least one node in the graph before using this function.");
+ return;
+ }
+
+ double oldDepth = g_assemblyGraph->getMeanDepth(selectedNodes);
+ ChangeNodeDepthDialog changeNodeDepthDialog(this, &selectedNodes,
+ oldDepth);
+
+ if (changeNodeDepthDialog.exec()) //The user clicked OK
+ {
+ g_assemblyGraph->changeNodeDepth(&selectedNodes,
+ changeNodeDepthDialog.getNewDepth());
+ selectionChanged();
+ g_assemblyGraph->recalculateAllDepthsRelativeToDrawnMean();
+ g_assemblyGraph->recalculateAllNodeWidths();
+ g_graphicsView->viewport()->update();
+ }
+}
+
+
+
+void MainWindow::openGraphInfoDialog()
+{
+ GraphInfoDialog graphInfoDialog(this);
+ graphInfoDialog.exec();
+}
diff --git a/ui/mainwindow.h b/ui/mainwindow.h
new file mode 100644
index 0000000..627e456
--- /dev/null
+++ b/ui/mainwindow.h
@@ -0,0 +1,171 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include <QMainWindow>
+#include <QGraphicsScene>
+#include <QMap>
+#include <QString>
+#include <vector>
+#include <QLineEdit>
+#include <QRectF>
+#include "../program/globals.h"
+#include <QThread>
+#include "../ogdf/energybased/FMMMLayout.h"
+
+class GraphicsViewZoom;
+class MyGraphicsScene;
+class DeBruijnNode;
+class DeBruijnEdge;
+class BlastSearchDialog;
+
+namespace Ui {
+class MainWindow;
+}
+
+class MainWindow : public QMainWindow
+{
+ Q_OBJECT
+
+public:
+ explicit MainWindow(QString fileToLoadOnStartup = "", bool drawGraphAfterLoad = false);
+ ~MainWindow();
+
+private:
+ Ui::MainWindow *ui;
+ MyGraphicsScene * m_scene;
+
+ GraphicsViewZoom * m_graphicsViewZoom;
+ double m_previousZoomSpinBoxValue;
+ QThread * m_layoutThread;
+ ogdf::FMMMLayout * m_fmmm;
+ QString m_imageFilter;
+ QString m_fileToLoadOnStartup;
+ bool m_drawGraphAfterLoad;
+ UiState m_uiState;
+ BlastSearchDialog * m_blastSearchDialog;
+ bool m_alreadyShown;
+
+ void cleanUp();
+ void displayGraphDetails();
+ void clearGraphDetails();
+ void resetScene();
+ void layoutGraph();
+ void addGraphicsItemsToScene();
+ void zoomToFitRect(QRectF rect);
+ void zoomToFitScene();
+ void setZoomSpinBoxStep();
+ void getSelectedNodeInfo(int & selectedNodeCount, QString & selectedNodeCountText, QString & selectedNodeListText, QString & selectedNodeLengthText, QString &selectedNodeDepthText);
+ QString getSelectedEdgeListText();
+ std::vector<DeBruijnNode *> getNodesFromLineEdit(QLineEdit * lineEdit, bool exactMatch, std::vector<QString> * nodesNotInGraph = 0);
+ void setSceneRectangle();
+ void loadGraph2(GraphFileType graphFileType, QString filename);
+ void setInfoTexts();
+ void setUiState(UiState uiState);
+ void selectBasedOnContiguity(ContiguityStatus contiguityStatus);
+ void setWidgetsFromSettings();
+ QString getDefaultImageFileName();
+ void setNodeColourSchemeComboBox(NodeColourScheme nodeColourScheme);
+ void setGraphScopeComboBox(GraphScope graphScope);
+ void setupBlastQueryComboBox();
+ bool checkForImageSave();
+ QString convertGraphFileTypeToString(GraphFileType graphFileType);
+ void setSelectedNodesWidgetsVisibility(bool visible);
+ void setSelectedEdgesWidgetsVisibility(bool visible);
+ void setStartingNodesWidgetVisibility(bool visible);
+ void setNodeDistanceWidgetVisibility(bool visible);
+ void setDepthRangeWidgetVisibility(bool visible);
+ static QByteArray makeStringUrlSafe(QByteArray s);
+ void removeGraphicsItemNodes(const std::vector<DeBruijnNode *> * nodes, bool reverseComplement);
+ void removeGraphicsItemEdges(const std::vector<DeBruijnEdge *> * edges, bool reverseComplement);
+ void removeAllGraphicsEdgesFromNode(DeBruijnNode * node, bool reverseComplement);
+ std::vector<DeBruijnNode *> addComplementaryNodes(std::vector<DeBruijnNode *> nodes);
+
+private slots:
+ void loadGraph(QString fullFileName = "");
+ void loadCSV(QString fullFileNAme = "");
+ void selectionChanged();
+ void graphScopeChanged();
+ void drawGraph();
+ void zoomSpinBoxChanged();
+ void zoomedWithMouseWheel();
+ void copySelectedSequencesToClipboardActionTriggered();
+ void copySelectedSequencesToClipboard();
+ void saveSelectedSequencesToFileActionTriggered();
+ void saveSelectedSequencesToFile();
+ void copySelectedPathToClipboard();
+ void saveSelectedPathToFile();
+ void switchColourScheme();
+ void determineContiguityFromSelectedNode();
+ void saveImageCurrentView();
+ void saveImageEntireScene();
+ void setTextDisplaySettings();
+ void fontButtonPressed();
+ void setNodeCustomColour();
+ void setNodeCustomLabel();
+ void hideNodes();
+ void openSettingsDialog();
+ void openAboutDialog();
+ void selectUserSpecifiedNodes();
+ void graphLayoutFinished();
+ void openBlastSearchDialog();
+ void blastChanged();
+ void blastQueryChanged();
+ void showHidePanels();
+ void graphLayoutCancelled();
+ void bringSelectedNodesToFront();
+ void selectNodesWithBlastHits();
+ void selectAll();
+ void selectNone();
+ void invertSelection();
+ void zoomToSelection();
+ void selectContiguous();
+ void selectMaybeContiguous();
+ void selectNotContiguous();
+ void openBandageUrl();
+ void nodeDistanceChanged();
+ void depthRangeChanged();
+ void afterMainWindowShow();
+ void startingNodesExactMatchChanged();
+ void openPathSpecifyDialog();
+ void nodeWidthChanged();
+ void saveEntireGraphToFasta();
+ void saveEntireGraphToFastaOnlyPositiveNodes();
+ void saveEntireGraphToGfa();
+ void saveVisibleGraphToGfa();
+ void webBlastSelectedNodes();
+ void removeSelection();
+ void duplicateSelectedNodes();
+ void mergeSelectedNodes();
+ void mergeAllPossible();
+ void cleanUpAllBlast();
+ void changeNodeName();
+ void changeNodeDepth();
+ void openGraphInfoDialog();
+
+protected:
+ void showEvent(QShowEvent *ev);
+
+signals:
+ void windowLoaded();
+
+};
+
+#endif // MAINWINDOW_H
diff --git a/ui/mainwindow.ui b/ui/mainwindow.ui
new file mode 100644
index 0000000..7ac8182
--- /dev/null
+++ b/ui/mainwindow.ui
@@ -0,0 +1,2282 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QMainWindow" name="MainWindow">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>1465</width>
+ <height>924</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Bandage</string>
+ </property>
+ <property name="windowIcon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/icon.png</normaloff>:/icons/icon.png</iconset>
+ </property>
+ <widget class="QWidget" name="centralWidget">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="VerticalScrollArea" name="controlsScrollArea">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>0</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="verticalScrollBarPolicy">
+ <enum>Qt::ScrollBarAsNeeded</enum>
+ </property>
+ <property name="widgetResizable">
+ <bool>true</bool>
+ </property>
+ <widget class="QWidget" name="controlsScrollAreaWidgetContents">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>289</width>
+ <height>1058</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <widget class="QWidget" name="graphDetailsWidget" native="true">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_6">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <item row="2" column="1">
+ <widget class="QWidget" name="widget_14" native="true">
+ <layout class="QGridLayout" name="gridLayout_4">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <property name="verticalSpacing">
+ <number>0</number>
+ </property>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_6">
+ <property name="text">
+ <string>Edges:</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="edgeCountLabel">
+ <property name="text">
+ <string>0</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_8">
+ <property name="text">
+ <string>Total length:</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="totalLengthLabel">
+ <property name="text">
+ <string>0</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="nodeCountLabel">
+ <property name="text">
+ <string>0</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Nodes:</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2">
+ <widget class="Line" name="line_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="InfoTextWidget" name="graphInformationInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" colspan="2">
+ <widget class="QLabel" name="label_7">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Graph information</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="QPushButton" name="moreInfoButton">
+ <property name="text">
+ <string>More info</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>15</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QWidget" name="graphDrawingWidget" native="true">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label_5">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Graph drawing</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="graphDrawingWidget_2" native="true">
+ <layout class="QGridLayout" name="graphDrawingGridLayout">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <item row="2" column="0">
+ <widget class="InfoTextWidget" name="startingNodesMatchTypeInfoText" native="true">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="InfoTextWidget" name="startingNodesInfoText" native="true">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="InfoTextWidget" name="graphScopeInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QWidget" name="startingNodesMatchTypeWidget" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout_5">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QRadioButton" name="startingNodesExactMatchRadioButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Exact</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="startingNodesPartialMatchRadioButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Partial</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="InfoTextWidget" name="nodeDistanceInfoText" native="true">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0">
+ <widget class="InfoTextWidget" name="nodeStyleInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="2">
+ <widget class="QWidget" name="nodeStyleWidget" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout_6">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QRadioButton" name="singleNodesRadioButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Single</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="doubleNodesRadioButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Double</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="9" column="1" colspan="2">
+ <widget class="QPushButton" name="drawGraphButton">
+ <property name="text">
+ <string>Draw graph</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="1">
+ <widget class="QLabel" name="nodeStyleLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Style:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2">
+ <widget class="QSpinBox" name="nodeDistanceSpinBox">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="maximum">
+ <number>10000</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="startingNodesLabel">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Node(s):</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QLineEdit" name="startingNodesLineEdit">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QComboBox" name="graphScopeComboBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <item>
+ <property name="text">
+ <string>Entire graph</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Around nodes</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Around BLAST hits</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Depth range</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="graphScopeLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Scope:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QLabel" name="nodeDistanceLabel">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Distance:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="startingNodesMatchTypeLabel">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Match:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="2">
+ <widget class="QDoubleSpinBox" name="minDepthSpinBox">
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="decimals">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <double>1000000.000000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="InfoTextWidget" name="minDepthInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="9" column="0">
+ <widget class="InfoTextWidget" name="drawGraphInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="QLabel" name="minDepthLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Min:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0">
+ <widget class="InfoTextWidget" name="maxDepthInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1">
+ <widget class="QLabel" name="maxDepthLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Max:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="2">
+ <widget class="QDoubleSpinBox" name="maxDepthSpinBox">
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="decimals">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <double>1000000.000000000000000</double>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>229</width>
+ <height>15</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QWidget" name="graphDisplayWidget" native="true">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label_10">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Graph display</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line_5">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_2" native="true">
+ <layout class="QGridLayout" name="gridLayout_8">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <item row="2" column="0">
+ <widget class="InfoTextWidget" name="nodeColourInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="InfoTextWidget" name="zoomInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="InfoTextWidget" name="contiguityInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QDoubleSpinBox" name="zoomSpinBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="suffix">
+ <string>%</string>
+ </property>
+ <property name="decimals">
+ <number>1</number>
+ </property>
+ <property name="minimum">
+ <double>5.000000000000000</double>
+ </property>
+ <property name="maximum">
+ <double>500.000000000000000</double>
+ </property>
+ <property name="singleStep">
+ <double>5.000000000000000</double>
+ </property>
+ <property name="value">
+ <double>100.000000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1" colspan="2">
+ <widget class="QPushButton" name="contiguityButton">
+ <property name="text">
+ <string>Determine contiguity</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1" colspan="2">
+ <widget class="QComboBox" name="coloursComboBox">
+ <item>
+ <property name="text">
+ <string>Random colours</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Uniform colour</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Colour by depth</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>BLAST hits (solid)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>BLAST hits (rainbow)</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Colour by contiguity</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Custom colours</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="label_13">
+ <property name="text">
+ <string>Zoom:</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="InfoTextWidget" name="nodeWidthInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="label_15">
+ <property name="text">
+ <string>Node width:</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QDoubleSpinBox" name="nodeWidthSpinBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="suffix">
+ <string/>
+ </property>
+ <property name="decimals">
+ <number>1</number>
+ </property>
+ <property name="minimum">
+ <double>0.500000000000000</double>
+ </property>
+ <property name="maximum">
+ <double>1000.000000000000000</double>
+ </property>
+ <property name="singleStep">
+ <double>0.500000000000000</double>
+ </property>
+ <property name="value">
+ <double>5.000000000000000</double>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_4">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>15</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QWidget" name="nodeLabelsWidget" native="true">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_7">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="nodeLabelsG">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Node labels</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line_6">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_8" native="true">
+ <layout class="QGridLayout" name="gridLayout_7">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <item row="0" column="0">
+ <widget class="InfoTextWidget" name="nodeLabelsInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="InfoTextWidget" name="nodeFontInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QPushButton" name="fontButton">
+ <property name="text">
+ <string>Font</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QCheckBox" name="textOutlineCheckBox">
+ <property name="text">
+ <string>Text outline</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1" colspan="2">
+ <widget class="QWidget" name="widget_13" native="true">
+ <layout class="QGridLayout" name="gridLayout_3">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <property name="verticalSpacing">
+ <number>0</number>
+ </property>
+ <item row="0" column="0">
+ <widget class="QCheckBox" name="nodeCustomLabelsCheckBox">
+ <property name="text">
+ <string>Custom</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QCheckBox" name="nodeNamesCheckBox">
+ <property name="text">
+ <string>Name</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QCheckBox" name="nodeLengthsCheckBox">
+ <property name="text">
+ <string>Length</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QCheckBox" name="nodeDepthCheckBox">
+ <property name="text">
+ <string>Depth</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QCheckBox" name="blastHitsCheckBox">
+ <property name="text">
+ <string>BLAST hits</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="QComboBox" name="csvComboBox">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QCheckBox" name="csvCheckBox">
+ <property name="text">
+ <string>CSV data:</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_6">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>229</width>
+ <height>15</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QWidget" name="blastSearchWidget" native="true">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_10">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="nodeLabelsG_2">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>BLAST</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line_7">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_4" native="true">
+ <layout class="QGridLayout" name="gridLayout_5">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <item row="1" column="0">
+ <widget class="InfoTextWidget" name="blastQueryInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="label_4">
+ <property name="text">
+ <string>Query:</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="InfoTextWidget" name="blastSearchInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QComboBox" name="blastQueryComboBox">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <item>
+ <property name="text">
+ <string>none</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="0" column="1" colspan="2">
+ <widget class="QPushButton" name="blastSearchButton">
+ <property name="text">
+ <string>Create/view BLAST search</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>0</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="graphicsViewWidget" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_9">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QWidget" name="widget_15" native="true"/>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="VerticalScrollArea" name="selectionScrollArea">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Expanding">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="widgetResizable">
+ <bool>true</bool>
+ </property>
+ <widget class="QWidget" name="selectionScrollAreaWidgetContents">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>249</width>
+ <height>899</height>
+ </rect>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_4">
+ <item>
+ <widget class="QLabel" name="label_14">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Find nodes</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line_10">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="nodeSelectionWidget" native="true">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item row="1" column="0">
+ <widget class="InfoTextWidget" name="selectionSearchNodesMatchTypeInfoText" native="true">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QRadioButton" name="selectionSearchNodesExactMatchRadioButton">
+ <property name="text">
+ <string>Exact</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="label_12">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Node(s):</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="InfoTextWidget" name="selectionSearchInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="label_16">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Match:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3">
+ <widget class="QRadioButton" name="selectionSearchNodesPartialMatchRadioButton">
+ <property name="text">
+ <string>Partial</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2" colspan="2">
+ <widget class="QLineEdit" name="selectionSearchNodesLineEdit">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="selectNodesButton">
+ <property name="text">
+ <string>Find node(s)</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="selectedNodesSpacerWidget" native="true">
+ <layout class="QVBoxLayout" name="verticalLayout_5">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <spacer name="selectedNodesSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>60</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="selectedNodesTitleLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Selected nodes</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="selectedNodesLine1">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPlainTextEdit" name="selectedNodesTextEdit">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Ignored" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="selectedNodesLengthLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Total length:</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="selectedNodesDepthLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Mean depth:</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="selectedNodesLine2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="selectedNodesModificationWidget" native="true">
+ <layout class="QGridLayout" name="gridLayout">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item row="0" column="0">
+ <widget class="InfoTextWidget" name="setColourAndLabelInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QPushButton" name="setNodeCustomLabelButton">
+ <property name="toolTip">
+ <string>Ctrl+L</string>
+ </property>
+ <property name="text">
+ <string>Set label</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QPushButton" name="setNodeCustomColourButton">
+ <property name="toolTip">
+ <string>Ctrl+O</string>
+ </property>
+ <property name="text">
+ <string>Set colour</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="selectedEdgesSpacerWidget" native="true">
+ <layout class="QVBoxLayout" name="verticalLayout_6">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <spacer name="selectedEdgesSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>60</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="selectedEdgesTitleLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Selected edges</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="selectedEdgesLine">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPlainTextEdit" name="selectedEdgesTextEdit">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Ignored" vsizetype="Minimum">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_5">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QMenuBar" name="menuBar">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>1465</width>
+ <height>22</height>
+ </rect>
+ </property>
+ <widget class="QMenu" name="menuFile">
+ <property name="title">
+ <string>File</string>
+ </property>
+ <addaction name="actionLoad_graph"/>
+ <addaction name="actionLoad_CSV"/>
+ <addaction name="separator"/>
+ <addaction name="actionSave_image_current_view"/>
+ <addaction name="actionSave_image_entire_scene"/>
+ <addaction name="separator"/>
+ <addaction name="actionExit"/>
+ </widget>
+ <widget class="QMenu" name="menuTools">
+ <property name="title">
+ <string>Tools</string>
+ </property>
+ <addaction name="actionSettings"/>
+ </widget>
+ <widget class="QMenu" name="menuView">
+ <property name="title">
+ <string>View</string>
+ </property>
+ <addaction name="actionControls_panel"/>
+ <addaction name="actionSelection_panel"/>
+ </widget>
+ <widget class="QMenu" name="menuSelection">
+ <property name="title">
+ <string>Select</string>
+ </property>
+ <widget class="QMenu" name="menuSelect_nodes_based_on_contiguity">
+ <property name="title">
+ <string>Select nodes based on contiguity</string>
+ </property>
+ <property name="icon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/contiguity.png</normaloff>:/icons/contiguity.png</iconset>
+ </property>
+ <addaction name="actionSelect_contiguous_nodes"/>
+ <addaction name="actionSelect_possibly_contiguous_nodes"/>
+ <addaction name="actionSelect_not_contiguous_nodes"/>
+ </widget>
+ <addaction name="actionSelect_all"/>
+ <addaction name="actionSelect_none"/>
+ <addaction name="actionInvert_selection"/>
+ <addaction name="separator"/>
+ <addaction name="actionBring_selected_nodes_to_front"/>
+ <addaction name="actionZoom_to_selection"/>
+ <addaction name="separator"/>
+ <addaction name="actionSelect_nodes_with_BLAST_hits"/>
+ <addaction name="menuSelect_nodes_based_on_contiguity"/>
+ </widget>
+ <widget class="QMenu" name="menuHelp">
+ <property name="title">
+ <string>Help</string>
+ </property>
+ <addaction name="actionAbout"/>
+ <addaction name="actionBandage_online_help"/>
+ </widget>
+ <widget class="QMenu" name="menuOutput">
+ <property name="title">
+ <string>Output</string>
+ </property>
+ <addaction name="actionCopy_selected_node_sequences_to_clipboard"/>
+ <addaction name="actionSave_selected_node_sequences_to_FASTA"/>
+ <addaction name="separator"/>
+ <addaction name="actionCopy_selected_node_path_to_clipboard"/>
+ <addaction name="actionSave_selected_node_path_to_FASTA"/>
+ <addaction name="actionSpecify_exact_path_for_copy_save"/>
+ <addaction name="separator"/>
+ <addaction name="actionSave_entire_graph_to_GFA"/>
+ <addaction name="actionSave_visible_graph_to_GFA"/>
+ <addaction name="separator"/>
+ <addaction name="actionSave_entire_graph_to_FASTA"/>
+ <addaction name="actionSave_entire_graph_to_FASTA_only_positive_nodes"/>
+ <addaction name="separator"/>
+ <addaction name="actionWeb_BLAST_selected_nodes"/>
+ </widget>
+ <widget class="QMenu" name="menuManipulate">
+ <property name="title">
+ <string>Edit</string>
+ </property>
+ <addaction name="actionHide_selected_nodes"/>
+ <addaction name="separator"/>
+ <addaction name="actionRemove_selection_from_graph"/>
+ <addaction name="actionDuplicate_selected_nodes"/>
+ <addaction name="actionMerge_selected_nodes"/>
+ <addaction name="actionMerge_all_possible_nodes"/>
+ <addaction name="separator"/>
+ <addaction name="actionChange_node_name"/>
+ <addaction name="actionChange_node_depth"/>
+ </widget>
+ <addaction name="menuFile"/>
+ <addaction name="menuManipulate"/>
+ <addaction name="menuTools"/>
+ <addaction name="menuView"/>
+ <addaction name="menuSelection"/>
+ <addaction name="menuOutput"/>
+ <addaction name="menuHelp"/>
+ </widget>
+ <widget class="QStatusBar" name="statusBar"/>
+ <action name="actionLoad_graph">
+ <property name="icon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/load-256.png</normaloff>:/icons/load-256.png</iconset>
+ </property>
+ <property name="text">
+ <string>Load graph</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+O</string>
+ </property>
+ </action>
+ <action name="actionSave_image_current_view">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="icon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/save-256.png</normaloff>:/icons/save-256.png</iconset>
+ </property>
+ <property name="text">
+ <string>Save image (current view)</string>
+ </property>
+ </action>
+ <action name="actionExit">
+ <property name="icon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/exit-256.png</normaloff>:/icons/exit-256.png</iconset>
+ </property>
+ <property name="text">
+ <string>Exit</string>
+ </property>
+ </action>
+ <action name="actionSettings">
+ <property name="icon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/settings-256.png</normaloff>:/icons/settings-256.png</iconset>
+ </property>
+ <property name="text">
+ <string>Settings</string>
+ </property>
+ </action>
+ <action name="actionAbout">
+ <property name="icon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/information-256.png</normaloff>:/icons/information-256.png</iconset>
+ </property>
+ <property name="text">
+ <string>About</string>
+ </property>
+ </action>
+ <action name="actionSave_image_entire_scene">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="icon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/save-256.png</normaloff>:/icons/save-256.png</iconset>
+ </property>
+ <property name="text">
+ <string>Save image (entire scene)</string>
+ </property>
+ </action>
+ <action name="actionControls_panel">
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Controls panel</string>
+ </property>
+ </action>
+ <action name="actionSelection_panel">
+ <property name="checkable">
+ <bool>true</bool>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Selection panel</string>
+ </property>
+ </action>
+ <action name="actionBring_selected_nodes_to_front">
+ <property name="icon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/bring-to-front.png</normaloff>:/icons/bring-to-front.png</iconset>
+ </property>
+ <property name="text">
+ <string>Bring selected nodes to front</string>
+ </property>
+ <property name="toolTip">
+ <string>Bring selected nodes to front</string>
+ </property>
+ </action>
+ <action name="actionSelect_nodes_with_BLAST_hits">
+ <property name="icon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/BLAST.png</normaloff>:/icons/BLAST.png</iconset>
+ </property>
+ <property name="text">
+ <string>Select nodes with BLAST hits</string>
+ </property>
+ <property name="toolTip">
+ <string>Select nodes with BLAST hits</string>
+ </property>
+ </action>
+ <action name="actionSelect_all">
+ <property name="icon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/select-all.png</normaloff>:/icons/select-all.png</iconset>
+ </property>
+ <property name="text">
+ <string>Select all</string>
+ </property>
+ </action>
+ <action name="actionInvert_selection">
+ <property name="icon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/invert-selection.png</normaloff>:/icons/invert-selection.png</iconset>
+ </property>
+ <property name="text">
+ <string>Invert selection</string>
+ </property>
+ </action>
+ <action name="actionCopy_selected_node_sequences_to_clipboard">
+ <property name="icon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/copy.png</normaloff>:/icons/copy.png</iconset>
+ </property>
+ <property name="text">
+ <string>Copy selected node sequences to clipboard</string>
+ </property>
+ <property name="toolTip">
+ <string>Copy selected node sequences to clipboard</string>
+ </property>
+ </action>
+ <action name="actionSave_selected_node_sequences_to_FASTA">
+ <property name="icon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/save-256.png</normaloff>:/icons/save-256.png</iconset>
+ </property>
+ <property name="text">
+ <string>Save selected node sequences to FASTA</string>
+ </property>
+ <property name="toolTip">
+ <string>Save selected node sequences to FASTA</string>
+ </property>
+ </action>
+ <action name="actionSelect_none">
+ <property name="icon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/select-none.png</normaloff>:/icons/select-none.png</iconset>
+ </property>
+ <property name="text">
+ <string>Select none</string>
+ </property>
+ </action>
+ <action name="actionZoom_to_selection">
+ <property name="icon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/zoom.png</normaloff>:/icons/zoom.png</iconset>
+ </property>
+ <property name="text">
+ <string>Zoom to fit selection</string>
+ </property>
+ </action>
+ <action name="actionSelect_possibly_contiguous_nodes">
+ <property name="icon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/contiguity-maybe_contiguous.png</normaloff>:/icons/contiguity-maybe_contiguous.png</iconset>
+ </property>
+ <property name="text">
+ <string>Select possibly contiguous nodes</string>
+ </property>
+ </action>
+ <action name="actionSelect_contiguous_nodes">
+ <property name="icon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/contiguity-contiguous.png</normaloff>:/icons/contiguity-contiguous.png</iconset>
+ </property>
+ <property name="text">
+ <string>Select contiguous nodes</string>
+ </property>
+ </action>
+ <action name="actionSelect_not_contiguous_nodes">
+ <property name="icon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/contiguity-not_contiguous.png</normaloff>:/icons/contiguity-not_contiguous.png</iconset>
+ </property>
+ <property name="text">
+ <string>Select not contiguous nodes</string>
+ </property>
+ </action>
+ <action name="actionBandage_online_help">
+ <property name="icon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/icon.png</normaloff>:/icons/icon.png</iconset>
+ </property>
+ <property name="text">
+ <string>Bandage online help</string>
+ </property>
+ <property name="toolTip">
+ <string>Bandage online help</string>
+ </property>
+ </action>
+ <action name="actionCopy_selected_node_path_to_clipboard">
+ <property name="icon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/copy.png</normaloff>:/icons/copy.png</iconset>
+ </property>
+ <property name="text">
+ <string>Copy selected path sequence to clipboard</string>
+ </property>
+ <property name="toolTip">
+ <string>Copy selected path sequence to clipboard</string>
+ </property>
+ </action>
+ <action name="actionSave_selected_node_path_to_FASTA">
+ <property name="icon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/save-256.png</normaloff>:/icons/save-256.png</iconset>
+ </property>
+ <property name="text">
+ <string>Save selected path sequence to FASTA</string>
+ </property>
+ <property name="toolTip">
+ <string>Save selected path sequence to FASTA</string>
+ </property>
+ </action>
+ <action name="actionSpecify_exact_path_for_copy_save">
+ <property name="icon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/specify-path.png</normaloff>:/icons/specify-path.png</iconset>
+ </property>
+ <property name="text">
+ <string>Specify exact path for copy/save</string>
+ </property>
+ </action>
+ <action name="actionLoad_CSV">
+ <property name="icon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/load-256.png</normaloff>:/icons/load-256.png</iconset>
+ </property>
+ <property name="text">
+ <string>Load CSV data</string>
+ </property>
+ <property name="toolTip">
+ <string>Load CSV label data</string>
+ </property>
+ </action>
+ <action name="actionSave_entire_graph_to_FASTA">
+ <property name="icon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/save-256.png</normaloff>:/icons/save-256.png</iconset>
+ </property>
+ <property name="text">
+ <string>Save entire graph to FASTA (both positive and negative nodes)</string>
+ </property>
+ </action>
+ <action name="actionSave_entire_graph_to_FASTA_only_positive_nodes">
+ <property name="icon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/save-256.png</normaloff>:/icons/save-256.png</iconset>
+ </property>
+ <property name="text">
+ <string>Save entire graph to FASTA (only positive nodes)</string>
+ </property>
+ </action>
+ <action name="actionWeb_BLAST_selected_nodes">
+ <property name="icon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/ncbi-256.png</normaloff>:/icons/ncbi-256.png</iconset>
+ </property>
+ <property name="text">
+ <string>Web BLAST selected nodes</string>
+ </property>
+ </action>
+ <action name="actionHide_selected_nodes">
+ <property name="text">
+ <string>Hide selected nodes</string>
+ </property>
+ <property name="shortcut">
+ <string>Del</string>
+ </property>
+ </action>
+ <action name="actionRemove_selection_from_graph">
+ <property name="text">
+ <string>Remove selection from graph</string>
+ </property>
+ <property name="shortcut">
+ <string>Shift+Del</string>
+ </property>
+ </action>
+ <action name="actionDuplicate_selected_nodes">
+ <property name="text">
+ <string>Duplicate selected nodes</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+D</string>
+ </property>
+ </action>
+ <action name="actionMerge_selected_nodes">
+ <property name="text">
+ <string>Merge selected nodes</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+M</string>
+ </property>
+ </action>
+ <action name="actionMerge_all_possible_nodes">
+ <property name="text">
+ <string>Merge all possible nodes</string>
+ </property>
+ <property name="shortcut">
+ <string>Ctrl+Shift+M</string>
+ </property>
+ </action>
+ <action name="actionSave_entire_graph_to_GFA">
+ <property name="icon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/save-256.png</normaloff>:/icons/save-256.png</iconset>
+ </property>
+ <property name="text">
+ <string>Save entire graph to GFA</string>
+ </property>
+ </action>
+ <action name="actionSave_visible_graph_to_GFA">
+ <property name="icon">
+ <iconset resource="../images/images.qrc">
+ <normaloff>:/icons/save-256.png</normaloff>:/icons/save-256.png</iconset>
+ </property>
+ <property name="text">
+ <string>Save visible graph to GFA</string>
+ </property>
+ </action>
+ <action name="actionChange_node_name">
+ <property name="text">
+ <string>Change node name</string>
+ </property>
+ </action>
+ <action name="actionChange_node_depth">
+ <property name="text">
+ <string>Change node depth</string>
+ </property>
+ </action>
+ </widget>
+ <layoutdefault spacing="6" margin="11"/>
+ <customwidgets>
+ <customwidget>
+ <class>InfoTextWidget</class>
+ <extends>QWidget</extends>
+ <header>infotextwidget.h</header>
+ <container>1</container>
+ </customwidget>
+ <customwidget>
+ <class>VerticalScrollArea</class>
+ <extends>QScrollArea</extends>
+ <header>verticalscrollarea.h</header>
+ <container>1</container>
+ </customwidget>
+ </customwidgets>
+ <tabstops>
+ <tabstop>controlsScrollArea</tabstop>
+ <tabstop>graphScopeComboBox</tabstop>
+ <tabstop>startingNodesLineEdit</tabstop>
+ <tabstop>startingNodesExactMatchRadioButton</tabstop>
+ <tabstop>startingNodesPartialMatchRadioButton</tabstop>
+ <tabstop>nodeDistanceSpinBox</tabstop>
+ <tabstop>singleNodesRadioButton</tabstop>
+ <tabstop>doubleNodesRadioButton</tabstop>
+ <tabstop>drawGraphButton</tabstop>
+ <tabstop>zoomSpinBox</tabstop>
+ <tabstop>nodeWidthSpinBox</tabstop>
+ <tabstop>coloursComboBox</tabstop>
+ <tabstop>contiguityButton</tabstop>
+ <tabstop>nodeCustomLabelsCheckBox</tabstop>
+ <tabstop>nodeNamesCheckBox</tabstop>
+ <tabstop>nodeLengthsCheckBox</tabstop>
+ <tabstop>nodeDepthCheckBox</tabstop>
+ <tabstop>blastHitsCheckBox</tabstop>
+ <tabstop>fontButton</tabstop>
+ <tabstop>textOutlineCheckBox</tabstop>
+ <tabstop>blastSearchButton</tabstop>
+ <tabstop>blastQueryComboBox</tabstop>
+ <tabstop>selectionScrollArea</tabstop>
+ <tabstop>selectionSearchNodesLineEdit</tabstop>
+ <tabstop>selectionSearchNodesExactMatchRadioButton</tabstop>
+ <tabstop>selectionSearchNodesPartialMatchRadioButton</tabstop>
+ <tabstop>selectNodesButton</tabstop>
+ <tabstop>selectedNodesTextEdit</tabstop>
+ <tabstop>setNodeCustomColourButton</tabstop>
+ <tabstop>setNodeCustomLabelButton</tabstop>
+ <tabstop>selectedEdgesTextEdit</tabstop>
+ </tabstops>
+ <resources>
+ <include location="../images/images.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/ui/mygraphicsscene.cpp b/ui/mygraphicsscene.cpp
new file mode 100644
index 0000000..bee56d7
--- /dev/null
+++ b/ui/mygraphicsscene.cpp
@@ -0,0 +1,253 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "mygraphicsscene.h"
+#include "../graph/debruijnnode.h"
+#include "../graph/debruijnedge.h"
+#include "../graph/graphicsitemnode.h"
+#include "../graph/graphicsitemedge.h"
+#include "../graph/debruijnnode.h"
+
+MyGraphicsScene::MyGraphicsScene(QObject *parent) :
+ QGraphicsScene(parent)
+{
+}
+
+
+bool compareNodePointers(DeBruijnNode * a, DeBruijnNode * b)
+{
+ QString aName = a->getName();
+ QString bName = b->getName();
+
+ QString aName2 = aName;
+ aName2.chop(1);
+ QString bName2 = bName;
+ bName2.chop(1);
+
+ bool ok1, ok2;
+ long long aNum = aName2.toLongLong(&ok1);
+ long long bNum = bName2.toLongLong(&ok2);
+
+ //If the node names are essentially numbers, then sort them as numbers
+ if (ok1 && ok2 && aNum != bNum)
+ return aNum < bNum;
+
+ return aName < bName;
+}
+
+
+//This function returns all of the selected nodes, sorted by their node number.
+std::vector<DeBruijnNode *> MyGraphicsScene::getSelectedNodes()
+{
+ std::vector<DeBruijnNode *> returnVector;
+
+ QList<QGraphicsItem *> selection = selectedItems();
+ for (int i = 0; i < selection.size(); ++i)
+ {
+ QGraphicsItem * selectedItem = selection[i];
+ GraphicsItemNode * selectedNodeItem = dynamic_cast<GraphicsItemNode *>(selectedItem);
+ if (selectedNodeItem != 0)
+ returnVector.push_back(selectedNodeItem->m_deBruijnNode);
+ }
+
+ std::sort(returnVector.begin(), returnVector.end(), compareNodePointers);
+
+ return returnVector;
+}
+
+
+//This function works like getSelectedNodes, but only positive nodes are
+//returned. If a negative node is selected, its positive complement is in the
+//results. If both nodes in a pair are selected, then only the positive node
+//of the pair is in the results.
+std::vector<DeBruijnNode *> MyGraphicsScene::getSelectedPositiveNodes()
+{
+ std::vector<DeBruijnNode *> selectedNodes = getSelectedNodes();
+
+ //First turn all of the nodes to positive nodes.
+ std::vector<DeBruijnNode *> allPositive;
+ for (size_t i = 0; i < selectedNodes.size(); ++i)
+ {
+ DeBruijnNode * node = selectedNodes[i];
+ if (node->isNegativeNode())
+ node = node->getReverseComplement();
+ allPositive.push_back(node);
+ }
+
+ //Now remove duplicates. Since the nodes are sorted, all duplicates should
+ //be adjacent to each other.
+ std::vector<DeBruijnNode *> uniquePositive;
+ for (size_t i = 0; i < allPositive.size(); ++i)
+ {
+ DeBruijnNode * node = allPositive[i];
+ DeBruijnNode * previousNode = 0;
+ if (i > 0)
+ previousNode = allPositive[i-1];
+ if (node != previousNode)
+ uniquePositive.push_back(node);
+ }
+
+ return uniquePositive;
+}
+
+//This function returns all of the selected graphics item nodes, unsorted.
+std::vector<GraphicsItemNode *> MyGraphicsScene::getSelectedGraphicsItemNodes()
+{
+ std::vector<GraphicsItemNode *> returnVector;
+
+ QList<QGraphicsItem *> selection = selectedItems();
+ for (int i = 0; i < selection.size(); ++i)
+ {
+ QGraphicsItem * selectedItem = selection[i];
+ GraphicsItemNode * selectedNodeItem = dynamic_cast<GraphicsItemNode *>(selectedItem);
+ if (selectedNodeItem != 0)
+ returnVector.push_back(selectedNodeItem);
+ }
+
+ return returnVector;
+}
+
+
+std::vector<DeBruijnEdge *> MyGraphicsScene::getSelectedEdges()
+{
+ std::vector<DeBruijnEdge *> returnVector;
+
+ QList<QGraphicsItem *> selection = selectedItems();
+ for (int i = 0; i < selection.size(); ++i)
+ {
+ QGraphicsItem * selectedItem = selection[i];
+ GraphicsItemEdge * selectedEdgeItem = dynamic_cast<GraphicsItemEdge *>(selectedItem);
+ if (selectedEdgeItem != 0)
+ returnVector.push_back(selectedEdgeItem->m_deBruijnEdge);
+ }
+
+ return returnVector;
+}
+
+
+
+DeBruijnNode * MyGraphicsScene::getOneSelectedNode()
+{
+ std::vector<DeBruijnNode *> selectedNodes = getSelectedNodes();
+ if (selectedNodes.size() == 0)
+ return 0;
+ else
+ return selectedNodes[0];
+}
+
+DeBruijnEdge * MyGraphicsScene::getOneSelectedEdge()
+{
+ std::vector<DeBruijnEdge *> selectedEdges = getSelectedEdges();
+ if (selectedEdges.size() == 0)
+ return 0;
+ else
+ return selectedEdges[0];
+}
+
+//This function, like getOneSelectedNode, returns a single selected node from
+//graph and a 0 if it can't be done. However, it will always return the
+//positive node in the pair, and if two complementary nodes are selected, it
+//will still work.
+DeBruijnNode * MyGraphicsScene::getOnePositiveSelectedNode()
+{
+ std::vector<DeBruijnNode *> selectedNodes = getSelectedNodes();
+ if (selectedNodes.size() == 0)
+ return 0;
+
+ else if (selectedNodes.size() == 1)
+ {
+ DeBruijnNode * selectedNode = selectedNodes[0];
+ if (selectedNode->isPositiveNode())
+ return selectedNode;
+ else
+ return selectedNode->getReverseComplement();
+ }
+
+ else if (selectedNodes.size() == 2)
+ {
+ DeBruijnNode * selectedNode1 = selectedNodes[0];
+ DeBruijnNode * selectedNode2 = selectedNodes[1];
+ if (selectedNode1->getReverseComplement() == selectedNode2)
+ {
+ if (selectedNode1->isPositiveNode())
+ return selectedNode1;
+ else
+ return selectedNode2;
+ }
+ else
+ return 0;
+ }
+
+ return 0;
+}
+
+double MyGraphicsScene::getTopZValue()
+{
+ double topZ = 0.0;
+
+ QList<QGraphicsItem *> allItems = items();
+ for (int i = 0; i < allItems.size(); ++i)
+ {
+ QGraphicsItem * item = allItems[i];
+ if (i == 0)
+ topZ = item->zValue();
+ else
+ {
+ double z = item->zValue();
+ if (z > topZ)
+ topZ = z;
+ }
+ }
+
+ return topZ;
+}
+
+
+//Expands the scene rectangle a bit beyond the items so they aren't drawn right to the edge.
+void MyGraphicsScene::setSceneRectangle()
+{
+ QRectF boundingRect = itemsBoundingRect();
+ double width = boundingRect.width();
+ double height = boundingRect.height();
+ double margin = std::max(width, height);
+ margin *= 0.05; //5% margin
+
+ setSceneRect(boundingRect.left() - margin, boundingRect.top() - margin,
+ width + 2 * margin, height + 2 * margin);
+}
+
+
+
+//After the user drags nodes, it may be necessary to expand the scene rectangle
+//if the nodes were moved out of the existing rectangle.
+void MyGraphicsScene::possiblyExpandSceneRectangle(std::vector<GraphicsItemNode *> * movedNodes)
+{
+ QRectF currentSceneRect = sceneRect();
+ QRectF newSceneRect = currentSceneRect;
+
+ for (size_t i = 0; i < movedNodes->size(); ++i)
+ {
+ GraphicsItemNode * node = (*movedNodes)[i];
+ QRectF nodeRect = node->boundingRect();
+ newSceneRect = newSceneRect.united(nodeRect);
+ }
+
+ if (newSceneRect != currentSceneRect)
+ setSceneRect(newSceneRect);
+}
+
diff --git a/ui/mygraphicsscene.h b/ui/mygraphicsscene.h
new file mode 100644
index 0000000..44de624
--- /dev/null
+++ b/ui/mygraphicsscene.h
@@ -0,0 +1,47 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef MYGRAPHICSSCENE_H
+#define MYGRAPHICSSCENE_H
+
+#include <QGraphicsScene>
+#include <vector>
+
+class DeBruijnNode;
+class DeBruijnEdge;
+class GraphicsItemNode;
+
+class MyGraphicsScene : public QGraphicsScene
+{
+ Q_OBJECT
+public:
+ explicit MyGraphicsScene(QObject *parent = 0);
+ std::vector<DeBruijnNode *> getSelectedNodes();
+ std::vector<DeBruijnNode *> getSelectedPositiveNodes();
+ std::vector<GraphicsItemNode *> getSelectedGraphicsItemNodes();
+ std::vector<DeBruijnEdge *> getSelectedEdges();
+ DeBruijnNode * getOneSelectedNode();
+ DeBruijnEdge * getOneSelectedEdge();
+ DeBruijnNode * getOnePositiveSelectedNode();
+ double getTopZValue();
+ void setSceneRectangle();
+ void possiblyExpandSceneRectangle(std::vector<GraphicsItemNode *> * movedNodes);
+
+};
+
+#endif // MYGRAPHICSSCENE_H
diff --git a/ui/mygraphicsview.cpp b/ui/mygraphicsview.cpp
new file mode 100644
index 0000000..3cea4e7
--- /dev/null
+++ b/ui/mygraphicsview.cpp
@@ -0,0 +1,325 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "mygraphicsview.h"
+#include <QMouseEvent>
+#include "../program/globals.h"
+#include "../program/settings.h"
+#include <QFont>
+#include "graphicsviewzoom.h"
+#include <qmath.h>
+#include <QMessageBox>
+#include <math.h>
+#include "../graph/graphicsitemnode.h"
+
+MyGraphicsView::MyGraphicsView(QObject * /*parent*/) :
+ QGraphicsView(), m_rotation(0.0)
+{
+ setDragMode(QGraphicsView::RubberBandDrag);
+ setAntialiasing(g_settings->antialiasing);
+ setViewportUpdateMode(QGraphicsView::FullViewportUpdate);
+}
+
+
+
+void MyGraphicsView::mousePressEvent(QMouseEvent * event)
+{
+ if (event->modifiers() == Qt::CTRL)
+ setDragMode(QGraphicsView::ScrollHandDrag);
+ else if (event->button() == Qt::RightButton)
+ g_settings->nodeDragging = ONE_PIECE;
+
+ m_previousPos = event->pos();
+
+ QGraphicsView::mousePressEvent(event);
+}
+
+void MyGraphicsView::mouseReleaseEvent(QMouseEvent * event)
+{
+ QGraphicsView::mouseReleaseEvent(event);
+ setDragMode(QGraphicsView::RubberBandDrag);
+ g_settings->nodeDragging = NEARBY_PIECES;
+}
+
+void MyGraphicsView::mouseMoveEvent(QMouseEvent * event)
+{
+ //If the user drags the right mouse button while holding control,
+ //the view rotates.
+ bool rightButtonDown = event->buttons() & Qt::RightButton;
+ if (event->modifiers() == Qt::CTRL && rightButtonDown)
+ {
+ QPointF viewCentre(width() / 2.0, height() / 2.0);
+ double angle = angleBetweenTwoLines(viewCentre, m_previousPos, viewCentre, event->pos());
+ angle *= 57.295779513; //convert to degrees
+
+ rotate(angle);
+ m_rotation += angle;
+
+ m_previousPos = event->pos();
+
+ g_settings->nodeDragging = NO_DRAGGING;
+ }
+ else
+ {
+ QGraphicsView::mouseMoveEvent(event);
+ }
+}
+
+
+void MyGraphicsView::mouseDoubleClickEvent(QMouseEvent * event)
+{
+ //Find the node beneath the cursor.
+ QGraphicsItem * item = itemAt(event->pos());
+
+ GraphicsItemNode * graphicsItemNode = dynamic_cast<GraphicsItemNode *>(item);
+ if (graphicsItemNode != 0)
+ emit doubleClickedNode(graphicsItemNode->m_deBruijnNode);
+}
+
+//Adapted from:
+//http://stackoverflow.com/questions/2663570/how-to-calculate-both-positive-and-negative-angle-between-two-lines
+double MyGraphicsView::angleBetweenTwoLines(QPointF line1Start, QPointF line1End, QPointF line2Start, QPointF line2End)
+{
+ double a = line1End.x() - line1Start.x();
+ double b = line1End.y() - line1Start.y();
+ double c = line2End.x() - line2Start.x();
+ double d = line2End.y() - line2Start.y();
+
+ double atanA = atan2(a, b);
+ double atanB = atan2(c, d);
+
+ return atanA - atanB;
+}
+
+double MyGraphicsView::distance(double x1, double y1, double x2, double y2)
+{
+ double xDiff = x1 - x2;
+ double yDiff = y1 - y2;
+ return sqrt(xDiff * xDiff + yDiff * yDiff);
+}
+
+void MyGraphicsView::keyPressEvent(QKeyEvent * event)
+{
+ //This function uses angle in the same way that the mouse wheel code
+ //in GraphicsViewZoom does. This keeps the zoom steps consistent
+ //between keyboard and mouse wheel.
+ int angle = 0;
+
+
+ bool shiftPressed = event->modifiers().testFlag(Qt::ShiftModifier);
+
+ //Ctrl+C (Command+C on Mac) copies the selected sequences to the clipboard.
+ if (event->key() == Qt::Key_C && (event->modifiers() & Qt::ControlModifier))
+ emit copySelectedSequencesToClipboard();
+
+ //Ctrl+S (Command+S on Mac) saves the selected sequences to a FASTA file.
+ else if (event->key() == Qt::Key_S && (event->modifiers() & Qt::ControlModifier))
+ emit saveSelectedSequencesToFile();
+
+ //Ctrl+plus (Command+plus on Mac) zooms the view in. If shift is pressed
+ //as well, then it rotates clockwise.
+ else if (event->matches(QKeySequence::ZoomIn) ||
+ event->key() == Qt::Key_Equal ||
+ event->key() == Qt::Key_Plus)
+ {
+ if (shiftPressed)
+ changeRotation(1.0);
+ else
+ angle = 120;
+ }
+
+ //Ctrl+minus (Command+mins on Mac) zooms the view out. If shift is pressed
+ //as well, then it rotates anticlockwise.
+ else if (event->matches(QKeySequence::ZoomOut) ||
+ event->key() == Qt::Key_Minus ||
+ event->key() == Qt::Key_Underscore)
+ {
+ if (shiftPressed)
+ changeRotation(-1.0);
+ else
+ angle = -120;
+ }
+
+ //Actually change the zoom now, if appropriate.
+ if (angle != 0)
+ {
+ double factor = qPow(m_zoom->m_zoomFactorBase, angle);
+ m_zoom->gentleZoom(factor, KEYBOARD);
+ }
+
+ //The event press event handling of QGraphicsView will take care of using
+ //the arrow keys to adjust scroll bars.
+ QGraphicsView::keyPressEvent(event);
+}
+
+void MyGraphicsView::setAntialiasing(bool antialiasingOn)
+{
+ if (antialiasingOn)
+ {
+ setRenderHint(QPainter::Antialiasing, true);
+ setRenderHint(QPainter::TextAntialiasing, true);
+ g_settings->labelFont.setStyleStrategy(QFont::PreferDefault);
+ }
+ else
+ {
+ setRenderHint(QPainter::Antialiasing, false);
+ setRenderHint(QPainter::TextAntialiasing, false);
+ g_settings->labelFont.setStyleStrategy(QFont::NoAntialias);
+ }
+}
+
+bool MyGraphicsView::isPointVisible(QPointF p)
+{
+ QPointF corner1, corner2, corner3, corner4;
+ getFourViewportCornersInSceneCoordinates(&corner1, &corner2, &corner3, &corner4);
+ QLineF boundary1(corner1, corner2);
+ QLineF boundary2(corner2, corner3);
+ QLineF boundary3(corner3, corner4);
+ QLineF boundary4(corner4, corner1);
+
+ return !(differentSidesOfLine(p, corner3, boundary1) || differentSidesOfLine(p, corner4, boundary2) ||
+ differentSidesOfLine(p, corner1, boundary3) || differentSidesOfLine(p, corner2, boundary4));
+}
+
+
+//This function tests to see if two given points, p1 and p2, are on different sides of a line.
+bool MyGraphicsView::differentSidesOfLine(QPointF p1, QPointF p2, QLineF line)
+{
+ bool p1Side = sideOfLine(p1, line);
+ bool p2Side = sideOfLine(p2, line);
+ return (p1Side != p2Side);
+}
+//This function tests to see if all four points are the same side of a line (returns false) or
+//some are on different sides (returns true).
+bool MyGraphicsView::differentSidesOfLine(QPointF p1, QPointF p2, QPointF p3, QPointF p4, QLineF line)
+{
+ bool p1Side = sideOfLine(p1, line);
+ bool p2Side = sideOfLine(p2, line);
+ if (p1Side != p2Side)
+ return true;
+
+ bool p3Side = sideOfLine(p3, line);
+ if (p1Side != p3Side)
+ return true;
+
+ bool p4Side = sideOfLine(p4, line);
+ return (p1Side != p4Side);
+}
+
+bool MyGraphicsView::sideOfLine(QPointF p, QLineF line)
+{
+ return ((p.y() - line.p1().y() - (p.x() - line.p1().x())*(line.p2().y() - line.p1().y())/(line.p2().x() - line.p1().x())) > 0);
+}
+
+
+//This function assumes that the line does intersect with the viewport
+//boundary - i.e. one end of the line is in the viewport and one is not.
+QPointF MyGraphicsView::findIntersectionWithViewportBoundary(QLineF line)
+{
+ QPointF c1, c2, c3, c4;
+ getFourViewportCornersInSceneCoordinates(&c1, &c2, &c3, &c4);
+ QLineF boundary1(c1, c2);
+ QLineF boundary2(c2, c3);
+ QLineF boundary3(c3, c4);
+ QLineF boundary4(c4, c1);
+
+ QPointF intersection;
+
+ if (line.intersect(boundary1, &intersection) == QLineF::BoundedIntersection)
+ return intersection;
+ if (line.intersect(boundary2, &intersection) == QLineF::BoundedIntersection)
+ return intersection;
+ if (line.intersect(boundary3, &intersection) == QLineF::BoundedIntersection)
+ return intersection;
+ if (line.intersect(boundary4, &intersection) == QLineF::BoundedIntersection)
+ return intersection;
+
+ //The code should not get here, as the line should intersect with one of
+ //the boundaries.
+ return intersection;
+}
+
+
+//If a line intersections the scene rectangle but both of its end points are
+//outside the scene rectangle, then this function will return the part of the
+//line which is in the scene rectangle.
+QLineF MyGraphicsView::findVisiblePartOfLine(QLineF line, bool * success)
+{
+ QPointF c1, c2, c3, c4;
+ getFourViewportCornersInSceneCoordinates(&c1, &c2, &c3, &c4);
+ QLineF boundary1(c1, c2);
+ QLineF boundary2(c2, c3);
+ QLineF boundary3(c3, c4);
+ QLineF boundary4(c4, c1);
+
+ QPointF intersection1;
+ QPointF intersection2;
+ QPointF intersection3;
+ QPointF intersection4;
+
+ *success = true;
+
+ bool b1Intersects = (line.intersect(boundary1, &intersection1) == QLineF::BoundedIntersection);
+ bool b2Intersects = (line.intersect(boundary2, &intersection2) == QLineF::BoundedIntersection);
+ if (b1Intersects && b2Intersects)
+ return QLineF(intersection1, intersection2);
+
+ bool b3Intersects = (line.intersect(boundary3, &intersection3) == QLineF::BoundedIntersection);
+ if (b1Intersects && b3Intersects)
+ return QLineF(intersection1, intersection3);
+ if (b2Intersects && b3Intersects)
+ return QLineF(intersection2, intersection3);
+
+ bool b4Intersects = (line.intersect(boundary4, &intersection4) == QLineF::BoundedIntersection);
+ if (b1Intersects && b4Intersects)
+ return QLineF(intersection1, intersection4);
+ if (b2Intersects && b4Intersects)
+ return QLineF(intersection2, intersection4);
+ if (b3Intersects && b4Intersects)
+ return QLineF(intersection3, intersection4);
+
+ *success = false;
+ return QLineF();
+}
+
+
+void MyGraphicsView::getFourViewportCornersInSceneCoordinates(QPointF * c1, QPointF * c2, QPointF * c3, QPointF * c4)
+{
+ *c1 = mapToScene(QPoint(0, 0));
+ *c2 = mapToScene(QPoint(viewport()->width(), 0));
+ *c3 = mapToScene(QPoint(viewport()->width(), viewport()->height()));
+ *c4 = mapToScene(QPoint(0, viewport()->height()));
+}
+
+void MyGraphicsView::setRotation(double newRotation)
+{
+ undoRotation();
+ changeRotation(newRotation);
+}
+
+void MyGraphicsView::changeRotation(double rotationChange)
+{
+ rotate(rotationChange);
+ m_rotation += rotationChange;
+}
+
+void MyGraphicsView::undoRotation()
+{
+ rotate(-g_graphicsView->m_rotation);
+ m_rotation = 0.0;
+}
diff --git a/ui/mygraphicsview.h b/ui/mygraphicsview.h
new file mode 100644
index 0000000..11c50b1
--- /dev/null
+++ b/ui/mygraphicsview.h
@@ -0,0 +1,76 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef MYGRAPHICSVIEW_H
+#define MYGRAPHICSVIEW_H
+
+#include <QGraphicsView>
+#include <QPoint>
+#include <QLineF>
+
+class GraphicsViewZoom;
+class DeBruijnNode;
+
+class MyGraphicsView : public QGraphicsView
+{
+ Q_OBJECT
+public:
+ // CREATORS
+ explicit MyGraphicsView(QObject *parent = 0);
+
+ //ACCESSORS
+ double getRotation() const {return m_rotation;}
+
+ //MODIFERS
+ void setRotation(double newRotation);
+ void changeRotation(double rotationChange);
+ void undoRotation();
+
+
+ GraphicsViewZoom * m_zoom;
+ QPoint m_previousPos;
+
+ void setAntialiasing(bool antialiasingOn);
+ bool isPointVisible(QPointF p);
+ QPointF findIntersectionWithViewportBoundary(QLineF line);
+ QLineF findVisiblePartOfLine(QLineF line, bool * success);
+
+protected:
+ void mousePressEvent(QMouseEvent * event);
+ void mouseReleaseEvent(QMouseEvent * event);
+ void mouseMoveEvent(QMouseEvent * event);
+ void keyPressEvent(QKeyEvent * event);
+ void mouseDoubleClickEvent(QMouseEvent * event);
+
+private:
+ double m_rotation;
+
+ double distance(double x1, double y1, double x2, double y2);
+ double angleBetweenTwoLines(QPointF line1Start, QPointF line1End, QPointF line2Start, QPointF line2End);
+ void getFourViewportCornersInSceneCoordinates(QPointF * c1, QPointF * c2, QPointF * c3, QPointF * c4);
+ bool differentSidesOfLine(QPointF p1, QPointF p2, QLineF line);
+ bool differentSidesOfLine(QPointF p1, QPointF p2, QPointF p3, QPointF p4, QLineF line);
+ bool sideOfLine(QPointF p, QLineF line);
+
+signals:
+ void doubleClickedNode(DeBruijnNode * node);
+ void copySelectedSequencesToClipboard();
+ void saveSelectedSequencesToFile();
+};
+
+#endif // MYGRAPHICSVIEW_H
diff --git a/ui/myprogressdialog.cpp b/ui/myprogressdialog.cpp
new file mode 100644
index 0000000..1084cd9
--- /dev/null
+++ b/ui/myprogressdialog.cpp
@@ -0,0 +1,73 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "myprogressdialog.h"
+#include "ui_myprogressdialog.h"
+#include "../program/globals.h"
+
+MyProgressDialog::MyProgressDialog(QWidget * parent, QString message, bool showCancelButton,
+ QString cancelButtonText, QString cancelMessage, QString cancelInfoText) :
+ QDialog(parent),
+ ui(new Ui::MyProgressDialog),
+ m_cancelMessage(cancelMessage),
+ m_cancelled(false)
+{
+ setWindowFlags(Qt::Dialog | Qt::FramelessWindowHint);
+
+ ui->setupUi(this);
+ QFont font;
+ QFont largeFont;
+ largeFont.setPointSize(font.pointSize() * 2);
+ ui->messageLabel->setText(message);
+ ui->messageLabel->setFont(largeFont);
+
+ ui->cancelWidget->setVisible(showCancelButton);
+ ui->cancelButton->setText(cancelButtonText);
+
+ setFixedHeight(sizeHint().height());
+ setFixedWidth(sizeHint().width() * 1.2);
+
+ ui->cancelInfoText->setInfoText(cancelInfoText);
+
+ connect(ui->cancelButton, SIGNAL(clicked()), this, SLOT(cancel()));
+}
+
+MyProgressDialog::~MyProgressDialog()
+{
+ delete ui;
+}
+
+
+void MyProgressDialog::cancel()
+{
+ ui->messageLabel->setText(m_cancelMessage);
+ ui->cancelButton->setEnabled(false);
+ m_cancelled = true;
+ emit halt();
+}
+
+
+void MyProgressDialog::setMaxValue(int max)
+{
+ ui->progressBar->setMaximum(max);
+}
+
+void MyProgressDialog::setValue(int value)
+{
+ ui->progressBar->setValue(value);
+}
diff --git a/ui/myprogressdialog.h b/ui/myprogressdialog.h
new file mode 100644
index 0000000..bb91a54
--- /dev/null
+++ b/ui/myprogressdialog.h
@@ -0,0 +1,58 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef MYPROGRESSDIALOG_H
+#define MYPROGRESSDIALOG_H
+
+#include <QDialog>
+#include <QString>
+
+namespace Ui {
+class MyProgressDialog;
+}
+
+class MyProgressDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ //CREATORS
+ explicit MyProgressDialog(QWidget * parent, QString message, bool showCancelButton,
+ QString cancelButtonText = "", QString cancelMessage = "", QString cancelInfoText = "");
+ ~MyProgressDialog();
+
+ //ACCESSORS
+ bool wasCancelled() const {return m_cancelled;}
+
+public slots:
+ void setMaxValue(int max);
+ void setValue(int value);
+
+private:
+ Ui::MyProgressDialog *ui;
+ QString m_cancelMessage;
+ bool m_cancelled;
+
+private slots:
+ void cancel();
+
+signals:
+ void halt();
+};
+
+#endif // MYPROGRESSDIALOG_H
diff --git a/ui/myprogressdialog.ui b/ui/myprogressdialog.ui
new file mode 100644
index 0000000..a6e7fa8
--- /dev/null
+++ b/ui/myprogressdialog.ui
@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MyProgressDialog</class>
+ <widget class="QDialog" name="MyProgressDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>269</width>
+ <height>129</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string/>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QLabel" name="messageLabel">
+ <property name="text">
+ <string>Progress message...</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QProgressBar" name="progressBar">
+ <property name="maximum">
+ <number>0</number>
+ </property>
+ <property name="value">
+ <number>0</number>
+ </property>
+ <property name="textVisible">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="cancelWidget" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>51</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="InfoTextWidget" name="cancelInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="cancelButton">
+ <property name="text">
+ <string>Cancel</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>50</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>InfoTextWidget</class>
+ <extends>QWidget</extends>
+ <header>infotextwidget.h</header>
+ <container>1</container>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/ui/mytablewidget.cpp b/ui/mytablewidget.cpp
new file mode 100644
index 0000000..9daa58f
--- /dev/null
+++ b/ui/mytablewidget.cpp
@@ -0,0 +1,128 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "mytablewidget.h"
+
+#include <vector>
+#include <QHeaderView>
+#include <QScrollBar>
+#include <QKeyEvent>
+#include <QApplication>
+#include <QClipboard>
+
+MyTableWidget::MyTableWidget(QWidget * parent) :
+ QTableWidget(parent), m_smallFirstColumn(false), m_smallSecondColumn(false)
+{
+ verticalHeader()->hide();
+ horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);
+ horizontalHeader()->setDefaultAlignment(Qt::AlignLeft);
+}
+
+
+void MyTableWidget::resizeColumns()
+{
+ //If sorting is enabled, the columns are given way too much space.
+ setSortingEnabled(false);
+ resizeColumnsToContents();
+ setSortingEnabled(true);
+
+ //For some table widgets, we set the first column to a minimum size, as it
+ //will hold the colour for both queries and hits.
+ int minColumnWidth = horizontalHeader()->minimumSectionSize();
+ if (m_smallFirstColumn)
+ horizontalHeader()->resizeSection(0, minColumnWidth);
+
+ std::vector<int> columnWidths;
+ int oldTotalColumnWidth = 0;
+ for (int i = 0; i < columnCount(); ++i)
+ {
+ int columnWidth = horizontalHeader()->sectionSize(i);
+ columnWidths.push_back(columnWidth);
+ oldTotalColumnWidth += columnWidth;
+ }
+
+ //If the total column width exceeds the size of the table, just leave things alone.
+ int tableWidth = viewport()->width();
+ if (oldTotalColumnWidth > tableWidth)
+ return;
+
+ //If the code got here, then there is width to spare in the table. Resize each column
+ //(except for the first) to take up the whole width, keeping their relative size.
+
+ int newTotalColumnWidth = 0.0;
+ int startingColumn = 0;
+ if (m_smallFirstColumn)
+ {
+ startingColumn = 1;
+ newTotalColumnWidth += horizontalHeader()->sectionSize(0);
+ }
+ if (m_smallSecondColumn)
+ {
+ startingColumn = 2;
+ newTotalColumnWidth += horizontalHeader()->sectionSize(1);
+ }
+
+ for (int i = startingColumn; i < columnCount() - 1; ++i)
+ {
+ int oldColumnWidth = columnWidths[i];
+ double fraction = double(oldColumnWidth) / oldTotalColumnWidth;
+ int newColumnWidth = fraction * tableWidth;
+ newTotalColumnWidth += newColumnWidth;
+ horizontalHeader()->resizeSection(i, newColumnWidth);
+ }
+ int lastColumnWidth = tableWidth - newTotalColumnWidth;
+ horizontalHeader()->resizeSection(columnCount() - 1, lastColumnWidth);
+}
+
+
+void MyTableWidget::showEvent(QShowEvent * event)
+{
+ QTableWidget::showEvent(event);
+ resizeColumns();
+}
+
+
+
+//http://stackoverflow.com/questions/3135737/copying-part-of-qtableview
+void MyTableWidget::keyPressEvent(QKeyEvent* event)
+{
+ //If Ctrl-C typed (Command-C on Mac)
+ if (event->key() == Qt::Key_C && (event->modifiers() & Qt::ControlModifier))
+ {
+ QModelIndexList cells = selectedIndexes();
+ qSort(cells); // Necessary, otherwise they are in column order
+
+ QString text;
+ int currentRow = 0; // To determine when to insert newlines
+ foreach (const QModelIndex& cell, cells) {
+ if (text.length() == 0) {
+ // First item
+ } else if (cell.row() != currentRow) {
+ // New row
+ text += '\n';
+ } else {
+ // Next cell
+ text += '\t';
+ }
+ currentRow = cell.row();
+ text += cell.data().toString();
+ }
+
+ QApplication::clipboard()->setText(text);
+ }
+}
diff --git a/ui/mytablewidget.h b/ui/mytablewidget.h
new file mode 100644
index 0000000..ec52f12
--- /dev/null
+++ b/ui/mytablewidget.h
@@ -0,0 +1,41 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef MYTABLEWIDGET_H
+#define MYTABLEWIDGET_H
+
+#include <QTableWidget>
+
+
+class MyTableWidget : public QTableWidget
+{
+ Q_OBJECT
+public:
+ explicit MyTableWidget(QWidget *parent = 0);
+
+ void resizeColumns();
+ bool m_smallFirstColumn;
+ bool m_smallSecondColumn;
+
+protected:
+ void showEvent(QShowEvent * event);
+ void keyPressEvent(QKeyEvent* event);
+
+};
+
+#endif // MYTABLEWIDGET_H
diff --git a/ui/nodewidthvisualaid.cpp b/ui/nodewidthvisualaid.cpp
new file mode 100644
index 0000000..3de11f4
--- /dev/null
+++ b/ui/nodewidthvisualaid.cpp
@@ -0,0 +1,82 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "nodewidthvisualaid.h"
+#include <QPainter>
+#include <QSizePolicy>
+#include "../graph/graphicsitemnode.h"
+
+NodeWidthVisualAid::NodeWidthVisualAid(QWidget *parent) : QWidget(parent)
+{
+ QSizePolicy policy = sizePolicy();
+ policy.setHeightForWidth(true);
+ setSizePolicy(policy);
+}
+
+NodeWidthVisualAid::~NodeWidthVisualAid()
+{
+
+}
+
+void NodeWidthVisualAid::paintEvent(QPaintEvent * /*event*/)
+{
+ QPainter painter(this);
+ painter.fillRect(0, 0, width(), height(), QBrush(Qt::white));
+
+ QPen gridLinePen(QBrush(QColor(50,50,50)), 0.5);
+ painter.setPen(gridLinePen);
+
+
+ painter.drawLine(0, height() * 0.5, width(), height() * 0.5);
+ painter.drawLine(0, height() - 1, width(), height() - 1);
+ painter.drawLine(width() * 0.0, 0, width() * 0.0, height());
+ painter.drawLine(width() * 0.5, 0, width() * 0.5, height());
+
+ gridLinePen = QPen(QBrush(Qt::gray), 0.5);
+ painter.setPen(gridLinePen);
+
+ painter.drawLine(0, height() * 0.125, width(), height() * 0.125);
+ painter.drawLine(0, height() * 0.25, width(), height() * 0.25);
+ painter.drawLine(0, height() * 0.375, width(), height() * 0.375);
+ painter.drawLine(0, height() * 0.625, width(), height() * 0.625);
+ painter.drawLine(0, height() * 0.75, width(), height() * 0.75);
+ painter.drawLine(0, height() * 0.875, width(), height() * 0.875);
+ painter.drawLine(width() * 0.125, 0, width() * 0.125, height());
+ painter.drawLine(width() * 0.25, 0, width() * 0.25, height());
+ painter.drawLine(width() * 0.375, 0, width() * 0.375, height());
+ painter.drawLine(width() * 0.625, 0, width() * 0.625, height());
+ painter.drawLine(width() * 0.75, 0, width() * 0.75, height());
+ painter.drawLine(width() * 0.875, 0, width() * 0.875, height());
+
+ painter.setRenderHint(QPainter::Antialiasing, true);
+
+ QPainterPath graphLine;
+ graphLine.moveTo(0.0, height() - GraphicsItemNode::getNodeWidth(0.0, m_depthPower, m_depthEffectOnWidth, width() / 2.0));
+
+ for (int i = 0; i < width(); ++i)
+ {
+ double x = double(i);
+ double depthRelativeToMeanDrawnDepth = 2.0 * x / width();
+ double y = height() -GraphicsItemNode::getNodeWidth(depthRelativeToMeanDrawnDepth, m_depthPower, m_depthEffectOnWidth, width() / 2.0);
+ graphLine.lineTo(x, y);
+ }
+
+ QPen waterLinePen(QBrush(Qt::blue), 2.0);
+ painter.setPen(waterLinePen);
+ painter.drawPath(graphLine);
+}
diff --git a/ui/nodewidthvisualaid.h b/ui/nodewidthvisualaid.h
new file mode 100644
index 0000000..9a99648
--- /dev/null
+++ b/ui/nodewidthvisualaid.h
@@ -0,0 +1,44 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef NODEWIDTHVISUALAID_H
+#define NODEWIDTHVISUALAID_H
+
+#include <QWidget>
+
+class NodeWidthVisualAid : public QWidget
+{
+ Q_OBJECT
+public:
+ explicit NodeWidthVisualAid(QWidget *parent = 0);
+ ~NodeWidthVisualAid();
+
+ int heightForWidth(int w ) const {return w;}
+
+ double m_depthPower;
+ double m_depthEffectOnWidth;
+
+protected:
+ void paintEvent(QPaintEvent *);
+
+signals:
+
+public slots:
+};
+
+#endif // NODEWIDTHVISUALAID_H
diff --git a/ui/pathspecifydialog.cpp b/ui/pathspecifydialog.cpp
new file mode 100644
index 0000000..c67f51e
--- /dev/null
+++ b/ui/pathspecifydialog.cpp
@@ -0,0 +1,178 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "pathspecifydialog.h"
+#include "ui_pathspecifydialog.h"
+#include "../program/globals.h"
+#include "../program/settings.h"
+#include "../graph/assemblygraph.h"
+#include <QClipboard>
+#include <QTextStream>
+#include <QFileDialog>
+#include <QFileInfo>
+#include "mygraphicsview.h"
+#include "../program/memory.h"
+
+PathSpecifyDialog::PathSpecifyDialog(QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::PathSpecifyDialog)
+{
+ ui->setupUi(this);
+ setWindowFlags(windowFlags() | Qt::Tool);
+
+ ui->pathTextEdit->setPlainText(g_memory->userSpecifiedPathString);
+ ui->circularPathCheckBox->setChecked(g_memory->userSpecifiedPathCircular);
+ g_memory->pathDialogIsVisible = true;
+ checkPathValidity();
+
+ ui->circularPathInfoText->setInfoText("Tick this box to indicate that the path is circular, i.e. there is an edge connecting the "
+ "last node in the list to the first.<br><br>"
+ "Circular paths must contain the entirety of their nodes and therefore cannot contain "
+ "start/end positions.");
+
+ connect(ui->pathTextEdit, SIGNAL(textChanged()), this, SLOT(checkPathValidity()));
+ connect(ui->pathTextEdit, SIGNAL(textChanged()), g_graphicsView->viewport(), SLOT(update()));
+ connect(ui->circularPathCheckBox, SIGNAL(toggled(bool)), this, SLOT(checkPathValidity()));
+ connect(ui->circularPathCheckBox, SIGNAL(toggled(bool)), g_graphicsView->viewport(), SLOT(update()));
+ connect(ui->copyButton, SIGNAL(clicked(bool)), this, SLOT(copyPathToClipboard()));
+ connect(ui->saveButton, SIGNAL(clicked(bool)), this, SLOT(savePathToFile()));
+ connect(this, SIGNAL(rejected()), this, SLOT(deleteLater()));
+}
+
+
+PathSpecifyDialog::~PathSpecifyDialog()
+{
+ g_memory->pathDialogIsVisible = false;
+ delete ui;
+}
+
+
+
+void PathSpecifyDialog::checkPathValidity()
+{
+ g_memory->userSpecifiedPathString = ui->pathTextEdit->toPlainText();
+ g_memory->userSpecifiedPathCircular = ui->circularPathCheckBox->isChecked();
+ g_memory->userSpecifiedPath = Path();
+
+ //Clear out the Path object. If the string makes a valid path,
+ //it will be rebuilt.
+ g_memory->userSpecifiedPath = Path();
+
+ //If there is no graph loaded, then no path can be valid.
+ if (g_assemblyGraph->m_deBruijnGraphNodes.size() == 0)
+ {
+ ui->validPathLabel->setText("Invalid path: no graph is currently loaded");
+ setPathValidityUiElements(false);
+ return;
+ }
+
+ //Create a path from the user-supplied string.
+ QString pathStringFailure;
+ QString pathText = ui->pathTextEdit->toPlainText().simplified();
+ g_memory->userSpecifiedPath = Path::makeFromString(pathText,
+ ui->circularPathCheckBox->isChecked(),
+ &pathStringFailure);
+
+ //If the Path turned out to be empty, that means that makeFromString failed.
+ if (g_memory->userSpecifiedPath.isEmpty())
+ {
+ if (pathText == "")
+ ui->validPathLabel->setText("No path specified");
+ else
+ ui->validPathLabel->setText("Invalid path: " + pathStringFailure);
+
+ setPathValidityUiElements(false);
+ }
+
+ //If the Path isn't empty, then we have succeeded!
+ else
+ {
+ int pathLength = g_memory->userSpecifiedPath.getLength();
+ ui->validPathLabel->setText("Valid path: " + formatIntForDisplay(pathLength) + " bp");
+ setPathValidityUiElements(true);
+ }
+}
+
+
+void PathSpecifyDialog::setPathValidityUiElements(bool pathValid)
+{
+ QPixmap tickCross;
+ if (pathValid)
+ tickCross = QPixmap(":/icons/tick-128.png");
+ else
+ tickCross = QPixmap(":/icons/cross-128.png");
+ tickCross.setDevicePixelRatio(devicePixelRatio()); //This is a workaround for a Qt bug. Can possibly remove in the future. https://bugreports.qt.io/browse/QTBUG-46846
+ ui->tickCrossLabel->setPixmap(tickCross);
+
+ ui->copyButton->setEnabled(pathValid);
+ ui->saveButton->setEnabled(pathValid);
+}
+
+
+void PathSpecifyDialog::copyPathToClipboard()
+{
+ QClipboard * clipboard = QApplication::clipboard();
+ clipboard->setText(g_memory->userSpecifiedPath.getPathSequence());
+}
+
+
+
+void PathSpecifyDialog::savePathToFile()
+{
+ QString defaultFileNameAndPath = g_memory->rememberedPath + "/path_sequence.fasta";
+ QString fullFileName = QFileDialog::getSaveFileName(this, "Save path sequence", defaultFileNameAndPath, "FASTA (*.fasta)");
+
+ if (fullFileName != "") //User did not hit cancel
+ {
+ QFile file(fullFileName);
+ file.open(QIODevice::WriteOnly | QIODevice::Text);
+ QTextStream out(&file);
+ out << g_memory->userSpecifiedPath.getFasta();
+ g_memory->rememberedPath = QFileInfo(fullFileName).absolutePath();
+ }
+}
+
+
+void PathSpecifyDialog::addNodeName(DeBruijnNode * node)
+{
+ QString pathText = ui->pathTextEdit->toPlainText();
+
+ //If the node fits on the end of the path add it there.
+ Path extendedPath = g_memory->userSpecifiedPath;
+ if (g_memory->userSpecifiedPath.canNodeFitOnEnd(node, &extendedPath))
+ pathText = extendedPath.getString(true);
+
+ //If not, try the front of the path.
+ else if (g_memory->userSpecifiedPath.canNodeFitAtStart(node, &extendedPath))
+ pathText = extendedPath.getString(true);
+
+ //If neither of these work, try the reverse complement, first
+ //at the end and then at the front.
+ //But only do this if we are in single mode.
+ else if (!g_settings->doubleMode &&
+ g_memory->userSpecifiedPath.canNodeFitOnEnd(node->getReverseComplement(), &extendedPath))
+ pathText = extendedPath.getString(true);
+ else if (!g_settings->doubleMode &&
+ g_memory->userSpecifiedPath.canNodeFitAtStart(node->getReverseComplement(), &extendedPath))
+ pathText = extendedPath.getString(true);
+
+ //If all of the above failed, we do nothing. I.e. if the node cannot be
+ //added to the path, it isn't added to the text.
+
+ ui->pathTextEdit->setPlainText(pathText);
+}
diff --git a/ui/pathspecifydialog.h b/ui/pathspecifydialog.h
new file mode 100644
index 0000000..3c6598e
--- /dev/null
+++ b/ui/pathspecifydialog.h
@@ -0,0 +1,51 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef PATHSPECIFYDIALOG_H
+#define PATHSPECIFYDIALOG_H
+
+#include <QDialog>
+#include "../graph/path.h"
+#include "../graph/debruijnnode.h"
+
+namespace Ui {
+class PathSpecifyDialog;
+}
+
+class PathSpecifyDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit PathSpecifyDialog(QWidget *parent = 0);
+ ~PathSpecifyDialog();
+
+public slots:
+ void addNodeName(DeBruijnNode * node);
+
+private:
+ Ui::PathSpecifyDialog *ui;
+ void setPathValidityUiElements(bool pathValid);
+
+private slots:
+ void checkPathValidity();
+ void copyPathToClipboard();
+ void savePathToFile();
+};
+
+#endif // PATHSPECIFYDIALOG_H
diff --git a/ui/pathspecifydialog.ui b/ui/pathspecifydialog.ui
new file mode 100644
index 0000000..9b9f8f5
--- /dev/null
+++ b/ui/pathspecifydialog.ui
@@ -0,0 +1,212 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PathSpecifyDialog</class>
+ <widget class="QDialog" name="PathSpecifyDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>464</width>
+ <height>476</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Specify exact path</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0" colspan="2">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Define a path by providing an ordered list of exact nodes, with their directionality, separated by commas. You can optionally specify a start position for the first node and/or an end position for the last node by enclosing a number in parentheses at the beginning and/or end.
+
+Example without start/end positions: 5+, 6-, 41+
+Example with start/end positions: (3039) 5+, 6-, 41+ (1023)
+
+Double clicking on a node in the graph will add it to the path, if possible. As directionality is important, it may be helpful to do this when the graph is drawn in double mode.</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2">
+ <widget class="QPlainTextEdit" name="pathTextEdit"/>
+ </item>
+ <item row="5" column="0">
+ <widget class="QPushButton" name="copyButton">
+ <property name="text">
+ <string>Copy to clipboard</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0" colspan="2">
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Close</set>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1">
+ <widget class="QPushButton" name="saveButton">
+ <property name="text">
+ <string>Save to file</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0" colspan="2">
+ <widget class="QWidget" name="widget" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="tickCrossLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="maximumSize">
+ <size>
+ <width>32</width>
+ <height>32</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ <property name="pixmap">
+ <pixmap resource="../images/images.qrc">:/icons/cross-128.png</pixmap>
+ </property>
+ <property name="scaledContents">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="validPathLabel">
+ <property name="text">
+ <string>Path is invalid</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2">
+ <widget class="QWidget" name="circularPathWidget" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="InfoTextWidget" name="circularPathInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="circularPathCheckBox">
+ <property name="text">
+ <string>Circular path</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>InfoTextWidget</class>
+ <extends>QWidget</extends>
+ <header>infotextwidget.h</header>
+ <container>1</container>
+ </customwidget>
+ </customwidgets>
+ <tabstops>
+ <tabstop>circularPathCheckBox</tabstop>
+ <tabstop>pathTextEdit</tabstop>
+ <tabstop>copyButton</tabstop>
+ <tabstop>saveButton</tabstop>
+ </tabstops>
+ <resources>
+ <include location="../images/images.qrc"/>
+ </resources>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>PathSpecifyDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>PathSpecifyDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/ui/querypathsdialog.cpp b/ui/querypathsdialog.cpp
new file mode 100644
index 0000000..5f704c8
--- /dev/null
+++ b/ui/querypathsdialog.cpp
@@ -0,0 +1,232 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage.
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "querypathsdialog.h"
+#include "ui_querypathsdialog.h"
+
+#include "../blast/blastquery.h"
+#include "../blast/blastquerypath.h"
+#include "tablewidgetitemint.h"
+#include "tablewidgetitemdouble.h"
+#include "../program/globals.h"
+#include "../program/memory.h"
+#include <QTableWidgetItem>
+#include "querypathsequencecopybutton.h"
+
+QueryPathsDialog::QueryPathsDialog(QWidget * parent, BlastQuery * query) :
+ QDialog(parent),
+ ui(new Ui::QueryPathsDialog)
+{
+ ui->setupUi(this);
+ setWindowFlags(windowFlags() | Qt::Tool);
+
+ connect(this, SIGNAL(rejected()), this, SLOT(hidden()));
+ connect(ui->tableWidget, SIGNAL(itemSelectionChanged()), this, SLOT(tableSelectionChanged()));
+
+ g_memory->queryPathDialogIsVisible = true;
+ g_memory->queryPaths.clear();
+
+ ui->tableWidget->setHorizontalHeaderLabels(QStringList() << "Path" << "Length\n(bp)" << "Query\ncovered\nby path" <<
+ "Query\ncovered\nby hits" << "Mean hit\nidentity" << "Total\nhit mis-\nmatches" <<
+ "Total\nhit gap\nopens" << "Relative\nlength" << "Length\ndiscre-\npancy" <<
+ "E-value\nproduct" << "Copy sequence\nto clipboard");
+
+ QString queryDescription = "Query name: " + query->getName();
+ queryDescription += " type: " + query->getTypeString();
+ queryDescription += " length: " + formatIntForDisplay(query->getLength());
+ if (query->getSequenceType() == PROTEIN)
+ queryDescription += " (" + formatIntForDisplay(3 * query->getLength()) + " bp)";
+ else
+ queryDescription += " bp";
+ ui->queryLabel->setText(queryDescription);
+
+ ui->tableWidget->clearContents();
+ ui->tableWidget->setSortingEnabled(false);
+
+ int pathCount = query->getPathCount();
+ ui->tableWidget->setRowCount(pathCount);
+
+ if (pathCount == 0)
+ return;
+
+ QList<BlastQueryPath> paths = query->getPaths();
+
+ for (int i = 0; i < pathCount; ++i)
+ {
+ BlastQueryPath * queryPath = &paths[i];
+
+ QTableWidgetItem * pathString = new QTableWidgetItem(queryPath->getPath().getString(true));
+ pathString->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+
+ int length = queryPath->getPath().getLength();
+ TableWidgetItemInt * pathLength = new TableWidgetItemInt(formatIntForDisplay(length), length);
+ pathLength->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+
+ double queryCoveragePath = queryPath->getPathQueryCoverage();
+ TableWidgetItemDouble * pathQueryCoveragePath = new TableWidgetItemDouble(formatDoubleForDisplay(100.0 * queryCoveragePath, 2) + "%", queryCoveragePath);
+ pathQueryCoveragePath->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+ pathLength->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+
+ double queryCoverageHits = queryPath->getHitsQueryCoverage();
+ TableWidgetItemDouble * pathQueryCoverageHits = new TableWidgetItemDouble(formatDoubleForDisplay(100.0 * queryCoverageHits, 2) + "%", queryCoverageHits);
+ pathQueryCoverageHits->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+
+ double percIdentity = queryPath->getMeanHitPercIdentity();
+ TableWidgetItemDouble * pathPercIdentity = new TableWidgetItemDouble(formatDoubleForDisplay(percIdentity, 2) + "%", percIdentity);
+ pathPercIdentity->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+
+ int mismatches = queryPath->getTotalHitMismatches();
+ TableWidgetItemInt * pathMismatches = new TableWidgetItemInt(formatIntForDisplay(mismatches), mismatches);
+ pathMismatches->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+
+ int gapOpens = queryPath->getTotalHitGapOpens();
+ TableWidgetItemInt * pathGapOpens = new TableWidgetItemInt(formatIntForDisplay(gapOpens), gapOpens);
+ pathGapOpens->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+
+ double relativeLength = queryPath->getRelativePathLength();
+ TableWidgetItemDouble * pathRelativeLength = new TableWidgetItemDouble(formatDoubleForDisplay(100.0 * relativeLength, 2) + "%", relativeLength);
+ pathRelativeLength->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+
+ int lengthDisc = queryPath->getAbsolutePathLengthDifference();
+ QString lengthDiscString = queryPath->getAbsolutePathLengthDifferenceString(true);
+ TableWidgetItemInt * pathLengthDisc = new TableWidgetItemInt(lengthDiscString, lengthDisc);
+ pathLengthDisc->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+
+ SciNot evalueProduct = queryPath->getEvalueProduct();
+ TableWidgetItemDouble * pathEvalueProduct = new TableWidgetItemDouble(evalueProduct.asString(false), evalueProduct.toDouble());
+ pathEvalueProduct->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
+
+ QByteArray pathSequence = queryPath->getPath().getPathSequence();
+ QString pathStart;
+ if (pathSequence.length() <= 8)
+ pathStart = pathSequence;
+ else
+ pathStart = pathSequence.left(8) + "...";
+
+ QTableWidgetItem * sequenceCopy = new QTableWidgetItem(pathStart);
+ QueryPathSequenceCopyButton * sequenceCopyButton = new QueryPathSequenceCopyButton(pathSequence, pathStart);
+
+ ui->tableWidget->setItem(i, 0, pathString);
+ ui->tableWidget->setItem(i, 1, pathLength);
+ ui->tableWidget->setItem(i, 2, pathQueryCoveragePath);
+ ui->tableWidget->setItem(i, 3, pathQueryCoverageHits);
+ ui->tableWidget->setItem(i, 4, pathPercIdentity);
+ ui->tableWidget->setItem(i, 5, pathMismatches);
+ ui->tableWidget->setItem(i, 6, pathGapOpens);
+ ui->tableWidget->setItem(i, 7, pathRelativeLength);
+ ui->tableWidget->setItem(i, 8, pathLengthDisc);
+ ui->tableWidget->setItem(i, 9, pathEvalueProduct);
+ ui->tableWidget->setItem(i, 10, sequenceCopy);
+ ui->tableWidget->setCellWidget(i, 10, sequenceCopyButton);
+ }
+
+ ui->tableWidget->resizeColumns();
+ ui->tableWidget->setSortingEnabled(true);
+
+ ui->queryPathsInfoText->setInfoText("This table shows information about the possible paths through the graph which "
+ "represent the query. These paths can be either simple (residing within a single "
+ "node) or complex (spanning multiple nodes). The columns in the table are as "
+ "follows:"
+ "<br><br>"
+ "<b>Path</b>: This is the query path through the graph, as written in Bandage's "
+ "path notation. The nodes in the path are separated by commas. The start position "
+ "in the first node is shown in parentheses at the beginning of the path. The end "
+ "position in the last node is shown in parentheses at the end of the path."
+ "<br><br>"
+ "<b>Length</b>: This is the path length. It is shown in base pairs, whether the "
+ "query is a nucleotide query or a protein query."
+ "<br><br>"
+ "<b>Query covered by path</b>: This is the fraction of the query which is covered "
+ "by the path. It is calculated by taking 100% and subtracting the fraction of the "
+ "query which is not captured by the start and the fraction of the query which is "
+ "not captured by the end."
+ "<br><br>"
+ "<b>Query covered by hits</b>: This is the fraction of the query which is covered "
+ "by the BLAST hits in this path. Since a path may contain nodes or parts of nodes which "
+ "are not covered by BLAST hits, this value will be less than or equal to the 'Query "
+ "covered by path' value."
+ "<br><br>"
+ "<b>Mean hit identity</b>: This is the mean of the percent identity for the BLAST "
+ "hits in this path, weighted by the hits' lengths."
+ "<br><br>"
+ "<b>Total hit mismatches</b>: This is the sum of the mismatches for the BLAST hits "
+ "in this path."
+ "<br><br>"
+ "<b>Total hit gap opens</b>: This is the sum of the gap opens for the BLAST hits "
+ "in this path."
+ "<br><br>"
+ "<b>Relative length</b>: This is the length of the path compared to the length for "
+ "the relevant fraction of the query. A value over 100% indicates that the path is "
+ "too long; a value under 100% value indicates that the path is too short."
+ "<br><br>"
+ "<b>Length discrepancy</b>: This is the difference in the path length and "
+ "the length for the relevant fraction of the query. A positive value "
+ "indicates that the path is too long; a negative value indicates that the path is "
+ "too short."
+ "<br><br>"
+ "<b>E-value product</b>: This is the product of the e-values for the BLAST hits "
+ "in this path.");
+}
+
+QueryPathsDialog::~QueryPathsDialog()
+{
+ delete ui;
+ g_memory->queryPathDialogIsVisible = false;
+}
+
+
+void QueryPathsDialog::hidden()
+{
+ g_memory->queryPathDialogIsVisible = false;
+ emit selectionChanged();
+}
+
+
+void QueryPathsDialog::tableSelectionChanged()
+{
+ QList<QTableWidgetSelectionRange> selection = ui->tableWidget->selectedRanges();
+ int totalSelectedRows = 0;
+ for (int i = 0; i < selection.size(); ++i)
+ totalSelectedRows += selection[i].rowCount();
+
+ g_memory->queryPaths.clear();
+
+ QList<int> selectedRows;
+ for (int i = 0; i < selection.size(); ++i)
+ {
+ QTableWidgetSelectionRange * selectionRange = &(selection[i]);
+ int top = selectionRange->topRow();
+ int bottom = selectionRange->bottomRow();
+
+ for (int row = top; row <= bottom; ++row)
+ {
+ if (!selectedRows.contains(row))
+ selectedRows.push_back(row);
+ }
+ }
+
+ for (int i = 0; i < selectedRows.size(); ++i)
+ {
+ int row = selectedRows[i];
+ QString pathString = ui->tableWidget->item(row, 0)->text();
+ QString pathStringFailure;
+ g_memory->queryPaths.push_back(Path::makeFromString(pathString, false, &pathStringFailure));
+ }
+
+ emit selectionChanged();
+}
diff --git a/ui/querypathsdialog.h b/ui/querypathsdialog.h
new file mode 100644
index 0000000..66417e1
--- /dev/null
+++ b/ui/querypathsdialog.h
@@ -0,0 +1,49 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage.
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef QUERYPATHSDIALOG_H
+#define QUERYPATHSDIALOG_H
+
+#include <QDialog>
+
+class BlastQuery;
+
+namespace Ui {
+class QueryPathsDialog;
+}
+
+class QueryPathsDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit QueryPathsDialog(QWidget *parent, BlastQuery * query);
+ ~QueryPathsDialog();
+
+private:
+ Ui::QueryPathsDialog *ui;
+
+private slots:
+ void hidden();
+ void tableSelectionChanged();
+
+signals:
+ void selectionChanged();
+};
+
+#endif // QUERYPATHSDIALOG_H
diff --git a/ui/querypathsdialog.ui b/ui/querypathsdialog.ui
new file mode 100644
index 0000000..bc7c92b
--- /dev/null
+++ b/ui/querypathsdialog.ui
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>QueryPathsDialog</class>
+ <widget class="QDialog" name="QueryPathsDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>1069</width>
+ <height>417</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Query paths</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="1">
+ <widget class="QLabel" name="queryLabel">
+ <property name="text">
+ <string>Query description</string>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="InfoTextWidget" name="queryPathsInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2">
+ <widget class="MyTableWidget" name="tableWidget">
+ <column>
+ <property name="text">
+ <string>Path</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Length (bp)</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Query covered by path</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Query covered by hits</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Identity</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Mismatches</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Gap opens</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Relative length</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Length discrepancy</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>E-value product</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string>Copy sequence to clipboard</string>
+ </property>
+ </column>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2">
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Close</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>InfoTextWidget</class>
+ <extends>QWidget</extends>
+ <header>infotextwidget.h</header>
+ <container>1</container>
+ </customwidget>
+ <customwidget>
+ <class>MyTableWidget</class>
+ <extends>QTableWidget</extends>
+ <header>mytablewidget.h</header>
+ </customwidget>
+ </customwidgets>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>QueryPathsDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>QueryPathsDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/ui/querypathsequencecopybutton.cpp b/ui/querypathsequencecopybutton.cpp
new file mode 100644
index 0000000..4882024
--- /dev/null
+++ b/ui/querypathsequencecopybutton.cpp
@@ -0,0 +1,18 @@
+#include "querypathsequencecopybutton.h"
+
+#include <QApplication>
+#include <QClipboard>
+
+QueryPathSequenceCopyButton::QueryPathSequenceCopyButton(QByteArray pathSequence, QString pathStart) :
+ m_pathSequence(pathSequence)
+{
+ setText(pathStart);
+ connect(this, SIGNAL(clicked(bool)), this, SLOT(copySequenceToClipboard()));
+}
+
+
+void QueryPathSequenceCopyButton::copySequenceToClipboard()
+{
+ QClipboard * clipboard = QApplication::clipboard();
+ clipboard->setText(m_pathSequence);
+}
diff --git a/ui/querypathsequencecopybutton.h b/ui/querypathsequencecopybutton.h
new file mode 100644
index 0000000..b358b0c
--- /dev/null
+++ b/ui/querypathsequencecopybutton.h
@@ -0,0 +1,39 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage.
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef QUERYPATHSEQUENCECOPYBUTTON_H
+#define QUERYPATHSEQUENCECOPYBUTTON_H
+
+#include <QPushButton>
+
+class QueryPathSequenceCopyButton : public QPushButton
+{
+ Q_OBJECT
+
+public:
+ QueryPathSequenceCopyButton(QByteArray pathSequence, QString pathStart);
+
+private:
+ QByteArray m_pathSequence;
+
+private slots:
+ void copySequenceToClipboard();
+
+};
+
+#endif // QUERYPATHSEQUENCECOPYBUTTON_H
diff --git a/ui/querypathspushbutton.cpp b/ui/querypathspushbutton.cpp
new file mode 100644
index 0000000..5789d82
--- /dev/null
+++ b/ui/querypathspushbutton.cpp
@@ -0,0 +1,40 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage.
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "querypathspushbutton.h"
+
+#include "../program/globals.h"
+
+QueryPathsPushButton::QueryPathsPushButton(int pathCount, BlastQuery * query) :
+ m_pathCount(pathCount), m_query(query)
+{
+ setText(formatIntForDisplay(pathCount));
+ if (pathCount == 0)
+ setEnabled(false);
+
+ connect(this, SIGNAL(clicked(bool)), this, SLOT(clickedSlot()));
+}
+
+
+
+
+
+void QueryPathsPushButton::clickedSlot()
+{
+ emit showPathsDialog(m_query);
+}
diff --git a/ui/querypathspushbutton.h b/ui/querypathspushbutton.h
new file mode 100644
index 0000000..31502e7
--- /dev/null
+++ b/ui/querypathspushbutton.h
@@ -0,0 +1,46 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage.
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef QUERYPATHSPUSHBUTTON_H
+#define QUERYPATHSPUSHBUTTON_H
+
+#include <QPushButton>
+
+class BlastQuery;
+
+class QueryPathsPushButton : public QPushButton
+{
+ Q_OBJECT
+
+public:
+ QueryPathsPushButton(int pathCount, BlastQuery * query);
+
+private:
+ int m_pathCount;
+ BlastQuery * m_query;
+
+private slots:
+ void clickedSlot();
+
+signals:
+ void showPathsDialog(BlastQuery *);
+
+
+};
+
+#endif // QUERYPATHSPUSHBUTTON_H
diff --git a/ui/settingsdialog.cpp b/ui/settingsdialog.cpp
new file mode 100644
index 0000000..ed49c47
--- /dev/null
+++ b/ui/settingsdialog.cpp
@@ -0,0 +1,486 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "settingsdialog.h"
+#include "ui_settingsdialog.h"
+#include <QColorDialog>
+#include <QMessageBox>
+#include "../program/settings.h"
+#include "colourbutton.h"
+#include "../graph/assemblygraph.h"
+#include "../program/scinot.h"
+
+SettingsDialog::SettingsDialog(QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::SettingsDialog)
+{
+ ui->setupUi(this);
+ setInfoTexts();
+
+ //On a PC and Linux, this window is called 'Settings', but on the Mac it is
+ //called 'Preferences'.
+ QString windowTitle = "Settings";
+#ifdef Q_OS_MAC
+ windowTitle = "Preferences";
+#endif
+ setWindowTitle(windowTitle);
+
+ ui->edgeColourButton->m_name = "Edge colour";
+ ui->outlineColourButton->m_name = "Outline colour";
+ ui->selectionColourButton->m_name = "Selection colour";
+ ui->textColourButton->m_name = "Text colour";
+ ui->textOutlineColourButton->m_name = "Text outline colour";
+ ui->uniformPositiveNodeColourButton->m_name = "Uniform positive node colour";
+ ui->uniformNegativeNodeColourButton->m_name = "Uniform negative node colour";
+ ui->uniformNodeSpecialColourButton->m_name = "Uniform special node colour";
+ ui->lowDepthColourButton->m_name = "Low depth colour";
+ ui->highDepthColourButton->m_name = "High depth colour";
+ ui->noBlastHitsColourButton->m_name = "No BLAST hits colour";
+ ui->contiguousStrandSpecificColourButton->m_name = "Contiguous (strand-specific) colour";
+ ui->contiguousEitherStrandColourButton->m_name = "Contiguous (either strand) colour";
+ ui->maybeContiguousColourButton->m_name = "Maybe contiguous colour";
+ ui->notContiguousColourButton->m_name = "Not contiguous colour";
+ ui->contiguityStartingColourButton->m_name = "Contiguity starting colour";
+
+ connect(ui->restoreDefaultsButton, SIGNAL(clicked()), this, SLOT(restoreDefaults()));
+ connect(ui->depthValueManualRadioButton, SIGNAL(toggled(bool)), this, SLOT(enableDisableDepthWidgets()));
+ connect(ui->nodeLengthPerMegabaseManualRadioButton, SIGNAL(toggled(bool)), this, SLOT(nodeLengthPerMegabaseManualChanged()));
+ connect(ui->depthPowerSpinBox, SIGNAL(valueChanged(double)), this, SLOT(updateNodeWidthVisualAid()));
+ connect(ui->depthEffectOnWidthSpinBox, SIGNAL(valueChanged(double)), this, SLOT(updateNodeWidthVisualAid()));
+ connect(ui->randomColourPositiveOpacitySpinBox, SIGNAL(valueChanged(int)), this, SLOT(colourSpinBoxChanged()));
+ connect(ui->randomColourNegativeOpacitySpinBox, SIGNAL(valueChanged(int)), this, SLOT(colourSpinBoxChanged()));
+ connect(ui->randomColourPositiveSaturationSpinBox, SIGNAL(valueChanged(int)), this, SLOT(colourSpinBoxChanged()));
+ connect(ui->randomColourNegativeSaturationSpinBox, SIGNAL(valueChanged(int)), this, SLOT(colourSpinBoxChanged()));
+ connect(ui->randomColourPositiveLightnessSpinBox, SIGNAL(valueChanged(int)), this, SLOT(colourSpinBoxChanged()));
+ connect(ui->randomColourNegativeLightnessSpinBox, SIGNAL(valueChanged(int)), this, SLOT(colourSpinBoxChanged()));
+ connect(ui->randomColourPositiveOpacitySlider, SIGNAL(valueChanged(int)), this, SLOT(colourSliderChanged()));
+ connect(ui->randomColourNegativeOpacitySlider, SIGNAL(valueChanged(int)), this, SLOT(colourSliderChanged()));
+ connect(ui->randomColourPositiveSaturationSlider, SIGNAL(valueChanged(int)), this, SLOT(colourSliderChanged()));
+ connect(ui->randomColourNegativeSaturationSlider, SIGNAL(valueChanged(int)), this, SLOT(colourSliderChanged()));
+ connect(ui->randomColourPositiveLightnessSlider, SIGNAL(valueChanged(int)), this, SLOT(colourSliderChanged()));
+ connect(ui->randomColourNegativeLightnessSlider, SIGNAL(valueChanged(int)), this, SLOT(colourSliderChanged()));
+ connect(ui->minQueryCoveredByHitsCheckBox, SIGNAL(toggled(bool)), this, SLOT(checkBoxesChanged()));
+ connect(ui->minMeanHitIdentityCheckBox, SIGNAL(toggled(bool)), this, SLOT(checkBoxesChanged()));
+ connect(ui->maxEValueProductCheckBox, SIGNAL(toggled(bool)), this, SLOT(checkBoxesChanged()));
+ connect(ui->minLengthPercentageCheckBox, SIGNAL(toggled(bool)), this, SLOT(checkBoxesChanged()));
+ connect(ui->maxLengthPercentageCheckBox, SIGNAL(toggled(bool)), this, SLOT(checkBoxesChanged()));
+ connect(ui->minLengthBaseDiscrepancyCheckBox, SIGNAL(toggled(bool)), this, SLOT(checkBoxesChanged()));
+ connect(ui->maxLengthBaseDiscrepancyCheckBox, SIGNAL(toggled(bool)), this, SLOT(checkBoxesChanged()));
+ connect(ui->minLengthBaseDiscrepancySpinBox, SIGNAL(valueChanged(int)), this, SLOT(lengthDiscrepancySpinBoxChanged()));
+ connect(ui->maxLengthBaseDiscrepancySpinBox, SIGNAL(valueChanged(int)), this, SLOT(lengthDiscrepancySpinBoxChanged()));
+}
+
+SettingsDialog::~SettingsDialog()
+{
+ delete ui;
+}
+
+
+//These functions either set a widget to a value or set the value to the widget. Pointers to
+//these functions will be passed to loadOrSaveSettingsToOrFromWidgets, so that one function can
+//take care of both save and load functionality.
+void setOneSettingFromWidget(FloatSetting * setting, QDoubleSpinBox * spinBox, bool percentage) {setting->val = spinBox->value() / (percentage ? 100.0 : 1.0);}
+void setOneSettingFromWidget(IntSetting * setting, QSpinBox * spinBox) {setting->val = spinBox->value();}
+void setOneSettingFromWidget(QColor * setting, ColourButton * button) {*setting = button->m_colour;}
+void setOneSettingFromWidget(SciNotSetting * setting, QDoubleSpinBox * coefficientSpinBox, QSpinBox * exponentSpinBox) {setting->val = SciNot(coefficientSpinBox->value(), exponentSpinBox->value());}
+void setOneSettingFromWidget(bool * setting, QCheckBox * checkBox) {*setting = checkBox->isChecked();}
+void setOneWidgetFromSetting(QColor * setting, ColourButton * button) {button->setColour(*setting);}
+void setOneWidgetFromSetting(bool * setting, QCheckBox * checkBox) {checkBox->setChecked(*setting);}
+void setOneWidgetFromSetting(FloatSetting * setting, QDoubleSpinBox * spinBox, bool percentage)
+{
+ spinBox->setMinimum(setting->min * (percentage ? 100.0 : 1.0));
+ spinBox->setMaximum(setting->max * (percentage ? 100.0 : 1.0));
+ spinBox->setValue(setting->val * (percentage ? 100.0 : 1.0));
+}
+void setOneWidgetFromSetting(IntSetting * setting, QSpinBox * spinBox)
+{
+ spinBox->setMinimum(setting->min);
+ spinBox->setMaximum(setting->max);
+ spinBox->setValue(setting->val);
+}
+void setOneWidgetFromSetting(SciNotSetting * setting, QDoubleSpinBox * coefficientSpinBox, QSpinBox * exponentSpinBox)
+{
+ coefficientSpinBox->setMinimum(setting->min.getCoefficient());
+ coefficientSpinBox->setMaximum(setting->max.getCoefficient());
+ coefficientSpinBox->setValue(setting->val.getCoefficient());
+ exponentSpinBox->setMinimum(setting->min.getExponent());
+ exponentSpinBox->setMaximum(setting->max.getExponent());
+ exponentSpinBox->setValue(setting->val.getExponent());
+}
+
+
+void SettingsDialog::setWidgetsFromSettings()
+{
+ loadOrSaveSettingsToOrFromWidgets(true, g_settings.data());
+
+ enableDisableDepthWidgets();
+ checkBoxesChanged();
+ lengthDiscrepancySpinBoxChanged();
+}
+
+
+void SettingsDialog::setSettingsFromWidgets()
+{
+ loadOrSaveSettingsToOrFromWidgets(false, g_settings.data());
+
+ //The highlighted outline thickness should always be a bit
+ //bigger than the outlineThickness.
+ g_settings->selectionThickness = g_settings->outlineThickness + 1.0;
+}
+
+
+
+void SettingsDialog::loadOrSaveSettingsToOrFromWidgets(bool setWidgets, Settings * settings)
+{
+ void (*doubleFunctionPointer)(FloatSetting *, QDoubleSpinBox *, bool);
+ void (*intFunctionPointer)(IntSetting *, QSpinBox *);
+ void (*colourFunctionPointer)(QColor *, ColourButton *);
+ void (*sciNotFunctionPointer)(SciNotSetting *, QDoubleSpinBox *, QSpinBox *);
+ void (*checkBoxFunctionPointer)(bool *, QCheckBox *);
+
+ if (setWidgets)
+ {
+ doubleFunctionPointer = setOneWidgetFromSetting;
+ intFunctionPointer = setOneWidgetFromSetting;
+ colourFunctionPointer = setOneWidgetFromSetting;
+ sciNotFunctionPointer = setOneWidgetFromSetting;
+ checkBoxFunctionPointer = setOneWidgetFromSetting;
+ }
+ else
+ {
+ doubleFunctionPointer = setOneSettingFromWidget;
+ intFunctionPointer = setOneSettingFromWidget;
+ colourFunctionPointer = setOneSettingFromWidget;
+ sciNotFunctionPointer = setOneSettingFromWidget;
+ checkBoxFunctionPointer = setOneSettingFromWidget;
+ }
+
+ doubleFunctionPointer(&settings->manualNodeLengthPerMegabase, ui->nodeLengthPerMegabaseManualSpinBox, false);
+ doubleFunctionPointer(&settings->minimumNodeLength, ui->minimumNodeLengthSpinBox, false);
+ doubleFunctionPointer(&settings->edgeLength, ui->edgeLengthSpinBox, false);
+ doubleFunctionPointer(&settings->doubleModeNodeSeparation, ui->doubleModeNodeSeparationSpinBox, false);
+ doubleFunctionPointer(&settings->nodeSegmentLength, ui->nodeSegmentLengthSpinBox, false);
+ doubleFunctionPointer(&settings->componentSeparation, ui->componentSeparationSpinBox, false);
+ doubleFunctionPointer(&settings->depthEffectOnWidth, ui->depthEffectOnWidthSpinBox, true);
+ doubleFunctionPointer(&settings->depthPower, ui->depthPowerSpinBox, false);
+ doubleFunctionPointer(&settings->edgeWidth, ui->edgeWidthSpinBox, false);
+ doubleFunctionPointer(&settings->outlineThickness, ui->outlineThicknessSpinBox, false);
+ doubleFunctionPointer(&settings->textOutlineThickness, ui->textOutlineThicknessSpinBox, false);
+ colourFunctionPointer(&settings->edgeColour, ui->edgeColourButton);
+ colourFunctionPointer(&settings->outlineColour, ui->outlineColourButton);
+ colourFunctionPointer(&settings->selectionColour, ui->selectionColourButton);
+ colourFunctionPointer(&settings->textColour, ui->textColourButton);
+ colourFunctionPointer(&settings->textOutlineColour, ui->textOutlineColourButton);
+ intFunctionPointer(&settings->randomColourPositiveSaturation, ui->randomColourPositiveSaturationSpinBox);
+ intFunctionPointer(&settings->randomColourNegativeSaturation, ui->randomColourNegativeSaturationSpinBox);
+ intFunctionPointer(&settings->randomColourPositiveLightness, ui->randomColourPositiveLightnessSpinBox);
+ intFunctionPointer(&settings->randomColourNegativeLightness, ui->randomColourNegativeLightnessSpinBox);
+ intFunctionPointer(&settings->randomColourPositiveOpacity, ui->randomColourPositiveOpacitySpinBox);
+ intFunctionPointer(&settings->randomColourNegativeOpacity, ui->randomColourNegativeOpacitySpinBox);
+ colourFunctionPointer(&settings->uniformPositiveNodeColour, ui->uniformPositiveNodeColourButton);
+ colourFunctionPointer(&settings->uniformNegativeNodeColour, ui->uniformNegativeNodeColourButton);
+ colourFunctionPointer(&settings->uniformNodeSpecialColour, ui->uniformNodeSpecialColourButton);
+ colourFunctionPointer(&settings->lowDepthColour, ui->lowDepthColourButton);
+ colourFunctionPointer(&settings->highDepthColour, ui->highDepthColourButton);
+ doubleFunctionPointer(&settings->lowDepthValue, ui->lowDepthValueSpinBox, false);
+ doubleFunctionPointer(&settings->highDepthValue, ui->highDepthValueSpinBox, false);
+ colourFunctionPointer(&settings->noBlastHitsColour, ui->noBlastHitsColourButton);
+ intFunctionPointer(&settings->contiguitySearchSteps, ui->contiguitySearchDepthSpinBox);
+ colourFunctionPointer(&settings->contiguousStrandSpecificColour, ui->contiguousStrandSpecificColourButton);
+ colourFunctionPointer(&settings->contiguousEitherStrandColour, ui->contiguousEitherStrandColourButton);
+ colourFunctionPointer(&settings->maybeContiguousColour, ui->maybeContiguousColourButton);
+ colourFunctionPointer(&settings->notContiguousColour, ui->notContiguousColourButton);
+ colourFunctionPointer(&settings->contiguityStartingColour, ui->contiguityStartingColourButton);
+ intFunctionPointer(&settings->maxHitsForQueryPath, ui->maxHitsForQueryPathSpinBox);
+ intFunctionPointer(&settings->maxQueryPathNodes, ui->maxPathNodesSpinBox);
+ doubleFunctionPointer(&settings->minQueryCoveredByPath, ui->minQueryCoveredByPathSpinBox, true);
+ checkBoxFunctionPointer(&settings->minQueryCoveredByHits.on, ui->minQueryCoveredByHitsCheckBox);
+ doubleFunctionPointer(&settings->minQueryCoveredByHits, ui->minQueryCoveredByHitsSpinBox, true);
+ checkBoxFunctionPointer(&settings->minMeanHitIdentity.on, ui->minMeanHitIdentityCheckBox);
+ doubleFunctionPointer(&settings->minMeanHitIdentity, ui->minMeanHitIdentitySpinBox, true);
+ checkBoxFunctionPointer(&settings->maxEValueProduct.on, ui->maxEValueProductCheckBox);
+ sciNotFunctionPointer(&settings->maxEValueProduct, ui->maxEValueCoefficientSpinBox, ui->maxEValueExponentSpinBox);
+ checkBoxFunctionPointer(&settings->minLengthPercentage.on, ui->minLengthPercentageCheckBox);
+ doubleFunctionPointer(&settings->minLengthPercentage, ui->minLengthPercentageSpinBox, true);
+ checkBoxFunctionPointer(&settings->maxLengthPercentage.on, ui->maxLengthPercentageCheckBox);
+ doubleFunctionPointer(&settings->maxLengthPercentage, ui->maxLengthPercentageSpinBox, true);
+ checkBoxFunctionPointer(&settings->minLengthBaseDiscrepancy.on, ui->minLengthBaseDiscrepancyCheckBox);
+ intFunctionPointer(&settings->minLengthBaseDiscrepancy, ui->minLengthBaseDiscrepancySpinBox);
+ checkBoxFunctionPointer(&settings->maxLengthBaseDiscrepancy.on, ui->maxLengthBaseDiscrepancyCheckBox);
+ intFunctionPointer(&settings->maxLengthBaseDiscrepancy, ui->maxLengthBaseDiscrepancySpinBox);
+
+ //A couple of settings are not in a spin box, check box or colour button, so
+ //they have to be done manually, not with those function pointers.
+ if (setWidgets)
+ {
+ ui->graphLayoutQualitySlider->setValue(settings->graphLayoutQuality);
+ ui->linearLayoutOffRadioButton->setChecked(!settings->linearLayout);
+ ui->linearLayoutOnRadioButton->setChecked(settings->linearLayout);
+ ui->antialiasingOffRadioButton->setChecked(!settings->antialiasing);
+ ui->antialiasingOnRadioButton->setChecked(settings->antialiasing);
+ ui->antialiasingOffRadioButton->setChecked(!settings->antialiasing);
+ ui->singleNodeArrowHeadsOnRadioButton ->setChecked(settings->arrowheadsInSingleMode);
+ ui->singleNodeArrowHeadsOffRadioButton ->setChecked(!settings->arrowheadsInSingleMode);
+ ui->depthValueAutoRadioButton->setChecked(settings->autoDepthValue);
+ ui->depthValueManualRadioButton->setChecked(!settings->autoDepthValue);
+ nodeLengthPerMegabaseManualChanged();
+ ui->nodeLengthPerMegabaseAutoLabel->setText(formatDoubleForDisplay(settings->autoNodeLengthPerMegabase, 1));
+ ui->lowDepthAutoValueLabel2->setText(formatDoubleForDisplay(g_assemblyGraph->m_firstQuartileDepth, 2));
+ ui->highDepthAutoValueLabel2->setText(formatDoubleForDisplay(g_assemblyGraph->m_thirdQuartileDepth, 2));
+ ui->nodeLengthPerMegabaseAutoRadioButton->setChecked(settings->nodeLengthMode == AUTO_NODE_LENGTH);
+ ui->nodeLengthPerMegabaseManualRadioButton->setChecked(settings->nodeLengthMode != AUTO_NODE_LENGTH);
+ ui->positionVisibleRadioButton->setChecked(!settings->positionTextNodeCentre);
+ ui->positionCentreRadioButton->setChecked(settings->positionTextNodeCentre);
+ }
+ else
+ {
+ settings->graphLayoutQuality = ui->graphLayoutQualitySlider->value();
+ settings->linearLayout = ui->linearLayoutOnRadioButton->isChecked();
+ settings->antialiasing = ui->antialiasingOnRadioButton->isChecked();
+ settings->arrowheadsInSingleMode = ui->singleNodeArrowHeadsOnRadioButton->isChecked();
+ settings->autoDepthValue = ui->depthValueAutoRadioButton->isChecked();
+ if (ui->nodeLengthPerMegabaseAutoRadioButton->isChecked())
+ settings->nodeLengthMode = AUTO_NODE_LENGTH;
+ else
+ settings->nodeLengthMode = MANUAL_NODE_LENGTH;
+ settings->positionTextNodeCentre = ui->positionCentreRadioButton->isChecked();
+ }
+}
+
+
+void SettingsDialog::restoreDefaults()
+{
+ Settings defaultSettings;
+
+ //The auto base pairs per segment is the only setting we don't want to
+ //restore, as it is calculated from the graph.
+ defaultSettings.autoNodeLengthPerMegabase = g_settings->autoNodeLengthPerMegabase;
+
+ loadOrSaveSettingsToOrFromWidgets(true, &defaultSettings);
+}
+
+
+void SettingsDialog::setInfoTexts()
+{
+ ui->nodeLengthPerMegabaseInfoText->setInfoText("This controls the length of the drawn nodes relative to the nodes' sequence lengths.<br><br>"
+ "Set to a larger number for longer nodes and set to a smaller number for shorter nodes.<br><br>"
+ "Specifically, a node's length is determined by multiplying its sequence length (in Megabases) by this number. If the resulting value is less than the 'Minimum node length' setting, the node's length will be increased to that value.<br><br>"
+ "Note that node lengths are not exact, but are rather used as targets for the graph layout algorithm.<br><br>"
+ "The graph must be redrawn to see the effect of changing this setting.");
+ ui->minimumNodeLengthInfoText->setInfoText("This controls the minimum node length, regardless of the length of a node's sequence.<br><br>"
+ "Setting this to a smaller value will give a tighter correlation between sequence lengths and node lengths. Setting this to a larger will make smaller nodes easier to see and work with.<br><br>"
+ "The graph must be redrawn to see the effect of changing this setting.");
+ ui->edgeLengthInfoText->setInfoText("This controls the length of the edges that connect nodes.<br><br>"
+ "Set to a larger value for more separate nodes. Set to a smaller value for more tightly packed nodes.<br><br>"
+ "The graph must be redrawn to see the effect of changing this setting.");
+ ui->edgeWidthInfoText->setInfoText("This controls the width of the edges that connect nodes.<br><br>"
+ "The graph does not need to be redrawn to see the effect of changing this setting.");
+ ui->doubleModeNodeSeparationInfoText->setInfoText("This controls how far apart complementary nodes are drawn from each "
+ "other when the graph is drawn in double mode.<br><br>"
+ "The graph must be redrawn to see the effect of changing this setting.");
+
+ ui->nodeSegmentLengthInfoText->setInfoText("This controls the length of the line segments which make up a drawn node.<br><br>"
+ "Setting this to a smaller value will produce higher quality nodes with smoother curves, but graph layout will take longer and graphical performance will be slower. Setting this to a larger value will produce nodes with more obvious angles, but graph layout and graphical performance will be faster.<br><br>"
+ "The graph must be redrawn to see the effect of changing this setting.");
+ ui->componentSeparationInfoText->setInfoText("When the graph contains separate connected components, this will be the distance between the components.<br><br>"
+ "A low value will give a dense, more tightly packed layout. A high value will give a more spaced-out layout.<br><br>"
+ "The graph must be redrawn to see the effect of changing this setting.");
+ ui->graphLayoutQualityInfoText->setInfoText("This controls how much time the graph layout algorithm spends on positioning the graph components.<br><br>"
+ "Low values are faster and recommended for big assembly graphs. Higher values may result in smoother, more pleasing layouts.<br><br>"
+ "The graph must be redrawn to see the effect of changing this setting.");
+ ui->linearLayoutInfoText->setInfoText("Enable this option if the graph is ordered in a linear fashion, e.g. for a MSA graph.<br><br>"
+ "When on, Bandage will sort the nodes by name (numerically or alphabetically) and initialise the graph layout left-to-right, resulting in a more linear layout.<br><br>"
+ "This type of layout is automatically used when viewing plain FASTA files in Bandage.");
+
+ ui->depthPowerInfoText->setInfoText("This is the power used in the function for determining node widths.");
+ ui->depthEffectOnWidthInfoText->setInfoText("This controls the degree to which a node's depth affects its width.<br><br>"
+ "If set to 0%, all nodes will have the same width (equal to the average node width).");
+ ui->outlineThicknessInfoText->setInfoText("This is the thickness of the outline drawn around each node.<br><br>"
+ "Drawing outlines is somewhat CPU-intensive, so set this to zero to improve performance.");
+ ui->textOutlineThicknessInfoText->setInfoText("This is the thickness of the outline drawn around node labels when the 'Text outline' option is ticked.<br><br>"
+ "Large values can make text easier to read, but may obscure more of the graph.");
+ ui->positionTextInfoText->setInfoText("When 'Over visible regions' is selected, node labels will move based on the position of the view to stay visible.<br><br>"
+ "When 'On node centre' is selected, node labels will always be displayed at the centre of each node, regardless of the view's position.");
+
+ ui->antialiasingInfoText->setInfoText("Antialiasing makes the display smoother and more pleasing. Disable antialiasing if you are experiencing slow performance when viewing large graphs.");
+ ui->singleNodeArrowHeadsInfoText->setInfoText("When on, this will draw nodes with arrowheads, even when Bandage is in single node style.<br><br>"
+ "This makes sense for graphs where the positive-negative distinction is meaningful, e.g. a MSA graph of gene sequences where the positive nodes are the coding strands. It does not make sense for graphs where the positive-negative distinction is arbitrary, e.g. a SPAdes assembly graph.");
+
+ ui->uniformPositiveNodeColourInfoText->setInfoText("This is the colour of all positive nodes when Bandage is set to the 'Uniform colour' option.");
+ ui->uniformNegativeNodeColourInfoText->setInfoText("This is the colour of all negative nodes when Bandage is set to the 'Uniform colour' option. Negative nodes are only displayed when the graph is drawn in 'Double' mode.");
+ ui->uniformNodeSpecialColourInfoText->setInfoText("When Bandage is set to the 'Uniform colour' option, this colour is used for limited graph scopes:<ul>"
+ "<li>When the graph scope is set to 'Around node(s)', this colour is used for the user-specified nodes.</li>"
+ "<li>When the graph scope is set to 'Around BLAST hit(s)', this colour is used for nodes that contain at least one BLAST hit.</li></ul>");
+ ui->edgeColourInfoText->setInfoText("This colour is used for all edges connecting nodes.");
+ ui->outlineColourInfoText->setInfoText("This colour is used to outline nodes that are not currently selected by the user.");
+ ui->selectionColourInfoText->setInfoText("This colour is used to outline nodes that are currently selected by the user. Selected edges will also be displayed in this colour.");
+ ui->textColourInfoText->setInfoText("This colour is used for the text of node labels.");
+ ui->textOutlineColourInfoText->setInfoText("If the text outline thickness setting has a nonzero value, then a text outline will be displayed with this colour.");
+
+ ui->randomColourPositiveSaturationInfoText->setInfoText("This controls the colour saturation of the positive nodes when the 'Random colours' option is used.<br><br>"
+ "The minimum value will result in colourless (grey) nodes while high values will result in brightly coloured nodes.");
+ ui->randomColourNegativeSaturationInfoText->setInfoText("This controls the colour saturation of the negative nodes when the 'Random colours' option is used.<br><br>"
+ "The minimum value will result in colourless (grey) nodes while high values will result in brightly coloured nodes.<br><br>"
+ "Note that negative nodes are only visible when the graph is drawn in double mode.");
+ ui->randomColourPositiveLightnessInfoText->setInfoText("This controls the colour lightness of the positive nodes when the 'Random colours' option is used.<br><br>"
+ "Low values will result in dark nodes while high values result in light nodes");
+ ui->randomColourNegativeLightnessInfoText->setInfoText("This controls the colour lightness of the negative nodes when the 'Random colours' option is used.<br><br>"
+ "Low values will result in dark nodes while high values result in light nodes.<br><br>"
+ "Note that negative nodes are only visible when the graph is drawn in double mode.");
+ ui->randomColourPositiveOpacityInfoText->setInfoText("This controls how opaque the positive nodes are when the 'Random colours' option is used.<br><br>"
+ "Set to the minimum value for fully transparent nodes. Set to the maximum value for completely opaque nodes.");
+ ui->randomColourNegativeOpacityInfoText->setInfoText("This controls how opaque the negative nodes are when the 'Random colours' option is used.<br><br>"
+ "Set to the minimum value for fully transparent nodes. Set to the maximum value for completely opaque nodes.<br><br>"
+ "Note that negative nodes are only visible when the graph is drawn in double mode.");
+
+ ui->lowDepthColourInfoText->setInfoText("When Bandage is set to the 'Colour by depth' option, this colour is used for nodes with depth at or below the low depth value.<br><br>"
+ "Nodes with depth between the low and high depth values will get an intermediate colour.");
+ ui->highDepthColourInfoText->setInfoText("When Bandage is set to the 'Colour by depth' option, this colour is used for nodes with depth above the high depth value.<br><br>"
+ "Nodes with depth between the low and high depth values will get an intermediate colour.");
+ ui->depthAutoValuesInfoText->setInfoText("When set to 'Auto', the low depth value is set to the first quartile and the high depth value is set to the third quartile.");
+ ui->depthManualValuesInfoText->setInfoText("When set to 'Manual', you can specify the values used for depth colouring.");
+ ui->noBlastHitsColourInfoText->setInfoText("When Bandage is set to the 'Colour using BLAST hits' option, this colour is used for nodes that do not have any BLAST hits. It is also used for any region of a node without BLAST hits, even if there are BLAST hits in other regions of that node.");
+ ui->contiguitySearchDepthInfoText->setInfoText("This is the number of steps the contiguity search will take. Larger values will find more distant contiguous nodes, at a performance cost.<br><br>"
+ "The time taken to complete the search can grow rapidly as values increase, so use values above 20 with caution.");
+ ui->contiguousStrandSpecificColourInfoText->setInfoText("When a contiguity search is conducted, this is the colour given to nodes that are determined to be contiguous with the starting node(s).<br><br>"
+ "This colour is used for strand-specific matches. It is only used for nodes that are determined to be on the same strand as the starting node");
+ ui->contiguousEitherStrandColourInfoText->setInfoText("When a contiguity search is conducted, this is the colour given to nodes that are determined to be contiguous with the starting node(s).<br><br>"
+ "This colour is used for nodes where either the node or its reverse complement are contiguous with the starting node, but it cannot be determined which.");
+ ui->maybeContiguousColourInfoText->setInfoText("When a contiguity search is conducted, this is the colour given to nodes that are determined to be possibly contiguous with the starting node(s).");
+ ui->notContiguousColourInfoText->setInfoText("When a contiguity search is conducted, this is the colour given to nodes that are not determined to be contiguous with the starting node(s).");
+ ui->contiguityStartingColourInfoText->setInfoText("When a contiguity search is conducted, this is the colour given to the starting node(s).");
+ ui->maxHitsForQueryPathInfoText->setInfoText("Bandage will not attempt to find query paths for BLAST queries with more hits than this setting. BLAST query path searches can be very slow when there are too many hits, so this setting prevents performance problems.<br><br>"
+ "Set to 0 to turn off all BLAST query path finding.<br><br>"
+ "Set to a larger value to enable query path searches for BLAST queries with many hits (can be slow).");
+ ui->maxPathNodesInfoText->setInfoText("This controls the maximum number of nodes in BLAST query paths.<br><br>"
+ "A higher value will allow for paths containing more nodes, at a performance cost.");
+ ui->minQueryCoveredByPathInfoText->setInfoText("This is a minimum value for the fraction of a BLAST query which is covered by a BLAST query path. Paths that cover less of the query than this setting will not be included in the query's paths.<br><br>"
+ "Set to a higher value to make BLAST query paths more stringent.");
+ ui->minQueryCoveredByHitsInfoText->setInfoText("This is a minimum value for the fraction of a BLAST query which is covered by the hits in a BLAST query path. Paths with hits that cover less of the query than this setting will not be included in the query's paths.<br><br>"
+ "Set to a higher value to make BLAST query paths more stringent.");
+ ui->minMeanHitIdentityInfoText->setInfoText("This is a minimum value for the mean of the percent identity for the hits in a BLAST query path, weighted by the hits' lengths. Paths with a mean hit percent identity less than this setting will not be included in the query's paths.<br><br>"
+ "Set to a higher value to make BLAST query paths more stringent.");
+ ui->maxEvalueProductInfoText->setInfoText("This is a maximum value for the product of the e-values of all the hits in a BLAST query path. Paths with an e-value product greater than this setting will not be included in the query's paths.<br><br>"
+ "Set to a lower value to make BLAST query paths more stringent.");
+ ui->minLengthPercentageInfoText->setInfoText("This is a minimum value for the relative length between a BLAST query and its path in the graph. Paths with a relative length less than this setting will not be included in the query's paths.<br><br>"
+ "Set to a value closer to 100% to make BLAST query paths more stringent.");
+ ui->maxLengthPercentageInfoText->setInfoText("This is a maximum value for the relative length between a BLAST query and its path in the graph. Paths with a relative length greater than this setting will not be included in the query's paths.<br><br>"
+ "Set to a value closer to 100% to make BLAST query paths more stringent.");
+ ui->minLengthBaseDiscrepancyInfoText->setInfoText("This is the minimum length difference (in bases) between a BLAST query and its path in the graph. Paths with a length difference less than this setting will not be included in the query's paths.<br><br>"
+ "Set to a value closer to 0 to make BLAST query paths more stringent.");
+ ui->minLengthBaseDiscrepancyInfoText->setInfoText("This is the maximum length difference (in bases) between a BLAST query and its path in the graph. Paths with a length difference greater than this setting will not be included in the query's paths.<br><br>"
+ "Set to a value closer to 0 to make BLAST query paths more stringent.");
+}
+
+
+void SettingsDialog::enableDisableDepthWidgets()
+{
+ bool manual = ui->depthValueManualRadioButton->isChecked();
+
+ ui->depthManualWidget->setEnabled(manual);
+ ui->depthAutoWidget->setEnabled(!manual);
+}
+
+
+void SettingsDialog::accept()
+{
+ if (ui->lowDepthValueSpinBox->value() > ui->highDepthValueSpinBox->value())
+ QMessageBox::warning(this, "Depth value error", "The low depth value cannot be greater than the high depth value.");
+
+ else if (ui->minLengthPercentageCheckBox->isChecked() &&
+ ui->maxLengthPercentageCheckBox->isChecked() &&
+ ui->minLengthPercentageSpinBox->value() > ui->maxLengthPercentageSpinBox->value())
+ QMessageBox::warning(this, "BLAST query path length value error", "In the 'BLAST query paths' section, the minimum "
+ "path length value cannot be larger than "
+ "the maximum path length value.");
+
+ else if (ui->minLengthBaseDiscrepancyCheckBox->isChecked() &&
+ ui->maxLengthBaseDiscrepancyCheckBox->isChecked() &&
+ ui->minLengthBaseDiscrepancySpinBox->value() > ui->maxLengthBaseDiscrepancySpinBox->value())
+ QMessageBox::warning(this, "BLAST query length discrepancy value error", "In the 'BLAST query paths' section, the minimum "
+ "length discrepancy value cannot be larger than "
+ "the maximum length discrepancy value.");
+
+ else
+ QDialog::accept();
+}
+
+
+void SettingsDialog::nodeLengthPerMegabaseManualChanged()
+{
+ bool manual = ui->nodeLengthPerMegabaseManualRadioButton->isChecked();
+ ui->nodeLengthPerMegabaseManualSpinBox->setEnabled(manual);
+ ui->nodeLengthPerMegabaseAutoLabel->setEnabled(!manual);
+}
+
+
+void SettingsDialog::updateNodeWidthVisualAid()
+{
+ ui->nodeWidthVisualAid->m_depthEffectOnWidth = ui->depthEffectOnWidthSpinBox->value() / 100.0;
+ ui->nodeWidthVisualAid->m_depthPower = ui->depthPowerSpinBox->value();
+
+ ui->nodeWidthVisualAid->update();
+}
+
+
+void SettingsDialog::colourSliderChanged()
+{
+ ui->randomColourPositiveOpacitySpinBox->setValue(ui->randomColourPositiveOpacitySlider->value());
+ ui->randomColourNegativeOpacitySpinBox->setValue(ui->randomColourNegativeOpacitySlider->value());
+ ui->randomColourPositiveSaturationSpinBox->setValue(ui->randomColourPositiveSaturationSlider->value());
+ ui->randomColourNegativeSaturationSpinBox->setValue(ui->randomColourNegativeSaturationSlider->value());
+ ui->randomColourPositiveLightnessSpinBox->setValue(ui->randomColourPositiveLightnessSlider->value());
+ ui->randomColourNegativeLightnessSpinBox->setValue(ui->randomColourNegativeLightnessSlider->value());
+}
+
+void SettingsDialog::colourSpinBoxChanged()
+{
+ ui->randomColourPositiveOpacitySlider->setValue(ui->randomColourPositiveOpacitySpinBox->value());
+ ui->randomColourNegativeOpacitySlider->setValue(ui->randomColourNegativeOpacitySpinBox->value());
+ ui->randomColourPositiveSaturationSlider->setValue(ui->randomColourPositiveSaturationSpinBox->value());
+ ui->randomColourNegativeSaturationSlider->setValue(ui->randomColourNegativeSaturationSpinBox->value());
+ ui->randomColourPositiveLightnessSlider->setValue(ui->randomColourPositiveLightnessSpinBox->value());
+ ui->randomColourNegativeLightnessSlider->setValue(ui->randomColourNegativeLightnessSpinBox->value());
+}
+
+void SettingsDialog::checkBoxesChanged()
+{
+ ui->minQueryCoveredByHitsSpinBox->setEnabled(ui->minQueryCoveredByHitsCheckBox->isChecked());
+ ui->minMeanHitIdentitySpinBox->setEnabled(ui->minMeanHitIdentityCheckBox->isChecked());
+ ui->maxEValueCoefficientSpinBox->setEnabled(ui->maxEValueProductCheckBox->isChecked());
+ ui->maxEValueExponentSpinBox->setEnabled(ui->maxEValueProductCheckBox->isChecked());
+ ui->minLengthPercentageSpinBox->setEnabled(ui->minLengthPercentageCheckBox->isChecked());
+ ui->maxLengthPercentageSpinBox->setEnabled(ui->maxLengthPercentageCheckBox->isChecked());
+ ui->minLengthBaseDiscrepancySpinBox->setEnabled(ui->minLengthBaseDiscrepancyCheckBox->isChecked());
+ ui->maxLengthBaseDiscrepancySpinBox->setEnabled(ui->maxLengthBaseDiscrepancyCheckBox->isChecked());
+}
+
+//This function adds or removes the '+' prefix from the length discrepancy
+//spin boxes, based on whether or not they hold a positive value.
+void SettingsDialog::lengthDiscrepancySpinBoxChanged()
+{
+ if (ui->minLengthBaseDiscrepancySpinBox->value() > 0)
+ ui->minLengthBaseDiscrepancySpinBox->setPrefix("+");
+ else
+ ui->minLengthBaseDiscrepancySpinBox->setPrefix("");
+
+ if (ui->maxLengthBaseDiscrepancySpinBox->value() > 0)
+ ui->maxLengthBaseDiscrepancySpinBox->setPrefix("+");
+ else
+ ui->maxLengthBaseDiscrepancySpinBox->setPrefix("");
+}
diff --git a/ui/settingsdialog.h b/ui/settingsdialog.h
new file mode 100644
index 0000000..5bae9db
--- /dev/null
+++ b/ui/settingsdialog.h
@@ -0,0 +1,62 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef SETTINGSDIALOG_H
+#define SETTINGSDIALOG_H
+
+#include <QDialog>
+#include <QCloseEvent>
+
+class Settings;
+
+namespace Ui {
+class SettingsDialog;
+}
+
+class SettingsDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit SettingsDialog(QWidget *parent = 0);
+ ~SettingsDialog();
+
+ void setWidgetsFromSettings();
+ void setSettingsFromWidgets();
+
+private:
+ Ui::SettingsDialog *ui;
+
+ void loadOrSaveSettingsToOrFromWidgets(bool setWidgets, Settings * settings);
+ void setInfoTexts();
+
+private slots:
+ void restoreDefaults();
+ void enableDisableDepthWidgets();
+ void nodeLengthPerMegabaseManualChanged();
+ void updateNodeWidthVisualAid();
+ void colourSliderChanged();
+ void colourSpinBoxChanged();
+ void checkBoxesChanged();
+ void lengthDiscrepancySpinBoxChanged();
+
+public slots:
+ void accept();
+};
+
+#endif // SETTINGSDIALOG_H
diff --git a/ui/settingsdialog.ui b/ui/settingsdialog.ui
new file mode 100644
index 0000000..2c27a31
--- /dev/null
+++ b/ui/settingsdialog.ui
@@ -0,0 +1,4169 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>SettingsDialog</class>
+ <widget class="QDialog" name="SettingsDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>378</width>
+ <height>673</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Settings</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="VerticalScrollArea" name="scrollArea">
+ <property name="widgetResizable">
+ <bool>true</bool>
+ </property>
+ <widget class="QWidget" name="scrollAreaWidgetContents">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>-62</y>
+ <width>400</width>
+ <height>3466</height>
+ </rect>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <widget class="QLabel" name="graphSizeHeadingLabel">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Graph size</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="graphLayoutDescriptionLabel_2">
+ <property name="text">
+ <string><html><head/><body><p>These settings control the length and width of nodes and edges in the graph. Note that the node width control is in the main window, not here in the settings. It is necessary to redraw the graph to see the effect of changing some of these settings.</p></body></html></string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignJustify|Qt::AlignVCenter</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line_12">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_24" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout_7">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <spacer name="horizontalSpacer_28">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="InfoTextWidget" name="nodeLengthPerMegabaseInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_12">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Node length
+per megabase:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_10" native="true">
+ <layout class="QGridLayout" name="gridLayout_17">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item row="0" column="0">
+ <widget class="QRadioButton" name="nodeLengthPerMegabaseAutoRadioButton">
+ <property name="text">
+ <string>Auto</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QRadioButton" name="nodeLengthPerMegabaseManualRadioButton">
+ <property name="text">
+ <string>Manual</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="nodeLengthPerMegabaseAutoLabel">
+ <property name="text">
+ <string>100</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QDoubleSpinBox" name="nodeLengthPerMegabaseManualSpinBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="decimals">
+ <number>0</number>
+ </property>
+ <property name="minimum">
+ <double>0.000000000000000</double>
+ </property>
+ <property name="maximum">
+ <double>1000000.000000000000000</double>
+ </property>
+ <property name="singleStep">
+ <double>100.000000000000000</double>
+ </property>
+ <property name="value">
+ <double>1000.000000000000000</double>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_27">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_25" native="true">
+ <layout class="QGridLayout" name="gridLayout_18">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item row="3" column="6">
+ <widget class="QDoubleSpinBox" name="doubleModeNodeSeparationSpinBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="decimals">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <double>100.000000000000000</double>
+ </property>
+ <property name="singleStep">
+ <double>0.500000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="4">
+ <widget class="InfoTextWidget" name="minimumNodeLengthInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="5">
+ <widget class="QLabel" name="label_25">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Minimum node length:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="6">
+ <widget class="QDoubleSpinBox" name="minimumNodeLengthSpinBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="decimals">
+ <number>1</number>
+ </property>
+ <property name="minimum">
+ <double>1.000000000000000</double>
+ </property>
+ <property name="maximum">
+ <double>1000.000000000000000</double>
+ </property>
+ <property name="singleStep">
+ <double>1.000000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="6">
+ <widget class="QDoubleSpinBox" name="edgeLengthSpinBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="decimals">
+ <number>1</number>
+ </property>
+ <property name="minimum">
+ <double>0.100000000000000</double>
+ </property>
+ <property name="maximum">
+ <double>100.000000000000000</double>
+ </property>
+ <property name="singleStep">
+ <double>1.000000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="5">
+ <widget class="QLabel" name="label_33">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Double mode separation:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="7">
+ <spacer name="horizontalSpacer_29">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="0" column="3">
+ <spacer name="horizontalSpacer_30">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="5">
+ <widget class="QLabel" name="label_31">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Edge length:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="4">
+ <widget class="InfoTextWidget" name="doubleModeNodeSeparationInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="4">
+ <widget class="InfoTextWidget" name="edgeLengthInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="4">
+ <widget class="InfoTextWidget" name="edgeWidthInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="5">
+ <widget class="QLabel" name="label_5">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Edge width:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="6">
+ <widget class="QDoubleSpinBox" name="edgeWidthSpinBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="decimals">
+ <number>1</number>
+ </property>
+ <property name="minimum">
+ <double>0.100000000000000</double>
+ </property>
+ <property name="maximum">
+ <double>100.000000000000000</double>
+ </property>
+ <property name="singleStep">
+ <double>0.500000000000000</double>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_13">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>30</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="graphLayoutQualityHeadingLabel">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Graph layout</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="graphLayoutDescriptionLabel">
+ <property name="text">
+ <string>These settings control how the graph nodes are positioned on the screen. It is necessary to redraw the graph to see the effect of changing these settings.</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignJustify|Qt::AlignVCenter</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_16" native="true">
+ <layout class="QGridLayout" name="gridLayout_10">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item row="2" column="3">
+ <widget class="QLabel" name="label_8">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Linear graph layout:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="4">
+ <widget class="QWidget" name="widget_6" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_8">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QRadioButton" name="linearLayoutOnRadioButton">
+ <property name="text">
+ <string>On</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="linearLayoutOffRadioButton">
+ <property name="text">
+ <string>Off</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="InfoTextWidget" name="linearLayoutInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3">
+ <widget class="QLabel" name="label_9">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Node segment length:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="4">
+ <widget class="QDoubleSpinBox" name="nodeSegmentLengthSpinBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="decimals">
+ <number>1</number>
+ </property>
+ <property name="minimum">
+ <double>1.000000000000000</double>
+ </property>
+ <property name="maximum">
+ <double>1000.000000000000000</double>
+ </property>
+ <property name="singleStep">
+ <double>1.000000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3">
+ <widget class="QLabel" name="label_3">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Graph layout iterations:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="InfoTextWidget" name="nodeSegmentLengthInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="InfoTextWidget" name="graphLayoutQualityInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="4">
+ <widget class="QSlider" name="graphLayoutQualitySlider">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximum">
+ <number>4</number>
+ </property>
+ <property name="pageStep">
+ <number>1</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="tickPosition">
+ <enum>QSlider::TicksBelow</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <spacer name="horizontalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="0" column="5">
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="3" column="3">
+ <widget class="QLabel" name="label_10">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Component separation:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="4">
+ <widget class="QDoubleSpinBox" name="componentSeparationSpinBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="decimals">
+ <number>1</number>
+ </property>
+ <property name="minimum">
+ <double>1.000000000000000</double>
+ </property>
+ <property name="maximum">
+ <double>1000.000000000000000</double>
+ </property>
+ <property name="singleStep">
+ <double>1.000000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2">
+ <widget class="InfoTextWidget" name="componentSeparationInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_10">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>30</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="graphAppearanceHeadingLabel">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Graph appearance</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="graphAppearanceDescriptionLabel">
+ <property name="text">
+ <string>These settings control other cosmetic details of the nodes and edges in the graph.</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignJustify|Qt::AlignVCenter</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_8" native="true">
+ <layout class="QGridLayout" name="gridLayout_9">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item row="4" column="3">
+ <widget class="QLabel" name="label_6">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Outline thickness:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="InfoTextWidget" name="edgeColourInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3">
+ <widget class="QLabel" name="label_28">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Edge colour:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="4">
+ <widget class="ColourButton" name="outlineColourButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="3">
+ <widget class="QLabel" name="label_18">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Selection colour:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="InfoTextWidget" name="outlineColourInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <spacer name="horizontalSpacer_4">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="5">
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="4">
+ <widget class="ColourButton" name="edgeColourButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="3">
+ <widget class="QLabel" name="label_27">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Outline colour:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="InfoTextWidget" name="outlineThicknessInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1">
+ <widget class="InfoTextWidget" name="selectionColourInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="4">
+ <widget class="ColourButton" name="selectionColourButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="4">
+ <widget class="QDoubleSpinBox" name="outlineThicknessSpinBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="maximum">
+ <double>1000.000000000000000</double>
+ </property>
+ <property name="singleStep">
+ <double>0.050000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="4">
+ <widget class="QWidget" name="widget_11" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_9">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QRadioButton" name="singleNodeArrowHeadsOnRadioButton">
+ <property name="text">
+ <string>On</string>
+ </property>
+ <property name="checked">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="singleNodeArrowHeadsOffRadioButton">
+ <property name="text">
+ <string>Off</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="6" column="4">
+ <widget class="QWidget" name="widget_3" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QRadioButton" name="antialiasingOnRadioButton">
+ <property name="text">
+ <string>On</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="antialiasingOffRadioButton">
+ <property name="text">
+ <string>Off</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="6" column="3">
+ <widget class="QLabel" name="label_11">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Antialiasing:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="1">
+ <widget class="InfoTextWidget" name="antialiasingInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="3">
+ <widget class="QLabel" name="label_23">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Arrowheads in
+single node style:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="1">
+ <widget class="InfoTextWidget" name="singleNodeArrowHeadsInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>30</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="textAppearanceHeadingLabel">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Text appearance</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="textAppearanceDescriptionLabel">
+ <property name="text">
+ <string>These settings control the appearance of text labels that can be displayed on the graph. The effect of these settings is only seen when one of the node label types is selected in the main window.</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignJustify|Qt::AlignVCenter</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line_4">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_17" native="true">
+ <layout class="QGridLayout" name="gridLayout_3">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item row="1" column="1">
+ <widget class="InfoTextWidget" name="textOutlineThicknessInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="InfoTextWidget" name="textColourInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QLabel" name="label_26">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Text colour:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="4">
+ <spacer name="horizontalSpacer_8">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="2">
+ <widget class="QLabel" name="label_47">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Text outline colour:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QLabel" name="label_7">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Text outline thickness:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3">
+ <widget class="ColourButton" name="textOutlineColourButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="InfoTextWidget" name="textOutlineColourInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3">
+ <widget class="QDoubleSpinBox" name="textOutlineThicknessSpinBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="maximum">
+ <double>2.000000000000000</double>
+ </property>
+ <property name="singleStep">
+ <double>0.100000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3">
+ <widget class="ColourButton" name="textColourButton">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <spacer name="horizontalSpacer_10">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_9" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout_6">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <spacer name="horizontalSpacer_25">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="InfoTextWidget" name="positionTextInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_48">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Position text:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_15" native="true">
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <property name="spacing">
+ <number>-1</number>
+ </property>
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <widget class="QRadioButton" name="positionVisibleRadioButton">
+ <property name="text">
+ <string>Over visible regions</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="positionCentreRadioButton">
+ <property name="text">
+ <string>On node centre</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_26">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>30</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="nodeWidthHeadingLabel">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Depth and node width</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="nodeWidthDescriptionLabel">
+ <property name="text">
+ <string><html><head/><body><p>These settings control how the depth of a node affects its width. The average node width is controlled in the main Bandage window.</p></body></html></string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignJustify|Qt::AlignVCenter</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line_7">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_4" native="true">
+ <layout class="QGridLayout" name="gridLayout_6">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item row="0" column="2">
+ <widget class="InfoTextWidget" name="depthEffectOnWidthInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="InfoTextWidget" name="depthPowerInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3">
+ <widget class="QLabel" name="label_4">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Depth effect on width:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="4">
+ <widget class="QDoubleSpinBox" name="depthEffectOnWidthSpinBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="suffix">
+ <string>%</string>
+ </property>
+ <property name="decimals">
+ <number>0</number>
+ </property>
+ <property name="minimum">
+ <double>0.000000000000000</double>
+ </property>
+ <property name="maximum">
+ <double>100.000000000000000</double>
+ </property>
+ <property name="singleStep">
+ <double>5.000000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="4">
+ <widget class="QDoubleSpinBox" name="depthPowerSpinBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="minimum">
+ <double>0.100000000000000</double>
+ </property>
+ <property name="maximum">
+ <double>1.000000000000000</double>
+ </property>
+ <property name="singleStep">
+ <double>0.050000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3">
+ <widget class="QLabel" name="label_36">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Depth effect power:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <spacer name="horizontalSpacer_9">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="6">
+ <spacer name="horizontalSpacer_5">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="3" colspan="2">
+ <widget class="QWidget" name="widget_7" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <spacer name="horizontalSpacer_7">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QFrame" name="frame">
+ <property name="frameShape">
+ <enum>QFrame::Panel</enum>
+ </property>
+ <property name="frameShadow">
+ <enum>QFrame::Raised</enum>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_5">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <property name="spacing">
+ <number>0</number>
+ </property>
+ <item row="0" column="3">
+ <widget class="NodeWidthVisualAid" name="nodeWidthVisualAid" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>80</width>
+ <height>80</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QLabel" name="label_38">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>5</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">background-color: rgb(255, 255, 255)</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="VerticalLabel" name="label_37">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="styleSheet">
+ <string notr="true">background-color: rgb(255, 255, 255)</string>
+ </property>
+ <property name="text">
+ <string>Node width</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" colspan="2">
+ <widget class="QLabel" name="label_40">
+ <property name="styleSheet">
+ <string notr="true">background-color: rgb(255, 255, 255)</string>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3">
+ <widget class="QLabel" name="label_39">
+ <property name="styleSheet">
+ <string notr="true">background-color: rgb(255, 255, 255)</string>
+ </property>
+ <property name="text">
+ <string>Depth</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_6">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_4">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>30</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="randomColourSchemeHeadingLabel">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Random colour scheme</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line_6">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="randomColourSchemeDescriptionLabel">
+ <property name="text">
+ <string>These settings control the properties of the node colours when the 'Random colours' colour scheme is used.</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignJustify|Qt::AlignVCenter</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_18" native="true">
+ <layout class="QGridLayout" name="gridLayout_11">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item row="0" column="1">
+ <widget class="InfoTextWidget" name="randomColourPositiveSaturationInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="InfoTextWidget" name="randomColourPositiveLightnessInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="InfoTextWidget" name="randomColourNegativeSaturationInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3">
+ <widget class="QSlider" name="randomColourPositiveLightnessSlider">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximum">
+ <number>255</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3">
+ <widget class="QSlider" name="randomColourPositiveSaturationSlider">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximum">
+ <number>255</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="5">
+ <spacer name="horizontalSpacer_12">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="4" column="2">
+ <widget class="QLabel" name="label_34">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Positive node opacity:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QLabel" name="label_44">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Positive node lightness:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QLabel" name="label_42">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Positive node saturation:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="3">
+ <widget class="QSlider" name="randomColourPositiveOpacitySlider">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximum">
+ <number>255</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="4">
+ <widget class="QSpinBox" name="randomColourPositiveLightnessSpinBox">
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="maximum">
+ <number>255</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2">
+ <widget class="QLabel" name="label_45">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Negative node lightness:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3">
+ <widget class="QSlider" name="randomColourNegativeSaturationSlider">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximum">
+ <number>255</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QLabel" name="label_43">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Negative node saturation:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="InfoTextWidget" name="randomColourNegativeLightnessInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="InfoTextWidget" name="randomColourPositiveOpacityInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="4">
+ <widget class="QSpinBox" name="randomColourNegativeSaturationSpinBox">
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="maximum">
+ <number>255</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="4">
+ <widget class="QSpinBox" name="randomColourPositiveSaturationSpinBox">
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="maximum">
+ <number>255</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <spacer name="horizontalSpacer_11">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="3" column="3">
+ <widget class="QSlider" name="randomColourNegativeLightnessSlider">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximum">
+ <number>255</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="4">
+ <widget class="QSpinBox" name="randomColourPositiveOpacitySpinBox">
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="maximum">
+ <number>255</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="4">
+ <widget class="QSpinBox" name="randomColourNegativeLightnessSpinBox">
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="maximum">
+ <number>255</number>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1">
+ <widget class="InfoTextWidget" name="randomColourNegativeOpacityInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="2">
+ <widget class="QLabel" name="label_46">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Negative node opacity:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="3">
+ <widget class="QSlider" name="randomColourNegativeOpacitySlider">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="maximum">
+ <number>255</number>
+ </property>
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="4">
+ <widget class="QSpinBox" name="randomColourNegativeOpacitySpinBox">
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="maximum">
+ <number>255</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_8">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>30</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="uniformColourSchemeHeadingLabel">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Uniform colour scheme</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line_5">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="uniformColourSchemeDescriptionLabel">
+ <property name="text">
+ <string>These settings control the node colours when the 'Uniform colours' colour scheme is used.</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignJustify|Qt::AlignVCenter</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_19" native="true">
+ <layout class="QGridLayout" name="gridLayout_12">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item row="2" column="1">
+ <widget class="InfoTextWidget" name="uniformNodeSpecialColourInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="InfoTextWidget" name="uniformNegativeNodeColourInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3">
+ <widget class="ColourButton" name="uniformNodeSpecialColourButton">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QLabel" name="label_17">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Negative nodes:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="InfoTextWidget" name="uniformPositiveNodeColourInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3">
+ <widget class="ColourButton" name="uniformNegativeNodeColourButton">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <spacer name="horizontalSpacer_13">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="0" column="3">
+ <widget class="ColourButton" name="uniformPositiveNodeColourButton">
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QLabel" name="label_13">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Positive nodes:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QLabel" name="label_14">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Special nodes:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="4">
+ <spacer name="horizontalSpacer_14">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_5">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>30</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="depthColourSchemeHeadingLabel">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Depth colour scheme</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line_8">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="depthColourSchemeDescriptionLabel">
+ <property name="text">
+ <string>These settings control the node colours when the 'Colour by depth' colour scheme is used.</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignJustify|Qt::AlignVCenter</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_5" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_5">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget" native="true">
+ <layout class="QGridLayout" name="gridLayout_2">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item row="0" column="1">
+ <widget class="InfoTextWidget" name="lowDepthColourInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <spacer name="horizontalSpacer_23">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="0" column="2">
+ <widget class="QLabel" name="label_15">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Low depth:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3">
+ <widget class="ColourButton" name="lowDepthColourButton">
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="4">
+ <spacer name="horizontalSpacer_24">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="1">
+ <widget class="InfoTextWidget" name="highDepthColourInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QLabel" name="label_16">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>High depth:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3">
+ <widget class="ColourButton" name="highDepthColourButton">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_20" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item>
+ <spacer name="horizontalSpacer_15">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QWidget" name="depthAutoManualWidget" native="true">
+ <layout class="QGridLayout" name="gridLayout_4">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item row="0" column="2">
+ <widget class="QWidget" name="depthAutoWidget" native="true">
+ <layout class="QGridLayout" name="gridLayout_7">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <property name="verticalSpacing">
+ <number>0</number>
+ </property>
+ <item row="1" column="1">
+ <widget class="QLabel" name="highDepthAutoValueLabel2">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>0.0</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="lowDepthAutoValueLabel2">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>0.0</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="highDepthAutoValueLabel1">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>High:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="lowDepthAutoValueLabel1">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Low:</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QWidget" name="depthManualWidget" native="true">
+ <layout class="QGridLayout" name="gridLayout_8">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <property name="verticalSpacing">
+ <number>0</number>
+ </property>
+ <item row="0" column="1">
+ <widget class="QDoubleSpinBox" name="lowDepthValueSpinBox">
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="maximum">
+ <double>1000000.000000000000000</double>
+ </property>
+ <property name="singleStep">
+ <double>1.000000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QDoubleSpinBox" name="highDepthValueSpinBox">
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="maximum">
+ <double>1000000.000000000000000</double>
+ </property>
+ <property name="singleStep">
+ <double>1.000000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="highDepthValueLabel">
+ <property name="text">
+ <string>High:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="lowDepthValueLabel">
+ <property name="text">
+ <string>Low:</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QRadioButton" name="depthValueAutoRadioButton">
+ <property name="text">
+ <string>Auto</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QRadioButton" name="depthValueManualRadioButton">
+ <property name="text">
+ <string>Manual</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="InfoTextWidget" name="depthAutoValuesInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="InfoTextWidget" name="depthManualValuesInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_16">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_6">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>30</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="blastColourSchemeHeadingLabel">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>BLAST colour scheme</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line_10">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="blastColourSchemeDescriptionLabel">
+ <property name="text">
+ <string>These settings control the node colours when either of the 'BLAST hits' colour schemes are used.</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignJustify|Qt::AlignVCenter</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_21" native="true">
+ <layout class="QGridLayout" name="gridLayout_14">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item row="0" column="1">
+ <widget class="InfoTextWidget" name="noBlastHitsColourInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3">
+ <widget class="ColourButton" name="noBlastHitsColourButton">
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="4">
+ <spacer name="horizontalSpacer_17">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="0" column="2">
+ <widget class="QLabel" name="label_32">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>No BLAST hits:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <spacer name="horizontalSpacer_18">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_7">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>30</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="contiguityColourSchemeHeadingLabel">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Contiguity colour scheme</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line_9">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="contiguityColourSchemeDescriptionLabel">
+ <property name="text">
+ <string>These settings control the node colours when the 'Colour by contiguity' colour scheme is used.</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignJustify|Qt::AlignVCenter</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_22" native="true">
+ <layout class="QGridLayout" name="gridLayout_15">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item row="5" column="1">
+ <widget class="InfoTextWidget" name="contiguityStartingColourInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="InfoTextWidget" name="contiguousEitherStrandColourInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="InfoTextWidget" name="notContiguousColourInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="InfoTextWidget" name="maybeContiguousColourInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3">
+ <widget class="ColourButton" name="contiguousStrandSpecificColourButton">
+ <property name="minimumSize">
+ <size>
+ <width>100</width>
+ <height>0</height>
+ </size>
+ </property>
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QLabel" name="label_29">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Contiguous (either strand):</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <spacer name="horizontalSpacer_19">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="0" column="1">
+ <widget class="InfoTextWidget" name="contiguitySearchDepthInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="InfoTextWidget" name="contiguousStrandSpecificColourInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="3">
+ <widget class="ColourButton" name="contiguityStartingColourButton">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="2">
+ <widget class="QLabel" name="label_21">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Not contiguous:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QLabel" name="label_22">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Contiguous (strand-specific):</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QLabel" name="label_30">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Search depth:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="3">
+ <widget class="ColourButton" name="maybeContiguousColourButton">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2">
+ <widget class="QLabel" name="label_19">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Possibly contiguous:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="3">
+ <widget class="ColourButton" name="notContiguousColourButton">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="2">
+ <widget class="QLabel" name="label_20">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Starting:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="3">
+ <widget class="ColourButton" name="contiguousEitherStrandColourButton">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3">
+ <widget class="QSpinBox" name="contiguitySearchDepthSpinBox">
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <number>50</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="4">
+ <spacer name="horizontalSpacer_20">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_11">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>30</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QLabel" name="blastQueryPathsHeadingLabel">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>BLAST query paths</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line_11">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="blastQueryPathsDescriptionLabel">
+ <property name="text">
+ <string>These settings control how Bandage searches for query paths after conducting a BLAST search. Query paths that fail to meet these criteria will be excluded. It is necessary to rerun a BLAST search to see the effect of changing these settings.</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignJustify|Qt::AlignVCenter</set>
+ </property>
+ <property name="wordWrap">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_23" native="true">
+ <layout class="QGridLayout" name="gridLayout_16">
+ <property name="leftMargin">
+ <number>0</number>
+ </property>
+ <property name="topMargin">
+ <number>0</number>
+ </property>
+ <property name="rightMargin">
+ <number>0</number>
+ </property>
+ <property name="bottomMargin">
+ <number>0</number>
+ </property>
+ <item row="2" column="3" colspan="2">
+ <widget class="QDoubleSpinBox" name="minQueryCoveredByPathSpinBox">
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="suffix">
+ <string>%</string>
+ </property>
+ <property name="decimals">
+ <number>1</number>
+ </property>
+ <property name="minimum">
+ <double>30.000000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="InfoTextWidget" name="minQueryCoveredByHitsInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="3" colspan="2">
+ <widget class="QDoubleSpinBox" name="minQueryCoveredByHitsSpinBox">
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="suffix">
+ <string>%</string>
+ </property>
+ <property name="decimals">
+ <number>1</number>
+ </property>
+ <property name="minimum">
+ <double>30.000000000000000</double>
+ </property>
+ <property name="maximum">
+ <double>100.000000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3" colspan="2">
+ <widget class="QSpinBox" name="maxPathNodesSpinBox">
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <number>50</number>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="2">
+ <widget class="QCheckBox" name="minMeanHitIdentityCheckBox">
+ <property name="text">
+ <string>Min mean hit identity:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2">
+ <widget class="QCheckBox" name="minQueryCoveredByHitsCheckBox">
+ <property name="text">
+ <string>Min query path hit coverage:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="10" column="2">
+ <widget class="QCheckBox" name="maxLengthBaseDiscrepancyCheckBox">
+ <property name="text">
+ <string>Maximum length
+discrepancy (bases):</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="2">
+ <widget class="QCheckBox" name="maxEValueProductCheckBox">
+ <property name="text">
+ <string>Max e-value product:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="2">
+ <widget class="QCheckBox" name="maxLengthPercentageCheckBox">
+ <property name="text">
+ <string>Maximum path length:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="2">
+ <widget class="QLabel" name="minQueryCoveredByPathLabel">
+ <property name="text">
+ <string>Min query path coverage:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="2">
+ <widget class="QCheckBox" name="minLengthPercentageCheckBox">
+ <property name="text">
+ <string>Minimum path length:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="9" column="2">
+ <widget class="QCheckBox" name="minLengthBaseDiscrepancyCheckBox">
+ <property name="text">
+ <string>Minimum length
+discrepancy (bases):</string>
+ </property>
+ </widget>
+ </item>
+ <item row="9" column="3" colspan="2">
+ <widget class="QSpinBox" name="minLengthBaseDiscrepancySpinBox">
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="minimum">
+ <number>-1000000</number>
+ </property>
+ <property name="maximum">
+ <number>1000000</number>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="3" colspan="2">
+ <widget class="QDoubleSpinBox" name="minLengthPercentageSpinBox">
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="suffix">
+ <string>%</string>
+ </property>
+ <property name="decimals">
+ <number>1</number>
+ </property>
+ <property name="minimum">
+ <double>0.000000000000000</double>
+ </property>
+ <property name="maximum">
+ <double>1000000.000000000000000</double>
+ </property>
+ <property name="value">
+ <double>95.000000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item row="10" column="3" colspan="2">
+ <widget class="QSpinBox" name="maxLengthBaseDiscrepancySpinBox">
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="minimum">
+ <number>-1000000</number>
+ </property>
+ <property name="maximum">
+ <number>1000000</number>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="3" colspan="2">
+ <widget class="QDoubleSpinBox" name="maxLengthPercentageSpinBox">
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="suffix">
+ <string>%</string>
+ </property>
+ <property name="decimals">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <double>1000000.000000000000000</double>
+ </property>
+ <property name="value">
+ <double>105.000000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="1">
+ <widget class="InfoTextWidget" name="minLengthPercentageInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="1">
+ <widget class="InfoTextWidget" name="maxLengthPercentageInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="9" column="1">
+ <widget class="InfoTextWidget" name="minLengthBaseDiscrepancyInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="10" column="1">
+ <widget class="InfoTextWidget" name="maxLengthBaseDiscrepancyInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="InfoTextWidget" name="minMeanHitIdentityInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="InfoTextWidget" name="maxPathNodesInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="1">
+ <widget class="InfoTextWidget" name="maxEvalueProductInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="InfoTextWidget" name="minQueryCoveredByPathInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QLabel" name="label_35">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Max path nodes:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="5">
+ <spacer name="horizontalSpacer_22">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="6" column="4">
+ <widget class="QSpinBox" name="maxEValueExponentSpinBox">
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="prefix">
+ <string>e</string>
+ </property>
+ <property name="minimum">
+ <number>-999</number>
+ </property>
+ <property name="maximum">
+ <number>1</number>
+ </property>
+ <property name="value">
+ <number>-10</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <spacer name="horizontalSpacer_21">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="6" column="3">
+ <widget class="QDoubleSpinBox" name="maxEValueCoefficientSpinBox">
+ <property name="decimals">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <double>9.900000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="3" colspan="2">
+ <widget class="QDoubleSpinBox" name="minMeanHitIdentitySpinBox">
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="suffix">
+ <string>%</string>
+ </property>
+ <property name="decimals">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <double>100.000000000000000</double>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QLabel" name="label_41">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>Max hits for path search:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="3" colspan="2">
+ <widget class="QSpinBox" name="maxHitsForQueryPathSpinBox">
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <number>50</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="InfoTextWidget" name="maxHitsForQueryPathInfoText" native="true">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Fixed" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>16</width>
+ <height>16</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_12">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Fixed</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>30</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ <item>
+ <widget class="Line" name="line">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QWidget" name="widget_2" native="true">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QPushButton" name="restoreDefaultsButton">
+ <property name="text">
+ <string>Restore defaults</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <customwidgets>
+ <customwidget>
+ <class>InfoTextWidget</class>
+ <extends>QWidget</extends>
+ <header>infotextwidget.h</header>
+ <container>1</container>
+ </customwidget>
+ <customwidget>
+ <class>VerticalScrollArea</class>
+ <extends>QScrollArea</extends>
+ <header>verticalscrollarea.h</header>
+ <container>1</container>
+ </customwidget>
+ <customwidget>
+ <class>VerticalLabel</class>
+ <extends>QLabel</extends>
+ <header>verticallabel.h</header>
+ </customwidget>
+ <customwidget>
+ <class>NodeWidthVisualAid</class>
+ <extends>QWidget</extends>
+ <header>nodewidthvisualaid.h</header>
+ <container>1</container>
+ </customwidget>
+ <customwidget>
+ <class>ColourButton</class>
+ <extends>QPushButton</extends>
+ <header>colourbutton.h</header>
+ </customwidget>
+ </customwidgets>
+ <tabstops>
+ <tabstop>scrollArea</tabstop>
+ <tabstop>antialiasingOnRadioButton</tabstop>
+ <tabstop>antialiasingOffRadioButton</tabstop>
+ <tabstop>positionVisibleRadioButton</tabstop>
+ <tabstop>positionCentreRadioButton</tabstop>
+ <tabstop>depthValueAutoRadioButton</tabstop>
+ <tabstop>restoreDefaultsButton</tabstop>
+ </tabstops>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>SettingsDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>SettingsDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/ui/tablewidgetitemdouble.cpp b/ui/tablewidgetitemdouble.cpp
new file mode 100644
index 0000000..faf09e8
--- /dev/null
+++ b/ui/tablewidgetitemdouble.cpp
@@ -0,0 +1,35 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "tablewidgetitemdouble.h"
+
+TableWidgetItemDouble::TableWidgetItemDouble(QString text, double value) :
+ QTableWidgetItem(text), m_double(value)
+{
+}
+
+
+
+bool TableWidgetItemDouble::operator<(QTableWidgetItem const &other) const
+{
+ TableWidgetItemDouble const *item = dynamic_cast<TableWidgetItemDouble const*>(&other);
+ if(item)
+ return m_double < item->m_double;
+ else
+ return QTableWidgetItem::operator<(other);
+}
diff --git a/ui/tablewidgetitemdouble.h b/ui/tablewidgetitemdouble.h
new file mode 100644
index 0000000..15514eb
--- /dev/null
+++ b/ui/tablewidgetitemdouble.h
@@ -0,0 +1,34 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef TABLEWIDGETITEMDOUBLE_H
+#define TABLEWIDGETITEMDOUBLE_H
+
+#include <QTableWidgetItem>
+
+class TableWidgetItemDouble : public QTableWidgetItem
+{
+public:
+ TableWidgetItemDouble(QString text, double value);
+
+ double m_double;
+
+ virtual bool operator<(QTableWidgetItem const &other) const;
+};
+
+#endif // TABLEWIDGETITEMDOUBLE_H
diff --git a/ui/tablewidgetitemint.cpp b/ui/tablewidgetitemint.cpp
new file mode 100644
index 0000000..b25eb27
--- /dev/null
+++ b/ui/tablewidgetitemint.cpp
@@ -0,0 +1,35 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "tablewidgetitemint.h"
+
+TableWidgetItemInt::TableWidgetItemInt(QString text, int value) :
+ QTableWidgetItem(text), m_int(value)
+{
+}
+
+
+
+bool TableWidgetItemInt::operator<(QTableWidgetItem const &other) const
+{
+ TableWidgetItemInt const *item = dynamic_cast<TableWidgetItemInt const*>(&other);
+ if(item)
+ return m_int < item->m_int;
+ else
+ return QTableWidgetItem::operator<(other);
+}
diff --git a/ui/tablewidgetitemint.h b/ui/tablewidgetitemint.h
new file mode 100644
index 0000000..3b3ea2a
--- /dev/null
+++ b/ui/tablewidgetitemint.h
@@ -0,0 +1,34 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef TABLEWIDGETITEMINT_H
+#define TABLEWIDGETITEMINT_H
+
+#include <QTableWidgetItem>
+
+class TableWidgetItemInt : public QTableWidgetItem
+{
+public:
+ TableWidgetItemInt(QString text, int value);
+
+ int m_int;
+
+ virtual bool operator<(QTableWidgetItem const &other) const;
+};
+
+#endif // TABLEWIDGETITEMINT_H
diff --git a/ui/tablewidgetitemname.cpp b/ui/tablewidgetitemname.cpp
new file mode 100644
index 0000000..91e8754
--- /dev/null
+++ b/ui/tablewidgetitemname.cpp
@@ -0,0 +1,25 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "tablewidgetitemname.h"
+#include "../blast/blastquery.h"
+
+TableWidgetItemName::TableWidgetItemName(BlastQuery * query) :
+ QTableWidgetItem(query->getName()), m_query(query)
+{
+}
diff --git a/ui/tablewidgetitemname.h b/ui/tablewidgetitemname.h
new file mode 100644
index 0000000..8cea35c
--- /dev/null
+++ b/ui/tablewidgetitemname.h
@@ -0,0 +1,36 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef TABLEWIDGETITEMNAME_H
+#define TABLEWIDGETITEMNAME_H
+
+#include <QTableWidgetItem>
+
+class BlastQuery;
+
+class TableWidgetItemName : public QTableWidgetItem
+{
+public:
+ TableWidgetItemName(BlastQuery * query);
+ BlastQuery * getQuery() const {return m_query;}
+
+private:
+ BlastQuery * m_query;
+};
+
+#endif // TABLEWIDGETITEMNAME_H
diff --git a/ui/tablewidgetitemshown.cpp b/ui/tablewidgetitemshown.cpp
new file mode 100644
index 0000000..4de1029
--- /dev/null
+++ b/ui/tablewidgetitemshown.cpp
@@ -0,0 +1,35 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#include "tablewidgetitemshown.h"
+
+TableWidgetItemShown::TableWidgetItemShown(bool shown) :
+ QTableWidgetItem(), m_shown(shown)
+{
+}
+
+
+
+bool TableWidgetItemShown::operator<(QTableWidgetItem const &other) const
+{
+ TableWidgetItemShown const *item = dynamic_cast<TableWidgetItemShown const*>(&other);
+ if (item)
+ return !m_shown && item->m_shown;
+ else
+ return QTableWidgetItem::operator<(other);
+}
diff --git a/ui/tablewidgetitemshown.h b/ui/tablewidgetitemshown.h
new file mode 100644
index 0000000..ec7837c
--- /dev/null
+++ b/ui/tablewidgetitemshown.h
@@ -0,0 +1,34 @@
+//Copyright 2016 Ryan Wick
+
+//This file is part of Bandage
+
+//Bandage is free software: you can redistribute it and/or modify
+//it under the terms of the GNU General Public License as published by
+//the Free Software Foundation, either version 3 of the License, or
+//(at your option) any later version.
+
+//Bandage is distributed in the hope that it will be useful,
+//but WITHOUT ANY WARRANTY; without even the implied warranty of
+//MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+//GNU General Public License for more details.
+
+//You should have received a copy of the GNU General Public License
+//along with Bandage. If not, see <http://www.gnu.org/licenses/>.
+
+
+#ifndef TABLEWIDGETITEMSHOWN_H
+#define TABLEWIDGETITEMSHOWN_H
+
+#include <QTableWidgetItem>
+
+class TableWidgetItemShown : public QTableWidgetItem
+{
+public:
+ TableWidgetItemShown(bool shown);
+
+ bool m_shown;
+
+ virtual bool operator<(QTableWidgetItem const &other) const;
+};
+
+#endif // TABLEWIDGETITEMSHOWN_H
diff --git a/ui/verticallabel.cpp b/ui/verticallabel.cpp
new file mode 100644
index 0000000..24dd5ed
--- /dev/null
+++ b/ui/verticallabel.cpp
@@ -0,0 +1,39 @@
+// http://stackoverflow.com/questions/9183050/vertical-qlabel-or-the-equivalent
+
+#include "verticallabel.h"
+#include <QPainter>
+
+VerticalLabel::VerticalLabel(QWidget *parent)
+ : QLabel(parent)
+{
+}
+
+VerticalLabel::VerticalLabel(const QString &text, QWidget *parent)
+: QLabel(text, parent)
+{
+}
+
+void VerticalLabel::paintEvent(QPaintEvent*)
+{
+ QPainter painter(this);
+ painter.setPen(Qt::black);
+ painter.setBrush(Qt::Dense1Pattern);
+
+ double shiftForCentering = (height() - sizeHint().height()) / 2.0;
+ painter.translate(sizeHint().width(), sizeHint().height() + shiftForCentering);
+ painter.rotate(270);
+
+ painter.drawText(0,0, text());
+}
+
+QSize VerticalLabel::minimumSizeHint() const
+{
+ QSize s = QLabel::minimumSizeHint();
+ return QSize(s.height(), s.width());
+}
+
+QSize VerticalLabel::sizeHint() const
+{
+ QSize s = QLabel::sizeHint();
+ return QSize(s.height(), s.width());
+}
diff --git a/ui/verticallabel.h b/ui/verticallabel.h
new file mode 100644
index 0000000..e238c95
--- /dev/null
+++ b/ui/verticallabel.h
@@ -0,0 +1,22 @@
+// http://stackoverflow.com/questions/9183050/vertical-qlabel-or-the-equivalent
+
+#ifndef VERTICALLABEL_H
+#define VERTICALLABEL_H
+
+#include <QLabel>
+
+class VerticalLabel : public QLabel
+{
+ Q_OBJECT
+
+public:
+ explicit VerticalLabel(QWidget *parent=0);
+ explicit VerticalLabel(const QString &text, QWidget *parent=0);
+
+protected:
+ void paintEvent(QPaintEvent*);
+ QSize sizeHint() const ;
+ QSize minimumSizeHint() const;
+};
+
+#endif // VERTICALLABEL_H
diff --git a/ui/verticalscrollarea.cpp b/ui/verticalscrollarea.cpp
new file mode 100644
index 0000000..bfbfde3
--- /dev/null
+++ b/ui/verticalscrollarea.cpp
@@ -0,0 +1,26 @@
+//This class was written by Jason Dolan and acquired here:
+//http://qt-project.org/forums/viewthread/13728
+
+
+#include "verticalscrollarea.h"
+
+#include <QEvent>
+#include <QScrollBar>
+
+
+VerticalScrollArea::VerticalScrollArea(QWidget *parent) :
+ QScrollArea(parent)
+{
+ setWidgetResizable(true);
+ setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
+}
+
+bool VerticalScrollArea::eventFilter(QObject *o, QEvent *e)
+{
+ // This works because QScrollArea::setWidget installs an eventFilter on the widget
+ if(o && o == widget() && e->type() == QEvent::Resize)
+ setMinimumWidth(widget()->minimumSizeHint().width() + verticalScrollBar()->width());
+
+ return QScrollArea::eventFilter(o, e);
+}
diff --git a/ui/verticalscrollarea.h b/ui/verticalscrollarea.h
new file mode 100644
index 0000000..7aa0266
--- /dev/null
+++ b/ui/verticalscrollarea.h
@@ -0,0 +1,21 @@
+//This class was written by Jason Dolan and acquired here:
+//http://qt-project.org/forums/viewthread/13728
+
+
+#ifndef VERTICALSCROLLAREA_H
+#define VERTICALSCROLLAREA_H
+
+#include <QObject>
+#include <QWidget>
+#include <QEvent>
+#include <QScrollArea>
+
+class VerticalScrollArea : public QScrollArea
+{
+ Q_OBJECT
+public:
+ explicit VerticalScrollArea(QWidget *parent = 0);
+ virtual bool eventFilter(QObject *o, QEvent *e);
+};
+
+#endif // VERTICALSCROLLAREA_H
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-med/bandage.git
More information about the debian-med-commit
mailing list